menu

Sintaxe Completa de Formatação Markdown no GitHub

Esta especificação formal é baseada no CommonMark Spec de John MacFarlane e licenciada sob Creative Commons BY-SA.

Introdução

O que é o Markdown com sabor do GitHub?

O Markdown com sabor do GitHub, geralmente abreviado como GFM, é o dialeto do Markdown atualmente suportado pelo conteúdo do usuário no GitHub.com e no GitHub Enterprise.

Essa especificação formal, com base na CommonMark Spec, define a sintaxe e a semântica deste dialeto.

GFM é um superconjunto estrito do CommonMark. Todos os recursos suportados no conteúdo do usuário do GitHub e que não são especificados na CommonMark Spec original são, portanto, conhecidos como extensões e destacados como tal.

Embora o GFM ofereça suporte a uma ampla variedade de entradas, é importante notar que o GitHub.com e o GitHub Enterprise executam pós-processamento e higienização adicionais após a conversão do GFM em HTML para garantir a segurança e a consistência do site.

O que é Markdown?

O Markdown é um formato de texto sem formatação para escrever documentos estruturados, com base em convenções para indicar a formatação em mensagens de email e usenet. Foi desenvolvido por John Gruber (com a ajuda de Aaron Swartz) e lançado em 2004 na forma de uma descrição de sintaxe e um script Perl (Markdown.pl) para converter Markdown em HTML. Na década seguinte, dezenas de implementações foram desenvolvidas em vários idiomas. Alguns estenderam a sintaxe original do Markdown com convenções para notas de rodapé, tabelas e outros elementos do documento. Alguns permitiram que documentos Markdown fossem renderizados em formatos diferentes de HTML. Sites como Reddit, StackOverflow e GitHub tinham milhões de pessoas usando o Markdown. E o Markdown começou a ser usado além da web, para criar livros, artigos, apresentações de slides, cartas e notas de aula.

O que distingue o Markdown de muitas outras sintaxes de marcação leves, que geralmente são mais fáceis de escrever, é sua legibilidade. Como Gruber escreve:

