aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-13 19:48:59 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-13 19:48:59 +0000
commitf63e7014a68c90160da89a25db613381edbc6e5e (patch)
treed4e18df804a6dc5e42a9c65d7d2d0940abef4d0e /src/main/java/org
parent7864626f385e23272bf307474ceaebe281b4ed28 (diff)
Read hyperlinks with href
Diffstat (limited to 'src/main/java/org')
-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
5 files changed, 61 insertions, 2 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) {