diff options
| author | Michael Williamson <mike@zwobble.org> | 2017-11-23 20:45:24 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2017-11-23 20:45:24 +0000 |
| commit | 7abf1e89a6d9846e2fb3bc8f04e4ca51fe06a511 (patch) | |
| tree | 3ae0abc0c1b4919cc7bdc949183518cf2477a706 /src | |
| parent | c46102917dbd63f454f4782effbe239e63c67400 (diff) | |
Parse paragraph indents
Diffstat (limited to 'src')
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); } |
