Якоря не работают при использовании нелатинских символов в заголовках

Я полагаю, что столкнулся с потенциальной проблемой при использовании функции автоматически сгенерированного оглавления в DiscoTOC:

При использовании заголовков разных уровней на языках, отличных от английского, например на китайском, кажется, что data-d-toc идентификаторы в автоматически сгенерированном оглавлении захватывают только числовые цифры и английские буквы из заголовков. Такая ситуация может легко привести к созданию идентичных идентификаторов, что, в свою очередь, вызывает некорректные ссылки в правой полосе прокрутки.

На изображении выше, если порядковые номера в заголовках оба равны 5, результирующие data-d-toc идентификаторы будут оба toc-h2-5. Следовательно, это приведет к тому, что две различные ссылки будут ошибочно указывать на один и тот же раздел.

Однако, изменив порядковые номера на 1.5 и 2.5, data-d-toc идентификаторы станут различаться (toc-h2-15 и toc-h2-25), что эффективно обеспечит точные и корректные ссылки.

Чтобы обеспечить точную работу ссылок в полосе прокрутки, целесообразно ли использовать заголовки на английском языке?

Кроме того, для языков, таких как китайский, будет ли наиболее жизнеспособным решением включение многоуровневых порядковых номеров (например, 3.5, 3.6.5, 4.2.5.6) в заголовки?

Ссылка:

Я уже раньше обнаружил эту проблему и поднял её, заодно сделав форк.

https://meta.discourse.org/t/discotoc-automatic-table-of-contents/111143/399?u=lhc_fl

Хотя мой вариант работает, он не идеален, и я просто ленюсь дорабатывать код.

Очевидно, лучшее решение — использовать base64 для генерации data-d-toc и добавить уникальный идентификатор, чтобы избежать возможных дубликатов заголовков.

1 лайк

В данный момент у меня нет прав на внесение таких изменений в корпоративный форум, но я благодарен за ваш ответ!

Кроме того, хотел бы спросить: планируют ли официальные разработчики добавить поддержку других нелатинских языков для этой функции автоматически генерируемого оглавления в будущих версиях плагина DiscoTOC? @Lilly @awesomerobot

Ещё раз спасибо всем!

По правде говоря, они учли не латинские языки, используя метод slugify(h.textContent). Я подозреваю, что эта функция slugify была разработана в соответствии с методом генерации ссылок (slug generation method) форума. Когда он не находится в режиме ‘encode’, возникают проблемы, хотя я лично не проверял эту гипотезу.

В предыдущих случаях, когда мы использовали официальную версию компонента темы, метод генерации ссылок нашего форума был установлен в ‘none’, что приводило к аналогичным проблемам. Поэтому могу ли я предложить вам попробовать изменить настройку на ‘encode’?

Кроме того, учитывая скорость исправлений со стороны разработчиков… В соседнем компоненте проблема, которую я поднял в прошлом году, до сих пор без ответа. Я рекомендую вам запросить использование моей форк-версии.

1 лайк

Попытался изменить эту настройку, но описанные выше проблемы всё ещё сохраняются. ID data-d-toc считывает только цифры и буквы, и по-прежнему встречаются дубликаты идентификаторов оглавления. Кажется, дело не в этом?
Спрошу у своего руководителя, спасибо за ответ~

Обновление: сегодня я обновил код. Теперь суффикс генерируется по индексу:

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

const suffix = `${slugify(h.textContent)}-${post?.post_number}-${index}`;
1 лайк