aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/docx/BodyXml.java18
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java49
2 files changed, 53 insertions, 14 deletions
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());
}