Travailler avec Markdown en Swift (iOS/macOS) : bibliothèques Down, SwiftMarkdown

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Traitement de Markdown en Swift pour iOS et macOS : de l'analyse au rendu

\n\n

Markdown est l'un des langages de balisage les plus populaires pour le formatage de texte. Dans l'écosystème Swift (iOS/macOS), il existe plusieurs bibliothèques puissantes qui permettent d'analyser, convertir et afficher Markdown. Dans cet article, nous examinerons deux bibliothèques principales : Down (rapide et flexible) et SwiftMarkdown (la bibliothèque officielle d'Apple). Vous apprendrez à les intégrer dans vos projets, à convertir Markdown en NSAttributedString, HTML et à l'afficher dans SwiftUI.

\n\n

1. Bibliothèque Down (basée sur cmark)

\n\n

Down est un wrapper autour du célèbre analyseur C cmark, écrit en Swift. Il offre des performances élevées et prend en charge tous les éléments Markdown de base (titres, listes, code, liens, images, tableaux, etc.).

\n\n

Installation

\n

Ajoutez le paquet via Swift Package Manager :

\n
// Package.swift\ndependencies: [\n    .package(url: "https://github.com/johnxnguyen/Down.git", from: "0.11.0")\n]
\n\n

Exemple : conversion de Markdown en HTML

\n
import Down\n\nlet markdownString = "# Bonjour le monde !\\n\\nCeci est du **texte gras** et de l'*italique*."\nlet down = Down(markdownString: markdownString)\nlet html = try? down.toHTML()\nprint(html ?? "")\n// Sortie : <h1>Bonjour le monde !</h1>\\n<p>Ceci est du <strong>texte gras</strong> et de l'<em>italique</em>.</p>
\n\n

Rendu en NSAttributedString

\n

Down peut créer directement un NSAttributedString pour l'affichage dans UILabel, UITextView ou NSTextView :

\n
let attributedString = try? down.toAttributedString()\n// Utilisez dans UITextView :\ntextView.attributedText = attributedString
\n\n

Prise en charge de SwiftUI

\n

Pour SwiftUI, vous pouvez créer un wrapper affichant AttributedString (iOS 15+) :

\n
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\n

2. SwiftMarkdown (d'Apple)

\n\n

SwiftMarkdown est la bibliothèque officielle d'Apple, faisant partie de swift-markdown. Elle fournit un analyseur Markdown complet avec possibilité de personnalisation et de génération de divers formats (HTML, CommonMark, AST).

\n\n

Installation

\n
// Package.swift\ndependencies: [\n    .package(url: "https://github.com/apple/swift-markdown.git", branch: "main")\n]
\n\n

Analyse et travail avec l'AST

\n

La bibliothèque construit un arbre syntaxique abstrait (AST) qui peut être analysé et modifié :

\n
import Markdown\n\nlet source = """\n# Documentation\n\nListe des fonctions :\n- `foo()` — première fonction\n- `bar()` — deuxième fonction\n"""\n\nlet document = Document(parsing: source)\nlet heading = document.child(at: 0) as? Heading\nprint(heading?.plainText ?? "") // "Documentation"\n\n// Parcours de tous les éléments\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\n

Génération HTML

\n
let html = document.format(options: [.unsafeTags])\nprint(html)\n// Sortie : <h1>Documentation</h1>...<ul><li><code>foo()</code> — première fonction</li>...
\n\n

Rendu via AttributedString (iOS 15+)

\n

SwiftMarkdown prend en charge la conversion directe en AttributedString avec utilisation de styles :

\n
import Markdown\nimport SwiftUI\n\nstruct ContentView: View {\n    let markdown = "**Important** : cliquez *ici*."\n\n    var body: some                    

Recommendations