From a26168d0c52aeec2dfbe6fffc1531219b4dcd199 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 13 Jun 2024 12:40:05 +0100 Subject: Parse highlight matchers --- .../zwobble/mammoth/internal/styles/StyleMap.java | 8 +++++-- .../mammoth/internal/styles/StyleMapBuilder.java | 9 +++++++- .../styles/parsing/DocumentMatcherParser.java | 18 +++++++++++++++ .../parsing/DocumentMatcherParsingTests.java | 26 ++++++++++++++++++++++ 4 files changed, 58 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/StyleMap.java b/src/main/java/org/zwobble/mammoth/internal/styles/StyleMap.java index 1b094fd..4304f7f 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/StyleMap.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/StyleMap.java @@ -30,7 +30,8 @@ public class StyleMap { Lists.eagerConcat(high.paragraphStyles, low.paragraphStyles), Lists.eagerConcat(high.runStyles, low.runStyles), Lists.eagerConcat(high.tableStyles, low.tableStyles), - Lists.eagerConcat(high.breakStyles, low.breakStyles) + Lists.eagerConcat(high.breakStyles, low.breakStyles), + Lists.eagerConcat(high.highlightStyles, low.highlightStyles) ); } @@ -47,6 +48,7 @@ public class StyleMap { private final List> runStyles; private final List> tableStyles; private final List> breakStyles; + private final List> highlightStyles; public StyleMap( Optional bold, @@ -59,7 +61,8 @@ public class StyleMap { List> paragraphStyles, List> runStyles, List> tableStyles, - List> breakStyles + List> breakStyles, + List> highlightStyles ) { this.bold = bold; @@ -73,6 +76,7 @@ public class StyleMap { this.runStyles = runStyles; this.tableStyles = tableStyles; this.breakStyles = breakStyles; + this.highlightStyles = highlightStyles; } public StyleMap update(StyleMap styleMap) { diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/StyleMapBuilder.java b/src/main/java/org/zwobble/mammoth/internal/styles/StyleMapBuilder.java index 2d90219..fd38f32 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/StyleMapBuilder.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/StyleMapBuilder.java @@ -21,6 +21,7 @@ public class StyleMapBuilder { private final List> runStyles = new ArrayList<>(); private final List> tableStyles = new ArrayList<>(); private final List> breakStyles = new ArrayList<>(); + private final List> highlightStyles = new ArrayList<>(); public StyleMapBuilder() { this.bold = Optional.empty(); @@ -62,6 +63,11 @@ public class StyleMapBuilder { return this; } + public StyleMapBuilder mapHighlight(HighlightMatcher matcher, HtmlPath path) { + this.highlightStyles.add(new StyleMapping<>(matcher, path)); + return this; + } + public StyleMapBuilder commentReference(HtmlPath path) { this.commentReference = Optional.of(path); return this; @@ -99,7 +105,8 @@ public class StyleMapBuilder { paragraphStyles, runStyles, tableStyles, - breakStyles + breakStyles, + highlightStyles ); } } diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java index fdd2797..c40176a 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java @@ -34,6 +34,9 @@ public class DocumentMatcherParser { return StyleMapBuilder::allCaps; case "small-caps": return StyleMapBuilder::smallCaps; + case "highlight": + HighlightMatcher highlight = parseHighlightMatcher(tokens); + return (builder, path) -> builder.mapHighlight(highlight, path); case "comment-reference": return StyleMapBuilder::commentReference; case "br": @@ -112,6 +115,21 @@ public class DocumentMatcherParser { } } + private static HighlightMatcher parseHighlightMatcher(TokenIterator tokens) { + Optional color; + + if (tokens.trySkip(TokenType.SYMBOL, "[")) { + tokens.skip(TokenType.IDENTIFIER, "color"); + tokens.skip(TokenType.SYMBOL, "="); + color = Optional.of(TokenParser.parseString(tokens)); + tokens.skip(TokenType.SYMBOL, "]"); + } else { + color = Optional.empty(); + } + + return new HighlightMatcher(color); + } + private static BreakMatcher parseBreakMatcher(TokenIterator tokens) { tokens.skip(TokenType.SYMBOL, "["); tokens.skip(TokenType.IDENTIFIER, "type"); diff --git a/src/test/java/org/zwobble/mammoth/tests/styles/parsing/DocumentMatcherParsingTests.java b/src/test/java/org/zwobble/mammoth/tests/styles/parsing/DocumentMatcherParsingTests.java index 1af4a86..7c39e78 100644 --- a/src/test/java/org/zwobble/mammoth/tests/styles/parsing/DocumentMatcherParsingTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/styles/parsing/DocumentMatcherParsingTests.java @@ -8,6 +8,8 @@ import org.zwobble.mammoth.internal.styles.parsing.StyleMappingTokeniser; import org.zwobble.mammoth.internal.styles.parsing.TokenIterator; import org.zwobble.mammoth.internal.styles.parsing.TokenType; +import java.util.Optional; + import static org.hamcrest.MatcherAssert.assertThat; import static org.zwobble.mammoth.tests.DeepReflectionMatcher.deepEquals; @@ -147,6 +149,30 @@ public class DocumentMatcherParsingTests { ); } + @Test + public void readsHighlightWithoutColor() { + assertThat( + parseDocumentMatcher("highlight"), + deepEquals( + new StyleMapBuilder() + .mapHighlight(new HighlightMatcher(Optional.empty()), HTML_PATH) + .build() + ) + ); + } + + @Test + public void readsHighlightWithColor() { + assertThat( + parseDocumentMatcher("highlight[color='yellow']"), + deepEquals( + new StyleMapBuilder() + .mapHighlight(new HighlightMatcher(Optional.of("yellow")), HTML_PATH) + .build() + ) + ); + } + private static final HtmlPath HTML_PATH = HtmlPath.element("placeholder"); private StyleMap parseDocumentMatcher(String input) { -- cgit v1.2.3