Trabalhando com Markdown em Swift (iOS/macOS): bibliotecas Down, SwiftMarkdown

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Processamento de Markdown em Swift para iOS e macOS: da análise à renderização

\n\n

Markdown é 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.

\n\n

1. Biblioteca Down (baseada em cmark)

\n\n

Down é 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.).

\n\n

Instalação

\n

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

Exemplo: conversão de Markdown para HTML

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

Renderização em NSAttributedString

\n

Down pode criar diretamente um NSAttributedString para exibição em UILabel, UITextView ou NSTextView:

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

Suporte a SwiftUI

\n

Para SwiftUI, você pode criar um wrapper que exibe 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 (da Apple)

\n\n

SwiftMarkdown é 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).

\n\n

Instalação

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

Análise e trabalho com AST

\n

A biblioteca constrói uma árvore sintática abstrata (AST) que pode ser analisada e modificada:

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

Geração de HTML

\n
let html = document.format(options: [.unsafeTags])\nprint(html)\n// Saída: <h1>Documentação</h1>...<ul><li><code>foo()</code> — primeira função</li>...
\n\n

Renderização via AttributedString (iOS 15+)

\n

SwiftMarkdown suporta conversão direta para AttributedString usando estilos:

\n
import Markdown\nimport SwiftUI\n\nstruct ContentView: View {\n    let markdown = "**Importante**: clique *aqui*."\n\n    var body: some                    

Recommendations