diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-11-28 16:34:20 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-11-28 16:34:20 +0000 |
| commit | b6eabe382e59235192691b5bf04a172ce333ec24 (patch) | |
| tree | e15d80da7905a4f4e2eeba6b7a738c5ec4d8d6e8 | |
| parent | dc6e1277e8255a37727951b78ba5c8fd52de12ed (diff) | |
Add parsing for break style mappings
3 files changed, 44 insertions, 5 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java index 7615e65..7586393 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java @@ -27,6 +27,9 @@ public class DocumentMatcherParser { return StyleMapBuilder::strikethrough; case "comment-reference": return StyleMapBuilder::commentReference; + case "br": + BreakMatcher breakMatcher = parseBreakMatcher(tokens); + return (builder, path) -> builder.mapBreak(breakMatcher, path); default: throw new LineParseException(identifier, "Unrecognised document element: " + identifier); } @@ -93,4 +96,21 @@ public class DocumentMatcherParser { throw new LineParseException(listType, "Unrecognised list type: " + listType); } } + + private static BreakMatcher parseBreakMatcher(TokenIterator<TokenType> tokens) { + tokens.skip(TokenType.SYMBOL, "["); + tokens.skip(TokenType.IDENTIFIER, "type"); + tokens.skip(TokenType.SYMBOL, "="); + Token<TokenType> stringToken = tokens.next(TokenType.STRING); + tokens.skip(TokenType.SYMBOL, "]"); + String typeName = TokenParser.parseStringToken(stringToken); + switch (typeName) { + case "line": + return BreakMatcher.LINE_BREAK; + case "page": + return BreakMatcher.PAGE_BREAK; + default: + throw new LineParseException(stringToken, "Unrecognised break type: " + typeName); + } + } } diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenParser.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenParser.java index 1131da5..78052eb 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenParser.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenParser.java @@ -16,7 +16,11 @@ public class TokenParser { } public static String parseString(TokenIterator<TokenType> tokens) { - String value = tokens.nextValue(TokenType.STRING); + return parseStringToken(tokens.next(TokenType.STRING)); + } + + static String parseStringToken(Token<TokenType> token) { + String value = token.getValue(); return EscapeSequences.decode(value.substring(1, value.length() - 1)); } } diff --git a/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMapParserTests.java b/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMapParserTests.java index d6205cd..5456cb8 100644 --- a/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMapParserTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMapParserTests.java @@ -1,10 +1,7 @@ package org.zwobble.mammoth.tests.styles.parsing; import org.junit.Test; -import org.zwobble.mammoth.internal.styles.HtmlPath; -import org.zwobble.mammoth.internal.styles.ParagraphMatcher; -import org.zwobble.mammoth.internal.styles.RunMatcher; -import org.zwobble.mammoth.internal.styles.StyleMap; +import org.zwobble.mammoth.internal.styles.*; import org.zwobble.mammoth.internal.styles.parsing.StyleMapParser; import static org.hamcrest.MatcherAssert.assertThat; @@ -60,6 +57,24 @@ public class StyleMapParserTests { } @Test + public void canMapLineBreaks() { + StyleMap styleMap = StyleMapParser.parse("br[type='line'] => div"); + StyleMap expectedStyleMap = StyleMap.builder() + .mapBreak(BreakMatcher.LINE_BREAK, HtmlPath.collapsibleElement("div")) + .build(); + assertThat(styleMap, deepEquals(expectedStyleMap)); + } + + @Test + public void canMapPageBreaks() { + StyleMap styleMap = StyleMapParser.parse("br[type='page'] => div"); + StyleMap expectedStyleMap = StyleMap.builder() + .mapBreak(BreakMatcher.PAGE_BREAK, HtmlPath.collapsibleElement("div")) + .build(); + assertThat(styleMap, deepEquals(expectedStyleMap)); + } + + @Test public void blankLinesAreIgnored() { StyleMap styleMap = StyleMapParser.parse("\n\n \n\np =>\n\r\n"); assertThat(styleMap, deepEquals(StyleMap.builder().mapParagraph(ParagraphMatcher.ANY, HtmlPath.EMPTY).build())); |
