aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/mammoth/styles/HtmlPath.java10
-rw-r--r--src/main/java/org/zwobble/mammoth/styles/StyleMapParser.java19
-rw-r--r--src/main/java/org/zwobble/mammoth/util/MammothLists.java4
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/styles/HtmlPathParsingTests.java11
4 files changed, 36 insertions, 8 deletions
diff --git a/src/main/java/org/zwobble/mammoth/styles/HtmlPath.java b/src/main/java/org/zwobble/mammoth/styles/HtmlPath.java
index ee78237..93fd0fa 100644
--- a/src/main/java/org/zwobble/mammoth/styles/HtmlPath.java
+++ b/src/main/java/org/zwobble/mammoth/styles/HtmlPath.java
@@ -24,8 +24,16 @@ public class HtmlPath {
return collapsibleElement(tagName, map());
}
+ public static HtmlPath collapsibleElement(List<String> tagNames) {
+ return collapsibleElement(tagNames, map());
+ }
+
public static HtmlPath collapsibleElement(String tagName, Map<String, String> attributes) {
- return new HtmlPath(list(new HtmlPathElement(list(tagName), attributes, true)));
+ return collapsibleElement(list(tagName), attributes);
+ }
+
+ public static HtmlPath collapsibleElement(List<String> tagNames, Map<String, String> attributes) {
+ return new HtmlPath(list(new HtmlPathElement(tagNames, attributes, true)));
}
private final List<HtmlPathElement> elements;
diff --git a/src/main/java/org/zwobble/mammoth/styles/StyleMapParser.java b/src/main/java/org/zwobble/mammoth/styles/StyleMapParser.java
index 4e18948..43f9b4c 100644
--- a/src/main/java/org/zwobble/mammoth/styles/StyleMapParser.java
+++ b/src/main/java/org/zwobble/mammoth/styles/StyleMapParser.java
@@ -42,21 +42,24 @@ public class StyleMapParser extends BaseParser<Object> {
}
Rule HtmlPathElement(Var<HtmlPathElement> element) {
- Var<String> tagName = new Var<>();
+ ListVar<String> tagNames = new ListVar<>();
ListVar<String> classNames = new ListVar<>();
Var<Boolean> fresh = new Var<>();
return Sequence(
- TagNames(tagName),
+ TagNames(tagNames),
ClassNames(classNames),
Fresh(fresh),
element.set(new HtmlPathElement(
- list(tagName.get()),
+ tagNames.build(),
classNames.isEmpty() ? map() : map("class", String.join(" ", classNames.build())),
!fresh.get())));
}
- Rule TagNames(Var<String> tagName) {
- return Sequence(Identifier(), tagName.set(match()));
+ Rule TagNames(ListVar<String> tagNames) {
+ return Sequence(
+ Identifier(),
+ tagNames.append(match()),
+ ZeroOrMore(Sequence("|", Identifier(), tagNames.append(match()))));
}
Rule ClassNames(ListVar<String> classNames) {
@@ -84,10 +87,14 @@ public class StyleMapParser extends BaseParser<Object> {
class ListVar<T> extends Var<ImmutableList.Builder<T>> {
boolean append(Var<T> element) {
+ return append(element.get());
+ }
+
+ boolean append(T element) {
if (get() == null) {
set(ImmutableList.builder());
}
- return set(get().add(element.get()));
+ return set(get().add(element));
}
public List<T> build() {
diff --git a/src/main/java/org/zwobble/mammoth/util/MammothLists.java b/src/main/java/org/zwobble/mammoth/util/MammothLists.java
index 497d1b3..bbdaa7b 100644
--- a/src/main/java/org/zwobble/mammoth/util/MammothLists.java
+++ b/src/main/java/org/zwobble/mammoth/util/MammothLists.java
@@ -20,6 +20,10 @@ public class MammothLists {
return ImmutableList.of(value1, value2);
}
+ public static <T> List<T> list(T value1, T value2, T value3) {
+ return ImmutableList.of(value1, value2, value3);
+ }
+
public static <T> List<T> cons(T head, Iterable<T> tail) {
return concat(list(head), tail);
}
diff --git a/src/test/java/org/zwobble/mammoth/tests/styles/HtmlPathParsingTests.java b/src/test/java/org/zwobble/mammoth/tests/styles/HtmlPathParsingTests.java
index 6b75f0f..b2a4433 100644
--- a/src/test/java/org/zwobble/mammoth/tests/styles/HtmlPathParsingTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/styles/HtmlPathParsingTests.java
@@ -25,7 +25,16 @@ public class HtmlPathParsingTests {
deepEquals(HtmlPath.collapsibleElement("p")));
}
- // TODO: choice
+ @Test
+ public void canReadElementWithChoiceOfTagNames() {
+ assertThat(
+ StyleMapParser.parseHtmlPath("ul|ol"),
+ deepEquals(HtmlPath.collapsibleElement(list("ul", "ol"))));
+
+ assertThat(
+ StyleMapParser.parseHtmlPath("ul|ol|p"),
+ deepEquals(HtmlPath.collapsibleElement(list("ul", "ol", "p"))));
+ }
@Test
public void canReadNestedElements() {