From de55a714711a27207367bc8c5c8370549a9bd219 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 23 Jan 2017 20:17:18 +0000 Subject: Handle target URIs relative to the base --- mammoth/docx/body_xml.py | 3 ++- mammoth/zips.py | 7 +++++++ tests/mammoth_tests.py | 10 +++++++++- .../test-data/tiny-picture-target-base-relative.docx | Bin 0 -> 10881 bytes tests/zips_tests.py | 19 +++++++++++++++++++ 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 tests/test-data/tiny-picture-target-base-relative.docx create mode 100644 tests/zips_tests.py diff --git a/mammoth/docx/body_xml.py b/mammoth/docx/body_xml.py index 1fcd567..433d5a2 100644 --- a/mammoth/docx/body_xml.py +++ b/mammoth/docx/body_xml.py @@ -3,6 +3,7 @@ import contextlib from .. import documents from .. import results from .. import lists +from ..zips import uri_to_zip_entry_name from .xmlparser import node_types, XmlElement from .styles_xml import Styles @@ -317,7 +318,7 @@ def _create_reader(numbering, content_types, relationships, styles, docx_file, f return _find_linked_image(link_relationship_id) def _find_embedded_image(relationship_id): - image_path = "word/" + relationships[relationship_id].target.lstrip("/") + image_path = uri_to_zip_entry_name("word", relationships[relationship_id].target) def open_image(): image_file = docx_file.open(image_path) diff --git a/mammoth/zips.py b/mammoth/zips.py index 432be5d..8e09924 100644 --- a/mammoth/zips.py +++ b/mammoth/zips.py @@ -54,3 +54,10 @@ def update_zip(fileobj, files): fileobj.seek(0) destination_fileobj.seek(0) shutil.copyfileobj(destination_fileobj, fileobj) + + +def uri_to_zip_entry_name(base, uri): + if uri.startswith("/"): + return uri[1:] + else: + return base + "/" + uri diff --git a/tests/mammoth_tests.py b/tests/mammoth_tests.py index 322ebf7..8789855 100644 --- a/tests/mammoth_tests.py +++ b/tests/mammoth_tests.py @@ -108,13 +108,21 @@ p => h1""" @istest -def inline_images_are_included_in_output(): +def inline_images_referenced_by_path_relative_to_part_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 inline_images_referenced_by_path_relative_to_base_are_included_in_output(): + with open(test_path("tiny-picture-target-base-relative.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: diff --git a/tests/test-data/tiny-picture-target-base-relative.docx b/tests/test-data/tiny-picture-target-base-relative.docx new file mode 100644 index 0000000..1d61988 Binary files /dev/null and b/tests/test-data/tiny-picture-target-base-relative.docx differ diff --git a/tests/zips_tests.py b/tests/zips_tests.py new file mode 100644 index 0000000..bef9895 --- /dev/null +++ b/tests/zips_tests.py @@ -0,0 +1,19 @@ +from nose.tools import istest, assert_equal + +from mammoth.zips import uri_to_zip_entry_name + + +@istest +def when_path_does_not_have_leading_slash_then_path_is_resolved_relative_to_base(): + assert_equal( + "one/two/three/four", + uri_to_zip_entry_name("one/two", "three/four"), + ) + + +@istest +def when_path_has_leading_slash_then_base_is_ignored(): + assert_equal( + "three/four", + uri_to_zip_entry_name("one/two", "/three/four"), + ) -- cgit v1.2.3