Markdown a HTML

Genera HTML desde Markdown simple: títulos, listas, negrita, enlaces y código inline. Para documentación y web.

{{ markdownToHtml.message }}

{{ t("markdownToHtmlHint") }}

Descripción

John Gruber creó Markdown en 2004, en colaboración con Aaron Swartz — el mismo Aaron Swartz que cofundó Reddit, desarrolló RSS 1.0 y fue uno de los más importantes activistas por la apertura de internet. La idea era resolver un problema que todo escritor técnico conocía: el HTML es ruido visual cuando intentas leer el texto plano. Un artículo con `<p>`, `<strong>` y `<a href=...>` sigue siendo texto, pero las etiquetas contaminan la lectura. Gruber quería un formato que fuera legible como texto simple y que también pudiera convertirse en HTML sin esfuerzo — y en gran medida lo logró.

La adopción fue silenciosa pero transformadora. GitHub adoptó Markdown para los READMEs en 2009 y el estatus del formato cambió: a partir de entonces, cada repositorio de código abierto tenía documentación legible. Stack Overflow, Reddit, Discord, Notion, Obsidian, Jira — en 2024 es más fácil listar las herramientas que no admiten Markdown que las que sí lo hacen. El formato se convirtió en la lingua franca de la documentación técnica. Surgieron dialectos: CommonMark (especificación formal de 2014), GitHub Flavored Markdown (con tablas y listas de tareas), MDX (Markdown con componentes JSX). Esta herramienta implementa la sintaxis básica de CommonMark.

El output es un fragmento HTML — sin `<html>`, `<head>` ni `<body>`. Si vas a mostrar ese HTML directamente en el navegador con contenido de terceros, presta atención al XSS: un enlace `[clic](javascript:alert(1))` es Markdown válido y genera un `href` ejecutable. En producción con contenido no confiable, pasa siempre el HTML generado por una biblioteca de sanitización como DOMPurify antes de insertarlo en el DOM.

Detalle técnico

CommonMark, GitHub Flavored Markdown y MDX: un formato, muchos dialectos

  • La especificación original de Markdown (2004) era deliberadamente informal: un archivo de texto con ejemplos, no una gramática formal. Eso llevó a años de incompatibilidades entre parsers distintos: texto que funcionaba en GitHub no se renderizaba igual en Reddit o en Pandoc. En 2012, Jeff Atwood (fundador de Stack Overflow) y John MacFarlane iniciaron el proyecto que se convirtió en CommonMark: una especificación formal con más de 600 pruebas de conformidad.
  • GitHub Flavored Markdown (GFM) es un superconjunto de CommonMark que añade tablas (con columnas delimitadas por `|`), listas de tareas (`- [x]`), tachado (`~~texto~~`), menciones a usuarios (`@nombre`) y referencias a issues (`#123`). La mayoría de las herramientas modernas admite GFM o CommonMark como base.
  • MDX surgió como solución para el ecosistema React: permite escribir componentes JSX directamente dentro de archivos Markdown, lo que hace posible usar `<Chart data={datos} />` o `<Callout>Atención</Callout>` dentro de la documentación. Es usado por Next.js, Docusaurus, Astro y Gatsby.
  • Los parsers JavaScript más utilizados son: marked.js (simple, rápido, sin dependencias), markdown-it (extensible, soporte de plugins), commonmark.js (implementación de referencia de la especificación CommonMark) y remark (ecosistema unificado de plugins para procesar y transformar Markdown como AST).
  • Pandoc es el conversor universal de documentos en línea de comandos. Admite Markdown → HTML, PDF (vía LaTeX), DOCX, EPUB y más de 60 formatos. Es la opción correcta cuando necesitas soporte completo de la especificación, notas al pie, citas bibliográficas o tablas complejas que las herramientas simples no cubren.

