aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2017-11-03 16:42:20 +0000
committerMichael Williamson <mike@zwobble.org>2017-11-03 16:42:20 +0000
commitbd7b2c824134447145daa49717930a9a50a56aab (patch)
tree90525f65a78bd0b84b642f36b5ca82aa52d4c4fe
parent88190179bfdea131cc92ad2d208e92db2d651acc (diff)
Read table style applied to tables
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/documents/Table.java9
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java15
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java10
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java4
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java68
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")
)
);