1 module hunt.markdown.ext.strikethrough.StrikethroughExtension;
2 
3 import hunt.markdown.Extension;
4 import hunt.markdown.renderer.text.TextContentRenderer;
5 import hunt.markdown.renderer.text.TextContentNodeRendererContext;
6 import hunt.markdown.renderer.text.TextContentNodeRendererFactory;
7 import hunt.markdown.ext.gfm.strikethrough.internal.StrikethroughDelimiterProcessor;
8 import hunt.markdown.ext.gfm.strikethrough.internal.StrikethroughHtmlNodeRenderer;
9 import hunt.markdown.ext.gfm.strikethrough.internal.StrikethroughTextContentNodeRenderer;
10 import hunt.markdown.renderer.html.HtmlRenderer;
11 import hunt.markdown.renderer.html.HtmlNodeRendererContext;
12 import hunt.markdown.renderer.html.HtmlNodeRendererFactory;
13 import hunt.markdown.parser.Parser;
14 import hunt.markdown.renderer.NodeRenderer;
15 
16 /**
17  * Extension for GFM strikethrough using ~~ (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 strikethrough text regions are turned into {@link Strikethrough} nodes.
25  * </p>
26  */
27 class StrikethroughExtension : Parser.ParserExtension, HtmlRenderer.HtmlRendererExtension,
28         TextContentRenderer.TextContentRendererExtension {
29 
30     private this() {
31     }
32 
33     public static Extension create() {
34         return new StrikethroughExtension();
35     }
36 
37     override public void extend(Parser.Builder parserBuilder) {
38         parserBuilder.customDelimiterProcessor(new StrikethroughDelimiterProcessor());
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 StrikethroughHtmlNodeRenderer(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 StrikethroughTextContentNodeRenderer(context);
53             }
54         });
55     }
56 }