From 5c8c5d57d37f4411630828e3c658bb23e10e207b Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 14 Feb 2016 10:55:30 +0000 Subject: Generate HTML using HTML AST --- src/main/java/org/zwobble/mammoth/Mammoth.java | 58 ++++++++++++---------- src/main/java/org/zwobble/mammoth/html/Html.java | 19 +++++++ .../org/zwobble/mammoth/html/HtmlElementNode.java | 28 +++++++++++ .../java/org/zwobble/mammoth/html/HtmlNode.java | 5 ++ .../org/zwobble/mammoth/html/HtmlTextNode.java | 14 ++++++ .../org/zwobble/mammoth/util/MammothLists.java | 6 +++ 6 files changed, 105 insertions(+), 25 deletions(-) create mode 100644 src/main/java/org/zwobble/mammoth/html/Html.java create mode 100644 src/main/java/org/zwobble/mammoth/html/HtmlElementNode.java create mode 100644 src/main/java/org/zwobble/mammoth/html/HtmlNode.java create mode 100644 src/main/java/org/zwobble/mammoth/html/HtmlTextNode.java (limited to 'src/main') diff --git a/src/main/java/org/zwobble/mammoth/Mammoth.java b/src/main/java/org/zwobble/mammoth/Mammoth.java index 63a313f..40f2a6e 100644 --- a/src/main/java/org/zwobble/mammoth/Mammoth.java +++ b/src/main/java/org/zwobble/mammoth/Mammoth.java @@ -1,17 +1,20 @@ package org.zwobble.mammoth; -import com.google.common.base.Joiner; import org.zwobble.mammoth.documents.*; import org.zwobble.mammoth.docx.*; +import org.zwobble.mammoth.html.Html; +import org.zwobble.mammoth.html.HtmlNode; import org.zwobble.mammoth.results.Result; import org.zwobble.mammoth.xml.XmlElement; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.List; import java.util.zip.ZipFile; -import static com.google.common.collect.Iterables.transform; +import static org.zwobble.mammoth.util.MammothLists.eagerFlatMap; +import static org.zwobble.mammoth.util.MammothLists.list; public class Mammoth { public static Result convertToHtml(File file) { @@ -36,86 +39,91 @@ public class Mammoth { zipFile, fileReader)); return reader.readElement(documentXml) - .map(Mammoth::convertToHtml); + .map(Mammoth::convertToHtml) + .map(Html::write); } catch (IOException e) { throw new UnsupportedOperationException("Should return a result of failure"); } } - private static String convertToHtml(Document document) { + private static List convertToHtml(Document document) { return convertChildrenToHtml(document); } - private static String convertChildrenToHtml(HasChildren element) { - return Joiner.on("").join(transform( + private static List convertChildrenToHtml(HasChildren element) { + return eagerFlatMap( element.getChildren(), - Mammoth::convertToHtml)); + Mammoth::convertToHtml); } - private static String convertToHtml(DocumentElement element) { - return element.accept(new DocumentElementVisitor() { + private static List convertToHtml(DocumentElement element) { + return element.accept(new DocumentElementVisitor>() { @Override - public String visit(Paragraph paragraph) { - String content = convertChildrenToHtml(paragraph); + public List visit(Paragraph paragraph) { + List content = convertChildrenToHtml(paragraph); if (content.isEmpty()) { - return ""; + return list(); } else { - return "

" + content + "

"; + return list(Html.element("p", content)); } } @Override - public String visit(Run run) { + public List visit(Run run) { return convertChildrenToHtml(run); } @Override - public String visit(Text text) { - return text.getValue(); + public List visit(Text text) { + if (text.getValue().isEmpty()) { + return list(); + } else { + return list(Html.text(text.getValue())); + } } @Override - public String visit(Tab tab) { + public List visit(Tab tab) { throw new UnsupportedOperationException(); } @Override - public String visit(LineBreak lineBreak) { + public List visit(LineBreak lineBreak) { throw new UnsupportedOperationException(); } @Override - public String visit(Table table) { + public List visit(Table table) { throw new UnsupportedOperationException(); } @Override - public String visit(TableRow tableRow) { + public List visit(TableRow tableRow) { throw new UnsupportedOperationException(); } @Override - public String visit(TableCell tableCell) { + public List visit(TableCell tableCell) { throw new UnsupportedOperationException(); } @Override - public String visit(Hyperlink hyperlink) { + public List visit(Hyperlink hyperlink) { throw new UnsupportedOperationException(); } @Override - public String visit(Bookmark bookmark) { + public List visit(Bookmark bookmark) { throw new UnsupportedOperationException(); } @Override - public String visit(NoteReference noteReference) { + public List visit(NoteReference noteReference) { throw new UnsupportedOperationException(); } @Override - public String visit(Image image) { + public List visit(Image image) { throw new UnsupportedOperationException(); } }); diff --git a/src/main/java/org/zwobble/mammoth/html/Html.java b/src/main/java/org/zwobble/mammoth/html/Html.java new file mode 100644 index 0000000..9b6ccbb --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/html/Html.java @@ -0,0 +1,19 @@ +package org.zwobble.mammoth.html; + +import java.util.List; + +public class Html { + public static String write(List nodes) { + StringBuilder builder = new StringBuilder(); + nodes.forEach(node -> node.write(builder)); + return builder.toString(); + } + + public static HtmlNode text(String value) { + return new HtmlTextNode(value); + } + + public static HtmlNode element(String tagName, List children) { + return new HtmlElementNode(tagName, children); + } +} diff --git a/src/main/java/org/zwobble/mammoth/html/HtmlElementNode.java b/src/main/java/org/zwobble/mammoth/html/HtmlElementNode.java new file mode 100644 index 0000000..34de63e --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/html/HtmlElementNode.java @@ -0,0 +1,28 @@ +package org.zwobble.mammoth.html; + +import java.util.List; + +public class HtmlElementNode implements HtmlNode { + private final String tagName; + private final List children; + + public HtmlElementNode(String tagName, List children) { + this.tagName = tagName; + this.children = children; + } + + @Override + public void write(StringBuilder builder) { + builder + .append("<") + .append(tagName) + .append(">"); + + children.forEach(node -> node.write(builder)); + + builder + .append(""); + } +} diff --git a/src/main/java/org/zwobble/mammoth/html/HtmlNode.java b/src/main/java/org/zwobble/mammoth/html/HtmlNode.java new file mode 100644 index 0000000..9977c66 --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/html/HtmlNode.java @@ -0,0 +1,5 @@ +package org.zwobble.mammoth.html; + +public interface HtmlNode { + void write(StringBuilder builder); +} diff --git a/src/main/java/org/zwobble/mammoth/html/HtmlTextNode.java b/src/main/java/org/zwobble/mammoth/html/HtmlTextNode.java new file mode 100644 index 0000000..2c3a7c2 --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/html/HtmlTextNode.java @@ -0,0 +1,14 @@ +package org.zwobble.mammoth.html; + +public class HtmlTextNode implements HtmlNode { + private final String value; + + public HtmlTextNode(String value) { + this.value = value; + } + + @Override + public void write(StringBuilder builder) { + builder.append(value); + } +} diff --git a/src/main/java/org/zwobble/mammoth/util/MammothLists.java b/src/main/java/org/zwobble/mammoth/util/MammothLists.java index e038ec7..59f23f8 100644 --- a/src/main/java/org/zwobble/mammoth/util/MammothLists.java +++ b/src/main/java/org/zwobble/mammoth/util/MammothLists.java @@ -1,6 +1,8 @@ package org.zwobble.mammoth.util; +import com.google.common.base.Function; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; import java.util.List; @@ -16,4 +18,8 @@ public class MammothLists { public static List list(T value1, T value2) { return ImmutableList.of(value1, value2); } + + public static List eagerFlatMap(Iterable iterable, Function> function) { + return ImmutableList.copyOf(Iterables.concat(Iterables.transform(iterable, function))); + } } -- cgit v1.2.3