Modular Markdig extensions for rendering rich Markdown to HTML — admonitions (incl. GitHub/Obsidian callouts), mermaid diagrams, code syntax highlighting, Obsidian wiki links, hidden comments, and inline tags — where each capability is independently activatable and ships its own self-contained CSS/JS assets.
Targets .NET Standard 2.0.
dotnet add package bwets.Markdig.ExtensionsActivate the parsers/renderers on a MarkdownPipelineBuilder:
using Markdig;
using bwets.Markdig.Extensions;
var pipeline = new MarkdownPipelineBuilder()
.UseAdvancedExtensions()
.UseAdmonitions() // Docusaurus :::, MkDocs !!!/???, and GitHub/Obsidian > [!note] callouts
.UseMermaid() // ```mermaid blocks -> <pre class="mermaid">
.UseWikiLinks() // [[Page]], [[Page|alias]], [[Page#Heading]], ![[image.png]]
.UseObsidianComments() // hide %%…%% comments
.UseObsidianTags() // #tag -> <span class="tag">
.Build();
var html = Markdown.ToHtml(markdown, pipeline);Note: these only affect the produced HTML markup. To actually render mermaid diagrams or highlight code you also need the client-side assets — that's what the HTML feature model below provides.
MarkdownHtmlFeatures bundles each feature's Markdig configuration and the CSS/JS it needs,
and composes them into a page. The host decides how assets are delivered.
using Markdig;
using bwets.Markdig.Extensions.Html;
var features = new MarkdownHtmlFeatures()
.UseSyntaxHighlighting(extendedLanguages: true) // base ~38 vs extended ~190 + Razor
.UseMermaid()
.UseAdmonitions();
var pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions();
features.Configure(pipeline); // wire up parsers/renderers
var html = Markdown.ToHtml(markdown, pipeline.Build());
// Compose the page. Choose how the assets are delivered:
var delivery = MarkdownAssetDelivery.Inline; // or External
var page =
"<!doctype html><html><head>" + features.RenderHead(delivery) + "</head><body>" +
html + features.RenderBodyEnd(delivery) +
"</body></html>";| Delivery | What it does | Good for |
|---|---|---|
Inline |
Embeds CSS/JS directly into the page (<style> / <script>) |
Web pages, anywhere a temp file cache isn't available |
External |
Emits <link> / <script src>; you write features.Assets next to the page |
Desktop/WebView hosts that want small HTML + cached files |
When delivering externally, write the files yourself:
foreach (var asset in features.Assets)
File.WriteAllText(Path.Combine(outputDir, asset.FileName), asset.Content);| Feature | Activation | Notes |
|---|---|---|
| Admonitions | UseAdmonitions() |
Docusaurus :::type[title]…:::, MkDocs !!! type "title" / collapsible ??? type, and GitHub/Obsidian > [!type] title callouts (collapsible > [!type]-) |
| Mermaid | UseMermaid() |
```mermaid → diagrams; bundles the all-in-one mermaid runtime |
| Syntax highlighting | UseSyntaxHighlighting(extendedLanguages) |
highlight.js; choose the common ~38 languages or the full ~190 + Razor |
| Wiki links | UseWikiLinks() |
[[Page]], [[Page|alias]], [[Page#Heading]]; image embeds ![[img.png]], note embeds ![[Note]] → links. Emitted as standard links with a wikilink class |
| Obsidian comments | UseObsidianComments() |
Hides inline %%…%% and %%-fenced comment blocks |
| Obsidian tags | UseObsidianTags() |
#tag, #nested/tag → <span class="tag">; ignores C# and all-numeric #123 |
See docs/ for details on each feature.