aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/mammoth/Mammoth.java11
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/DocumentElementVisitor.java2
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/Hyperlink.java32
-rw-r--r--src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java14
-rw-r--r--src/main/java/org/zwobble/mammoth/docx/Relationships.java4
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlReaderMakers.java5
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java14
7 files changed, 76 insertions, 6 deletions
diff --git a/src/main/java/org/zwobble/mammoth/Mammoth.java b/src/main/java/org/zwobble/mammoth/Mammoth.java
index 4e69a6b..caf668f 100644
--- a/src/main/java/org/zwobble/mammoth/Mammoth.java
+++ b/src/main/java/org/zwobble/mammoth/Mammoth.java
@@ -21,7 +21,11 @@ public class Mammoth {
Styles styles = Styles.EMPTY;
Numbering numbering = Numbering.EMPTY;
- DocumentXmlReader reader = new DocumentXmlReader(new BodyXmlReader(styles, numbering));
+ Relationships relationships = Relationships.EMPTY;
+ DocumentXmlReader reader = new DocumentXmlReader(new BodyXmlReader(
+ styles,
+ numbering,
+ relationships));
return reader.readElement(documentXml)
.map(Mammoth::convertToHtml);
} catch (IOException e) {
@@ -80,6 +84,11 @@ public class Mammoth {
public String visit(TableCell tableCell) {
throw new UnsupportedOperationException();
}
+
+ @Override
+ public String visit(Hyperlink hyperlink) {
+ throw new UnsupportedOperationException();
+ }
});
}
}
diff --git a/src/main/java/org/zwobble/mammoth/documents/DocumentElementVisitor.java b/src/main/java/org/zwobble/mammoth/documents/DocumentElementVisitor.java
index 0781960..564bacb 100644
--- a/src/main/java/org/zwobble/mammoth/documents/DocumentElementVisitor.java
+++ b/src/main/java/org/zwobble/mammoth/documents/DocumentElementVisitor.java
@@ -10,4 +10,6 @@ public interface DocumentElementVisitor<T> {
T visit(Table table);
T visit(TableRow tableRow);
T visit(TableCell tableCell);
+
+ T visit(Hyperlink hyperlink);
}
diff --git a/src/main/java/org/zwobble/mammoth/documents/Hyperlink.java b/src/main/java/org/zwobble/mammoth/documents/Hyperlink.java
new file mode 100644
index 0000000..1d62076
--- /dev/null
+++ b/src/main/java/org/zwobble/mammoth/documents/Hyperlink.java
@@ -0,0 +1,32 @@
+package org.zwobble.mammoth.documents;
+
+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), children);
+ }
+
+ private final Optional<String> href;
+ private final List<DocumentElement> children;
+
+ public Hyperlink(Optional<String> href, List<DocumentElement> children) {
+ this.href = href;
+ this.children = children;
+ }
+
+ public Optional<String> getHref() {
+ return href;
+ }
+
+ @Override
+ public List<DocumentElement> getChildren() {
+ return children;
+ }
+
+ @Override
+ public <T> T accept(DocumentElementVisitor<T> visitor) {
+ return visitor.visit(this);
+ }
+}
diff --git a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java
index dcef0c5..6b6fceb 100644
--- a/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java
+++ b/src/main/java/org/zwobble/mammoth/docx/BodyXmlReader.java
@@ -20,10 +20,12 @@ import static org.zwobble.mammoth.util.MammothLists.list;
public class BodyXmlReader {
private final Styles styles;
private final Numbering numbering;
+ private final Relationships relationships;
- public BodyXmlReader(Styles styles, Numbering numbering) {
+ public BodyXmlReader(Styles styles, Numbering numbering, Relationships relationships) {
this.styles = styles;
this.numbering = numbering;
+ this.relationships = relationships;
}
public ReadResult readElement(XmlElement element) {
@@ -54,6 +56,9 @@ public class BodyXmlReader {
case "w:txbxContent":
return readElements(element.children());
+ case "w:hyperlink":
+ return readHyperlink(element);
+
case "w:pPr":
return EMPTY_SUCCESS;
@@ -152,6 +157,13 @@ public class BodyXmlReader {
numbering::findLevel);
}
+ private ReadResult readHyperlink(XmlElement element) {
+ String relationshipId = element.getAttribute("r:id");
+ return readElements(element.children())
+ .map(children -> Hyperlink.href(
+ relationships.findRelationshipById(relationshipId).getTarget(), children));
+ }
+
private Optional<String> readVal(XmlElementLike element, String name) {
return element.findChildOrEmpty(name).getAttributeOrNone("w:val");
}
diff --git a/src/main/java/org/zwobble/mammoth/docx/Relationships.java b/src/main/java/org/zwobble/mammoth/docx/Relationships.java
index d33a091..f23ed85 100644
--- a/src/main/java/org/zwobble/mammoth/docx/Relationships.java
+++ b/src/main/java/org/zwobble/mammoth/docx/Relationships.java
@@ -3,7 +3,11 @@ package org.zwobble.mammoth.docx;
import java.util.Map;
import java.util.Optional;
+import static org.zwobble.mammoth.util.MammothMaps.map;
+
public class Relationships {
+ public static final Relationships EMPTY = new Relationships(map());
+
private final Map<String, Relationship> relationships;
public Relationships(Map<String, Relationship> relationships) {
diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlReaderMakers.java b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlReaderMakers.java
index 9df21e9..5758dce 100644
--- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlReaderMakers.java
+++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlReaderMakers.java
@@ -4,6 +4,7 @@ import com.natpryce.makeiteasy.Instantiator;
import com.natpryce.makeiteasy.Property;
import org.zwobble.mammoth.docx.BodyXmlReader;
import org.zwobble.mammoth.docx.Numbering;
+import org.zwobble.mammoth.docx.Relationships;
import org.zwobble.mammoth.docx.Styles;
import static com.natpryce.makeiteasy.Property.newProperty;
@@ -11,9 +12,11 @@ import static com.natpryce.makeiteasy.Property.newProperty;
public class BodyXmlReaderMakers {
public static final Property<BodyXmlReader, Styles> STYLES = newProperty();
public static final Property<BodyXmlReader, Numbering> NUMBERING = newProperty();
+ public static final Property<BodyXmlReader, Relationships> RELATIONSHIPS = newProperty();
public static final Instantiator<BodyXmlReader> bodyReader =
propertyLookup -> new BodyXmlReader(
propertyLookup.valueOf(STYLES, Styles.EMPTY),
- propertyLookup.valueOf(NUMBERING, Numbering.EMPTY));
+ propertyLookup.valueOf(NUMBERING, Numbering.EMPTY),
+ propertyLookup.valueOf(RELATIONSHIPS, Relationships.EMPTY));
}
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 b1ce149..40b58a3 100644
--- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java
@@ -5,9 +5,7 @@ import org.hamcrest.Matcher;
import org.hamcrest.Matchers;
import org.junit.Test;
import org.zwobble.mammoth.documents.*;
-import org.zwobble.mammoth.docx.BodyXmlReader;
-import org.zwobble.mammoth.docx.Numbering;
-import org.zwobble.mammoth.docx.Styles;
+import org.zwobble.mammoth.docx.*;
import org.zwobble.mammoth.results.Result;
import org.zwobble.mammoth.results.Warning;
import org.zwobble.mammoth.tests.DeepReflectionMatcher;
@@ -296,6 +294,16 @@ public class BodyXmlTests {
deepEquals(make(a(PARAGRAPH))));
}
+ @Test
+ public void hyperlinkIsReadIfItHasARelationshipId() {
+ Relationships relationships = new Relationships(
+ map("r42", new Relationship("http://example.com")));
+ XmlElement element = element("w:hyperlink", map("r:id", "r42"), list(runXml(list())));
+ assertThat(
+ readSuccess(a(bodyReader, with(RELATIONSHIPS, relationships)), element),
+ deepEquals(Hyperlink.href("http://example.com", list(make(a(RUN))))));
+ }
+
private static DocumentElement readSuccess(Maker<BodyXmlReader> reader, XmlElement element) {
Result<DocumentElement> result = read(reader, element);
assertThat(result.getWarnings(), deepEquals(list()));