O objetivo principal do design da sintaxe de formatação do Markdown é torná-lo o mais legível possível. A idéia é que um documento no formato Markdown seja publicável como está, como texto sem formatação, sem parecer ter sido marcado com tags ou instruções de formatação. (http://daringfireball.net/projects/markdown/ )

O ponto pode ser ilustrado comparando uma amostra do AsciiDoc com uma amostra equivalente do Markdown. Aqui está uma amostra do AsciiDoc do manual do AsciiDoc:

1. Primeiro item da lista.
+
Primeiro item da lista continua com um segundo parágrafo seguido por um bloco recuado.
+
.................
$ ls *.sh
$ mv *.sh ~/tmp
.................
+
Item da lista continua com um terceiro parágrafo.

2. Segundo elemento da lista continua com um bloco aberto.
+
--
Este parágrafo faz parte do item de lista anterior.

a. Esta lista está aninhada e não requer continuação explícita do elemento.
+
Este parágrafo faz parte do item de lista anterior.

b. Elemento da lista b.

Este parágrafo pertence ao item dois da lista externa.
--
E aqui está o equivalente em Markdown:
1.  Primeiro item da lista.

  Primeiro item da lista continua com um segundo parágrafo seguido por um bloco recuado.

    $ ls *.sh
    $ mv *.sh ~/tmp

  Item da lista continua com um terceiro parágrafo.

2. Segundo elemento da lista continua com um bloco aberto.

  Este parágrafo faz parte do item de lista anterior.

  1. Esta lista está aninhada e não requer continuação explícita do elemento.

    Este parágrafo faz parte do item de lista anterior.

  2. Elemento da lista b.

  Este parágrafo pertence ao item dois da lista externa.

A versão do AsciiDoc é, sem dúvida, mais fácil de escrever. Você não precisa se preocupar com o recuo. Mas a versão Markdown é muito mais fácil de ler. O aninhamento de itens da lista é aparente aos olhos na fonte, não apenas no documento processado.

Por que uma especificação é necessária?

A descrição canônica de John Gruber da sintaxe de Markdown não especifica a sintaxe sem ambiguidade. Aqui estão alguns exemplos de perguntas que ele não responde:

  • Quanto recuo é necessário para uma sub-lista? A especificação diz que os parágrafos de continuação precisam ser recuados quatro espaços, mas não são totalmente explícitos sobre sublistas. É natural pensar que eles também devem ser recuados quatro espaços, mas markdown.pl não especifica isso. Este não é um caso isolado, e as divergências entre implementações sobre esse assunto geralmente levam a surpresas para os usuários editando documentos reais. (Veja este comentário (em inglês) de John Gruber.)
  • É necessária uma linha em branco antes de um bloco de citação ou título/cabeçalho? A maioria das implementações não requer a linha em branco. No entanto, isso pode levar a resultados inesperados em texto não processado e também a ambiguidades na análise (observe que algumas implementações colocam o cabeçalho dentro do bloco de notas, enquanto outras não). (John Gruber também falou (em inglês) a favor de exigir as linhas em branco.)
  • É necessária uma linha em branco antes de um bloco de código recuado? (No markdown.pl é requerido, mas isso não é mencionado na documentação, e algumas implementações não exigem.)

    parágrafo
        código?
  • Qual é a regra exata para determinar quando os itens da lista são agrupados em tags <p>? Uma lista pode ser parcialmente "frouxa" e parcialmente "apertada"? O que devemos fazer com uma lista como esta?

    1. um
    
    2. dois
    3. três

    Ou esta?

    1.  um
        - a
    
        - b
    2.  dois

    (Existem alguns comentários relevantes de John Gruber (em inglês) aqui.)

  • Os marcadores de lista podem ser recuados? Os marcadores de lista ordenada podem ser alinhados à direita?

         8. item 1
         9. item 2
        10. item 2a
  • Esta é uma lista com uma quebra temática em seu segundo item, ou duas listas separadas por uma quebra temática?

    * a
    * * * * *
    * b
  • Quando os marcadores da lista mudam de números para marcadores, temos duas listas ou uma? (A descrição da sintaxe do Markdown sugere que temos, mas os scripts perl e muitas outras implementações produzem apenas uma.)

    1. fee
    2. fie
    -  foe
    -  fum
  • Quais são as regras de precedência para os marcadores da estrutura embutida? Por exemplo, o link a seguir é válido ou denotação de código entre crases `` tem precedência?

    [uma crase (`)](/url) e [outra crase (`)](/url).
  • Quais são as regras de precedência para marcadores de ênfase? Por exemplo, como a seguinte formatação deve ser renderizada?

    *foo *bar* baz*
  • Quais são as regras de precedência entre a estrutura em nível de bloco e em linha? Por exemplo, como a seguinte formatação deve ser renderizada?

    - `uma linha de código longa pode conter um hífen como este
      - e estragar tudo`
  • Os itens da lista podem incluir títulos de seção? (Markdown.pl não permite isso, mas permite que os blocos de citação incluam títulos.)

    - # Heading
  • Os itens da lista podem estar vazios?

    * a
    *
    * b
  • As referências de link podem ser definidas dentro de blocos de citação ou dentro de elementos de uma lista?

    > Bloco de citação [foo].
    >
    > [foo]: /url
  • Se houver várias definições para a mesma referência, qual tem precedência?

    [foo]: /url1
    [foo]: /url2
    
    [foo][]

Na ausência de uma especificação, os primeiros implementadores consultaram Markdown.pl para resolver essas ambiguidades. Mas Markdown.pl era bastante instável e apresentou resultados ruins em muitos casos, por isso não foi um substituto satisfatório para uma especificação.

Como não há especificação sem margem para ambiguidade, as implementações divergem consideravelmente. Como resultado, os usuários geralmente ficam surpresos ao descobrir que um documento que é processado de uma maneira em um sistema (por exemplo, um wiki do GitHub) é processado de maneira diferente em outro (por exemplo, convertendo para docbook usando pandoc). Para piorar a situação, nada no Markdown conta como um "erro de sintaxe", assim a divergência geralmente não é descoberta imediatamente.

Sobre este documento

Este documento tenta especificar a sintaxe do Markdown sem ambiguidade. Ele contém muitos exemplos usando Markdown lado a lado com o resultante em HTML. O objetico dos exemplos é duplicar os testes de conformidade. Um script anexo spec_tests.py pode ser usado para executar os testes em qualquer programa Markdown:

python test/spec_tests.py --spec spec.txt --program PROGRAM

Como este documento descreve como o Markdown deve ser analisado em uma árvore de sintaxe abstrata, faria sentido usar uma representação abstrata da árvore de sintaxe em vez de HTML. Mas o HTML é capaz de representar as distinções estruturais que precisamos fazer, e a escolha do HTML para os testes torna possível executar os testes em uma implementação sem escrever um renderizador de árvore de sintaxe abstrata.

Este documento é gerado a partir de um arquivo de texto spec.txt, escrito em Markdown com uma pequena extensão para os testes lado a lado. O script tools/makespec.py pode ser usado para converter spec.txt em HTML ou CommonMark (que pode ser convertido em outros formatos).

Nos exemplos, a setinha para a direita representa uma tabulação, LF representa uma quebra de linha do inglês Line Feed e o ponto . no centro da linha representa um espaço.

Preliminares

Caracteres e linhas

Qualquer sequência de caracteres é um documento CommonMark válido.

Um caractere é um ponto de código Unicode. Embora alguns pontos de código (por exemplo, combinar acentos) não correspondam aos caracteres em um sentido intuitivo, todos os pontos de código contam como caracteres para os fins desta especificação.

Esta especificação não define uma codificação; pensa nas linhas como compostas de caracteres em vez de bytes. Um analisador em conformidade pode ser limitado a uma determinada codificação.

Uma linha é uma sequência de zero ou mais caracteres que não seja uma nova linha do inglês newline (U+000A) ou retorno de linha do inglês carriage return (U+000D), seguida por uma linha final ou pelo final do arquivo.

Um final de linha é uma nova linha (U+000A), uma quebra de linha (U+000D) não seguida por uma nova linha ou uma quebra de linha e uma nova linha a seguir.

Uma linha que não contém caracteres, ou uma linha que contém apenas espaços (U+0020) ou tabulações (U+0009), é chamada de linha em branco .

As seguintes definições de classes de caracteres serão usadas nesta especificação:

Um caractere de espaço em branco é um espaço (U+0020), tabulação (U+0009), nova linha (U+000A), tabulação de linha (U+000B), form feed (U+000C) ou quebra de linha (U+000D).

Espaço em branco é uma sequência de um ou mais caracteres de espaço em branco.

Um caractere de espaço em branco Unicode é qualquer ponto de código na categoria geral Unicode Zs ou uma tabulação (U+0009), quebra de linha (U+000D), nova linha (U+000A) ou form feed (U+000C).

O espaço em branco Unicode é uma sequência de um ou mais caracteres de espaço em branco Unicode .

Um espaço é U+0020.

Um caractere que não é um espaço em branco é qualquer caractere que não seja um caractere de espaço em branco .

Um caractere de pontuação ASCII é !, ", #, $, %, &, ', (, ), *, +, ,, -, ., / (U+0021-2F), :, ;, <, =, >, ?, @ (U+003A-0040), [, \, ], ^, _, ` (U+005B-0060), {, |, }, ou ~ (U+007B-007E).

Um caractere de pontuação é um caractere de pontuação ASCII ou qualquer coisa nas categorias gerais Unicode Pc, Pd, Pe, Pf, Pi, Po, ou Ps.

Tabulações

Tabulações em linhas não são expandidas para espaços. No entanto, em contextos em que o espaço em branco ajuda a definir a estrutura do bloco, as tabulações se comportam como se fossem substituídas por espaços representando uma parada de tabulação de 4 caracteres.

Assim, por exemplo, uma tabulação pode ser usada em vez de quatro espaços em um bloco de código recuado. (Observe, no entanto, que as tabulações internas são passadas como tabulações literais, não expandidas para espaços.)

Exemplo 1
	foo	baz		 bim
<pre><code>foo	baz		bim</code></pre>
Exemplo 2
  	foo	baz		bim
<pre><code>foo	baz		bim</code></pre>
Exemplo 3
    a	a
ὐ	a
<pre><code>a	a
ὐ	a</code></pre>

No exemplo a seguir, um parágrafo de continuação de um item da lista é recuado com uma tabulação; isso tem exatamente o mesmo efeito que um recuo com quatro espaços:

Exemplo 4
  - foo

	bar
<ul>
<li>
<p>foo</p>
<p>bar</p>
</li>
</ul>
Exemplo 5
- foo

		bar
<ul>
<li>
<p>foo</p>
<pre><code>  bar
</code></pre>
</li>
</ul>

Normalmente, o sinal de maior que > que inicia um bloco de citação pode ser seguido opcionalmente por um espaço, que não é considerado parte do conteúdo. No caso seguinte, > é seguido por uma tabulação, que é tratada como se tivesse sido expandida em três espaços. Como um desses espaços é considerado parte do delimitador, foo é considerado seis espaços recuados dentro do contexto do bloco de citação, então obtemos um bloco de código recuado começando com dois espaços.

Exemplo 6
>		foo
<blockquote>
<pre><code>  foo
</code></pre>
</blockquote>
Exemplo 7
-		foo
<ul>
<li>
<pre><code>  foo
</code></pre>
</li>
</ul>
Exemplo 8
    foo
	bar
<pre><code>foo
bar
</code></pre>
Exemplo 9
 - foo
   - bar
	 - baz
<ul>
<li>foo
<ul>
<li>bar
<ul>
<li>baz</li>
</ul>
</li>
</ul>
</li>
</ul>
Exemplo 10
#	Foo
<h1>Foo</h1>
Exemplo 11
*	*	*	
<hr />

Caracteres inseguros

Por motivos de segurança, o caractere Unicode U+0000 deve ser substituído pelo (U+FFFD).

Blocos e Conteúdo Em Linha

Podemos pensar em um documento como uma sequência de blocos - elementos estruturais como parágrafos, blocos de citação, listas, títulos, linhas e blocos de código. Alguns blocos (como blocos de citação e elementos de uma lista) contêm outros blocos; outros (como títulos e parágrafos) contêm conteúdo embutido - texto, links, texto enfatizado, imagens, linhas de código e assim por diante.

Precedência

Os indicadores da estrutura de blocos sempre têm precedência sobre os indicadores da estrutura em linha/embutida. Por exemplo, a lista a seguir possui dois itens, não um item que contém um código embutido:

Exemplo 12
- `um
- dois`
<ul>
<li>`um</li>
<li>dois`</li>
</ul>

Isso significa que a análise pode prosseguir em duas etapas: primeiro, a estrutura de bloco do documento pode ser discernida; segundo, as linhas de texto dentro de parágrafos, títulos e outras construções de bloco podem ser analisadas para a estrutura embutida. A segunda etapa requer informações sobre as definições de referência de link que estarão disponíveis apenas no final da primeira etapa. Observe que a primeira etapa requer processar as linhas em sequência, mas a segunda pode ser um processamento em paralelo, pois a análise de um elemento em linha no bloco não afeta a análise em linha de nenhum outro.

Blocos contêiner e blocos folha

Podemos dividir os blocos em dois tipos: blocos contêiner, que podem conter outros blocos, e blocos folha, que não podem.

Blocos folha

Esta seção descreve os diferentes tipos de blocos folha que compõem um documento Markdown.

Quebras temáticas

Uma linha consistindo de 0-3 espaços de recuo, seguido por uma sequência de três ou mais traços -, sublinhados _ ou asteriscos *, cada um seguido, opcionalmente, por qualquer número de espaços ou tabulações, forma uma quebra temática .

Exemplo 13
***
---
___
<hr />
<hr />
<hr />

Caracteres errados:

Exemplo 14
+++
<p>+++</p>
Exemplo 15
===
<p>===</p>

Caracteres insuficientes:

Exemplo 16
--
**
__
<p>--
**
__</p>

São permitidos recuos de um a três espaços:

Exemplo 17
 ***
  ***
   ***
<hr />
<hr />
<hr />

Quatro espaços são muitos:

Exemplo 18
    ***
<pre><code>***</code></pre>
Exemplo 19
Foo
    ***
<p>Foo
***</p>

Mais de três caracteres podem ser usados:

Exemplo 20
_____________________________________
<hr />

Espaços são permitidos entre os caracteres:

Exemplo 21
 - - -
<hr />
Exemplo 22
 **  * ** * ** * **
<hr />
Exemplo 23
-     -      -      -
<hr />

Os espaços são permitidos no final:

Exemplo 24
- - - -    
<hr />

No entanto, nenhum outro caractere pode ocorrer na linha:

Exemplo 25
_ _ _ _ a

a------

---a---
<p>_ _ _ _ a</p>
<p>a------</p>
<p>---a---</p>

É necessário que todos os caracteres que não sejam espaços em branco sejam os mesmos. Portanto, essa não é uma quebra temática:

Exemplo 26
 *-*
<p><em>-</em></p>

As quebras temáticas não precisam de linhas em branco antes ou depois:

Exemplo 27
- foo
***
- bar
<ul>
<li>foo</li>
</ul>

<ul> <li>bar</li> </ul>

Quebras temáticas podem interromper um parágrafo:

Exemplo 28
Foo
***
bar
<p>Foo</p>
<hr />
<p>bar</p>

Se uma linha de hifens, que atenda às condições acima para ser uma quebra temática, também puder ser interpretada como um sintaxe alternativa de título, a renderização como um cabeçalho terá precedência. Assim, por exemplo, este é um cabeçalho alternativo, não um parágrafo seguido de uma quebra temática:

Exemplo 29
Foo
---
bar
<h2>Foo</h2>
<p>bar</p>

Quando ambos, quebra temática e um elemento de lista, são possíveis interpretações de uma linha, a quebra temática tem precedência:

Exemplo 30
* Foo
* * *
* Bar
<ul>
<li>Foo</li>
</ul>
<hr />
<ul>
<li>Bar</li>
</ul>

Se você deseja uma quebra temática em um elemento da lista, use um marcador diferente:

Exemplo 31
- Foo
- * * *
<ul>
<li>Foo</li>
<li>
<hr />
</li>
</ul>

Cabeçalhos ATX

Um cabeçalho ATX consiste em uma sequência de caracteres, analisados ​​como conteúdo embutido, entre uma sequência de abertura de 1 a 6 sinais numéricos # sem escape e uma sequência de fechamento opcional de qualquer número de sinais numéricos # sem escape.

A sequência de abertura de sinais numéricos # deve ser seguida por um espaço ou até o final da linha.

A sequência de fechamento opcional de sinais numéricos # deve ser precedida por um espaço e pode ser seguida apenas por espaços.

O sinal numérico # de abertura pode ser recuado 0-3 espaços.

O conteúdo bruto do cabeçalho é removido dos espaços à esquerda e à direita antes de ser analisado como conteúdo embutido. O nível do cabeçalho é igual ao número de # caracteres na sequência de abertura.

Cabeçalhos simples:

Exemplo 32
# foo
## foo
### foo
#### foo
##### foo
###### foo
<h1>foo</h1>
<h2>foo</h2>
<h3>foo</h3>
<h4>foo</h4>
<h5>foo</h5>
<h6>foo</h6>

Mais de seis #caracteres não é um cabeçalho:

Exemplo 33
####### foo
<p>####### foo</p>

É necessário pelo menos um espaço entre a cerquilha # e o conteúdo do cabeçalho, a menos que o cabeçalho esteja vazio.

Observe que muitas implementações atualmente não requerem espaço. No entanto, o espaço foi exigido pela implementação original do ATX e ajuda a impedir que coisas como as seguintes sejam renderizadas como títulos:

Exemplo 34
#5 bolt

#hashtag
<p>#5 bolt</p>
<p>#hashtag</p>

Este não é um cabeçalho, porque o o sinal numérico está escapado:

Exemplo 35
\## foo
<p>## foo</p>

O conteúdo é analisado como embutido:

Exemplo 36
# foo *bar* \*baz\*
<h1>foo <em>bar</em> *baz*</h1>

Os espaços em branco à esquerda e à direita são ignorados na análise de conteúdo embutido:

Exemplo 37
#                  foo
<h1>foo</h1>

São permitidos recuos de um a três espaços:

Exemplo 38
 ### foo
  ## foo
   # foo
<h3>foo</h3>
<h2>foo</h2>
<h1>foo</h1>

Quatro espaços já e demais:

Exemplo 39
    # foo
<pre><code># foo
</code></pre>
Exemplo 40
foo
    # bar
<p>foo
# bar</p>

Uma sequência de fechamento usando cerquilhas é opcional:

Exemplo 41
## foo ##
  ###   bar    ###
<h2>foo</h2>
<h3>bar</h3>

Não precisa ter o mesmo comprimento que a sequência de abertura:

Exemplo 42
# foo ##################################
##### foo ##
<h1>foo</h1>
<h5>foo</h5>

Os espaços são permitidos após a sequência de fechamento:

Exemplo 43
### foo ###     
<h3>foo</h3>

Uma sequência de sinais numéricos # seguido por qualquer caracteres, exceto espaços em branco, não é uma sequência de fechamento, mas conta como parte do conteúdo do cabeçalho:

Exemplo 44
### foo ### b
<h3>foo ### b</h3>

A sequência de fechamento deve ser precedida por um espaço:

Exemplo 45
# foo#
<h1>foo#</h1>

Cerquilhas escapadas por barra invertida não contam como parte da sequência de fechamento:

Exemplo 46
### foo \###
## foo #\##
# foo \#
<h3>foo ###</h3>
<h2>foo ###</h2>
<h1>foo #</h1>

Os títulos ATX não precisam ser separados do conteúdo circundante por linhas em branco e podem interromper parágrafos:

Exemplo 47
****
## foo
****
<hr />
&lt;h2&gt;foo&lt;/h2&gt;
<hr />
Exemplo 48
Foo bar
# baz
Bar foo
<p>Foo bar</p>
<h1>baz</h1>
<p>Bar foo</p>

Os títulos ATX podem estar vazios:

Exemplo 49
##
#
### ###
<h2></h2>
<h1></h1>
<h3></h3>

Cabeçalhos Setext

Um cabeçalho setext consiste em uma ou mais linhas de texto, cada uma contendo pelo menos um caractere que não seja um espaço em branco, com no máximo 3 recuos de espaços, seguido por um sublinhado de cabeçalho setext.

As linhas de texto devem ser tais que, se não fossem seguidas pelo sublinhado do cabeçalho setext, seriam interpretadas como um parágrafo: não poderão ser interpretadas como uma cerca de código, cabeçalho ATX, bloco de citação, quebra temática, item de lista ou bloco HTML.

Um sublinhado de cabeçalho setext é uma sequência de iguais = ou uma sequência de traços -, com no máximo 3 recuos de espaços e qualquer número de espaços finais.

Se uma linha contém um único traço -, essa será interpretada como um item vazio de uma lista, deve ser interpretada dessa maneira e não como um sublinhado de cabeçalho setext.

O título é um cabeçalho de nível 1, se os caracteres são usados ​​no sublinhado do cabeçalho setext forem =, e um cabeçalho de nível 2, se os caracteres forem -.

O conteúdo do cabeçalho é o resultado da análise das linhas de texto anteriores como conteúdo embutido do CommonMark.

Em geral, um cabeçalho setext não precisa ser precedido ou seguido por uma linha em branco. No entanto, ele não pode interromper um parágrafo; portanto, quando um cabeçalho setext vem após um parágrafo, é necessária uma linha em branco entre eles.

Exemplos simples:

Exemplo 50
Foo *bar*
=========

Foo *bar*
---------
<h1>Foo <em>bar</em></h1>
<h2>Foo <em>bar</em></h2>

O conteúdo do cabeçalho pode abranger mais de uma linha:

Exemplo 51
Foo *bar
baz*
====
<h1>Foo <em>bar
baz</em></h1>

O conteúdo é o resultado da análise, do conteúdo bruto dos títulos, como embutido.

O conteúdo bruto do cabeçalho é formado concatenando as linhas e removendo os espaços em branco inicial e final.

Exemplo 52
  Foo *bar
baz*
====
<h1>Foo <em>bar
baz</em></h1>

O sublinhado pode ter qualquer comprimento:

Exemplo 53
Foo
-------------------------

Foo
=
<h2>Foo</h2>
<h1>Foo</h1>

O conteúdo do cabeçalho pode ser recuado até três espaços e não precisa estar alinhado com o sublinhado:

Exemplo 54
   Foo
---

  Foo
-----

  Foo
  ===
<h2>Foo</h2>
<h2>Foo</h2>
<h1>Foo</h1>

O recuo de quatro espaços é muito:

Exemplo 55
    Foo
    ---

    Foo
    ---
<pre><code>Foo
---

Foo
</code></pre>
<hr />

O sublinhado do cabeçalho setext pode ser recuado até três espaços e pode ter espaços à direita:

Exemplo 56
Foo
   ----      
<h2>Foo</h2>

Quatro espaços é demais:

Exemplo 57
Foo
    ---
<p>Foo
---</p>

O sublinhado do cabeçalho setext não pode conter espaços internos:

Exemplo 58
Foo
= =

Foo
--- -
<p>Foo
= =</p>
<p>Foo</p>
<hr />

Os espaços à direita na linha de conteúdo não causam uma quebra de linha:

Exemplo 59
Foo  
-----
<h2>Foo</h2>

Nem uma barra invertida no final:

Exemplo 60
Foo\
----
<h2>Foo\</h2>

Como os indicadores da estrutura de blocos têm precedência sobre os indicadores da estrutura em linha, os exemplos a seguir são definidos como títulos setext:

Exemplo 61
`Foo
----
`

<a title="um monte
---
de traços"/>
<h2>`Foo</h2>
<p>`</p>
<h2><a title="um montet</h2>
<p>de traços"/></p>

O sublinhado do cabeçalho setext não pode ser uma linha de continuação preguiçosa (do inglês lazy continuation line) em um item de lista ou bloco de citação:

Exemplo 62
> Foo
---
<blockquote>
<p>Foo</p>
</blockquote>
<hr />
Exemplo 63
> foo
bar
===
<blockquote>
<p>foo
bar
===</p>
</blockquote>
Exemplo 64
- Foo
---
<ul>
<li>Foo</li>
</ul>
<hr />

É necessária uma linha em branco entre um parágrafo e um cabeçalho setext, pois, caso contrário, o parágrafo se tornará parte do conteúdo do título:

Exemplo 65
Foo
Bar
---
<h2>Foo
Bar</h2>

Mas, em geral, uma linha em branco não é necessária antes ou depois dos títulos setext:

Exemplo 66
---
Foo
---
Bar
---
Baz
<hr />
<h2>Foo</h2>
<h2>Bar</h2>
<p>Baz</p>

Os títulos do setext não podem estar vazios:

Exemplo 67
====
<p>====</p>

As linhas de texto do cabeçalho Setext não devem ser interpretáveis ​​como construções de bloco que não sejam parágrafos. Portanto, a linha de traços nesses exemplos é interpretada como uma quebra temática:

Exemplo 68
---
---
<hr />
<hr />
Exemplo 69
- foo
-----
<ul>
<li>foo</li>
</ul>
<hr />
Exemplo 70
    foo
---
<pre><code>foo
</code></pre>
<hr />
Exemplo 71
> foo
-----
<blockquote>
<p>foo</p>
</blockquote>
<hr />

Se você deseja um cabeçalho > foo como texto literal, pode usar escapes de barra invertida:

Exemplo 72
\> foo
------
<h2>> foo</h2>

Nota de compatibilidade: A maioria das implementações existentes do Markdown não permite que o texto dos títulos do setext abranja várias linhas. Mas não há consenso sobre como interpretar

Foo
bar
---
baz

Pode-se encontrar quatro interpretações diferentes:

  • parágrafo "Foo", título "bar", parágrafo "baz"
  • parágrafo "Foo bar", quebra temática, parágrafo "baz"
  • parágrafo “Foo bar - baz”
  • cabeçalho "Foo bar", parágrafo "baz"

Consideramos a interpretação 4 mais natural e a interpretação 4 aumenta o poder expressivo do CommonMark, permitindo títulos de várias linhas. Os autores que desejam interpretação 1 podem colocar uma linha em branco após o primeiro parágrafo:

Exemplo 73
Foo

bar
---
baz
<p>Foo</p>
<h2>bar</h2>
<p>baz</p>

Os autores que desejam a interpretação 2 podem colocar linhas em branco em torno da quebra temática,

Exemplo 74
Foo
bar

---

baz
<p>Foo bar</p> <hr /> <p>baz</p>

ou use uma quebra temática que não pode ser interpretada como um sublinhado de título setext, como

Exemplo 75
Foo
bar
* * *
baz
<p>Foo bar</p> <hr /> <p>baz</p>

Os autores que desejam a interpretação 3 podem usar escapes de barra invertida:

Exemplo 76
Foo
bar
\---
baz
<p>Foo
bar
---
baz</p>

Blocos de código recuado

Um bloco de código recuado é composto por um ou mais pedaços recuados separados por linhas em branco. Um pedaço recuado é uma sequência de linhas que não estejam em branco, cada um recuado quatro ou mais espaços. O conteúdo do bloco de código é o conteúdo literal das linhas, incluindo finais de linha à direita, menos quatro espaços de recuo. Um bloco de código recuado não possui sequência de informações.

Um bloco de código recuado não pode interromper um parágrafo; portanto, deve haver uma linha em branco entre um parágrafo e um bloco de código recuado. (Porém, não é necessária uma linha em branco entre um bloco de código e o parágrafo a seguir.)

Exemplo 77
    um simples
      bloco de código recuado
<pre><code>um simples
  bloco de código recuado
</code></pre>

Se houver alguma ambiguidade entre uma interpretação do recuo como um bloco de código e como indicação de que o material pertence a um elemento de lista, a interpretação do elemento da lista terá precedência:

Exemplo 78
  - foo

    bar
<ul>
<li>
<p>foo</p>
<p>bar</p>
</li>
</ul>
Exemplo 79
1.  foo

    - bar
<ol>
<li>
<p>foo</p>
<ul>
<li>bar</li>
</ul>
</li>
</ol>

O conteúdo de um bloco de código é um texto literal e não é analisado como Markdown:

Exemplo 80
    <a/>
    *oi*

    - um
<pre><code><a/>
*oi*

- um
</code></pre>

Aqui temos três pedaços separados por linhas em branco:

Exemplo 81
    pedaço1

    pedaço2
  
 
 
    pedaço3
<pre><code>pedaço1

pedaço2



pedaço3
</code></pre>

Quaisquer espaços iniciais além de quatro serão incluídos no conteúdo, mesmo nas linhas em branco internas:

Exemplo 82
    pedaço1
      
      pedaço2
<pre><code>pedaço1
  
  pedaço2
</code></pre>

Um bloco de código recuado não pode interromper um parágrafo. (Isso permite recuos suspensos e similares.)

Exemplo 83
Foo
    bar
<p>Foo
bar</p>

No entanto, qualquer linha não em branco com menos de quatro espaços à esquerda termina o bloco de código imediatamente. Portanto, um parágrafo pode ocorrer imediatamente após o código recuado:

Exemplo 84
    foo
bar
<pre><code>foo
</code></pre>
<p>bar</p>

E o código recuado pode ocorrer imediatamente antes e depois de outros tipos de blocos:

Exemplo 85
# Título
    foo
Título
------
    foo
----
<h1>Título</h1>
<pre><code>foo
</code></pre>
<h2>Título</h2>
<pre><code>foo
</code></pre>
<hr />

A primeira linha pode ser recuada mais de quatro espaços:

Exemplo 86
        foo
    bar
<pre><code>    foo
bar
</code></pre>

Linhas em branco que precedem ou seguem um bloco de código recuado não estão incluídas nele:

Exemplo 87


    
    foo
    
<pre><code>foo
</code></pre>

Os espaços à direita estão incluídos no conteúdo do bloco de código:

Exemplo 88
    foo  
<pre><code>foo  
</code></pre>

Blocos de código cercados

Um bloco de código cercado é uma sequência de pelo menos três crases consecutivas (`) ou tiles (~). (Tiles e crases não podem ser misturados.) Um bloco de código cercado começa com uma cerca de código, recuada não mais que três espaços.

A linha com a cerca do código de abertura pode opcionalmente conter algum texto após a cerca do código; isso é aparado com espaços em branco à esquerda e à direita e chamado de sequência de informações.

Se a sequência de informações vier após uma barreira de crases, ela não pode conter nenhum caractere de crase. (O motivo dessa restrição é que, caso contrário, algum código embutido seria interpretado incorretamente como o início de um bloco de código cercado.)

O conteúdo do bloco de código consiste em todas as linhas subseqüentes, até que uma cerca de código de fechamento do mesmo tipo que o bloco de código tenha começado com (crases ou tiles) e com a mesma quantidade de crases ou tiles da cerca de abertura.

Se a cerca do código à esquerda for N espaços recuados, até N espaços de recuo serão removidos de cada linha do conteúdo (se houver). (Se uma linha de conteúdo não for recuada, ela será preservada inalterada. Se for recuada menos de N espaços, todo o recuo será removido.)

A cerca do código de fechamento pode ser recuada até três espaços e pode ser seguida apenas por espaços que são ignorados.

Se o final do bloco (ou documento) contido for alcançado e nenhuma barreira de fechamento for encontrada, o bloco de código conterá todas as linhas após a abertura do código até o final do bloco (ou documento). (Uma especificação alternativa exigiria uma análise de que, a cerca de código de fechamento não foi encontrada. Mas isso torna a análise muito menos eficiente e parece não haver um lado negativo no comportamento descrito aqui.)

Um bloco de código cercado pode interromper um parágrafo e não requer uma linha em branco antes ou depois.

O conteúdo de uma cerca de código é tratado como texto literal e não é analisado como linhas.

A primeira palavra da cadeia de informações é normalmente usada para especificar a linguagem de programação da amostra de código e renderizada no atributo class da tag code.

No entanto, essa especificação não exige nenhum tratamento específico da cadeia de informações.

Aqui está um exemplo simples com crases:

Exemplo 89
```
<
 >
```
<pre><code>&lt;
 &gt;
</code></pre>

Com tiles:

Exemplo 90
~~~
<
 >
~~~
<pre><code>&lt;
 &gt;
</code></pre>

Menos de três crases não são suficientes:

Exemplo 91
``
foo
``
<p><code>foo</code></p>

A cerca do código de fechamento deve usar o mesmo caractere da cerca de abertura:

Exemplo 92
```
aaa
~~~
```
<pre><code>aaa
~~~
</code></pre>
Exemplo 93
~~~
aaa
```
~~~
<pre><code>aaa
```
</code></pre>

A cerca do código de fechamento deve ter pelo menos o comprimento da cerca de abertura:

Exemplo 94
````
aaa
```
``````
<pre><code>aaa
```
</code></pre>
Exemplo 95
~~~~
aaa
~~~
~~~~
<pre><code>aaa
~~~
</code></pre>

Os blocos de código abertos são fechados no final do documento (ou no final do bloco de citação ou do elemento da lista ):

Exemplo 96
```
<pre><code></code></pre>
Exemplo 97
`````

```
aaa
<pre><code>
```
aaa
</code></pre>
Exemplo 98
> ```
> aaa

bbb
<blockquote>
<pre><code>aaa
</code></pre>
</blockquote>
<p>bbb</p>

Um bloco de código pode ter todas as linhas vazias como seu conteúdo:

Exemplo 99
```

  
```
<pre><code>
  
</code></pre>

Um bloco de código pode estar vazio:

Exemplo 100
```
```
<pre><code></code></pre>

Cercas podem ser recuadas. Se a cerca de abertura for recuada, as linhas de conteúdo terão o recuo de abertura equivalente removido, se presente:

Exemplo 101
 ```
 aaa
aaa
```
<pre><code>aaa
aaa
</code></pre>
Exemplo 102
  ```
aaa
  aaa
aaa
  ```
<pre><code>aaa
aaa
aaa
</code></pre>
Exemplo 103
   ```
   aaa
    aaa
  aaa
   ```
<pre><code>aaa
 aaa
aaa
</code></pre>

O recuo de quatro espaços produz um bloco de código recuado:

Exemplo 104
    ```
    aaa
    ```
<pre><code>```
aaa
```
</code></pre>

As cercas de fechamento podem ser recuadas por 0-3 espaços, e o seu recuo não precisa coincidir com a da cerca de abertura:

Exemplo 105
```
aaa
  ```
<pre><code>aaa
</code></pre>
Exemplo 106
   ```
aaa
  ```
<pre><code>aaa
</code></pre>

Esta não é uma cerca de fechamento, porque possui quatro espaços recuados:

Exemplo 107
```
aaa
    ```
<pre><code>aaa
    ```
</code></pre>

As cercas de código (abertura e fechamento) não podem conter espaços internos:

Exemplo 108
``` ```
aaa
<p><code> </code>
aaa</p>
Exemplo 109
~~~~~~
aaa
~~~ ~~
<pre><code>aaa
~~~ ~~
</code></pre>

Blocos de código cercado podem interromper parágrafos e podem ser seguidos diretamente por parágrafos, sem uma linha em branco entre:

Exemplo 110
foo
```
bar
```
baz
<p>foo</p>
<pre><code>bar
</code></pre>
<p>baz</p>

Outros blocos também podem ocorrer antes e depois dos blocos de código cercados sem uma linha em branco intermediária:

Exemplo 111
foo
---
~~~
bar
~~~
# baz
<h2>foo</h2>
<pre><code>bar
</code></pre>
<h1>baz</h1>

Uma sequência de informações pode ser fornecida após a cerca do código de abertura.

Embora essa especificação não exija nenhum tratamento específico da cadeia de informações, a primeira palavra é normalmente usada para especificar a linguagem de progração do bloco de código.

Na saída HTML, a linguagem é normalmente indicada adicionando uma parâmetro class ao elemento code com o conteúdo language- seguido pelo nome da linguagem (ex: language-javascript, language-python, language-php).

Exemplo 112
```ruby
def foo(x)
  return 3
end
```
<pre><code class="language-ruby">def foo(x)
  return 3
end
</code></pre>
Exemplo 113
~~~~    ruby startline=3 $%@#$
def foo(x)
  return 3
end
~~~~~~~
<pre><code class="language-ruby">def foo(x)
  return 3
end
</code></pre>
Exemplo 114
````;
````
<pre><code class="language-;"></code></pre>

As seqüências de informações para blocos de códigos cercado por crase não podem conter crases:

Exemplo 115
``` aa ```
foo
<p><code>aa</code>
foo</p>

As seqüências de informações para blocos de códigos cercado por tiles podem conter crases nem tiles:

Exemplo 116
~~~ aa ``` ~~~
foo
~~~
<pre><code class="language-aa">foo
</code></pre>

As cercas de código de fechamento não podem ter cadeias de informações:

Exemplo 117
```
``` aaa
```
<pre><code>``` aaa
</code></pre>

Blocos HTML

Um bloco HTML é um grupo de linhas que é tratado como HTML bruto (e não será escapado na saída HTML).

Existem sete tipos de bloco HTML, que podem ser definidos por suas condições de início e fim.

O bloco começa com uma linha que atende a uma condição de início (após um recuo opcional de até três espaços).

Ele termina com a primeira linha subsequente que atende a uma condição final correspondente, ou a última linha do documento ou a última linha do bloco de contêiner que contém o bloco HTML atual, se nenhuma linha for encontrada que atenda à condição final.

Se a primeira linha atender às condições inicial e final, o bloco conterá exatamente essa linha.

  • Condição 1

    Condição inicial: a linha começa com a sequência <script, <pre ou <style (sem distinção entre maiúsculas e minúsculas), seguida de espaço em branco, o caractere > ou o final da linha.

    Condição final: linha contém uma tag de fechamento </script>, </pre> ou </style> (sem distinção entre maiúsculas e minúsculas e não precisa coincidir com a tag de abertura).

  • Condição 2

    Condição inicial: a linha começa com a sequência <!--.

    Condição final: linha contém a sequência -->.

  • Condição 3

    Condição inicial: a linha começa com a sequência <?.

    Condição final: linha contém a sequência ?>.

  • Condição 4

    Condição inicial: a linha começa com a sequência <! seguida por uma letra ASCII maiúscula.

    Condição final: linha contém o caractere >.

  • Condição 5

    Condição inicial: a linha começa com a sequência <![CDATA[.

    Condição final: linha contém a sequência ]]>.

  • Condição 6

    Condição inicial: a linha começa com a string < ou </ seguida por uma das tags (sem distinção entre maiúsculas e minúsculas) address, article, aside, base, basefont, blockquote, body, caption, center, col, colgroup, dd, details, dialog, dir, div, dl, dt, fieldset, figcaption, figure, footer, form, frame, frameset, h1, h2, h3, h4, h5, h6, head, header, hr, html, iframe, legend, li, link, main, menu, menuitem, nav, noframes, ol, optgroup, option, p, param, section, source, summary, table, tbody, td, tfoot, th, thead, title, tr, track, ul, seguida por espaços em branco, o fim da linha, o caractere >, ou a string />.

    Condição final: a linha é seguida por uma linha em branco.

  • Condição 7

    Condição de início: a linha começa com uma tag completamente aberta (com qualquer nome de tag diferente de script, style ou pre) ou uma tag completa de fechamento, seguida apenas por espaços em branco ou o fim da linha.

    Condição final: a linha é seguida por uma linha em branco.

Os blocos HTML continuam até que sejam fechados pelas respectivas condições finais ou pela última linha do documento ou outro bloco de contêiner.

Isso significa que qualquer HTML dentro de um bloco HTML que possa ser reconhecido como uma condição inicial será ignorado pelo analisador e transmitido como está, sem alterar o estado do analisador.

Por exemplo, <pre> dentro de um bloco HTML iniciado por <table>não afetará o estado do analisador; como o bloco HTML foi iniciado pela condição inicial 6, ele terminará em qualquer linha em branco. Isso pode te pegar de surpresa:

Exemplo 118
<table><tr><td>
<pre>
**Olá**,

_mundo_.
</pre>
</td></tr></table>
<table><tr><td>
<pre>
**Olá**,
<p><em>mundo</em>.
</pre></p>
</td></tr></table>

Nesse caso, o bloco HTML é finalizado pela nova linha - o texto **Olá** permanece em sua forma literal - e a análise regular é retomada, com um parágrafo, a palavra mundo enfatizada e embutida além do bloco HTML seguinte.

Todos os tipos de blocos HTML, exceto o tipo 7, podem interromper um parágrafo. Blocos do tipo 7 não podem interromper um parágrafo. (Essa restrição tem como objetivo impedir a interpretação indesejada de tags longas dentro de um parágrafo agrupado como iniciando blocos HTML).

Alguns exemplos simples seguem. Aqui estão alguns blocos HTML básicos do tipo 6:

Exemplo 119
<table>
  <tr>
    <td>
           oi
    </td>
  </tr>
</table>

okay.
<table>
  <tr>
    <td>
           oi
    </td>
  </tr>
</table>
<p>okay.</p>
Exemplo 120
 <div>
  *olá*
         <foo><a>
 <div>
  *olá*
         <foo><a>

Um bloco também pode começar com uma tag de fechamento:

Exemplo 121
</div>
*foo*
</div>
*foo*

Aqui temos dois blocos HTML com um parágrafo Markdown entre eles:

Exemplo 122
<DIV CLASS="foo">

*Markdown*

</DIV>
<DIV CLASS="foo">
<p><em>Markdown</em></p>
</DIV>

A tag na primeira linha pode ser parcial, desde que esteja dividida onde haveria espaço em branco:

Exemplo 123
<div id="foo"
  class="bar">
&lt;/div&gt;
<div id="foo"
  class="bar">
&lt;/div&gt;
Exemplo 124
<div id="foo" class="bar
  baz">
&lt;/div&gt;
<div id="foo" class="bar
  baz">
&lt;/div&gt;

Uma tag aberta não precisa ser fechada:

Exemplo 125
<div>
*foo*

*bar*
<div>
*foo*
<p><em>bar</em></p>

Uma tag parcial nem precisa ser concluída:

Exemplo 126
<div id="foo"
*oi*
<div id="foo"
*oi*
Exemplo 127
<div class
foo
<div class
foo

A tag inicial nem precisa ser válida, desde que comece como uma:

Exemplo 128
<div *???-&&&-<---
*foo*
<div *???-&&&-<---
*foo*

Nos blocos do tipo 6, a tag inicial não precisa estar em uma linha sozinha:

Exemplo 129
<div><a href="bar">*foo*</a></div>
<div><a href="bar">*foo*</a></div>
Exemplo 130
<table><tr><td>
foo
</td></tr></table>
<table><tr><td>
foo
</td></tr></table>

Tudo até a próxima linha em branco ou final do documento ser incluída no bloco HTML. Portanto, no exemplo a seguir, o que parece um bloco de código Markdown é realmente parte do bloco HTML, que continua até que uma linha em branco ou o final do documento seja atingido:

Exemplo 131
<div></div>
``` c
int x = 33;
```
<div></div>
``` c
int x = 33;
```

Para iniciar um bloco HTML com uma tag que não está na lista de tags no nível do bloco em (6), você deve colocar a tag sozinha na primeira linha (e deve estar completa):

Exemplo 132
<a href="foo">
*bar*
</a>
<a href="foo">
*bar*
</a>

Nos blocos do tipo 7, o nome da tag pode ser qualquer coisa:

Exemplo 133
<Warning>
*bar*
</Warning>
<Warning>
*bar*
</Warning>
Exemplo 134
<i class="foo">
*bar*
</i>
<i class="foo">
*bar*
</i>
Exemplo 135
</ins>
*bar*
</ins>
*bar*

Essas regras foram criadas para nos permitir trabalhar com tags que podem funcionar como tags em nível de bloco ou em linha. A tag <del> é um bom exemplo. Podemos cercar o conteúdo com tags <del> de três maneiras diferentes. Nesse caso, obtemos um bloco HTML bruto, porque a tag <del> está em uma linha por si só:

Exemplo 136
<del>
*foo*
</del>
<del>
*foo*
</del>

Nesse caso, obtemos um bloco de HTML bruto que inclui apenas a tag <del> (porque termina com a linha a seguir em branco). Portanto, o conteúdo é interpretado como CommonMark:

Exemplo 137
<del>

*foo*

</del>
<del>
<p><em>foo</em></p>
</del>

Finalmente, nesse caso, as tags <del> são interpretadas como HTML bruto dentro do parágrafo CommonMark. (Como a tag não está em uma linha por si só, obtemos HTML embutido em vez de um bloco HTML ).

Exemplo 138
<del>*foo*</del>
<p><del><em>foo</em></del></p>

Tags HTML concebidos para conter conteúdo literal (script, style, pre), comentários, instruções de processamento e declarações são tratadas um pouco diferente.

Em vez de terminar na primeira linha em branco, esses blocos terminam na primeira linha que contém uma tag final correspondente. Como resultado, esses blocos podem conter linhas em branco:

Uma pré tag (tipo 1):

Exemplo 139
<pre language="haskell"><code>
import Text.HTML.TagSoup

main :: IO ()
main = print $ parseTags tags
</code></pre>
okay
<pre language="haskell"><code>
import Text.HTML.TagSoup

main :: IO ()
main = print $ parseTags tags
</code></pre>
<p>okay</p>

Uma tag de script (tipo 1):

Exemplo 140
<script type="text/javascript">
// Exemplo com JavaScript

document.getElementById("demo").innerHTML = "Olá JavaScript!";
</script>
okay
<script type="text/javascript">
// Exemplo com JavaScript

document.getElementById("demo").innerHTML = "Olá JavaScript!";
</script>
<p>okay</p>

Uma tag de estilo (tipo 1):

Exemplo 141
<style
  type="text/css">
h1 {color:red;}

p {color:blue;}
</style>
okay
<style
  type="text/css">
h1 {color:red;}

p {color:blue;}
</style>
<p>okay</p>

Se não houver uma tag final correspondente, o bloco terminará no final do documento (ou no fechamento do bloco de citação ou no elemento de lista ):

Exemplo 142
<style
  type="text/css">

foo
<style
  type="text/css">

foo
Exemplo 143
> <div>
> foo

bar
<blockquote>
<div>
foo
</blockquote>
<p>bar</p>
Exemplo 144
- <div>
- foo
<ul>
<li>
<div>
</li>
<li>foo</li>
</ul>

A tag final pode ocorrer na mesma linha da tag inicial:

Exemplo 145
<style>p{color:red;}</style>
*foo*
<style>p{color:red;}</style>
<p><em>foo</em></p>
Exemplo 146
<!-- foo -->*bar*
*baz*
<!-- foo -->*bar*
<p><em>baz</em></p>

Observe que qualquer coisa na última linha após a tag final será incluída no bloco HTML :

Exemplo 147
<script>
foo
</script>1. *bar*
<script>
foo
</script>1. *bar*

Um comentário (tipo 2):

Exemplo 148
<!-- Foo

bar
   baz -->
okay
<!-- Foo

bar
   baz -->
<p>okay</p>

Uma instrução de processamento (tipo 3):

Exemplo 149
<?php

  echo '>';

?>
okay
<?php

  echo '>';

?>
<p>okay</p>

Uma declaração (tipo 4):

Exemplo 150
<!DOCTYPE html>
<!DOCTYPE html>

CDATA (tipo 5):

Exemplo 151
<![CDATA[
function matchwo(a,b)
{
  if (a < b && a < 0) then {
    return 1;

  } else {

    return 0;
  }
}
]]>
okay
<![CDATA[
function matchwo(a,b)
{
  if (a < b && a < 0) then {
    return 1;

  } else {

    return 0;
  }
}
]]>
<p>okay</p>

A tag de abertura pode ser recuada de 1 a 3 espaços, mas não 4:

Exemplo 152
  <!-- foo -->

    <!-- foo -->
  <!-- foo -->
<pre><code><!-- foo -->
</code></pre>
Exemplo 153
<div> <div> <div> <pre><code><div> </code></pre>

Um bloco HTML dos tipos 1 a 6 pode interromper um parágrafo e não precisa ser precedido por uma linha em branco.

Exemplo 154
Foo <div> bar </div> <p>Foo</p> <div> bar </div>

No entanto, é necessária uma linha em branco a seguir, exceto no final de um documento e exceto nos blocos dos tipos 1 a 5, acima :

Exemplo 155
<div> bar </div> *foo* <div> bar </div> *foo* Blocos HTML do tipo 7 não podem interromper um parágrafo:
Exemplo 156
Foo <a href="bar"> baz <p>Foo <a href="bar"> baz</p>

Essa regra difere da especificação de sintaxe Markdown original de John Gruber, que diz:

As únicas restrições são que os elementos HTML em nível de bloco - por exemplo <div>, <table>, <pre>,<p> , etc - devem ser separados a partir de em torno do conteúdo por linhas em branco, e as marcas de início e de fim de bloco não deve ser recuados com abas ou espaços.

De certa forma, a regra de Gruber é mais restritiva que a dada aqui:

Requer que um bloco HTML seja precedido por uma linha em branco. Não permite que o identificador inicial seja recuado.

Requer uma tag final correspondente, que também não permite ser recuada.

A maioria das implementações do Markdown (incluindo algumas próprias do Gruber) não respeitam todas essas restrições.

Há um aspecto, no entanto, em que a regra de Gruber é mais liberal do que a fornecida aqui, pois permite que linhas em branco ocorram dentro de um bloco HTML. Há duas razões para proibi-los aqui. Primeiro, elimina a necessidade de analisar tags balanceadas, que são caras e podem exigir retrocesso do final do documento se nenhuma tag final correspondente for encontrada. Segundo, ele fornece uma maneira muito simples e flexível de incluir o conteúdo do Markdown nas tags HTML: basta separar o Markdown do HTML usando linhas em branco:

Comparar:
Exemplo 157
<div> *Emphasized* text. </div> <div> <p><em>Emphasized</em> text.</p> </div>
Exemplo 158
<div> *Emphasized* text. </div> <div> *Emphasized* text. </div>

Algumas implementações do Markdown adotaram uma convenção de interpretação de conteúdo dentro de tags como texto se a tag aberta tiver o atributo markdown=1 . A regra dada acima parece uma maneira mais simples e elegante de obter o mesmo poder expressivo, que também é muito mais simples de analisar.

A principal desvantagem potencial é que não é mais possível colar blocos HTML em documentos Markdown com 100% de confiabilidade. No entanto, na maioria dos casos, isso funcionará bem, porque as linhas em branco no HTML geralmente são seguidas por tags de bloco HTML. Por exemplo:

Exemplo 159
<table> <tr> <td> Hi </td> </tr> </table> <table> <tr> <td> Hi </td> </tr> </table>

Existem problemas, no entanto, se as tags internas forem recuadas e separadas por espaços, pois elas serão interpretadas como um bloco de código recuado:

Exemplo 160
<table> <tr> <td> Hi </td> </tr> </table> <table> <tr> <pre><code><td> Hi </td> </code></pre> </tr> </table>

Felizmente, linhas em branco geralmente não são necessárias e podem ser excluídas. A exceção são as <pre>tags internas , mas, como descrito acima , os blocos HTML brutos que começam com <pre> podem conter linhas em branco.

Definições de referência de link

Uma definição de referência de link consiste em um rótulo de link , recuado até três espaços, seguido por dois pontos (:), espaço em branco opcional (incluindo até o final de uma linha ), destino de link , espaço em branco opcional (incluindo até o final de uma linha ) e um título de link opcional , que, se presente, deve ser separado do destino do link por espaço em branco . Não há mais caracteres fora do espaço em branco pode ocorrer na linha.

Uma definição de referência de link não corresponde a um elemento estrutural de um documento. Em vez disso, define um rótulo que pode ser usado em links de referência e imagens em estilo de referência em outras partes do documento. As definições de referência de link podem vir antes ou depois dos links que as utilizam.

Exemplo 161
[foo]: /url "title" [foo] <p><a href="/url" title="title">foo</a></p>
Exemplo 162
[foo]: /url 'the title' [foo]

<p><a href="/url" title="the title">foo</a></p>

Exemplo 163
[Foo*bar\]]:my_(url) 'title (with parens)' [Foo*bar\]]

