Links Markdown não interpretam parênteses em URLs corretamente

Continuando a discussão de URLs entre parênteses não se transformam em links:

Seção 2.3 da RFC2396 afirma que:

Caracteres não reservados podem ser escapados sem alterar a semântica da URI, mas isso não deve ser feito a menos que a URI esteja sendo usada em um contexto que não permite que o caractere não escapado apareça.

Parênteses são tais caracteres. Quando coladas no Discourse, URLs que usam esses caracteres, por exemplo, em cadeias de consulta para pesquisa avançada em certos contextos, são mal interpretadas como parte da sintaxe de URL do Markdown e renderizadas inutilizáveis.

Por exemplo, esta URL recuperaria uma lista de livros legalmente depositados publicados por minha associação:

https://www.depotlegal.be/Depot/form.aspx?SC=KBRVITRINE1#/Search/(query:(AdvancedQuery:(queryGroups:!((queryClauses:!((index:KBR264b_idx,logical:0,operator:0,otherValue:!n,value:‘petites%20singularités’))

Embora funcione quando colada, como acima, quando usada como um link Markdown, ela não funciona mais:

[âncora](url) → [âncora](https://www.depotlegal.be/Depot/form.aspx?SC=KBRVITRINE1#/Search/(query:(AdvancedQuery:(queryGroups:!((queryClauses:!((index:KBR264b_idx,logical:0,operator:0,otherValue:!n,value:‘petites%20singularités’))

Além disso, quando tal URL é recebida por e-mail, o resultado é:

Recherche avancée - Depot)))),ForceSearch:!t,Grid:!n,Page:0,PageRange:3,QueryString:!n,ResultSize:-1,ScenarioCode:KBRVITRINE1,SearchContext:1))

onde “Recherche avancée - Depot” é o título do link corretamente interpretado (que é clicável), e o resto é lixo – e ausente do link clicável. (O e-mail está configurado para receber em HTML) A reconstrução do HTML não corrige o link.

Isso parece mais um problema com a URL e o commonmark. Se você equilibrar os parênteses de abertura e fechamento adicionando )))))) ao final, o link markdown é analisado corretamente.

link

[link](https://www.depotlegal.be/Depot/form.aspx?SC=KBRVITRINE1#/Search/(query:(AdvancedQuery:(queryGroups:!((queryClauses:!((index:KBR264b_idx,logical:0,operator:0,otherValue:!n,value:'petites%20singularit%C3%A9s'))))))))

Isso corresponde ao comportamento na Especificação CommonMark, que o motor markdown-it segue (usado pelo Discourse).

uma sequência não vazia de caracteres que não começa com <, não inclui caracteres de controle ASCII ou caracteres de espaço, e inclui parênteses apenas se (a) eles forem escapados com barra invertida ou (b) eles fizerem parte de um par balanceado de parênteses não escapados. (Implementações podem impor limites ao aninhamento de parênteses para evitar problemas de desempenho, mas pelo menos três níveis de aninhamento devem ser suportados.)

Isso também pode ser testado na demonstração do markdown-it.

3 curtidas

A especificação parece ser bastante clara, o usuário também pode escapar do parêntese desbalanceado

[link](https://www.depotlegal.be/Depot/form.aspx?SC=KBRVITRINE1#/Search/\\(query:\\(AdvancedQuery:\\(queryGroups:!\\(\\(queryClauses:!\\(\\(index:KBR264b_idx,logical:0,operator:0,otherValue:!n,value:'petites%20singularit%C3%A9s'\\))\n

torna-se

[link](Recherche avancée - Depot)\n

Como isso está funcionando conforme descrito na especificação, estou movendo para a discussão de Feature.

4 curtidas

Infelizmente, o balanceamento ou escape de parênteses não acontecerá na maioria das vezes :slight_smile:

Eu acho que há outro tópico de Bug sobre isso Ensure that links containing )) still render and work correctly

1 curtida