diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-09-02 23:23:08 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-09-02 23:23:08 +0100 |
| commit | 7018a91184e98a47c0a39526c743cd9968450633 (patch) | |
| tree | a388a9128cbd6049f40b14ed92dbd280b4473184 | |
| parent | 1727ae617084af57c3b690da36b990dcce9b72d4 (diff) | |
Use alt text title if description is blank or missing
| -rw-r--r-- | NEWS | 5 | ||||
| -rw-r--r-- | mammoth/docx/body_xml.py | 6 | ||||
| -rw-r--r-- | tests/docx/body_xml_tests.py | 66 |
3 files changed, 71 insertions, 6 deletions
@@ -1,3 +1,8 @@ +# 1.2.0 + +* Use alt text title as alt text for images when the alt text description is + blank or missing. + # 1.1.1 * Handle comments without author initials. diff --git a/mammoth/docx/body_xml.py b/mammoth/docx/body_xml.py index b1be2e5..fbf813c 100644 --- a/mammoth/docx/body_xml.py +++ b/mammoth/docx/body_xml.py @@ -269,7 +269,11 @@ def _create_reader(numbering, content_types, relationships, styles, docx_file, f return _success(documents.line_break()) def inline(element): - alt_text = element.find_child_or_null("wp:docPr").attributes.get("descr") + properties = element.find_child_or_null("wp:docPr").attributes + if properties.get("descr", "").strip(): + alt_text = properties.get("descr") + else: + alt_text = properties.get("title") blips = element.find_children("a:graphic") \ .find_children("a:graphicData") \ .find_children("pic:pic") \ diff --git a/tests/docx/body_xml_tests.py b/tests/docx/body_xml_tests.py index 6064ddb..678d17f 100644 --- a/tests/docx/body_xml_tests.py +++ b/tests/docx/body_xml_tests.py @@ -464,6 +464,56 @@ class ReadXmlElementTests(object): with image.open() as image_file: assert_equal(self.IMAGE_BYTES, image_file.read()) + + @istest + def alt_text_title_is_used_if_alt_text_description_is_blank(self): + drawing_element = _create_inline_image( + blip=_embedded_blip(self.IMAGE_RELATIONSHIP_ID), + description=" ", + title="It's a hat", + ) + + image = self._read_embedded_image(drawing_element) + + assert_equal(documents.Image, type(image)) + assert_equal("It's a hat", image.alt_text) + assert_equal("image/png", image.content_type) + with image.open() as image_file: + assert_equal(self.IMAGE_BYTES, image_file.read()) + + + @istest + def alt_text_title_is_used_if_alt_text_description_is_missing(self): + drawing_element = _create_inline_image( + blip=_embedded_blip(self.IMAGE_RELATIONSHIP_ID), + title="It's a hat", + ) + + image = self._read_embedded_image(drawing_element) + + assert_equal(documents.Image, type(image)) + assert_equal("It's a hat", image.alt_text) + assert_equal("image/png", image.content_type) + with image.open() as image_file: + assert_equal(self.IMAGE_BYTES, image_file.read()) + + + @istest + def alt_text_description_is_preferred_to_alt_text_title(self): + drawing_element = _create_inline_image( + blip=_embedded_blip(self.IMAGE_RELATIONSHIP_ID), + description="It's a hat", + title="hat", + ) + + image = self._read_embedded_image(drawing_element) + + assert_equal(documents.Image, type(image)) + assert_equal("It's a hat", image.alt_text) + assert_equal("image/png", image.content_type) + with image.open() as image_file: + assert_equal(self.IMAGE_BYTES, image_file.read()) + @istest def can_read_anchored_pictures(self): drawing_element = _create_anchored_image( @@ -696,21 +746,27 @@ def _text_element(value): return xml_element("w:t", {}, [xml_text(value)]) -def _create_inline_image(description, blip): +def _create_inline_image(blip, description=None, title=None): return xml_element("w:drawing", {}, [ - xml_element("wp:inline", {}, _create_image_elements(description, blip)) + xml_element("wp:inline", {}, _create_image_elements(blip, description=description, title=title)) ]) def _create_anchored_image(description, blip): return xml_element("w:drawing", {}, [ - xml_element("wp:anchor", {}, _create_image_elements(description, blip)) + xml_element("wp:anchor", {}, _create_image_elements(blip, description=description, )) ]) -def _create_image_elements(description, blip): +def _create_image_elements(blip, description=None, title=None): + properties = {} + if description is not None: + properties["descr"] = description + if title is not None: + properties["title"] = title + return [ - xml_element("wp:docPr", {"descr": description}), + xml_element("wp:docPr", properties), xml_element("a:graphic", {}, [ xml_element("a:graphicData", {}, [ xml_element("pic:pic", {}, [ |
