aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/mammoth/Mammoth.java5
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/Bookmark.java14
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/DocumentElementVisitor.java1
-rw-r--r--src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java18
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java23
5 files changed, 57 insertions, 4 deletions
diff --git a/src/main/java/org/zwobble/mammoth/Mammoth.java b/src/main/java/org/zwobble/mammoth/Mammoth.java
index caf668f..9991266 100644
--- a/src/main/java/org/zwobble/mammoth/Mammoth.java
+++ b/src/main/java/org/zwobble/mammoth/Mammoth.java
@@ -89,6 +89,11 @@ public class Mammoth {
public String visit(Hyperlink hyperlink) {
throw new UnsupportedOperationException();
}
+
+ @Override
+ public String visit(Bookmark bookmark) {
+ throw new UnsupportedOperationException();
+ }
});
}
}
diff --git a/src/main/java/org/zwobble/mammoth/documents/Bookmark.java b/src/main/java/org/zwobble/mammoth/documents/Bookmark.java
new file mode 100644
index 0000000..598e83a
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/documents/Bookmark.java
@@ -0,0 +1,14 @@
+package org.zwobble.mammoth.documents;
+
+public class Bookmark implements DocumentElement {
+ private final String name;
+
+ public Bookmark(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public <T> T accept(DocumentElementVisitor<T> visitor) {
+ return visitor.visit(this);
+ }
+}
diff --git a/src/main/java/org/zwobble/mammoth/documents/DocumentElementVisitor.java b/src/main/java/org/zwobble/mammoth/documents/DocumentElementVisitor.java
index 564bacb..84fccc2 100644
--- a/src/main/java/org/zwobble/mammoth/documents/DocumentElementVisitor.java
+++ b/src/main/java/org/zwobble/mammoth/documents/DocumentElementVisitor.java
@@ -12,4 +12,5 @@ public interface DocumentElementVisitor<T> {
T visit(TableCell tableCell);
T visit(Hyperlink hyperlink);
+ T visit(Bookmark bookmark);
}
diff --git a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java
index e283a9c..fd32aae 100644
--- a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java
+++ b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java
@@ -47,6 +47,12 @@ public class BodyXmlReader {
case "w:tc":
return readElements(element.children()).map(TableCell::new);
+ case "w:hyperlink":
+ return readHyperlink(element);
+
+ case "w:bookmarkStart":
+ return readBookmark(element);
+
case "w:ins":
case "w:smartTag":
case "w:drawing":
@@ -56,9 +62,6 @@ public class BodyXmlReader {
case "w:txbxContent":
return readElements(element.children());
- case "w:hyperlink":
- return readHyperlink(element);
-
case "w:pPr":
return EMPTY_SUCCESS;
@@ -172,6 +175,15 @@ public class BodyXmlReader {
}
}
+ private ReadResult readBookmark(XmlElement element) {
+ String name = element.getAttribute("w:name");
+ if (name.equals("_GoBack")) {
+ return ReadResult.EMPTY_SUCCESS;
+ } else {
+ return success(new Bookmark(name));
+ }
+ }
+
private Optional<String> readVal(XmlElementLike element, String name) {
return element.findChildOrEmpty(name).getAttributeOrNone("w:val");
}
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 ed028fe..7111814 100644
--- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java
@@ -320,6 +320,22 @@ public class BodyXmlTests {
deepEquals(make(a(RUN))));
}
+ @Test
+ public void goBackBookmarkIsIgnored() {
+ XmlElement element = element("w:bookmarkStart", map("w:name", "_GoBack"));
+ assertThat(
+ readAll(a(bodyReader), element),
+ isResult(equalTo(list()), list()));
+ }
+
+ @Test
+ public void bookmarkStartIsReadIfNameIsNotGoBack() {
+ XmlElement element = element("w:bookmarkStart", map("w:name", "start"));
+ assertThat(
+ readSuccess(a(bodyReader), element),
+ deepEquals(new Bookmark("start")));
+ }
+
private static DocumentElement readSuccess(Maker<BodyXmlReader> reader, XmlElement element) {
Result<DocumentElement> result = read(reader, element);
assertThat(result.getWarnings(), deepEquals(list()));
@@ -327,10 +343,15 @@ public class BodyXmlTests {
}
private static Result<DocumentElement> read(Maker<BodyXmlReader> reader, XmlElement element) {
- return reader.make().readElement(element).toResult()
+ // TODO: check exactly 1 element
+ return readAll(reader, element)
.map(elements -> elements.get(0));
}
+ private static Result<List<DocumentElement>> readAll(Maker<BodyXmlReader> reader, XmlElement element) {
+ return reader.make().readElement(element).toResult();
+ }
+
private XmlElement paragraphXml() {
return paragraphXml(list());
}