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 +++++++++++ 3 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/zwobble/mammoth/util/MammothStrings.java (limited to 'src/main/java/org') 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); + } +} -- cgit v1.2.3