Skip to content

Instantly share code, notes, and snippets.

@asbjornu
Created April 24, 2019 10:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save asbjornu/4bbab38b6d65cd7b832669db68ef1828 to your computer and use it in GitHub Desktop.
Save asbjornu/4bbab38b6d65cd7b832669db68ef1828 to your computer and use it in GitHub Desktop.
Markdig checklist extension
public class ChecklistExtension : IMarkdownExtension
{
public void Setup(MarkdownPipelineBuilder pipeline)
{
if (pipeline.InlineParsers.Contains<TaskListInlineParser>())
return;
if (pipeline.InlineParsers.Contains<ChecklistInlineParser>())
return;
// Insert the parser after the code span parser
var checklistInlineParser = new ChecklistInlineParser();
pipeline.InlineParsers.InsertBefore<LinkInlineParser>(checklistInlineParser);
}
public void Setup(MarkdownPipeline pipeline, IMarkdownRenderer renderer)
{
var htmlRenderer = renderer as HtmlRenderer;
if (htmlRenderer != null)
{
htmlRenderer.ObjectRenderers.AddIfNotAlready<HtmlChecklistItemRenderer>();
}
var normalizeRenderer = renderer as NormalizeRenderer;
if (normalizeRenderer != null)
{
normalizeRenderer.ObjectRenderers.AddIfNotAlready<NormalizeTaskListRenderer>();
}
}
}
public class ChecklistInlineParser : TaskListInlineParser
{
public override bool Match(InlineProcessor processor, ref StringSlice slice)
{
bool match = base.Match(processor, ref slice);
if (match)
{
var listItemBlock = (ListItemBlock) processor.Block.Parent;
var listBlock = (ListBlock) listItemBlock.Parent;
var taskList = (TaskList) processor.Inline;
processor.Inline = new ChecklistItem(taskList, listBlock.Line, listItemBlock.Line);
}
return match;
}
}
public class ChecklistItem : LeafInline
{
private readonly TaskList taskList;
public ChecklistItem(TaskList taskList, int listBlockLineNumber, int listItemLineNumber)
{
this.taskList = taskList ?? throw new ArgumentNullException(nameof(taskList));
Id = $"checklist-{listBlockLineNumber}-item-{listItemLineNumber}";
}
public bool Checked => this.taskList.Checked;
public string Id { get; }
}
var checklistExtension = new ChecklistExtension();
var pipelineBuilder = new MarkdownPipelineBuilder();
pipelineBuilder.Extensions.Add(checklistExtension);
pipelineBuilder.DisableHtml();
var pipeline = pipelineBuilder.Build();
using (var stringWriter = new StringWriter())
{
var document = Markdown.ToHtml("…", stringWriter, pipeline);
var html = stringWriter.ToString();
// How do I get to the leaf nodes within 'document'?
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment