diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-02-24 09:04:14 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-02-24 09:04:14 +0000 |
| commit | 8dd12c1ca7703a085b57fe4c5c35ef6e19d92134 (patch) | |
| tree | 2e2c47733e868a6a0deadceed8b1c564643bb2cc | |
| parent | 9903fc49d41142934012a5ec2bf16d80f0cf4b16 (diff) | |
Allow style maps to be added
8 files changed, 69 insertions, 18 deletions
diff --git a/src/main/java/org/zwobble/mammoth/Mammoth.java b/src/main/java/org/zwobble/mammoth/Mammoth.java index b8dac98..d7f5679 100644 --- a/src/main/java/org/zwobble/mammoth/Mammoth.java +++ b/src/main/java/org/zwobble/mammoth/Mammoth.java @@ -31,7 +31,7 @@ public class Mammoth { private final DocumentToHtmlOptions options; public Mammoth() { - this(DocumentToHtmlOptions.DEFAULT.styleMap(DefaultStyles.DEFAULT_STYLE_MAP)); + this(DocumentToHtmlOptions.DEFAULT.addStyleMap(DefaultStyles.DEFAULT_STYLE_MAP)); } private Mammoth(DocumentToHtmlOptions options) { @@ -46,6 +46,10 @@ public class Mammoth { return new Mammoth(options.preserveEmptyParagraphs()); } + public Mammoth addStyleMap(String styleMap) { + return new Mammoth(options.addStyleMap(styleMap)); + } + public Result<String> convertToHtml(InputStream stream) throws IOException { return withDocxFile(stream, zipFile -> convertToHtml(Optional.empty(), zipFile)); diff --git a/src/main/java/org/zwobble/mammoth/internal/DocumentConverter.java b/src/main/java/org/zwobble/mammoth/internal/DocumentConverter.java index ab28651..4e5dc05 100644 --- a/src/main/java/org/zwobble/mammoth/internal/DocumentConverter.java +++ b/src/main/java/org/zwobble/mammoth/internal/DocumentConverter.java @@ -114,10 +114,10 @@ public class DocumentConverter { public List<HtmlNode> visit(Run run) { List<HtmlNode> nodes = convertChildrenToHtml(run); if (run.isStrikethrough()) { - nodes = styleMap.getStrikethrough().wrap(nodes); + nodes = styleMap.getStrikethrough().orElse(HtmlPath.collapsibleElement("s")).wrap(nodes); } if (run.isUnderline()) { - nodes = styleMap.getUnderline().wrap(nodes); + nodes = styleMap.getUnderline().orElse(HtmlPath.EMPTY).wrap(nodes); } if (run.getVerticalAlignment() == VerticalAlignment.SUBSCRIPT) { nodes = list(Html.collapsibleElement("sub", nodes)); diff --git a/src/main/java/org/zwobble/mammoth/internal/DocumentToHtmlOptions.java b/src/main/java/org/zwobble/mammoth/internal/DocumentToHtmlOptions.java index f7cbf0d..4cd6372 100644 --- a/src/main/java/org/zwobble/mammoth/internal/DocumentToHtmlOptions.java +++ b/src/main/java/org/zwobble/mammoth/internal/DocumentToHtmlOptions.java @@ -1,6 +1,7 @@ package org.zwobble.mammoth.internal; import org.zwobble.mammoth.internal.styles.StyleMap; +import org.zwobble.mammoth.internal.styles.parsing.StyleMapParser; public class DocumentToHtmlOptions { public static final DocumentToHtmlOptions DEFAULT = new DocumentToHtmlOptions("", false, StyleMap.EMPTY); @@ -23,8 +24,12 @@ public class DocumentToHtmlOptions { return new DocumentToHtmlOptions(idPrefix, true, styleMap); } - public DocumentToHtmlOptions styleMap(StyleMap styleMap) { - return new DocumentToHtmlOptions(idPrefix, preserveEmptyParagraphs, styleMap); + public DocumentToHtmlOptions addStyleMap(String styleMap) { + return addStyleMap(StyleMapParser.parse(styleMap)); + } + + public DocumentToHtmlOptions addStyleMap(StyleMap styleMap) { + return new DocumentToHtmlOptions(idPrefix, preserveEmptyParagraphs, this.styleMap.update(styleMap)); } public String idPrefix() { 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 7d28bf1..b181074 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/StyleMap.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/StyleMap.java @@ -3,6 +3,8 @@ package org.zwobble.mammoth.internal.styles; import com.google.common.collect.Iterables; import org.zwobble.mammoth.internal.documents.Paragraph; import org.zwobble.mammoth.internal.documents.Run; +import org.zwobble.mammoth.internal.util.MammothLists; +import org.zwobble.mammoth.internal.util.MammothOptionals; import java.util.List; import java.util.Optional; @@ -14,14 +16,14 @@ public class StyleMap { public static final StyleMap EMPTY = new StyleMapBuilder().build(); - private final HtmlPath underline; - private final HtmlPath strikethrough; + private final Optional<HtmlPath> underline; + private final Optional<HtmlPath> strikethrough; private final List<StyleMapping<Paragraph>> paragraphStyles; private final List<StyleMapping<Run>> runStyles; public StyleMap( - HtmlPath underline, - HtmlPath strikethrough, + Optional<HtmlPath> underline, + Optional<HtmlPath> strikethrough, List<StyleMapping<Paragraph>> paragraphStyles, List<StyleMapping<Run>> runStyles) { @@ -31,11 +33,20 @@ public class StyleMap { this.runStyles = runStyles; } - public HtmlPath getUnderline() { + public StyleMap update(StyleMap styleMap) { + // TODO: add appropriate tests + return new StyleMap( + MammothOptionals.first(styleMap.underline, underline), + MammothOptionals.first(styleMap.strikethrough, strikethrough), + MammothLists.concat(styleMap.paragraphStyles, paragraphStyles), + MammothLists.concat(styleMap.runStyles, runStyles)); + } + + public Optional<HtmlPath> getUnderline() { return underline; } - public HtmlPath getStrikethrough() { + public Optional<HtmlPath> getStrikethrough() { return strikethrough; } 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 6300d29..ae7140e 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/StyleMapBuilder.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/StyleMapBuilder.java @@ -4,24 +4,26 @@ import com.google.common.collect.ImmutableList; import org.zwobble.mammoth.internal.documents.Paragraph; import org.zwobble.mammoth.internal.documents.Run; +import java.util.Optional; + public class StyleMapBuilder { - private HtmlPath underline; - private HtmlPath strikethrough; + private Optional<HtmlPath> underline; + private Optional<HtmlPath> strikethrough; private final ImmutableList.Builder<StyleMapping<Paragraph>> paragraphStyles = ImmutableList.builder(); private final ImmutableList.Builder<StyleMapping<Run>> runStyles = ImmutableList.builder(); public StyleMapBuilder() { - this.underline = HtmlPath.EMPTY; - this.strikethrough = HtmlPath.collapsibleElement("s"); + this.underline = Optional.empty(); + this.strikethrough = Optional.empty(); } public StyleMapBuilder underline(HtmlPath path) { - this.underline = path; + this.underline = Optional.of(path); return this; } public StyleMapBuilder strikethrough(HtmlPath path) { - this.strikethrough = path; + this.strikethrough = Optional.of(path); return this; } diff --git a/src/main/java/org/zwobble/mammoth/internal/util/MammothOptionals.java b/src/main/java/org/zwobble/mammoth/internal/util/MammothOptionals.java index b94a168..6f2c100 100644 --- a/src/main/java/org/zwobble/mammoth/internal/util/MammothOptionals.java +++ b/src/main/java/org/zwobble/mammoth/internal/util/MammothOptionals.java @@ -4,6 +4,14 @@ import java.util.Optional; import java.util.function.BiFunction; public class MammothOptionals { + public static <T> Optional<T> first(Optional<T> first, Optional<T> second) { + if (first.isPresent()) { + return first; + } else { + return second; + } + } + public static <T1, T2, R> Optional<R> flatMap( Optional<T1> first, Optional<T2> second, diff --git a/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java b/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java index 4c40800..df60d06 100644 --- a/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java @@ -312,7 +312,7 @@ public class DocumentConverterTests { private Result<List<HtmlNode>> convertToHtmlResult(DocumentElement element, StyleMap styleMap) { DocumentToHtmlOptions options = DocumentToHtmlOptions.DEFAULT .idPrefix("doc-42-") - .styleMap(styleMap); + .addStyleMap(styleMap); return DocumentConverter.convertToHtml(element, options); } } diff --git a/src/test/java/org/zwobble/mammoth/tests/MammothTests.java b/src/test/java/org/zwobble/mammoth/tests/MammothTests.java index 6e5794a..288c6a2 100644 --- a/src/test/java/org/zwobble/mammoth/tests/MammothTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/MammothTests.java @@ -168,6 +168,27 @@ public class MammothTests { } @Test + public void canUseCustomStyleMap() throws IOException { + assertThat( + convertToHtml("underline.docx", mammoth -> mammoth.addStyleMap("u => em")), + deepEquals(success("<p><strong>The <em>Sunset</em> Tree</strong></p>"))); + } + + @Test + public void mostRecentlyAddedStyleMapTakesPrecedence() throws IOException { + assertThat( + convertToHtml("underline.docx", mammoth -> mammoth.addStyleMap("u => em").addStyleMap("u => strong")), + deepEquals(success("<p><strong>The <strong>Sunset</strong> Tree</strong></p>"))); + } + + @Test + public void rulesFromPreviouslyAddedStyleMapsStillTakeEffectIfNotOverriden() throws IOException { + assertThat( + convertToHtml("underline.docx", mammoth -> mammoth.addStyleMap("u => em").addStyleMap("s => del")), + deepEquals(success("<p><strong>The <em>Sunset</em> Tree</strong></p>"))); + } + + @Test public void canExtractRawText() throws IOException { assertThat( Mammoth.extractRawText(TestData.file("simple-list.docx")), |
