العمل مع Markdown في C++: مكتبات md4c وcmark وcpp-markdown

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع 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 (العناوين، القوائم، الروابط، الصور).
  • هندسة قابلة للتوسيع (يمكن إضافة قواعد تحليل خاصة).
  • بساطة

توصيات