aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/mammoth/Mammoth.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-03 11:09:52 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-03 11:09:52 +0000
commitb3444db75e6575335fdfc4b75c7e9f9fab5bee85 (patch)
tree600f6a513d2ee2bf8ce59af0ef0ab81182ec6dd3 /src/main/java/org/zwobble/mammoth/Mammoth.java
parentc8ff305d5cbbbd472b6dc04c40f25c0190ff3a04 (diff)
Use docx parsing in Mammoth
Diffstat (limited to 'src/main/java/org/zwobble/mammoth/Mammoth.java')
-rw-r--r--src/main/java/org/zwobble/mammoth/Mammoth.java77
1 files changed, 53 insertions, 24 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);
+ }
}