Travailler avec Markdown en C++ : revue des bibliothèques et exemples d'utilisation
Markdown est un langage de balisage léger, largement utilisé pour formater du texte dans la documentation, les fichiers README, les blogs et les systèmes de gestion de contenu. Dans l'écosystème C++, il existe plusieurs bibliothèques matures qui permettent d'analyser le Markdown et de le convertir en HTML ou en d'autres formats. Dans cet article, nous examinerons trois outils populaires : md4c, cmark et cpp-markdown, et nous fournirons des exemples pratiques de leur utilisation.
1. Bibliothèque md4c
md4c est un analyseur syntaxique Markdown léger, écrit en C pur (avec des en-têtes compatibles C++). Il prend en charge la spécification CommonMark et les extensions GitHub Flavored Markdown (GFM), y compris les tableaux, le barré et les liens automatiques. La bibliothèque se distingue par ses hautes performances et sa consommation mémoire minimale.
Fonctionnalités principales :
- Conformité à la norme CommonMark 0.30.
- Prise en charge des extensions GFM (tableaux, listes de tâches, barré).
- API pour l'analyse pas à pas (de type SAX) et génération de HTML.
- Aucune dépendance externe.
Exemple d'utilisation de md4c pour la conversion de Markdown en HTML :
#include <md4c-html.h>#include <iostream>#include <string>
// Callback pour écrire la sortie 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 = "# Hello, **World**!
This is a *test*."; 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 << "Parsing failed" << std::endl; } return 0;}2. Bibliothèque cmark
cmark (anciennement cmark-gfm) est l'implémentation de référence de l'analyseur CommonMark par la communauté. Elle est également écrite en C et fournit une enveloppe C++. La bibliothèque est activement maintenue et utilisée dans des projets tels que GitHub, GitLab et Pandoc.
Caractéristiques clés :
- Prise en charge complète de CommonMark (y compris la dernière version de la spécification).
- Prise en charge intégrée de GitHub Flavored Markdown (tableaux, formules, mentions).
- Génération de HTML, LaTeX, man, XML et d'autres formats.
- API pour la manipulation programmatique de l'AST (Abstract Syntax Tree).
Exemple d'utilisation de cmark pour l'analyse et la sortie HTML :
#include <cmark-gfm.h>#include <iostream>
int main() { const char* markdown = "## Liste de tâches
- [x] Acheter du lait- [ ] Appeler un ami"; // Analyse avec prise en charge GFM cmark_node* doc = cmark_parse_document(markdown, strlen(markdown), CMARK_OPT_DEFAULT); // Conversion en HTML char* html = cmark_render_html(doc, CMARK_OPT_DEFAULT, NULL); std::cout << html << std::endl; // Libération de la mémoire free(html); cmark_node_free(doc); return 0;}3. Bibliothèque cpp-markdown
cpp-markdown est une bibliothèque C++ écrite de zéro en utilisant la STL et les fonctionnalités modernes de C++11/14. Elle est conçue pour une intégration simple et une facilité d'utilisation dans les projets C++. Contrairement à md4c et cmark, elle ne nécessite pas de dépendances C externes.
Caractéristiques :
- Implémentation en C++ pur (templates, RAII, exceptions).
- Prise en charge de la syntaxe Markdown de base (titres, listes, liens, images).
- Architecture extensible (possibilité d'ajouter ses propres règles d'analyse).
- Pro