From 5edcc79c02f0bc597f91b525107b1407eeffe288 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 13 Jun 2024 12:52:44 +0100 Subject: [PATCH] Support style mapping for highlights --- NEWS | 2 +- README.md | 37 ++++++++++++++++ .../internal/conversion/DocumentToHtml.java | 5 +++ .../mammoth/internal/styles/StyleMap.java | 5 +++ .../tests/conversion/DocumentToHtmlTests.java | 44 +++++++++++++++++++ .../documents/DocumentElementMakers.java | 4 ++ 6 files changed, 96 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 498eda0..93ff42d 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ # 1.8.0 -* Support parsing of run highlights. +* Add style mapping for highlights. # 1.7.1 diff --git a/README.md b/README.md index 2f60c8d..8574f83 100644 --- a/README.md +++ b/README.md @@ -460,6 +460,43 @@ small-caps Note that this matches text that has had small caps explicitly applied to it. It will not match any text that is small caps because of its paragraph or run style. +#### Highlight + +Match explicitly highlighted text: + +``` +highlight +``` + +Note that this matches text that has had a highlight explicitly applied to it. +It will not match any text that is highlighted because of its paragraph or run style. + +It's also possible to match specific colours. +For instance, to match yellow highlights: + +``` +highlight[color='yellow'] +``` + +The set of colours typically used are: + +* `black` +* `blue` +* `cyan` +* `green` +* `magenta` +* `red` +* `yellow` +* `white` +* `darkBlue` +* `darkCyan` +* `darkGreen` +* `darkMagenta` +* `darkRed` +* `darkYellow` +* `darkGray` +* `lightGray` + #### Ignoring document elements Use `!` to ignore a document element. diff --git a/src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtml.java b/src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtml.java index 3da9b7b..80f807e 100644 --- a/src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtml.java +++ b/src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtml.java @@ -159,6 +159,11 @@ public List visit(Paragraph paragraph, Context context) { @Override public List visit(Run run, Context context) { Supplier> nodes = () -> convertChildrenToHtml(run, context); + if (run.getHighlight().isPresent()) { + nodes = styleMap.getHighlightHtmlPath(run.getHighlight().get()) + .orElse(HtmlPath.EMPTY) + .wrap(nodes); + } if (run.isSmallCaps()) { nodes = styleMap.getSmallCaps().orElse(HtmlPath.EMPTY).wrap(nodes); } 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 4304f7f..ff93cb3 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/StyleMap.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/StyleMap.java @@ -131,4 +131,9 @@ public Optional getBreakHtmlPath(Break breakElement) { return tryFind(breakStyles, styleMapping -> styleMapping.matches(breakElement)) .map(StyleMapping::getHtmlPath); } + + public Optional getHighlightHtmlPath(String color) { + return tryFind(highlightStyles, styleMapping -> styleMapping.matches(color)) + .map(StyleMapping::getHtmlPath); + } } diff --git a/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java b/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java index 03e5a52..3cea235 100644 --- a/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java @@ -210,6 +210,50 @@ public void smallCapsCanBeMappedUsingStyleMapping() { deepEquals(list(Html.element("span", list(Html.text("Hello")))))); } + @Test + public void highlightedRunsAreIgnoredByDefault() { + Run run = run(withHighlight("yellow"), withChildren(new Text("Hello"))); + + List result = convertToHtml(run); + + assertThat(result, deepEquals(list(Html.text("Hello")))); + } + + @Test + public void highlightedRunsCanBeConfiguredWithStyleMappingForAllHighlights() { + Run run = run(withHighlight("yellow"), withChildren(new Text("Hello"))); + StyleMap styleMap = StyleMap.builder() + .mapHighlight(new HighlightMatcher(Optional.empty()), HtmlPath.element("mark")) + .build(); + + List result = convertToHtml(run, styleMap); + + assertThat(result, deepEquals(list( + Html.element("mark", list(Html.text("Hello"))) + ))); + } + + @Test + public void highlightedRunsCanBeConfiguredWithStyleMappingForSpecificHighlightColor() { + Paragraph paragraph = paragraph(withChildren( + run(withHighlight("yellow"), withChildren(new Text("Yellow"))), + run(withHighlight("red"), withChildren(new Text("Red"))) + )); + StyleMap styleMap = StyleMap.builder() + .mapHighlight(new HighlightMatcher(Optional.of("yellow")), HtmlPath.element("mark", map("class", "yellow"))) + .mapHighlight(new HighlightMatcher(Optional.empty()), HtmlPath.element("mark")) + .build(); + + List result = convertToHtml(paragraph, styleMap); + + assertThat(result, deepEquals(list( + Html.element("p", list( + Html.element("mark", map("class", "yellow"), list(Html.text("Yellow"))), + Html.element("mark", list(Html.text("Red"))) + )) + ))); + } + @Test public void superscriptRunsAreWrappedInSuperscriptTags() { assertThat( diff --git a/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java b/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java index e5bb12b..d807e57 100644 --- a/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java +++ b/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java @@ -64,6 +64,10 @@ public static Argument withSmallCaps(boolean smallCaps) { return arg(SMALL_CAPS, smallCaps); } + public static Argument> withHighlight(String highlight) { + return arg(HIGHLIGHT, Optional.of(highlight)); + } + public static Argument withVerticalAlignment(VerticalAlignment verticalAlignment) { return arg(VERTICAL_ALIGNMENT, verticalAlignment); }