From ce3d0cb6b5349787d26f4a2d7201b3d04b8e5085 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 23 Feb 2016 20:48:50 +0000 Subject: Add parsing for paragraph matchers --- .../org/zwobble/mammoth/styles/StyleMapParser.java | 7 -- .../mammoth/styles/parsing/HtmlPathParser.java | 68 ----------- .../zwobble/mammoth/styles/parsing/Parsing.java | 4 +- .../mammoth/styles/parsing/StyleMapParser.java | 17 +++ .../mammoth/styles/parsing/StyleMappingParser.java | 128 +++++++++++++++++++++ 5 files changed, 146 insertions(+), 78 deletions(-) delete mode 100644 src/main/java/org/zwobble/mammoth/styles/StyleMapParser.java delete mode 100644 src/main/java/org/zwobble/mammoth/styles/parsing/HtmlPathParser.java create mode 100644 src/main/java/org/zwobble/mammoth/styles/parsing/StyleMapParser.java create mode 100644 src/main/java/org/zwobble/mammoth/styles/parsing/StyleMappingParser.java (limited to 'src/main/java') diff --git a/src/main/java/org/zwobble/mammoth/styles/StyleMapParser.java b/src/main/java/org/zwobble/mammoth/styles/StyleMapParser.java deleted file mode 100644 index 1092353..0000000 --- a/src/main/java/org/zwobble/mammoth/styles/StyleMapParser.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.zwobble.mammoth.styles; - -import org.parboiled.BaseParser; - -public class StyleMapParser extends BaseParser { - -} diff --git a/src/main/java/org/zwobble/mammoth/styles/parsing/HtmlPathParser.java b/src/main/java/org/zwobble/mammoth/styles/parsing/HtmlPathParser.java deleted file mode 100644 index 18e1107..0000000 --- a/src/main/java/org/zwobble/mammoth/styles/parsing/HtmlPathParser.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.zwobble.mammoth.styles.parsing; - -import org.parboiled.BaseParser; -import org.parboiled.Rule; -import org.parboiled.support.Var; -import org.zwobble.mammoth.styles.HtmlPath; -import org.zwobble.mammoth.styles.HtmlPathElement; - -import static org.zwobble.mammoth.util.MammothMaps.map; - -public class HtmlPathParser extends BaseParser { - public Rule HtmlPath() { - ListVar elements = new ListVar<>(); - return Sequence(Optional(HtmlPathElements(elements)), EOI, push(new HtmlPath(elements.build()))); - } - - Rule HtmlPathElements(ListVar elements) { - Var element = new Var<>(); - return Sequence( - HtmlPathElement(element), - elements.append(element), - ZeroOrMore(Sequence(Whitespace(), Ch('>'), Whitespace(), HtmlPathElement(element), elements.append(element)))); - } - - Rule HtmlPathElement(Var element) { - ListVar tagNames = new ListVar<>(); - ListVar classNames = new ListVar<>(); - Var fresh = new Var<>(); - return Sequence( - TagNames(tagNames), - ClassNames(classNames), - Fresh(fresh), - element.set(new HtmlPathElement( - tagNames.build(), - classNames.isEmpty() ? map() : map("class", String.join(" ", classNames.build())), - !fresh.get()))); - } - - Rule TagNames(ListVar tagNames) { - return Sequence( - Identifier(), - tagNames.append(match()), - ZeroOrMore(Sequence("|", Identifier(), tagNames.append(match())))); - } - - Rule ClassNames(ListVar classNames) { - Var className = new Var<>(); - return ZeroOrMore(Sequence(ClassName(className), classNames.append(className))); - } - - Rule ClassName(Var className) { - return Sequence(".", Identifier(), className.set(match())); - } - - Rule Fresh(Var fresh) { - return Sequence(fresh.set(false), Optional(":fresh", fresh.set(true))); - } - - Rule Identifier() { - return Sequence( - FirstOf(CharRange('a', 'z'), CharRange('A', 'Z')), - ZeroOrMore(FirstOf(CharRange('a', 'z'), CharRange('A', 'Z'), CharRange('0', '9'), Ch('-'), Ch('_')))); - } - - Rule Whitespace() { - return ZeroOrMore(AnyOf(" \t")); - } -} diff --git a/src/main/java/org/zwobble/mammoth/styles/parsing/Parsing.java b/src/main/java/org/zwobble/mammoth/styles/parsing/Parsing.java index 761e7b8..8971f8a 100644 --- a/src/main/java/org/zwobble/mammoth/styles/parsing/Parsing.java +++ b/src/main/java/org/zwobble/mammoth/styles/parsing/Parsing.java @@ -9,15 +9,13 @@ import org.parboiled.support.ParsingResult; import java.util.function.Function; public class Parsing { - public static > T parse(Class parserType, Function rule, String value) { + public static , V> void parse(Class parserType, Function rule, String value) { U parser = Parboiled.createParser(parserType); ReportingParseRunner runner = new ReportingParseRunner<>(rule.apply(parser)); ParsingResult result = runner.run(value); if (result.hasErrors()) { // TODO: wrap in result throw new RuntimeException("Parse error"); - } else { - return result.valueStack.peek(); } } } diff --git a/src/main/java/org/zwobble/mammoth/styles/parsing/StyleMapParser.java b/src/main/java/org/zwobble/mammoth/styles/parsing/StyleMapParser.java new file mode 100644 index 0000000..618c00b --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/styles/parsing/StyleMapParser.java @@ -0,0 +1,17 @@ +package org.zwobble.mammoth.styles.parsing; + +import org.parboiled.support.Var; +import org.zwobble.mammoth.styles.StyleMap; +import org.zwobble.mammoth.styles.StyleMapBuilder; + +public class StyleMapParser { + public static StyleMap parse(String input) { + if (input.isEmpty()) { + return StyleMap.EMPTY; + } else { + Var styleMap = new Var<>(StyleMap.builder()); + Parsing.parse(StyleMappingParser.class, parser -> parser.StyleMapping(styleMap), input); + return styleMap.get().build(); + } + } +} diff --git a/src/main/java/org/zwobble/mammoth/styles/parsing/StyleMappingParser.java b/src/main/java/org/zwobble/mammoth/styles/parsing/StyleMappingParser.java new file mode 100644 index 0000000..3053666 --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/styles/parsing/StyleMappingParser.java @@ -0,0 +1,128 @@ +package org.zwobble.mammoth.styles.parsing; + +import org.parboiled.BaseParser; +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 java.math.BigInteger; +import java.util.Optional; + +import static org.zwobble.mammoth.util.MammothMaps.map; + +public class StyleMappingParser extends BaseParser { + Rule StyleMapping(Var styleMap) { + Var paragraphMatcher = new Var<>(); + Var path = new Var<>(); + return Sequence( + ParagraphMatcher(paragraphMatcher), Whitespace(), "=>", Whitespace(), HtmlPath(path), EOI, + styleMap.set(styleMap.get().mapParagraph(ParagraphMatcher.ANY, HtmlPath.EMPTY))); + } + + public Rule ParagraphMatcher(Var matcher) { + Var> styleId = new Var<>(); + Var> styleName = new Var<>(); + Var> numbering = new Var<>(); + return Sequence( + "p", StyleId(styleId), StyleName(styleName), Numbering(numbering), + matcher.set(new ParagraphMatcher(styleId.get(), styleName.get(), numbering.get()))); + } + + Rule StyleId(Var> styleId) { + return Sequence(styleId.set(Optional.empty()), Optional(".", Identifier(), styleId.set(Optional.of(match())))); + } + + Rule StyleName(Var> styleName) { + Var value = new Var<>(); + return Sequence( + styleName.set(Optional.empty()), + Optional("[style-name=", SingleQuotedString(value), "]", styleName.set(Optional.of(value.get())))); + } + + Rule Numbering(Var> numbering) { + Var isOrdered = new Var<>(); + Var level = new Var<>(); + return Sequence( + numbering.set(Optional.empty()), + Optional(Sequence( + ":", NumberingType(isOrdered), "(", Number(level), ")", + numbering.set(Optional.of(new NumberingLevel(level.get().subtract(BigInteger.ONE).toString(), isOrdered.get())))))); + } + + Rule NumberingType(Var isOrdered) { + return FirstOf( + Sequence("ordered-list", isOrdered.set(true)), + Sequence("unordered-list", isOrdered.set(false))); + } + + Rule Number(Var level) { + return Sequence( + OneOrMore(CharRange('0', '9')), + level.set(new BigInteger(match()))); + } + + public Rule HtmlPath(Var htmlPath) { + ListVar elements = new ListVar<>(); + return Sequence(Optional(HtmlPathElements(elements)), htmlPath.set(new HtmlPath(elements.build()))); + } + + Rule HtmlPathElements(ListVar elements) { + Var element = new Var<>(); + return Sequence( + HtmlPathElement(element), + elements.append(element), + ZeroOrMore(Sequence(Whitespace(), Ch('>'), Whitespace(), HtmlPathElement(element), elements.append(element)))); + } + + Rule HtmlPathElement(Var element) { + ListVar tagNames = new ListVar<>(); + ListVar classNames = new ListVar<>(); + Var fresh = new Var<>(); + return Sequence( + TagNames(tagNames), + ClassNames(classNames), + Fresh(fresh), + element.set(new HtmlPathElement( + tagNames.build(), + classNames.isEmpty() ? map() : map("class", String.join(" ", classNames.build())), + !fresh.get()))); + } + + Rule TagNames(ListVar tagNames) { + return Sequence( + Identifier(), + tagNames.append(match()), + ZeroOrMore(Sequence("|", Identifier(), tagNames.append(match())))); + } + + Rule ClassNames(ListVar classNames) { + Var className = new Var<>(); + return ZeroOrMore(Sequence(ClassName(className), classNames.append(className))); + } + + Rule ClassName(Var className) { + return Sequence(".", Identifier(), className.set(match())); + } + + Rule Fresh(Var fresh) { + return Sequence(fresh.set(false), Optional(":fresh", fresh.set(true))); + } + + Rule SingleQuotedString(Var value) { + return Sequence("'", ZeroOrMore(NoneOf("\'")), value.set(match()), "'"); + } + + Rule Identifier() { + return Sequence( + FirstOf(CharRange('a', 'z'), CharRange('A', 'Z')), + ZeroOrMore(FirstOf(CharRange('a', 'z'), CharRange('A', 'Z'), CharRange('0', '9'), Ch('-'), Ch('_')))); + } + + Rule Whitespace() { + return ZeroOrMore(AnyOf(" \t")); + } +} -- cgit v1.2.3