diff options
| author | Michael Williamson <mike@zwobble.org> | 2017-11-04 11:45:06 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2017-11-04 11:45:06 +0000 |
| commit | d6f00b6a57a19349de058ee17e1f963c0a972cf6 (patch) | |
| tree | f15e0558f797f20733e68714cfdf09cd195db7d7 /src | |
| parent | bd7b2c824134447145daa49717930a9a50a56aab (diff) | |
Use table style mappings during document conversion
Diffstat (limited to 'src')
6 files changed, 71 insertions, 4 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtml.java b/src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtml.java index 8b15106..3f3576f 100644 --- a/src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtml.java +++ b/src/main/java/org/zwobble/mammoth/internal/conversion/DocumentToHtml.java @@ -226,8 +226,9 @@ public class DocumentToHtml { @Override public List<HtmlNode> visit(Table table, Context context) { - List<HtmlNode> children = generateTableChildren(table, context); - return list(Html.element("table", children)); + HtmlPath mapping = styleMap.getTableHtmlPath(table) + .orElse(HtmlPath.element("table")); + return mapping.wrap(() -> generateTableChildren(table, context)).get(); } private List<HtmlNode> generateTableChildren(Table table, Context context) { 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 7959acb..2b1d19a 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,7 @@ package org.zwobble.mammoth.internal.styles; import org.zwobble.mammoth.internal.documents.Break; import org.zwobble.mammoth.internal.documents.Paragraph; import org.zwobble.mammoth.internal.documents.Run; +import org.zwobble.mammoth.internal.documents.Table; import org.zwobble.mammoth.internal.util.Lists; import org.zwobble.mammoth.internal.util.Optionals; @@ -27,6 +28,7 @@ public class StyleMap { Optionals.first(high.commentReference, low.commentReference), Lists.eagerConcat(high.paragraphStyles, low.paragraphStyles), Lists.eagerConcat(high.runStyles, low.runStyles), + Lists.eagerConcat(high.tableStyles, low.tableStyles), Lists.eagerConcat(high.breakStyles, low.breakStyles) ); } @@ -41,6 +43,7 @@ public class StyleMap { private final Optional<HtmlPath> commentReference; private final List<StyleMapping<Paragraph>> paragraphStyles; private final List<StyleMapping<Run>> runStyles; + private final List<StyleMapping<Table>> tableStyles; private final List<StyleMapping<Break>> breakStyles; public StyleMap( @@ -52,6 +55,7 @@ public class StyleMap { Optional<HtmlPath> commentReference, List<StyleMapping<Paragraph>> paragraphStyles, List<StyleMapping<Run>> runStyles, + List<StyleMapping<Table>> tableStyles, List<StyleMapping<Break>> breakStyles ) { @@ -63,6 +67,7 @@ public class StyleMap { this.commentReference = commentReference; this.paragraphStyles = paragraphStyles; this.runStyles = runStyles; + this.tableStyles = tableStyles; this.breakStyles = breakStyles; } @@ -105,6 +110,11 @@ public class StyleMap { .map(StyleMapping::getHtmlPath); } + public Optional<HtmlPath> getTableHtmlPath(Table table) { + return tryFind(tableStyles, styleMapping -> styleMapping.matches(table)) + .map(StyleMapping::getHtmlPath); + } + public Optional<HtmlPath> getBreakHtmlPath(Break breakElement) { return tryFind(breakStyles, styleMapping -> styleMapping.matches(breakElement)) .map(StyleMapping::getHtmlPath); 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 4e6e27b..dbd4fa8 100644 --- a/src/main/java/org/zwobble/mammoth/internal/styles/StyleMapBuilder.java +++ b/src/main/java/org/zwobble/mammoth/internal/styles/StyleMapBuilder.java @@ -3,6 +3,7 @@ package org.zwobble.mammoth.internal.styles; import org.zwobble.mammoth.internal.documents.Break; import org.zwobble.mammoth.internal.documents.Paragraph; import org.zwobble.mammoth.internal.documents.Run; +import org.zwobble.mammoth.internal.documents.Table; import java.util.ArrayList; import java.util.List; @@ -17,6 +18,7 @@ public class StyleMapBuilder { private Optional<HtmlPath> commentReference; private final List<StyleMapping<Paragraph>> paragraphStyles = new ArrayList<>(); private final List<StyleMapping<Run>> runStyles = new ArrayList<>(); + private final List<StyleMapping<Table>> tableStyles = new ArrayList<>(); private final List<StyleMapping<Break>> breakStyles = new ArrayList<>(); public StyleMapBuilder() { @@ -68,6 +70,11 @@ public class StyleMapBuilder { return this; } + public StyleMapBuilder mapTable(TableMatcher matcher, HtmlPath path) { + tableStyles.add(new StyleMapping<>(matcher, path)); + return this; + } + public StyleMapBuilder mapBreak(BreakMatcher matcher, HtmlPath path) { breakStyles.add(new StyleMapping<>(matcher, path)); return this; @@ -83,6 +90,7 @@ public class StyleMapBuilder { commentReference, paragraphStyles, runStyles, + tableStyles, breakStyles ); } diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/TableMatcher.java b/src/main/java/org/zwobble/mammoth/internal/styles/TableMatcher.java new file mode 100644 index 0000000..7dbba82 --- /dev/null +++ b/src/main/java/org/zwobble/mammoth/internal/styles/TableMatcher.java @@ -0,0 +1,30 @@ +package org.zwobble.mammoth.internal.styles; + +import org.zwobble.mammoth.internal.documents.Table; + +import java.util.Optional; + +public class TableMatcher implements DocumentElementMatcher<Table> { + public static final TableMatcher ANY = new TableMatcher(Optional.empty(), Optional.empty()); + + public static TableMatcher styleId(String styleId) { + return new TableMatcher(Optional.of(styleId), Optional.empty()); + } + + public static TableMatcher styleName(String styleName) { + return new TableMatcher(Optional.empty(), Optional.of(new EqualToStringMatcher(styleName))); + } + + private final Optional<String> styleId; + private final Optional<StringMatcher> styleName; + + public TableMatcher(Optional<String> styleId, Optional<StringMatcher> styleName) { + this.styleId = styleId; + this.styleName = styleName; + } + + @Override + public boolean matches(Table table) { + return DocumentElementMatching.matchesStyle(styleId, styleName, table.getStyle()); + } +} diff --git a/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java b/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java index 7b12085..123bd8e 100644 --- a/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java @@ -258,6 +258,23 @@ public class DocumentToHtmlTests { } @Test + public void tableStyleMappingsCanBeUsedToMapTables() { + assertThat( + convertToHtml( + table(list(), withStyle(new Style("TableNormal", Optional.of("Normal Table")))), + StyleMap.builder() + .mapTable( + TableMatcher.styleName("Normal Table"), + HtmlPath.element("table", map("class", "normal-table")) + ) + .build() + ), + + deepEquals(list(Html.element("table", map("class", "normal-table")))) + ); + } + + @Test public void headerRowsAreWrappedInThead() { assertThat( convertToHtml(table(list( diff --git a/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java b/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java index 0289bdb..f206640 100644 --- a/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java +++ b/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java @@ -122,8 +122,9 @@ public class DocumentElementMakers { return run(withChildren(new Text(text))); } - public static Table table(List<DocumentElement> rows) { - return new Table(Optional.empty(), rows); + public static Table table(List<DocumentElement> rows, Object... args) { + Arguments arguments = new Arguments(args); + return new Table(arguments.get(STYLE, Optional.empty()), rows); } public static TableRow tableRow(List<DocumentElement> cells, Object... args) { |