<p><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p>

Exemplo 164
[Foo bar]: <my url> 'title' [Foo bar]

<p><a href="my%20url" title="title">Foo bar</a></p>

O título pode se estender por várias linhas:
Exemplo 165
[foo]: /url ' title line1 line2 ' [foo] <p><a href="/url" title=" title line1 line2 ">foo</a></p> No entanto, ele não pode conter uma linha em branco :
Exemplo 166
[foo]: /url 'title with blank line' [foo] <p>[foo]: /url 'title</p> <p>with blank line'</p> <p>[foo]</p> O título pode ser omitido:
Exemplo 167
[foo]: /url [foo] <p><a href="/url">foo</a></p> O destino do link não pode ser omitido:
Exemplo 168
[foo]: [foo] <p>[foo]:</p> <p>[foo]</p>

No entanto, um destino de link vazio pode ser especificado usando colchetes angulares:

Exemplo 169
[foo]: <> [foo] <p><a href="">foo</a></p>

O título deve ser separado do destino do link por espaço em branco:

Exemplo 170
[foo]: <bar>(baz) [foo] <p>[foo]: <bar>(baz)</p> <p>[foo]</p>

O título e o destino podem conter escapes de barra invertida e barras invertidas literais:

Exemplo 171
[foo]: /url\bar\*baz "foo\"bar\baz" [foo]

<p><a href="/url%5Cbar*baz" title="foo&quot;bar\baz">foo</a></p>

Um link pode vir antes de sua definição correspondente:
Exemplo 172
[foo] [foo]: url <p><a href="url">foo</a></p>

Se houver várias definições correspondentes, a primeira terá precedência:

Exemplo 173
[foo] [foo]: first [foo]: second <p><a href="first">foo</a></p>

Conforme observado na seção Links , a correspondência de rótulos não diferencia maiúsculas de minúsculas (consulte correspondências ).

Exemplo 174
[FOO]: /url [Foo] <p><a href="/url">Foo</a></p>
Exemplo 175
[ΑΓΩ]: /φου [αγω] <p><a href="/%CF%86%CE%BF%CF%85">αγω</a></p>

Aqui está uma definição de referência de link sem link correspondente. Não contribui em nada para o documento.

Exemplo 176
[foo]: /url Aqui está outro:
Exemplo 177
[ foo ]: /url bar <p>bar</p>

Esta não é uma definição de referência de link, porque existem caracteres que não são de espaço em branco após o título:

Exemplo 178
[foo]: /url "title" ok <p>[foo]: /url "title" ok</p>

Esta é uma definição de referência de link, mas não possui título:

Exemplo 179
[foo]: /url "title" ok <p>"title" ok</p>

Esta não é uma definição de referência de link, porque possui quatro espaços recuados:

Exemplo 180
[foo]: /url "title" [foo] <pre><code>[foo]: /url "title" </code></pre> <p>[foo]</p>

Esta não é uma definição de referência de link, porque ocorre dentro de um bloco de código:

Exemplo 181
``` [foo]: /url ``` [foo] <pre><code>[foo]: /url </code></pre> <p>[foo]</p>

Uma definição de referência de link não pode interromper um parágrafo.

Exemplo 182
Foo [bar]: /baz [bar] <p>Foo [bar]: /baz</p> <p>[bar]</p>

No entanto, ele pode seguir diretamente outros elementos de bloco, como cabeçalhos e quebras temáticas, e não precisa ser seguido por uma linha em branco.

Exemplo 183
# [Foo] [foo]: /url > bar <h1><a href="/url">Foo</a></h1> <blockquote> <p>bar</p> </blockquote>
Exemplo 184
[foo]: /url bar === [foo] <h1>bar</h1> <p><a href="/url">foo</a></p>
Exemplo 185
[foo]: /url === [foo] <p>=== <a href="/url">foo</a></p>

Várias definições de referência de link podem ocorrer uma após a outra, sem interferir nas linhas em branco.

Exemplo 186
[foo]: /foo-url "foo" [bar]: /bar-url "bar" [baz]: /baz-url [foo], [bar], [baz] <p><a href="/foo-url" title="foo">foo</a>, <a href="/bar-url" title="bar">bar</a>, <a href="/baz-url">baz</a></p>

As definições de referência de link podem ocorrer dentro de contêineres de bloco, como listas e cotações de bloco. Eles afetam o documento inteiro, não apenas o contêiner no qual estão definidos:

Exemplo 187
[foo] > [foo]: /url <p><a href="/url">foo</a></p> <blockquote> </blockquote>

Se algo é uma definição de referência de link é independente de se a referência de link que define é usada no documento. Assim, por exemplo, o documento a seguir contém apenas uma definição de referência de link e nenhum conteúdo visível:

Exemplo 188
[foo]: /url

Parágrafos

Uma sequência de linhas não em branco que não podem ser interpretadas como outros tipos de blocos forma um parágrafo . O conteúdo do parágrafo é o resultado da análise do conteúdo bruto do parágrafo como inline. O conteúdo bruto do parágrafo é formado concatenando as linhas e removendo os espaços em branco inicial e final .

Um exemplo simples com dois parágrafos:
Exemplo 189
aaa bbb <p>aaa</p> <p>bbb</p>

Os parágrafos podem conter várias linhas, mas nenhuma linha em branco:

Exemplo 190
aaa bbb ccc ddd <p>aaa bbb</p> <p>ccc ddd</p> Várias linhas em branco entre parágrafos não têm efeito:
Exemplo 191
aaa bbb <p>aaa</p> <p>bbb</p> Os espaços à esquerda são ignorados:
Exemplo 192
aaa bbb <p>aaa bbb</p>

As linhas após a primeira podem ser indentadas em qualquer quantidade, pois os blocos de código indentado não podem interromper parágrafos.

Exemplo 193
aaa bbb ccc <p>aaa bbb ccc</p>

No entanto, a primeira linha pode ser recuada no máximo três espaços, ou um bloco de código recuado será acionado:

Exemplo 194
aaa bbb <p>aaa bbb</p>
Exemplo 195
aaa bbb <pre><code>aaa </code></pre> <p>bbb</p>

Os espaços finais são eliminados antes da análise em linha, portanto, um parágrafo que termina com dois ou mais espaços não termina com uma quebra de linha rígida :

Exemplo 196
aaa bbb <p>aaa<br /> bbb</p>

Linhas em branco

As linhas em branco entre os elementos no nível do bloco são ignoradas, exceto pelo papel que desempenham na determinação de se uma lista é restrita ou solta .

As linhas em branco no início e no final do documento também são ignoradas.

Exemplo 197
aaa # aaa <p>aaa</p> <h1>aaa</h1>

Tabelas (extensão)

O GFM permite que o table extensão, onde um tipo de bloco de folhas adicional está disponível.

Uma tabela é uma organização de dados com linhas e colunas, consistindo em uma única linha de cabeçalho, uma linha delimitadora que separa o cabeçalho dos dados e zero ou mais linhas de dados.

Cada linha consiste em células que contêm texto arbitrário, nas quais as linhas são analisadas, separadas por pipes (| ). Um tubo à esquerda e à direita também é recomendado para maior clareza na leitura e, se houver outra análise de ambiguidade. Os espaços entre os tubos e o conteúdo da célula são cortados. Elementos no nível do bloco não podem ser inseridos em uma tabela.

A linha delimitadora consiste em células cujo único conteúdo são hífens (-) e, opcionalmente, dois pontos à esquerda ou à direita (:), ou ambos, para indicar o alinhamento esquerdo, direito ou central, respectivamente.

Exemplo 198
| foo | bar | | --- | --- | | baz | bim | <table> <thead> <tr> <th>foo</th> <th>bar</th> </tr> </thead> <tbody> <tr> <td>baz</td> <td>bim</td> </tr> </tbody> </table>

Células em uma coluna não precisam corresponder ao comprimento, embora seja mais fácil ler se estiverem. Da mesma forma, o uso de tubos à frente e à direita pode ser inconsistente:

Exemplo 199
| abc | defghi | :-: | -----------: bar | baz <table> <thead> <tr> <th align="center">abc</th> <th align="right">defghi</th> </tr> </thead> <tbody> <tr> <td align="center">bar</td> <td align="right">baz</td> </tr> </tbody> </table>

Inclua um canal no conteúdo de uma célula, escapando-o, inclusive dentro de outras extensões inline:

Exemplo 200
| f\|oo | | ------ | | b `\|` az | | b **\|** im | <table> <thead> <tr> <th>f|oo</th> </tr> </thead> <tbody> <tr> <td>b <code>|</code> az</td> </tr> <tr> <td>b <strong>|</strong> im</td> </tr> </tbody> </table>

A tabela está quebrada na primeira linha vazia ou no início de outra estrutura em nível de bloco:

Exemplo 201
| abc | def | | --- | --- | | bar | baz | > bar <table> <thead> <tr> <th>abc</th> <th>def</th> </tr> </thead> <tbody> <tr> <td>bar</td> <td>baz</td> </tr> </tbody> </table> <blockquote> <p>bar</p> </blockquote>
Exemplo 202
| abc | def | | --- | --- | | bar | baz | bar bar <table> <thead> <tr> <th>abc</th> <th>def</th> </tr> </thead> <tbody> <tr> <td>bar</td> <td>baz</td> </tr> <tr> <td>bar</td> <td></td> </tr> </tbody> </table> <p>bar</p>

A linha do cabeçalho deve corresponder à linha delimitadora no número de células. Caso contrário, uma tabela não será reconhecida:

Exemplo 203
| abc | def | | --- | | bar | <p>| abc | def | | --- | | bar |</p>

O restante das linhas da tabela pode variar no número de células. Se houver um número de células menor que o número de células na linha do cabeçalho, serão inseridas células vazias. Se houver maior, o excesso é ignorado:

Exemplo 204
| abc | def | | --- | --- | | bar | | bar | baz | boo | <table> <thead> <tr> <th>abc</th> <th>def</th> </tr> </thead> <tbody> <tr> <td>bar</td> <td></td> </tr> <tr> <td>bar</td> <td>baz</td> </tr> </tbody> </table>

Se não houver linhas no corpo, não <tbody>será gerado na saída HTML:

Exemplo 205
| abc | def | | --- | --- | <table> <thead> <tr> <th>abc</th> <th>def</th> </tr> </thead> </table>

Blocos de contêiner

Um bloco de contêiner é um bloco que tem outros blocos como seu conteúdo. Existem dois tipos básicos de blocos de contêiner: cotações de bloco e itens de lista . As listas são meta-contêineres para itens da lista .

Definimos a sintaxe para blocos de contêiner recursivamente. A forma geral da definição é:

Se X é uma sequência de blocos, o resultado da transformação de X dessa maneira é um contêiner do tipo Y com esses blocos como seu conteúdo.

Então, explicamos o que conta como um bloco de citação ou item de lista, explicando como eles podem ser gerados a partir de seu conteúdo. Isso deve ser suficiente para definir a sintaxe, embora não dê uma receita para analisar essas construções. (Uma receita é fornecida abaixo na seção intitulada Uma estratégia de análise .)

Citações de bloco

Um marcador de bloco de citação consiste em 0-3 espaços de recuo inicial, mais (a) o caractere >junto com um espaço a seguir, ou (b) um único caractere >não seguido por um espaço.

As seguintes regras definem aspas de bloco :

Caso básico. Se uma sequência de linhas Ls constituir uma sequência de blocos Bs , o resultado da adição de um marcador de bloco de citação ao início de cada linha em Ls é um bloco de citação contendo Bs .

Preguiça. Se uma sequência de linhas Ls constituir um bloco de citação com o conteúdo Bs , o resultado da exclusão do marcador de bloco de citação inicial de uma ou mais linhas nas quais o próximo caractere que não estiver em branco após o marcador de bloco de citação for um texto de continuação de parágrafo é um bloco de citação com Bs como seu conteúdo. O texto de continuação de parágrafo é um texto que será analisado como parte do conteúdo de um parágrafo, mas não ocorre no início do parágrafo.

Consecutividade. Um documento não pode conter duas aspas seguidas, a menos que haja uma linha em branco entre elas.

Nada mais conta como um bloco de citação . Aqui está um exemplo simples:
Exemplo 206
> # Foo > bar > baz <blockquote> <h1>Foo</h1> <p>bar baz</p> </blockquote> Os espaços após os >caracteres podem ser omitidos:
Exemplo 207
># Foo >bar > baz <blockquote> <h1>Foo</h1> <p>bar baz</p> </blockquote> Os >caracteres podem ser recuados de 1 a 3 espaços:
Exemplo 208
> # Foo > bar > baz <blockquote> <h1>Foo</h1> <p>bar baz</p> </blockquote> Quatro espaços nos dão um bloco de código:
Exemplo 209
> # Foo > bar > baz <pre><code>> # Foo > bar > baz </code></pre>

A cláusula de preguiça nos permite omitir o texto de continuação do parágrafo> anterior :

Exemplo 210
> # Foo > bar baz <blockquote> <h1>Foo</h1> <p>bar baz</p> </blockquote>

Uma bloco de citação pode conter algumas linhas de continuação preguiçosas e não preguiçosas:

Exemplo 211
> bar baz > foo <blockquote> <p>bar baz foo</p> </blockquote>

A preguiça se aplica apenas a linhas que teriam sido continuações de parágrafos se elas tivessem sido anexadas com marcadores de bloco de citação . Por exemplo, >não pode ser omitido na segunda linha de

> foo > --- sem alterar o significado:
Exemplo 212
> foo --- <blockquote> <p>foo</p> </blockquote>
Da mesma forma, se omitimos o >na segunda linha de > - foo > - bar a citação do bloco termina após a primeira linha:
Exemplo 213
> - foo - bar <blockquote> <ul> <li>foo</li> </ul> </blockquote> <ul> <li>bar</li> </ul>

Pelo mesmo motivo, não podemos omitir o > frente de linhas subsequentes de um bloco de código recuado ou protegido:

Exemplo 214
> foo bar <blockquote> <pre><code>foo </code></pre> </blockquote> <pre><code>bar </code></pre>
Exemplo 215
> ``` foo ``` <blockquote> <pre><code></code></pre> </blockquote> <p>foo</p> <pre><code></code></pre>

Observe que, no caso a seguir, temos um linha de continuação lenta :

Exemplo 216
> foo - bar <blockquote> <p>foo - bar</p> </blockquote> Para ver o porquê, observe que em > foo > - bar

a - bar é recuado demais para iniciar uma lista e não pode ser um bloco de código recuado porque os blocos de código recuado não podem interromper parágrafos; portanto, é um texto de continuação de parágrafo .

Uma bloco de citação pode estar vazia:
Exemplo 217
> <blockquote> </blockquote>
Exemplo 218
> > > <blockquote> </blockquote>

Uma bloco de citação pode ter linhas em branco iniciais ou finais:

Exemplo 219
> > foo > <blockquote> <p>foo</p> </blockquote> Uma linha em branco sempre separa aspas de bloco:
Exemplo 220
> foo > bar <blockquote> <p>foo</p> </blockquote> <blockquote> <p>bar</p> </blockquote>

(A maioria das implementações atuais do Markdown, incluindo o original de John Gruber, Markdown.pl , analisará este exemplo como uma única citação em bloco com dois parágrafos. Mas parece melhor permitir que o autor decida se duas cotações em bloco ou uma são desejadas.)

Consecutividade significa que, se juntarmos essas cotações em bloco, obteremos uma única bloco de citação:

Exemplo 221
> foo > bar <blockquote> <p>foo bar</p> </blockquote> Para obter um bloco de citação com dois parágrafos, use:
Exemplo 222
> foo > > bar <blockquote> <p>foo</p> <p>bar</p> </blockquote> As aspas de bloco podem interromper parágrafos:
Exemplo 223
foo > bar <p>foo</p> <blockquote> <p>bar</p> </blockquote>

Em geral, linhas em branco não são necessárias antes ou depois das aspas:

Exemplo 224
> aaa *** > bbb <blockquote> <p>aaa</p> </blockquote>
<blockquote> <p>bbb</p> </blockquote>

No entanto, devido à preguiça, é necessária uma linha em branco entre um bloco de citação e um parágrafo a seguir:

Exemplo 225
> bar baz <blockquote> <p>bar baz</p> </blockquote>
Exemplo 226
> bar baz <blockquote> <p>bar</p> </blockquote> <p>baz</p>
Exemplo 227
> bar > baz <blockquote> <p>bar</p> </blockquote> <p>baz</p>

É uma consequência da regra de preguiça que qualquer número de >s inicial possa ser omitido em uma linha de continuação de uma citação de bloco aninhada:

Exemplo 228
> > > foo bar <blockquote> <blockquote> <blockquote> <p>foo bar</p> </blockquote> </blockquote> </blockquote>
Exemplo 229
>>> foo > bar >>baz <blockquote> <blockquote> <blockquote> <p>foo bar baz</p> </blockquote> </blockquote> </blockquote>

Ao incluir um bloco de código recuado em um bloco de citação, lembre-se de que o marcador debloco de citação inclui o >espaço e o espaço a seguir. Portanto , são necessários cinco espaços após o >:

Exemplo 230
> code > not code <blockquote> <pre><code>code </code></pre> </blockquote> <blockquote> <p>not code</p> </blockquote>

Listar itens

Um marcador de lista é um marcador de lista de marcadores ou um marcador de lista ordenada .

Um marcador lista bala é um -, +ou* caráter.

Um marcador de lista ordenada é uma sequência de 1 a 9 dígitos arábicos (0-9), seguida por um .caractere ou um) caractere. (O motivo do limite de comprimento é que, com 10 dígitos, começamos a ver excedentes de números inteiros em alguns navegadores.)

As seguintes regras definem itens da lista :

