Тэги `url` BBCode ломаются, если заключённый текст заканчивается URL с компонентом после хоста

Приоритет/Серьезность:

Средний

Платформа

ОС Браузер
Windows 11 Google Chrome 112.0.5615.138
Ubuntu 22.04 Google Chrome 112.0.5615.49
macOS Ventura Google Chrome 112.0.5615.137

(все настольные системы)

Описание:

При следующих условиях теги url BBCode отображаются в сообщениях некорректно:

  • Текст, заключенный в теги, заканчивается URL-адресом
  • Этот URL-адрес содержит компонент после компонента хоста (т. е. путь, запрос и/или фрагмент)

Шаги для воспроизведения:

Создайте сообщение, содержащее следующую разметку:

[url]http://example.com/[/url]

:bug: Разметка отображается не так, как ожидалось:

image

Ожидаемое поведение:

Разметка должна отображаться следующим образом:

image

Дополнительная информация

Мне удалось воспроизвести ошибку на try.discourse.org в «безопасном режиме».


Дополнительные примеры некорректной обработки текста, заканчивающегося URL-адресом с путем:

Разметка:

[url]http://example.com/foo[/url]
[url]http://example.com/foo/[/url]
[url=http://example.com/]http://example.com/[/url]
[url=http://example.com/]foo http://example.com/[/url]

Отображение:


Первоначально сообщено по адресу: Old url markup not migrated to new forum - Website and Forum - Arduino Forum

У нас есть множество сообщений, которые были написаны в то время, когда эта разметка отображалась корректно (до миграции с фреймворка SMF на Discourse).

3 лайка

Я подтвердил, что это основная ошибка, которую мы надеемся исправить в ближайшие несколько недель.

Конкретно:

[url]http://example.com[/url] работает, однако: [url]http://example.com/example[/url] не работает, если не добавить пробел в конце [url]http://example.com/example [/url].

Я начал анализировать код, и похоже, что наш парсер где-то спотыкается, возможно, из-за правила экранирования. Мы разберёмся с этим, спасибо, что подняли эту тему.

5 лайков

Я не очень хорошо знаком с этим кодом, но бегло просмотрел его. Думаю, это связано с системой автоматического создания ссылок. К моменту, когда парсер ищет закрывающий тег URL [/url], он уже включён в автоматическую ссылку.

Например, обратите внимание, что автоматическая ссылка здесь ведёт на http://example.com/foo%5B/url%5D:

http://example.com/foo

Именно поэтому добавление пробела помогает — оно предотвращает включение [/url] в автоматическую ссылку.

:thinking:

6 лайков

Я исправил это согласно:

Можете просмотреть и слить… это довольно сложное исправление, @per1234, так как мы поддерживаем такие странные вещи, как

[url][b]www.site.com[/b][/url]

5 лайков

Всё исправлено :confetti_ball:

[url]http://example.com/foo[/url]
[url]http://example.com/foo/[/url]
[url=http://example.com/]http://example.com/[/url]
[url=http://example.com/]foo http://example.com/[/url]

http://example.com/foo
http://example.com/foo/
http://example.com/
foo http://example.com/

@per1234, вы уже должны быть развернуты с исправлением. Дайте знать, если всё выглядит хорошо!

Спасибо за сообщение!

1 лайк

Большое спасибо за заслуженно быстрое решение, sam!

3 лайка

Эта тема была автоматически закрыта через 5 дней. Новые ответы больше не принимаются.