在 C++ 中使用 Markdown:库概述与使用示例
Markdown 是一种轻量级标记语言,广泛用于文档、README 文件、博客和内容管理系统中的文本格式化。在 C++ 生态系统中,有多个成熟的库可用于解析 Markdown 并将其转换为 HTML 或其他格式。在本文中,我们将介绍三种流行的工具:md4c、cmark 和 cpp-markdown,并提供实际使用示例。
1. md4c 库
md4c 是一个轻量级的 Markdown 解析器,用纯 C 编写(带有兼容 C++ 的头文件)。它支持 CommonMark 规范和 GitHub Flavored Markdown (GFM) 扩展,包括表格、删除线和自动链接。该库具有高性能和低内存消耗的特点。
主要功能:
- 遵循 CommonMark 0.30 标准。
- 支持 GFM 扩展(表格、任务列表、删除线)。
- 用于逐步解析(类似 SAX)和生成 HTML 的 API。
- 无外部依赖。
使用 md4c 将 Markdown 转换为 HTML 的示例:
#include <md4c-html.h>#include <iostream>#include <string>
// 用于写入 HTML 输出的回调函数static 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. cmark 库
cmark(原 cmark-gfm)是社区提供的 CommonMark 解析器的参考实现。它同样用 C 编写,并提供了 C++ 封装。该库得到积极维护,并用于 GitHub、GitLab 和 Pandoc 等项目。
主要特点:
- 完全支持 CommonMark(包括最新版本的规范)。
- 内置支持 GitHub Flavored Markdown(表格、公式、提及)。
- 生成 HTML、LaTeX、man、XML 等格式。
- 用于程序化操作 AST(抽象语法树)的 API。
使用 cmark 进行解析并输出 HTML 的示例:
#include <cmark-gfm.h>#include <iostream>
int main() { const char* markdown = "## 待办事项列表
- [x] 买牛奶- [ ] 给朋友打电话"; // 使用 GFM 支持进行解析 cmark_node* doc = cmark_parse_document(markdown, strlen(markdown), CMARK_OPT_DEFAULT); // 转换为 HTML char* html = cmark_render_html(doc, CMARK_OPT_DEFAULT, NULL); std::cout << html << std::endl; // 释放内存 free(html); cmark_node_free(doc); return 0;}3. cpp-markdown 库
cpp-markdown 是一个从头开始使用 STL 和现代 C++11/14 特性编写的 C++ 库。它专注于易于集成和在 C++ 项目中的便捷使用。与 md4c 和 cmark 不同,它不需要外部 C 依赖。
特点:
- 纯 C++ 实现(模板、RAII、异常)。
- 支持基本 Markdown 语法(标题、列表、链接、图片)。
- 可扩展的架构(可以添加自定义解析规则)。
- 简