summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2017-11-23 20:45:24 +0000
committerMichael Williamson <mike@zwobble.org>2017-11-23 20:45:24 +0000
commit7abf1e89a6d9846e2fb3bc8f04e4ca51fe06a511 (patch)
tree3ae0abc0c1b4919cc7bdc949183518cf2477a706 /src
parentc46102917dbd63f454f4782effbe239e63c67400 (diff)
Parse paragraph indents
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/documents/Paragraph.java13
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/documents/ParagraphIndent.java33
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java19
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java6
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java99
5 files changed, 168 insertions, 2 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/documents/Paragraph.java b/src/main/java/org/zwobble/mammoth/internal/documents/Paragraph.java
index a404ae6..58c3453 100644
--- a/src/main/java/org/zwobble/mammoth/internal/documents/Paragraph.java
+++ b/src/main/java/org/zwobble/mammoth/internal/documents/Paragraph.java
@@ -6,11 +6,18 @@ import java.util.Optional;
public class Paragraph implements DocumentElement, HasChildren {
private final Optional<Style> style;
private final Optional<NumberingLevel> numbering;
+ private final ParagraphIndent indent;
private final List<DocumentElement> children;
- public Paragraph(Optional<Style> style, Optional<NumberingLevel> numbering, List<DocumentElement> children) {
+ public Paragraph(
+ Optional<Style> style,
+ Optional<NumberingLevel> numbering,
+ ParagraphIndent indent,
+ List<DocumentElement> children
+ ) {
this.style = style;
this.numbering = numbering;
+ this.indent = indent;
this.children = children;
}
@@ -22,6 +29,10 @@ public class Paragraph implements DocumentElement, HasChildren {
return numbering;
}
+ public ParagraphIndent getIndent() {
+ return indent;
+ }
+
public List<DocumentElement> getChildren() {
return children;
}
diff --git a/src/main/java/org/zwobble/mammoth/internal/documents/ParagraphIndent.java b/src/main/java/org/zwobble/mammoth/internal/documents/ParagraphIndent.java
new file mode 100644
index 0000000..1d5783e
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/internal/documents/ParagraphIndent.java
@@ -0,0 +1,33 @@
+package org.zwobble.mammoth.internal.documents;
+
+import java.util.Optional;
+
+public class ParagraphIndent {
+ private final Optional<String> start;
+ private final Optional<String> end;
+ private final Optional<String> firstLine;
+ private final Optional<String> hanging;
+
+ public ParagraphIndent(Optional<String> start, Optional<String> end, Optional<String> firstLine, Optional<String> hanging) {
+ this.start = start;
+ this.end = end;
+ this.firstLine = firstLine;
+ this.hanging = hanging;
+ }
+
+ public Optional<String> getStart() {
+ return start;
+ }
+
+ public Optional<String> getEnd() {
+ return end;
+ }
+
+ public Optional<String> getFirstLine() {
+ return firstLine;
+ }
+
+ public Optional<String> getHanging() {
+ return hanging;
+ }
+}
diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java
index f6a9863..412ca23 100644
--- a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java
+++ b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java
@@ -245,10 +245,11 @@ class StatefulBodyXmlReader {
private ReadResult readParagraph(XmlElement element) {
XmlElementLike properties = element.findChildOrEmpty("w:pPr");
Optional<NumberingLevel> numbering = readNumbering(properties);
+ ParagraphIndent indent = readParagraphIndent(properties);
return ReadResult.map(
readParagraphStyle(properties),
readElements(element.getChildren()),
- (style, children) -> new Paragraph(style, numbering, children)).appendExtra();
+ (style, children) -> new Paragraph(style, numbering, indent, children)).appendExtra();
}
private ReadResult readFieldChar(XmlElement element) {
@@ -323,6 +324,22 @@ class StatefulBodyXmlReader {
numbering::findLevel);
}
+ private ParagraphIndent readParagraphIndent(XmlElementLike properties) {
+ XmlElementLike indent = properties.findChildOrEmpty("w:ind");
+ return new ParagraphIndent(
+ Optionals.first(
+ indent.getAttributeOrNone("w:start"),
+ indent.getAttributeOrNone("w:left")
+ ),
+ Optionals.first(
+ indent.getAttributeOrNone("w:end"),
+ indent.getAttributeOrNone("w:right")
+ ),
+ indent.getAttributeOrNone("w:firstLine"),
+ indent.getAttributeOrNone("w:hanging")
+ );
+ }
+
private ReadResult readBreak(XmlElement element) {
String breakType = element.getAttributeOrNone("w:type").orElse("textWrapping");
switch (breakType) {
diff --git a/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java b/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java
index f206640..a2b0d7c 100644
--- a/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java
+++ b/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java
@@ -96,6 +96,12 @@ public class DocumentElementMakers {
return new Paragraph(
arguments.get(STYLE, Optional.empty()),
arguments.get(NUMBERING, Optional.empty()),
+ new ParagraphIndent(
+ Optional.empty(),
+ Optional.empty(),
+ Optional.empty(),
+ Optional.empty()
+ ),
arguments.get(CHILDREN, list())
);
}
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 27f7502..772fdd3 100644
--- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java
@@ -101,6 +101,85 @@ public class BodyXmlTests {
list("Paragraph style with ID Heading1 was referenced but not defined in the document")));
}
+ @Nested
+ public class ParagraphIndentTests {
+ @Test
+ public void whenWStartIsSetThenStartIndentIsReadFromWStart() {
+ XmlElement paragraphXml = paragraphWithIndent(map("w:start", "720", "w:left", "40"));
+ assertThat(
+ readSuccess(bodyReader(), paragraphXml),
+ hasIndent(hasIndentStart(Optional.of("720")))
+ );
+ }
+
+ @Test
+ public void whenWStartIsNotSetThenStartIndentIsReadFromWLeft() {
+ XmlElement paragraphXml = paragraphWithIndent(map("w:left", "720"));
+ assertThat(
+ readSuccess(bodyReader(), paragraphXml),
+ hasIndent(hasIndentStart(Optional.of("720")))
+ );
+ }
+
+ @Test
+ public void whenWEndIsSetThenEndIndentIsReadFromWEnd() {
+ XmlElement paragraphXml = paragraphWithIndent(map("w:end", "720", "w:right", "40"));
+ assertThat(
+ readSuccess(bodyReader(), paragraphXml),
+ hasIndent(hasIndentEnd(Optional.of("720")))
+ );
+ }
+
+ @Test
+ public void whenWEndIsNotSetThenEndIndentIsReadFromWRight() {
+ XmlElement paragraphXml = paragraphWithIndent(map("w:right", "720"));
+ assertThat(
+ readSuccess(bodyReader(), paragraphXml),
+ hasIndent(hasIndentEnd(Optional.of("720")))
+ );
+ }
+
+ @Test
+ public void paragraphHasIndentFirstLineReadFromParagraphPropertiesIfPresent() {
+ XmlElement paragraphXml = paragraphWithIndent(map("w:firstLine", "720"));
+ assertThat(
+ readSuccess(bodyReader(), paragraphXml),
+ hasIndent(hasIndentFirstLine(Optional.of("720")))
+ );
+ }
+
+ @Test
+ public void paragraphHasIndentHangingReadFromParagraphPropertiesIfPresent() {
+ XmlElement paragraphXml = paragraphWithIndent(map("w:hanging", "720"));
+ assertThat(
+ readSuccess(bodyReader(), paragraphXml),
+ hasIndent(hasIndentHanging(Optional.of("720")))
+ );
+ }
+
+ @Test
+ public void whenIndentAttributesArentSetThenIndentsAreNotSet() {
+ XmlElement paragraphXml = paragraphWithIndent(map());
+ assertThat(
+ readSuccess(bodyReader(), paragraphXml),
+ hasIndent(allOf(
+ hasIndentStart(Optional.empty()),
+ hasIndentEnd(Optional.empty()),
+ hasIndentFirstLine(Optional.empty()),
+ hasIndentHanging(Optional.empty())
+ ))
+ );
+ }
+
+ private XmlElement paragraphWithIndent(Map<String, String> attributes) {
+ return paragraphXml(list(
+ element("w:pPr", list(
+ element("w:ind", attributes)
+ ))
+ ));
+ }
+ }
+
@Test
public void paragraphHasNoNumberingIfItHasNoNumberingProperties() {
XmlElement element = paragraphXml();
@@ -1319,6 +1398,26 @@ public class BodyXmlTests {
return hasProperty("numbering", deepEquals(expected));
}
+ private Matcher<? super DocumentElement> hasIndent(Matcher<ParagraphIndent> expected) {
+ return hasProperty("indent", expected);
+ }
+
+ private Matcher<ParagraphIndent> hasIndentStart(Optional<String> value) {
+ return hasProperty("start", equalTo(value));
+ }
+
+ private Matcher<ParagraphIndent> hasIndentEnd(Optional<String> value) {
+ return hasProperty("end", equalTo(value));
+ }
+
+ private Matcher<ParagraphIndent> hasIndentFirstLine(Optional<String> value) {
+ return hasProperty("firstLine", equalTo(value));
+ }
+
+ private Matcher<ParagraphIndent> hasIndentHanging(Optional<String> value) {
+ return hasProperty("hanging", equalTo(value));
+ }
+
private static Text text(String value) {
return new Text(value);
}