diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-02-23 21:01:17 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-02-23 21:01:17 +0000 |
| commit | 2b61e94881db7d665c76cdccfb390c02542306cf (patch) | |
| tree | 605619fb1af8766f7c2812618946e99ebf352d1d | |
| parent | ce3d0cb6b5349787d26f4a2d7201b3d04b8e5085 (diff) | |
Add parsing for run matchers
4 files changed, 77 insertions, 9 deletions
diff --git a/src/main/java/org/zwobble/mammoth/styles/RunMatcher.java b/src/main/java/org/zwobble/mammoth/styles/RunMatcher.java index 75e883c..f0078ce 100644 --- a/src/main/java/org/zwobble/mammoth/styles/RunMatcher.java +++ b/src/main/java/org/zwobble/mammoth/styles/RunMatcher.java @@ -5,6 +5,8 @@ import org.zwobble.mammoth.documents.Run; import java.util.Optional; public class RunMatcher implements DocumentElementMatcher<Run> { + public static final RunMatcher ANY = new RunMatcher(Optional.empty(), Optional.empty()); + public static RunMatcher styleId(String styleId) { return new RunMatcher(Optional.of(styleId), Optional.empty()); } diff --git a/src/main/java/org/zwobble/mammoth/styles/parsing/StyleMappingParser.java b/src/main/java/org/zwobble/mammoth/styles/parsing/StyleMappingParser.java index 3053666..c475d9b 100644 --- a/src/main/java/org/zwobble/mammoth/styles/parsing/StyleMappingParser.java +++ b/src/main/java/org/zwobble/mammoth/styles/parsing/StyleMappingParser.java @@ -1,26 +1,50 @@ package org.zwobble.mammoth.styles.parsing; +import org.parboiled.Action; import org.parboiled.BaseParser; +import org.parboiled.Context; import org.parboiled.Rule; import org.parboiled.support.Var; import org.zwobble.mammoth.documents.NumberingLevel; -import org.zwobble.mammoth.styles.HtmlPath; -import org.zwobble.mammoth.styles.HtmlPathElement; -import org.zwobble.mammoth.styles.ParagraphMatcher; -import org.zwobble.mammoth.styles.StyleMapBuilder; +import org.zwobble.mammoth.styles.*; import java.math.BigInteger; import java.util.Optional; +import java.util.function.BiFunction; import static org.zwobble.mammoth.util.MammothMaps.map; public class StyleMappingParser extends BaseParser<StyleMapBuilder> { Rule StyleMapping(Var<StyleMapBuilder> styleMap) { - Var<ParagraphMatcher> paragraphMatcher = new Var<>(); + Var<BiFunction<StyleMapBuilder, HtmlPath, StyleMapBuilder>> documentElementMatcher = new Var<>(); Var<HtmlPath> path = new Var<>(); return Sequence( - ParagraphMatcher(paragraphMatcher), Whitespace(), "=>", Whitespace(), HtmlPath(path), EOI, - styleMap.set(styleMap.get().mapParagraph(ParagraphMatcher.ANY, HtmlPath.EMPTY))); + DocumentElementMatcher(documentElementMatcher), Whitespace(), "=>", Whitespace(), HtmlPath(path), EOI, + styleMap.set(documentElementMatcher.get().apply(styleMap.get(), path.get()))); + } + + Rule DocumentElementMatcher(Var<BiFunction<StyleMapBuilder, HtmlPath, StyleMapBuilder>> updateBuilder) { + Var<ParagraphMatcher> paragraphMatcher = new Var<>(); + Var<RunMatcher> runMatcher = new Var<>(); + return FirstOf( + Sequence( + ParagraphMatcher(paragraphMatcher), + new Action() { + @Override + public boolean run(Context context) { + updateBuilder.set((styleMap, htmlPath) -> styleMap.mapParagraph(paragraphMatcher.get(), htmlPath)); + return true; + } + }), + Sequence( + RunMatcher(runMatcher), + new Action() { + @Override + public boolean run(Context context) { + updateBuilder.set((styleMap, htmlPath) -> styleMap.mapRun(runMatcher.get(), htmlPath)); + return true; + } + })); } public Rule ParagraphMatcher(Var<ParagraphMatcher> matcher) { @@ -32,6 +56,14 @@ public class StyleMappingParser extends BaseParser<StyleMapBuilder> { matcher.set(new ParagraphMatcher(styleId.get(), styleName.get(), numbering.get()))); } + public Rule RunMatcher(Var<RunMatcher> matcher) { + Var<Optional<String>> styleId = new Var<>(); + Var<Optional<String>> styleName = new Var<>(); + return Sequence( + "r", StyleId(styleId), StyleName(styleName), + matcher.set(new RunMatcher(styleId.get(), styleName.get()))); + } + Rule StyleId(Var<Optional<String>> styleId) { return Sequence(styleId.set(Optional.empty()), Optional(".", Identifier(), styleId.set(Optional.of(match())))); } diff --git a/src/test/java/org/zwobble/mammoth/tests/styles/DocumentMatcherParsingTests.java b/src/test/java/org/zwobble/mammoth/tests/styles/DocumentMatcherParsingTests.java index dc87945..83ad4b6 100644 --- a/src/test/java/org/zwobble/mammoth/tests/styles/DocumentMatcherParsingTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/styles/DocumentMatcherParsingTests.java @@ -3,6 +3,7 @@ package org.zwobble.mammoth.tests.styles; import org.junit.Test; import org.parboiled.support.Var; import org.zwobble.mammoth.styles.ParagraphMatcher; +import org.zwobble.mammoth.styles.RunMatcher; import org.zwobble.mammoth.styles.parsing.Parsing; import org.zwobble.mammoth.styles.parsing.StyleMappingParser; @@ -11,7 +12,7 @@ import static org.zwobble.mammoth.tests.DeepReflectionMatcher.deepEquals; public class DocumentMatcherParsingTests { @Test - public void canReadPlainParagraph() { + public void readsPlainParagraph() { assertThat( parseParagraphMatcher("p"), deepEquals(ParagraphMatcher.ANY)); @@ -44,10 +45,36 @@ public class DocumentMatcherParsingTests { parseParagraphMatcher("p:unordered-list(2)"), deepEquals(ParagraphMatcher.unorderedList("1"))); } + @Test + public void readsRunParagraph() { + assertThat( + parseRunMatcher("r"), + deepEquals(RunMatcher.ANY)); + } + + @Test + public void readsRunWithStyleId() { + assertThat( + parseRunMatcher("r.Heading1Char"), + deepEquals(RunMatcher.styleId("Heading1Char"))); + } + + @Test + public void readsRunWithStyleName() { + assertThat( + parseRunMatcher("r[style-name='Heading 1 Char']"), + deepEquals(RunMatcher.styleName("Heading 1 Char"))); + } private ParagraphMatcher parseParagraphMatcher(String input) { Var<ParagraphMatcher> matcher = new Var<>(); Parsing.parse(StyleMappingParser.class, parser -> parser.ParagraphMatcher(matcher), input); return matcher.get(); } + + private RunMatcher parseRunMatcher(String input) { + Var<RunMatcher> matcher = new Var<>(); + Parsing.parse(StyleMappingParser.class, parser -> parser.RunMatcher(matcher), input); + return matcher.get(); + } } diff --git a/src/test/java/org/zwobble/mammoth/tests/styles/StyleMapParserTests.java b/src/test/java/org/zwobble/mammoth/tests/styles/StyleMapParserTests.java index ae2ef2b..8331468 100644 --- a/src/test/java/org/zwobble/mammoth/tests/styles/StyleMapParserTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/styles/StyleMapParserTests.java @@ -3,6 +3,7 @@ package org.zwobble.mammoth.tests.styles; import org.junit.Test; import org.zwobble.mammoth.styles.HtmlPath; import org.zwobble.mammoth.styles.ParagraphMatcher; +import org.zwobble.mammoth.styles.RunMatcher; import org.zwobble.mammoth.styles.StyleMap; import org.zwobble.mammoth.styles.parsing.StyleMapParser; @@ -19,6 +20,12 @@ public class StyleMapParserTests { @Test public void canMapParagraphs() { StyleMap styleMap = StyleMapParser.parse("p => p"); - assertThat(styleMap, deepEquals(StyleMap.builder().mapParagraph(ParagraphMatcher.ANY, HtmlPath.EMPTY).build())); + assertThat(styleMap, deepEquals(StyleMap.builder().mapParagraph(ParagraphMatcher.ANY, HtmlPath.collapsibleElement("p")).build())); + } + + @Test + public void canMapRuns() { + StyleMap styleMap = StyleMapParser.parse("r => p"); + assertThat(styleMap, deepEquals(StyleMap.builder().mapRun(RunMatcher.ANY, HtmlPath.collapsibleElement("p")).build())); } } |
