Skip to content

Cómo funciona Markdown

Entender cómo funciona Markdown te ayuda a aprovechar mejor esta poderosa herramienta. En este capítulo descubrirás cómo el texto plano se transforma en un documento bien formateado.

Flujo de trabajo básico

El flujo de trabajo de Markdown se puede resumir en los siguientes pasos:

Archivo fuente Markdown (.md) → Analizador Markdown → Documento HTML → Renderizado en el navegador

1. Escribir el archivo fuente Markdown

Puedes usar cualquier editor de texto para crear un archivo .md y escribir contenido usando la sintaxis Markdown:

markdown
# Mi documento

Este es un párrafo **importante**.

## Ejemplo de lista

- Elemento 1
- Elemento 2
- Elemento 3

2. Procesamiento mediante el analizador Markdown

El analizador lee el archivo Markdown, reconoce los elementos sintácticos y los convierte en el HTML correspondiente:

html
<h1>Mi documento</h1>
<p>Este es un <strong>importante</strong> párrafo.</p>
<h2>Ejemplo de lista</h2>
<ul>
  <li>Elemento 1</li>
  <li>Elemento 2</li>
  <li>Elemento 3</li>
</ul>

3. Renderizado en el navegador

El HTML generado se muestra como un documento formateado en el navegador.

Cómo funcionan los analizadores

Análisis léxico

El analizador primero realiza un análisis léxico, dividiendo el texto Markdown en tokens:

  • # reconocido como token de encabezado
  • **texto** como token de negrita
  • - elemento como token de elemento de lista

Análisis sintáctico

Luego se realiza el análisis sintáctico para construir un árbol sintáctico abstracto (AST):

Documento
├── Encabezado (nivel 1): "Mi documento"
├── Párrafo
│   ├── Texto: "Este es un"
│   ├── Negrita: "importante"
│   └── Texto: "párrafo."
├── Encabezado (nivel 2): "Ejemplo de lista"
└── Lista no ordenada
    ├── Elemento: "Elemento 1"
    ├── Elemento: "Elemento 2"
    └── Elemento: "Elemento 3"

Generación de HTML

Finalmente, el árbol sintáctico se recorre para generar la salida HTML correspondiente.

Analizadores más populares

CommonMark

  • Especificación estándar – Proporciona un estándar unificado para el análisis de Markdown
  • Definición estricta – Elimina ambigüedades entre implementaciones
  • Amplio soporte – Adoptado por muchos analizadores

GitHub Flavored Markdown (GFM)

Basado en CommonMark, con extensiones:

  • Soporte de tablas
  • Tachado
  • Listas de tareas
  • Reconocimiento de autolinks
  • Resaltado de sintaxis en bloques de código

Otros analizadores

AnalizadorLenguajeCaracterísticas
markedJavaScriptRápido, ligero
markdown-itJavaScriptExtensible, muchos plugins
Python-MarkdownPythonRico en funciones, sistema de plugins
kramdownRubySoporta múltiples formatos de salida
PandocHaskellConvertidor universal de documentos

Motores de renderizado

Renderizado del lado del cliente

El Markdown se analiza en el navegador en tiempo real:

javascript
// Con marked.js
const html = marked.parse('# Hola mundo');
document.body.innerHTML = html;

Ventajas:

  • No requiere procesamiento en el servidor
  • Vista previa en tiempo real
  • Reduce la carga del servidor

Desventajas:

  • Depende de JavaScript
  • No es óptimo para SEO
  • Carga inicial más lenta

Renderizado del lado del servidor

El HTML se genera previamente en el servidor:

javascript
// Ejemplo Node.js
const fs = require('fs');
const marked = require('marked');

const markdown = fs.readFileSync('documento.md', 'utf8');
const html = marked.parse(markdown);

Ventajas:

  • Óptimo para SEO
  • Carga rápida
  • No depende de JavaScript en el cliente

Desventajas:

  • Carga en el servidor
  • Gestión de caché compleja

Generación de sitios estáticos

Todas las páginas se generan por adelantado durante la build:

bash
# Con VitePress
npm run build

Ventajas:

  • Velocidad de carga máxima
  • Mejor SEO
  • Alta seguridad
  • Distribución sencilla

Desventajas:

  • Soporte limitado para contenido dinámico
  • Tiempos de build más largos

Mecanismos de extensión

Sistema de plugins

Muchos analizadores soportan extensiones mediante plugins:

javascript
// Ejemplo de plugin markdown-it
const md = require('markdown-it')()
  .use(require('markdown-it-footnote'))
  .use(require('markdown-it-deflist'))
  .use(require('markdown-it-abbr'));

Renderizador personalizado

javascript
// Renderizador personalizado para enlaces
const renderer = new marked.Renderer();
renderer.link = function(href, title, text) {
  return `<a href="${href}" target="_blank">${text}</a>`;
};

Optimización del rendimiento

Estrategia de caché

javascript
const cache = new Map();

function parseMarkdown(content) {
  const hash = generateHash(content);
  if (cache.has(hash)) {
    return cache.get(hash);
  }
  
  const result = marked.parse(content);
  cache.set(hash, result);
  return result;
}

Carga diferida (Lazy Loading)

javascript
// Analiza solo el área visible
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      parseAndRender(entry.target);
    }
  });
});

Procesamiento en streaming

javascript
// Análisis en flujo para archivos grandes
const fs = require('fs');
const { Transform } = require('stream');

const markdownTransform = new Transform({
  transform(chunk, encoding, callback) {
    const html = marked.parse(chunk.toString());
    callback(null, html);
  }
});

fs.createReadStream('documento-grande.md')
  .pipe(markdownTransform)
  .pipe(fs.createWriteStream('output.html'));

Problemas comunes

1. Problemas con saltos de línea

Diferentes analizadores pueden manejar los saltos de línea de forma distinta:

markdown
Línea 1
Línea 2        ← Pueden interpretarse como el mismo párrafo

Línea 1  
Línea 2        ← Dos espacios al final de la línea fuerzan un salto de línea

Línea 1

Línea 2        ← Una línea en blanco separa los párrafos

2. Mezcla de HTML

markdown
Esto es una mezcla de **Markdown** y <em>HTML</em>.

Presta atención a cerrar y anidar correctamente las etiquetas HTML.

3. Escape de caracteres especiales

markdown
Aquí debes escapar \* y \_ .

Escenarios de aplicación práctica

1. Sistemas de blogs

Artículos Markdown → Generador de sitios estáticos → Sitio web HTML

2. Sitios de documentación

Documentos .md → VitePress/Docusaurus → Documentación online

3. Archivos README

README.md → GitHub/GitLab → Página principal del proyecto

4. Apps de notas

Notas Markdown → Renderizado en tiempo real → Visualización rich text

Próximos pasos

Ahora que sabes cómo funciona Markdown, puedes:

Built by www.markdownlang.com