aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/mammoth/html
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/java/org/zwobble/mammoth/html
parent6842d11812563845015ef1d028569f7ea0ba3ed4 (diff)
Strip empty nodes from output
Diffstat (limited to 'src/main/java/org/zwobble/mammoth/html')
-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
6 files changed, 76 insertions, 0 deletions
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);
+ }
}