diff options
| author | Michael Williamson <mike@zwobble.org> | 2017-11-03 16:42:20 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2017-11-03 16:42:20 +0000 |
| commit | bd7b2c824134447145daa49717930a9a50a56aab (patch) | |
| tree | 90525f65a78bd0b84b642f36b5ca82aa52d4c4fe /src | |
| parent | 88190179bfdea131cc92ad2d208e92db2d651acc (diff) | |
Read table style applied to tables
Diffstat (limited to 'src')
5 files changed, 86 insertions, 20 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/documents/Table.java b/src/main/java/org/zwobble/mammoth/internal/documents/Table.java index 031b382..c58808c 100644 --- a/src/main/java/org/zwobble/mammoth/internal/documents/Table.java +++ b/src/main/java/org/zwobble/mammoth/internal/documents/Table.java @@ -1,14 +1,21 @@ package org.zwobble.mammoth.internal.documents; import java.util.List; +import java.util.Optional; public class Table implements DocumentElement, HasChildren { + private final Optional<Style> style; private final List<DocumentElement> children; - public Table(List<DocumentElement> children) { + public Table(Optional<Style> style, List<DocumentElement> children) { + this.style = style; this.children = children; } + public Optional<Style> getStyle() { + return style; + } + @Override public List<DocumentElement> getChildren() { return children; diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java index 464884a..f6a9863 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java @@ -338,9 +338,18 @@ class StatefulBodyXmlReader { } private ReadResult readTable(XmlElement element) { - return readElements(element.getChildren()) - .flatMap(this::calculateRowspans) - .map(Table::new); + XmlElementLike properties = element.findChildOrEmpty("w:tblPr"); + return ReadResult.map( + readTableStyle(properties), + readElements(element.getChildren()) + .flatMap(this::calculateRowspans), + + Table::new + ); + } + + private InternalResult<Optional<Style>> readTableStyle(XmlElementLike properties) { + return readStyle(properties, "w:tblStyle", "Table", styles::findTableStyleById); } private ReadResult calculateRowspans(List<DocumentElement> rows) { 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 6155f5a..7b12085 100644 --- a/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java @@ -240,7 +240,7 @@ public class DocumentToHtmlTests { @Test public void tableIsConvertedToHtmlTable() { assertThat( - convertToHtml(new Table(list( + convertToHtml(table(list( tableRow(list( tableCell(withChildren(paragraphWithText("Top left"))), tableCell(withChildren(paragraphWithText("Top right"))))), @@ -260,7 +260,7 @@ public class DocumentToHtmlTests { @Test public void headerRowsAreWrappedInThead() { assertThat( - convertToHtml(new Table(list( + convertToHtml(table(list( tableRow(list(tableCell()), withIsHeader(true)), tableRow(list(tableCell()), withIsHeader(true)), tableRow(list(tableCell()), withIsHeader(false)) @@ -281,7 +281,7 @@ public class DocumentToHtmlTests { @Test public void tbodyIsOmittedIfAllRowsAreHeaders() { assertThat( - Html.stripEmpty(convertToHtml(new Table(list( + Html.stripEmpty(convertToHtml(table(list( tableRow(list(tableCell()), withIsHeader(true)) )))), @@ -296,7 +296,7 @@ public class DocumentToHtmlTests { @Test public void tableCellsAreWrittenWithColspanIfNotEqualToOne() { assertThat( - convertToHtml(new Table(list( + convertToHtml(table(list( tableRow(list( tableCell( withChildren(paragraphWithText("Top left")), @@ -316,7 +316,7 @@ public class DocumentToHtmlTests { @Test public void tableCellsAreWrittenWithRowspanIfNotEqualToOne() { assertThat( - convertToHtml(new Table(list( + convertToHtml(table(list( tableRow(list( tableCell(withRowspan(2)) )) 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 4bff04d..0289bdb 100644 --- a/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java +++ b/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java @@ -122,6 +122,10 @@ public class DocumentElementMakers { return run(withChildren(new Text(text))); } + public static Table table(List<DocumentElement> rows) { + return new Table(Optional.empty(), rows); + } + public static TableRow tableRow(List<DocumentElement> cells, Object... args) { Arguments arguments = new Arguments(args); return new TableRow(cells, arguments.get(IS_HEADER, false)); diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java index b6f8842..0695ece 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -628,13 +628,59 @@ public class BodyXmlTests { assertThat( readSuccess(bodyReader(), element), - deepEquals(new Table(list( - tableRow(list( + isTable(hasChildren( + deepEquals(tableRow(list( new TableCell(1, 1, list( paragraph() )) - )) - ))) + ))) + )) + ); + } + + @Test + public void tableHasNoStyleIfItHasNoProperties() { + XmlElement element = element("w:tbl"); + assertThat( + readSuccess(bodyReader(), element), + hasStyle(Optional.empty()) + ); + } + + @Test + public void whenTableHasStyleIdInStylesThenStyleNameIsReadFromStyles() { + XmlElement element = element("w:tbl", list( + element("w:tblPr", list( + element("w:tblStyle", map("w:val", "TableNormal")) + )) + )); + + Style style = new Style("TableNormal", Optional.of("Normal Table")); + Styles styles = new Styles( + map(), + map(), + map("TableNormal", style) + ); + assertThat( + readSuccess(bodyReader(styles), element), + hasStyle(Optional.of(style)) + ); + } + + @Test + public void warningIsEmittedWhenTableStyleCannotBeFound() { + XmlElement element = element("w:tbl", list( + element("w:tblPr", list( + element("w:tblStyle", map("w:val", "TableNormal")) + )) + )); + + assertThat( + read(bodyReader(), element), + isInternalResult( + hasStyle(Optional.of(new Style("TableNormal", Optional.empty()))), + list("Table style with ID TableNormal was referenced but not defined in the document") + ) ); } @@ -670,7 +716,7 @@ public class BodyXmlTests { assertThat( readSuccess(bodyReader(), element), - deepEquals(new Table(list( + deepEquals(table(list( tableRow(list( new TableCell(1, 2, list( paragraph() @@ -692,7 +738,7 @@ public class BodyXmlTests { assertThat( readSuccess(bodyReader(), element), - deepEquals(new Table(list( + deepEquals(table(list( tableRow(list(new TableCell(1, 1, list()))), tableRow(list(new TableCell(3, 1, list()))), tableRow(list()), @@ -711,7 +757,7 @@ public class BodyXmlTests { assertThat( readSuccess(bodyReader(), element), - deepEquals(new Table(list( + deepEquals(table(list( tableRow(list(new TableCell(2, 1, list()))), tableRow(list()) ))) @@ -729,7 +775,7 @@ public class BodyXmlTests { assertThat( readSuccess(bodyReader(), element), - deepEquals(new Table(list( + deepEquals(table(list( tableRow(list(new TableCell(1, 1, list()), new TableCell(1, 1, list()), new TableCell(3, 1, list()))), tableRow(list(new TableCell(1, 2, list()))), tableRow(list(new TableCell(1, 1, list()), new TableCell(1, 1, list()))), @@ -747,7 +793,7 @@ public class BodyXmlTests { assertThat( readSuccess(bodyReader(), element), - deepEquals(new Table(list( + deepEquals(table(list( tableRow(list(new TableCell(1, 2, list()), new TableCell(1, 1, list()))), tableRow(list(new TableCell(1, 1, list()), new TableCell(1, 1, list()))) ))) @@ -763,7 +809,7 @@ public class BodyXmlTests { assertThat( read(bodyReader(), element), isInternalResult( - deepEquals(new Table(list(paragraph()))), + deepEquals(table(list(paragraph()))), list("unexpected non-row element in table, cell merging may be incorrect") ) ); @@ -778,7 +824,7 @@ public class BodyXmlTests { assertThat( read(bodyReader(), element), isInternalResult( - deepEquals(new Table(list(tableRow(list(paragraph()))))), + deepEquals(table(list(tableRow(list(paragraph()))))), list("unexpected non-cell element in table row, cell merging may be incorrect") ) ); |
