aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-05-02 12:07:36 +0100
committerMichael Williamson <mike@zwobble.org>2016-05-02 12:07:36 +0100
commit90680b0208bba24a970f8b7fd6f9092f5ca90407 (patch)
tree4feeae49e3e130ce09c19e9b50ec8a28b6bd5ba8
parent3de728c3d0fecbb3fa3e9b8019941cb51a3d2867 (diff)
Read colspan for table cells
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/documents/TableCell.java8
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/docx/BodyXmlReader.java11
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/DeepReflectionMatcher.java4
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/conversion/DocumentToHtmlTests.java8
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/documents/DocumentElementMakers.java10
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/docx/BodyXmlTests.java30
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