add support for nested CALS tables
Signed-off-by: Florian Thienel <florian@thienel.org>
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java
index a45df61..14c2d24 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java
@@ -152,7 +152,9 @@
public VisualizeResult visit(final IElement element) {
final Styles styles = styleSheet.getStyles(element);
final Collection<VisualizeResult> childrenResults = traverseChildren(element);
- if (isTable(styles)) {
+ if (isNestedTable(styles, element)) {
+ return new VisualizeResult(element, styles, childrenResults, visualizeAsNestedTable(element, styles, childrenResults));
+ } else if (isTable(styles)) {
final Table table = visualizeAsTable(element, styles, childrenResults);
return new VisualizeResult(element, styles, childrenResults, table);
} else if (isTableRowGroup(styles)) {
@@ -219,6 +221,10 @@
return CSS.TABLE.equals(styles.getDisplay());
}
+ private static boolean isNestedTable(final Styles styles, final IElement element) {
+ return "entrytbl".equals(element.getLocalName()) && isTable(styles);
+ }
+
private static boolean isTableRowGroup(final Styles styles) {
return CSS.TABLE_ROW_GROUP.equals(styles.getDisplay())
|| CSS.TABLE_HEADER_GROUP.equals(styles.getDisplay())
@@ -241,7 +247,6 @@
}
private static boolean isDisplayedAsBlock(final Styles styles) {
- // currently we can only render blocks or inline, hence everything that is not inline must be a block
return !isDisplayedInline(styles);
}
@@ -315,28 +320,23 @@
return wrapUpStructuralElementContent(element, styles, childrenResults, row);
}
+ private IStructuralBox visualizeAsNestedTable(final IElement element, final Styles styles, final Collection<VisualizeResult> childrenResults) {
+ final IStructuralBox cellContent = table(visualizeStructuralElementContent(element, styles, childrenResults));
+ final TableCell cell = tableCell(frame(surroundWithPseudoElements(cellContent, element, styles), styles));
+
+ if ("entrytbl".equals(element.getLocalName())) {
+ configureCALSCell(element, cell);
+ }
+
+ return wrapWithNodeReference(element, childrenResults, cell);
+ }
+
private IStructuralBox visualizeAsTableCell(final IElement element, final Styles styles, final Collection<VisualizeResult> childrenResults) {
final IStructuralBox cellContent = visualizeStructuralElementContent(element, styles, childrenResults);
final TableCell cell = tableCell(frame(surroundWithPseudoElements(cellContent, element, styles), styles));
if ("entry".equals(element.getLocalName())) {
- final IAttribute colName = element.getAttribute("colname");
- final IAttribute spanName = element.getAttribute("spanname");
- if (colName != null) {
- cell.setColumnName(colName.getValue());
- } else if (spanName != null) {
- cell.setColumnName(spanName.getValue());
- }
-
- final IAttribute nameStart = element.getAttribute("namest");
- final IAttribute nameEnd = element.getAttribute("nameend");
- if (nameStart != null && nameEnd != null) {
- cell.setStartColumnName(nameStart.getValue());
- cell.setEndColumnName(nameEnd.getValue());
- }
-
- final IAttribute moreRows = element.getAttribute("morerows");
- cell.setVerticalSpan(1 + toInt(moreRows));
+ configureCALSCell(element, cell);
} else if ("th".equals(element.getLocalName()) || "td".equals(element.getLocalName())) {
// TODO HTML table
}
@@ -344,6 +344,26 @@
return wrapWithNodeReference(element, childrenResults, cell);
}
+ private static void configureCALSCell(final IElement element, final TableCell cell) {
+ final IAttribute colName = element.getAttribute("colname");
+ final IAttribute spanName = element.getAttribute("spanname");
+ if (colName != null) {
+ cell.setColumnName(colName.getValue());
+ } else if (spanName != null) {
+ cell.setColumnName(spanName.getValue());
+ }
+
+ final IAttribute nameStart = element.getAttribute("namest");
+ final IAttribute nameEnd = element.getAttribute("nameend");
+ if (nameStart != null && nameEnd != null) {
+ cell.setStartColumnName(nameStart.getValue());
+ cell.setEndColumnName(nameEnd.getValue());
+ }
+
+ final IAttribute moreRows = element.getAttribute("morerows");
+ cell.setVerticalSpan(1 + toInt(moreRows));
+ }
+
private static int toInt(final IAttribute attribute) {
if (attribute == null) {
return 0;