aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-14 11:47:36 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-14 11:47:36 +0000
commitf57601b2426656a014d099ec66828e9f40732492 (patch)
treea155b1c56fa97388956730802aeccf1249a8db74 /src
parent622c04d788615dc79665203ea9a61e57e1935c49 (diff)
Convert hyperlink with internal anchor to HTML
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/DocumentConverter.java26
-rw-r--r--src/main/java/org/zwobble/mammoth/Mammoth.java4
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java15
3 files changed, 37 insertions, 8 deletions
diff --git a/src/main/java/org/zwobble/mammoth/DocumentConverter.java b/src/main/java/org/zwobble/mammoth/DocumentConverter.java
index e8d9059..49bc904 100644
--- a/src/main/java/org/zwobble/mammoth/DocumentConverter.java
+++ b/src/main/java/org/zwobble/mammoth/DocumentConverter.java
@@ -12,17 +12,23 @@ import static org.zwobble.mammoth.util.MammothLists.list;
import static org.zwobble.mammoth.util.MammothMaps.map;
public class DocumentConverter {
- public static List<HtmlNode> convertToHtml(Document document) {
+ private final String idPrefix;
+
+ public DocumentConverter(String idPrefix) {
+ this.idPrefix = idPrefix;
+ }
+
+ public List<HtmlNode> convertToHtml(Document document) {
return convertChildrenToHtml(document);
}
- private static List<HtmlNode> convertChildrenToHtml(HasChildren element) {
+ private List<HtmlNode> convertChildrenToHtml(HasChildren element) {
return eagerFlatMap(
element.getChildren(),
- DocumentConverter::convertToHtml);
+ this::convertToHtml);
}
- public static List<HtmlNode> convertToHtml(DocumentElement element) {
+ public List<HtmlNode> convertToHtml(DocumentElement element) {
return element.accept(new DocumentElementVisitor<List<HtmlNode>>() {
@Override
public List<HtmlNode> visit(Paragraph paragraph) {
@@ -91,10 +97,20 @@ public class DocumentConverter {
@Override
public List<HtmlNode> visit(Hyperlink hyperlink) {
- Map<String, String> attributes = map("href", hyperlink.getHref().get());
+ Map<String, String> attributes = map("href", generateHref(hyperlink));
return list(Html.element("a", attributes, convertChildrenToHtml(hyperlink)));
}
+ private String generateHref(Hyperlink hyperlink) {
+ if (hyperlink.getHref().isPresent()) {
+ return hyperlink.getHref().get();
+ } else if (hyperlink.getAnchor().isPresent()) {
+ return "#" + idPrefix + "-" + hyperlink.getAnchor().get();
+ } else {
+ return "";
+ }
+ }
+
@Override
public List<HtmlNode> visit(Bookmark bookmark) {
throw new UnsupportedOperationException();
diff --git a/src/main/java/org/zwobble/mammoth/Mammoth.java b/src/main/java/org/zwobble/mammoth/Mammoth.java
index 9da4c14..26db504 100644
--- a/src/main/java/org/zwobble/mammoth/Mammoth.java
+++ b/src/main/java/org/zwobble/mammoth/Mammoth.java
@@ -32,8 +32,10 @@ public class Mammoth {
contentTypes,
zipFile,
fileReader));
+ // TODO: prefix
+ String idPrefix = "document";
return reader.readElement(documentXml)
- .map(DocumentConverter::convertToHtml)
+ .map(nodes -> new DocumentConverter(idPrefix).convertToHtml(nodes))
.map(Html::write);
} catch (IOException e) {
throw new UnsupportedOperationException("Should return a result of failure");
diff --git a/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java b/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java
index db3087e..616d84f 100644
--- a/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java
@@ -33,7 +33,7 @@ public class DocumentConverterTests {
@Test
public void multipleParagraphsInDocumentAreConvertedToMultipleParagraphs() {
assertThat(
- DocumentConverter.convertToHtml(new Document(list(
+ documentConverter().convertToHtml(new Document(list(
make(a(PARAGRAPH, with(CHILDREN, list(runWithText("Hello"))))),
make(a(PARAGRAPH, with(CHILDREN, list(runWithText("there")))))))),
@@ -91,8 +91,19 @@ public class DocumentConverterTests {
deepEquals(list(Html.element("a", map("href", "http://example.com"), list(Html.text("Hello"))))));
}
+ @Test
+ public void hyperlinkWithInternalAnchorReferenceIsConvertedToAnchorTag() {
+ assertThat(
+ convertToHtml(Hyperlink.anchor("start", list(new Text("Hello")))),
+ deepEquals(list(Html.element("a", map("href", "#doc-42-start"), list(Html.text("Hello"))))));
+ }
+
private List<HtmlNode> convertToHtml(DocumentElement element) {
- return DocumentConverter.convertToHtml(element);
+ return documentConverter().convertToHtml(element);
+ }
+
+ private DocumentConverter documentConverter() {
+ return new DocumentConverter("doc-42");
}
}