Компонент 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 это довольно легко обойти.
Если существует решение этой проблемы или это уже хорошо обсуждаемая тема, которую я упустил, приношу извинения за следующие нежелательные мнения ![]()
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> и т. д.