العمل مع Markdown في C++: مراجعة المكتبات وأمثلة الاستخدام
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.
- لا تبعيات خارجية.
مثال على استخدام md4c لتحويل Markdown إلى HTML:
#include <md4c-html.h>#include <iostream>#include <string>
// استدعاء لتسجيل مخرجات 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. مكتبة cmark
cmark (سابقًا cmark-gfm) هي التطبيق المرجعي لمحلل CommonMark من المجتمع. وهي مكتوبة أيضًا بلغة C وتوفر غلافًا لـ C++. المكتبة مدعومة بنشاط، وتُستخدم في مشاريع مثل GitHub وGitLab وPandoc.
الميزات الرئيسية:
- دعم كامل لـ CommonMark (بما في ذلك أحدث إصدار من المواصفة).
- دعم مدمج لـ GitHub Flavored Markdown (الجداول، الصيغ، الإشارات).
- توليد HTML وLaTeX وman وXML وتنسيقات أخرى.
- واجهة برمجة تطبيقات للتحكم البرمجي في AST (شجرة التركيب المجرد).
مثال على استخدام 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 هي مكتبة C++ مكتوبة من الصفر باستخدام STL وإمكانيات C++11/14 الحديثة. وهي تركز على سهولة التكامل وسهولة الاستخدام في مشاريع C++. على عكس md4c وcmark، فهي لا تتطلب تبعيات C خارجية.
الميزات:
- تنفيذ بلغة C++ نقية (قوالب، RAII، استثناءات).
- دعم بناء الجملة الأساسي لـ Markdown (العناوين، القوائم، الروابط، الصور).
- هندسة قابلة للتوسيع (يمكن إضافة قواعد تحليل خاصة).
- بساطة