Processamento de Markdown em Swift para iOS e macOS: da análise à renderização
\n\nMarkdown é uma das linguagens de marcação mais populares para formatação de texto. No ecossistema Swift (iOS/macOS), existem várias bibliotecas poderosas que permitem analisar, converter e exibir Markdown. Neste artigo, vamos explorar duas bibliotecas principais: Down (rápida e flexível) e SwiftMarkdown (biblioteca oficial da Apple). Você aprenderá como integrá-las em seus projetos, converter Markdown em NSAttributedString, HTML e exibir em SwiftUI.
1. Biblioteca Down (baseada em cmark)
\n\nDown é um wrapper sobre o popular parser C cmark, escrito em Swift. Ele oferece alto desempenho e suporta todos os elementos principais do Markdown (cabeçalhos, listas, código, links, imagens, tabelas, etc.).
Instalação
\nAdicione o pacote via Swift Package Manager:
\n// Package.swift\ndependencies: [\n .package(url: "https://github.com/johnxnguyen/Down.git", from: "0.11.0")\n]\n\nExemplo: conversão de Markdown para HTML
\nimport Down\n\nlet markdownString = "# Olá, mundo!\\n\\nEste é **texto em negrito** e *itálico*."\nlet down = Down(markdownString: markdownString)\nlet html = try? down.toHTML()\nprint(html ?? "")\n// Saída: <h1>Olá, mundo!</h1>\\n<p>Este é <strong>texto em negrito</strong> e <em>itálico</em>.</p>\n\nRenderização em NSAttributedString
\nDown pode criar diretamente um NSAttributedString para exibição em UILabel, UITextView ou NSTextView:
let attributedString = try? down.toAttributedString()\n// Use em UITextView:\ntextView.attributedText = attributedString\n\nSuporte a SwiftUI
\nPara SwiftUI, você pode criar um wrapper que exibe AttributedString (iOS 15+):
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 (da Apple)
\n\nSwiftMarkdown é a biblioteca oficial da Apple, parte do swift-markdown. Ela fornece um parser completo de Markdown com capacidade de personalização e geração de vários formatos (HTML, CommonMark, AST).
Instalação
\n// Package.swift\ndependencies: [\n .package(url: "https://github.com/apple/swift-markdown.git", branch: "main")\n]\n\nAnálise e trabalho com AST
\nA biblioteca constrói uma árvore sintática abstrata (AST) que pode ser analisada e modificada:
\nimport Markdown\n\nlet source = """\n# Documentação\n\nLista de funções:\n- `foo()` — primeira função\n- `bar()` — segunda função\n"""\n\nlet document = Document(parsing: source)\nlet heading = document.child(at: 0) as? Heading\nprint(heading?.plainText ?? "") // "Documentação"\n\n// Percorrendo todos os elementos\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\nGeração de HTML
\nlet html = document.format(options: [.unsafeTags])\nprint(html)\n// Saída: <h1>Documentação</h1>...<ul><li><code>foo()</code> — primeira função</li>...\n\nRenderização via AttributedString (iOS 15+)
\nSwiftMarkdown suporta conversão direta para AttributedString usando estilos:
import Markdown\nimport SwiftUI\n\nstruct ContentView: View {\n let markdown = "**Importante**: clique *aqui*."\n\n var body: some