aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-11-28 16:34:20 +0000
committerMichael Williamson <mike@zwobble.org>2016-11-28 16:34:20 +0000
commitb6eabe382e59235192691b5bf04a172ce333ec24 (patch)
treee15d80da7905a4f4e2eeba6b7a738c5ec4d8d6e8
parentdc6e1277e8255a37727951b78ba5c8fd52de12ed (diff)
Add parsing for break style mappings
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java20
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenParser.java6
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMapParserTests.java23
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()));