Markdown para HTML

Gere fragmento HTML a partir de Markdown simples: títulos, listas, negrito, links e código inline. Para documentação e conteúdo web.

{{ markdownToHtml.message }}

{{ t("markdownToHtmlHint") }}

Descrição

John Gruber criou o Markdown em 2004, em colaboração com Aaron Swartz — o mesmo Aaron Swartz que cofundou o Reddit, desenvolveu o RSS 1.0 e foi um dos maiores ativistas pela abertura da internet. A ideia era resolver um problema que todo escritor técnico conhecia: HTML é ruído visual quando você tenta ler o texto puro. Um artigo com `<p>`, `<strong>` e `<a href=...>` ainda é texto, mas as tags poluem a leitura. Gruber queria um formato que fosse legível como texto simples e que também pudesse ser convertido em HTML sem esforço — e em grande parte conseguiu.

A adoção foi silenciosa mas transformadora. GitHub adotou Markdown para READMEs em 2009 e o formato mudou de status: de pronto, cada repositório open source tinha documentação legível. Stack Overflow, Reddit, Discord, Notion, Obsidian, Jira — em 2024 é mais fácil listar as ferramentas que não suportam Markdown do que as que suportam. O formato virou a lingua franca da documentação técnica. Surgiram dialetos: CommonMark (especificação formal de 2014), GitHub Flavored Markdown (com tabelas e task lists), MDX (Markdown com componentes JSX). Esta ferramenta implementa a sintaxe básica do CommonMark.

O output é um fragmento HTML — sem `<html>`, `<head>` ou `<body>`. Se você vai exibir esse HTML diretamente no browser com conteúdo de terceiros, atenção ao XSS: um link `[clique](javascript:alert(1))` é Markdown válido e gera um `href` executável. Em produção com conteúdo não confiável, sempre passe o HTML gerado por uma biblioteca de sanitização como DOMPurify antes de inserir no DOM.

Detalhamento técnico

CommonMark, GitHub Flavored Markdown e MDX: um formato, muitos dialetos

  • A especificação original do Markdown (2004) era deliberadamente informal — um arquivo de texto com exemplos, não uma gramática formal. Isso levou a anos de incompatibilidades entre parsers diferentes: texto que funcionava no GitHub não renderizava igual no Reddit ou no Pandoc. Em 2012, Jeff Atwood (fundador do Stack Overflow) e John MacFarlane iniciaram o projeto que virou o CommonMark: uma especificação formal com mais de 600 testes de conformidade.
  • O GitHub Flavored Markdown (GFM) é um superconjunto do CommonMark que adiciona tabelas (com colunas delimitadas por `|`), task lists (`- [x]`), strikethrough (`~~texto~~`), menções a usuários (`@nome`) e referências a issues (`#123`). A maioria das ferramentas modernas suporta GFM ou CommonMark como base.
  • O MDX surgiu como solução para o ecossistema React: permite escrever componentes JSX diretamente dentro de arquivos Markdown, tornando possível usar `<Chart data={dados} />` ou `<Callout>Atenção</Callout>` dentro de documentação. É usado por Next.js, Docusaurus, Astro e Gatsby.
  • Os parsers JavaScript mais usados são: marked.js (simples, rápido, sem dependências), markdown-it (extensível, suporte a plugins), commonmark.js (implementação de referência da especificação CommonMark) e remark (ecossistema unificado de plugins para processar e transformar Markdown como AST).
  • O Pandoc é o conversor universal de documentos em linha de comando. Suporta Markdown → HTML, PDF (via LaTeX), DOCX, EPUB e mais de 60 formatos. É a escolha certa quando você precisa de suporte completo à especificação, notas de rodapé, citações bibliográficas ou tabelas complexas que ferramentas simples não cobrem.

Sanitização de HTML: por que o output do Markdown pode ser perigoso

  • A maioria dos parsers Markdown permite HTML bruto inline no documento. Um bloco como `<script>alert('xss')</script>` dentro de um arquivo Markdown é tecnicamente válido e será passado diretamente para o output HTML. Se esse output for exibido sem sanitização, o script executa no browser do visitante.
  • O ataque mais comum é via links: `[clique aqui](javascript:alert(1))` é Markdown válido e gera um `<a href="javascript:alert(1)">`. Alguns parsers têm opção para bloquear URLs com esquema `javascript:`, mas não é padrão. Verifique a documentação do seu parser.
  • DOMPurify é a biblioteca client-side mais usada para sanitizar HTML no browser. Remove scripts, atributos de eventos como `onclick`, URLs `javascript:` e outros vetores de XSS, mas preserva a formatação segura. É leve, rápida e mantida ativamente: `DOMPurify.sanitize(html)`.
  • No lado do servidor, as opções são: sanitize-html (Node.js, altamente configurável — permite definir quais tags e atributos são permitidos), Bleach (Python, originalmente desenvolvido pelo Mozilla), HtmlSanitizer (.NET) e HTMLPurifier (PHP). Use sanitização server-side quando o HTML é persistido em banco de dados ou enviado por e-mail.
  • Quando você pode pular a sanitização: se o Markdown é escrito exclusivamente por membros autenticados de confiança (autores de um CMS próprio), se você controla todo o conteúdo e ele nunca vem de terceiros, ou se o HTML gerado é usado apenas em contexto interno (PDF, e-mail para lista fechada). Em caso de dúvida, sanitize sempre.

Exemplo de Código

Referência de sintaxe Markdown (CommonMark)
# Título h1
## Título h2
### Título h3

Parágrafo com **negrito**, *itálico* e `código inline`.

- Item de lista não-ordenada
- Outro item
  - Subitem com 2 espaços de indentação

1. Lista numerada
2. Segundo item

[Texto do link](https://exemplo.com)
![Alt da imagem](caminho/imagem.png)

> Citação em bloco

```javascript
// Bloco de código com realce de sintaxe
const x = 42;
```

---
<!-- Separador horizontal -->
marked.js + DOMPurify (sanitização segura no browser)
import { marked } from 'marked';
import DOMPurify from 'dompurify';

// Configuração do marked
marked.setOptions({
  gfm: true,     // GitHub Flavored Markdown
  breaks: false, // Quebra de linha simples não vira <br>
});

function markdownParaHtmlSeguro(markdown) {
  // 1. Converter Markdown para HTML
  const htmlBruto = marked.parse(markdown);

  // 2. Sanitizar HTML (remove 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('conteudo').innerHTML =
  markdownParaHtmlSeguro(textoDaEntrada);

Exemplo

# Guia

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

Perguntas frequentes

Para que serve esta ferramenta?

Ela roda 100% no seu navegador: útil para validar, formatar ou converter dados no dia a dia de desenvolvimento.

Meus dados são enviados a algum servidor?

O processamento é feito localmente via JavaScript. Não armazenamos o conteúdo que você cola nas caixas de texto.

Posso usar em produção ou para dados reais?

Use por sua conta e risco. Para segredos (senhas, tokens), prefira ambientes controlados e políticas da sua empresa. E lembre sempre de revisar os conteúdos gerados. Nunca confie cegamente nas coisas que vê na internet.