summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-11-13 12:38:05 +0000
committerMichael Williamson <mike@zwobble.org>2016-11-13 12:38:05 +0000
commit8d07fccc0787bb043125e2f8788e550c692a2579 (patch)
tree5e53a1f289e6f3bd569d5bdf5e5ff3ddc2c7ce1a /src
parent4ddf138fd09099819ab25481515495b294b9a325 (diff)
Read embedded style maps
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/InternalDocumentConverter.java12
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtmlOptions.java12
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/EmbeddedStyleMap.java23
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/styles/StyleMap.java21
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/MammothTests.java8
-rw-r--r--src/test/resources/test-data/embedded-style-map.docxbin0 -> 49709 bytes
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
new file mode 100644
index 0000000..bb0a5e2
--- /dev/null
+++ b/src/test/resources/test-data/embedded-style-map.docx
Binary files differ