Caso básico. Se uma sequência de linhas Ls constituir uma sequência de blocos Bs começando com um caractere que não seja um espaço em branco e M for um marcador de lista de largura W seguido por 1 ≤ N ≤ 4 espaços, o resultado da adição de M e dos seguintes espaços ao A primeira linha de Ls e a indentação de linhas subseqüentes de Ls por espaços W + N são um item de lista com Bso conteúdo. O tipo do item da lista (marcador ou pedido) é determinado pelo tipo do seu marcador de lista. Se o item da lista for solicitado, também será atribuído um número inicial, com base no marcador da lista ordenada.

Exceções:

Quando o primeiro item da lista interrompe um parágrafo - ou seja, quando inicia em uma linha que, de outra forma, contaria como texto de continuação de parágrafo -, então (a) as linhas Ls não devem começar com uma linha em branco e (b) se Se o item da lista for solicitado, o número inicial deve ser 1.

Se alguma linha for uma quebra temática , essa linha não será um item da lista.

Por exemplo, sejam Ls as linhas
Exemplo 231
A paragraph with two lines. indented code > A block quote. <p>A paragraph with two lines.</p> <pre><code>indented code </code></pre> <blockquote> <p>A block quote.</p> </blockquote>

E seja M o marcador 1.e N = 2. Em seguida, a regra 1 diz que o seguinte é um item de lista ordenado com o número inicial 1 e o mesmo conteúdo que Ls :

Exemplo 232
1. A paragraph with two lines. indented code > A block quote. <ol> <li> <p>A paragraph with two lines.</p> <pre><code>indented code </code></pre> <blockquote> <p>A block quote.</p> </blockquote> </li> </ol>

O mais importante a ser observado é que a posição do texto após o marcador da lista determina a quantidade de indentação necessária nos blocos subseqüentes no item da lista. Se o marcador da lista ocupar dois espaços e houver três espaços entre o marcador da lista e o próximo caractere que não seja um espaço em branco , os blocos deverão ser recuados cinco espaços para que caiam no item da lista.

Aqui estão alguns exemplos que mostram até que ponto o conteúdo deve ser recuado para ser colocado no item de lista:

Exemplo 233
- one two <ul> <li>one</li> </ul> <p>two</p>
Exemplo 234
- one two <ul> <li> <p>one</p> <p>two</p> </li> </ul>
Exemplo 235
- one two <ul> <li>one</li> </ul> <pre><code> two </code></pre>
Exemplo 236
- one two <ul> <li> <p>one</p> <p>two</p> </li> </ul>

É tentador pensar nisso em termos de colunas: os blocos de continuação devem ser recuados pelo menos para a coluna do primeiro caractere que não seja um espaço em branco após o marcador da lista. No entanto, isso não está certo. Os espaços após o marcador da lista determinam a quantidade de indentação relativa necessária. A coluna que esse recuo atingir dependerá de como o item da lista é incorporado em outras construções, como mostra este exemplo:

Exemplo 237
> > 1. one >> >> two <blockquote> <blockquote> <ol> <li> <p>one</p> <p>two</p> </li> </ol> </blockquote> </blockquote>

Aqui twoocorre na mesma coluna que o marcador da lista 1., mas na verdade está contido no item da lista, porque há recuo suficiente após o último marcador de cotações em bloco.

O inverso também é possível. No exemplo a seguir, a palavra two ocorre à direita do texto inicial do item da lista one, mas não é considerada parte do item da lista, porque não é recuada o suficiente além do marcador de citação:

Exemplo 238
>>- one >> > > two <blockquote> <blockquote> <ul> <li>one</li> </ul> <p>two</p> </blockquote> </blockquote>

Observe que pelo menos um espaço é necessário entre o marcador da lista e qualquer conteúdo a seguir, portanto, esses não são itens da lista:

Exemplo 239
-one 2.two <p>-one</p> <p>2.two</p>

Um item da lista pode conter blocos separados por mais de uma linha em branco.

Exemplo 240
- foo bar <ul> <li> <p>foo</p> <p>bar</p> </li> </ul> Um item da lista pode conter qualquer tipo de bloco:
Exemplo 241
1. foo ``` bar ``` baz > bam <ol> <li> <p>foo</p> <pre><code>bar </code></pre> <p>baz</p> <blockquote> <p>bam</p> </blockquote> </li> </ol>

Um item da lista que contém um bloco de código recuado preservará linhas vazias dentro do bloco de código literalmente.

Exemplo 242
- Foo bar baz <ul> <li> <p>Foo</p> <pre><code>bar baz </code></pre> </li> </ul>

Observe que os números iniciais da lista ordenada devem ter nove dígitos ou menos:

Exemplo 243

123456789. ok

<ol start="123456789"> <li>ok</li> </ol>
Exemplo 244

1234567890. not ok

<p>1234567890. not ok</p> Um número inicial pode começar com 0s:
Exemplo 245
0. ok <ol start="0"> <li>ok</li> </ol>
Exemplo 246
<h3>003. ok</h3> <ol start="3"> <li>ok</li> </ol> Um número inicial pode não ser negativo:
Exemplo 247
-1. not ok <p>-1. not ok</p>

Item começando com código recuado. Se uma sequência de linhas Ls constitui uma sequência de blocos Bs começando com um bloco de código recuado e M é um marcador de lista de largura W seguido por um espaço, o resultado da adição de M e do espaço a seguir à primeira linha de Ls , e recuar linhas subsequentes de Ls por espaços W + 1 , é um item de lista com Bso conteúdo. Se uma linha estiver vazia, ela não precisará ser recuada. O tipo do item da lista (marcador ou pedido) é determinado pelo tipo do seu marcador de lista. Se o item da lista for solicitado, também será atribuído um número inicial, com base no marcador da lista ordenada.

Um bloco de código recuado precisará ser recuado quatro espaços além da borda da região onde o texto será incluído no item da lista. No seguinte caso, são 6 espaços:

Exemplo 248
- foo bar <ul> <li> <p>foo</p> <pre><code>bar </code></pre> </li> </ul> E, neste caso, são 11 espaços:
Exemplo 249
10. foo bar <ol start="10"> <li> <p>foo</p> <pre><code>bar </code></pre> </li> </ol>

Se o primeiro bloco no item da lista for um bloco de código recuado, pela regra nº 2, o conteúdo deverá ser recuado um espaço após o marcador da lista:

Exemplo 250
indented code paragraph more code <pre><code>indented code </code></pre> <p>paragraph</p> <pre><code>more code </code></pre>
Exemplo 251
1. indented code paragraph more code <ol> <li> <pre><code>indented code </code></pre> <p>paragraph</p> <pre><code>more code </code></pre> </li> </ol>

Observe que um recuo de espaço adicional é interpretado como espaço dentro do bloco de código:

Exemplo 252
1. indented code paragraph more code <ol> <li> <pre><code> indented code </code></pre> <p>paragraph</p> <pre><code>more code </code></pre> </li> </ol>

Observe que as regras 1 e 2 aplicam-se apenas a dois casos: (a) casos em que as linhas a serem incluídas em um item de lista começam com um caractere que não seja um espaço em branco e (b) casos em que começam com um código recuado quadra. Em um caso como o seguinte, em que o primeiro bloco começa com um recuo de três espaços, as regras não nos permitem formar um item de lista recuando a coisa toda e acrescentando um marcador de lista:

Exemplo 253
foo bar <p>foo</p> <p>bar</p>
Exemplo 254
- foo bar <ul> <li>foo</li> </ul> <p>bar</p>

Isso não é uma restrição significativa, porque quando um bloco começa com recuo de 1-3 espaços, o recuo sempre pode ser removido sem uma alteração na interpretação, permitindo que a regra 1 seja aplicada. Então, no caso acima:

Exemplo 255
- foo bar <ul> <li> <p>foo</p> <p>bar</p> </li> </ul>

Item começando com uma linha em branco. Se uma sequência de linhas Ls que começa com uma única linha em branco constitui uma sequência (possivelmente vazia) de blocos Bs , não separados um do outro por mais de uma linha em branco, e M é um marcador de lista da largura W , o resultado da adição M para a primeira linha de Ls e recuar as linhas subsequentes de Ls por espaços W + 1 , é um item de lista com Bscomo seu conteúdo. Se uma linha estiver vazia, ela não precisará ser recuada. O tipo do item da lista (marcador ou pedido) é determinado pelo tipo do seu marcador de lista. Se o item da lista for solicitado, também será atribuído um número inicial, com base no marcador da lista ordenada.

Aqui estão alguns itens da lista que começam com uma linha em branco, mas não estão vazias:

Exemplo 256
- foo - ``` bar ``` - baz <ul> <li>foo</li> <li> <pre><code>bar </code></pre> </li> <li> <pre><code>baz </code></pre> </li> </ul>

Quando o item da lista começa com uma linha em branco, o número de espaços após o marcador da lista não altera o recuo necessário:

Exemplo 257
- foo <ul> <li>foo</li> </ul>

Um item da lista pode começar com no máximo uma linha em branco. No exemplo a seguir, foonão faz parte do item da lista:

Exemplo 258
- foo <ul> <li></li> </ul> <p>foo</p> Aqui está um item vazio da lista de marcadores:
Exemplo 259
- foo - - bar <ul> <li>foo</li> <li></li> <li>bar</li> </ul> Não importa se há espaços após o marcador da lista :
Exemplo 260
- foo - - bar <ul> <li>foo</li> <li></li> <li>bar</li> </ul> Aqui está um item da lista ordenada vazio:
Exemplo 261
1. foo 2. 3. bar <ol> <li>foo</li> <li></li> <li>bar</li> </ol> Uma lista pode começar ou terminar com um item de lista vazio:
Exemplo 262
* <ul> <li></li> </ul>

No entanto, um item de lista vazio não pode interromper um parágrafo:

Exemplo 263
foo * foo 1. <p>foo *</p> <p>foo 1.</p>

Recuo. Se uma sequência de linhas Ls constituir um item de lista de acordo com as regras 1, 2 ou 3, o resultado de recuar cada linha de Ls por 1 a 3 espaços (o mesmo para cada linha) também constituirá um item de lista com o mesmo conteúdo e atributos. Se uma linha estiver vazia, ela não precisará ser recuada.

Recuo de um espaço:
Exemplo 264
1. A paragraph with two lines. indented code > A block quote. <ol> <li> <p>A paragraph with two lines.</p> <pre><code>indented code </code></pre> <blockquote> <p>A block quote.</p> </blockquote> </li> </ol> Dois espaços recuados:
Exemplo 265
1. A paragraph with two lines. indented code > A block quote. <ol> <li> <p>A paragraph with two lines.</p> <pre><code>indented code </code></pre> <blockquote> <p>A block quote.</p> </blockquote> </li> </ol> Recuo três espaços:
Exemplo 266
1. A paragraph with two lines. indented code > A block quote. <ol> <li> <p>A paragraph with two lines.</p> <pre><code>indented code </code></pre> <blockquote> <p>A block quote.</p> </blockquote> </li> </ol> O recuo de quatro espaços fornece um bloco de código:
Exemplo 267
1. A paragraph with two lines. indented code > A block quote. <pre><code>1. A paragraph with two lines. indented code > A block quote. </code></pre>

Preguiça. Se uma sequência de linhas Ls constituir um item de lista com o conteúdo Bs , o resultado da exclusão de parte ou toda a indentação de uma ou mais linhas nas quais o próximo caractere que não seja um espaço em branco após a indentação será um texto de continuação de parágrafo é um item de lista com o mesmo conteúdo e atributos. As linhas não recortadas são chamadas continuação lenta s.

Aqui está um exemplo com linhas de continuação preguiçosas :
Exemplo 268
1. A paragraph with two lines. indented code > A block quote. <ol> <li> <p>A paragraph with two lines.</p> <pre><code>indented code </code></pre> <blockquote> <p>A block quote.</p> </blockquote> </li> </ol> O recuo pode ser parcialmente excluído:
Exemplo 269
1. A paragraph with two lines. <ol> <li>A paragraph with two lines.</li> </ol>

Estes exemplos mostram como a preguiça pode funcionar em estruturas aninhadas:

Exemplo 270
> 1. > Blockquote continued here. <blockquote> <ol> <li> <blockquote> <p>Blockquote continued here.</p> </blockquote> </li> </ol> </blockquote>
Exemplo 271
> 1. > Blockquote > continued here. <blockquote> <ol> <li> <blockquote> <p>Blockquote continued here.</p> </blockquote> </li> </ol> </blockquote>

Isso é tudo. Nada que não seja contabilizado como um item de lista pelas regras 1 a 5 conta como um item da lista .

As regras para sublistas seguem as regras gerais acima . Uma sublist deve ser recuada com o mesmo número de espaços que um parágrafo precisaria para ser incluído no item da lista.

Portanto, neste caso, precisamos de dois espaços de recuo:
Exemplo 272
- foo - bar - baz - boo <ul> <li>foo <ul> <li>bar <ul> <li>baz <ul> <li>boo</li> </ul> </li> </ul> </li> </ul> </li> </ul> Um não é suficiente:
Exemplo 273
- foo - bar - baz - boo <ul> <li>foo</li> <li>bar</li> <li>baz</li> <li>boo</li> </ul>

Aqui precisamos de quatro, porque o marcador da lista é mais amplo:

Exemplo 274
10) foo - bar <ol start="10"> <li>foo <ul> <li>bar</li> </ul> </li> </ol> Três não é suficiente:
Exemplo 275
10) foo - bar <ol start="10"> <li>foo</li> </ol> <ul> <li>bar</li> </ul> Uma lista pode ser o primeiro bloco em um item da lista:
Exemplo 276
- - foo <ul> <li> <ul> <li>foo</li> </ul> </li> </ul>
Exemplo 277
1. - 2. foo <ol> <li> <ul> <li> <ol start="2"> <li>foo</li> </ol> </li> </ul> </li> </ol> Um item da lista pode conter um cabeçalho:
Exemplo 278
- # Foo - Bar --- baz <ul> <li> <h1>Foo</h1> </li> <li> <h2>Bar</h2> baz</li> </ul>

Motivação

A especificação Markdown de John Gruber diz o seguinte sobre os itens da lista:

“Os marcadores de lista geralmente começam na margem esquerda, mas podem ser recuados em até três espaços. Os marcadores de lista devem ser seguidos por um ou mais espaços ou uma tabulação. ”

“Para fazer com que as listas tenham uma boa aparência, você pode agrupar itens com recuos pendurados…. Mas se você não quiser, não precisa.

“Os itens da lista podem consistir em vários parágrafos. Cada parágrafo subseqüente em um item da lista deve ser recuado por 4 espaços ou uma tabulação. ”

"Parece bom se você recuar todas as linhas dos parágrafos subsequentes, mas aqui novamente, o Markdown permitirá que você seja preguiçoso."

"Para colocar um bloco de citação em um item da lista, os > delimitadores da cotação precisam ser recuados."

"Para colocar um bloco de código em um item da lista, o bloco de código precisa ser recuado duas vezes - 8 espaços ou duas tabulações."

Essas regras especificam que um parágrafo em um item da lista deve ser recuado quatro espaços (presumivelmente, a partir da margem esquerda, em vez do início do marcador da lista, mas isso não é dito), e esse código em um item da lista deve ser recuado oito espaços em vez dos quatro habituais. Eles também dizem que um bloco de citação deve ser recuada, mas não em quanto; no entanto, o exemplo dado possui quatro recuos de espaços. Embora nada seja dito sobre outros tipos de conteúdo no nível de bloco, é certamente razoável inferir que todos os elementos de bloco em um item de lista, incluindo outras listas, devem ser recuados em quatro espaços. Esse princípio foi chamado de regra dos quatro espaços .

A regra dos quatro espaços é clara e baseada em princípios e, se a implementação de referência a Markdown.plseguisse, provavelmente teria se tornado o padrão. Contudo,Markdown.pl parágrafos e sublistas permitidos começam com apenas dois recuos de espaços, pelo menos no nível externo. Pior, seu comportamento era inconsistente: uma sub-lista de uma lista no nível externo precisava de dois espaços de recuo, mas uma sub-lista dessa sub-lista precisava de três espaços. Não é de surpreender, portanto, que diferentes implementações do Markdown tenham desenvolvido regras muito diferentes para determinar o que está incluído em um item da lista. (Pandoc e python-Markdown, por exemplo, mantiveram a descrição da sintaxe de Gruber e a regra dos quatro espaços, enquanto desconto, redcarpet, marcado, PHP Markdown e outros seguiram Markdown.plo comportamento de mais de perto.)

Infelizmente, dadas as divergências entre as implementações, não há como fornecer uma especificação para itens de lista que serão garantidos para não quebrar nenhum documento existente. No entanto, as especificações fornecidas aqui devem lidar corretamente com listas formatadas com a regra dos quatro espaços ou com o Markdown.plcomportamento mais tolerante , desde que sejam dispostas de maneira natural para o ser humano ler.

A estratégia aqui é permitir que a largura e o recuo do marcador da lista determinem o recuo necessário para que os blocos se enquadrem no item da lista, em vez de ter um número fixo e arbitrário. O escritor pode pensar no corpo do item da lista como uma unidade que é recuada para a direita o suficiente para caber no marcador da lista (e qualquer recuo no marcador da lista). (A regra de preguiça, nº 5, permite que as linhas de continuação não sejam recuadas, se necessário.)

Esta regra é superior, alegamos, a qualquer regra que exija um nível fixo de indentação da margem. A regra dos quatro espaços é clara, mas não natural. É pouco intuitivo que

- foo bar - baz

deve ser analisado como duas listas com um parágrafo intermediário,

<ul> <li>foo</li> </ul> <p>bar</p> <ul> <li>baz</li> </ul>

como a regra dos quatro espaços exige, em vez de uma única lista,

<ul> <li> <p>foo</p> <p>bar</p> <ul> <li>baz</li> </ul> </li> </ul>

A escolha de quatro espaços é arbitrária. Ele pode ser aprendido, mas não é provável que seja adivinhado, e engana os iniciantes regularmente.

Ajudaria a adotar uma regra de dois espaços? O problema é que essa regra, juntamente com a regra que permite a recuo de 1 a 3 espaços do marcador inicial da lista, permite que o texto recuado menor que o marcador original seja incluído no item da lista. Por exemplo, Markdown.planalisa

- one two como um único item da lista, com twoum parágrafo de continuação: <ul> <li> <p>one</p> <p>two</p> </li> </ul> e da mesma forma > - one > > two Como <blockquote> <ul> <li> <p>one</p> <p>two</p> </li> </ul> </blockquote> Isso é extremamente intuitivo.

Em vez de exigir um recuo fixo da margem, poderíamos exigir um recuo fixo (digamos, dois espaços ou até um espaço) do marcador da lista (que pode ser recuado). Essa proposta removeria a última anomalia discutida. Diferentemente da especificação apresentada acima, ela contaria o seguinte como um item de lista com um subparágrafo, mesmo que o parágrafobar não seja recuado até o primeiro parágrafo foo:

10. foo bar

Indiscutivelmente, este texto parece um item de lista com bar um parágrafo, o que pode contar a favor da proposta. No entanto, nessa proposta, o código recuado teria que ser recuado seis espaços após o marcador da lista. E isso quebraria muitos Markdown existentes, que têm o padrão:

1. foo indented code

onde o código é recuado oito espaços. As especificações acima, por outro lado, analisarão esse texto conforme o esperado, pois a indentação do bloco de código é medida desde o início de foo.

O único caso que precisa de tratamento especial é um item da lista que começa com o código recuado. Quanto recuo é necessário nesse caso, já que não temos um "primeiro parágrafo" para medir? A regra nº 2 simplesmente estipula que, nesses casos, exigimos um recuo de espaço no marcador da lista (e, em seguida, os quatro espaços normais para o código recuado). Isso corresponderá à regra dos quatro espaços nos casos em que o marcador da lista mais o recuo inicial ocupam quatro espaços (um caso comum), mas divergem em outros casos.

Itens da lista de tarefas (extensão)

O GFM permite a tasklistextensão, onde uma etapa de processamento adicional é executada nos itens da lista .

Um item da lista de tarefas é um item da lista em que o primeiro bloco é um parágrafo que começa com um marcador de item da lista de tarefas e pelo menos um caractere de espaço em branco antes de qualquer outro conteúdo.

Um marcador de item da lista de tarefas consiste em um número opcional de espaços, um colchete esquerdo ([), um caractere de espaço em branco ou a letra xem minúscula ou maiúscula e, em seguida, um colchete direito (] ).

Quando renderizado, o marcador do item da lista de tarefas é substituído por um elemento de caixa de seleção semântico; em uma saída HTML, isso seria um <input type="checkbox"> elemento.

Se o caractere entre colchetes for um espaço em branco, a caixa de seleção estará desmarcada. Caso contrário, a caixa de seleção está marcada.

Esta especificação não define como os elementos da caixa de seleção são interagidos: na prática, os implementadores são livres para renderizar as caixas de seleção como elementos desabilitados ou imutáveis, ou podem lidar dinamicamente com interações dinâmicas (ou seja, verificar, desmarcar) no documento final renderizado.

Exemplo 279
- [ ] foo - [x] bar <ul> <li><input disabled="" type="checkbox"> foo</li>

<li><input checked="" disabled="" type="checkbox"> bar&lt;/li&gt;</p> </ul> As listas de tarefas podem ser aninhadas arbitrariamente:

Exemplo 280
- [x] foo - [ ] bar - [x] baz - [ ] bim <ul> <li><input checked="" disabled="" type="checkbox"> foo <ul> <li><input disabled="" type="checkbox"> bar</li>

<li><input checked="" disabled="" type="checkbox"> baz&lt;/li&gt;</p> </ul> </li> <li><input disabled="" type="checkbox"> bim</li> </ul>

Listas

Uma lista é uma sequência de um ou mais itens de lista do mesmo tipo . Os itens da lista podem ser separados por qualquer número de linhas em branco.

Dois itens de lista são do mesmo tipo se começarem com um marcador de lista do mesmo tipo. Dois marcadores da lista são do mesmo tipo, se (a) eles são lista bala marcadores usando o mesmo personagem (-, +ou *) ou (B) que são ordenados lista de números com o mesmo delimitador (seja .ou) ).

Uma lista é uma lista ordenada se os itens da lista constituinte começarem com marcadores de lista ordenados e uma lista de marcadores se os itens da lista constituinte começarem com marcadores da lista de marcadores .

O número inicial de uma lista ordenada é determinado pelo número da lista do seu item inicial da lista. Os números dos itens de lista subseqüentes são desconsiderados.

Uma lista fica solta se algum de seus itens da lista constituinte for separado por linhas em branco ou se algum de seus itens da lista constituinte contiver diretamente dois elementos em nível de bloco com uma linha em branco entre eles. Caso contrário, a lista é estreita . (A diferença na saída HTML é que os parágrafos de uma lista solta são agrupados em<p> tags, enquanto os parágrafos em uma lista restrita não.)

Alterar o marcador ou o delimitador da lista ordenada inicia uma nova lista:

Exemplo 281
- foo - bar + baz <ul> <li>foo</li> <li>bar</li> </ul> <ul> <li>baz</li> </ul>
Exemplo 282
1. foo 2. bar 3) baz <ol> <li>foo</li> <li>bar</li> </ol> <ol start="3"> <li>baz</li> </ol>

No CommonMark, uma lista pode interromper um parágrafo. Ou seja, nenhuma linha em branco é necessária para separar um parágrafo da seguinte lista:

Exemplo 283
Foo - bar - baz <p>Foo</p> <ul> <li>bar</li> <li>baz</li> </ul>

Markdown.pl não permite isso, por medo de acionar uma lista por meio de um numeral em uma linha rígida:

The number of windows in my house is 14. The number of doors is 6.

Estranhamente, porém, Markdown.pl faz que uma citação em bloco interrompa um parágrafo, mesmo que as mesmas considerações possam ser aplicadas.

No CommonMark, permitimos que as listas interrompam parágrafos, por dois motivos. Primeiro, é natural e não incomum as pessoas iniciarem listas sem linhas em branco:

