diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-05-02 12:07:36 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-05-02 12:07:36 +0100 |
| commit | 90680b0208bba24a970f8b7fd6f9092f5ca90407 (patch) | |
| tree | 4feeae49e3e130ce09c19e9b50ec8a28b6bd5ba8 | |
| parent | 3de728c3d0fecbb3fa3e9b8019941cb51a3d2867 (diff) | |
Read colspan for table cells
6 files changed, 61 insertions, 10 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/documents/TableCell.java b/src/main/java/org/zwobble/mammoth/internal/documents/TableCell.java index f0ce7be..69f8fa8 100644 --- a/src/main/java/org/zwobble/mammoth/internal/documents/TableCell.java +++ b/src/main/java/org/zwobble/mammoth/internal/documents/TableCell.java @@ -3,10 +3,16 @@ package org.zwobble.mammoth.internal.documents; import java.util.List; public class TableCell implements DocumentElement, HasChildren { + private final int colspan; private final List<DocumentElement> children; - public TableCell(List<DocumentElement> children) { + public TableCell(int colspan, List<DocumentElement> children) { this.children = children; + this.colspan = colspan; + } + + public int getColspan() { + return colspan; } @Override diff --git a/src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java b/src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java index 113578d..47034cc 100644 --- a/src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java +++ b/src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java @@ -66,7 +66,7 @@ public class BodyXmlReader { case "w:tr": return readElements(element.children()).map(TableRow::new); case "w:tc": - return readElements(element.children()).map(TableCell::new); + return readTableCell(element); case "w:hyperlink": return readHyperlink(element); @@ -231,6 +231,15 @@ public class BodyXmlReader { } } + private ReadResult readTableCell(XmlElement element) { + Optional<String> gridSpan = element + .findChildOrEmpty("w:tcPr") + .findChildOrEmpty("w:gridSpan") + .getAttributeOrNone("w:val"); + int colspan = gridSpan.map(Integer::parseInt).orElse(1); + return readElements(element.children()).map(children -> new TableCell(colspan, children)); + } + private ReadResult readHyperlink(XmlElement element) { Optional<String> relationshipId = element.getAttributeOrNone("r:id"); Optional<String> anchor = element.getAttributeOrNone("w:anchor"); diff --git a/src/test/java/org/zwobble/mammoth/tests/DeepReflectionMatcher.java b/src/test/java/org/zwobble/mammoth/tests/DeepReflectionMatcher.java index 94bd05a..26414ac 100644 --- a/src/test/java/org/zwobble/mammoth/tests/DeepReflectionMatcher.java +++ b/src/test/java/org/zwobble/mammoth/tests/DeepReflectionMatcher.java @@ -62,7 +62,7 @@ public class DeepReflectionMatcher<T> extends TypeSafeDiagnosingMatcher<T> { return matchesOptional(path, (Optional)expected, (Optional)actual, mismatchDescription); } - if (expected instanceof String || expected instanceof Boolean || expected instanceof Enum) { + if (expected instanceof String || expected instanceof Boolean || expected instanceof Enum || expected instanceof Integer) { return matchesPrimitive(path, expected, actual, mismatchDescription); } @@ -196,7 +196,7 @@ public class DeepReflectionMatcher<T> extends TypeSafeDiagnosingMatcher<T> { } private static String describeValue(Object value) { - if (value instanceof String || value instanceof Boolean) { + if (value instanceof String || value instanceof Boolean || value instanceof Integer) { return value.toString(); } else if (value instanceof Optional) { Optional<?> optional = (Optional)value; 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 72a75d3..2260f0d 100644 --- a/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java @@ -207,11 +207,11 @@ public class DocumentToHtmlTests { assertThat( convertToHtml(new Table(list( new TableRow(list( - new TableCell(list(paragraphWithText("Top left"))), - new TableCell(list(paragraphWithText("Top right"))))), + tableCell(list(paragraphWithText("Top left"))), + tableCell(list(paragraphWithText("Top right"))))), new TableRow(list( - new TableCell(list(paragraphWithText("Bottom left"))), - new TableCell(list(paragraphWithText("Bottom right")))))))), + tableCell(list(paragraphWithText("Bottom left"))), + tableCell(list(paragraphWithText("Bottom right")))))))), deepEquals(list(Html.element("table", list( Html.element("tr", 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 3048acd..04d8aef 100644 --- a/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java +++ b/src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java @@ -22,6 +22,7 @@ public class DocumentElementMakers { public static final Property<Run, Boolean> STRIKETHROUGH = newProperty(); public static final Property<Run, VerticalAlignment> VERTICAL_ALIGNMENT = newProperty(); public static final Property<HasChildren, List<DocumentElement>> CHILDREN = newProperty(); + public static final Property<TableCell, Integer> COLSPAN = newProperty(); public static final Instantiator<Paragraph> PARAGRAPH = propertyLookup -> new Paragraph( @@ -39,6 +40,15 @@ public class DocumentElementMakers { propertyLookup.valueOf(STYLE, Optional.empty()), propertyLookup.valueOf(CHILDREN, list())); + public static final Instantiator<TableCell> TABLE_CELL = + propertyLookup -> new TableCell( + propertyLookup.valueOf(COLSPAN, 1), + propertyLookup.valueOf(CHILDREN, list())); + + public static TableCell tableCell(List<DocumentElement> children) { + return make(a(TABLE_CELL, with(CHILDREN, children))); + } + public static Paragraph paragraphWithText(String text) { return make(a(PARAGRAPH, with(CHILDREN, list(runWithText(text))))); } 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 6c4d6b5..0752d3a 100644 --- a/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java +++ b/src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java @@ -324,8 +324,34 @@ public class BodyXmlTests { readSuccess(a(bodyReader), element), deepEquals(new Table(list( new TableRow(list( - new TableCell(list( - make(a(PARAGRAPH)))))))))); + new TableCell(1, list( + make(a(PARAGRAPH)) + )) + )) + ))) + ); + } + + @Test + public void gridspanIsReadAsColspanForTableCell() { + XmlElement element = element("w:tbl", list( + element("w:tr", list( + element("w:tc", list( + element("w:tcPr", list( + element("w:gridSpan", map("w:val", "2")) + )), + element("w:p"))))))); + + assertThat( + readSuccess(a(bodyReader), element), + deepEquals(new Table(list( + new TableRow(list( + new TableCell(2, list( + make(a(PARAGRAPH)) + )) + )) + ))) + ); } @Test |
