summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2013-12-03 18:02:13 +0000
committerMichael Williamson <mike@zwobble.org>2013-12-03 18:02:13 +0000
commit2cbb7baa6615835b7d4cb81dd2300569c0bafd4a (patch)
tree3d59006b1728045eebdfedda13a82461d235e6fb
parent61bc4fdd82a04da73aa61a5416ac2fa65fb9e237 (diff)
Read default content types
-rw-r--r--mammoth/docx/content_types_xml.py21
-rw-r--r--tests/docx/content_types_xml_tests.py19
2 files changed, 40 insertions, 0 deletions
diff --git a/mammoth/docx/content_types_xml.py b/mammoth/docx/content_types_xml.py
new file mode 100644
index 0000000..a2da8e0
--- /dev/null
+++ b/mammoth/docx/content_types_xml.py
@@ -0,0 +1,21 @@
+def read_content_types_xml_element(element):
+ extension_defaults = dict(map(
+ _read_default,
+ element.find_children("content-types:Default"))
+ )
+ return ContentTypes(extension_defaults)
+
+
+def _read_default(element):
+ extension = element.attributes["Extension"]
+ content_type = element.attributes["ContentType"]
+ return extension, content_type
+
+
+class ContentTypes(object):
+ def __init__(self, extension_defaults):
+ self._extension_defaults = extension_defaults
+
+ def find_content_type(self, path):
+ extension = path.rpartition(".")[2]
+ return self._extension_defaults.get(extension)
diff --git a/tests/docx/content_types_xml_tests.py b/tests/docx/content_types_xml_tests.py
new file mode 100644
index 0000000..56b5a86
--- /dev/null
+++ b/tests/docx/content_types_xml_tests.py
@@ -0,0 +1,19 @@
+from nose.tools import istest, assert_equal
+
+from mammoth.docx.xmlparser import element as xml_element
+from mammoth.docx.content_types_xml import read_content_types_xml_element
+
+
+@istest
+def content_type_is_based_on_default_for_extension_if_there_is_no_override():
+ element = xml_element("content-types:Types", {}, [
+ xml_element("content-types:Default", {
+ "Extension": "png",
+ "ContentType": "image/png",
+ })
+ ])
+ content_types = read_content_types_xml_element(element)
+ assert_equal(
+ "image/png",
+ content_types.find_content_type("word/media/hat.png"),
+ )