diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-11-16 20:33:51 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-11-16 20:33:51 +0000 |
| commit | ed66bfe54f283cbf27bed4d5b4bddf0c1bdf4808 (patch) | |
| tree | bd47328fd47e8189393c247d87e0ead549552fc5 /src/main/java/org/zwobble/mammoth/internal/styles/parsing | |
| parent | b4099505ca1ceab2f0633381265f27ddfd4fd1be (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.java | 23 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenIterator.java | 22 |
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(); + } } |
