Я создал закладку для генерации сворачиваемого оглавления (ToC), похожего на то, что показано выше.
Надеюсь, это поможет активным участникам сообщества, которые пишут длинные тексты!
Краткое описание
Иногда я пишу длинные темы/посты и мне нужно было оглавление для удобства чтения.
Я нашел несколько существующих решений, например DiscoTOC - automatic table of contents, но мне нужен был инструмент только для личного использования, без необходимости установки чего-либо для всего сообщества.
После публикации структурированного поста нажмите на закладку, и оглавление будет скопировано в буфер обмена. Отредактируйте пост и вставьте оглавление в начало!
Как использовать
Установка
Сохраните страницу как закладку.
Измените имя, например, “ Скопировать оглавление форума в буфер обмена”.
Измените URL и вставьте следующий код. При необходимости настройте код — см. два пункта “Опционально” ниже.
Проверяет, является ли URL постом сообщества: https://{domain}/t/{title}/{topicID}(/{postIndex}).
Проверяет наличие якорей (заголовков, таких как <h1> и # ) в посте.
Генерирует HTML-код для оглавления.
Копирует код в буфер обмена.
Создание оглавления
Опубликуйте пост со структурой (HTML <h1>, <h2>, … и Markdown # , ## , …). Discourse присвоит якоря каждому заголовку.
Убедитесь, что выбран ваш пост, посмотрев на индикатор прогресса (например, 1/22) или URL (например, /1).
Нажмите на закладку в панели закладок.
Оглавление будет скопировано в буфер обмена.
Использование оглавления
Нажмите на значок карандаша, чтобы отредактировать пост.
Вставьте код в начало.
Проверьте, правильно ли отображаются пункты оглавления (Известная проблема: закладка может пропускать некоторые эмодзи).
(Опционально) Измените/переведите “Содержание”.
(Опционально) Удалите open, если хотите, чтобы оглавление было свернуто по умолчанию.
Нажмите “Сохранить редактирование”. Если сделать это через несколько минут после публикации поста, значок карандаша “отредактировано” не появится.
Технические заметки для технических специалистов
Вы также можете скопировать и вставить код JavaScript в консоль разработчика.
Я обернул код в функцию, потому что return; не работает при использовании вне функций.
Подход с ' '.repeat() выглядит неаккуратно при предварительном просмотре темы, но, на мой взгляд, лучше всего смотрится в самом посте (по сравнению с использованием <li></li>).
При тестировании querySelectorAll почему-то первый элемент в h6>a.anchor,h5>a.anchor, ... не находился. Я поставил h6 в начало, так как он, вероятно, используется реже всего.
Закладка может перестать работать, если Discourse изменит свой UI/DOM. Пожалуйста, напишите мне, если найдете ошибки.
Скриншоты
Как новый пользователь meta.discourse.org, я не могу добавить несколько изображений, поэтому я объединил все скриншоты в одно изображение:
Мне нравится, как вы сформулировали проблему, которую решает этот инструмент, и то, как он разработан для удовлетворения потребностей важных пользователей на сайтах, которые сами, возможно, не имеют прав на внесение изменений в существующую структуру сайта.
Как отмечает @Lhc_fl, подход на основе DOM (HTML/JavaScript) ограничен в количестве элементов, которые мы можем обрабатывать. Для таких задач может помочь API Discourse.
Другая проблема при создании оглавления для ответов заключается в том, что сложно определить заголовок для каждого ответа. Мы могли бы использовать информацию, например, автора и дату, но я не уверен, что это будет полезнее существующей полосы прокрутки.
Это просто великолепно и именно то, что я искал. Похоже, это решает проблему:
Почему бы не отправить это в Discourse, чтобы включить его как официальный плагин или функцию? Его можно было бы добавить в панель инструментов редактора, чтобы автоматически вставлять оглавление в пост.
У меня есть одно предложение: можно ли добавить маркер в начало строки оглавления? В моём случае каждый заголовок занимает длинную строку, поэтому маркер помогает различать одно вхождение от другого.
Привет, @RBoy, спасибо за обратную связь и предложение!
Плагин для редактора был бы отличным решением, но для этого потребовалось бы много усилий: нужно изучить исходный код Discourse, чтобы понять логику обработки эмодзи и определения заголовков/текста якорей, а затем создать репозиторий для плагина.
Даже такой (на первый взгляд) простой плагин, как Spoiler Alert, представляет собой большой репозиторий, а у меня нет достаточного времени, чтобы полностью посвятить себя его разработке. Поэтому я надеюсь, что Discourse сможет в приоритетном порядке рассмотреть такие запросы, как Automatic Table of Contents generation, и в то же время разработать нативную функцию
Ниже представлена версия с маркерами списка. Расстояния между тегами <ul> и <ul> оказались слишком большими, поэтому я предпочёл исходный вариант без маркеров.
Да, это и есть различие. Я создал закладку, потому что не могу решить, какой «компонент темы» установить на форум, где я обычно бываю, и лишь немногие пишут длинные тексты, требующие оглавления.
Я поискал в репозитории GitHub и нашёл этот метод. Я рассмотрю возможность его разработки (только) тогда, когда у меня будет достаточно времени и я увижу высокий спрос на эту функцию.
Однако, если в сообщество можно добавить компонент темы, то уже существует DiscoTOC, как сказал @supermathie
К сожалению, этот плагин совершенно непригоден к использованию, когда заголовок содержит более нескольких слов, так как он полностью нарушает структуру страницы. Если заголовки занимают одну или две строки (например, на странице часто задаваемых вопросов), плагин Disco TOC превращает страницу в полный беспорядок. Именно поэтому я поднял этот запрос на создание встроенного оглавления (которое предлагает этот плагин), идеально подходящего для таких страниц:
Учитывая уровень гениальности и таланта команд, разрабатывающих Discourse, включить эту замечательную функцию в качестве альтернативы DiscoTOC, чтобы значительно расширить её сферу применения, не должно быть слишком сложно.