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 }