Ссылки Markdown некорректно интерпретируют скобки в URL

Продолжение обсуждения из URLs in parenthesis do not turn into links:

Раздел 2.3 RFC2396 гласит:

Нерезервированные символы могут быть экранированы без изменения семантики URI, однако этого не следует делать, если URI не используется в контексте, не допускающем появление неэкранированного символа.

К таким символам относятся круглые скобки. При вставке в Discourse URL-адреса, содержащие эти символы (например, в строках запроса для расширенного поиска в определённых контекстах), ошибочно интерпретируются как часть синтаксиса Markdown-ссылок и становятся неработоспособными.

Например, этот URL должен возвращать список депонированных книг, опубликованных моей ассоциацией:

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’)

Хотя при прямой вставке, как показано выше, ссылка работает, при использовании в виде Markdown-ссылки она перестает функционировать:

[anchor](url) → [anchor](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’))

Кроме того, когда такой URL приходит по электронной почте, результат выглядит так:

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

где «Recherche avancée - Depot» — это корректно интерпретированный заголовок ссылки (который кликабелен), а остальная часть — мусор, отсутствующий в кликабельной ссылке. (Почта настроена на получение в формате HTML). Повторная генерация HTML не исправляет ссылку.

Это выглядит как проблема, связанная с URL и CommonMark. Если вы сбалансируете открывающие и закрывающие скобки, добавив )))))) в конец, ссылка в формате Markdown будет правильно распарсена.

ссылка

[ссылка](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'))))))))

Это соответствует поведению, описанному в спецификации CommonMark, которой следует движок markdown-it (используемый в Discourse).

непустая последовательность символов, которая не начинается с <, не содержит символов управления ASCII или пробел, и включает скобки только в том случае, если (а) они экранированы обратным слэшем или (б) они являются частью сбалансированной пары неэкранированных скобок. (Реализации могут устанавливать ограничения на вложенность скобок для избежания проблем с производительностью, но должно поддерживаться как минимум три уровня вложенности.)

Это также можно проверить в демо-версии markdown-it.

3 лайка

Спецификация выглядит довольно ясной: пользователь также может экранировать несбалансированные скобки.

[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'\))

превращается в

link

Поскольку это работает так, как описано в спецификации, я перемещаю это в обсуждение #feature.

4 лайка

К сожалению, в большинстве случаев автоматическое добавление или экранирование скобок не будет работать :slight_smile:

Кажется, на эту тему уже есть отдельная тема с тегом #баг: Ensure that links containing )) still render and work correctly

1 лайк