aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble
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
parentc8ff305d5cbbbd472b6dc04c40f25c0190ff3a04 (diff)
Use docx parsing in Mammoth
Diffstat (limited to 'src/main/java/org/zwobble')
-rw-r--r--src/main/java/org/zwobble/mammoth/Mammoth.java77
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/Document.java6
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/DocumentElement.java1
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/DocumentElementVisitor.java7
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/ParagraphElement.java5
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/RunElement.java5
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/TextElement.java5
-rw-r--r--src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java3
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();
}
}