From f57601b2426656a014d099ec66828e9f40732492 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 14 Feb 2016 11:47:36 +0000 Subject: Convert hyperlink with internal anchor to HTML --- .../org/zwobble/mammoth/DocumentConverter.java | 26 +++++++++++++++++----- src/main/java/org/zwobble/mammoth/Mammoth.java | 4 +++- .../mammoth/tests/DocumentConverterTests.java | 15 +++++++++++-- 3 files changed, 37 insertions(+), 8 deletions(-) (limited to 'src') 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 convertToHtml(Document document) { + private final String idPrefix; + + public DocumentConverter(String idPrefix) { + this.idPrefix = idPrefix; + } + + public List convertToHtml(Document document) { return convertChildrenToHtml(document); } - private static List convertChildrenToHtml(HasChildren element) { + private List convertChildrenToHtml(HasChildren element) { return eagerFlatMap( element.getChildren(), - DocumentConverter::convertToHtml); + this::convertToHtml); } - public static List convertToHtml(DocumentElement element) { + public List convertToHtml(DocumentElement element) { return element.accept(new DocumentElementVisitor>() { @Override public List visit(Paragraph paragraph) { @@ -91,10 +97,20 @@ public class DocumentConverter { @Override public List visit(Hyperlink hyperlink) { - Map attributes = map("href", hyperlink.getHref().get()); + Map 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 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 convertToHtml(DocumentElement element) { - return DocumentConverter.convertToHtml(element); + return documentConverter().convertToHtml(element); + } + + private DocumentConverter documentConverter() { + return new DocumentConverter("doc-42"); } } -- cgit v1.2.3