Trabajo con Markdown en Kotlin: descripción general de bibliotecas y herramientas
\n\nMarkdown es un popular lenguaje de marcado para formatear texto, ampliamente utilizado en documentación, archivos README, blogs y sistemas de gestión de contenido. En el ecosistema de Kotlin existen varias bibliotecas maduras que permiten analizar Markdown, convertirlo a HTML y crear extensiones personalizadas. En este artículo, analizaremos tres enfoques principales: el uso de commonmark-java, flexmark-java y la biblioteca nativa kmarkdown.
1. Biblioteca commonmark-java
\n\ncommonmark-java es la implementación oficial en Java de la especificación CommonMark, que funciona perfectamente en Kotlin. Ofrece una API sencilla, alto rendimiento y estricto cumplimiento del estándar.
\n\nInstalación
\nAñada la dependencia en build.gradle.kts:
implementation("org.commonmark:commonmark:0.21.0")\n\nEjemplo de uso
\nimport org.commonmark.parser.Parser\nimport org.commonmark.renderer.html.HtmlRenderer\n\nfun main() {\n val parser = Parser.builder().build()\n val document = parser.parse("**Hola**, esto es *Markdown* en Kotlin!")\n val renderer = HtmlRenderer.builder().build()\n val html = renderer.render(document)\n println(html)\n // Salida: <p><strong>Hola</strong>, esto es <em>Markdown</em> en Kotlin!</p>\n}\n\nLa biblioteca soporta todos los elementos básicos: encabezados, listas, enlaces, imágenes, código y bloques de código. Para ampliar la funcionalidad, se pueden añadir módulos adicionales, como commonmark-ext-gfm-tables para tablas de GitHub Flavored Markdown.
2. Biblioteca flexmark-java
\n\nflexmark-java es una alternativa más potente y flexible. Soporta CommonMark, GitHub Flavored Markdown (GFM), así como múltiples extensiones: notas al pie, anclajes, emojis, fórmulas matemáticas y sintaxis personalizadas.
\n\nInstalación
\nimplementation("com.vladsch.flexmark:flexmark-all:0.64.8")\n\nEjemplo con extensiones
\nimport com.vladsch.flexmark.html.HtmlRenderer\nimport com.vladsch.flexmark.parser.Parser\nimport com.vladsch.flexmark.ext.tables.TablesExtension\nimport com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughExtension\n\nfun main() {\n val extensions = listOf(TablesExtension.create(), StrikethroughExtension.create())\n val parser = Parser.builder().extensions(extensions).build()\n val document = parser.parse("| Título | Descripción |\\n|--------|-------------|\\n| Kotlin | Lenguaje |\\n\\n~~Texto tachado~~")\n val renderer = HtmlRenderer.builder().extensions(extensions).build()\n println(renderer.render(document))\n}\n\nFlexmark también permite personalizar el renderizado: añadir clases CSS, cambiar el orden de los atributos, crear visitantes personalizados para el árbol AST. Esto lo convierte en la opción ideal para proyectos complejos que requieren un ajuste fino de la salida.
\n\n3. Biblioteca nativa kmarkdown
\n\nkmarkdown es una implementación puramente en Kotlin del analizador Markdown, escrita utilizando corrutinas y características integradas del lenguaje. Es ligera y no requiere dependencias adicionales más allá de la biblioteca estándar de Kotlin.
\n\nInstalación
\nimplementation("net.nightwhistler:kmarkdown:1.0.2")\n\nEjemplo
\nimport net.nightwhistler.kmarkdown.KMarkdown\n\nfun main() {\n val markdown = KMarkdown()\n val html = markdown.parseToHtml("# Título\\n\\n**Texto** normal")\n println(html)\n // Salida: <h1>Título</h1><p><strong>Texto</strong> normal</p>\n}\n\nKmarkdown es adecuado para escenarios simples donde no se requiere soporte para funciones avanzadas de GFM. Su ventaja es la limpieza del código y la ausencia