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 }