aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/mammoth/internal/styles/parsing
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-11-16 20:33:51 +0000
committerMichael Williamson <mike@zwobble.org>2016-11-16 20:33:51 +0000
commited66bfe54f283cbf27bed4d5b4bddf0c1bdf4808 (patch)
treebd47328fd47e8189393c247d87e0ead549552fc5 /src/main/java/org/zwobble/mammoth/internal/styles/parsing
parentb4099505ca1ceab2f0633381265f27ddfd4fd1be (diff)
Read separators in HTML paths
Diffstat (limited to 'src/main/java/org/zwobble/mammoth/internal/styles/parsing')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/styles/parsing/HtmlPathParser.java23
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenIterator.java22
2 files changed, 39 insertions, 6 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/HtmlPathParser.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/HtmlPathParser.java
index 0d5c70b..a509bbb 100644
--- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/HtmlPathParser.java
+++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/HtmlPathParser.java
@@ -44,7 +44,8 @@ public class HtmlPathParser {
? map()
: map("class", String.join(" ", classNames));
boolean isFresh = parseIsFresh(tokens);
- return new HtmlPathElement(tagNames, attributes, !isFresh);
+ String separator = parseSeparator(tokens);
+ return new HtmlPathElement(tagNames, attributes, !isFresh, separator);
}
private static List<String> parseTagNames(TokenIterator<TokenType> tokens) {
@@ -66,12 +67,24 @@ public class HtmlPathParser {
}
private static boolean parseIsFresh(TokenIterator<TokenType> tokens) {
- if (tokens.peekTokenType() == TokenType.COLON) {
- tokens.skip();
+ return tokens.tryParse(() -> {
+ tokens.skip(TokenType.COLON);
tokens.skip(TokenType.IDENTIFIER, "fresh");
- return true;
+ });
+ }
+
+ private static String parseSeparator(TokenIterator<TokenType> tokens) {
+ boolean isSeparator = tokens.tryParse(() -> {
+ tokens.skip(TokenType.COLON);
+ tokens.skip(TokenType.IDENTIFIER, "separator");
+ });
+ if (isSeparator) {
+ tokens.skip(TokenType.OPEN_PAREN);
+ String value = TokenParser.parseString(tokens);
+ tokens.skip(TokenType.CLOSE_PAREN);
+ return value;
} else {
- return false;
+ return "";
}
}
}
diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenIterator.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenIterator.java
index 0bb3f46..f79974d 100644
--- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenIterator.java
+++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenIterator.java
@@ -16,7 +16,11 @@ public class TokenIterator<T> {
}
public T peekTokenType(int count) {
- return tokens.get(index + count).getTokenType();
+ return peekToken(count).getTokenType();
+ }
+
+ public Token<T> peekToken(int count) {
+ return tokens.get(index + count);
}
public Token<T> next(T type) {
@@ -60,4 +64,20 @@ public class TokenIterator<T> {
private LineParseException unexpectedTokenType(T expected, Token<T> actual) {
return new LineParseException(actual, "expected token of type " + expected + " but was of type " + actual.getTokenType());
}
+
+ public boolean tryParse(Action action) {
+ int originalIndex = index;
+ try {
+ action.run();
+ return true;
+ }
+ catch (LineParseException exception) {
+ index = originalIndex;
+ return false;
+ }
+ }
+
+ public interface Action {
+ void run();
+ }
}