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 /src/main/java/org | |
| parent | ce3d0cb6b5349787d26f4a2d7201b3d04b8e5085 (diff) | |
Add parsing for run matchers
Diffstat (limited to 'src/main/java/org')
| -rw-r--r-- | src/main/java/org/zwobble/mammoth/styles/RunMatcher.java | 2 | ||||
| -rw-r--r-- | src/main/java/org/zwobble/mammoth/styles/parsing/StyleMappingParser.java | 46 |
2 files changed, 41 insertions, 7 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())))); } |
