diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-02 22:49:32 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-02 22:49:32 +0000 |
| commit | 77cc4cba4a6adf6fa35513c9700b745139dba12b (patch) | |
| tree | 71274df6173bcb9a9fb06976cc2182ffe0cff936 | |
| parent | 98a94a032f08e9f1d0ad6a07ea45ef539dd8eac9 (diff) | |
Pass styles into body reader
| -rw-r--r-- | pom.xml | 5 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/mammoth/docx/BodyXml.java | 18 | ||||
| -rw-r--r-- | src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java | 49 |
3 files changed, 58 insertions, 14 deletions
@@ -29,6 +29,11 @@ <scope>test</scope> </dependency> <dependency> + <groupId>com.natpryce</groupId> + <artifactId>make-it-easy</artifactId> + <version>4.0.0</version> + </dependency> + <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>18.0</version> diff --git a/src/main/java/org/zwobble/mammoth/docx/BodyXml.java b/src/main/java/org/zwobble/mammoth/docx/BodyXml.java index df98fbc..1796367 100644 --- a/src/main/java/org/zwobble/mammoth/docx/BodyXml.java +++ b/src/main/java/org/zwobble/mammoth/docx/BodyXml.java @@ -14,11 +14,13 @@ 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 final Styles styles; + + public BodyXml(Styles styles) { + this.styles = styles; } - private static List<DocumentElement> readElement(XmlElement element) { + public List<DocumentElement> readElement(XmlElement element) { switch (element.getName()) { case "w:t": return ImmutableList.of(new TextElement(element.innerText())); @@ -35,21 +37,21 @@ public class BodyXml { } } - private static ParagraphElement readParagraph(XmlElement element) { + private ParagraphElement readParagraph(XmlElement element) { return new ParagraphElement(readParagraphStyle(element), readElements(element.children())); } - private static Optional<Style> readParagraphStyle(XmlElement paragraph) { + private Optional<Style> readParagraphStyle(XmlElement paragraph) { XmlElementLike properties = paragraph.findChildOrEmpty("w:pPr"); return properties.findChildOrEmpty("w:pStyle").getAttributeOrNone("w:val") - .map(styleId -> new Style(styleId, Optional.empty())); + .map(styleId -> styles.findParagraphStyleById(styleId).orElse(new Style(styleId, Optional.empty()))); } - private static List<DocumentElement> readElements(Iterable<XmlNode> nodes) { + private List<DocumentElement> readElements(Iterable<XmlNode> nodes) { return ImmutableList.copyOf( concat( transform( filter(nodes, XmlElement.class), - BodyXml::readElement))); + this::readElement))); } } 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 8c37ea9..cc00d3c 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -2,9 +2,15 @@ package org.zwobble.mammoth.tests.docx; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.natpryce.makeiteasy.Instantiator; +import com.natpryce.makeiteasy.Maker; +import com.natpryce.makeiteasy.Property; +import com.natpryce.makeiteasy.PropertyLookup; import org.hamcrest.Matcher; import org.junit.Test; import org.zwobble.mammoth.documents.*; +import org.zwobble.mammoth.docx.BodyXml; +import org.zwobble.mammoth.docx.Styles; import org.zwobble.mammoth.tests.DeepReflectionMatcher; import org.zwobble.mammoth.xml.XmlElement; import org.zwobble.mammoth.xml.XmlNode; @@ -13,25 +19,37 @@ import org.zwobble.mammoth.xml.XmlNodes; import java.util.List; import java.util.Optional; +import static com.natpryce.makeiteasy.MakeItEasy.a; +import static com.natpryce.makeiteasy.MakeItEasy.with; +import static com.natpryce.makeiteasy.Property.newProperty; import static java.util.Arrays.asList; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasProperty; -import static org.zwobble.mammoth.docx.BodyXml.readBodyXmlElement; import static org.zwobble.mammoth.tests.DeepReflectionMatcher.deepEquals; import static org.zwobble.mammoth.xml.XmlNodes.element; public class BodyXmlTests { + private static final Property<BodyXml, Styles> STYLES = newProperty(); + + private static final Instantiator<BodyXml> bodyReader = new Instantiator<BodyXml>() { + @Override + public BodyXml instantiate(PropertyLookup<BodyXml> propertyLookup) { + return new BodyXml( + propertyLookup.valueOf(STYLES, new Styles(ImmutableMap.of(), ImmutableMap.of()))); + } + }; + @Test public void textFromTextElementIsRead() { XmlElement element = textXml("Hello!"); - assertThat(readBodyXmlElement(element), isTextElement("Hello!")); + assertThat(read(a(bodyReader), element), isTextElement("Hello!")); } @Test public void canReadTextWithinRun() { XmlElement element = runXml(ImmutableList.of(textXml("Hello!"))); assertThat( - readBodyXmlElement(element), + read(a(bodyReader), element), isRun(run(text("Hello!")))); } @@ -39,7 +57,7 @@ public class BodyXmlTests { public void canReadTextWithinParagraph() { XmlElement element = paragraphXml(ImmutableList.of(runXml(ImmutableList.of(textXml("Hello!"))))); assertThat( - readBodyXmlElement(element), + read(a(bodyReader), element), isParagraph(paragraph(run(text("Hello!"))))); } @@ -47,7 +65,7 @@ public class BodyXmlTests { public void paragraphHasNoStyleIfItHasNoProperties() { XmlElement element = paragraphXml(); assertThat( - readBodyXmlElement(element), + read(a(bodyReader), element), hasStyle(Optional.empty())); } @@ -57,10 +75,29 @@ public class BodyXmlTests { element("w:pPr", ImmutableList.of( element("w:pStyle", ImmutableMap.of("w:val", "Heading1")))))); assertThat( - readBodyXmlElement(element), + read(a(bodyReader), element), hasStyle(Optional.of(new Style("Heading1", Optional.empty())))); } + @Test + public void whenParagraphHasStyleIdInStylesThenStyleNameIsReadFromStyles() { + XmlElement element = paragraphXml(ImmutableList.of( + element("w:pPr", ImmutableList.of( + element("w:pStyle", ImmutableMap.of("w:val", "Heading1")))))); + + Style style = new Style("Heading1", Optional.of("Heading 1")); + Styles styles = new Styles( + ImmutableMap.of("Heading1", style), + ImmutableMap.of()); + assertThat( + read(a(bodyReader, with(STYLES, styles)), element), + hasStyle(Optional.of(style))); + } + + private static DocumentElement read(Maker<BodyXml> reader, XmlElement element) { + return reader.make().readElement(element).get(0); + } + private XmlElement paragraphXml() { return paragraphXml(ImmutableList.of()); } |