I need to buy - new shoes - a coat - a plane ticket Segundo, somos atraídos por um

princípio de uniformidade : se um pedaço de texto tiver um certo significado, ele continuará a ter o mesmo significado quando colocado em um bloco de contêiner (como um item de lista oubloco de citação).

(De fato, a especificação para itens de lista e cotações em bloco pressupõe esse princípio.) Esse princípio implica que, se

* I need to buy - new shoes - a coat - a plane ticket

é um item de lista que contém um parágrafo seguido por uma sub-lista aninhada, como todas as implementações do Markdown concordam que seja (embora o parágrafo possa ser renderizado sem <p>tags, pois a lista é "restrita"),

I need to buy - new shoes - a coat - a plane ticket

por si só deve ser um parágrafo seguido por uma sub-lista aninhada.

Como é uma prática bem estabelecida do Markdown permitir que as listas interrompam parágrafos dentro dos itens da lista, o princípio da uniformidade exige que permitamos também esses itens da lista externa. (reStructuredText usa uma abordagem diferente, exigindo linhas em branco antes das listas, mesmo dentro de outros itens da lista.)

Para resolver listas indesejadas em parágrafos com números encapsulados, permitimos que apenas listas iniciando com 1a interrupção de parágrafos. Portanto,

Exemplo 284
The number of windows in my house is 14. The number of doors is 6. <p>The number of windows in my house is 14. The number of doors is 6.</p> Ainda podemos obter um resultado não intencional em casos como
Exemplo 285
The number of windows in my house is 1. The number of doors is 6. <p>The number of windows in my house is</p> <ol> <li>The number of doors is 6.</li> </ol>

mas essa regra deve impedir a maioria das capturas de listas falsas.

Pode haver qualquer número de linhas em branco entre os itens:
Exemplo 286
- foo - bar - baz <ul> <li> <p>foo</p> </li> <li> <p>bar</p> </li> <li> <p>baz</p> </li> </ul>
Exemplo 287
- foo - bar - baz bim <ul> <li>foo <ul> <li>bar <ul> <li> <p>baz</p> <p>bim</p> </li> </ul> </li> </ul> </li> </ul>

Para separar listas consecutivas do mesmo tipo ou para separar uma lista de um bloco de código recuado que, de outra forma, seria analisado como um parágrafo do item final da lista, você pode inserir um comentário HTML em branco:

Exemplo 288
- foo - bar <!-- --> - baz - bim <ul> <li>foo</li> <li>bar</li> </ul> <!-- --> <ul> <li>baz</li> <li>bim</li> </ul>
Exemplo 289
- foo notcode - foo <!-- --> code <ul> <li> <p>foo</p> <p>notcode</p> </li> <li> <p>foo</p> </li> </ul> <!-- --> <pre><code>code </code></pre>

Os itens da lista não precisam ser recuados para o mesmo nível. Os seguintes itens da lista serão tratados como itens no mesmo nível de lista, pois nenhum é recuado o suficiente para pertencer ao item anterior:

Exemplo 290
- a - b - c - d - e - f - g <ul> <li>a</li> <li>b</li> <li>c</li> <li>d</li> <li>e</li> <li>f</li> <li>g</li> </ul>
Exemplo 291
1. a 2. b 3. c <ol> <li> <p>a</p> </li> <li> <p>b</p> </li> <li> <p>c</p> </li> </ol>

Observe, no entanto, que os itens da lista não podem ser recuados mais de três espaços. Aqui - eé tratada como uma linha de continuação de parágrafo, porque é recuada mais de três espaços:

Exemplo 292
- a - b - c - d - e <ul> <li>a</li> <li>b</li> <li>c</li> <li>d - e</li> </ul>

E aqui, 3. cé tratado como no bloco de código recuado, porque é recuado quatro espaços e precedido por uma linha em branco.

Exemplo 293
1. a 2. b 3. c <ol> <li> <p>a</p> </li> <li> <p>b</p> </li> </ol> <pre><code>3. c </code></pre>

Esta é uma lista frouxa, porque há uma linha em branco entre dois dos itens da lista:

Exemplo 294
- a - b - c <ul> <li> <p>a</p> </li> <li> <p>b</p> </li> <li> <p>c</p> </li> </ul> Então é isso, com um segundo item vazio:
Exemplo 295
* a * * c <ul> <li> <p>a</p> </li> <li></li> <li> <p>c</p> </li> </ul>

Essas são listas soltas, mesmo que não haja espaço entre os itens, porque um deles contém diretamente dois elementos no nível do bloco com uma linha em branco entre eles:

Exemplo 296
- a - b c - d <ul> <li> <p>a</p> </li> <li> <p>b</p> <p>c</p> </li> <li> <p>d</p> </li> </ul>
Exemplo 297
- a - b [ref]: /url - d <ul> <li> <p>a</p> </li> <li> <p>b</p> </li> <li> <p>d</p> </li> </ul>

Esta é uma lista restrita, porque as linhas em branco estão em um bloco de código:

Exemplo 298
- a - ``` b ``` - c <ul> <li>a</li> <li> <pre><code>b </code></pre> </li> <li>c</li> </ul>

Esta é uma lista restrita, porque a linha em branco está entre dois parágrafos de uma sub-lista. Portanto, a sub-lista fica solta enquanto a lista externa é estreita:

Exemplo 299
- a - b c - d <ul> <li>a <ul> <li> <p>b</p> <p>c</p> </li> </ul> </li> <li>d</li> </ul>

Esta é uma lista restrita, porque a linha em branco está dentro do bloco.

Exemplo 300
* a > b > * c <ul> <li>a <blockquote> <p>b</p> </blockquote> </li> <li>c</li> </ul>

Esta lista é restrita, porque os elementos de bloco consecutivos não são separados por linhas em branco:

Exemplo 301
- a > b ``` c ``` - d <ul> <li>a <blockquote> <p>b</p> </blockquote> <pre><code>c </code></pre> </li> <li>d</li> </ul> Uma lista de parágrafo único é estreita:
Exemplo 302
- a <ul> <li>a</li> </ul>
Exemplo 303
- a - b <ul> <li>a <ul> <li>b</li> </ul> </li> </ul>

Esta lista está solta, devido à linha em branco entre os dois elementos de bloco no item de lista:

Exemplo 304
1. ``` foo ``` bar <ol> <li> <pre><code>foo </code></pre> <p>bar</p> </li> </ol> Aqui a lista externa é solta, a lista interna é estreita:
Exemplo 305
* foo * bar baz <ul> <li> <p>foo</p> <ul> <li>bar</li> </ul> <p>baz</p> </li> </ul>
Exemplo 306
- a - b - c - d - e - f <ul> <li> <p>a</p> <ul> <li>b</li> <li>c</li> </ul> </li> <li> <p>d</p> <ul> <li>e</li> <li>f</li> </ul> </li> </ul>

linhas

As linhas são analisadas sequencialmente do início do fluxo de caracteres até o final (da esquerda para a direita, nos idiomas da esquerda para a direita). Assim, por exemplo, em

Exemplo 307
`hi`lo` <p><code>hi</code>lo`</p>

hi é analisado como código, deixando o crase no final como um crase literal.

Escapes de barra invertida

Qualquer caractere de pontuação ASCII pode ter uma barra invertida:

Exemplo 308
\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~

<p>!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~</p>

Barras invertidas antes que outros caracteres sejam tratados como barras invertidas literais:

Exemplo 309
\→\A\a\ \3\φ\« <p>\→\A\a\ \3\φ\«</p>

Caracteres escapados são tratados como caracteres regulares e não têm seus significados usuais do Markdown:

Exemplo 310
\*not emphasized* \<br/> not a tag \[not a link](/foo) \`not code` 1\. not a list \* not a list \# not a heading \[foo]: /url "not a reference" \ö not a character entity <p>*not emphasized* <br/> not a tag [not a link](/foo) `not code` 1. not a list * not a list # not a heading [foo]: /url "not a reference" &ouml; not a character entity</p>

Se uma barra invertida for escapada, o caractere a seguir não será:

Exemplo 311
\\*emphasis* <p>\<em>emphasis</em></p>

Uma barra invertida no final da linha é uma quebra de linha rígida :

Exemplo 312
foo\ bar <p>foo<br /> bar</p>

As escapes de barra invertida não funcionam em blocos de código, extensões de código, links automáticos ou HTML bruto:

Exemplo 313
`` \[\` `` <p><code>\[\`</code></p>
Exemplo 314
\[\] <pre><code>\[\] </code></pre>
Exemplo 315
~~~ \[\] ~~~ <pre><code>\[\] </code></pre>
Exemplo 316

<p><a href="http://example.com?find=%5C*">http://example.com?find=\*&lt;/a&gt;&lt;/p&gt;</p>

Exemplo 317
<a href="/bar\/)"> <a href="/bar\/)">

Mas eles funcionam em todos os outros contextos, incluindo URLs e títulos de links, referências de links e cadeias de informações em blocos de códigos protegidos. :

Exemplo 318
[foo](/bar\* "ti\*tle") <p><a href="/bar*" title="ti*tle">foo</a></p>
Exemplo 319
[foo] [foo]: /bar\* "ti\*tle" <p><a href="/bar*" title="ti*tle">foo</a></p>
Exemplo 320
``` foo\+bar foo ``` <pre><code class="language-foo+bar">foo </code></pre>

Referências de entidade e caracteres numéricos

Referências de entidade HTML válidas e referências de caracteres numéricos podem ser usadas no lugar do caractere Unicode correspondente, com as seguintes exceções:

As referências de entidade e caractere não são reconhecidas nos blocos de código e nos intervalos de código.

As referências de entidade e caractere não podem substituir caracteres especiais que definem elementos estruturais no CommonMark. Por exemplo, embora *possa ser usado no lugar de um *caractere literal , *não pode substituir *em delimitadores de ênfase, marcadores de lista de marcadores ou quebras temáticas.

Os analisadores do CommonMark em conformidade não precisam armazenar informações sobre se um caractere específico foi representado na origem usando um caractere Unicode ou uma referência de entidade.

As referências de entidade consistem em &+ qualquer um dos nomes de entidade HTML5 válidos + ;. O documento https://html.spec.whatwg.org/multipage/entities.json é usado como uma fonte autorizada para as referências de entidade válidas e seus pontos de código correspondentes.

Exemplo 321
  & © Æ Ď ¾ ℋ ⅆ ∲ ≧̸ <p> & © Æ Ď ¾ ℋ ⅆ ∲ ≧̸</p>

As referências de caracteres numéricos decimais consistem em &#+ uma sequência de 1 a 7 dígitos em árabe + ;. Uma referência de caractere numérico é analisada como o caractere Unicode correspondente. Pontos de código Unicode inválidos serão substituídos pelo REPLACEMENT CHARACTER (U+FFFD). Por motivos de segurança, o ponto de código U+0000também será substituído por U+FFFD.

Exemplo 322
# Ӓ Ϡ � <p># Ӓ Ϡ �</p>

As referências de caracteres numéricos hexadecimais consistem em &#+ Xou x+ em uma sequência de 1 a 6 dígitos hexadecimais + ;. Eles também são analisados ​​como o caractere Unicode correspondente (desta vez especificado com um número hexadecimal em vez de decimal).

Exemplo 323
" ആ ಫ <p>" ആ ಫ</p> Aqui estão algumas nonentities:
Exemplo 324
  &x; &#; &#x; � &#abcdef0; &ThisIsNotDefined; &hi?; <p>&nbsp &x; &#; &#x; &#87654321; &#abcdef0; &ThisIsNotDefined; &hi?;</p>

Embora o HTML5 aceite algumas referências de entidade sem ponto e vírgula à direita (como ©), elas não são reconhecidas aqui, pois tornam a gramática muito ambígua:

Exemplo 325
© <p>&copy</p>

As cadeias que não estão na lista de entidades nomeadas em HTML5 também não são reconhecidas como referências de entidade:

Exemplo 326
&MadeUpEntity; <p>&MadeUpEntity;</p>

As referências de entidade e caracteres numéricos são reconhecidas em qualquer contexto, além de extensões de código ou blocos de código, incluindo URLs, títulos de links e cadeias de informações de bloco de código cercado :

Exemplo 327
<a href="&ouml;&ouml;.html"> <a href="&ouml;&ouml;.html">
Exemplo 328
[foo](/föö "föö")

<p><a href="/f%C3%B6%C3%B6" title="föö">foo&lt;/a&gt;&lt;/p&gt;</p>

Exemplo 329
[foo] [foo]: /föö "föö"

<p><a href="/f%C3%B6%C3%B6" title="föö">foo&lt;/a&gt;&lt;/p&gt;</p>

Exemplo 330
``` föö foo ``` <pre><code class="language-föö">foo </code></pre>

As referências de entidade e caracteres numéricos são tratadas como texto literal em intervalos de código e blocos de código:

Exemplo 331
`föö`

<p><code>f&ouml;&ouml;</code></p>

Exemplo 332
föfö <pre><code>f&ouml;f&ouml; </code></pre>

As referências de entidade e caracteres numéricos não podem ser usadas no lugar de símbolos indicando a estrutura nos documentos do CommonMark.

Exemplo 333
*foo* *foo* <p>*foo* <em>foo</em></p>
Exemplo 334
* foo * foo <p>* foo</p> <ul> <li>foo</li> </ul>
Exemplo 335
foo bar <p>foo bar</p>
Exemplo 336
foo <p>→foo</p>
Exemplo 337
[a](url "tit") <p>[a](url "tit")</p>

Extensão de código

Uma string de crase é uma string de um ou mais caracteres de crase (`) que não é precedida nem seguida por um crase.

Um período de código começa com uma sequência de crase e termina com uma sequência de crase de igual comprimento. O conteúdo do período de código são os caracteres entre as duas cadeias de crase, normalizadas das seguintes maneiras:

Primeiro, as terminações de linha são convertidas em espaços .

Se a sequência resultante começar e terminar com um caractere de espaço , mas não consistir inteiramente em caracteres de espaço , um único caractere de espaço será removido da frente e de trás. Isso permite incluir o código que começa ou termina com caracteres de crase, que devem ser separados por espaço em branco das seqüências de abertura ou fechamento de crase.

Este é um período de código simples:
Exemplo 338
`foo` <p><code>foo</code></p>

Aqui, dois crases são usados, porque o código contém um crase. Este exemplo também ilustra a remoção de um único espaço inicial e final:

Exemplo 339
`` foo ` bar `` <p><code>foo ` bar</code></p>

Este exemplo mostra a motivação para eliminar espaços à esquerda e à direita:

Exemplo 340
` `` ` <p><code>``</code></p> Observe que apenas um espaço é removido:
Exemplo 341
` `` ` <p><code> `` </code></p>

A remoção ocorre apenas se o espaço estiver em ambos os lados da cadeia:

Exemplo 342
` a` <p><code> a</code></p>

Somente espaços , e não espaços em branco unicode em geral, são removidos desta maneira:

Exemplo 343
` b ` <p><code> b </code></p>

Nenhuma remoção ocorre se o período de código contiver apenas espaços:

Exemplo 344
` ` ` ` <p><code> </code> <code> </code></p> As terminações de linha são tratadas como espaços:
Exemplo 345
`` foo bar baz `` <p><code>foo bar baz</code></p>
Exemplo 346
`` foo `` <p><code>foo </code></p> Os espaços interiores não são recolhidos:
Exemplo 347
`foo bar baz` <p><code>foo bar baz</code></p>

Observe que os navegadores normalmente recolherão espaços consecutivos ao renderizar <code>elementos, portanto, é recomendável que o seguinte CSS seja usado:

code{white-space: pre-wrap;}

Observe que as escapes de barra invertida não funcionam nos intervalos de código. Todas as barras invertidas são tratadas literalmente:

