Trabajar con Markdown en TypeScript: desde el análisis hasta plugins personalizados
Markdown sigue siendo uno de los lenguajes de marcado más populares para documentación, blogs y plataformas educativas. Al desarrollar en TypeScript, surge la necesidad no solo de mostrar Markdown, sino también de gestionar de forma flexible el proceso de su transformación. En este artículo, analizaremos tres bibliotecas clave que le ayudarán a integrar Markdown en su proyecto TypeScript y mostraremos cómo crear sus propias extensiones.
¿Por qué es importante TypeScript para trabajar con Markdown?
TypeScript agrega tipado estricto, lo cual es fundamental al procesar contenido de usuario. Usted sabe exactamente qué datos provienen de los archivos Markdown y puede evitar errores en tiempo de ejecución. Además, TypeScript facilita la creación de plugins y middleware para analizadores.
Descripción general de bibliotecas populares
- marked — el analizador más rápido y sencillo. Configuración mínima, excelente rendimiento.
- unified / remark — ecosistema para análisis sintáctico. Permite crear cadenas complejas de transformaciones (AST -> HTML -> React).
- showdown — una alternativa ligera con soporte para extensiones, bien documentada.
Ejemplo 1: Análisis básico con marked
La biblioteca marked es ideal para un inicio rápido. Instálela a través de npm:
npm install markedLos tipos para TypeScript se incluyen en el paquete. Ejemplo de uso:
import { marked } from 'marked';
const markdownContent = `# ¡Hola, TypeScript!Este es **texto en negrita** y `código`.- Elemento de lista- Otro más`;
const html = marked.parse(markdownContent);console.log(html);// Salida: <h1>¡Hola, TypeScript!</h1>// <p>Este es <strong>texto en negrita</strong> y <code>código</code>.</p>// <ul><li>Elemento de lista</li><li>Otro más</li></ul>Para trabajo asíncrono, use marked.parseAsync(). Esto es útil al cargar archivos desde la red.
Ejemplo 2: Renderizador personalizado con tipado
A veces es necesario cambiar el comportamiento estándar. Por ejemplo, agregar clases a los enlaces o procesar imágenes. Creemos un renderizador personalizado en TypeScript:
import { marked, Renderer } from 'marked';
interface CustomRenderer extends Renderer { link(href: string, title: string | null, text: string): string;}
const renderer: Partial<CustomRenderer> = { link({ href, title, text }) { return `<a href="${href}" target="_blank" rel="noopener noreferrer" class="external-link">${text}</a>`; }};
marked.use({ renderer });
const markdown = 'Visita [PythonLib](https://pythonlib.ru)';const result = marked.parse(markdown);// <a href="https://pythonlib.ru" target="_blank" class="external-link">PythonLib</a>El tipo Partial<CustomRenderer> garantiza que solo sobrescribimos los métodos necesarios.
Ejemplo 3: Trabajo con AST mediante unified y remark
Si necesita un control total sobre la estructura del documento, use unified y remark. Instalación:
npm install unified remark-parse remark-stringify remark-htmlEjemplo de análisis en un árbol sintáctico (AST) y viceversa:
import { unified } from 'unified';import remarkParse from 'remark-parse';import remarkStringify from 'remark-stringify';import remarkHtml from 'remark-html';
const markdown = '# TítuloEsto es **importante**.';
const file = await unified() .use(remarkParse) // Análisis a AST .use(remarkStringify) // De vuelta a Markdown (para verificar) .process(markdown);
console.log(String(file)); // Markdown original
const htmlFile = await unified() .use(remarkParse) .use(remarkHtml) // Transformación También en la biblioteca
Contenedor de Inyección de Dependencias para JavaScript (Node.js) — Awilix
Protocol Buffers en C++: guía completa con ejemplos prácticos
Entity Framework Core para C# (.NET): guía completa con ejemplos
Envío de correo electrónico en TypeScript: bibliotecas y ejemplos de código