Компонент TOC и заголовки ID

Компонент TOC генерирует атрибуты id для элементов заголовков на основе текста заголовка.

Вот пример заголовка.

main outlet

Отступы определяются стилями, примененными к #main-outlet — это элемент приложения Discourse, не имеющий отношения к этому сообщению.

Это не конец света, если бы я мог указать альтернативный id для заголовка. Компонент TOC поддерживает это:

https://github.com/discourse/DiscoTOC/blob/master/common/header.html#L293

К сожалению, Discourse удаляет атрибуты id из элементов сообщений до выполнения вышеуказанного кода, поэтому логика не срабатывает.

Вот заголовок, использующий <h4 id="alt-main-outlet">main outlet</h4>:

main outlet

Обратите внимание, что он всё ещё использует main-outlet, а не alt-main-outlet.

Думаю, Discourse делает это в предвидении попыток взлома элементов страницы. Однако с компонентом TOC это довольно легко обойти.

Если существует решение этой проблемы или это уже хорошо обсуждаемая тема, которую я упустил, приношу извинения за следующие нежелательные мнения :slight_smile:


P.S.

Лично я считаю, что Discourse НЕ должен удалять атрибуты id у элементов. Это фундаментальная структура веб-страницы, которая используется для навигации по фрагментам URL. Если кто-то хочет создать ссылку на элемент в сообщении, я считаю, что это его право как автора.

Тот факт, что TOC открывает возможности для взлома ID, говорит о том, что само по себе удаление ID, возможно, можно отменить.

Если команда Discourse так обеспокоена захватом ID, то все ID в Discourse должны иметь префикс, например discourse-main-outlet, а удаление ID должно применяться только к этим префиксованным ID.

Я понимаю, что это невозможно из-за существующего кода!

Можно представить набор исключённых ID (например, main-outlet и т. д.), которые удаляются. Это всё ещё оставляет проблему обхода этой защиты через TOC, но хотя бы позволит авторам создавать полезные якоря.


P.P.S.

Прямо связано с этим проблема заголовков с одинаковым текстовым содержимым.

Тема один

Примеры

Тема два

Примеры

С TOC оба заголовка Примеры получают одинаковый ID, что, очевидно, является серьёзной ошибкой. TOC мог бы добавлять увеличивающиеся индексы (например, examples, examples-2 и т. д.) — и, вероятно, должен это делать по умолчанию, — но ещё лучше было бы решение проблемы, обсуждаемой выше, которое позволяет авторам самим решать, как описывать свой контент. Например, <h5 id="topic-one-examples">Примеры</h5> и т. д.

@Johani, что ты думаешь об этом?

Если вам нужно добавить заголовок, его префикс должен быть heading--. Дополнительную информацию об этом можно найти здесь: Linking to a heading within a post or topic

Идентификаторы, не имеющие такого префикса, будут удалены, независимо от их значения.

Заголовки с повторяющимся текстом в компоненте TOC в настоящее время не поддерживаются — и никогда не поддерживались. Компонент генерирует ID на основе текста заголовка. Таким образом, два заголовка с абсолютно одинаковым текстом получат один и тот же ID.

В данный момент нет планов исправлять это в компоненте, поскольку автоматическая генерация ID включена в список функций для следующего релиза Discourse, и мы планируем решить проблему дублирующихся заголовков, добавляя индекс заголовка к его ID.

Когда мы реализуем это в ядре, я думаю, что добавление префикса к генерируемым заголовкам должно быть достаточным.

Это имеет смысл. Спасибо за подробное объяснение!