aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-14 19:31:02 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-14 19:31:02 +0000
commite5f70950620f2178fefe91f33a3401f831f32e7d (patch)
tree866e183e3ad9301ba374228e4e93d6b94fda5bf1 /src/main
parent6842d11812563845015ef1d028569f7ea0ba3ed4 (diff)
Strip empty nodes from output
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/zwobble/mammoth/DocumentConverter.java6
-rw-r--r--src/main/java/org/zwobble/mammoth/Mammoth.java1
-rw-r--r--src/main/java/org/zwobble/mammoth/html/Html.java43
-rw-r--r--src/main/java/org/zwobble/mammoth/html/HtmlElement.java9
-rw-r--r--src/main/java/org/zwobble/mammoth/html/HtmlForceWrite.java5
-rw-r--r--src/main/java/org/zwobble/mammoth/html/HtmlNode.java9
-rw-r--r--src/main/java/org/zwobble/mammoth/html/HtmlSelfClosingElement.java5
-rw-r--r--src/main/java/org/zwobble/mammoth/html/HtmlTextNode.java5
-rw-r--r--src/main/java/org/zwobble/mammoth/util/MammothLists.java4
9 files changed, 82 insertions, 5 deletions
diff --git a/src/main/java/org/zwobble/mammoth/DocumentConverter.java b/src/main/java/org/zwobble/mammoth/DocumentConverter.java
index 38455e3..a6029e0 100644
--- a/src/main/java/org/zwobble/mammoth/DocumentConverter.java
+++ b/src/main/java/org/zwobble/mammoth/DocumentConverter.java
@@ -81,11 +81,7 @@ public class DocumentConverter {
@Override
public List<HtmlNode> visit(Paragraph paragraph) {
List<HtmlNode> content = convertChildrenToHtml(paragraph);
- if (content.isEmpty()) {
- return list();
- } else {
- return list(Html.element("p", content));
- }
+ return list(Html.element("p", content));
}
@Override
diff --git a/src/main/java/org/zwobble/mammoth/Mammoth.java b/src/main/java/org/zwobble/mammoth/Mammoth.java
index 79e15f7..3f9eddb 100644
--- a/src/main/java/org/zwobble/mammoth/Mammoth.java
+++ b/src/main/java/org/zwobble/mammoth/Mammoth.java
@@ -34,6 +34,7 @@ public class Mammoth {
String idPrefix = "document";
return reader.readElement(documentXml)
.map(nodes -> DocumentConverter.convertToHtml(idPrefix, nodes))
+ .map(Html::stripEmpty)
.map(Html::write);
} catch (IOException e) {
throw new UnsupportedOperationException("Should return a result of failure");
diff --git a/src/main/java/org/zwobble/mammoth/html/Html.java b/src/main/java/org/zwobble/mammoth/html/Html.java
index 0a32e58..7e2a82e 100644
--- a/src/main/java/org/zwobble/mammoth/html/Html.java
+++ b/src/main/java/org/zwobble/mammoth/html/Html.java
@@ -1,5 +1,7 @@
package org.zwobble.mammoth.html;
+import org.zwobble.mammoth.util.MammothLists;
+
import java.util.List;
import java.util.Map;
@@ -50,4 +52,45 @@ public class Html {
public static HtmlNode selfClosingElement(String tagName, Map<String, String> attributes) {
return new HtmlSelfClosingElement(tagName, attributes);
}
+
+ public static List<HtmlNode> stripEmpty(List<HtmlNode> nodes) {
+ return MammothLists.eagerFlatMap(nodes, node -> stripEmpty(node));
+ }
+
+ private static List<HtmlNode> stripEmpty(HtmlNode node) {
+ return node.accept(new HtmlNode.Mapper<List<HtmlNode>>() {
+ @Override
+ public List<HtmlNode> visit(HtmlElement element) {
+ List<HtmlNode> children = stripEmpty(element.getChildren());
+ if (children.isEmpty()) {
+ return list();
+ } else {
+ return list(new HtmlElement(
+ element.getTagName(),
+ element.getAttributes(),
+ children,
+ element.isCollapsible()));
+ }
+ }
+
+ @Override
+ public List<HtmlNode> visit(HtmlSelfClosingElement element) {
+ return list(element);
+ }
+
+ @Override
+ public List<HtmlNode> visit(HtmlTextNode node) {
+ if (node.getValue().isEmpty()) {
+ return list();
+ } else {
+ return list(node);
+ }
+ }
+
+ @Override
+ public List<HtmlNode> visit(HtmlForceWrite forceWrite) {
+ return list(forceWrite);
+ }
+ });
+ }
}
diff --git a/src/main/java/org/zwobble/mammoth/html/HtmlElement.java b/src/main/java/org/zwobble/mammoth/html/HtmlElement.java
index 59683ba..cc81aa2 100644
--- a/src/main/java/org/zwobble/mammoth/html/HtmlElement.java
+++ b/src/main/java/org/zwobble/mammoth/html/HtmlElement.java
@@ -28,8 +28,17 @@ public class HtmlElement implements HtmlNode {
return children;
}
+ public boolean isCollapsible() {
+ return collapsible;
+ }
+
@Override
public void visit(Visitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public <T> T accept(Mapper<T> visitor) {
+ return visitor.visit(this);
+ }
}
diff --git a/src/main/java/org/zwobble/mammoth/html/HtmlForceWrite.java b/src/main/java/org/zwobble/mammoth/html/HtmlForceWrite.java
index 484be34..f704fd9 100644
--- a/src/main/java/org/zwobble/mammoth/html/HtmlForceWrite.java
+++ b/src/main/java/org/zwobble/mammoth/html/HtmlForceWrite.java
@@ -10,4 +10,9 @@ public class HtmlForceWrite implements HtmlNode {
public void visit(Visitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public <T> T accept(Mapper<T> visitor) {
+ return visitor.visit(this);
+ }
}
diff --git a/src/main/java/org/zwobble/mammoth/html/HtmlNode.java b/src/main/java/org/zwobble/mammoth/html/HtmlNode.java
index 823e362..6099519 100644
--- a/src/main/java/org/zwobble/mammoth/html/HtmlNode.java
+++ b/src/main/java/org/zwobble/mammoth/html/HtmlNode.java
@@ -1,7 +1,9 @@
package org.zwobble.mammoth.html;
public interface HtmlNode {
+ // TODO: rename visit to accept
void visit(Visitor visitor);
+ <T> T accept(Mapper<T> visitor);
interface Visitor {
void visit(HtmlElement element);
@@ -9,4 +11,11 @@ public interface HtmlNode {
void visit(HtmlTextNode node);
void visit(HtmlForceWrite forceWrite);
}
+
+ interface Mapper<T> {
+ T visit(HtmlElement element);
+ T visit(HtmlSelfClosingElement element);
+ T visit(HtmlTextNode node);
+ T visit(HtmlForceWrite forceWrite);
+ }
}
diff --git a/src/main/java/org/zwobble/mammoth/html/HtmlSelfClosingElement.java b/src/main/java/org/zwobble/mammoth/html/HtmlSelfClosingElement.java
index a1ddf2b..62bfd73 100644
--- a/src/main/java/org/zwobble/mammoth/html/HtmlSelfClosingElement.java
+++ b/src/main/java/org/zwobble/mammoth/html/HtmlSelfClosingElement.java
@@ -23,4 +23,9 @@ public class HtmlSelfClosingElement implements HtmlNode {
public void visit(Visitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public <T> T accept(Mapper<T> visitor) {
+ return visitor.visit(this);
+ }
}
diff --git a/src/main/java/org/zwobble/mammoth/html/HtmlTextNode.java b/src/main/java/org/zwobble/mammoth/html/HtmlTextNode.java
index 37dceec..a9f9fd5 100644
--- a/src/main/java/org/zwobble/mammoth/html/HtmlTextNode.java
+++ b/src/main/java/org/zwobble/mammoth/html/HtmlTextNode.java
@@ -15,4 +15,9 @@ public class HtmlTextNode implements HtmlNode {
public void visit(Visitor visitor) {
visitor.visit(this);
}
+
+ @Override
+ public <T> T accept(Mapper<T> visitor) {
+ return visitor.visit(this);
+ }
}
diff --git a/src/main/java/org/zwobble/mammoth/util/MammothLists.java b/src/main/java/org/zwobble/mammoth/util/MammothLists.java
index 5a2e06b..bed3aa8 100644
--- a/src/main/java/org/zwobble/mammoth/util/MammothLists.java
+++ b/src/main/java/org/zwobble/mammoth/util/MammothLists.java
@@ -28,6 +28,10 @@ public class MammothLists {
return ImmutableList.copyOf(Iterables.concat(first, second));
}
+ public static <T, R> List<R> eagerMap(Iterable<T> iterable, Function<T, R> function) {
+ return ImmutableList.copyOf(Iterables.transform(iterable, function));
+ }
+
public static <T, R> List<R> eagerFlatMap(Iterable<T> iterable, Function<T, Iterable<R>> function) {
return ImmutableList.copyOf(Iterables.concat(Iterables.transform(iterable, function)));
}