From 8e74ac206058628958bd98cb6ccf91bf144793c8 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 31 Dec 2015 16:43:31 +0000 Subject: Support content type overrides --- .../java/org/zwobble/mammoth/docx/ContentTypes.java | 12 +++++++++--- .../org/zwobble/mammoth/docx/ContentTypesXml.java | 19 ++++++++++++++++--- .../java/org/zwobble/mammoth/util/MammothStrings.java | 11 +++++++++++ .../mammoth/tests/docx/ContentTypesXmlTests.java | 17 ++++++++++++++++- 4 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/zwobble/mammoth/util/MammothStrings.java diff --git a/src/main/java/org/zwobble/mammoth/docx/ContentTypes.java b/src/main/java/org/zwobble/mammoth/docx/ContentTypes.java index 18aa8e4..bd61763 100644 --- a/src/main/java/org/zwobble/mammoth/docx/ContentTypes.java +++ b/src/main/java/org/zwobble/mammoth/docx/ContentTypes.java @@ -7,13 +7,19 @@ import java.util.Optional; public class ContentTypes { private final Map extensionDefaults; + private final Map overrides; - public ContentTypes(Map extensionDefaults) { + public ContentTypes(Map extensionDefaults, Map overrides) { this.extensionDefaults = extensionDefaults; + this.overrides = overrides; } public Optional findContentType(String path) { - String extension = Files.getFileExtension(path); - return Optional.ofNullable(extensionDefaults.get(extension)); + if (overrides.containsKey(path)) { + return Optional.ofNullable(overrides.get(path)); + } else { + String extension = Files.getFileExtension(path); + return Optional.ofNullable(extensionDefaults.get(extension)); + } } } diff --git a/src/main/java/org/zwobble/mammoth/docx/ContentTypesXml.java b/src/main/java/org/zwobble/mammoth/docx/ContentTypesXml.java index 6ecf8e2..afcc6c0 100644 --- a/src/main/java/org/zwobble/mammoth/docx/ContentTypesXml.java +++ b/src/main/java/org/zwobble/mammoth/docx/ContentTypesXml.java @@ -3,14 +3,17 @@ package org.zwobble.mammoth.docx; import org.zwobble.mammoth.xml.XmlElement; import org.zwobble.mammoth.xml.XmlElementList; -import java.util.AbstractMap; import java.util.Map; +import static com.google.common.collect.Maps.immutableEntry; import static org.zwobble.mammoth.util.MammothMaps.toMap; +import static org.zwobble.mammoth.util.MammothStrings.trimLeft; public class ContentTypesXml { public static ContentTypes readContentTypesXmlElement(XmlElement element) { - return new ContentTypes(readDefaults(element.findChildren("content-types:Default"))); + return new ContentTypes( + readDefaults(element.findChildren("content-types:Default")), + readOverrides(element.findChildren("content-types:Override"))); } private static Map readDefaults(XmlElementList children) { @@ -18,8 +21,18 @@ public class ContentTypesXml { } private static Map.Entry readDefault(XmlElement element) { - return new AbstractMap.SimpleImmutableEntry<>( + return immutableEntry( element.getAttribute("Extension"), element.getAttribute("ContentType")); } + + private static Map readOverrides(XmlElementList children) { + return toMap(children, ContentTypesXml::readOverride); + } + + private static Map.Entry readOverride(XmlElement element) { + return immutableEntry( + trimLeft(element.getAttribute("PartName"), '/'), + element.getAttribute("ContentType")); + } } diff --git a/src/main/java/org/zwobble/mammoth/util/MammothStrings.java b/src/main/java/org/zwobble/mammoth/util/MammothStrings.java new file mode 100644 index 0000000..bdd826c --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/util/MammothStrings.java @@ -0,0 +1,11 @@ +package org.zwobble.mammoth.util; + +public class MammothStrings { + public static String trimLeft(String value, char character) { + int index = 0; + while (index < value.length() && value.charAt(index) == character) { + index++; + } + return value.substring(index); + } +} diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/ContentTypesXmlTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/ContentTypesXmlTests.java index 6b46456..573103b 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/ContentTypesXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/ContentTypesXmlTests.java @@ -14,7 +14,7 @@ import static org.zwobble.mammoth.xml.XmlNodes.element; public class ContentTypesXmlTests { @Test - public void contentTypesBasedOnDefaultForExtensionIfThereIsNoOverride() { + public void contentTypeIsBasedOnDefaultForExtensionIfThereIsNoOverride() { XmlElement element = element("content-types:Types", ImmutableList.of( element("content-types:Default", ImmutableMap.of( "Extension", "png", @@ -24,4 +24,19 @@ public class ContentTypesXmlTests { Optional.of("image/png"), contentTypes.findContentType("word/media/hat.png")); } + + @Test + public void contentTypeIsBasedOnOverrideIfPresent() { + XmlElement element = element("content-types:Types", ImmutableList.of( + element("content-types:Default", ImmutableMap.of( + "Extension", "png", + "ContentType", "image/png")), + element("content-types:Override", ImmutableMap.of( + "PartName", "/word/media/hat.png", + "ContentType", "image/hat")))); + ContentTypes contentTypes = readContentTypesXmlElement(element); + assertEquals( + Optional.of("image/hat"), + contentTypes.findContentType("word/media/hat.png")); + } } -- cgit v1.2.3