From d5da134fe3107acc53987ed6ca89cefd72e0397e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 3 Jan 2016 10:58:44 +0000 Subject: Add reading of document.xml --- .../org/zwobble/mammoth/documents/Document.java | 11 +++++ .../java/org/zwobble/mammoth/docx/BodyXml.java | 16 +++---- .../java/org/zwobble/mammoth/docx/DocumentXml.java | 18 ++++++++ .../mammoth/tests/DeepReflectionMatcher.java | 7 +++ .../mammoth/tests/docx/DocumentXmlTests.java | 53 ++++++++++++++++++++++ 5 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/zwobble/mammoth/documents/Document.java create mode 100644 src/main/java/org/zwobble/mammoth/docx/DocumentXml.java create mode 100644 src/test/java/org/zwobble/mammoth/tests/docx/DocumentXmlTests.java 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 children; + + public Document(List 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 readElements(Iterable 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 readElements(Iterable 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 extends TypeSafeDiagnosingMatcher { 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> CHILDREN = newProperty(); + + private static final Instantiator paragraph = new Instantiator() { + @Override + public ParagraphElement instantiate(PropertyLookup 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!"))))))))))); + } +} -- cgit v1.2.3