From 8dd12c1ca7703a085b57fe4c5c35ef6e19d92134 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 24 Feb 2016 09:04:14 +0000 Subject: Allow style maps to be added --- src/main/java/org/zwobble/mammoth/Mammoth.java | 6 +++++- .../mammoth/internal/DocumentConverter.java | 4 ++-- .../mammoth/internal/DocumentToHtmlOptions.java | 9 +++++++-- .../zwobble/mammoth/internal/styles/StyleMap.java | 23 ++++++++++++++++------ .../mammoth/internal/styles/StyleMapBuilder.java | 14 +++++++------ .../mammoth/internal/util/MammothOptionals.java | 8 ++++++++ 6 files changed, 47 insertions(+), 17 deletions(-) (limited to 'src/main/java') 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 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 visit(Run run) { List 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 underline; + private final Optional strikethrough; private final List> paragraphStyles; private final List> runStyles; public StyleMap( - HtmlPath underline, - HtmlPath strikethrough, + Optional underline, + Optional strikethrough, List> paragraphStyles, List> 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 getUnderline() { return underline; } - public HtmlPath getStrikethrough() { + public Optional 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 underline; + private Optional strikethrough; private final ImmutableList.Builder> paragraphStyles = ImmutableList.builder(); private final ImmutableList.Builder> 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 Optional first(Optional first, Optional second) { + if (first.isPresent()) { + return first; + } else { + return second; + } + } + public static Optional flatMap( Optional first, Optional second, -- cgit v1.2.3