aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/documents/Hyperlink.java16
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java13
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java10
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java25
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java31
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/DocumentMatchers.java16
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)));
+ }
}