From 3e2786a004eddf968a5fa7d5a92dff5b1b5f7734 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 24 Feb 2016 08:16:16 +0000 Subject: Create internal package --- .../zwobble/mammoth/internal/docx/OfficeXml.java | 58 ++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/main/java/org/zwobble/mammoth/internal/docx/OfficeXml.java (limited to 'src/main/java/org/zwobble/mammoth/internal/docx/OfficeXml.java') 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 XML_NAMESPACES = ImmutableBiMap.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 collapseAlternateContent(XmlNode node) { + return node.accept(new XmlNodeVisitor>() { + @Override + public List 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 visit(XmlTextNode textNode) { + return list(textNode); + } + }); + } +} -- cgit v1.2.3