العمل مع Markdown في Swift (iOS/macOS): المكتبات والأمثلة العملية
Markdown هي لغة ترميز خفيفة الوزن، تُستخدم على نطاق واسع لتنسيق النص في التوثيق والدردشات والتطبيقات التعليمية. في نظام Swift البيئي (iOS/macOS)، توجد عدة مكتبات ناضجة تسمح بتحليل وعرض وتحويل Markdown إلى تمثيلات أصلية. في هذه المقالة، سنستعرض الأدوات الرئيسية: Down وInk وSwiftMarkdown، بالإضافة إلى عرض أمثلة للتكامل مع SwiftUI وUIKit.
1. مكتبة Down (المعتمدة على cmark)
Down هي المكتبة الأكثر شيوعًا للعمل مع Markdown في Swift. وهي مبنية على المحلل اللغوي عالي الأداء بلغة C cmark وتدعم معيار CommonMark. تتيح Down تحويل Markdown إلى HTML وNSAttributedString وPDF وحتى إلى AST (شجرة التركيب المجردة).
التثبيت
أضف إلى Package.swift:
dependencies: [ .package(url: "https://github.com/johnxnguyen/Down.git", from: "0.9.4")]مثال: عرض Markdown في NSAttributedString
import Down
let markdownString = "# عنوان
هذا نص **عريض** ونص *مائل*."let down = Down(markdownString: markdownString)
do { let attributedString = try down.toAttributedString() // استخدم في UITextView أو UILabel textView.attributedText = attributedString} catch { print("خطأ في التحليل: \\(error)")}تدعم Down أيضًا الأنماط المخصصة عبر DownStyler:
let styler = DownStyler(configuration: DownStylerConfiguration( fonts: FontCollection( heading1: .boldSystemFont(ofSize: 24), body: .systemFont(ofSize: 16) ), colors: ColorCollection( heading1: .systemBlue, body: .label )))let attributedString = try down.toAttributedString(styler: styler)2. مكتبة Ink (John Sundell)
Ink هو محلل Markdown خفيف الوزن من المطور John Sundell. لا يتطلب تبعيات خارجية (Swift نقي) وهو مثالي للمهام البسيطة: استخراج العناوين والقوائم والروابط. يُرجع Ink شجرة من العناصر على مستوى الكتلة (block-level elements) يمكن تخصيصها.
التثبيت عبر Swift Package Manager
dependencies: [ .package(url: "https://github.com/JohnSundell/Ink.git", from: "0.6.0")]مثال: تحليل واستخراج العناوين
import Ink
let markdown = """# العنوان الرئيسي## عنوان فرعينص عادي مع تمييز **عريض**."""
let parser = MarkdownParser()let result = parser.parse(markdown)
for heading in result.headings { print("المستوى \\(heading.level): \\(heading.text)")}// الإخراج:// المستوى 1: العنوان الرئيسي// المستوى 2: عنوان فرعيتدعم Ink أيضًا معدّلات مخصصة لتوسيع بناء الجملة:
let modifier = Modifier(target: .inlineCode) { html, markdown in return "<span style=\\"color: red;\\">\\(html)</span>"}let parser = MarkdownParser(modifiers: [modifier])3. SwiftMarkdown (من Apple)
SwiftMarkdown هي المكتبة الرسمية من Apple، تم تقديمها في WWDC 2022. وهي متكاملة بعمق مع نظام SwiftUI البيئي وتدعم جميع امتدادات Markdown، بما في ذلك الجداول وكتل الكود مع تمييز بناء الجملة والقوائم المتداخلة. تستخدم SwiftMarkdown AttributedString من Foundation، مما يبسط الترجمة والخطوط الديناميكية.
التثبيت
أضف إلى المشروع عبر Xcode: File → Add Packages → apple/swift-markdown.
مثال: عرض Markdown في SwiftUI
import MarkdownUIimport SwiftUI
struct ContentView: View { let markdown = """ # مرحبًا بك هذا **مثال** على استخدام