summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-06-13 12:52:44 +0100
committerMichael Williamson <mike@zwobble.org>2024-06-13 12:52:44 +0100
commit5edcc79c02f0bc597f91b525107b1407eeffe288 (patch)
tree421b1c96793ebfef10d436bcf0020efd1be3f022
parent43f5e189cb5cc4aa98932726b17319147c0ae742 (diff)
Support style mapping for highlights
-rw-r--r--NEWS2
-rw-r--r--README.md37
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtml.java5
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/styles/StyleMap.java5
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java44
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java4
6 files changed, 96 insertions, 1 deletions
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 class DocumentToHtml {
@Override
public List<HtmlNode> visit(Run run, Context context) {
Supplier<List<HtmlNode>> 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 class StyleMap {
return tryFind(breakStyles, styleMapping -> styleMapping.matches(breakElement))
.map(StyleMapping::getHtmlPath);
}
+
+ public Optional<HtmlPath> 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
@@ -211,6 +211,50 @@ public class DocumentToHtmlTests {
}
@Test
+ public void highlightedRunsAreIgnoredByDefault() {
+ Run run = run(withHighlight("yellow"), withChildren(new Text("Hello")));
+
+ List<HtmlNode> 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<HtmlNode> 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<HtmlNode> 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(
convertToHtml(run(withVerticalAlignment(SUPERSCRIPT), withChildren(new Text("Hello")))),
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 class DocumentElementMakers {
return arg(SMALL_CAPS, smallCaps);
}
+ public static Argument<Optional<String>> withHighlight(String highlight) {
+ return arg(HIGHLIGHT, Optional.of(highlight));
+ }
+
public static Argument<VerticalAlignment> withVerticalAlignment(VerticalAlignment verticalAlignment) {
return arg(VERTICAL_ALIGNMENT, verticalAlignment);
}