Trabalhando com Markdown em C++: bibliotecas md4c, cmark e cpp-markdown

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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

Recommendations