summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-23 21:01:17 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-23 21:01:17 +0000
commit2b61e94881db7d665c76cdccfb390c02542306cf (patch)
tree605619fb1af8766f7c2812618946e99ebf352d1d /src/main/java
parentce3d0cb6b5349787d26f4a2d7201b3d04b8e5085 (diff)
Add parsing for run matchers
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/mammoth/styles/RunMatcher.java2
-rw-r--r--src/main/java/org/zwobble/mammoth/styles/parsing/StyleMappingParser.java46
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()))));
}