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 ++++++++++++++++++---- 2 files changed, 41 insertions(+), 7 deletions(-) (limited to 'src/main') 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())))); } -- cgit v1.2.3