Logby

Markdown com front matter YAML em .NET usando Markdig e YamlDotNet

Por Tiago Spana

Praticamente todo gerador de site estático usa o mesmo formato de arquivo: um bloco YAML no topo (o front matter) com metadados, seguido do conteúdo em Markdown.

---
title: "Meu post"
date: 2026-07-05
tags: [dotnet, markdown]
---

O conteúdo começa aqui...

Em .NET, a dupla Markdig + YamlDotNet resolve isso em poucas linhas.

Separando o front matter do corpo

O bloco YAML é delimitado por duas linhas ---. Dá para separar com um parser simples: leia a primeira linha (deve ser ---), acumule linhas até encontrar o próximo ---, e o restante é o corpo.

Desserializando o YAML

Com o bloco isolado, o YamlDotNet transforma o texto em um objeto tipado:

var deserializer = new DeserializerBuilder()
    .WithNamingConvention(CamelCaseNamingConvention.Instance)
    .IgnoreUnmatchedProperties()
    .Build();

var meta = deserializer.Deserialize<FrontMatter>(yamlBlock);

O IgnoreUnmatchedProperties é importante: permite adicionar campos novos nos arquivos sem quebrar posts antigos.

Renderizando o corpo

O Markdig converte o restante para HTML. O pipeline com UseAdvancedExtensions() habilita tabelas, listas de tarefas, autolinks e outros recursos do "Markdown de verdade" que usamos no dia a dia:

var pipeline = new MarkdownPipelineBuilder()
    .UseAdvancedExtensions()
    .Build();

var html = Markdown.ToHtml(body, pipeline);

Por que não um banco de dados?

Para um blog, arquivos Markdown versionados no Git são o banco de dados: revisão de conteúdo vira pull request, histórico vira git log, e backup vira clone. A aplicação só precisa ler a pasta no startup e manter tudo em memória — com dezenas ou centenas de posts, isso custa poucos milissegundos.