From f61e177abb96034353572e5c32df0a8ae671a4d5 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 20 Feb 2016 15:39:19 +0000 Subject: Produce warnings for unrecognised styles --- .../org/zwobble/mammoth/DocumentConverter.java | 11 ++++++++++- src/main/java/org/zwobble/mammoth/Mammoth.java | 12 +++++++++++- .../java/org/zwobble/mammoth/documents/Style.java | 5 +++++ .../java/org/zwobble/mammoth/styles/StyleMap.java | 9 +++++---- .../mammoth/tests/DocumentConverterTests.java | 22 +++++++++++++++++++++- .../mammoth/tests/documents/StyleTests.java | 22 ++++++++++++++++++++++ 6 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 src/test/java/org/zwobble/mammoth/tests/documents/StyleTests.java 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 visit(Paragraph paragraph) { List content = convertChildrenToHtml(paragraph); List 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 convertToHtml(File file) { return convertToHtml(file, Options.DEFAULT); } @@ -49,7 +59,7 @@ public class Mammoth { public static Result 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 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 getParagraphHtmlPath(Paragraph paragraph) { + com.google.common.base.Optional 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; @@ -68,6 +69,17 @@ public class DocumentConverterTests { deepEquals(list(Html.element("p", map("class", "tip"))))); } + @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( @@ -256,8 +268,16 @@ public class DocumentConverterTests { } private List convertToHtml(DocumentElement element, StyleMap styleMap) { - Result> result = DocumentConverter.convertToHtml("doc-42-", false, styleMap, element); + Result> result = convertToHtmlResult(element, styleMap); assertThat(result.getWarnings(), hasSize(0)); return result.getValue(); } + + private Result> convertToHtmlResult(DocumentElement element) { + return convertToHtmlResult(element, StyleMap.EMPTY); + } + + private Result> 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()); + } +} -- cgit v1.2.3