Marcação com sabor padrão

Em 2009, eu lamentei o estado do Markdown:

No momento, temos o pior dos dois mundos. Falta de liderança do topo e um monte de esforços fragmentados e mal coordenados da comunidade para promover o Markdown, nenhum dos quais é oficialmente canônico. Isso não é apenas inconveniente para quem tenta encontrar informações precisas sobre o Markdown; na verdade, está prejudicando o futuro do projeto.

No final de 2012, David Greenspan, da Meteoro me procurou e propôs que seguíssemos em frente, e o um projeto se cristalizou:

Proponho que o Stack Exchange, o GitHub, o Meteor, o Reddit e qualquer outra empresa com muito tráfego e um investimento estratégico em Markdown trabalhem juntos para criar uma especificação oficial do Markdown e conjuntos de testes padrão para validar as implementações do Markdown. Todos nós estamos trabalhando com propósitos diferentes há muito tempo, fragmentando acidentalmente o Markdown enquanto o popularizamos.

Formamos um pequeno grupo de trabalho privado com representantes importantes do GitHub, do Reddit, do Stack Exchange e da comunidade de código aberto. Passamos meses acertando os detalhes e concordando com as alterações necessárias para transformar o Markdown em uma linguagem que possa ser analisada sem que o usuário sinta que acabou de entrar em um esgoto, preservando o espírito simples, claro e inspirado no e-mail ASCII do Markdown.

Tivemos muita dificuldade com isso na Discursoque também é baseado em Markdown, mas em um dialeto ainda mais complexo do que o que criamos no Stack Overflow. No Discourse, o senhor pode misturar três formas de marcação de forma intercambiável:

  • Markdown
  • HTML (subconjunto seguro)
  • BBCode (subconjunto)

O Discourse é principalmente um aplicativo JavaScript, portanto, naturalmente, precisávamos de uma implementação agradável e compatível do Markdown em JavaScript. Com certeza isso existe, certo? Não. Mesmo em 2012, encontramos zero implementações JavaScript de Markdown que puderam passar no único conjunto de testes de Markdown que conheço, MDTest. Não é uma autoridade, é uma iniciativa criada pela comunidade que incorpora suas próprias decisões sobre a renderização de ambiguidades em Markdown, mas é tudo o que temos. Contribuímos com muitos correções do upstream para o markdown.js para que ele seja aprovado no MDTest, mas ele ainda só é aprovado em nossa versão localmente estendida.

Como nós mesmos somos um projeto de código aberto, estamos perfeitamente felizes em contribuir com o código upstream para aprimorá-lo para todos. Mas é uma acusação do estado do ecossistema Markdown que qualquer implementação remotamente popular ainda não tenha sido testada em relação a uma especificação formal e a um conjunto de testes. Mas quem pode culpá-los, porque o não existia!

Bem, agora existe.

Demorou um pouco, mas tenho o prazer de anunciar que o Markdown padrão está finalmente pronto para revisão pública.

standardmarkdown.com

Trata-se de uma especificação, incluindo exemplos incorporados e implementações em C e JavaScript portáteis. Nós nos esforçamos muito para nos mantermos fiéis ao espírito do Markdown ao escrevê-la. O autor principal, John MacFarlane, explica na introdução da especificação:

Como a descrição da sintaxe de Gruber deixa muitos aspectos da sintaxe indeterminados, escrever uma especificação precisa requer a tomada de um grande número de decisões, muitas delas um tanto arbitrárias. Ao tomá-las, recorri a convenções existentes e a considerações de simplicidade, legibilidade, poder de expressão e consistência. Tentei garantir que os documentos “normais” nas muitas implementações incompatíveis existentes do markdown sejam renderizados, na medida do possível, como seus autores pretendiam. E tentei fazer com que as regras para diferentes elementos funcionassem juntas de forma harmoniosa. Em lugares onde decisões diferentes poderiam ter sido tomadas (por exemplo, as regras que regem a indentação de listas), expliquei a lógica de minhas escolhas. Em alguns casos, afastei-me um pouco da descrição da sintaxe canônica, de forma que acredito que os objetivos do markdown, conforme declarados nessa descrição, sejam mais avançados.

Parte da minha contribuição para o projeto é hospedar a discussão/lista de discussão do Standard Markdown em uma instância do Discourse.

talk.standardmarkdown.com

Felizmente, o próprio Discourse acaba de chegar à versão 1.0. Se a única coisa que o Standard Markdown fizer for ajudar a salvar alguns usuários do horror contínuo que é a interface de usuário da Web para listas de discussão, todos nós ganharemos.

O que mais me entusiasma é o fato de termos recebido uma contribuição maciça da única pessoa que, na minha opinião, era a pessoa mais perfeita do mundo para trabalhar nesse projeto: John MacFarlane. Ele recebeu nosso feedback e escreveu toda a especificação do Standard Markdown e as duas implementações.

Muitas pessoas conhecem John por meio de seu Pandoc que é incrível por si só, mas eu o conheci porque ele construiu o Babelmark. Aprendi a usar muito o Babelmark enquanto trabalhava no Stack Overflow e no MarkdownSharp, uma implementação em C# do Markdown.

A loucura do Markdown é a seguinte: para decidir qual é o comportamento “correto”, o senhor fornece amostras de Markdown para mais de 20 analisadores de Markdown diferentes… e depois reza para que surja algum consenso em todos os resultados. É isso que o Babelmark faz.

Considere este exemplo simples de Markdown:

# Hello there

This is a paragraph.

- one
- two
- three
- four

1. pirate
2. ninja
3. zombie

Só para isso, eu conto quinze saídas renderizadas diferentes de 22 analisadores Markdown diferentes.

Em Markdown, nós literalmente construiu um Torre de Babel.

Já mencionei que é uma boa ideia que uma linguagem tenha uma especificação formal e conjuntos de testes? Talvez agora o senhor possa entender por que isso acontece.

Ah, e em seu tempo livre, John também é o presidente do departamento de filosofia da Universidade da Califórnia, em Berkeley. Nada demais. Embora eu não queira minimizar as contribuições de ninguém para o projeto Standard Markdown, todos nós devemos um agradecimento especial ao John.

De fato, o Markdown está em toda parte. E isso é uma coisa boa. Mas ele precisa ser sensato, analisável e padrão. Esse é o objetivo do Markdown padrão – mas precisamos da ajuda dos senhores para chegar lá. Se o senhor usa Markdown em um site, pergunte o que seria necessário para que esse site se tornasse compatível com o Markdown padrãoQuando o senhor vê a palavra “Markdown”, tem o direito de esperar uma renderização consistente em todos os sites que visita. Se o senhor implementar o Markdown, dê uma olhada na especificação, tente tornar seu analisador compatível com o Standard Markdowne discutir melhorias ou aprimoramentos para a especificação.

Atualizar: O projeto foi renomeado para CommonMark. Veja Meu próximo post no blog.

[advertisement] Como o(a) senhor(a) está exibindo o seu incrível? Crie um Perfil do Stack Overflow Careers e mostre todo o seu trabalho árduo no Stack Overflow, no Github e em praticamente todos os outros sites de codificação. Quem sabe, o senhor pode até ser recrutado para uma grande novo cargo!