diff options
6 files changed, 66 insertions, 10 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/InternalDocumentConverter.java b/src/main/java/org/zwobble/mammoth/internal/InternalDocumentConverter.java index 0e829ea..3966b51 100644 --- a/src/main/java/org/zwobble/mammoth/internal/InternalDocumentConverter.java +++ b/src/main/java/org/zwobble/mammoth/internal/InternalDocumentConverter.java @@ -7,10 +7,13 @@ import org.zwobble.mammoth.internal.documents.HasChildren; import org.zwobble.mammoth.internal.documents.Paragraph; import org.zwobble.mammoth.internal.documents.Text; import org.zwobble.mammoth.internal.docx.DocxFile; +import org.zwobble.mammoth.internal.docx.EmbeddedStyleMap; import org.zwobble.mammoth.internal.docx.InMemoryDocxFile; import org.zwobble.mammoth.internal.docx.ZippedDocxFile; import org.zwobble.mammoth.internal.html.Html; import org.zwobble.mammoth.internal.results.InternalResult; +import org.zwobble.mammoth.internal.styles.StyleMap; +import org.zwobble.mammoth.internal.styles.parsing.StyleMapParser; import org.zwobble.mammoth.internal.util.PassThroughException; import java.io.File; @@ -46,13 +49,20 @@ public class InternalDocumentConverter { } private InternalResult<String> convertToHtml(Optional<Path> path, DocxFile zipFile) { + Optional<StyleMap> styleMap = readEmbeddedStyleMap(zipFile).map(StyleMapParser::parse); + DocumentToHtmlOptions conversionOptions = styleMap.map(options::addEmbeddedStyleMap).orElse(options); + return readDocument(path, zipFile) - .flatMap(nodes -> DocumentToHtml.convertToHtml(nodes, options)) + .flatMap(nodes -> DocumentToHtml.convertToHtml(nodes, conversionOptions)) .map(Html::stripEmpty) .map(Html::collapse) .map(Html::write); } + private Optional<String> readEmbeddedStyleMap(DocxFile zipFile) { + return PassThroughException.wrap(() -> EmbeddedStyleMap.readStyleMap(zipFile)); + } + public InternalResult<String> extractRawText(InputStream stream) throws IOException { return PassThroughException.unwrap(() -> withDocxFile(stream, zipFile -> diff --git a/src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtmlOptions.java b/src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtmlOptions.java index 2de828d..1133018 100644 --- a/src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtmlOptions.java +++ b/src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtmlOptions.java @@ -32,13 +32,21 @@ public class DocumentToHtmlOptions { } public DocumentToHtmlOptions addStyleMap(StyleMap styleMap) { - return new DocumentToHtmlOptions(idPrefix, preserveEmptyParagraphs, this.styleMap.update(styleMap), disableDefaultStyleMap); + return withStyleMap(this.styleMap.update(styleMap)); } public DocumentToHtmlOptions disableDefaultStyleMap() { return new DocumentToHtmlOptions(idPrefix, preserveEmptyParagraphs, styleMap, true); } + public DocumentToHtmlOptions addEmbeddedStyleMap(StyleMap embeddedStyleMap) { + return withStyleMap(StyleMap.merge(styleMap, embeddedStyleMap)); + } + + private DocumentToHtmlOptions withStyleMap(StyleMap styleMap) { + return new DocumentToHtmlOptions(idPrefix, preserveEmptyParagraphs, styleMap, disableDefaultStyleMap); + } + public String idPrefix() { return idPrefix; } @@ -50,4 +58,6 @@ public class DocumentToHtmlOptions { public StyleMap styleMap() { return disableDefaultStyleMap ? styleMap : DefaultStyles.DEFAULT_STYLE_MAP.update(styleMap); } + + } diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/EmbeddedStyleMap.java b/src/main/java/org/zwobble/mammoth/internal/docx/EmbeddedStyleMap.java new file mode 100644 index 0000000..306ae99 --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/internal/docx/EmbeddedStyleMap.java @@ -0,0 +1,23 @@ +package org.zwobble.mammoth.internal.docx; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Optional; +import java.util.stream.Collectors; + +public class EmbeddedStyleMap { + private static final String PATH = "mammoth/style-map"; + + public static Optional<String> readStyleMap(DocxFile file) throws IOException { + return file.tryGetInputStream(PATH) + .map(inputStream -> readInputStream(inputStream)); + } + + private static String readInputStream(InputStream inputStream) { + return new BufferedReader(new InputStreamReader(inputStream)) + .lines() + .collect(Collectors.joining("\n")); + } +} 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 c587483..f2222a9 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/StyleMap.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/StyleMap.java @@ -15,6 +15,18 @@ public class StyleMap { return new StyleMapBuilder(); } + public static StyleMap merge(StyleMap high, StyleMap low) { + // TODO: add appropriate tests + return new StyleMap( + Optionals.first(high.bold, low.bold), + Optionals.first(high.italic, low.italic), + Optionals.first(high.underline, low.underline), + Optionals.first(high.strikethrough, low.strikethrough), + Optionals.first(high.commentReference, low.commentReference), + Lists.eagerConcat(high.paragraphStyles, low.paragraphStyles), + Lists.eagerConcat(high.runStyles, low.runStyles)); + } + public static final StyleMap EMPTY = new StyleMapBuilder().build(); private final Optional<HtmlPath> bold; @@ -45,14 +57,7 @@ public class StyleMap { public StyleMap update(StyleMap styleMap) { // TODO: add appropriate tests - return new StyleMap( - Optionals.first(styleMap.bold, bold), - Optionals.first(styleMap.italic, italic), - Optionals.first(styleMap.underline, underline), - Optionals.first(styleMap.strikethrough, strikethrough), - Optionals.first(styleMap.commentReference, commentReference), - Lists.eagerConcat(styleMap.paragraphStyles, paragraphStyles), - Lists.eagerConcat(styleMap.runStyles, runStyles)); + return merge(styleMap, this); } public Optional<HtmlPath> getBold() { diff --git a/src/test/java/org/zwobble/mammoth/tests/MammothTests.java b/src/test/java/org/zwobble/mammoth/tests/MammothTests.java index fff4cb3..665e00a 100644 --- a/src/test/java/org/zwobble/mammoth/tests/MammothTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/MammothTests.java @@ -227,6 +227,14 @@ public class MammothTests { } @Test + public void embeddedStyleMapIsUsedIfPresent() throws IOException { + assertThat( + convertToHtml("embedded-style-map.docx"), + isSuccess("<h1>Walking on imported air</h1>") + ); + } + + @Test public void canExtractRawTextFromFile() throws IOException { assertThat( new DocumentConverter().extractRawText(TestData.file("simple-list.docx")), diff --git a/src/test/resources/test-data/embedded-style-map.docx b/src/test/resources/test-data/embedded-style-map.docx Binary files differnew file mode 100644 index 0000000..bb0a5e2 --- /dev/null +++ b/src/test/resources/test-data/embedded-style-map.docx |
