diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-02-14 11:47:36 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-02-14 11:47:36 +0000 |
| commit | f57601b2426656a014d099ec66828e9f40732492 (patch) | |
| tree | a155b1c56fa97388956730802aeccf1249a8db74 | |
| parent | 622c04d788615dc79665203ea9a61e57e1935c49 (diff) | |
Convert hyperlink with internal anchor to HTML
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"); } } |
