aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/mammoth/DocumentConverter.java11
-rw-r--r--src/main/java/org/zwobble/mammoth/Mammoth.java12
-rw-r--r--src/main/java/org/zwobble/mammoth/documents/Style.java5
-rw-r--r--src/main/java/org/zwobble/mammoth/styles/StyleMap.java9
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java22
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/documents/StyleTests.java22
6 files changed, 74 insertions, 7 deletions
diff --git a/src/main/java/org/zwobble/mammoth/DocumentConverter.java b/src/main/java/org/zwobble/mammoth/DocumentConverter.java
index 294e403..5cf8c9d 100644
--- a/src/main/java/org/zwobble/mammoth/DocumentConverter.java
+++ b/src/main/java/org/zwobble/mammoth/DocumentConverter.java
@@ -9,6 +9,7 @@ import org.zwobble.mammoth.html.Html;
import org.zwobble.mammoth.html.HtmlNode;
import org.zwobble.mammoth.results.Result;
import org.zwobble.mammoth.results.Warning;
+import org.zwobble.mammoth.styles.HtmlPath;
import org.zwobble.mammoth.styles.StyleMap;
import org.zwobble.mammoth.util.MammothLists;
@@ -18,6 +19,7 @@ import java.util.Base64;
import java.util.List;
import java.util.Map;
+import static org.zwobble.mammoth.results.Warning.warning;
import static org.zwobble.mammoth.util.MammothLists.*;
import static org.zwobble.mammoth.util.MammothMaps.map;
@@ -98,7 +100,14 @@ public class DocumentConverter {
public List<HtmlNode> visit(Paragraph paragraph) {
List<HtmlNode> content = convertChildrenToHtml(paragraph);
List<HtmlNode> children = preserveEmptyParagraphs ? cons(Html.FORCE_WRITE, content) : content;
- return styleMap.getParagraphStyleMapping(paragraph).wrap(children);
+ HtmlPath mapping = styleMap.getParagraphHtmlPath(paragraph)
+ .orElseGet(() -> {
+ if (paragraph.getStyle().isPresent()) {
+ warnings.add(warning("Unrecognised paragraph style: " + paragraph.getStyle().get().describe()));
+ }
+ return HtmlPath.element("p");
+ });
+ return mapping.wrap(children);
}
@Override
diff --git a/src/main/java/org/zwobble/mammoth/Mammoth.java b/src/main/java/org/zwobble/mammoth/Mammoth.java
index b6bba55..4421a17 100644
--- a/src/main/java/org/zwobble/mammoth/Mammoth.java
+++ b/src/main/java/org/zwobble/mammoth/Mammoth.java
@@ -10,6 +10,8 @@ import org.zwobble.mammoth.docx.DocxFile;
import org.zwobble.mammoth.docx.ZippedDocxFile;
import org.zwobble.mammoth.html.Html;
import org.zwobble.mammoth.results.Result;
+import org.zwobble.mammoth.styles.HtmlPath;
+import org.zwobble.mammoth.styles.ParagraphMatcher;
import org.zwobble.mammoth.styles.StyleMap;
import org.zwobble.mammoth.util.Casts;
@@ -42,6 +44,14 @@ public class Mammoth {
}
}
+ private static final StyleMap DEFAULT_STYLE_MAP = StyleMap.builder()
+ .mapParagraph(ParagraphMatcher.styleName("footnote text"), HtmlPath.element("p"))
+ .mapParagraph(ParagraphMatcher.styleName("endnote text"), HtmlPath.element("p"))
+ .mapParagraph(ParagraphMatcher.styleName("Footnote"), HtmlPath.element("p"))
+ .mapParagraph(ParagraphMatcher.styleName("Endnote"), HtmlPath.element("p"))
+ .mapParagraph(ParagraphMatcher.styleName("Normal"), HtmlPath.element("p"))
+ .build();
+
public static Result<String> convertToHtml(File file) {
return convertToHtml(file, Options.DEFAULT);
}
@@ -49,7 +59,7 @@ public class Mammoth {
public static Result<String> convertToHtml(File file, Options options) {
return withDocxFile(file, zipFile ->
readDocument(zipFile)
- .flatMap(nodes -> DocumentConverter.convertToHtml(options.idPrefix, options.preserveEmptyParagraphs, StyleMap.EMPTY, nodes))
+ .flatMap(nodes -> DocumentConverter.convertToHtml(options.idPrefix, options.preserveEmptyParagraphs, DEFAULT_STYLE_MAP, nodes))
.map(Html::stripEmpty)
.map(Html::collapse)
.map(Html::write));
diff --git a/src/main/java/org/zwobble/mammoth/documents/Style.java b/src/main/java/org/zwobble/mammoth/documents/Style.java
index 82a25de..2ce6edf 100644
--- a/src/main/java/org/zwobble/mammoth/documents/Style.java
+++ b/src/main/java/org/zwobble/mammoth/documents/Style.java
@@ -18,4 +18,9 @@ public class Style {
public Optional<String> getName() {
return name;
}
+
+ public String describe() {
+ String styleIdDescription = "Style ID: " + styleId;
+ return this.name.map(name -> name + " (" + styleIdDescription + ")").orElse(styleIdDescription);
+ }
}
diff --git a/src/main/java/org/zwobble/mammoth/styles/StyleMap.java b/src/main/java/org/zwobble/mammoth/styles/StyleMap.java
index e498246..7aae7df 100644
--- a/src/main/java/org/zwobble/mammoth/styles/StyleMap.java
+++ b/src/main/java/org/zwobble/mammoth/styles/StyleMap.java
@@ -4,6 +4,7 @@ import com.google.common.collect.Iterables;
import org.zwobble.mammoth.documents.Paragraph;
import java.util.List;
+import java.util.Optional;
public class StyleMap {
public static StyleMapBuilder builder() {
@@ -30,9 +31,9 @@ public class StyleMap {
return strikethrough;
}
- public HtmlPath getParagraphStyleMapping(Paragraph paragraph) {
- return Iterables.tryFind(paragraphStyles, styleMapping -> styleMapping.matches(paragraph))
- .transform(StyleMapping::getHtmlPath)
- .or(HtmlPath.element("p"));
+ public Optional<HtmlPath> getParagraphHtmlPath(Paragraph paragraph) {
+ com.google.common.base.Optional<StyleMapping> mapping = Iterables.tryFind(paragraphStyles, styleMapping -> styleMapping.matches(paragraph));
+ return Optional.ofNullable(mapping.orNull())
+ .map(StyleMapping::getHtmlPath);
}
}
diff --git a/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java b/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java
index 429df1e..bc37ad9 100644
--- a/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/DocumentConverterTests.java
@@ -20,6 +20,7 @@ import static org.hamcrest.Matchers.*;
import static org.zwobble.mammoth.documents.VerticalAlignment.SUBSCRIPT;
import static org.zwobble.mammoth.documents.VerticalAlignment.SUPERSCRIPT;
import static org.zwobble.mammoth.results.Result.success;
+import static org.zwobble.mammoth.results.Warning.warning;
import static org.zwobble.mammoth.tests.DeepReflectionMatcher.deepEquals;
import static org.zwobble.mammoth.tests.documents.DocumentElementMakers.*;
import static org.zwobble.mammoth.util.MammothLists.list;
@@ -69,6 +70,17 @@ public class DocumentConverterTests {
}
@Test
+ public void warningIfParagraphHasUnrecognisedStyle() {
+ assertThat(
+ convertToHtmlResult(
+ make(a(PARAGRAPH, with(STYLE, Optional.of(new Style("TipsParagraph", Optional.of("Tips Paragraph"))))))),
+
+ deepEquals(new Result<>(
+ list(Html.element("p")),
+ list(warning("Unrecognised paragraph style: Tips Paragraph (Style ID: TipsParagraph)")))));
+ }
+
+ @Test
public void boldRunsAreWrappedInStrongTags() {
assertThat(
convertToHtml(make(a(RUN, with(BOLD, true), with(CHILDREN, list(new Text("Hello")))))),
@@ -256,8 +268,16 @@ public class DocumentConverterTests {
}
private List<HtmlNode> convertToHtml(DocumentElement element, StyleMap styleMap) {
- Result<List<HtmlNode>> result = DocumentConverter.convertToHtml("doc-42-", false, styleMap, element);
+ Result<List<HtmlNode>> result = convertToHtmlResult(element, styleMap);
assertThat(result.getWarnings(), hasSize(0));
return result.getValue();
}
+
+ private Result<List<HtmlNode>> convertToHtmlResult(DocumentElement element) {
+ return convertToHtmlResult(element, StyleMap.EMPTY);
+ }
+
+ private Result<List<HtmlNode>> convertToHtmlResult(DocumentElement element, StyleMap styleMap) {
+ return DocumentConverter.convertToHtml("doc-42-", false, styleMap, element);
+ }
}
diff --git a/src/test/java/org/zwobble/mammoth/tests/documents/StyleTests.java b/src/test/java/org/zwobble/mammoth/tests/documents/StyleTests.java
new file mode 100644
index 0000000..68b07c6
--- /dev/null
+++ b/src/test/java/org/zwobble/mammoth/tests/documents/StyleTests.java
@@ -0,0 +1,22 @@
+package org.zwobble.mammoth.tests.documents;
+
+import org.junit.Test;
+import org.zwobble.mammoth.documents.Style;
+
+import java.util.Optional;
+
+import static org.junit.Assert.assertEquals;
+
+public class StyleTests {
+ @Test
+ public void descriptionOfStyleIncludesBothIdAndNameIfPresent() {
+ Style style = new Style("Heading1", Optional.of("Heading 1"));
+ assertEquals("Heading 1 (Style ID: Heading1)", style.describe());
+ }
+
+ @Test
+ public void descriptionOfStyleIsJustStyleIdIfStyleNameIsMissing() {
+ Style style = new Style("Heading1", Optional.empty());
+ assertEquals("Style ID: Heading1", style.describe());
+ }
+}