Trabalhando com Markdown em C++: revisão de bibliotecas e exemplos de uso
Markdown é uma linguagem de marcação leve, amplamente utilizada para formatar texto em documentação, arquivos README, blogs e sistemas de gerenciamento de conteúdo. No ecossistema C++, existem várias bibliotecas maduras que permitem fazer parsing de Markdown e convertê-lo para HTML ou outros formatos. Neste artigo, vamos analisar três ferramentas populares: md4c, cmark e cpp-markdown, além de fornecer exemplos práticos de seu uso.
1. Biblioteca md4c
md4c é um parser leve de Markdown, escrito em C puro (com cabeçalhos compatíveis com C++). Ele suporta a especificação CommonMark e as extensões GitHub Flavored Markdown (GFM), incluindo tabelas, tachado e links automáticos. A biblioteca se destaca pelo alto desempenho e consumo mínimo de memória.
Principais recursos:
- Conformidade com o padrão CommonMark 0.30.
- Suporte para extensões GFM (tabelas, task list, strikethrough).
- API para parsing passo a passo (semelhante a SAX) e geração de HTML.
- Sem dependências externas.
Exemplo de uso do md4c para converter Markdown em HTML:
#include <md4c-html.h>#include <iostream>#include <string>
// Callback para escrever a saída HTMLstatic void append_html(const MD_CHAR* text, MD_SIZE size, void* userdata) { std::string* output = static_cast<std::string*>(userdata); output->append(text, size);}
int main() { std::string markdown = "# Olá, **Mundo**!
Isto é um *teste*."; std::string html; MD_HTML_FLAGS flags = MD_HTML_FLAG_SKIP_UTF8_BOM; int result = md_html(markdown.c_str(), markdown.length(), append_html, &html, flags, 0); if (result == 0) { std::cout << html << std::endl; } else { std::cerr << "Falha no parsing" << std::endl; } return 0;}2. Biblioteca cmark
cmark (anteriormente cmark-gfm) é a implementação de referência do parser CommonMark da comunidade. Também é escrita em C e fornece um wrapper C++. A biblioteca é ativamente mantida e usada em projetos como GitHub, GitLab e Pandoc.
Principais características:
- Suporte completo ao CommonMark (incluindo a versão mais recente da especificação).
- Suporte integrado ao GitHub Flavored Markdown (tabelas, fórmulas, menções).
- Geração de HTML, LaTeX, man, XML e outros formatos.
- API para manipulação programática da AST (Árvore Sintática Abstrata).
Exemplo de uso do cmark para parsing e saída HTML:
#include <cmark-gfm.h>#include <iostream>
int main() { const char* markdown = "## Lista de tarefas
- [x] Comprar leite- [ ] Ligar para um amigo"; // Parsing com suporte a GFM cmark_node* doc = cmark_parse_document(markdown, strlen(markdown), CMARK_OPT_DEFAULT); // Conversão para HTML char* html = cmark_render_html(doc, CMARK_OPT_DEFAULT, NULL); std::cout << html << std::endl; // Liberação de memória free(html); cmark_node_free(doc); return 0;}3. Biblioteca cpp-markdown
cpp-markdown é uma biblioteca C++ escrita do zero usando STL e recursos modernos do C++11/14. Ela é focada na simplicidade de integração e facilidade de uso em projetos C++. Ao contrário do md4c e cmark, não requer dependências C externas.
Características:
- Implementação em C++ puro (templates, RAII, exceções).
- Suporte à sintaxe básica do Markdown (cabeçalhos, listas, links, imagens).
- Arquitetura extensível (é possível adicionar regras de parsing personalizadas).
- Sim
Também na biblioteca
Trabalhando com XML em Rust: bibliotecas quick-xml, roxmltree e serde_xml_rs
Validação de dados em Rust: visão geral de bibliotecas e frameworks
Swagger-PHP para PHP: guia completo com exemplos
Filas de Tarefas em C# (.NET): System.Threading.Channels e TPL Dataflow