aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/Document.java11
-rw-r--r--src/main/java/org/zwobble/mammoth/docx/BodyXml.java16
-rw-r--r--src/main/java/org/zwobble/mammoth/docx/DocumentXml.java18
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/DeepReflectionMatcher.java7
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/DocumentXmlTests.java53
5 files changed, 97 insertions, 8 deletions
diff --git a/src/main/java/org/zwobble/mammoth/documents/Document.java b/src/main/java/org/zwobble/mammoth/documents/Document.java
new file mode 100644
index 0000000..a31081a
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/documents/Document.java
@@ -0,0 +1,11 @@
+package org.zwobble.mammoth.documents;
+
+import java.util.List;
+
+public class Document {
+ private final List<DocumentElement> children;
+
+ public Document(List<DocumentElement> children) {
+ this.children = children;
+ }
+}
diff --git a/src/main/java/org/zwobble/mammoth/docx/BodyXml.java b/src/main/java/org/zwobble/mammoth/docx/BodyXml.java
index 1796367..a394d97 100644
--- a/src/main/java/org/zwobble/mammoth/docx/BodyXml.java
+++ b/src/main/java/org/zwobble/mammoth/docx/BodyXml.java
@@ -37,6 +37,14 @@ public class BodyXml {
}
}
+ public List<DocumentElement> readElements(Iterable<XmlNode> nodes) {
+ return ImmutableList.copyOf(
+ concat(
+ transform(
+ filter(nodes, XmlElement.class),
+ this::readElement)));
+ }
+
private ParagraphElement readParagraph(XmlElement element) {
return new ParagraphElement(readParagraphStyle(element), readElements(element.children()));
}
@@ -46,12 +54,4 @@ public class BodyXml {
return properties.findChildOrEmpty("w:pStyle").getAttributeOrNone("w:val")
.map(styleId -> styles.findParagraphStyleById(styleId).orElse(new Style(styleId, Optional.empty())));
}
-
- private List<DocumentElement> readElements(Iterable<XmlNode> nodes) {
- return ImmutableList.copyOf(
- concat(
- transform(
- filter(nodes, XmlElement.class),
- this::readElement)));
- }
}
diff --git a/src/main/java/org/zwobble/mammoth/docx/DocumentXml.java b/src/main/java/org/zwobble/mammoth/docx/DocumentXml.java
new file mode 100644
index 0000000..760f0a4
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/docx/DocumentXml.java
@@ -0,0 +1,18 @@
+package org.zwobble.mammoth.docx;
+
+import org.zwobble.mammoth.documents.Document;
+import org.zwobble.mammoth.xml.XmlElement;
+
+public class DocumentXml {
+ private final BodyXml bodyReader;
+
+ public DocumentXml(BodyXml bodyReader) {
+
+ this.bodyReader = bodyReader;
+ }
+
+ public Document readDocumentXmlElement(XmlElement element) {
+ XmlElement body = element.findChild("w:body");
+ return new Document(bodyReader.readElements(body.children()));
+ }
+}
diff --git a/src/test/java/org/zwobble/mammoth/tests/DeepReflectionMatcher.java b/src/test/java/org/zwobble/mammoth/tests/DeepReflectionMatcher.java
index 2668811..ef1fa6e 100644
--- a/src/test/java/org/zwobble/mammoth/tests/DeepReflectionMatcher.java
+++ b/src/test/java/org/zwobble/mammoth/tests/DeepReflectionMatcher.java
@@ -126,6 +126,13 @@ public class DeepReflectionMatcher<T> extends TypeSafeDiagnosingMatcher<T> {
private static String generateDescriptionOfValue(Object value) {
if (value instanceof String) {
return value.toString();
+ } else if (value instanceof Optional) {
+ Optional<?> optional = (Optional)value;
+ if (optional.isPresent()) {
+ return generateDescriptionOfValue(optional.get());
+ } else {
+ return "(empty)";
+ }
} else if (value instanceof List) {
List<?> list = (List)value;
return "[" + indentedList(transform(list, DeepReflectionMatcher::generateDescriptionOfValue)) + "]";
diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/DocumentXmlTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/DocumentXmlTests.java
new file mode 100644
index 0000000..114c1b0
--- /dev/null
+++ b/src/test/java/org/zwobble/mammoth/tests/docx/DocumentXmlTests.java
@@ -0,0 +1,53 @@
+package org.zwobble.mammoth.tests.docx;
+
+import com.google.common.collect.ImmutableList;
+import com.natpryce.makeiteasy.Instantiator;
+import com.natpryce.makeiteasy.Property;
+import com.natpryce.makeiteasy.PropertyLookup;
+import org.junit.Test;
+import org.zwobble.mammoth.documents.*;
+import org.zwobble.mammoth.docx.BodyXml;
+import org.zwobble.mammoth.docx.DocumentXml;
+import org.zwobble.mammoth.xml.XmlElement;
+import org.zwobble.mammoth.xml.XmlNodes;
+
+import java.util.List;
+import java.util.Optional;
+
+import static com.natpryce.makeiteasy.MakeItEasy.*;
+import static com.natpryce.makeiteasy.Property.newProperty;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.zwobble.mammoth.tests.DeepReflectionMatcher.deepEquals;
+import static org.zwobble.mammoth.xml.XmlNodes.element;
+
+public class DocumentXmlTests {
+ private static final Property<HasChildren, List<DocumentElement>> CHILDREN = newProperty();
+
+ private static final Instantiator<ParagraphElement> paragraph = new Instantiator<ParagraphElement>() {
+ @Override
+ public ParagraphElement instantiate(PropertyLookup<ParagraphElement> propertyLookup) {
+ return new ParagraphElement(
+ Optional.empty(),
+ propertyLookup.valueOf(CHILDREN, ImmutableList.of()));
+ }
+ };
+
+ @Test
+ public void canReadTextWithinDocument() {
+ XmlElement documentElement = element("w:document", ImmutableList.of(
+ element("w:body", ImmutableList.of(
+ element("w:p", ImmutableList.of(
+ element("w:r", ImmutableList.of(
+ element("w:t", ImmutableList.of(
+ XmlNodes.text("Hello!")))))))))));
+
+ Document document = new DocumentXml(new BodyXml(null)).readDocumentXmlElement(documentElement);
+
+ assertThat(
+ document,
+ deepEquals(new Document(ImmutableList.of(
+ make(a(paragraph, with(CHILDREN, ImmutableList.of(
+ new RunElement(ImmutableList.of(
+ new TextElement("Hello!")))))))))));
+ }
+}