aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-02 22:26:45 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-02 22:26:45 +0000
commit871df6bd1a1f7c45e750a49589c7a195c3506205 (patch)
tree11b552f4c2e12ec1242852c047446d1f27df20f3 /src
parentd5005305b90afe47e639fc0fa1430242556f0385 (diff)
Add reading of style IDs
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/Documents.java4
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/HasChildren.java7
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/ParagraphElement.java11
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/RunElement.java2
-rw-r--r--src/main/java/org/zwobble/mammoth/docx/BodyXml.java33
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/DeepReflectionMatcher.java24
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java32
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) {