Markdown-Verarbeitung in Swift für iOS und macOS: vom Parsen bis zum Rendern
\n\nMarkdown ist eine der beliebtesten Auszeichnungssprachen zur Textformatierung. Im Swift-Ökosystem (iOS/macOS) gibt es mehrere leistungsstarke Bibliotheken, die das Parsen, Konvertieren und Anzeigen von Markdown ermöglichen. In diesem Artikel betrachten wir zwei Hauptbibliotheken: Down (schnell und flexibel) und SwiftMarkdown (offizielle Bibliothek von Apple). Sie erfahren, wie Sie diese in Ihre Projekte integrieren, Markdown in NSAttributedString, HTML umwandeln und in SwiftUI anzeigen.
1. Die Bibliothek Down (cmark-basiert)
\n\nDown ist ein Swift-Wrapper um den beliebten C-Parser cmark. Er bietet hohe Leistung und unterstützt alle grundlegenden Markdown-Elemente (Überschriften, Listen, Code, Links, Bilder, Tabellen usw.).
Installation
\nFügen Sie das Paket über den Swift Package Manager hinzu:
\n// Package.swift\ndependencies: [\n .package(url: "https://github.com/johnxnguyen/Down.git", from: "0.11.0")\n]\n\nBeispiel: Konvertierung von Markdown in HTML
\nimport Down\n\nlet markdownString = "# Hallo Welt!\\n\\nDas ist **fetter Text** und *kursiv*."\nlet down = Down(markdownString: markdownString)\nlet html = try? down.toHTML()\nprint(html ?? "")\n// Ausgabe: <h1>Hallo Welt!</h1>\\n<p>Das ist <strong>fetter Text</strong> und <em>kursiv</em>.</p>\n\nRendering in NSAttributedString
\nDown kann direkt ein NSAttributedString zur Anzeige in UILabel, UITextView oder NSTextView erstellen:
let attributedString = try? down.toAttributedString()\n// Verwenden Sie es in UITextView:\ntextView.attributedText = attributedString\n\nSwiftUI-Unterstützung
\nFür SwiftUI können Sie einen Wrapper erstellen, der AttributedString (iOS 15+) anzeigt:
struct MarkdownView: View {\n let markdown: String\n\n var body: some View {\n if let nsAttr = try? Down(markdownString: markdown).toAttributedString() {\n Text(AttributedString(nsAttr))\n } else {\n Text(markdown)\n }\n }\n}\n\n2. SwiftMarkdown (von Apple)
\n\nSwiftMarkdown ist die offizielle Apple-Bibliothek, die Teil von swift-markdown ist. Sie bietet einen vollständigen Markdown-Parser mit Anpassungsmöglichkeiten und der Generierung verschiedener Formate (HTML, CommonMark, AST).
Installation
\n// Package.swift\ndependencies: [\n .package(url: "https://github.com/apple/swift-markdown.git", branch: "main")\n]\n\nParsen und Arbeiten mit AST
\nDie Bibliothek erstellt einen abstrakten Syntaxbaum (AST), der analysiert und modifiziert werden kann:
\nimport Markdown\n\nlet source = """\n# Dokumentation\n\nFunktionsliste:\n- `foo()` — erste Funktion\n- `bar()` — zweite Funktion\n"""\n\nlet document = Document(parsing: source)\nlet heading = document.child(at: 0) as? Heading\nprint(heading?.plainText ?? "") // "Dokumentation"\n\n// Durchlaufen aller Elemente\nfor child in document.children {\n if let list = child as? UnorderedList {\n for item in list.children {\n print((item as? ListItem)?.plainText ?? "")\n }\n }\n}\n\nHTML-Generierung
\nlet html = document.format(options: [.unsafeTags])\nprint(html)\n// Ausgabe: <h1>Dokumentation</h1>...<ul><li><code>foo()</code> — erste Funktion</li>...\n\nRendering über AttributedString (iOS 15+)
\nSwiftMarkdown unterstützt die direkte Umwandlung in AttributedString mit Stilen:
import Markdown\nimport SwiftUI\n\nstruct ContentView: View {\n let markdown = "**Wichtig**: klicken Sie *hier*."\n\n var body: some