Trabajo con Markdown en Swift (iOS/macOS): bibliotecas Down, SwiftMarkdown

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Procesamiento de Markdown en Swift para iOS y macOS: desde el análisis hasta el renderizado

\n\n

Markdown es uno de los lenguajes de marcado más populares para formatear texto. En el ecosistema Swift (iOS/macOS) existen varias bibliotecas potentes que permiten analizar, convertir y mostrar Markdown. En este artículo veremos dos bibliotecas principales: Down (rápida y flexible) y SwiftMarkdown (biblioteca oficial de Apple). Aprenderá cómo integrarlas en sus proyectos, convertir Markdown a NSAttributedString, HTML y mostrarlo en SwiftUI.

\n\n

1. Biblioteca Down (basada en cmark)

\n\n

Down es un envoltorio sobre el popular analizador C cmark, escrito en Swift. Proporciona un alto rendimiento y soporta todos los elementos básicos de Markdown (encabezados, listas, código, enlaces, imágenes, tablas, etc.).

\n\n

Instalación

\n

Añada el paquete a través de Swift Package Manager:

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

Ejemplo: conversión de Markdown a HTML

\n
import Down\n\nlet markdownString = "# ¡Hola, mundo!\\n\\nEste es **texto en negrita** y *cursiva*."\nlet down = Down(markdownString: markdownString)\nlet html = try? down.toHTML()\nprint(html ?? "")\n// Salida: <h1>¡Hola, mundo!</h1>\\n<p>Este es <strong>texto en negrita</strong> y <em>cursiva</em>.</p>
\n\n

Renderizado en NSAttributedString

\n

Down puede crear directamente un NSAttributedString para mostrarlo en UILabel, UITextView o NSTextView:

\n
let attributedString = try? down.toAttributedString()\n// Úselo en UITextView:\ntextView.attributedText = attributedString
\n\n

Soporte para SwiftUI

\n

Para SwiftUI se puede crear un envoltorio que muestre 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 (de Apple)

\n\n

SwiftMarkdown es la biblioteca oficial de Apple, que forma parte de swift-markdown. Proporciona un analizador completo de Markdown con posibilidad de personalización y generación de varios formatos (HTML, CommonMark, AST).

\n\n

Instalación

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

Análisis y trabajo con AST

\n

La biblioteca construye un árbol de sintaxis abstracta (AST) que se puede analizar y modificar:

\n
import Markdown\n\nlet source = """\n# Documentación\n\nLista de funciones:\n- `foo()` — primera función\n- `bar()` — segunda función\n"""\n\nlet document = Document(parsing: source)\nlet heading = document.child(at: 0) as? Heading\nprint(heading?.plainText ?? "") // "Documentación"\n\n// Recorrer todos los 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

Generación de HTML

\n
let html = document.format(options: [.unsafeTags])\nprint(html)\n// Salida: <h1>Documentación</h1>...<ul><li><code>foo()</code> — primera función</li>...
\n\n

Renderizado mediante AttributedString (iOS 15+)

\n

SwiftMarkdown soporta la conversión directa a AttributedString usando estilos:

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

Recommendations