Exemplo 348
`foo\`bar` <p><code>foo\</code>bar`</p>

Escapes de barra invertida nunca são necessários, porque sempre é possível escolher uma sequência de n caracteres crase como delimitadores, em que o código não contém nenhuma sequência de exatamente n caracteres crase.

Exemplo 349
``foo`bar`` <p><code>foo`bar</code></p>
Exemplo 350
` foo `` bar ` <p><code>foo `` bar</code></p>

Os crases de extensão de código têm maior precedência do que qualquer outra construção em linha, exceto tags HTML e links automáticos. Assim, por exemplo, isso não é analisado como texto enfatizado, pois o segundo *faz parte de um período de código:

Exemplo 351
*foo`*` <p>*foo<code>*</code></p> E isso não é analisado como um link:
Exemplo 352
[not a `link](/foo`) <p>[not a <code>link](/foo</code>)</p>

Os intervalos de código, tags HTML e links automáticos têm a mesma precedência. Assim, este é o código:

Exemplo 353
`<a href="`">`

<p><code><a href="</code>">`</p>

Mas esta é uma tag HTML:
Exemplo 354
<a href="`">` <p><a href="`">`</p> E este é o código:
Exemplo 355
``

<p><code><http://foo.bar.</code>baz>`</p>

Mas este é um link automático:
Exemplo 356
`

<p><a href="http://foo.bar.%60baz">http://foo.bar.`baz&lt;/a&gt;`&lt;/p&gt;</p>

Quando uma string de crase não é fechada por uma string de crase correspondente, temos apenas crases literais:

Exemplo 357
```foo`` <p>```foo``</p>
Exemplo 358
`foo <p>`foo</p>

O caso a seguir também ilustra a necessidade de abrir e fechar as cordas de crase com o mesmo comprimento:

Exemplo 359
`foo``bar`` <p>`foo<code>bar</code></p>

Ênfase e forte ênfase

Descrição original da sintaxe Markdown de John Gruber diz:

O markdown trata asteriscos (*) e sublinhados (_) como indicadores de ênfase. O texto está quebrado com um *ou _será quebrado com uma <em>tag HTML ; double *ou _'s serão agrupados com um HTML<strong> tag .

Isso é suficiente para a maioria dos usuários, mas essas regras deixam muita indecisão, especialmente quando se trata de ênfase aninhada. O Markdown.plconjunto de testes original deixa claro que os triplos ***e os ___delimitadores podem ser usados ​​com forte ênfase, e a maioria das implementações também permitiu os seguintes padrões:

***strong emph*** ***strong** in emph* ***emph* in strong** **in strong *emph*** *in emph **strong***

Os seguintes padrões são menos amplamente suportados, mas a intenção é clara e útil (especialmente em contextos como entradas da bibliografia):

*emph *with emph* in it* **strong **with strong** in it**

Muitas implementações também restringiram a ênfase entre as palavras aos *formulários, para evitar ênfase indesejada em palavras que contenham sublinhados internos. (É uma prática recomendada colocá-los nos intervalos de código, mas os usuários geralmente não o fazem.)

internal emphasis: foo*bar*baz no emphasis: foo_bar_baz

As regras fornecidas abaixo capturam todos esses padrões, enquanto permitem estratégias de análise eficientes que não retrocedem.

Primeiro, algumas definições. Uma execução de delimitador é uma sequência de um ou mais *caracteres que não é precedida ou seguida por um caractere sem escape de barra invertida *ou uma sequência de um ou mais _caracteres que não é precedida ou seguida por um caractere sem escape de barra invertida_ caractere sem .

Uma execução de delimitador de flanqueamento esquerdo é uma execução de delimitador que (1) não é seguida por espaço em branco Unicode e (2a) não é seguida por um caractere de pontuação ou (2b) seguida por um caractere de pontuação e precedida por espaço em branco ou uma pontuação em Unicode personagem . Para os fins desta definição, o início e o final da linha contam como espaço em branco Unicode.

Uma execução de delimitador de flanqueamento à direita é uma execução de delimitador que (1) não é precedida por espaço em branco Unicode e (2a) não é precedida por um caractere de pontuação ou (2b) precedida por um caractere de pontuação e seguida por espaço em branco ou uma pontuação em Unicode personagem . Para os fins desta definição, o início e o final da linha contam como espaço em branco Unicode.

Aqui estão alguns exemplos de execuções de delimitador. flanco esquerdo, mas não flanco direito: ***abc _abc **"abc" _"abc" flanco direito, mas não flanco esquerdo: abc*** abc_ "abc"** "abc"_ Esquerda e direita: abc***def "abc"_"def" Nem esquerdo nem direito: abc *** def a _ b

(A idéia de distinguir esquerda de flanco e de flanco direito corridas delimitador baseado no personagem antes e o personagem depois vem do Roopesh Chander vfmd . Usos vfmd a terminologia “string indicador ênfase” em vez de “delimitador run”, e suas regras para distinguir corridas esquerda e direita são um pouco mais complexas do que as apresentadas aqui.)

As regras a seguir definem ênfase e ênfase forte:

Um único *caractere pode dar ênfase se (se e somente se) fizer parte de uma execução de delimitador no lado esquerdo .

Um único _caractere pode dar ênfase se faz parte de uma execução de delimitador de flanqueamento à esquerda e (a) não faz parte de uma execução de delimitador de flanqueamento à direita ou (b) parte de uma execução de delimitador de flanqueamento à direita precedida por pontuação.

Um único *caractere pode enfatizar se fizer parte de uma execução de delimitador de flanqueamento à direita .

Um único _caractere pode dar ênfase se for parte de uma execução de delimitador de flanqueamento à direita e (a) não fizer parte de uma execução de delimitador de flanqueamento à esquerda ou (b) parte de uma execução de delimitador de flanqueamento à esquerda seguida de pontuação.

Um duplo ** pode abrir forte ênfase se fizer parte de uma execução de delimitador no lado esquerdo .

Um duplo __ pode dar forte ênfase se fizer parte de uma execução de delimitador de flanqueamento à esquerda e (a) não fizer parte de uma execução de delimitador de flanqueamento à direita ou (b) parte de uma execução de delimitador de flanqueamento à direita precedida por pontuação.

Um duplo ** pode fechar uma forte ênfase se fizer parte de uma execução de delimitador de flanqueamento à direita .

Um duplo __ pode fechar forte ênfase se fizer parte de uma execução de delimitador de flanqueamento à direita e (a) não fizer parte de uma execução de delimitador de flanqueamento à esquerda ou (b) parte de uma execução de delimitador de flanqueamento à esquerda seguida de pontuação.

A ênfase começa com um delimitador que pode abrir a ênfase e termina com um delimitador que pode fechar a ênfase e que usa o mesmo caractere (_ou *) que o delimitador de abertura. Os delimitadores de abertura e fechamento devem pertencer a execuções de delimitador separadas . Se um dos delimitadores puder abrir e fechar a ênfase, a soma dos comprimentos das execuções do delimitador que contêm os delimitadores de abertura e fechamento não deve ser um múltiplo de 3, a menos que ambos os comprimentos sejam múltiplos de 3.

A ênfase forte começa com um delimitador que pode abrir uma ênfase forte e termina com um delimitador que pode fechar uma ênfase forte e que usa o mesmo caractere (_ou *) que o delimitador de abertura. Os delimitadores de abertura e fechamento devem pertencer a execuções de delimitador separadas . Se um dos delimitadores puder abrir e fechar uma forte ênfase, a soma dos comprimentos das execuções do delimitador que contêm os delimitadores de abertura e fechamento não deve ser um múltiplo de 3, a menos que os dois comprimentos sejam múltiplos de 3.

Um *caractere literal não pode ocorrer no início ou no final da *ênfase **delimitada ou forte enfatizada, a menos que seja escapado pela barra invertida.

Um _caractere literal não pode ocorrer no início ou no final da _ênfase __delimitada ou forte enfatizada, a menos que seja escapado pela barra invertida.

Onde as regras 1 a 12 acima são compatíveis com várias análises, os seguintes princípios resolvem a ambiguidade:

O número de aninhamentos deve ser minimizado. Assim, por exemplo, uma interpretação <strong>...</strong>é sempre preferida <em><em>...</em></em>.

Uma interpretação <em><strong>...</strong></em>é sempre preferida <strong><em>...</em></strong>.

Quando duas áreas de ênfase potencial ou forte ênfase se sobrepõem, de modo que a segunda começa antes que a primeira termine e termine após a primeira, a primeira tem precedência. Assim, por exemplo, *foo _bar* baz_é analisado em <em>foo _bar</em> baz_vez de *foo <em>bar* baz</em>.

Quando há duas ênfases em potencial ou fortes trechos com o mesmo delimitador de fechamento, o menor (aquele que abre mais tarde) tem precedência. Assim, por exemplo, **foo **bar baz**é analisado em **foo <strong>bar baz</strong> vez de <strong>foo **bar baz</strong>.

Os intervalos de código embutido, links, imagens e tags HTML agrupam mais fortemente do que ênfase. Portanto, quando há uma escolha entre uma interpretação que contém um desses elementos e outra que não, o primeiro sempre vence. Assim, por exemplo, *[foo*](bar)é analisado mais *<a href="bar">foo*</a>do que como <em>[foo</em>](bar).

Essas regras podem ser ilustradas através de uma série de exemplos.

Regra 1:
Exemplo 360
*foo bar* <p><em>foo bar</em></p>

Isso não é ênfase, porque a abertura *é seguida por espaços em branco e, portanto, não faz parte de uma execução de delimitador de flanqueamento à esquerda :

Exemplo 361
a * foo bar* <p>a * foo bar*</p>

Isso não é ênfase, porque a abertura *é precedida por um alfanumérico e seguida de pontuação e, portanto, não faz parte de uma execução de delimitador de flanqueamento à esquerda :

Exemplo 362
a*"foo"* <p>a*"foo"*</p>

Os espaços não separáveis ​​Unicode também contam como espaço em branco:

Exemplo 363
* a * <p>* a *</p> *É permitida a ênfase entre palavras-chave com :
Exemplo 364
foo*bar* <p>foo<em>bar</em></p>
Exemplo 365

5*6*78

<p>5<em>6</em>78</p> Regra 2:
Exemplo 366
_foo bar_ <p><em>foo bar</em></p>

Isso não é ênfase, porque a abertura _é seguida por espaços em branco:

Exemplo 367
_ foo bar_ <p>_ foo bar_</p>

Isso não é ênfase, porque a abertura _é precedida por um alfanumérico e seguida por pontuação:

Exemplo 368
a_"foo"_ <p>a_"foo"_</p> Ênfase com _não é permitido dentro das palavras:
Exemplo 369
foo_bar_ <p>foo_bar_</p>
Exemplo 370

5_6_78

<p>5_6_78</p>
Exemplo 371
пристаням_стремятся_ <p>пристаням_стремятся_</p>

Aqui _não gera ênfase, porque a primeira execução do delimitador é flanquear à direita e a segunda flanquear à esquerda:

Exemplo 372
aa_"bb"_cc <p>aa_"bb"_cc</p>

Isso é ênfase, mesmo que o delimitador de abertura seja do lado esquerdo e do lado direito, porque é precedido por pontuação:

Exemplo 373
foo-_(bar)_ <p>foo-<em>(bar)</em></p> Regra 3:

Isso não é ênfase, porque o delimitador de fechamento não corresponde ao delimitador de abertura:

Exemplo 374
_foo* <p>_foo*</p>

Isso não é ênfase, porque o fechamento *é precedido por espaços em branco:

Exemplo 375
*foo bar * <p>*foo bar *</p> Uma nova linha também conta como espaço em branco:
Exemplo 376
*foo bar * <p>*foo bar *</p>

Isso não é ênfase, porque o segundo *é precedido por pontuação e seguido por um alfanumérico (portanto, não faz parte de uma execução de delimitador de flanqueamento à direita :

Exemplo 377
*(*foo) <p>*(*foo)</p>

O ponto desta restrição é mais facilmente apreciado com este exemplo:

Exemplo 378
*(*foo*)*

<p><em>(<em>foo</em>)</em></p>

*É permitido enfatizar o Intraword com :
Exemplo 379
*foo*bar <p><em>foo</em>bar</p> Artigo 4:

Isso não é ênfase, porque o fechamento _é precedido por espaços em branco:

Exemplo 380
_foo bar _ <p>_foo bar _</p>

Isso não é ênfase, porque o segundo _é precedido por pontuação e seguido por um alfanumérico:

Exemplo 381
_(_foo) <p>_(_foo)</p> Isso é ênfase dentro da ênfase:
Exemplo 382
_(_foo_)_

<p><em>(<em>foo</em>)</em></p>

A ênfase do Intraword não é permitida para _:
Exemplo 383
_foo_bar <p>_foo_bar</p>
Exemplo 384
_пристаням_стремятся <p>_пристаням_стремятся</p>
Exemplo 385
_foo_bar_baz_ <p><em>foo_bar_baz</em></p>

Isso é ênfase, mesmo que o delimitador de fechamento seja flanqueado à esquerda e à direita, porque é seguido por pontuação:

Exemplo 386
_(bar)_. <p><em>(bar)</em>.</p> Artigo 5:
Exemplo 387
**foo bar** <p><strong>foo bar</strong></p>

Essa não é uma ênfase forte, porque o delimitador de abertura é seguido pelo espaço em branco:

Exemplo 388
** foo bar** <p>** foo bar**</p>

Isso não é uma ênfase forte, porque a abertura **é precedida por um alfanumérico e seguida por pontuação e, portanto, não faz parte de uma execução de delimitador de flanqueamento à esquerda :

Exemplo 389
a**"foo"** <p>a**"foo"**</p> É permitida uma forte ênfase no Intraword **:
Exemplo 390
foo**bar** <p>foo<strong>bar</strong></p> Artigo 6:
Exemplo 391
__foo bar__ <p><strong>foo bar</strong></p>

Essa não é uma ênfase forte, porque o delimitador de abertura é seguido pelo espaço em branco:

Exemplo 392
__ foo bar__ <p>__ foo bar__</p> Uma nova linha conta como espaço em branco:
Exemplo 393
__ foo bar__ <p>__ foo bar__</p>

Isso não é uma ênfase forte, porque a abertura __é precedida por um alfanumérico e seguida por pontuação:

Exemplo 394
a__"foo"__ <p>a__"foo"__</p> A ênfase forte do Intraword é proibida com __:
Exemplo 395
foo__bar__ <p>foo__bar__</p>
Exemplo 396
5__6__78 <p>5__6__78</p>
Exemplo 397
пристаням__стремятся__ <p>пристаням__стремятся__</p>
Exemplo 398
__foo, __bar__, baz__

<p><strong>foo, <strong>bar</strong>, baz</strong></p>

Essa é uma forte ênfase, mesmo que o delimitador de abertura seja do lado esquerdo e do lado direito, porque é precedido por pontuação:

Exemplo 399
foo-__(bar)__ <p>foo-<strong>(bar)</strong></p> Artigo 7:

Essa não é uma ênfase forte, porque o delimitador de fechamento é precedido por espaços em branco:

Exemplo 400
**foo bar ** <p>**foo bar **</p>

(Nem pode ser interpretado como enfatizado *foo bar *, por causa da Regra 11.)

Isso não é uma ênfase forte, porque o segundo **é precedido por pontuação e seguido por um alfanumérico:

Exemplo 401
**(**foo) <p>**(**foo)</p>

O ponto desta restrição é mais facilmente apreciado com estes exemplos:

Exemplo 402
*(**foo**)*

<p><em>(<strong>foo</strong>)</em></p>

Exemplo 403
**Gomphocarpus (*Gomphocarpus physocarpus*, syn. *Asclepias physocarpa*)**

<p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.

<em>Asclepias physocarpa</em>)</strong></p>

Exemplo 404
**foo "*bar*" foo**

<p><strong>foo "<em>bar</em>" foo</strong></p>

Ênfase Intraword:
Exemplo 405
**foo**bar <p><strong>foo</strong>bar</p> Artigo 8:

Essa não é uma ênfase forte, porque o delimitador de fechamento é precedido por espaços em branco:

Exemplo 406
__foo bar __ <p>__foo bar __</p>

Isso não é uma ênfase forte, porque o segundo __é precedido por pontuação e seguido por um alfanumérico:

Exemplo 407
__(__foo) <p>__(__foo)</p>

O ponto desta restrição é mais facilmente apreciado com este exemplo:

Exemplo 408
_(__foo__)_

<p><em>(<strong>foo</strong>)</em></p>

A ênfase forte do Intraword é proibida com __:
Exemplo 409
__foo__bar <p>__foo__bar</p>
Exemplo 410
__пристаням__стремятся <p>__пристаням__стремятся</p>
Exemplo 411
__foo__bar__baz__ <p><strong>foo__bar__baz</strong></p>

Essa é uma forte ênfase, mesmo que o delimitador de fechamento seja flanqueado à esquerda e à direita, porque é seguido por pontuação:

Exemplo 412
__(bar)__. <p><strong>(bar)</strong>.</p> Artigo 9:

Qualquer sequência não vazia de elementos embutidos pode ser o conteúdo de uma extensão enfatizada.

Exemplo 413
*foo [bar](/url)*

<p><em>foo <a href="/url">bar</a></em></p>

Exemplo 414
*foo bar* <p><em>foo bar</em></p>

Em particular, ênfase e forte ênfase podem ser aninhadas dentro da ênfase:

Exemplo 415
_foo __bar__ baz_

<p><em>foo <strong>bar</strong> baz</em></p>

Exemplo 416
_foo _bar_ baz_

<p><em>foo <em>bar</em> baz</em></p>

Exemplo 417
__foo_ bar_

<p><em><em>foo</em> bar</em></p>

Exemplo 418
*foo *bar**

<p><em>foo <em>bar</em></em></p>

Exemplo 419
*foo **bar** baz*

<p><em>foo <strong>bar</strong> baz</em></p>

Exemplo 420
*foo**bar**baz*

<p><em>foo<strong>bar</strong>baz</em></p>

Observe que, no caso anterior, a interpretação

<p><em>foo</em><em>bar<em></em>baz</em></p>

é impedido pela condição de que um delimitador que possa abrir e fechar (como o *depois foo) não possa dar ênfase se a soma dos comprimentos do delimitador executado contendo os delimitadores de abertura e fechamento for um múltiplo de 3, a menos que ambos os comprimentos sejam múltiplos de 3 .

Pelo mesmo motivo, não temos duas seções consecutivas de ênfase neste exemplo:

Exemplo 421
*foo**bar* <p><em>foo**bar</em></p>

A mesma condição garante que os seguintes casos sejam todos enfatizados com ênfase acentuada, mesmo quando os espaços interiores forem omitidos:

Exemplo 422
***foo** bar*

<p><em><strong>foo</strong> bar</em></p>

Exemplo 423
*foo **bar***

<p><em>foo <strong>bar</strong></em></p>

Exemplo 424
*foo**bar***

<p><em>foo<strong>bar</strong></em></p>

Quando os comprimentos do fecho e delimitadores de abertura interiores corridas são ambos múltiplos de 3, porém, eles podem combinar para criar ênfase:

Exemplo 425
foo***bar***baz

<p>foo<em><strong>bar</strong></em>baz</p>

Exemplo 426
foo******bar*********baz

<p>foo<strong><strong><strong>bar</strong></strong></strong>***baz</p>

Níveis indefinidos de aninhamento são possíveis:
Exemplo 427
*foo **bar *baz* bim** bop*

<p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p>

Exemplo 428
*foo [*bar*](/url)*

<p><em>foo <a href="/url"><em>bar</em></a></em></p>

Não pode haver ênfase vazia ou forte ênfase:
Exemplo 429
** is not an empty emphasis <p>** is not an empty emphasis</p>
Exemplo 430
**** is not an empty strong emphasis <p>**** is not an empty strong emphasis</p> Artigo 10:

Qualquer sequência não vazia de elementos embutidos pode ser o conteúdo de uma extensão fortemente enfatizada.

Exemplo 431
**foo [bar](/url)**

<p><strong>foo <a href="/url">bar</a></strong></p>

Exemplo 432
**foo bar** <p><strong>foo bar</strong></p>

Em particular, ênfase e forte ênfase podem ser aninhadas dentro de forte ênfase:

Exemplo 433
__foo _bar_ baz__

<p><strong>foo <em>bar</em> baz</strong></p>

Exemplo 434
__foo __bar__ baz__

<p><strong>foo <strong>bar</strong> baz</strong></p>

Exemplo 435
____foo__ bar__

<p><strong><strong>foo</strong> bar</strong></p>

Exemplo 436
**foo **bar****

<p><strong>foo <strong>bar</strong></strong></p>

Exemplo 437
**foo *bar* baz**

<p><strong>foo <em>bar</em> baz</strong></p>

Exemplo 438
**foo*bar*baz**

<p><strong>foo<em>bar</em>baz</strong></p>

Exemplo 439
***foo* bar**

<p><strong><em>foo</em> bar</strong></p>

Exemplo 440
**foo *bar***

<p><strong>foo <em>bar</em></strong></p>

Níveis indefinidos de aninhamento são possíveis:
Exemplo 441
**foo *bar **baz** bim* bop**

<p><strong>foo <em>bar <strong>baz</strong>

bim</em> bop</strong></p>
Exemplo 442
**foo [*bar*](/url)**

<p><strong>foo <a href="/url"><em>bar</em></a></strong></p>

Não pode haver ênfase vazia ou forte ênfase:
Exemplo 443
__ is not an empty emphasis <p>__ is not an empty emphasis</p>
Exemplo 444
____ is not an empty strong emphasis <p>____ is not an empty strong emphasis</p> Artigo 11:
Exemplo 445
foo *** <p>foo ***</p>
Exemplo 446
foo *\** <p>foo <em>*</em></p>
Exemplo 447
foo *_* <p>foo <em>_</em></p>
Exemplo 448
foo ***** <p>foo *****</p>
Exemplo 449
foo **\*** <p>foo <strong>*</strong></p>
Exemplo 450
foo **_** <p>foo <strong>_</strong></p>

Observe que quando os delimitadores não coincidem uniformemente, a Regra 11 determina que o excesso de *caracteres literais aparecerá fora da ênfase, e não dentro dela:

Exemplo 451
**foo* <p>*<em>foo</em></p>
Exemplo 452
*foo** <p><em>foo</em>*</p>
Exemplo 453
***foo** <p>*<strong>foo</strong></p>
Exemplo 454
****foo* <p>***<em>foo</em></p>
Exemplo 455
**foo*** <p><strong>foo</strong>*</p>
Exemplo 456
*foo**** <p><em>foo</em>***</p> Artigo 12:
Exemplo 457
foo ___ <p>foo ___</p>
Exemplo 458
foo _\__ <p>foo <em>_</em></p>
Exemplo 459
foo _*_ <p>foo <em>*</em></p>
Exemplo 460
foo _____ <p>foo _____</p>
Exemplo 461
foo __\___ <p>foo <strong>_</strong></p>
Exemplo 462
foo __*__ <p>foo <strong>*</strong></p>
Exemplo 463
__foo_ <p>_<em>foo</em></p>

Observe que, quando os delimitadores não coincidem uniformemente, a Regra 12 determina que o excesso de _caracteres literais aparecerá fora da ênfase, e não dentro dela:

Exemplo 464
_foo__ <p><em>foo</em>_</p>
Exemplo 465
___foo__ <p>_<strong>foo</strong></p>
Exemplo 466
____foo_ <p>___<em>foo</em></p>
Exemplo 467
__foo___ <p><strong>foo</strong>_</p>
Exemplo 468
_foo____ <p><em>foo</em>___</p>

A regra 13 implica que se você deseja que a ênfase seja aninhada diretamente dentro da ênfase, você deve usar diferentes delimitadores:

Exemplo 469
**foo** <p><strong>foo</strong></p>
Exemplo 470
*_foo_* <p><em><em>foo</em></em></p>
Exemplo 471
__foo__ <p><strong>foo</strong></p>
Exemplo 472
_*foo*_ <p><em><em>foo</em></em></p>

No entanto, é possível enfatizar fortemente sem enfatizar os delimitadores:

Exemplo 473
****foo****

<p><strong><strong>foo</strong></strong></p>

Exemplo 474
____foo____

<p><strong><strong>foo</strong></strong></p>

A regra 13 pode ser aplicada a sequências arbitrariamente longas de delimitadores:

Exemplo 475
******foo******

<p><strong><strong><strong>foo</strong></strong></strong></p>

Artigo 14:
Exemplo 476
***foo***

<p><em><strong>foo</strong></em></p>

Exemplo 477
_____foo_____

<p><em><strong><strong>foo</strong></strong></em></p>

Artigo 15:
Exemplo 478
*foo _bar* baz_ <p><em>foo _bar</em> baz_</p>
Exemplo 479
*foo __bar *baz bim__ bam*

<p><em>foo <strong>bar *baz bim</strong> bam</em></p>

Artigo 16:
Exemplo 480
**foo **bar baz** <p>**foo <strong>bar baz</strong></p>
Exemplo 481
*foo *bar baz* <p>*foo <em>bar baz</em></p> Artigo 17:
Exemplo 482
*[bar*](/url) <p>*<a href="/url">bar*</a></p>
Exemplo 483
_foo [bar_](/url) <p>_foo <a href="/url">bar_</a></p>
Exemplo 484
*<img src="foo" title="*"/> <p>*<img src="foo" title="*"/></p>
Exemplo 485
**<a href="**"> <p>**<a href="**"></p>
Exemplo 486
__<a href="__"> <p>__<a href="__"></p>
Exemplo 487
*a `*`*

<p><em>a <code>*</code></em></p>

Exemplo 488
_a `_`_

<p><em>a <code>_</code></em></p>

Exemplo 489
**a

<p>**a<a href="http://foo.bar/?q=**">http://foo.bar/?q=**&lt;/a&gt;&lt;/p&gt;</p>

Exemplo 490
__a

<p>__a<a href="http://foo.bar/?q=__">http://foo.bar/?q=__&lt;/a&gt;&lt;/p&gt;</p>

Tachado (extensão)

O GFM permite que o strikethrough extensão, onde um tipo de ênfase adicional está disponível.

Texto tachado é qualquer texto agrupado em dois níveis (~).
Exemplo 491
~~Hi~~ Hello, world! <p><del>Hi</del> Hello, world!</p>

Assim como acontece com os delimitadores de ênfase regulares, um novo parágrafo fará com que a análise de tacadas pare:

Exemplo 492
This ~~has a new paragraph~~. <p>This ~~has a</p> <p>new paragraph~~.</p>

Links

Um link contém texto do link (o texto visível), um destino do link (o URI que é o destino do link) e, opcionalmente, um título do link . Existem dois tipos básicos de links no Markdown. Nos links embutidos, o destino e o título são fornecidos imediatamente após o texto do link. Nos links de referência, o destino e o título são definidos em outras partes do documento.

Um texto de link consiste em uma sequência de zero ou mais elementos embutidos entre colchetes ([e ]). As seguintes regras se aplicam:

Links may not contain other links, at any level of nesting. If multiple otherwise valid link definitions appear nested inside each other, the inner-most definition is used.

Brackets are allowed in the link text only if (a) they are backslash-escaped or (b) they appear as a matched pair of brackets, with an open bracket [, a sequence of zero or more inlines, and a close bracket ].

crase code spans, autolinks, and raw HTML tags bind more tightly than the brackets in link text. Thus, for example, [foo`]` could not be a link text, since the second ] is part of a code span.

The brackets in link text bind more tightly than markers for emphasis and strong emphasis. Thus, for example, *[foo*](url) is a link.

A link destination consists of either

a sequence of zero or more characters between an opening < and a closing > that contains no line breaks or unescaped < or > characters, or

a nonempty sequence of characters that does not start with <, does not include ASCII space or control characters, and includes parentheses only if (a) they are backslash-escaped or (b) they are part of a balanced pair of unescaped parentheses. (Implementations may impose limits on parentheses nesting to avoid performance issues, but at least three levels of nesting should be supported.)

A link title consists of either

a sequence of zero or more characters between straight double-quote characters ("), including a " character only if it is backslash-escaped, or

a sequence of zero or more characters between straight single-quote characters ('), including a ' character only if it is backslash-escaped, or

a sequence of zero or more characters between matching parentheses ((...)), including a (or ) character only if it is backslash-escaped.

Although link titles may span multiple lines, they may not contain a blank line.

An inline link consists of a link text followed immediately by a left parenthesis (, optional whitespace, an optional link destination, an optional link title separated from the link destination by whitespace, optional whitespace, and a right parenthesis ). The link’s text consists of the inlines contained in the link text (excluding the enclosing square brackets). The link’s URI consists of the link destination, excluding enclosing <...> if present, with backslash-escapes in effect as described above. The link’s title consists of the link title, excluding its enclosing delimiters, with backslash-escapes in effect as described above.

Aqui está um link embutido simples:
Exemplo 493
[link](/uri "title") <p><a href="/uri" title="title">link</a></p> O título pode ser omitido:
Exemplo 494
[link](/uri) <p><a href="/uri">link</a></p> O título e o destino podem ser omitidos:
Exemplo 495
[link]() <p><a href="">link</a></p>
Exemplo 496
[link](<>) <p><a href="">link</a></p>

O destino só pode conter espaços se estiver entre colchetes pontudos:

Exemplo 497
[link](/my uri) <p>[link](/my uri)</p>
Exemplo 498
[link]() <p><a href="/my%20uri">link</a></p>

O destino não pode conter quebras de linha, mesmo se estiver entre colchetes pontudos:

Exemplo 499
[link](foo bar) <p>[link](foo bar)</p>
Exemplo 500
[link]() <p>[link]()</p> O destino pode conter )se estiver entre colchetes pontudos:
Exemplo 501
[a](<b)c>) <p><a href="b)c">a</a></p>

Os colchetes pontudos que envolvem links devem ter um escape sem escape:

Exemplo 502
[link](<foo\>) <p>[link](<foo>)</p>

Esses não são links, porque o colchete pontudo de abertura não corresponde adequadamente:

Exemplo 503
[a](Exemplo 504 [link](\(foo\)) <p><a href="(foo)">link</a></p>

Qualquer número de parênteses é permitido sem escapar, desde que equilibrados:

Exemplo 505
[link](foo(and(bar))) <p><a href="foo(and(bar))">link</a></p>

No entanto, se você tiver parênteses desequilibrados, precisará escapar ou usar o <...>formulário:

Exemplo 506
[link](foo\(and\(bar\)) <p><a href="foo(and(bar)">link</a></p>
Exemplo 507
[link](<foo(and(bar)>) <p><a href="foo(and(bar)">link</a></p>

Parênteses e outros símbolos também podem ser escapados, como de costume em Markdown:

Exemplo 508
[link](foo\)\:) <p><a href="foo):">link</a></p> Um link pode conter identificadores e consultas de fragmento:
Exemplo 509
[link](#fragment) [link](http://example.com#fragment) [link](http://example.com?foo=3#frag) <p><a href="#fragment">link</a></p>

<p><a href="http://example.com#fragment">link&lt;/a&gt;&lt;/p&gt;</p>

<p><a href="http://example.com?foo=3#frag">link&lt;/a&gt;&lt;/p&gt;</p>

Observe que uma barra invertida antes de um caractere não escapável é apenas uma barra invertida:

Exemplo 510
[link](foo\bar) <p><a href="foo%5Cbar">link</a></p>

O escape de URL deve ser deixado sozinho dentro do destino, pois todos os caracteres de escape de URL também são caracteres de URL válidos. As referências de entidade e caracteres numéricos no destino serão analisadas nos pontos de código Unicode correspondentes, como de costume. Eles podem opcionalmente ter escape de URL quando gravados como HTML, mas essa especificação não impõe nenhuma política específica para renderizar URLs em HTML ou outros formatos. Os renderizadores podem tomar decisões diferentes sobre como escapar ou normalizar os URLs na saída.

Exemplo 511
[link](foo%20bä) <p><a href="foo%20b%C3%A4">link</a></p>

Observe que, como os títulos geralmente podem ser analisados ​​como destinos, se você tentar omitir o destino e manter o título, obterá resultados inesperados:

Exemplo 512
[link]("title") <p><a href="%22title%22">link</a></p>

Os títulos podem estar entre aspas simples, aspas duplas ou parênteses:

Exemplo 513
[link](/url "title") [link](/url 'title') [link](/url (title)) <p><a href="/url" title="title">link</a> <a href="/url" title="title">link</a> <a href="/url" title="title">link</a></p>

Escapes de barra invertida e referências de entidade e caracteres numéricos podem ser usadas nos títulos:

Exemplo 514
[link](/url "title \""")

<p><a href="/url" title="title &quot;&quot;">link&lt;/a&gt;&lt;/p&gt;</p>

Os títulos devem ser separados do link usando um espaço em branco . Outros espaços em branco Unicode, como espaço sem quebra, não funcionam.

Exemplo 515
[link](/url "title")

<p><a href="/url%C2%A0%22title%22">link&lt;/a&gt;&lt;/p&gt;</p> Citações equilibradas aninhadas não são permitidas sem escapar:

Exemplo 516
[link](/url "title "and" title")

<p>[link](/url "title "and" title")</p>

Mas é fácil contornar isso usando um tipo de cotação diferente:
Exemplo 517
[link](/url 'title "and" title')

<p><a href="/url" title="title &quot;and&quot; title">link&lt;/a&gt;&lt;/p&gt;</p>

(Nota: Markdown.plpermitia aspas duplas dentro de um título com aspas duplas, e sua suíte de testes incluía um teste demonstrando isso. Mas é difícil ver uma boa justificativa para a complexidade extra que isso traz, pois já existem muitas maneiras: escapar a barra invertida, referências de entidade e caracteres numéricos, ou usar um tipo de cotação diferente para o título em anexo - para escrever títulos que contenham aspas duplas. Markdown.plA manipulação de títulos possui vários outros recursos estranhos. Por exemplo, permite títulos com aspas simples em links embutidos, mas não nos links de referência, e nos links de referência, mas não nos links embutidos, permite que um título comece "e termine com) . Markdown.pl1.0.1 até permite títulos sem aspas finais, embora 1.0.2b8 não. Parece preferível adotar uma regra simples e racional que funcione da mesma maneira nos links embutidos e nas definições de referência de link.)

Espaço em branco é permitido em torno do destino e do título:
Exemplo 518
[link]( /uri "title" ) <p><a href="/uri" title="title">link</a></p>

Mas não é permitido entre o texto do link e os seguintes parênteses:

Exemplo 519
[link] (/uri) <p>[link] (/uri)</p>

O texto do link pode conter colchetes balanceados, mas não desbalanceados, a menos que sejam escapados:

Exemplo 520
[link [foo [bar]]](/uri) <p><a href="/uri">link [foo [bar]]</a></p>
Exemplo 521
[link] bar](/uri) <p>[link] bar](/uri)</p>
Exemplo 522
[link [bar](/uri) <p>[link <a href="/uri">bar</a></p>
Exemplo 523
[link \[bar](/uri) <p><a href="/uri">link [bar</a></p> O texto do link pode conter conteúdo embutido:
Exemplo 524
[link *foo **bar** `#`*](/uri)

