# coding=utf-8
from __future__ import unicode_literals
import io
import shutil
import os
import tempman
from nose.tools import istest, assert_equal
from .testing import test_path
import mammoth
from mammoth import results
@istest
def docx_containing_one_paragraph_is_converted_to_single_p_element():
with open(test_path("single-paragraph.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj)
assert_equal("
Walking on imported air
", result.value)
assert_equal([], result.messages)
@istest
def can_read_xml_files_with_utf8_bom():
with open(test_path("utf8-bom.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj)
assert_equal("This XML has a byte order mark.
", result.value)
assert_equal([], result.messages)
@istest
def empty_paragraphs_are_ignored_by_default():
with open(test_path("empty.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj)
assert_equal("", result.value)
assert_equal([], result.messages)
@istest
def empty_paragraphs_are_preserved_if_ignore_empty_paragraphs_is_false():
with open(test_path("empty.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj, ignore_empty_paragraphs=False)
assert_equal("", result.value)
assert_equal([], result.messages)
@istest
def embedded_style_map_is_used_if_present():
with _copy_of_test_data("single-paragraph.docx") as fileobj:
mammoth.embed_style_map(fileobj, "p => h1")
result = mammoth.convert_to_html(fileobj=fileobj, ignore_empty_paragraphs=False)
assert_equal("Walking on imported air
", result.value)
assert_equal([], result.messages)
@istest
def embedded_style_map_can_be_retrieved():
with _copy_of_test_data("single-paragraph.docx") as fileobj:
mammoth.embed_style_map(fileobj, "p => h1")
assert_equal("p => h1", mammoth.read_embedded_style_map(fileobj))
@istest
def warning_if_style_mapping_is_not_understood():
style_map = """
!!!!
p => h1"""
with open(test_path("single-paragraph.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj, style_map=style_map)
assert_equal("Walking on imported air
", result.value)
warning = "Did not understand this style mapping, so ignored it: !!!!"
assert_equal([results.warning(warning)], result.messages)
@istest
def inline_images_are_included_in_output():
with open(test_path("tiny-picture.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj)
assert_equal("""
""", result.value)
assert_equal([], result.messages)
@istest
def images_stored_outside_of_document_are_included_in_output():
with open(test_path("external-picture.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj)
assert_equal("""
""", result.value)
assert_equal([], result.messages)
@istest
def warn_if_images_stored_outside_of_document_are_specified_when_passing_fileobj_without_name():
fileobj = io.BytesIO()
with open(test_path("external-picture.docx"), "rb") as source_fileobj:
shutil.copyfileobj(source_fileobj, fileobj)
result = mammoth.convert_to_html(fileobj=fileobj)
assert_equal("", result.value)
assert_equal([results.warning("could not find external image 'tiny-picture.png', fileobj has no name")], result.messages)
@istest
def warn_if_images_stored_outside_of_document_are_not_found():
with tempman.create_temp_dir() as temp_dir:
document_path = os.path.join(temp_dir.path, "document.docx")
with open(document_path, "wb") as fileobj:
with open(test_path("external-picture.docx"), "rb") as source_fileobj:
shutil.copyfileobj(source_fileobj, fileobj)
with open(document_path, "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj)
assert_equal("", result.value)
expected_warning = "could not open external image: 'tiny-picture.png'"
assert_equal("warning", result.messages[0].type)
assert result.messages[0].message.startswith(expected_warning), "message was: " + result.messages[0].message
assert_equal(1, len(result.messages))
@istest
def simple_list_is_converted_to_list_elements():
with open(test_path("simple-list.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj)
assert_equal([], result.messages)
assert_equal("", result.value)
@istest
def word_tables_are_converted_to_html_tables():
expected_html = ("Above
" +
"" +
"Top left | Top right |
" +
"Bottom left | Bottom right |
" +
"
" +
"Below
")
with open(test_path("tables.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj)
assert_equal([], result.messages)
assert_equal(expected_html, result.value)
@istest
def footnotes_are_appended_to_text():
# TODO: don't duplicate footnotes with multiple references
expected_html = ('Ouch' +
'.' +
'
' +
'' +
'
')
with open(test_path("footnotes.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj, id_prefix="doc-42-")
assert_equal([], result.messages)
assert_equal(expected_html, result.value)
@istest
def endnotes_are_appended_to_text():
expected_html = ('Ouch' +
'[1].' +
'[2]
' +
' A tachyon walks into a bar. ↑
' +
' Fin. ↑
')
with open(test_path("endnotes.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj, id_prefix="doc-42-")
assert_equal([], result.messages)
assert_equal(expected_html, result.value)
@istest
def relationships_are_handled_properly_in_footnotes():
expected_html = (
'
' +
'
')
with open(test_path("footnote-hyperlink.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj, id_prefix="doc-42-")
assert_equal([], result.messages)
assert_equal(expected_html, result.value)
@istest
def when_style_mapping_is_defined_for_comment_references_then_comments_are_included():
expected_html = (
'Ouch' +
'.' +
'
' +
'A tachyon walks into a bar. ↑
' +
'Fin. ↑
'
)
with open(test_path("comments.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj, id_prefix="doc-42-", style_map="comment-reference => sup")
assert_equal([], result.messages)
assert_equal(expected_html, result.value)
@istest
def text_boxes_are_read():
with open(test_path("text-box.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj)
assert_equal('Datum plane
', result.value)
@istest
def underline_is_ignored_by_default():
with open(test_path("underline.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj)
assert_equal('The Sunset Tree
', result.value)
@istest
def underline_can_be_configured_with_style_mapping():
with open(test_path("underline.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj, style_map="u => em")
assert_equal('The Sunset Tree
', result.value)
@istest
def strikethrough_is_converted_to_s_element_by_default():
with open(test_path("strikethrough.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj)
assert_equal("Today's Special: Salmon Sold out
", result.value)
@istest
def strikethrough_conversion_can_be_configured_with_style_mapping():
with open(test_path("strikethrough.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj, style_map="strike => del")
assert_equal("Today's Special: Salmon Sold out
", result.value)
@istest
def transform_document_is_applied_to_document_before_conversion():
def transform_document(document):
document.children[0].style_id = "Heading1"
return document
with open(test_path("single-paragraph.docx"), "rb") as fileobj:
result = mammoth.convert_to_html(fileobj=fileobj, transform_document=transform_document)
assert_equal("Walking on imported air
", result.value)
assert_equal([], result.messages)
@istest
def docx_containing_one_paragraph_can_be_converted_to_markdown():
with open(test_path("single-paragraph.docx"), "rb") as fileobj:
result = mammoth.convert_to_markdown(fileobj=fileobj)
assert_equal("Walking on imported air\n\n", result.value)
assert_equal([], result.messages)
@istest
def can_extract_raw_text():
with open(test_path("simple-list.docx"), "rb") as fileobj:
result = mammoth.extract_raw_text(fileobj=fileobj)
assert_equal([], result.messages)
assert_equal("Apple\n\nBanana\n\n", result.value)
def _copy_of_test_data(path):
destination = io.BytesIO()
with open(test_path(path), "rb") as source:
shutil.copyfileobj(source, destination)
return destination