summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-09-02 23:23:08 +0100
committerMichael Williamson <mike@zwobble.org>2016-09-02 23:23:08 +0100
commit7018a91184e98a47c0a39526c743cd9968450633 (patch)
treea388a9128cbd6049f40b14ed92dbd280b4473184
parent1727ae617084af57c3b690da36b990dcce9b72d4 (diff)
Use alt text title if description is blank or missing
-rw-r--r--NEWS5
-rw-r--r--mammoth/docx/body_xml.py6
-rw-r--r--tests/docx/body_xml_tests.py66
3 files changed, 71 insertions, 6 deletions
diff --git a/NEWS b/NEWS
index b5b3451..b3c8205 100644
--- a/NEWS
+++ b/NEWS
@@ -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", {}, [