diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-03 11:09:52 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-03 11:09:52 +0000 |
| commit | b3444db75e6575335fdfc4b75c7e9f9fab5bee85 (patch) | |
| tree | 600f6a513d2ee2bf8ce59af0ef0ab81182ec6dd3 /src/main/java/org/zwobble/mammoth | |
| parent | c8ff305d5cbbbd472b6dc04c40f25c0190ff3a04 (diff) | |
Use docx parsing in Mammoth
Diffstat (limited to 'src/main/java/org/zwobble/mammoth')
8 files changed, 83 insertions, 26 deletions
diff --git a/src/main/java/org/zwobble/mammoth/Mammoth.java b/src/main/java/org/zwobble/mammoth/Mammoth.java index e266f77..c639634 100644 --- a/src/main/java/org/zwobble/mammoth/Mammoth.java +++ b/src/main/java/org/zwobble/mammoth/Mammoth.java @@ -1,56 +1,85 @@ package org.zwobble.mammoth; +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableBiMap; +import com.google.common.collect.ImmutableMap; +import org.zwobble.mammoth.documents.*; +import org.zwobble.mammoth.docx.BodyXmlReader; +import org.zwobble.mammoth.docx.DocumentXmlReader; +import org.zwobble.mammoth.docx.Styles; +import org.zwobble.mammoth.xml.XmlElement; +import org.zwobble.mammoth.xml.parsing.XmlParser; + import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import org.zwobble.mammoth.xml.XmlElement; -import org.zwobble.mammoth.xml.XmlNodeVisitor; -import org.zwobble.mammoth.xml.parsing.XmlParser; -import org.zwobble.mammoth.xml.XmlTextNode; - -import com.google.common.base.Joiner; -import com.google.common.base.Strings; -import com.google.common.collect.ImmutableBiMap; - import static com.google.common.collect.Iterables.transform; public class Mammoth { + 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 String convertToHtml(File file) { try (ZipFile zipFile = new ZipFile(file)) { ZipEntry entry = zipFile.getEntry("word/document.xml"); XmlElement documentXml = parseXml(zipFile.getInputStream(entry)); - String text = extractText(documentXml); - if (Strings.isNullOrEmpty(text)) { - return ""; - } else { - return "<p>" + text + "</p>"; - } + + Styles styles = new Styles(ImmutableMap.of(), ImmutableMap.of()); + Document document = new DocumentXmlReader(new BodyXmlReader(styles)).readElement(documentXml); + return convertToHtml(document); } catch (IOException e) { throw new UnsupportedOperationException("Should return a result of failure"); } } - private static XmlElement parseXml(InputStream inputStream) { - return new XmlParser(ImmutableBiMap.of()).parseStream(inputStream); + private static String convertToHtml(Document document) { + return convertChildrenToHtml(document); + } + + private static String convertChildrenToHtml(HasChildren element) { + return Joiner.on("").join(transform( + element.getChildren(), + Mammoth::convertToHtml)); } - private static String extractText(XmlElement documentXml) { - return documentXml.accept(new XmlNodeVisitor<String>() { + private static String convertToHtml(DocumentElement element) { + return element.accept(new DocumentElementVisitor<String>() { @Override - public String visit(XmlElement element) { - return Joiner.on("").join( - transform(element.children(), child -> child.accept(this))); + public String visit(ParagraphElement paragraph) { + String content = convertChildrenToHtml(paragraph); + if (content.isEmpty()) { + return ""; + } else { + return "<p>" + content + "</p>"; + } } @Override - public String visit(XmlTextNode textNode) { - return textNode.getValue(); + public String visit(RunElement run) { + return convertChildrenToHtml(run); + } + + @Override + public String visit(TextElement text) { + return text.getValue(); } }); } + private static XmlElement parseXml(InputStream inputStream) { + return new XmlParser(XML_NAMESPACES).parseStream(inputStream); + } } diff --git a/src/main/java/org/zwobble/mammoth/documents/Document.java b/src/main/java/org/zwobble/mammoth/documents/Document.java index a31081a..4d91925 100644 --- a/src/main/java/org/zwobble/mammoth/documents/Document.java +++ b/src/main/java/org/zwobble/mammoth/documents/Document.java @@ -2,10 +2,14 @@ package org.zwobble.mammoth.documents; import java.util.List; -public class Document { +public class Document implements HasChildren { private final List<DocumentElement> children; public Document(List<DocumentElement> children) { this.children = children; } + + public List<DocumentElement> getChildren() { + return children; + } } diff --git a/src/main/java/org/zwobble/mammoth/documents/DocumentElement.java b/src/main/java/org/zwobble/mammoth/documents/DocumentElement.java index d7b20d3..fd3990c 100644 --- a/src/main/java/org/zwobble/mammoth/documents/DocumentElement.java +++ b/src/main/java/org/zwobble/mammoth/documents/DocumentElement.java @@ -1,4 +1,5 @@ package org.zwobble.mammoth.documents; public interface DocumentElement { + <T> T accept(DocumentElementVisitor<T> visitor); } diff --git a/src/main/java/org/zwobble/mammoth/documents/DocumentElementVisitor.java b/src/main/java/org/zwobble/mammoth/documents/DocumentElementVisitor.java new file mode 100644 index 0000000..bb41ff2 --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/documents/DocumentElementVisitor.java @@ -0,0 +1,7 @@ +package org.zwobble.mammoth.documents; + +public interface DocumentElementVisitor<T> { + T visit(ParagraphElement paragraph); + T visit(RunElement run); + T visit(TextElement text); +} diff --git a/src/main/java/org/zwobble/mammoth/documents/ParagraphElement.java b/src/main/java/org/zwobble/mammoth/documents/ParagraphElement.java index 22d9306..15c2b85 100644 --- a/src/main/java/org/zwobble/mammoth/documents/ParagraphElement.java +++ b/src/main/java/org/zwobble/mammoth/documents/ParagraphElement.java @@ -19,4 +19,9 @@ public class ParagraphElement implements DocumentElement, HasChildren { public List<DocumentElement> getChildren() { return children; } + + @Override + public <T> T accept(DocumentElementVisitor<T> visitor) { + return visitor.visit(this); + } } diff --git a/src/main/java/org/zwobble/mammoth/documents/RunElement.java b/src/main/java/org/zwobble/mammoth/documents/RunElement.java index ef063dc..f33eca3 100644 --- a/src/main/java/org/zwobble/mammoth/documents/RunElement.java +++ b/src/main/java/org/zwobble/mammoth/documents/RunElement.java @@ -12,4 +12,9 @@ public class RunElement implements DocumentElement, HasChildren { public List<DocumentElement> getChildren() { return children; } + + @Override + public <T> T accept(DocumentElementVisitor<T> visitor) { + return visitor.visit(this); + } } diff --git a/src/main/java/org/zwobble/mammoth/documents/TextElement.java b/src/main/java/org/zwobble/mammoth/documents/TextElement.java index e2e7383..00281d0 100644 --- a/src/main/java/org/zwobble/mammoth/documents/TextElement.java +++ b/src/main/java/org/zwobble/mammoth/documents/TextElement.java @@ -10,4 +10,9 @@ public class TextElement implements DocumentElement { public String getValue() { return value; } + + @Override + public <T> T accept(DocumentElementVisitor<T> visitor) { + return visitor.visit(this); + } } diff --git a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java index 9d8713a..fdfb692 100644 --- a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java @@ -33,7 +33,8 @@ public class BodyXmlReader { return ImmutableList.of(); default: - throw new UnsupportedOperationException(); + // TODO: emit warning + return ImmutableList.of(); } } |
