From df0e65ca725de5fb471abdd7ff8621904e41a209 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 3 Jan 2016 11:36:08 +0000 Subject: Collapse alternate content elements using fallback --- .../java/org/zwobble/mammoth/docx/OfficeXml.java | 33 +++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'src/main/java/org/zwobble/mammoth/docx/OfficeXml.java') diff --git a/src/main/java/org/zwobble/mammoth/docx/OfficeXml.java b/src/main/java/org/zwobble/mammoth/docx/OfficeXml.java index 98ec1bf..a1d156f 100644 --- a/src/main/java/org/zwobble/mammoth/docx/OfficeXml.java +++ b/src/main/java/org/zwobble/mammoth/docx/OfficeXml.java @@ -1,10 +1,18 @@ package org.zwobble.mammoth.docx; import com.google.common.collect.ImmutableBiMap; +import com.google.common.collect.ImmutableList; import org.zwobble.mammoth.xml.XmlElement; +import org.zwobble.mammoth.xml.XmlNode; +import org.zwobble.mammoth.xml.XmlNodeVisitor; +import org.zwobble.mammoth.xml.XmlTextNode; import org.zwobble.mammoth.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; public class OfficeXml { private static ImmutableBiMap XML_NAMESPACES = ImmutableBiMap.builder() @@ -21,6 +29,29 @@ public class OfficeXml { .build(); public static XmlElement parseXml(InputStream inputStream) { - return new XmlParser(XML_NAMESPACES).parseStream(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 ImmutableList.of(collapsedElement); + } + } + + @Override + public List visit(XmlTextNode textNode) { + return ImmutableList.of(textNode); + } + }); } } -- cgit v1.2.3