1 module hunt.markdown.ext.table.TableExtension;
2 
3 import hunt.markdown.Extension;
4 import hunt.markdown.ext.table.internal.TableBlockParser;
5 import hunt.markdown.ext.table.internal.TableHtmlNodeRenderer;
6 import hunt.markdown.ext.table.internal.TableTextContentNodeRenderer;
7 import hunt.markdown.renderer.html.HtmlRenderer;
8 import hunt.markdown.renderer.html.HtmlNodeRendererContext;
9 import hunt.markdown.renderer.html.HtmlNodeRendererFactory;
10 import hunt.markdown.parser.Parser;
11 import hunt.markdown.renderer.NodeRenderer;
12 import hunt.markdown.renderer.text.TextContentNodeRendererContext;
13 import hunt.markdown.renderer.text.TextContentNodeRendererFactory;
14 import hunt.markdown.renderer.text.TextContentRenderer;
15 
16 /**
17  * Extension for GFM tables using "|" pipes (GitHub Flavored Markdown).
18  * <p>
19  * Create it with {@link #create()} and then configure it on the builders
20  * ({@link hunt.markdown.parser.Parser.Builder#extensions(Iterable)},
21  * {@link HtmlRenderer.Builder#extensions(Iterable)}).
22  * </p>
23  * <p>
24  * The parsed tables are turned into {@link TableBlock} blocks.
25  * </p>
26  */
27 class TableExtension : Parser.ParserExtension, HtmlRenderer.HtmlRendererExtension,
28         TextContentRenderer.TextContentRendererExtension {
29 
30     private this() {
31     }
32 
33     public static Extension create() {
34         return new TableExtension();
35     }
36 
37     override public void extend(Parser.Builder parserBuilder) {
38         parserBuilder.customBlockParserFactory(new TableBlockParser.Factory());
39     }
40 
41     override public void extend(HtmlRenderer.Builder rendererBuilder) {
42         rendererBuilder.nodeRendererFactory(new class HtmlNodeRendererFactory {
43             override public NodeRenderer create(HtmlNodeRendererContext context) {
44                 return new TableHtmlNodeRenderer(context);
45             }
46         });
47     }
48 
49     override public void extend(TextContentRenderer.Builder rendererBuilder) {
50         rendererBuilder.nodeRendererFactory(new class TextContentNodeRendererFactory {
51             override public NodeRenderer create(TextContentNodeRendererContext context) {
52                 return new TableTextContentNodeRenderer(context);
53             }
54         });
55     }
56 }