aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-13 21:59:28 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-13 21:59:28 +0000
commit487bf06d9247b4e2369826af9118c2d4b7dcf0a0 (patch)
tree21810351aab4c0d130c88b2bfdc9be7269c4d297
parent4a6dd0bddad42cfec4f4ae88893eefde2721b7ba (diff)
Read text boxes
-rw-r--r--src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java19
-rw-r--r--src/main/java/org/zwobble/mammoth/docx/ReadResult.java41
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java33
3 files changed, 75 insertions, 18 deletions
diff --git a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java
index c8e1785..19f649a 100644
--- a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java
+++ b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java
@@ -59,12 +59,15 @@ public class BodyXmlReader {
case "w:endnoteReference":
return readNoteReference(NoteType.ENDNOTE, element);
+ case "w:pict":
+ return readPict(element);
+
case "w:ins":
case "w:smartTag":
case "w:drawing":
- case "w:roundrect":
- case "w:shape":
- case "w:textbox":
+ case "v:roundrect":
+ case "v:shape":
+ case "v:textbox":
case "w:txbxContent":
return readElements(element.children());
@@ -90,7 +93,7 @@ public class BodyXmlReader {
default:
Warning warning = warning("An unrecognised element was ignored: " + element.getName());
- return new ReadResult(list(), list(warning));
+ return ReadResult.emptyWithWarning(warning);
}
}
@@ -141,7 +144,7 @@ public class BodyXmlReader {
return ReadResult.map(
readParagraphStyle(properties),
readElements(element.children()),
- (style, children) -> new Paragraph(style, numbering, children));
+ (style, children) -> new Paragraph(style, numbering, children)).appendExtra();
}
private Result<Optional<Style>> readParagraphStyle(XmlElementLike properties) {
@@ -188,7 +191,7 @@ public class BodyXmlReader {
if (breakType.equals("")) {
return success(LineBreak.LINE_BREAK);
} else {
- return new ReadResult(list(), list(warning("Unsupported break type: " + breakType)));
+ return ReadResult.emptyWithWarning(warning("Unsupported break type: " + breakType));
}
}
@@ -221,6 +224,10 @@ public class BodyXmlReader {
return success(new NoteReference(noteType, noteId));
}
+ private ReadResult readPict(XmlElement element) {
+ return readElements(element.children()).toExtra();
+ }
+
private Optional<String> readVal(XmlElementLike element, String name) {
return element.findChildOrEmpty(name).getAttributeOrNone("w:val");
}
diff --git a/src/main/java/org/zwobble/mammoth/docx/ReadResult.java b/src/main/java/org/zwobble/mammoth/docx/ReadResult.java
index 7c672b2..31bbf2a 100644
--- a/src/main/java/org/zwobble/mammoth/docx/ReadResult.java
+++ b/src/main/java/org/zwobble/mammoth/docx/ReadResult.java
@@ -16,12 +16,14 @@ public class ReadResult {
public static ReadResult concat(Iterable<ReadResult> results) {
ImmutableList.Builder<DocumentElement> elements = ImmutableList.builder();
+ ImmutableList.Builder<DocumentElement> extra = ImmutableList.builder();
ImmutableList.Builder<Warning> warnings = ImmutableList.builder();
for (ReadResult result : results) {
elements.addAll(result.elements);
+ extra.addAll(result.extra);
warnings.addAll(result.warnings);
}
- return new ReadResult(elements.build(), warnings.build());
+ return new ReadResult(elements.build(), extra.build(), warnings.build());
}
public static <T> ReadResult map(
@@ -29,13 +31,10 @@ public class ReadResult {
ReadResult second,
BiFunction<T, List<DocumentElement>, DocumentElement> function)
{
- ImmutableList.Builder<Warning> warnings = ImmutableList.builder();
- warnings.addAll(first.getWarnings());
- warnings.addAll(second.warnings);
-
return new ReadResult(
list(function.apply(first.getValue(), second.elements)),
- warnings.build());
+ second.extra,
+ concat(first.getWarnings(), second.warnings));
}
public static ReadResult success(DocumentElement element) {
@@ -43,22 +42,46 @@ public class ReadResult {
}
public static ReadResult success(List<DocumentElement> elements) {
- return new ReadResult(elements, list());
+ return new ReadResult(elements, list(), list());
+ }
+
+ public static ReadResult emptyWithWarning(Warning warning) {
+ return new ReadResult(list(), list(), list(warning));
}
private final List<DocumentElement> elements;
+ private final List<DocumentElement> extra;
private final List<Warning> warnings;
- public ReadResult(List<DocumentElement> elements, List<Warning> warnings) {
+ public ReadResult(List<DocumentElement> elements, List<DocumentElement> extra, List<Warning> warnings) {
this.elements = elements;
+ this.extra = extra;
this.warnings = warnings;
}
public ReadResult map(Function<List<DocumentElement>, DocumentElement> function) {
- return new ReadResult(list(function.apply(elements)), warnings);
+ return new ReadResult(
+ list(function.apply(elements)),
+ extra,
+ warnings);
+ }
+
+ public ReadResult toExtra() {
+ return new ReadResult(list(), concat(extra, elements), warnings);
+ }
+
+ public ReadResult appendExtra() {
+ return new ReadResult(concat(elements, extra), list(), warnings);
}
public Result<List<DocumentElement>> toResult() {
return new Result<>(elements, warnings);
}
+
+ private static <T> List<T> concat(List<T> first, List<T> second) {
+ ImmutableList.Builder<T> builder = ImmutableList.builder();
+ builder.addAll(first);
+ builder.addAll(second);
+ return builder.build();
+ }
}
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 d4fa358..c8f8887 100644
--- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java
@@ -354,13 +354,40 @@ public class BodyXmlTests {
}
@Test
+ public void textBoxesHaveContentAppendedAfterContainingParagraph() {
+ XmlElement textBox = element("w:pict", list(
+ element("v:shape", list(
+ element("v:textbox", list(
+ element("w:txbxContent", list(
+ paragraphXml(list(
+ runXml(list(textXml("[textbox-content]")))))))))))));
+ XmlElement paragraph = paragraphXml(list(
+ runXml(list(textXml("[paragragh start]"))),
+ runXml(list(textBox, textXml("[paragragh end]")))));
+
+ List<DocumentElement> expected = list(
+ make(a(PARAGRAPH, with(CHILDREN, list(
+ make(a(RUN, with(CHILDREN, list(
+ new Text("[paragragh start]"))))),
+ make(a(RUN, with(CHILDREN, list(
+ new Text("[paragragh end]"))))))))),
+ make(a(PARAGRAPH, with(CHILDREN, list(
+ make(a(RUN, with(CHILDREN, list(
+ new Text("[textbox-content]"))))))))));
+
+ assertThat(
+ readAll(a(bodyReader), paragraph),
+ isResult(deepEquals(expected), list()));
+ }
+
+ @Test
public void appropriateElementsHaveTheirChildrenReadNormally() {
assertChildrenAreReadNormally("w:ins");
assertChildrenAreReadNormally("w:smartTag");
assertChildrenAreReadNormally("w:drawing");
- assertChildrenAreReadNormally("w:roundrect");
- assertChildrenAreReadNormally("w:shape");
- assertChildrenAreReadNormally("w:textbox");
+ assertChildrenAreReadNormally("v:roundrect");
+ assertChildrenAreReadNormally("v:shape");
+ assertChildrenAreReadNormally("v:textbox");
assertChildrenAreReadNormally("w:txbxContent");
}