<p><a href="/uri">link &lt;em&gt;foo &lt;strong&gt;bar&lt;/strong&gt; &lt;code&gt;#&lt;/code&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;</p>

Exemplo 525
[![moon](moon.jpg)](/uri)

<p><a href="/uri"><img src="moon.jpg" alt="moon" />&lt;/a&gt;&lt;/p&gt;</p>

No entanto, os links não podem conter outros links, em nenhum nível de aninhamento.

Exemplo 526
[foo [bar](/uri)](/uri) <p>[foo <a href="/uri">bar</a>](/uri)</p>
Exemplo 527
[foo *[bar [baz](/uri)](/uri)*](/uri)

<p>[foo <em>[bar <a href="/uri">baz&lt;/a&gt;](/uri)&lt;/em&gt;](/uri)&lt;/p&gt;</p>

Exemplo 528
![[[foo](uri1)](uri2)](uri3) <p><img src="uri3" alt="[foo](uri2)" /></p>

Esses casos ilustram a precedência do agrupamento de texto do link sobre o agrupamento de ênfase:

Exemplo 529
*[foo*](/uri) <p>*<a href="/uri">foo*</a></p>
Exemplo 530
[foo *bar](baz*) <p><a href="baz*">foo *bar</a></p>

Observe que os colchetes que não fazem parte dos links não têm precedência:

Exemplo 531
*foo [bar* baz] <p><em>foo [bar</em> baz]</p>

Esses casos ilustram a precedência de tags HTML, extensões de código e links automáticos sobre o agrupamento de links:

