using Markdig.Renderers.Html;
using Markdig.Renderers.Html.Inlines;
using Markdig.Syntax.Inlines;
public static void Main()
const string markdown = "Hi there, this is **bold**\nand a single break isn't rendered. \n\nA new paragraph is correct though.\n - Item 1\n - Item 2\n\n1. Another list\n1. And again";
var html = Markdown.ToHtml(markdown);
var writer = new StringWriter();
var pipeline = new MarkdownPipelineBuilder().Build();
var doc = MarkdownParser.Parse(markdown, pipeline);
var renderer = new HtmlRenderer(writer)
EnableHtmlForBlock = false,
EnableHtmlForInline = false,
EnableHtmlEscape = false,
renderer.ObjectRenderers.Replace<ParagraphRenderer>(new PlainTextParagraphRenderer());
renderer.ObjectRenderers.Replace<LineBreakInlineRenderer>(new PlainTextLineBreakInlineRenderer());
renderer.ObjectRenderers.Replace<ListRenderer>(new PlainTextListRenderer());
pipeline.Setup((IMarkdownRenderer) renderer);
var plainText = writer.ToString();
Console.WriteLine(plainText);
public class PlainTextParagraphRenderer : HtmlObjectRenderer<ParagraphBlock>
protected override void Write(HtmlRenderer renderer, ParagraphBlock obj)
if (!renderer.IsFirstInContainer)
renderer.WriteLeafInline((LeafBlock) obj);
public class PlainTextLineBreakInlineRenderer : HtmlObjectRenderer<LineBreakInline>
protected override void Write(HtmlRenderer renderer, LineBreakInline obj)
if (!renderer.IsLastInContainer)
public class PlainTextListRenderer : HtmlObjectRenderer<ListBlock>
protected override void Write(HtmlRenderer renderer, ListBlock listBlock)
WriteOrderedList(renderer, listBlock);
WriteUnorderedList(renderer, listBlock);
private void WriteOrderedList(HtmlRenderer renderer, ListBlock listBlock)
var maxDigits = $"{listBlock.Count}".Length;
foreach (var item in listBlock)
renderer.Write($"{index}. ".PadLeft(maxDigits + 3, ' '));
renderer.WriteChildren((ContainerBlock)item);
private void WriteUnorderedList(HtmlRenderer renderer, ListBlock listBlock)
foreach (var item in listBlock)
renderer.Write(" " + bullet + " ");
renderer.WriteChildren((ContainerBlock)item);