diff options
| -rw-r--r-- | mammoth/docx/content_types_xml.py | 21 | ||||
| -rw-r--r-- | tests/docx/content_types_xml_tests.py | 19 |
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"), + ) |
