# 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' + '[1].' + '[2]

' + '
  1. A tachyon walks into a bar. ↑

  2. ' + '
  3. Fin. ↑

') 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]

' + '
  1. A tachyon walks into a bar. ↑

  2. ' + '
  3. 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 = ( '

[1]

' + '
  1. Example ↑

') 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 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