Sanitización de HTML: por qué el output de Markdown puede ser peligroso

  • La mayoría de los parsers Markdown permiten HTML crudo inline en el documento. Un bloque como `<script>alert('xss')</script>` dentro de un archivo Markdown es técnicamente válido y se pasará directamente al output HTML. Si ese output se muestra sin sanitizar, el script se ejecuta en el navegador del visitante.
  • El vector de ataque más común es a través de enlaces: `[haz clic](javascript:alert(1))` es Markdown válido y genera `<a href="javascript:alert(1)">`. Algunos parsers tienen una opción para bloquear URLs con el esquema `javascript:`, pero no es el comportamiento por defecto. Consulta la documentación de tu parser.
  • DOMPurify es la biblioteca del lado del cliente más utilizada para sanitizar HTML en el navegador. Elimina scripts, atributos de eventos como `onclick`, URLs `javascript:` y otros vectores de XSS, pero conserva el formato seguro. Es ligera, rápida y se mantiene activamente: `DOMPurify.sanitize(html)`.
  • En el lado del servidor, las opciones son: sanitize-html (Node.js, muy configurable — permite definir qué etiquetas y atributos están permitidos), Bleach (Python, desarrollado originalmente por Mozilla), HtmlSanitizer (.NET) y HTMLPurifier (PHP). Usa sanitización server-side cuando el HTML se persiste en base de datos o se envía por correo electrónico.
  • Cuándo puedes saltarte la sanitización: si el Markdown lo escriben exclusivamente miembros autenticados de confianza (autores de tu propio CMS), si controlas todo el contenido y nunca proviene de terceros, o si el HTML generado se usa únicamente en contexto interno (PDF, correo a lista cerrada). En caso de duda, sanitiza siempre.

Fragmentos de Código

Referencia de sintaxis Markdown (CommonMark)
# Título h1
## Título h2
### Título h3

Párrafo con **negrita**, *cursiva* y `código inline`.

- Elemento de lista no ordenada
- Otro elemento
  - Subelemento con 2 espacios de sangría

1. Lista numerada
2. Segundo elemento

[Texto del enlace](https://ejemplo.com)
![Alt de la imagen](ruta/imagen.png)

> Cita en bloque

```javascript
// Bloque de código con resaltado de sintaxis
const x = 42;
```

---
<!-- Separador horizontal -->
marked.js + DOMPurify (sanitización segura en el navegador)
import { marked } from 'marked';
import DOMPurify from 'dompurify';

// Configuración de marked
marked.setOptions({
  gfm: true,     // GitHub Flavored Markdown
  breaks: false, // Un salto de línea simple no se convierte en <br>
});

function markdownAHtmlSeguro(markdown) {
  // 1. Convertir Markdown a HTML
  const htmlBruto = marked.parse(markdown);

  // 2. Sanitizar HTML (elimina scripts, javascript:, onclick, etc.)
  const htmlSeguro = DOMPurify.sanitize(htmlBruto, {
    ALLOWED_TAGS: ['p', 'strong', 'em', 'code', 'pre', 'blockquote',
                   'ul', 'ol', 'li', 'a', 'h1', 'h2', 'h3', 'h4',
                   'img', 'hr', 'br'],
    ALLOWED_ATTR: ['href', 'src', 'alt', 'title', 'class'],
  });

  return htmlSeguro;
}

// Uso:
document.getElementById('contenido').innerHTML =
  markdownAHtmlSeguro(textoDeEntrada);

Ejemplo

# Guia

- passo **um**
- [site](https://example.com)

Preguntas frecuentes

¿Para qué sirve esta herramienta?

Funciona por completo en tu navegador: sirve para validar, formatear o convertir datos en el día a día.

¿Se envían mis datos a algún servidor?

El procesamiento es local con JavaScript. No almacenamos lo que pegas en los campos de texto.

¿Puedo usarlo con datos reales en producción?

Úsalo bajo tu responsabilidad. Para secretos (contraseñas, tokens), prefiere entornos controlados y políticas internas. Recuerda de revisar los contenidos generados. Nunca confies ciegamente en cosas que ves en internet.