diff options
Diffstat (limited to 'src')
6 files changed, 96 insertions, 15 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/documents/Hyperlink.java b/src/main/java/org/zwobble/mammoth/internal/documents/Hyperlink.java index f78b7fe..c3fe794 100644 --- a/src/main/java/org/zwobble/mammoth/internal/documents/Hyperlink.java +++ b/src/main/java/org/zwobble/mammoth/internal/documents/Hyperlink.java @@ -4,21 +4,23 @@ import java.util.List; 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), Optional.empty(), children); + public static Hyperlink href(String href, Optional<String> targetFrame, List<DocumentElement> children) { + return new Hyperlink(Optional.of(href), Optional.empty(), targetFrame, children); } - public static Hyperlink anchor(String anchor, List<DocumentElement> children) { - return new Hyperlink(Optional.empty(), Optional.of(anchor), children); + public static Hyperlink anchor(String anchor, Optional<String> targetFrame, List<DocumentElement> children) { + return new Hyperlink(Optional.empty(), Optional.of(anchor), targetFrame, children); } private final Optional<String> href; private final Optional<String> anchor; + private final Optional<String> targetFrame; private final List<DocumentElement> children; - private Hyperlink(Optional<String> href, Optional<String> anchor, List<DocumentElement> children) { + public Hyperlink(Optional<String> href, Optional<String> anchor, Optional<String> targetFrame, List<DocumentElement> children) { this.href = href; this.anchor = anchor; + this.targetFrame = targetFrame; this.children = children; } @@ -30,6 +32,10 @@ public class Hyperlink implements DocumentElement, HasChildren { return anchor; } + public Optional<String> getTargetFrame() { + return targetFrame; + } + @Override public List<DocumentElement> getChildren() { return children; 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 f4eda9e..b72ff29 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java @@ -168,7 +168,7 @@ class StatefulBodyXmlReader { (style, children) -> { Optional<String> hyperlinkHref = currentHyperlinkHref(); if (hyperlinkHref.isPresent()) { - children = list(Hyperlink.href(hyperlinkHref.get(), children)); + children = list(Hyperlink.href(hyperlinkHref.get(), Optional.empty(), children)); } return new Run( @@ -442,15 +442,20 @@ class StatefulBodyXmlReader { private ReadResult readHyperlink(XmlElement element) { Optional<String> relationshipId = element.getAttributeOrNone("r:id"); Optional<String> anchor = element.getAttributeOrNone("w:anchor"); + Optional<String> targetFrame = element.getAttributeOrNone("w:tgtFrame"); ReadResult childrenResult = readElements(element.getChildren()); + if (relationshipId.isPresent()) { 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)); + return childrenResult.map(children -> + Hyperlink.href(href, targetFrame, children) + ); } else if (anchor.isPresent()) { - return childrenResult.map(children -> Hyperlink.anchor( - anchor.get(), children)); + return childrenResult.map(children -> + Hyperlink.anchor(anchor.get(), targetFrame, children) + ); } else { return childrenResult; } diff --git a/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java b/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java index 3c4af09..e3698a4 100644 --- a/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java @@ -315,14 +315,20 @@ public class DocumentToHtmlTests { @Test public void hyperlinkWithHrefIsConvertedToAnchorTag() { assertThat( - convertToHtml(Hyperlink.href("http://example.com", list(new Text("Hello")))), + convertToHtml(hyperlink( + withHref("http://example.com"), + withChildren(new Text("Hello")) + )), deepEquals(list(Html.collapsibleElement("a", map("href", "http://example.com"), list(Html.text("Hello")))))); } @Test public void hyperlinkWithInternalAnchorReferenceIsConvertedToAnchorTag() { assertThat( - convertToHtml(Hyperlink.anchor("start", list(new Text("Hello")))), + convertToHtml(hyperlink( + withAnchor("start"), + withChildren(new Text("Hello")) + )), deepEquals(list(Html.collapsibleElement("a", map("href", "#doc-42-start"), list(Html.text("Hello")))))); } diff --git a/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java b/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java index a3595ae..ea53458 100644 --- a/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java +++ b/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java @@ -25,6 +25,9 @@ public class DocumentElementMakers { private static final ArgumentKey<Integer> COLSPAN = new ArgumentKey<>("colspan"); private static final ArgumentKey<Integer> ROWSPAN = new ArgumentKey<>("rowspan"); private static final ArgumentKey<List<Comment>> COMMENTS = new ArgumentKey<>("comments"); + private static final ArgumentKey<Optional<String>> HREF = new ArgumentKey<>("href"); + private static final ArgumentKey<Optional<String>> ANCHOR = new ArgumentKey<>("anchor"); + private static final ArgumentKey<Optional<String>> TARGET_FRAME = new ArgumentKey<>("targetFrame"); public static Argument<Optional<Style>> withStyle(Style style) { return arg(STYLE, Optional.of(style)); @@ -130,4 +133,26 @@ public class DocumentElementMakers { public static Comment comment(String commentId, List<DocumentElement> body) { return new Comment(commentId, body, Optional.empty(), Optional.empty()); } + + public static Hyperlink hyperlink(Object... args) { + Arguments arguments = new Arguments(args); + return new Hyperlink( + arguments.get(HREF, Optional.empty()), + arguments.get(ANCHOR, Optional.empty()), + arguments.get(TARGET_FRAME, Optional.empty()), + arguments.get(CHILDREN, list()) + ); + } + + public static Argument<Optional<String>> withHref(String href) { + return arg(HREF, Optional.of(href)); + } + + public static Argument<Optional<String>> withAnchor(String anchor) { + return arg(ANCHOR, Optional.of(anchor)); + } + + public static Argument<Optional<String>> withTargetFrame(String targetFrame) { + return arg(TARGET_FRAME, Optional.of(targetFrame)); + } } 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 e363983..1ba96d1 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -755,7 +755,12 @@ public class BodyXmlTests { XmlElement element = element("w:hyperlink", map("r:id", "r42"), list(runXml(list()))); assertThat( readSuccess(bodyReader(relationships), element), - deepEquals(Hyperlink.href("http://example.com", list(run(withChildren()))))); + isHyperlink( + hasHref("http://example.com"), + hasBlankAnchor(), + hasChildren(isRun(hasChildren())) + ) + ); } @Test @@ -766,7 +771,8 @@ public class BodyXmlTests { 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()))))); + isHyperlink(hasHref("http://example.com/#fragment")) + ); } @Test @@ -777,7 +783,8 @@ public class BodyXmlTests { 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()))))); + isHyperlink(hasHref("http://example.com/#fragment")) + ); } @Test @@ -785,7 +792,11 @@ public class BodyXmlTests { XmlElement element = element("w:hyperlink", map("w:anchor", "start"), list(runXml(list()))); assertThat( readSuccess(bodyReader(), element), - deepEquals(Hyperlink.anchor("start", list(run(withChildren()))))); + isHyperlink( + hasAnchor("start"), + hasBlankHref() + ) + ); } @Test @@ -797,6 +808,18 @@ public class BodyXmlTests { } @Test + public void hyperlinkTargetFrameIsRead() { + XmlElement element = element("w:hyperlink", map( + "w:anchor", "start", + "w:tgtFrame", "_blank" + )); + assertThat( + readSuccess(bodyReader(), element), + isHyperlink(hasTargetFrame("_blank")) + ); + } + + @Test public void goBackBookmarkIsIgnored() { XmlElement element = element("w:bookmarkStart", map("w:name", "_GoBack")); assertThat( diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/DocumentMatchers.java b/src/test/java/org/zwobble/mammoth/tests/docx/DocumentMatchers.java index 8ecb902..d0a1fe6 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/DocumentMatchers.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/DocumentMatchers.java @@ -90,4 +90,20 @@ public class DocumentMatchers { static Matcher<Hyperlink> hasHref(String href) { return hasProperty("href", equalTo(Optional.of(href))); } + + static Matcher<Hyperlink> hasBlankHref() { + return hasProperty("href", equalTo(Optional.empty())); + } + + static Matcher<Hyperlink> hasAnchor(String anchor) { + return hasProperty("anchor", equalTo(Optional.of(anchor))); + } + + static Matcher<Hyperlink> hasBlankAnchor() { + return hasProperty("anchor", equalTo(Optional.empty())); + } + + static Matcher<Hyperlink> hasTargetFrame(String targetFrame) { + return hasProperty("targetFrame", equalTo(Optional.of(targetFrame))); + } } |
