diff options
| author | Michael Williamson <mike@zwobble.org> | 2017-05-18 20:15:44 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2017-05-18 20:15:44 +0100 |
| commit | 62cdf68ff42c1887aac3c639226f878335a39a79 (patch) | |
| tree | 7208db83cb77ded7a87f44d1ba0edcee99931f2f | |
| parent | 81514169b8af735e7f2989f53f3b0920dd7833a3 (diff) | |
Add anchor on hyperlinks as fragment if present
4 files changed, 40 insertions, 4 deletions
@@ -1,3 +1,7 @@ +# 1.3.2 + +* Add anchor on hyperlinks as fragment if present. + # 1.3.1 * Read children of w:object elements. 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 2097822..f726a29 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java @@ -436,8 +436,10 @@ class StatefulBodyXmlReader { Optional<String> anchor = element.getAttributeOrNone("w:anchor"); ReadResult childrenResult = readElements(element.getChildren()); if (relationshipId.isPresent()) { - return childrenResult.map(children -> Hyperlink.href( - relationships.findRelationshipById(relationshipId.get()).getTarget(), children)); + String targetHref = relationships.findRelationshipById(relationshipId.get()).getTarget(); + String href = anchor.map(fragment -> Uris.replaceFragment(targetHref, anchor.get())) + .orElse(targetHref); + return childrenResult.map(children -> Hyperlink.href(href, children)); } else if (anchor.isPresent()) { return childrenResult.map(children -> Hyperlink.anchor( anchor.get(), children)); diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/Uris.java b/src/main/java/org/zwobble/mammoth/internal/docx/Uris.java index 51dab9c..35b1751 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/Uris.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/Uris.java @@ -11,4 +11,12 @@ public class Uris { return base + "/" + uri; } } + + public static String replaceFragment(String uri, String fragment) { + int hashIndex = uri.indexOf("#"); + if (hashIndex != -1) { + uri = uri.substring(0, hashIndex); + } + return uri + "#" + fragment; + } } 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 4a750a5..2eaa16f 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -729,7 +729,7 @@ public class BodyXmlTests { } @Test - public void hyperlinkIsReadIfItHasARelationshipId() { + public void hyperlinkIsReadAsExternalHyperlinkIfItHasARelationshipId() { Relationships relationships = new Relationships( map("r42", new Relationship("http://example.com"))); XmlElement element = element("w:hyperlink", map("r:id", "r42"), list(runXml(list()))); @@ -739,7 +739,29 @@ public class BodyXmlTests { } @Test - public void hyperlinkIsReadIfItHasAnAnchorAttribute() { + public void hyperlinkIsReadAsExternalHyperlinkIfItHasARelationshipIdAndAnAnchor() { + Relationships relationships = new Relationships( + map("r42", new Relationship("http://example.com/")) + ); + XmlElement element = element("w:hyperlink", map("r:id", "r42", "w:anchor", "fragment"), list(runXml(list()))); + assertThat( + readSuccess(bodyReader(relationships), element), + deepEquals(Hyperlink.href("http://example.com/#fragment", list(run(withChildren()))))); + } + + @Test + public void hyperlinkExistingFragmentIsReplacedWhenAnchorIsSetOnExternalLink() { + Relationships relationships = new Relationships( + map("r42", new Relationship("http://example.com/#previous")) + ); + XmlElement element = element("w:hyperlink", map("r:id", "r42", "w:anchor", "fragment"), list(runXml(list()))); + assertThat( + readSuccess(bodyReader(relationships), element), + deepEquals(Hyperlink.href("http://example.com/#fragment", list(run(withChildren()))))); + } + + @Test + public void hyperlinkIsReadAsInternalHyperlinkIfItHasAnAnchorAttribute() { XmlElement element = element("w:hyperlink", map("w:anchor", "start"), list(runXml(list()))); assertThat( readSuccess(bodyReader(), element), |
