diff --git a/src/main/java/com/overzealous/remark/convert/Table.java b/src/main/java/com/overzealous/remark/convert/Table.java index 22220ff..b57caab 100644 --- a/src/main/java/com/overzealous/remark/convert/Table.java +++ b/src/main/java/com/overzealous/remark/convert/Table.java @@ -32,40 +32,58 @@ public class Table extends AbstractNodeHandler { // Largest amount of cells found in a row private int maxRowCells; + private boolean hasHeader; - private static final Pattern STYLE_ALIGNMENT_PATTERN = - Pattern.compile("text-align:\\s*([a-z]+)", Pattern.CASE_INSENSITIVE); + private static final Pattern STYLE_ALIGNMENT_PATTERN = Pattern.compile("text-align:\\s*([a-z]+)", + Pattern.CASE_INSENSITIVE); public void handleNode(NodeHandler parent, Element node, DocumentConverter converter) { MarkdownTable table = new MarkdownTable(); - boolean hasHeader = false; + hasHeader = false; maxRowCells = 0; + processTable(table, node, converter); + + if(!hasHeader) { + // No header was created, need to insert an empty one for markdown to work + insertEmptyRow(table.addHeaderRow(), maxRowCells); + } + + // OK, now render this sucker + Options.Tables opts = converter.options.getTables(); + converter.output.startBlock(); + table.renderTable(converter.output, opts.isColspanEnabled(), opts.isRenderedAsCode()); + converter.output.endBlock(); + } + + private void processTable(MarkdownTable table, Element node, DocumentConverter converter) { // loop over every direct child of the table node. for(final Element child : node.children()) { - - if(child.tagName().equals("thead")) { + String childTagName = child.tagName(); + if(childTagName.equals("thead")) { hasHeader = true; // handle explicitly declared header sections for(final Element headerRow : child.children()) { processRow(table.addHeaderRow(), headerRow, converter); } - } else if(child.tagName().equals("tbody") || child.tagName().equals("tfoot")) { - // handle body or foot sections - note: there's no special handling for tfoot - for(final Element bodyRow : child.children()) { - updateMaxRowCells(bodyRow); - processRow(table.addBodyRow(), bodyRow, converter); - } - - } else if(child.tagName().equals("tr")) { + } else if(childTagName.equals("tbody") || childTagName.equals("tfoot")) { + // Chance there are headers in body/footer need to go inside to verify. + processTable(table, child, converter); + } else if (childTagName.equals("tr")) { // Hrm, a row was added outside a valid table body or header... if(!child.children().isEmpty()) { if(child.children().get(0).tagName().equals("th")) { - hasHeader = true; - // handle manual TH cells - processRow(table.addHeaderRow(), child, converter); + if(hasHeader == true) { + // already has header, treat this as a regular body row + processRow(table.addBodyRow(), child, converter); + } else { + hasHeader = true; + // handle manual TH cells + processRow(table.addHeaderRow(), child, converter); + } + } else { // OK, must be a table row. updateMaxRowCells(child); @@ -74,17 +92,6 @@ public void handleNode(NodeHandler parent, Element node, DocumentConverter conve } } } - - if(!hasHeader) { - // No header was created, need to insert an empty one for markdown to work - insertEmptyRow(table.addHeaderRow(), maxRowCells); - } - - // OK, now render this sucker - Options.Tables opts = converter.options.getTables(); - converter.output.startBlock(); - table.renderTable(converter.output, opts.isColspanEnabled(), opts.isRenderedAsCode()); - converter.output.endBlock(); } private void processRow(List row, Element tableRow, DocumentConverter converter) { diff --git a/src/test/resources/conversions/html/tables.html b/src/test/resources/conversions/html/tables.html index ec30538..ef0b20a 100644 --- a/src/test/resources/conversions/html/tables.html +++ b/src/test/resources/conversions/html/tables.html @@ -11,6 +11,32 @@ + + + + + + + + + +
Header 1Header 2
OneTwo
+ + + + + + + + + + + + + + +
Header 1Header 2
OneTwo
Header AHeader B
+ diff --git a/src/test/resources/conversions/markdown/tables-codeblock.md b/src/test/resources/conversions/markdown/tables-codeblock.md index 5104232..8994e98 100644 --- a/src/test/resources/conversions/markdown/tables-codeblock.md +++ b/src/test/resources/conversions/markdown/tables-codeblock.md @@ -11,6 +11,15 @@ | One | | -Two- | + | Header 1 | Header 2 | + | -------- | -------- | + | One | Two | + + | Header 1 | Header 2 | + | -------- | -------- | + | One | Two | + | Header A | Header B | + | head 1 | head 2 | | ------ | ------ | | one | two | diff --git a/src/test/resources/conversions/markdown/tables-markdownextra.md b/src/test/resources/conversions/markdown/tables-markdownextra.md index 613c27d..fcad7fe 100644 --- a/src/test/resources/conversions/markdown/tables-markdownextra.md +++ b/src/test/resources/conversions/markdown/tables-markdownextra.md @@ -11,6 +11,15 @@ | One | | -Two- | +| Header 1 | Header 2 | +| -------- | -------- | +| One | Two | + +| Header 1 | Header 2 | +| -------- | -------- | +| One | Two | +| Header A | Header B | + | head 1 | head 2 | | ------ | ------ | | one | two | diff --git a/src/test/resources/conversions/markdown/tables-multimarkdown.md b/src/test/resources/conversions/markdown/tables-multimarkdown.md index 197ed41..2a5f12c 100644 --- a/src/test/resources/conversions/markdown/tables-multimarkdown.md +++ b/src/test/resources/conversions/markdown/tables-multimarkdown.md @@ -11,6 +11,15 @@ | One | | -Two- | +| Header 1 | Header 2 | +| -------- | -------- | +| One | Two | + +| Header 1 | Header 2 | +| -------- | -------- | +| One | Two | +| Header A | Header B | + | head 1 | head 2 | | ------ | ------ | | one | two | diff --git a/src/test/resources/conversions/markdown/tables.md b/src/test/resources/conversions/markdown/tables.md index 690079c..4ba9ea1 100644 --- a/src/test/resources/conversions/markdown/tables.md +++ b/src/test/resources/conversions/markdown/tables.md @@ -26,6 +26,36 @@
head 1head 2
onetwo
+ + + + + + + + + + + +
Header 1Header 2
OneTwo
+ + + + + + + + + + + + + + + + +
Header 1Header 2
OneTwo
Header AHeader B
+