From 13a08b04b74065a2e2ba8e9b0beb3882d03735ca Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 13 Feb 2016 20:59:34 +0000 Subject: Read bookmarks --- src/main/java/org/zwobble/mammoth/Mammoth.java | 5 +++++ .../org/zwobble/mammoth/documents/Bookmark.java | 14 +++++++++++++ .../mammoth/documents/DocumentElementVisitor.java | 1 + .../org/zwobble/mammoth/docx/BodyXmlReader.java | 18 ++++++++++++++--- .../zwobble/mammoth/tests/docx/BodyXmlTests.java | 23 +++++++++++++++++++++- 5 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/zwobble/mammoth/documents/Bookmark.java (limited to 'src') 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 accept(DocumentElementVisitor 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 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 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 reader, XmlElement element) { Result result = read(reader, element); assertThat(result.getWarnings(), deepEquals(list())); @@ -327,10 +343,15 @@ public class BodyXmlTests { } private static Result read(Maker 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> readAll(Maker reader, XmlElement element) { + return reader.make().readElement(element).toResult(); + } + private XmlElement paragraphXml() { return paragraphXml(list()); } -- cgit v1.2.3