diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-02 22:26:45 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-02 22:26:45 +0000 |
| commit | 871df6bd1a1f7c45e750a49589c7a195c3506205 (patch) | |
| tree | 11b552f4c2e12ec1242852c047446d1f27df20f3 /src | |
| parent | d5005305b90afe47e639fc0fa1430242556f0385 (diff) | |
Add reading of style IDs
Diffstat (limited to 'src')
7 files changed, 103 insertions, 10 deletions
diff --git a/src/main/java/org/zwobble/mammoth/documents/Documents.java b/src/main/java/org/zwobble/mammoth/documents/Documents.java new file mode 100644 index 0000000..b599c51 --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/documents/Documents.java @@ -0,0 +1,4 @@ +package org.zwobble.mammoth.documents; + +public class Documents { +} diff --git a/src/main/java/org/zwobble/mammoth/documents/HasChildren.java b/src/main/java/org/zwobble/mammoth/documents/HasChildren.java new file mode 100644 index 0000000..cfd6c44 --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/documents/HasChildren.java @@ -0,0 +1,7 @@ +package org.zwobble.mammoth.documents; + +import java.util.List; + +public interface HasChildren { + List<DocumentElement> getChildren(); +} diff --git a/src/main/java/org/zwobble/mammoth/documents/ParagraphElement.java b/src/main/java/org/zwobble/mammoth/documents/ParagraphElement.java index 3a8e447..dcf8dad 100644 --- a/src/main/java/org/zwobble/mammoth/documents/ParagraphElement.java +++ b/src/main/java/org/zwobble/mammoth/documents/ParagraphElement.java @@ -1,14 +1,21 @@ package org.zwobble.mammoth.documents; import java.util.List; +import java.util.Optional; -public class ParagraphElement implements DocumentElement { +public class ParagraphElement implements DocumentElement, HasChildren { + private final Optional<String> styleId; private final List<DocumentElement> children; - public ParagraphElement(List<DocumentElement> children) { + public ParagraphElement(Optional<String> styleId, List<DocumentElement> children) { + this.styleId = styleId; this.children = children; } + public Optional<String> getStyleId() { + return styleId; + } + public List<DocumentElement> getChildren() { return children; } diff --git a/src/main/java/org/zwobble/mammoth/documents/RunElement.java b/src/main/java/org/zwobble/mammoth/documents/RunElement.java index 3f80872..ef063dc 100644 --- a/src/main/java/org/zwobble/mammoth/documents/RunElement.java +++ b/src/main/java/org/zwobble/mammoth/documents/RunElement.java @@ -2,7 +2,7 @@ package org.zwobble.mammoth.documents; import java.util.List; -public class RunElement implements DocumentElement { +public class RunElement implements DocumentElement, HasChildren { private final List<DocumentElement> children; public RunElement(List<DocumentElement> children) { diff --git a/src/main/java/org/zwobble/mammoth/docx/BodyXml.java b/src/main/java/org/zwobble/mammoth/docx/BodyXml.java index 94faf83..8aba487 100644 --- a/src/main/java/org/zwobble/mammoth/docx/BodyXml.java +++ b/src/main/java/org/zwobble/mammoth/docx/BodyXml.java @@ -6,31 +6,52 @@ import org.zwobble.mammoth.documents.ParagraphElement; import org.zwobble.mammoth.documents.RunElement; import org.zwobble.mammoth.documents.TextElement; import org.zwobble.mammoth.xml.XmlElement; +import org.zwobble.mammoth.xml.XmlElementLike; import org.zwobble.mammoth.xml.XmlNode; import java.util.List; +import java.util.Optional; +import static com.google.common.collect.Iterables.concat; import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.transform; public class BodyXml { public static DocumentElement readBodyXmlElement(XmlElement element) { + return readElement(element).get(0); + } + + private static List<DocumentElement> readElement(XmlElement element) { switch (element.getName()) { case "w:t": - return new TextElement(element.innerText()); + return ImmutableList.of(new TextElement(element.innerText())); case "w:r": - return new RunElement(readElements(element.children())); + return ImmutableList.of(new RunElement(readElements(element.children()))); case "w:p": - return new ParagraphElement(readElements(element.children())); + return ImmutableList.of(readParagraph(element)); + + case "w:pPr": + return ImmutableList.of(); + default: throw new UnsupportedOperationException(); } } + private static ParagraphElement readParagraph(XmlElement element) { + return new ParagraphElement(readParagraphStyleId(element), readElements(element.children())); + } + + private static Optional<String> readParagraphStyleId(XmlElement paragraph) { + XmlElementLike properties = paragraph.findChildOrEmpty("w:pPr"); + return properties.findChildOrEmpty("w:pStyle").getAttributeOrNone("w:val"); + } + private static List<DocumentElement> readElements(Iterable<XmlNode> nodes) { return ImmutableList.copyOf( - transform( - filter(nodes, XmlElement.class), - BodyXml::readBodyXmlElement)); + concat( + transform( + filter(nodes, XmlElement.class), + BodyXml::readElement))); } } diff --git a/src/test/java/org/zwobble/mammoth/tests/DeepReflectionMatcher.java b/src/test/java/org/zwobble/mammoth/tests/DeepReflectionMatcher.java index 8ee0d8f..54b74ee 100644 --- a/src/test/java/org/zwobble/mammoth/tests/DeepReflectionMatcher.java +++ b/src/test/java/org/zwobble/mammoth/tests/DeepReflectionMatcher.java @@ -11,6 +11,7 @@ import org.hamcrest.TypeSafeDiagnosingMatcher; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.List; +import java.util.Optional; import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.transform; @@ -37,6 +38,9 @@ public class DeepReflectionMatcher<T> extends TypeSafeDiagnosingMatcher<T> { mismatchDescription.appendText("was " + actual.getClass().getName()); return false; } + if (expected instanceof Optional && actual instanceof Optional) { + return matchesOptional(path, (Optional)expected, (Optional)actual, mismatchDescription); + } if (expected instanceof String) { return matchesString(path, expected, actual, mismatchDescription); @@ -75,6 +79,26 @@ public class DeepReflectionMatcher<T> extends TypeSafeDiagnosingMatcher<T> { return true; } + private static boolean matchesOptional(String path, Optional expected, Optional actual, Description mismatchDescription) { + if (actual.isPresent() && !expected.isPresent()) { + appendPath(mismatchDescription, path); + mismatchDescription.appendText("had value " + generateDescriptionOfValue(actual.get())); + return false; + } + + if (expected.isPresent() && !actual.isPresent()) { + appendPath(mismatchDescription, path); + mismatchDescription.appendText("was empty"); + return false; + } + + if (actual.isPresent() && expected.isPresent()) { + return matchesSafely(path, expected.get(), actual.get(), mismatchDescription); + } + + return true; + } + private static <T> boolean matchesString(String path, T expected, T actual, Description mismatchDescription) { Matcher<Object> matcher = Matchers.equalTo(expected); if (!matcher.matches(actual)) { diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java index e2ee5a9..b0152a5 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -1,6 +1,7 @@ package org.zwobble.mammoth.tests.docx; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; import org.hamcrest.Matcher; import org.junit.Test; import org.zwobble.mammoth.documents.DocumentElement; @@ -13,9 +14,12 @@ import org.zwobble.mammoth.xml.XmlNode; import org.zwobble.mammoth.xml.XmlNodes; import java.util.List; +import java.util.Optional; import static java.util.Arrays.asList; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasProperty; import static org.zwobble.mammoth.docx.BodyXml.readBodyXmlElement; import static org.zwobble.mammoth.xml.XmlNodes.element; @@ -42,6 +46,28 @@ public class BodyXmlTests { isParagraph(paragraph(run(text("Hello!"))))); } + @Test + public void paragraphHasNoStyleIfItHasNoProperties() { + XmlElement element = paragraphXml(); + assertThat( + readBodyXmlElement(element), + hasStyleId(Optional.empty())); + } + + @Test + public void paragraphHasStyleIdReadFromParagraphPropertiesIfPresent() { + XmlElement element = paragraphXml(ImmutableList.of( + element("w:pPr", ImmutableList.of( + element("w:pStyle", ImmutableMap.of("w:val", "Heading1")))))); + assertThat( + readBodyXmlElement(element), + hasStyleId(Optional.of("Heading1"))); + } + + private XmlElement paragraphXml() { + return paragraphXml(ImmutableList.of()); + } + private XmlElement paragraphXml(List<XmlNode> children) { return element("w:p", children); } @@ -66,8 +92,12 @@ public class BodyXmlTests { return new DeepReflectionMatcher<>(new TextElement(value)); } + private Matcher<? super DocumentElement> hasStyleId(Optional<String> expected) { + return hasProperty("styleId", equalTo(expected)); + } + private ParagraphElement paragraph(DocumentElement... children) { - return new ParagraphElement(asList(children)); + return new ParagraphElement(Optional.empty(), asList(children)); } private RunElement run(DocumentElement... children) { |