Exemplo 532
[foo <bar attr="](baz)"> <p>[foo <bar attr="](baz)"></p>
Exemplo 533
[foo`](/uri)` <p>[foo<code>](/uri)</code></p>
Exemplo 534
[foo

<p>[foo<a href="http://example.com/?search=%5D(uri)">http://example.com/?search=](uri)&lt;/a&gt;&lt;/p&gt;</p>

Existem três tipos de links de referência : completo , recolhido e atalho .

Um link de referência completo consiste em um texto de link imediatamente seguido por um rótulo de link que corresponde a uma definição de referência de link em outra parte do documento.

A link label begins with a left bracket ([) and ends with the first right bracket (]) that is not backslash-escaped. Between these brackets there must be at least one non-whitespace character. Unescaped square bracket characters are not allowed inside the opening and closing square brackets of link labels. A link label can have at most 999 characters inside the square brackets.

Um rótulo corresponde a outro apenas no caso de suas formas normalizadas serem iguais. Para normalizar um rótulo, tira fora da abertura e os suportes de fecho, realizar o processo de Unicode dobrar , tira de ataque e de fuga espaços em branco e colapso interno consecutivo espaço em branco para um único espaço. Se houver várias definições de links de referência correspondentes, será utilizada a que vier primeiro no documento. (É desejável nesses casos emitir um aviso.)

O URI e o título do link são fornecidos pela definição de referência de link correspondente .

Aqui está um exemplo simples:
Exemplo 535
[foo][bar] [bar]: /url "title" <p><a href="/url" title="title">foo</a></p>

As regras para o texto do link são as mesmas dos links embutidos . Portanto:

O texto do link pode conter colchetes balanceados, mas não desbalanceados, a menos que sejam escapados:

Exemplo 536
[link [foo [bar]]][ref] [ref]: /uri <p><a href="/uri">link [foo [bar]]</a></p>
Exemplo 537
[link \[bar][ref] [ref]: /uri <p><a href="/uri">link [bar</a></p> O texto do link pode conter conteúdo embutido:
Exemplo 538
[link *foo **bar** `#`*][ref] [ref]: /uri

<p><a href="/uri">link &lt;em&gt;foo &lt;strong&gt;bar&lt;/strong&gt; &lt;code&gt;#&lt;/code&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;</p>

Exemplo 539
[![moon](moon.jpg)][ref] [ref]: /uri

<p><a href="/uri"><img src="moon.jpg" alt="moon" />&lt;/a&gt;&lt;/p&gt;</p>

No entanto, os links não podem conter outros links, em nenhum nível de aninhamento.

Exemplo 540
[foo [bar](/uri)][ref] [ref]: /uri

<p>[foo <a href="/uri">bar&lt;/a&gt;]<a href="/uri">ref&lt;/a&gt;&lt;/p&gt;</p>

Exemplo 541
[foo *bar [baz][ref]*][ref] [ref]: /uri

<p>[foo <em>bar <a href="/uri">baz&lt;/a&gt;&lt;/em&gt;]<a href="/uri">ref&lt;/a&gt;&lt;/p&gt;</p>

(Nos exemplos acima, temos dois links de referência de atalho em vez de um link de referência completo .)

Os casos a seguir ilustram a precedência do agrupamento de texto do link sobre o agrupamento de ênfase:

Exemplo 542
*[foo*][ref] [ref]: /uri <p>*<a href="/uri">foo*</a></p>
Exemplo 543
[foo *bar][ref]* [ref]: /uri <p><a href="/uri">foo *bar</a>*</p>

Esses casos ilustram a precedência de tags HTML, extensões de código e links automáticos sobre o agrupamento de links:

Exemplo 544
[foo <bar attr="][ref]"> [ref]: /uri <p>[foo <bar attr="][ref]"></p>
Exemplo 545
[foo`][ref]` [ref]: /uri <p>[foo<code>][ref]</code></p>
Exemplo 546
[foo [ref]: /uri

<p>[foo<a href="http://example.com/?search=%5D%5Bref%5D">http://example.com/?search=][ref]&lt;/a&gt;&lt;/p&gt;</p> A correspondência não diferencia maiúsculas de minúsculas:

Exemplo 547
[foo][BaR] [bar]: /url "title" <p><a href="/url" title="title">foo</a></p> A dobra de caixa Unicode é usada:
Exemplo 548
[ẞ] [SS]: /url <p><a href="/url">ẞ</a></p>

O espaço em branco interno consecutivo é tratado como um espaço para fins de determinar a correspondência:

Exemplo 549
[Foo bar]: /url [Baz][Foo bar] <p><a href="/url">Baz</a></p>

Nenhum espaço em branco é permitido entre o texto do link e o rótulo do link :

Exemplo 550
[foo] [bar] [bar]: /url "title"

<p>[foo] <a href="/url" title="title">bar</a></p>

Exemplo 551
[foo] [bar] [bar]: /url "title" <p>[foo] <a href="/url" title="title">bar</a></p>

Esta é uma partida da descrição original da sintaxe Markdown de John Gruber, que permite explicitamente espaço em branco entre o texto do link e o rótulo do link. Traz links de referência alinhados com os links embutidos , que (de acordo com o Markdown original e essa especificação) não podem ter espaços em branco após o texto do link. Mais importante, evita a captura inadvertida de links de referência de atalhos consecutivos . Se um espaço em branco for permitido entre o texto do link e o rótulo do link, a seguir, teremos um único link de referência, não dois links de referência de atalho, conforme pretendido:

[foo] [bar] [foo]: /url1 [bar]: /url2

(Observe que os links de referência de atalho foram introduzidos pelo próprio Gruber em uma versão beta Markdown.pl, mas nunca incluídos na descrição oficial da sintaxe. Sem os links de referência de atalho, é inofensivo permitir espaço entre o texto do link e o rótulo do link; introduzido, é muito perigoso permitir isso, pois frequentemente leva a resultados não intencionais.)

Quando existem várias definições de referência de link correspondentes , a primeira é usada:

Exemplo 552
[foo]: /url1 [foo]: /url2 [bar][foo] <p><a href="/url1">bar</a></p>

Observe que a correspondência é realizada em seqüências de caracteres normalizadas, e não em conteúdo embutido analisado. Portanto, o seguinte não corresponde, mesmo que os rótulos definam conteúdo inline equivalente:

Exemplo 553
[bar][foo\!] [foo!]: /url <p>[bar][foo!]</p>

Os rótulos dos links não podem conter colchetes, a menos que tenham uma barra invertida:

Exemplo 554
[foo][ref[] [ref[]: /uri <p>[foo][ref[]</p> <p>[ref[]: /uri</p>
Exemplo 555
[foo][ref[bar]] [ref[bar]]: /uri <p>[foo][ref[bar]]</p> <p>[ref[bar]]: /uri</p>
Exemplo 556
[[[foo]]] [[[foo]]]: /url <p>[[[foo]]]</p> <p>[[[foo]]]: /url</p>
Exemplo 557
[foo][ref\[] [ref\[]: /uri <p><a href="/uri">foo</a></p> Observe que neste exemplo ]não há escape de barra invertida:
Exemplo 558
[bar\\]: /uri [bar\\] <p><a href="/uri">bar\</a></p>

Um rótulo de link deve conter pelo menos um caractere que não seja um espaço em branco :

Exemplo 559
[] []: /uri <p>[]</p> <p>[]: /uri</p>
Exemplo 560
[ ] [ ]: /uri <p>[ ]</p> <p>[ ]: /uri</p>

Um link de referência recolhido consiste em um rótulo de link que corresponde a uma definição de referência de link em outra parte do documento, seguida pela sequência []. O conteúdo do primeiro rótulo do link é analisado como linhas internas, que são usadas como texto do link. O URI e o título do link são fornecidos pela definição de link de referência correspondente. Assim, [foo][]é equivalente a [foo][foo].

Exemplo 561
[foo][] [foo]: /url "title" <p><a href="/url" title="title">foo</a></p>
Exemplo 562
[*foo* bar][] [*foo* bar]: /url "title"

<p><a href="/url" title="title"><em>foo</em> bar</a></p>

Os rótulos dos links não diferenciam maiúsculas de minúsculas:
Exemplo 563
[Foo][] [foo]: /url "title" <p><a href="/url" title="title">Foo</a></p>

Como nos links de referência completos, não é permitido espaço em branco entre os dois conjuntos de colchetes:

Exemplo 564
[foo] [] [foo]: /url "title" <p><a href="/url" title="title">foo</a> []</p>

Um link de referência de atalho consiste em um rótulo de link que corresponde a uma definição de referência de link em outra parte do documento e não é seguido por []um rótulo de link. O conteúdo do primeiro rótulo do link é analisado como linhas internas, que são usadas como texto do link. O URI e o título do link são fornecidos pela definição de referência de link correspondente. Assim, [foo]é equivalente a [foo][].

Exemplo 565
[foo] [foo]: /url "title" <p><a href="/url" title="title">foo</a></p>
Exemplo 566
[*foo* bar] [*foo* bar]: /url "title"

<p><a href="/url" title="title"><em>foo</em> bar</a></p>

Exemplo 567
[[*foo* bar]] [*foo* bar]: /url "title"

<p>[<a href="/url" title="title"><em>foo</em> bar</a>]</p>

Exemplo 568
[[bar [foo] [foo]: /url <p>[[bar <a href="/url">foo</a></p> Os rótulos dos links não diferenciam maiúsculas de minúsculas:
Exemplo 569
[Foo] [foo]: /url "title" <p><a href="/url" title="title">Foo</a></p> Um espaço após o texto do link deve ser preservado:
Exemplo 570
[foo] bar [foo]: /url <p><a href="/url">foo</a> bar</p>

Se você quiser apenas texto entre colchetes, poderá escapar da barra invertida com barra invertida para evitar links:

Exemplo 571
\[foo] [foo]: /url "title" <p>[foo]</p>

Observe que este é um link, porque um rótulo de link termina com o primeiro colchete de fechamento a seguir:

Exemplo 572
[foo*]: /url *[foo*] <p>*<a href="/url">foo*</a></p>

Referências completas e compactas têm precedência sobre referências de atalho:

Exemplo 573
[foo][bar] [foo]: /url1 [bar]: /url2 <p><a href="/url2">foo</a></p>
Exemplo 574
[foo][] [foo]: /url1 <p><a href="/url1">foo</a></p> Os links embutidos também têm precedência:
Exemplo 575
[foo]() [foo]: /url1 <p><a href="">foo</a></p>
Exemplo 576
[foo](not a link) [foo]: /url1 <p><a href="/url1">foo</a>(not a link)</p>

No caso a seguir [bar][baz]é analisado como uma referência, [foo] como texto normal:

Exemplo 577
[foo][bar][baz] [baz]: /url <p>[foo]<a href="/url">bar</a></p>

Aqui, porém, [foo][bar]é analisado como referência, pois [bar] é definido:

Exemplo 578
[foo][bar][baz] [baz]: /url1 [bar]: /url2

<p><a href="/url2">foo&lt;/a&gt;<a href="/url1">baz&lt;/a&gt;&lt;/p&gt;</p>

Aqui [foo]não é analisado como uma referência de atalho, porque é seguido por um rótulo de link (mesmo que[bar] não esteja definido):

Exemplo 579
[foo][bar][baz] [baz]: /url1 [foo]: /url2 <p>[foo]<a href="/url1">bar</a></p>

Imagens

A sintaxe para imagens é como a sintaxe para links, com uma diferença. Em vez do texto do link , temos uma descrição da imagem . As regras para isso são as mesmas do texto do link , exceto que (a) uma descrição da imagem começa com ![e não [(b) uma descrição da imagem pode conter links. Uma descrição de imagem possui elementos em linha como seu conteúdo. Quando uma imagem é renderizada em HTML, isso é usado como o altatributo da imagem .

Exemplo 580
![foo](/url "title") <p><img src="/url" alt="foo" title="title" /></p>
Exemplo 581
![foo *bar*] [foo *bar*]: train.jpg "train & tracks"

<p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" />&lt;/p&gt;</p>

Exemplo 582
![foo ![bar](/url)](/url2) <p><img src="/url2" alt="foo bar" /></p>
Exemplo 583
![foo [bar](/url)](/url2) <p><img src="/url2" alt="foo bar" /></p>

Though this spec is concerned with parsing, not rendering, it is recommended that in rendering to HTML, only the plain string content of the image description be used. Note that in the above example, the alt attribute’s value is foo bar, not foo [bar](/url) or foo <a href="/url">bar</a>. Only the plain string content is rendered, without formatting.

Example 584 ![foo *bar*][] [foo *bar*]: train.jpg "train & tracks"

<p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" />&lt;/p&gt;</p> Example 585 ![foo *bar*][foobar] [FOOBAR]: train.jpg "train & tracks"

<p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" />&lt;/p&gt;</p> Example 586 ![foo](train.jpg) <p><img src="train.jpg" alt="foo" /></p> Example 587 My ![foo bar](/path/to/train.jpg "title" )

<p>My <img src="/path/to/train.jpg" alt="foo bar" title="title" />&lt;/p&gt;</p> Example 588 ![foo](<url>) <p><img src="url" alt="foo" /></p> Example 589 ![](/url) <p><img src="/url" alt="" /></p> Reference-style: Example 590 ![foo][bar] [bar]: /url <p><img src="/url" alt="foo" /></p> Example 591 ![foo][bar] [BAR]: /url <p><img src="/url" alt="foo" /></p> Collapsed: Example 592 ![foo][] [foo]: /url "title" <p><img src="/url" alt="foo" title="title" /></p> Example 593 ![*foo* bar][] [*foo* bar]: /url "title"

<p><img src="/url" alt="foo bar" title="title" />&lt;/p&gt;</p> The labels are case-insensitive: Example 594 ![Foo][] [foo]: /url "title" <p><img src="/url" alt="Foo" title="title" /></p>

As with reference links, whitespace is not allowed between the two sets of brackets:

Example 595 ![foo] [] [foo]: /url "title" <p><img src="/url" alt="foo" title="title" /> []</p> Shortcut: Example 596 ![foo] [foo]: /url "title" <p><img src="/url" alt="foo" title="title" /></p> Example 597 ![*foo* bar] [*foo* bar]: /url "title"

<p><img src="/url" alt="foo bar" title="title" />&lt;/p&gt;</p> Note that link labels cannot contain unescaped brackets: Example 598 ![[foo]] [[foo]]: /url "title" <p>![[foo]]</p> <p>[[foo]]: /url "title"</p> The link labels are case-insensitive: Example 599 ![Foo] [foo]: /url "title" <p><img src="/url" alt="Foo" title="title" /></p>

Se você quiser apenas um literal !seguido de texto entre colchetes, poderá fazer uma barra invertida e escapar da abertura [:

Exemplo 600
!\[foo] [foo]: /url "title" <p>![foo]</p>

Se você deseja um link após um literal !, escape com barra invertida !:

Exemplo 601
\![foo] [foo]: /url "title" <p>!<a href="/url" title="title">foo</a></p>

Links automáticos

Os links automáticos são URIs e endereços de email absolutos dentro <e >. Eles são analisados ​​como links, com o URL ou endereço de email como o rótulo do link.</p>

Um link automático de URI consiste em <, seguido por um URI absoluto seguido por >. É analisado como um link para o URI, com o URI como rótulo do link.

Um URI absoluto , para esses fins, consiste em um esquema seguido por dois pontos (:) seguido por zero ou mais caracteres que não sejam caracteres de espaço em branco e controle ASCII <, e >. Se o URI incluir esses caracteres, eles deverão ser codificados em porcentagem (por exemplo, %20para um espaço).

Para os fins desta especificação, um esquema é qualquer sequência de 2 a 32 caracteres iniciada com uma letra ASCII e seguida por qualquer combinação de letras, dígitos ou símbolos ASCII ou mais (”+”), ponto final (”.”) Ou hífen (”-”).

Aqui estão alguns links automáticos válidos:
Exemplo 602

<p><a href="http://foo.bar.baz">http://foo.bar.baz&lt;/a&gt;&lt;/p&gt;</p>

Exemplo 603

<p><a href="http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean">http://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean&lt;/a&gt;&lt;/p&gt;</p>

Exemplo 604
<irc://foo.bar:2233/baz>

<p><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz&lt;/a&gt;&lt;/p&gt;</p> Letras maiúsculas também são boas:

Exemplo 605
<MAILTO:FOO@BAR.BAZ>

<p><a href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ&lt;/a&gt;&lt;/p&gt;</p>

Observe que muitas strings que contam como URIs absolutas for purposes of this spec are not valid URIs, because their schemes are not registered or because of other problems with their syntax:

Exemplo 606
<a+b+c:d> <p><a href="a+b+c:d">a+b+c:d</a></p>
Exemplo 607
<made-up-scheme://foo,bar>

<p><a href="made-up-scheme://foo,bar">made-up-scheme://foo,bar&lt;/a&gt;&lt;/p&gt;</p>

Exemplo 608
<p><a href="http://../">http://../</a></p>
Exemplo 609
<localhost:5001/foo>

<p><a href="localhost:5001/foo">localhost:5001/foo&lt;/a&gt;&lt;/p&gt;</p> Os espaços não são permitidos nas ligações automáticas:

Exemplo 610
<p><http://foo.bar/baz bim></p> As barras invertidas não funcionam dentro de links automáticos:
Exemplo 611

<p><a href="http://example.com/%5C%5B%5C">http://example.com/\[\&lt;/a&gt;&lt;/p&gt;</p>

Um link automático de email consiste em <, seguido por um endereço de email , seguido por>. The link’s label is the email address, and the URL is mailto: followed by the email address.

Um endereço de email , para esses propósitos, é qualquer coisa que corresponda ao regex não normativo da especificação HTML5 :

/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?

(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/ Exemplos de links automáticos de email:
Exemplo 612
<foo@bar.example.com>

<p><a href="mailto:foo@bar.example.com">foo@bar.example.com&lt;/a&gt;&lt;/p&gt;</p>

Exemplo 613
<foo+special@Bar.baz-bar0.com>

<p><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com&lt;/a&gt;&lt;/p&gt;</p>

As barras invertidas não funcionam dentro de links automáticos de e-mail:

Exemplo 614
<foo\+@bar.example.com> <p><foo+@bar.example.com></p> Estes não são links automáticos:
Exemplo 615
<> <p><></p>
Exemplo 616
< http://foo.bar > <p>< http://foo.bar ></p>
Exemplo 617
<m:abc> <p><m:abc></p>
Exemplo 618
<foo.bar.baz> <p><foo.bar.baz></p>
Exemplo 619
http://example.com <p>http://example.com</p>
Exemplo 620
foo@bar.example.com <p>foo@bar.example.com</p>

Autolinks (extension)

O GFM permite que o autolink extension, where autolinks will be recognised in a greater number of conditions.

Autolink s também pode ser construído sem exigir a utilização de <e para > delimitar eles, embora eles serão reconhecidos sob um menor conjunto de circunstâncias. Todas essas AutoLinks reconhecidas só pode vir no início de uma linha, depois de espaços em branco, ou qualquer um dos caracteres que delimitam *, _,~, and (.</p>

Um link automático www estendido será reconhecido quando o texto www.for encontrado, seguido por um domínio válido . Um domínio válido consiste em segmentos de caracteres alfanuméricos, sublinhados (_) e hífens (-) separados por pontos (.). Deve haver pelo menos um período e nenhum sublinhado pode estar presente nos dois últimos segmentos do domínio.

O esquema httpserá inserido automaticamente:
Exemplo 621
www.commonmark.org

<p><a href="http://www.commonmark.org">www.commonmark.org&lt;/a&gt;&lt;/p&gt;</p>

Após um domínio válido , zero ou mais <caracteres não espaciais podem seguir:</p>

Exemplo 622
Visit www.commonmark.org/help for more information.

<p>Visit <a href="http://www.commonmark.org/help">www.commonmark.org/help&lt;/a&gt; for more information.&lt;/p&gt;</p>

Em seguida, aplicamos a validação estendida do caminho de vínculo automático da seguinte maneira:

À direita de pontuação (especificamente, ?, !, ., ,, :, *, _, e ~parte) não serão consideradas da autolink, embora possam ser incluídos no interior do link:

Exemplo 623
Visit www.commonmark.org. Visit www.commonmark.org/a.b.

<p>Visit <a href="http://www.commonmark.org">www.commonmark.org&lt;/a&gt;.&lt;/p&gt;</p>

<p>Visit <a href="http://www.commonmark.org/a.b">www.commonmark.org/a.b&lt;/a&gt;.&lt;/p&gt;</p>

Quando um link automático termina ), examinamos o link automático inteiro para o número total de parênteses. Se houver um número maior de parênteses de fechamento do que os de abertura, não consideramos os parênteses finais incomparáveis ​​como parte do vínculo automático, para facilitar a inclusão de um vínculo automático dentro de um parêntese:

Exemplo 624
www.google.com/search?q=Markup+(business) www.google.com/search?q=Markup+(business))) (www.google.com/search?q=Markup+(business)) (www.google.com/search?q=Markup+(business)

<p><a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)&lt;/a&gt;&lt;/p&gt;</p>

<p><a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)&lt;/a&gt;))&lt;/p&gt;</p>

<p>(<a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)&lt;/a&gt;)&lt;/p&gt;</p>

<p>(<a href="http://www.google.com/search?q=Markup+(business)">www.google.com/search?q=Markup+(business)&lt;/a&gt;&lt;/p&gt;</p>

Essa verificação é feita apenas quando o link termina entre parênteses de fechamento ); portanto, se os únicos parênteses estiverem no interior do link automático, nenhuma regra especial será aplicada:

Exemplo 625
www.google.com/search?q=(business))+ok

<p><a href="http://www.google.com/search?q=(business))+ok">www.google.com/search?q=(business))+ok&lt;/a&gt;&lt;/p&gt;</p>

Se um link automático termina em ponto e vírgula (;), verificamos se ele parece com uma referência de entidade ; se o texto anterior for & seguido por um ou mais caracteres alfanuméricos. Nesse caso, é excluído do link automático:

Exemplo 626
www.google.com/search?q=commonmark&hl=en www.google.com/search?q=commonmark&hl;

<p><a href="http://www.google.com/search?q=commonmark&amp;hl=en">www.google.com/search?q=commonmark&amp;hl=en&lt;/a&gt;&lt;/p&gt;</p>

<p><a href="http://www.google.com/search?q=commonmark">www.google.com/search?q=commonmark&lt;/a&gt;&amp;hl;&lt;/p&gt;</p> < termina imediatamente um link automático. Example 627 www.commonmark.org/he<p><a href="http://www.commonmark.org/he">www.commonmark.org/he&lt;/a&gt;&lt;lp&lt;/p&gt;</p>

An extended url autolink will be recognised when one of the schemes http://, or https://, followed by a valid domain, then zero or more non-space non-< characters according to extended autolink path validation:

Example 628 http://commonmark.org (Visit https://encrypted.google.com/search?q=Markup+(business))

<p><a href="http://commonmark.org">http://commonmark.org&lt;/a&gt;&lt;/p&gt;</p>

<p>(Visit <a href="https://encrypted.google.com/search?q=Markup+(business)">https://encrypted.google.com/search?q=Markup+(business)&lt;/a&gt;)&lt;/p&gt;</p>

An extended email autolink will be recognised when an email address is recognised within any text node. Email addresses are recognised according to the following rules:

One ore more characters which are alphanumeric, or ., -, _, or +.

An @ symbol.

One or more characters which are alphanumeric, or - or _, separated by periods (.). There must be at least one period. The last character must not be one of - or _.

The scheme mailto: will automatically be added to the generated link:

Example 629 foo@bar.baz

<p><a href="mailto:foo@bar.baz">foo@bar.baz&lt;/a&gt;&lt;/p&gt;</p> + can occur before the @, but not after. Example 630

hello@mail+xyz.example isn't valid, but hello+xyz@mail.example is.

<p>hello@mail+xyz.example isn't valid, but <a href="mailto:hello+xyz@mail.example">hello+xyz@mail.example&lt;/a&gt; is.&lt;/p&gt;</p>

., -, and _ can occur on both sides of the @, but only . may occur at the end of the email address, in which case it will not be considered part of the address:

Example 631 a.b-c_d@a.b a.b-c_d@a.b. a.b-c_d@a.b- a.b-c_d@a.b_

<p><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b&lt;/a&gt;&lt;/p&gt;</p>

<p><a href="mailto:a.b-c_d@a.b">a.b-c_d@a.b&lt;/a&gt;.&lt;/p&gt;</p> <p>a.b-c_d@a.b-</p> <p>a.b-c_d@a.b_</p>

Raw HTML

Text between < and > that looks like an HTML tag is parsed as a raw HTML tag and will be rendered in HTML without escaping. Tag and attribute names are not limited to current HTML tags, so custom tags (and even, say, DocBook tags) may be used.

Here is the grammar for tags:

A tag name consists of an ASCII letter followed by zero or more ASCII letters, digits, or hyphens (-).

Um atributo consiste em espaço em branco , um nome de atributo e uma especificação de valor de atributo opcional .

Um nome de atributo consiste de uma carta ASCII, _ou :, seguido de zero ou mais letras ASCII, dígitos, _, ., :, ou -. (Nota: esta é a especificação XML restrita a ASCII. HTML5 é mais lento.)

Uma especificação de valor de atributo consiste em espaço em branco opcional , um =caractere, espaço em branco opcional e um valor de atributo .

Um valor de atributo consiste de um valor não indicada atributo , um valor único atributo-citado , ou um valor entre aspas atributo .

Um valor de atributo sem aspas é uma string não-vazia de caracteres não incluindo espaços em branco , ", ', =, <, >, ou `.

Um valor de atributo entre aspas simples consiste em 'zero ou mais caracteres não incluídos 'e uma final '.

Um valor de atributo entre aspas duplas consiste em "zero ou mais caracteres não incluídos "e uma final ".

Uma tag aberta consiste em um <caractere, um nome de tag , zero ou mais atributos , espaço em branco opcional , um / caractere opcional e um >caractere.</p>

Uma tag de fechamento consiste em uma string .

Um comentário HTML consiste em <!--+ texto + -->, onde o texto não começa com >ou ->, não termina com -, e não contém --. (Veja a especificação HTML5 .)

Uma instrução de processamento consiste na sequência <?, uma sequência de caracteres que não inclui a sequência ?>e a sequência ?>.

Uma declaração consiste na sequência <!, um nome que consiste em uma ou mais letras ASCII maiúsculas, espaço em branco , uma sequência de caracteres que não inclui o caractere >e o caractere >.

Uma seção CDATA consiste na sequência <![CDATA[, uma sequência de caracteres que não inclui a sequência ]]>e a sequência ]]>.

Uma tag HTML consiste em uma tag aberta , uma tag de fechamento , um comentário HTML , uma instrução de processamento , uma declaração ou uma seção CDATA .

Aqui estão algumas tags abertas simples:
Exemplo 632
<a><bab><c2c> <p><a><bab><c2c></p> Elementos vazios:
Exemplo 633
<a/><b2/> <p><a/><b2/></p> Espaço em branco é permitido:
Exemplo 634
<a /><b2 data="foo" > <p><a /><b2 data="foo" ></p> Com atributos:
Exemplo 635
<a foo="bar" bam = 'baz <em>"</em>' _boolean zoop:33=zoop:33 /> &lt;p&gt;<a foo="bar" bam = 'baz &lt;em&gt;"&lt;/em&gt;' _boolean zoop:33=zoop:33 />&lt;/p&gt; Nomes de tags personalizados podem ser usados:
Exemplo 636
Foo <responsive-image src="foo.jpg" /> <p>Foo <responsive-image src="foo.jpg" /></p> Nomes de tags ilegais, não analisados ​​como HTML:
Exemplo 637
<33> <__> <p><33> <__></p> Nomes de atributos ilegais:
Exemplo 638
<a h*#ref="hi"> <p><a h*#ref="hi"></p> Valores de atributos ilegais:
Exemplo 639
<a href="hi'> <a href=hi'> <p><a href="hi'> <a href=hi'></p> Espaço em branco ilegal :
Exemplo 640
< a>< foo><bar/ > <p>< a>< foo><bar/ > <foo bar=baz bim!bop /></p> Espaço em branco ausente :
Exemplo 641
<a href='bar'title=title> <p><a href='bar'title=title></p> Tags de fechamento:
Exemplo 642
</a>
<p></a>
</p> Atributos ilegais na tag de fechamento:
Exemplo 643
<p></a href="foo"></p> Comentários:
Exemplo 644
foo <!-- this is a comment - with hyphen --> <p>foo <!-- this is a comment - with hyphen --></p>
Exemplo 645
foo <!-- not a comment -- two hyphens -->

<p>foo <!-- not a comment -- two hyphens --></p>

Sem comentários:
Exemplo 646
foo <!--> foo --> foo <!-- foo---> <p>foo <!--> foo --></p> <p>foo <!-- foo---></p> Instruções de processamento:
Exemplo 647
foo <?php echo $a; ?> <p>foo <?php echo $a; ?></p> Declarações:
Exemplo 648
foo <!ELEMENT br EMPTY> <p>foo <!ELEMENT br EMPTY></p> Seções CDATA:
Exemplo 649
foo <![CDATA[>&<]]> <p>foo <![CDATA[>&<]]></p>

As referências de entidade e caracteres numéricos são preservadas nos atributos HTML:

Exemplo 650
foo <a href="&ouml;"> <p>foo <a href="&ouml;"></p> As escapes de barra invertida não funcionam nos atributos HTML:
Exemplo 651
foo <a href="\*"> <p>foo <a href="\*"></p>
Exemplo 652
<a href="\""> <p><a href="""></p>

HTML bruto não permitido (extensão)

O GFM habilita a tagfilterextensão, onde as seguintes tags HTML serão filtradas ao renderizar a saída HTML:

<title> <textarea> <style> <xmp> <iframe> <noembed> <noframes> <script> <plaintext>

A filtragem é feita substituindo o líder Todas as outras tags HTML são deixadas intocadas.

Exemplo 653
<strong> <title> <style> <em> <blockquote> <xmp> is disallowed. <XMP> is also disallowed. </blockquote>

<p><strong> <title> <style> <em></p>

<blockquote> <xmp> is disallowed. <XMP> is also disallowed. </blockquote>

Quebras de linha rígida

Uma quebra de linha (que não esteja em um intervalo de código ou em uma tag HTML) que é precedida por dois ou mais espaços e não ocorre no final de um bloco é analisada como uma quebra de linha rígida (renderizada em HTML como uma <br />tag):</p>

Exemplo 654
foo baz <p>foo<br /> baz</p>

Para uma alternativa mais visível, uma barra invertida antes do final da linha pode ser usada em vez de dois espaços:

Exemplo 655
foo\ baz <p>foo<br /> baz</p> Mais de dois espaços podem ser usados:
Exemplo 656
foo baz <p>foo<br /> baz</p> Os espaços à esquerda no início da próxima linha são ignorados:
Exemplo 657
foo bar <p>foo<br /> bar</p>
Exemplo 658
foo\ bar <p>foo<br /> bar</p>

Quebras de linha podem ocorrer dentro de ênfase, links e outras construções que permitem conteúdo embutido:

Exemplo 659
*foo bar* <p><em>foo<br /> bar</em></p>
Exemplo 660
*foo\ bar* <p><em>foo<br /> bar</em></p> Quebras de linha não ocorrem dentro dos intervalos de código
Exemplo 661
`code span` <p><code>code span</code></p>
Exemplo 662
`code\ span` <p><code>code\ span</code></p> ou tags HTML:
Exemplo 663
<a href="foo bar"> &lt;p&gt;<a href="foo bar">&lt;/p&gt;
Exemplo 664
<a href="foo\ bar"> &lt;p&gt;<a href="foo\ bar">&lt;/p&gt;

Quebras de linha rígidas são para separar o conteúdo embutido em um bloco. Nenhuma sintaxe para quebras de linha rígida funciona no final de um parágrafo ou outro elemento de bloco:

Exemplo 665
foo\ <p>foo\</p>
Exemplo 666
foo <p>foo</p>
Exemplo 667
### foo\ <h3>foo\</h3>
Exemplo 668
### foo <h3>foo</h3>

Quebras de linha suaves

Uma quebra de linha regular (não em um intervalo de código ou tag HTML) que não é precedida por dois ou mais espaços ou uma barra invertida é analisada como uma quebra suave . (Uma quebra suave pode ser renderizada em HTML como um final de linha ou como um espaço. O resultado será o mesmo nos navegadores. Nos exemplos aqui, um final de linha será usado.)

Exemplo 669
foo baz <p>foo baz</p>

Os espaços no final da linha e no início da próxima linha são removidos:

Exemplo 670
foo baz <p>foo baz</p>

Um analisador em conformidade pode renderizar uma quebra de linha flexível em HTML como uma quebra de linha ou como um espaço.

Um renderizador também pode fornecer uma opção para renderizar quebras de linha simples como quebras de linha rígida.

Conteúdo textual

Quaisquer caracteres que não possuam uma interpretação pelas regras acima serão analisados ​​como conteúdo textual simples.

Exemplo 671
hello $.;'there <p>hello $.;'there</p>
Exemplo 672
Foo χρῆν <p>Foo χρῆν</p> Os espaços internos são preservados literalmente:
Exemplo 673
Multiple spaces <p>Multiple spaces</p> Apêndice: Uma estratégia de análise

Neste apêndice, descrevemos alguns recursos da estratégia de análise usada nas implementações de referência do CommonMark.

Visão geral A análise tem duas fases:

Na primeira fase, as linhas de entrada são consumidas e a estrutura de blocos do documento - sua divisão em parágrafos, aspas, itens de lista e assim por diante - é construída. O texto é atribuído a esses blocos, mas não é analisado. As definições de referência de link são analisadas e um mapa de links é construído.

Na segunda fase, o conteúdo do texto bruto de parágrafos e cabeçalhos é analisado em seqüências de elementos embutidos do Markdown (cadeias de caracteres, intervalos de código, links, ênfase etc.), usando o mapa de referências de links construídas na fase 1.

Em cada ponto do processamento, o documento é representado como uma árvore de blocos . A raiz da árvore é um documentbloco. O document pode ter qualquer número de outros blocos quando crianças . Essas crianças podem, por sua vez, ter outros bloqueios quando crianças. O último filho de um bloco é normalmente considerado aberto , o que significa que linhas de entrada subsequentes podem alterar seu conteúdo. (Os blocos que não estão abertos estão fechados .) Aqui, por exemplo, é uma possível árvore de documentos, com os blocos abertos marcados pelas setas:

-> document -> block_quote paragraph "Lorem ipsum dolor\nsit amet." -> list (type=bullet tight=true bullet_char=-) list_item paragraph "Qui *quodsi iracundia*" -> list_item -> paragraph "aliquando id" Fase 1: estrutura do bloco

Cada linha que é processada afeta esta árvore. A linha é analisada e, dependendo do seu conteúdo, o documento pode ser alterado de uma ou mais das seguintes maneiras:

Um ou mais blocos abertos podem ser fechados.

Um ou mais novos blocos podem ser criados como filhos do último bloco aberto.

O texto pode ser adicionado ao último bloco aberto (mais profundo) restante na árvore.

Depois que uma linha é incorporada à árvore dessa maneira, ela pode ser descartada, para que a entrada possa ser lida em um fluxo.

Para cada linha, seguimos este procedimento:

Primeiro, iteramos pelos blocos abertos, começando pelo documento raiz e descendo pelos últimos filhos até o último bloco aberto. Cada bloco impõe uma condição que a linha deve satisfazer para que o bloco permaneça aberto. Por exemplo, um bloco de citação requer um >caractere. Um parágrafo requer uma linha que não esteja em branco. Nesta fase, podemos combinar todos ou apenas alguns dos blocos abertos. Mas ainda não podemos fechar blocos incomparáveis, porque podemos ter uma linha de continuação lenta .

Em seguida, após consumir os marcadores de continuação dos blocos existentes, procuramos novas partidas de bloco (por exemplo, > um bloco de citação). Se encontrarmos um novo início de bloco, fechamos todos os blocos sem correspondência na etapa 1 antes de criar o novo bloco como filho do último bloco correspondente.

Finalmente, examinamos o restante da linha (depois que os marcadores de bloco como >, marcadores de lista e recuo foram consumidos). Este é o texto que pode ser incorporado no último bloco aberto (um parágrafo, bloco de código, cabeçalho ou HTML bruto).

Os títulos do setext são formados quando vemos uma linha de um parágrafo que é um sublinhado do título do setext .

As definições do link de referência são detectadas quando um parágrafo é fechado; as linhas de texto acumuladas são analisadas para ver se começam com uma ou mais definições de link de referência. Qualquer restante se torna um parágrafo normal.

Podemos ver como isso funciona, considerando como a árvore acima é gerada por quatro linhas de Markdown:

> Lorem ipsum dolor sit amet. > - Qui *quodsi iracundia* > - aliquando id No início, nosso modelo de documento é apenas -> document A primeira linha do nosso texto, > Lorem ipsum dolor

faz com que um block_quotebloco seja criado como filho do nosso documentbloco aberto e um paragraphbloco como filho do block_quote. Em seguida, o texto é adicionado ao último bloco aberto, o paragraph:

-> document -> block_quote -> paragraph "Lorem ipsum dolor" A próxima linha, sit amet.

é uma "continuação preguiçosa" do aberto paragraph, portanto é adicionada ao texto do parágrafo:

-> document -> block_quote -> paragraph "Lorem ipsum dolor\nsit amet." A terceira linha > - Qui *quodsi iracundia*

faz com que o paragraphbloco seja fechado e um novo listbloco é aberto como filho do block_quote. UMAlist_item também é adicionado como filho do list, e a paragraphcomo filho do list_item. O texto é então adicionado ao novo paragraph:

-> document -> block_quote paragraph "Lorem ipsum dolor\nsit amet." -> list (type=bullet tight=true bullet_char=-) -> list_item -> paragraph "Qui *quodsi iracundia*" A quarta linha, > - aliquando id

faz com que o list_item(e seu filho o paragraph) seja fechado, e um novo se list_itemabra como filho dolist . A paragraph é adicionado como filho do novo list_item, para conter o texto. Obtemos assim a árvore final:

-> document -> block_quote paragraph "Lorem ipsum dolor\nsit amet." -> list (type=bullet tight=true bullet_char=-) list_item paragraph "Qui *quodsi iracundia*" -> list_item -> paragraph "aliquando id" Fase 2: estrutura em linha

Depois que toda a entrada foi analisada, todos os blocos abertos são fechados.

Em seguida, “andamos na árvore”, visitando todos os nós e analisamos o conteúdo bruto de parágrafos e cabeçalhos como linhas. Nesse ponto, vimos todas as definições de referência de link, para que possamos resolver os links de referência à medida que avançamos.

document block_quote paragraph str "Lorem ipsum dolor" softbreak str "sit amet." list (type=bullet tight=true bullet_char=-) list_item paragraph str "Qui " emph str "quodsi iracundia" list_item paragraph str "aliquando id"

Observe como a linha termina no primeiro parágrafo foi analisada como a softbreake os asteriscos no primeiro item da lista se tornaram umemph .

Um algoritmo para analisar ênfase e links aninhados

De longe, a parte mais complicada da análise em linha é lidar com ênfase, ênfase forte, links e imagens. Isso é feito usando o seguinte algoritmo.

Quando estamos analisando inlines e atingimos uma corrida de *ou_ caracteres, ou um [ou![

inserimos um nó de texto com esses símbolos como conteúdo literal e adicionamos um ponteiro a esse nó de texto na pilha delimitadora .

A pilha delimitadora é uma lista duplamente vinculada. Cada elemento contém um ponteiro para um nó de texto, além de informações sobre

o tipo de delimitador ([, ![, *, _) o número de delimitadores,

se o delimitador está "ativo" (todos estão ativos para iniciar) e

se o delimitador é um potencial abridor, um potencial mais próximo ou ambos (o que depende de que tipo de caracteres precede e segue os delimitadores).

Quando atingimos um ]personagem, chamamos o procedimento de procurar link ou imagem (veja abaixo).

Quando atingimos o final da entrada, chamamos o procedimento de ênfase do processo (veja abaixo), com stack_bottom= NULL.

procure link ou imagem

Começando no topo da pilha delimitadora, olhamos para trás na pilha em busca de uma abertura [ou ![delimitador.

Se não encontrarmos um, retornamos um nó de texto literal ].

Se encontrarmos um, mas ele não estiver ativo , removeremos o delimitador inativo da pilha e retornaremos um nó de texto literal ].

Se encontrarmos um e ele estiver ativo, analisaremos adiante para ver se temos um link / imagem inline, link / imagem de referência, link / imagem de referência compacta ou link / imagem de atalho / imagem.

Caso contrário, removeremos o delimitador de abertura da pilha de delimitadores e retornaremos um nó de texto literal ].

Se o fizermos, então

Retornamos um link ou nó de imagem cujos filhos são as linhas internas após o nó de texto apontado pelo delimitador de abertura.

Corremos ênfase processo nesses inlines, com o [abridor como stack_bottom.

Nós removemos o delimitador de abertura.

Se tivermos um link (e não uma imagem), também definiremos todos os [delimitadores antes do delimitador de abertura como inativos . (Isso nos impedirá de obter links dentro de links.)

ênfase no processo

O parâmetro stack_bottomdefine um limite inferior para a distância que descemos na pilha de delimitadores . Se for NULL, podemos ir até o fim. Caso contrário, paramos antes de visitar stack_bottom.

Vamos current_positionapontar para o elemento na pilha delimitadora logo acima stack_bottom(ou o primeiro elemento se stack_bottom for NULL).

Nós controlamos o valor openers_bottomde cada tipo de delimitador (*, _) e cada comprimento da execução do delimitador de fechamento (módulo 3). Inicialize isso para stack_bottom.

Em seguida, repetimos o seguinte até ficar sem potencial de fechamento:

Mover current_positionpara a frente na pilha delimitador (se necessário) até encontrar o primeiro potencial mais estreita com delimitador *ou _. (Esse será o potencial mais próximo do início da entrada - o primeiro em ordem de análise.)

Agora, olhe para trás na pilha (permanecendo acima stack_bottome openers_bottompara esse tipo de delimitador) para o primeiro abridor de potencial correspondente ("correspondente" significa o mesmo delimitador).

Se um for encontrado:

Descobrir se temos ênfase ou ênfase forte: se vãos mais próximos e mais abertos tiverem comprimento> = 2, teremos forte, caso contrário, regular.

Insira um nó emph ou forte emph adequadamente, após o nó de texto correspondente ao abridor.

Remova quaisquer delimitadores entre o abridor e o mais próximo da pilha de delimitadores.

Remova os delimitadores 1 (para emph regular) ou 2 (para emph forte) dos nós de texto de abertura e fechamento. Se ficarem vazios como resultado, remova-os e remova o elemento correspondente da pilha delimitadora. Se o nó de fechamento for removido, redefina current_positionpara o próximo elemento na pilha.

Se nenhum for encontrado:

Defina openers_bottompara o elemento antes current_position. (Sabemos que não há abridores para esse tipo de aproximação e inclusão deste ponto, portanto, isso coloca um limite menor em pesquisas futuras.)

Se o mais próximo current_positionnão for um abridor em potencial, remova-o da pilha delimitadora (pois sabemos que ele também não pode estar mais perto).

Avance current_positionpara o próximo elemento na pilha.

Depois que terminamos, removemos todos os delimitadores acima stack_bottomda pilha de delimitadores.