1 module hunt.markdown.ext.table.internal.TableTextContentNodeRenderer; 2 3 import hunt.markdown.ext.table.internal.TableNodeRenderer; 4 import hunt.markdown.ext.table.TableBlock; 5 import hunt.markdown.ext.table.TableBody; 6 import hunt.markdown.ext.table.TableCell; 7 import hunt.markdown.ext.table.TableHead; 8 import hunt.markdown.ext.table.TableRow; 9 import hunt.markdown.node.Node; 10 import hunt.markdown.renderer.text.TextContentNodeRendererContext; 11 import hunt.markdown.renderer.text.TextContentWriter; 12 13 /** 14 * The Table node renderer that is needed for rendering GFM tables (GitHub Flavored Markdown) to text content. 15 */ 16 class TableTextContentNodeRenderer : TableNodeRenderer { 17 18 private TextContentWriter textContentWriter; 19 private TextContentNodeRendererContext context; 20 21 public this(TextContentNodeRendererContext context) { 22 this.textContentWriter = context.getWriter(); 23 this.context = context; 24 } 25 26 override protected void renderBlock(TableBlock tableBlock) { 27 renderChildren(tableBlock); 28 if (tableBlock.getNext() !is null) { 29 textContentWriter.write("\n"); 30 } 31 } 32 33 override protected void renderHead(TableHead tableHead) { 34 renderChildren(tableHead); 35 } 36 37 override protected void renderBody(TableBody tableBody) { 38 renderChildren(tableBody); 39 } 40 41 override protected void renderRow(TableRow tableRow) { 42 textContentWriter.line(); 43 renderChildren(tableRow); 44 textContentWriter.line(); 45 } 46 47 override protected void renderCell(TableCell tableCell) { 48 renderChildren(tableCell); 49 textContentWriter.write('|'); 50 textContentWriter.whitespace(); 51 } 52 53 private void renderLastCell(TableCell tableCell) { 54 renderChildren(tableCell); 55 } 56 57 private void renderChildren(Node parent) { 58 Node node = parent.getFirstChild(); 59 while (node !is null) { 60 Node next = node.getNext(); 61 // For last cell in row, we dont render the delimiter. 62 if (cast(TableCell)node !is null && next is null) { 63 renderLastCell(cast(TableCell) node); 64 } else { 65 context.render(node); 66 } 67 68 node = next; 69 } 70 } 71 }