diff options
| author | Michael Williamson <mike@zwobble.org> | 2020-11-06 18:54:59 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2020-11-06 18:54:59 +0000 |
| commit | d8ff620412641d5a94085df703a8321e5964ae33 (patch) | |
| tree | 0d743f5fc3517ed3803a399387e4950e2309852f | |
| parent | 999fbc8dc29b87a0f9c4497ec680915ac7ecae26 (diff) | |
Add style mapping for all caps
12 files changed, 79 insertions, 0 deletions
@@ -4,6 +4,8 @@ * Handle underline elements where w:val is "none". +* Add style mapping for all caps. + # 1.4.1 * Read the children of v:rect elements. @@ -438,6 +438,17 @@ strike Note that this matches text that has had strikethrough explicitly applied to it. It will not match any text that is struckthrough because of its paragraph or run style. +#### All caps + +Match explicitly all caps text: + +``` +all-caps +``` + +Note that this matches text that has had all caps explicitly applied to it. +It will not match any text that is all caps because of its paragraph or run style. + #### Small caps Match explicitly small caps text: 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 7276232..0f5a066 100644 --- a/src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtml.java +++ b/src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtml.java @@ -166,6 +166,9 @@ public class DocumentToHtml { if (run.isSmallCaps()) { nodes = styleMap.getSmallCaps().orElse(HtmlPath.EMPTY).wrap(nodes); } + if (run.isAllCaps()) { + nodes = styleMap.getAllCaps().orElse(HtmlPath.EMPTY).wrap(nodes); + } if (run.isStrikethrough()) { nodes = styleMap.getStrikethrough().orElse(HtmlPath.collapsibleElement("s")).wrap(nodes); } diff --git a/src/main/java/org/zwobble/mammoth/internal/documents/Run.java b/src/main/java/org/zwobble/mammoth/internal/documents/Run.java index e047bf5..27631bd 100644 --- a/src/main/java/org/zwobble/mammoth/internal/documents/Run.java +++ b/src/main/java/org/zwobble/mammoth/internal/documents/Run.java @@ -8,6 +8,7 @@ public class Run implements DocumentElement, HasChildren { private final boolean isItalic; private final boolean isUnderline; private final boolean isStrikethrough; + private final boolean isAllCaps; private final boolean isSmallCaps; private final VerticalAlignment verticalAlignment; private final Optional<Style> style; @@ -18,6 +19,7 @@ public class Run implements DocumentElement, HasChildren { boolean isItalic, boolean isUnderline, boolean isStrikethrough, + boolean isAllCaps, boolean isSmallCaps, VerticalAlignment verticalAlignment, Optional<Style> style, @@ -27,6 +29,7 @@ public class Run implements DocumentElement, HasChildren { this.isItalic = isItalic; this.isUnderline = isUnderline; this.isStrikethrough = isStrikethrough; + this.isAllCaps = isAllCaps; this.isSmallCaps = isSmallCaps; this.verticalAlignment = verticalAlignment; this.style = style; @@ -49,6 +52,10 @@ public class Run implements DocumentElement, HasChildren { return isStrikethrough; } + public boolean isAllCaps() { + return isAllCaps; + } + public boolean isSmallCaps() { return isSmallCaps; } diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java index af6b70f..9c270de 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java @@ -182,6 +182,7 @@ class StatefulBodyXmlReader { isItalic(properties), isUnderline(properties), isStrikethrough(properties), + isAllCaps(properties), isSmallCaps(properties), readVerticalAlignment(properties), style, @@ -216,6 +217,10 @@ class StatefulBodyXmlReader { return readBooleanElement(properties, "w:strike"); } + private boolean isAllCaps(XmlElementLike properties) { + return readBooleanElement(properties, "w:caps"); + } + private boolean isSmallCaps(XmlElementLike properties) { return readBooleanElement(properties, "w:smallCaps"); } 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 2b1d19a..1b094fd 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/StyleMap.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/StyleMap.java @@ -24,6 +24,7 @@ public class StyleMap { Optionals.first(high.italic, low.italic), Optionals.first(high.underline, low.underline), Optionals.first(high.strikethrough, low.strikethrough), + Optionals.first(high.allCaps, low.allCaps), Optionals.first(high.smallCaps, low.smallCaps), Optionals.first(high.commentReference, low.commentReference), Lists.eagerConcat(high.paragraphStyles, low.paragraphStyles), @@ -39,6 +40,7 @@ public class StyleMap { private final Optional<HtmlPath> italic; private final Optional<HtmlPath> underline; private final Optional<HtmlPath> strikethrough; + private final Optional<HtmlPath> allCaps; private final Optional<HtmlPath> smallCaps; private final Optional<HtmlPath> commentReference; private final List<StyleMapping<Paragraph>> paragraphStyles; @@ -51,6 +53,7 @@ public class StyleMap { Optional<HtmlPath> italic, Optional<HtmlPath> underline, Optional<HtmlPath> strikethrough, + Optional<HtmlPath> allCaps, Optional<HtmlPath> smallCaps, Optional<HtmlPath> commentReference, List<StyleMapping<Paragraph>> paragraphStyles, @@ -63,6 +66,7 @@ public class StyleMap { this.italic = italic; this.underline = underline; this.strikethrough = strikethrough; + this.allCaps = allCaps; this.smallCaps = smallCaps; this.commentReference = commentReference; this.paragraphStyles = paragraphStyles; @@ -92,6 +96,10 @@ public class StyleMap { return strikethrough; } + public Optional<HtmlPath> getAllCaps() { + return allCaps; + } + public Optional<HtmlPath> getSmallCaps() { return smallCaps; } 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 dbd4fa8..2d90219 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/StyleMapBuilder.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/StyleMapBuilder.java @@ -12,6 +12,7 @@ import java.util.Optional; public class StyleMapBuilder { private Optional<HtmlPath> underline; private Optional<HtmlPath> strikethrough; + private Optional<HtmlPath> allCaps; private Optional<HtmlPath> smallCaps; private Optional<HtmlPath> bold; private Optional<HtmlPath> italic; @@ -25,6 +26,7 @@ public class StyleMapBuilder { this.bold = Optional.empty(); this.underline = Optional.empty(); this.strikethrough = Optional.empty(); + this.allCaps = Optional.empty(); this.smallCaps = Optional.empty(); this.italic = Optional.empty(); this.commentReference = Optional.empty(); @@ -50,6 +52,11 @@ public class StyleMapBuilder { return this; } + public StyleMapBuilder allCaps(HtmlPath path) { + this.allCaps = Optional.of(path); + return this; + } + public StyleMapBuilder smallCaps(HtmlPath path) { this.smallCaps = Optional.of(path); return this; @@ -86,6 +93,7 @@ public class StyleMapBuilder { italic, underline, strikethrough, + allCaps, smallCaps, commentReference, paragraphStyles, 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 f955431..fdd2797 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 @@ -30,6 +30,8 @@ public class DocumentMatcherParser { return StyleMapBuilder::underline; case "strike": return StyleMapBuilder::strikethrough; + case "all-caps": + return StyleMapBuilder::allCaps; case "small-caps": return StyleMapBuilder::smallCaps; case "comment-reference": 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 47982ce..ea60595 100644 --- a/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java @@ -174,6 +174,26 @@ public class DocumentToHtmlTests { } @Test + public void allCapsIsIgnoredByDefault() { + assertThat( + convertToHtml(run(withAllCaps(true), withChildren(new Text("Hello")))), + deepEquals(list(Html.text("Hello"))) + ); + } + + @Test + public void allCapsCanBeMappedUsingStyleMapping() { + assertThat( + convertToHtml( + run(withAllCaps(true), withChildren(new Text("Hello"))), + StyleMap.builder().allCaps(HtmlPath.element("span")).build() + ), + + deepEquals(list(Html.element("span", list(Html.text("Hello"))))) + ); + } + + @Test public void smallCapsIsIgnoredByDefault() { assertThat( convertToHtml(run(withSmallCaps(true), 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 a2b0d7c..510e776 100644 --- a/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java +++ b/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java @@ -19,6 +19,7 @@ public class DocumentElementMakers { private static final ArgumentKey<Boolean> ITALIC = new ArgumentKey<>("italic"); private static final ArgumentKey<Boolean> UNDERLINE = new ArgumentKey<>("underline"); private static final ArgumentKey<Boolean> STRIKETHROUGH = new ArgumentKey<>("strikethrough"); + private static final ArgumentKey<Boolean> ALL_CAPS = new ArgumentKey<>("allCaps"); private static final ArgumentKey<Boolean> SMALL_CAPS = new ArgumentKey<>("smallCaps"); private static final ArgumentKey<VerticalAlignment> VERTICAL_ALIGNMENT = new ArgumentKey<>("verticalAlignment"); private static final ArgumentKey<List<DocumentElement>> CHILDREN = new ArgumentKey<>("children"); @@ -54,6 +55,10 @@ public class DocumentElementMakers { return arg(STRIKETHROUGH, strikethrough); } + public static Argument<Boolean> withAllCaps(boolean allCaps) { + return arg(ALL_CAPS, allCaps); + } + public static Argument<Boolean> withSmallCaps(boolean smallCaps) { return arg(SMALL_CAPS, smallCaps); } @@ -117,6 +122,7 @@ public class DocumentElementMakers { arguments.get(ITALIC, false), arguments.get(UNDERLINE, false), arguments.get(STRIKETHROUGH, false), + arguments.get(ALL_CAPS, false), arguments.get(SMALL_CAPS, false), arguments.get(VERTICAL_ALIGNMENT, VerticalAlignment.BASELINE), arguments.get(STYLE, Optional.empty()), diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java index 647f54f..076cba4 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -613,6 +613,7 @@ public class BodyXmlTests { new TestCase("underline", "w:u"), new TestCase("italic", "w:i"), new TestCase("strikethrough", "w:strike"), + new TestCase("allCaps", "w:caps"), new TestCase("smallCaps", "w:smallCaps") ); diff --git a/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMapParserTests.java b/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMapParserTests.java index a25c764..9a95ef3 100644 --- a/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMapParserTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMapParserTests.java @@ -51,6 +51,12 @@ public class StyleMapParserTests { } @Test + public void canMapAllCaps() { + StyleMap styleMap = StyleMapParser.parse("all-caps => span"); + assertThat(styleMap, deepEquals(StyleMap.builder().allCaps(HtmlPath.collapsibleElement("span")).build())); + } + + @Test public void canMapSmallCaps() { StyleMap styleMap = StyleMapParser.parse("small-caps => span"); assertThat(styleMap, deepEquals(StyleMap.builder().smallCaps(HtmlPath.collapsibleElement("span")).build())); |
