diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-02-13 19:54:25 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-02-13 19:54:25 +0000 |
| commit | 1408289176bc54e01f141cdb1cbfd2df80747250 (patch) | |
| tree | 4c707099ac50a362cead4634b4fe49bbe848ebad /src | |
| parent | f63e7014a68c90160da89a25db613381edbc6e5e (diff) | |
Read hyperlinks with anchors
Diffstat (limited to 'src')
3 files changed, 32 insertions, 6 deletions
diff --git a/src/main/java/org/zwobble/mammoth/documents/Hyperlink.java b/src/main/java/org/zwobble/mammoth/documents/Hyperlink.java index 1d62076..9b2b920 100644 --- a/src/main/java/org/zwobble/mammoth/documents/Hyperlink.java +++ b/src/main/java/org/zwobble/mammoth/documents/Hyperlink.java @@ -5,14 +5,20 @@ import java.util.Optional; public class Hyperlink implements DocumentElement, HasChildren { public static Hyperlink href(String href, List<DocumentElement> children) { - return new Hyperlink(Optional.of(href), children); + return new Hyperlink(Optional.of(href), Optional.empty(), children); + } + + public static Hyperlink anchor(String anchor, List<DocumentElement> children) { + return new Hyperlink(Optional.empty(), Optional.of(anchor), children); } private final Optional<String> href; + private final Optional<String> anchor; private final List<DocumentElement> children; - public Hyperlink(Optional<String> href, List<DocumentElement> children) { + private Hyperlink(Optional<String> href, Optional<String> anchor, List<DocumentElement> children) { this.href = href; + this.anchor = anchor; this.children = children; } @@ -20,6 +26,10 @@ public class Hyperlink implements DocumentElement, HasChildren { return href; } + public Optional<String> getAnchor() { + return anchor; + } + @Override public List<DocumentElement> getChildren() { return children; diff --git a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java index 6b6fceb..dd0bf09 100644 --- a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java @@ -158,10 +158,18 @@ public class BodyXmlReader { } private ReadResult readHyperlink(XmlElement element) { - String relationshipId = element.getAttribute("r:id"); - return readElements(element.children()) - .map(children -> Hyperlink.href( - relationships.findRelationshipById(relationshipId).getTarget(), children)); + Optional<String> relationshipId = element.getAttributeOrNone("r:id"); + Optional<String> anchor = element.getAttributeOrNone("w:anchor"); + ReadResult childrenResult = readElements(element.children()); + if (relationshipId.isPresent()) { + return childrenResult.map(children -> Hyperlink.href( + relationships.findRelationshipById(relationshipId.get()).getTarget(), children)); + } else if (anchor.isPresent()) { + return childrenResult.map(children -> Hyperlink.anchor( + anchor.get(), children)); + } else { + return ReadResult.EMPTY_SUCCESS; + } } private Optional<String> readVal(XmlElementLike element, String name) { 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 40b58a3..4566e11 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -304,6 +304,14 @@ public class BodyXmlTests { deepEquals(Hyperlink.href("http://example.com", list(make(a(RUN)))))); } + @Test + public void hyperlinkIsReadIfItHasAnAnchorAttribute() { + XmlElement element = element("w:hyperlink", map("w:anchor", "start"), list(runXml(list()))); + assertThat( + readSuccess(a(bodyReader), element), + deepEquals(Hyperlink.anchor("start", list(make(a(RUN)))))); + } + private static DocumentElement readSuccess(Maker<BodyXmlReader> reader, XmlElement element) { Result<DocumentElement> result = read(reader, element); assertThat(result.getWarnings(), deepEquals(list())); |
