From 370df4d36053736446e9334008d012ebda5f86bb Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 20 May 2017 15:37:34 +0100 Subject: Read whether row is header --- .../mammoth/internal/documents/TableRow.java | 8 +++- .../internal/docx/StatefulBodyXmlReader.java | 12 ++++- .../tests/conversion/DocumentToHtmlTests.java | 8 ++-- .../tests/documents/DocumentElementMakers.java | 4 ++ .../zwobble/mammoth/tests/docx/BodyXmlTests.java | 52 +++++++++++++++------- .../mammoth/tests/docx/DocumentMatchers.java | 14 ++++++ 6 files changed, 75 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/main/java/org/zwobble/mammoth/internal/documents/TableRow.java b/src/main/java/org/zwobble/mammoth/internal/documents/TableRow.java index 9450c88..f00ec58 100644 --- a/src/main/java/org/zwobble/mammoth/internal/documents/TableRow.java +++ b/src/main/java/org/zwobble/mammoth/internal/documents/TableRow.java @@ -4,9 +4,11 @@ import java.util.List; public class TableRow implements DocumentElement, HasChildren { private final List children; + private final boolean isHeader; - public TableRow(List children) { + public TableRow(List children, boolean isHeader) { this.children = children; + this.isHeader = isHeader; } @Override @@ -18,4 +20,8 @@ public class TableRow implements DocumentElement, HasChildren { public T accept(DocumentElementVisitor visitor) { return visitor.visit(this); } + + public boolean isHeader() { + return isHeader; + } } 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 f726a29..76ea8ea 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/StatefulBodyXmlReader.java @@ -95,7 +95,7 @@ class StatefulBodyXmlReader { case "w:tbl": return readTable(element); case "w:tr": - return readElements(element.getChildren()).map(TableRow::new); + return readTableRow(element); case "w:tc": return readTableCell(element); @@ -150,6 +150,7 @@ class StatefulBodyXmlReader { case "w:rPr": case "w:tblPr": case "w:tblGrid": + case "w:trPr": case "w:tcPr": return EMPTY_SUCCESS; @@ -378,7 +379,7 @@ class StatefulBodyXmlReader { } } - return new TableRow(mergedCells); + return new TableRow(mergedCells, row.isHeader()); })); } @@ -398,6 +399,13 @@ class StatefulBodyXmlReader { return Optional.empty(); } + private ReadResult readTableRow(XmlElement element) { + XmlElementLike properties = element.findChildOrEmpty("w:trPr"); + boolean isHeader = properties.hasChild("w:tblHeader"); + return readElements(element.getChildren()) + .map(children -> new TableRow(children, isHeader)); + } + private ReadResult readTableCell(XmlElement element) { XmlElementLike properties = element.findChildOrEmpty("w:tcPr"); Optional gridSpan = properties 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 689b5f6..038056c 100644 --- a/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java @@ -224,10 +224,10 @@ public class DocumentToHtmlTests { public void tableIsConvertedToHtmlTable() { assertThat( convertToHtml(new Table(list( - new TableRow(list( + tableRow(list( tableCell(withChildren(paragraphWithText("Top left"))), tableCell(withChildren(paragraphWithText("Top right"))))), - new TableRow(list( + tableRow(list( tableCell(withChildren(paragraphWithText("Bottom left"))), tableCell(withChildren(paragraphWithText("Bottom right")))))))), @@ -244,7 +244,7 @@ public class DocumentToHtmlTests { public void tableCellsAreWrittenWithColspanIfNotEqualToOne() { assertThat( convertToHtml(new Table(list( - new TableRow(list( + tableRow(list( tableCell( withChildren(paragraphWithText("Top left")), withColspan(2) @@ -264,7 +264,7 @@ public class DocumentToHtmlTests { public void tableCellsAreWrittenWithRowspanIfNotEqualToOne() { assertThat( convertToHtml(new Table(list( - new TableRow(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 ed00729..560eb54 100644 --- a/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java +++ b/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java @@ -108,6 +108,10 @@ public class DocumentElementMakers { return run(withChildren(new Text(text))); } + public static TableRow tableRow(List cells) { + return new TableRow(cells, false); + } + public static TableCell tableCell(Object... args) { Arguments arguments = new Arguments(args); return new TableCell( 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 2eaa16f..e363983 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -593,7 +593,7 @@ public class BodyXmlTests { assertThat( readSuccess(bodyReader(), element), deepEquals(new Table(list( - new TableRow(list( + tableRow(list( new TableCell(1, 1, list( paragraph() )) @@ -602,6 +602,26 @@ public class BodyXmlTests { ); } + @Test + public void tblHeaderMarksTableRowAsHeader() { + XmlElement element = element("w:tbl", list( + element("w:tr", list( + element("w:trPr", list( + element("w:tblHeader") + )) + )), + element("w:tr") + )); + + assertThat( + readSuccess(bodyReader(), element), + isTable(hasChildren( + isRow(isHeader(true)), + isRow(isHeader(false)) + )) + ); + } + @Test public void gridspanIsReadAsColspanForTableCell() { XmlElement element = element("w:tbl", list( @@ -615,7 +635,7 @@ public class BodyXmlTests { assertThat( readSuccess(bodyReader(), element), deepEquals(new Table(list( - new TableRow(list( + tableRow(list( new TableCell(1, 2, list( paragraph() )) @@ -637,11 +657,11 @@ public class BodyXmlTests { assertThat( readSuccess(bodyReader(), element), deepEquals(new Table(list( - new TableRow(list(new TableCell(1, 1, list()))), - new TableRow(list(new TableCell(3, 1, list()))), - new TableRow(list()), - new TableRow(list()), - new TableRow(list(new TableCell(1, 1, list()))) + tableRow(list(new TableCell(1, 1, list()))), + tableRow(list(new TableCell(3, 1, list()))), + tableRow(list()), + tableRow(list()), + tableRow(list(new TableCell(1, 1, list()))) ))) ); } @@ -656,8 +676,8 @@ public class BodyXmlTests { assertThat( readSuccess(bodyReader(), element), deepEquals(new Table(list( - new TableRow(list(new TableCell(2, 1, list()))), - new TableRow(list()) + tableRow(list(new TableCell(2, 1, list()))), + tableRow(list()) ))) ); } @@ -674,10 +694,10 @@ public class BodyXmlTests { assertThat( readSuccess(bodyReader(), element), deepEquals(new Table(list( - new TableRow(list(new TableCell(1, 1, list()), new TableCell(1, 1, list()), new TableCell(3, 1, list()))), - new TableRow(list(new TableCell(1, 2, list()))), - new TableRow(list(new TableCell(1, 1, list()), new TableCell(1, 1, list()))), - new TableRow(list(new TableCell(1, 1, list()), new TableCell(1, 1, list()), new TableCell(1, 1, 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()))), + tableRow(list(new TableCell(1, 1, list()), new TableCell(1, 1, list()), new TableCell(1, 1, list()))) ))) ); } @@ -692,8 +712,8 @@ public class BodyXmlTests { assertThat( readSuccess(bodyReader(), element), deepEquals(new Table(list( - new TableRow(list(new TableCell(1, 2, list()), new TableCell(1, 1, list()))), - new TableRow(list(new TableCell(1, 1, list()), new TableCell(1, 1, 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()))) ))) ); } @@ -722,7 +742,7 @@ public class BodyXmlTests { assertThat( read(bodyReader(), element), isInternalResult( - deepEquals(new Table(list(new TableRow(list(paragraph()))))), + deepEquals(new Table(list(tableRow(list(paragraph()))))), list("unexpected non-cell element in table row, cell merging may be incorrect") ) ); diff --git a/src/test/java/org/zwobble/mammoth/tests/docx/DocumentMatchers.java b/src/test/java/org/zwobble/mammoth/tests/docx/DocumentMatchers.java index d2718b7..8ecb902 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/DocumentMatchers.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/DocumentMatchers.java @@ -46,6 +46,20 @@ public class DocumentMatchers { return cast(Run.class, allOf(matchers)); } + @SafeVarargs + static Matcher isTable(Matcher... matchers) { + return cast(Table.class, allOf(matchers)); + } + + @SafeVarargs + static Matcher isRow(Matcher... matchers) { + return cast(TableRow.class, allOf(matchers)); + } + + static Matcher isHeader(boolean isHeader) { + return hasProperty("header", equalTo(isHeader)); + } + private static Matcher cast(Class clazz, Matcher downcastMatcher) { return new TypeSafeDiagnosingMatcher() { @Override -- cgit v1.2.3