From 2b61e94881db7d665c76cdccfb390c02542306cf Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 23 Feb 2016 21:01:17 +0000 Subject: Add parsing for run matchers --- .../org/zwobble/mammoth/styles/RunMatcher.java | 2 + .../mammoth/styles/parsing/StyleMappingParser.java | 46 ++++++++++++++++++---- .../tests/styles/DocumentMatcherParsingTests.java | 29 +++++++++++++- .../mammoth/tests/styles/StyleMapParserTests.java | 9 ++++- 4 files changed, 77 insertions(+), 9 deletions(-) (limited to 'src') 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 { + 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 { Rule StyleMapping(Var styleMap) { - Var paragraphMatcher = new Var<>(); + Var> documentElementMatcher = new Var<>(); Var 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> updateBuilder) { + Var paragraphMatcher = new Var<>(); + Var 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 matcher) { @@ -32,6 +56,14 @@ public class StyleMappingParser extends BaseParser { matcher.set(new ParagraphMatcher(styleId.get(), styleName.get(), numbering.get()))); } + public Rule RunMatcher(Var matcher) { + Var> styleId = new Var<>(); + Var> styleName = new Var<>(); + return Sequence( + "r", StyleId(styleId), StyleName(styleName), + matcher.set(new RunMatcher(styleId.get(), styleName.get()))); + } + Rule StyleId(Var> 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 matcher = new Var<>(); Parsing.parse(StyleMappingParser.class, parser -> parser.ParagraphMatcher(matcher), input); return matcher.get(); } + + private RunMatcher parseRunMatcher(String input) { + Var 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())); } } -- cgit v1.2.3