aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/mammoth/internal/docx/OfficeXml.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-24 08:16:16 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-24 08:16:16 +0000
commit3e2786a004eddf968a5fa7d5a92dff5b1b5f7734 (patch)
tree7fa1bcc1e484cd0ef782f64baf504ee83333d397 /src/main/java/org/zwobble/mammoth/internal/docx/OfficeXml.java
parent0dc3a12affc2e46c1a0df2899cf51a1ae3fdbd61 (diff)
Create internal package
Diffstat (limited to 'src/main/java/org/zwobble/mammoth/internal/docx/OfficeXml.java')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/OfficeXml.java58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/OfficeXml.java b/src/main/java/org/zwobble/mammoth/internal/docx/OfficeXml.java
new file mode 100644
index 0000000..2b5c279
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/internal/docx/OfficeXml.java
@@ -0,0 +1,58 @@
+package org.zwobble.mammoth.internal.docx;
+
+import com.google.common.collect.ImmutableBiMap;
+import com.google.common.collect.ImmutableList;
+import org.zwobble.mammoth.internal.xml.XmlElement;
+import org.zwobble.mammoth.internal.xml.XmlNode;
+import org.zwobble.mammoth.internal.xml.XmlNodeVisitor;
+import org.zwobble.mammoth.internal.xml.XmlTextNode;
+import org.zwobble.mammoth.internal.xml.parsing.XmlParser;
+
+import java.io.InputStream;
+import java.util.List;
+
+import static com.google.common.collect.Iterables.concat;
+import static com.google.common.collect.Iterables.transform;
+import static org.zwobble.mammoth.internal.util.MammothLists.list;
+
+public class OfficeXml {
+ private static ImmutableBiMap<String, String> XML_NAMESPACES = ImmutableBiMap.<String, String>builder()
+ .put("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main")
+ .put("wp", "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing")
+ .put("a", "http://schemas.openxmlformats.org/drawingml/2006/main")
+ .put("pic", "http://schemas.openxmlformats.org/drawingml/2006/picture")
+ .put("content-types", "http://schemas.openxmlformats.org/package/2006/content-types")
+ .put("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships")
+ .put("relationships", "http://schemas.openxmlformats.org/package/2006/relationships")
+ .put("v", "urn:schemas-microsoft-com:vml")
+ .put("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006")
+ .put("office-word", "urn:schemas-microsoft-com:office:word")
+ .build();
+
+ public static XmlElement parseXml(InputStream inputStream) {
+ XmlParser parser = new XmlParser(XML_NAMESPACES);
+ return (XmlElement)collapseAlternateContent(parser.parseStream(inputStream)).get(0);
+ }
+
+ private static List<XmlNode> collapseAlternateContent(XmlNode node) {
+ return node.accept(new XmlNodeVisitor<List<XmlNode>>() {
+ @Override
+ public List<XmlNode> visit(XmlElement element) {
+ if (element.getName().equals("mc:AlternateContent")) {
+ return element.findChild("mc:Fallback").getChildren();
+ } else {
+ XmlElement collapsedElement = new XmlElement(
+ element.getName(),
+ element.getAttributes(),
+ ImmutableList.copyOf(concat(transform(element.children(), OfficeXml::collapseAlternateContent))));
+ return list(collapsedElement);
+ }
+ }
+
+ @Override
+ public List<XmlNode> visit(XmlTextNode textNode) {
+ return list(textNode);
+ }
+ });
+ }
+}