Автоматический TOC в github-flavored-markdown

215

Можно ли сгенерировать автоматическое оглавление, используя Github Flavored Markdown ?

Роберто Алои
источник
2
попробуйте отмеченный ток , это не может стать намного легче.
Йоншлинкерт
1
Если вы используете Linux и не хотите устанавливать какое-либо дополнительное программное обеспечение, попробуйте github-markdown-toc (только awk под капотом).
короткое время
Я рендеринг нескольких файлов уценки внутри шаблонов Jade в HTML. Поэтому мне нужно, чтобы в моем содержании содержалось больше информации, чем указано в одном файле уценки. Мое решение состоит в том, чтобы сгенерировать оглавление из самого HTML-кода с помощью библиотеки node.jstoc
Платон
2
Я создал три разных генератора оглавления уценки, пытаясь «сделать все правильно», включая отмеченный выше ток, указанный выше. markdown-toc - мой любимый инструмент, он использует настоящий анализатор уценок ( примечательно, что он соответствует спецификации [commonmark] (commonmark.org), позволяет обновлять оглавления, имеет CLI и API и теперь используется в тысячах проектов
jonschlinkert

Ответы:

141

Я создал две опции для генерации ток-кода для github-flavored-markdown:

Инструмент командной строки DocToc ( источник ) требует node.js

Монтаж:

npm install doctoc

Использование:

npx doctoc . добавить оглавление ко всем файлам разметки в текущем и всех подкаталогах.

DocToc WebApp

Если вы хотите сначала попробовать его в Интернете, перейдите на сайт doctoc , вставьте ссылку на страницу уценки, и она сгенерирует таблицу содержимого, которую вы можете вставить вверху файла уценки.

Github Wikis и якоря

Как отметил Мэтью Флашен в комментариях ниже, для своих вики-страниц GitHub ранее не генерировал якорей, doctocот которых зависит.

ОБНОВЛЕНИЕ: Тем не менее, они исправили эту проблему .

Торстен Лоренц
источник
3
TOC выглядит нормально, но GitHub не генерирует якоря для реальных разделов, поэтому ссылки разрываются. Я добавлю их вручную на данный момент. Это GitHub вики.
Мэтью Флэшен
2
Это зарегистрировано как проблема GitHub, Автоматические якоря для заголовков в вики .
Мэтью Флэшен
1
Если вас это раздражает так же, как и меня, перейдите по ссылке в комментарии @ MatthewFlaschen и +1 к этой проблеме.
Blak3r
2
@MatthewFlaschen Ваша ссылка разорвалась - новый адрес - github.com/gollum/gollum/issues/380
Адам Спайерс
3
веб-приложение DocToc не работает. Я использовал markdown-toc
DynamicDan
23

GitHub Pages (который по сути является оберткой для Jekyll), похоже, использует kramdown , который реализует весь Maruku и, следовательно, имеет поддержку автоматически сгенерированного оглавления через tocатрибут:

* auto-gen TOC:
{:toc}

Первая строка только начинает неупорядоченный список и фактически выбрасывается.

Это приводит к вложенному набору неупорядоченных списков с использованием заголовков в документе.

Примечание: это должно работать для страниц GitHub, а не для GitHub Flavored Markdown (GFM), используемого в комментариях или вики-страницах. AFAIK решение для этого не существует.

Ребекка Скотт
источник
1
Это не работает Это оправдывает рендеринг этого текста. Можете ли вы связать файл, который использует такой TOC?
Джеффри Де Смет
2
Обратите внимание, что это функция Maruku, а не Markdown как таковая, и, вероятно, даже не GH Flavored Markdown. GH-страницы действительно используют Maruku.
Ребекка Скотт
@KevinSuttle вы уверены? Джекил включает redcarpet но maruku по- прежнему выглядит по умолчанию (если GH не использует другой Джекил конфигурации) github.com/mojombo/jekyll/blob/master/lib/jekyll.rb#L66
Ребекка Скотт
10
@ BenScott Похоже, ваше решение работает только для страниц GitHub. Знаете ли вы о решении для github wiki?
перепрограммист
13

Если вы редактируете файлы Markdown с помощью Vim, вы можете попробовать этот плагин vim-markdown-toc .

Использование простое, просто наведите курсор на то место, куда вы хотите добавить оглавление, и бегите :GenTocGFM, готово!

Скриншоты:

ВИМ-уценки-TOC

Особенности:

  1. Генерация ток для файлов Markdown. (Поддержка GitHub со вкусом уценки и Redcarpet)

  2. Обновите существующий ток.

  3. Автоматическое обновление ток при сохранении.

Чжуан Ма
источник
Обязательно найдите общий стиль оглавления, если вы работаете с файлами .md и задействованы разные редакторы / плагины, чтобы не вносить изменения в оглавление при каждом другом коммите. Возможные дополнения ~/.vimrcдля этого: изменить символ списка с помощью let g:vmt_list_item_char = "-", включить заголовки перед оглавлением с let g:vmt_include_headings_before = 1. См. Раздел параметров документации для получения дополнительной информации, например, как изменить текст ограждения.
Вольфсон
9

Он не автоматический, но использует регулярные выражения Notepad ++:

Заменить все первое на второе (удаляет все строки, не имеющие заголовков)

^##(#?)(#?)(.*?)$(.|\r|\n)*?(?=^##|\z)
-\1\2 [\3](#\3)\n

Затем (преобразует заголовки III в пробелы)

-##
        -

Затем (преобразует заголовки II в пробелы)

-#
    -

Затем (удалите неиспользованные символы в начале и в конце заголовка ссылки)

\[ *((?:(?![ .:#!\?;]*\])[^#])*)[ #:!\?;]*\]
[\1]

Затем (преобразовать последние токены в нижний регистр и тире вместо пробелов)

\]([^ \r\n]*) ([^\r\n ]*)
]\L\1-\2

Удалите неиспользованные последние фунты и начальные тире:

(?:()[-:;!\?#]+$|(\]#)-)
\1\2

Удалите ненужные символы в ссылках:

(\].*?)(?:\(|\))
\1

И, наконец, добавьте круглые скобки вокруг заключительных ссылок:

\](?!\()(.*?)$
\]\(\1\)

И вуаля! Вы даже можете поместить это в глобальный макрос, если будете повторять это достаточно времени.

Микаэль Майер
источник
9

Это невозможно, за исключением предложенных обходных путей.

Я предложил расширение Kramdown TOC и другие возможности для support@github.com и Стивена! Рагнарёк ответил обычным:

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

Давайте поднимем этот вопрос, пока он не случится.

Другой обходной путь - использовать Asciidoc вместо Markdown, который отображает оглавления . Я перешел на этот подход для моего контента в настоящее время.

Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
источник
Я бы скорее надеялся, что GFM предоставит это когда-нибудь. Для меня это действительно курьезная вещь, в то время как у Markdown SourceForge есть синтаксис для генерации этого оглавления по умолчанию.
Четабахана
8

Github Flavored Markdown использует RedCarpet в качестве движка Markdown. Из репо RedCarpet :

: with_toc_data - добавить привязки HTML к каждому заголовку в выходном HTML, чтобы разрешить ссылки на каждый раздел.

Похоже, вам нужно попасть на уровень рендера, чтобы установить этот флаг, что, очевидно, невозможно на Github. Тем не менее, в последнем обновлении Github Pages, похоже, что автоматическая привязка для заголовков включена, создавая связываемые заголовки. Не совсем то, что вы хотите, но это может помочь вам создать оглавление для вашего документа немного (хотя и вручную).

Кевин Саттл
источник
5

Очень удобным способом получения оглавления для файла разметки при работе с кодом Visual Studio является расширение Markdown-TOC .

Он может добавить ток к существующим файлам уценки и даже поддерживать ток в актуальном состоянии при сохранении.

введите описание изображения здесь

Матиас Дпункт
источник
Другой замечательный плагин для VS-кода (отличная поддержка .md с хорошими функциями, включая GOC и GitLab) - это markdown-all-in-one .
Вольфсон
4

Можно генерировать веб - страницы автоматически http://documentup.com/ из README.mdфайла. Это не создание TOC, но для многих это может решить причину желания создать TOC.

Другой альтернативой Documentup является Flatdoc: http://ricostacruz.com/flatdoc/

Nils
источник
3

Gitdown - препроцессор уценки для Github.

Используя Gitdown вы можете:

  • Создать оглавление
  • Найти мертвые URL и идентификаторы фрагментов
  • Включить переменные
  • Включить файлы
  • Получить размер файла
  • Создать значки
  • Дата печати
  • Распечатать информацию о самом хранилище

Gitdown упрощает общие задачи, связанные с ведением страницы документации для репозитория GitHub.

Используя это просто:

var Gitdown = require('gitdown');

Gitdown
    // Gitdown flavored markdown.
    .read('.gitdown/README.md')
    // GitHub compatible markdown.
    .write('README.md');

Вы можете использовать его как отдельный скрипт или как часть скрипта сборки (например, Gulp ).

Gajus
источник
1

Мой коллега @schmiedc и я создали скрипт GreaseMonkey, который устанавливает новую TOCкнопку слева от h1кнопки, которая использует отличную markdown-jsбиблиотеку для добавления / обновления оглавления.

Преимущество перед такими решениями, как doctoc, заключается в том, что оно интегрируется в вики-редактор GitHub и не требует, чтобы пользователи работали в командной строке (и требует, чтобы пользователи устанавливали подобные инструменты node.js). В Chrome он работает путем перетаскивания на страницу расширений, в Firefox вам необходимо установить расширение GreaseMonkey.

Он будет работать с простой разметкой (то есть он не будет правильно обрабатывать блоки кода, поскольку это расширение GitHub для разметки). Взносы приветствуются.

Йоханнес Шинделин
источник
Большое спасибо! Мне пришлось использовать Tampermonkey, как было предложено в этом ответе, чтобы установить его в Chrome, и это сработало! Что нужно сделать, чтобы ваш скрипт генерировал оглавления для обычных файлов уценки в репозитории github?
спасательный круг
1

Это не прямой ответ на этот вопрос, так как многие люди нашли обходные пути. Я не думаю, что генерация оглавления официально поддерживается Github. Если вы хотите, чтобы GitHub автоматически отображал оглавление на своих страницах предварительного просмотра GFM, примите участие в обсуждении официального вопроса о запросе функции .

Сяодун Ци
источник
0

В настоящее время невозможно использовать синтаксис уценки (см. Текущее обсуждение на GitHub ), однако вы можете использовать некоторые внешние инструменты, такие как:


Альтернативно используйте AsciiDocвместо этого (например README.adoc), например

:toc: macro
:toc-title:
:toclevels: 99
# Title

## A

### A2

## B

### B2

как предложено в этом комментарии . Проверьте демо здесь .

kenorb
источник
Хостинг Online Table Of Content Generator (raychenon / play-table-of- content ) на tableofcontent.eu "остановлен из-за затрат на AWS.
Майкл Фрейдгейм
0

Для Github's Texteditor Atom проверьте этот удивительный плагин (или «пакет» в Atom-lingo), который генерирует «TOC (оглавление) заголовков из проанализированных файлов уценки» :

уценки-TOC

После установки в виде Atom-пакета вы можете использовать ярлык ctrl-alt-cдля вставки оглавления на основе вашей markdown-doc-структуры в текущей позиции курсора ...

Скриншоты:

введите описание изображения здесь

Atom Keybindings

markdown-toc предоставляет следующие привязки клавиш по умолчанию для управления плагином в Atom:

  • ctrl-alt-c => создать оглавление в позиции курсора
  • ctrl-alt-u => обновить оглавление
  • ctrl-alt-r => удалить оглавление

Особенности плагина (из README проекта)

  • Автоматическое связывание через теги привязки, например, # A 1#a-1
  • Контроль глубины [1-6] с помощью depthFrom:1иdepthTo:6
  • Включить или отключить ссылки с withLinks:1
  • Обновить список при сохранении с updateOnSave:1
  • Использовать упорядоченный список (1. ..., 2. ...) с orderedList:0
Mayinx
источник
0

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

cat README.md \
    | sed -e '/```/ r pf' -e '/```/,/```/d' \
    | grep "^#" \
    | tail -n +2 \
    | tr -d '`' \
    | sed 's/# \([a-zA-Z0-9`. -]\+\)/- [\1](#\L\1)/' \
    | awk -F'(' '{for(i=2;i<=NF;i++)if(i==2)gsub(" ","-",$i);}1' OFS='(' \
    | sed 's/^####/      /' \
    | sed 's/^###/    /' \
    | sed 's/^##/  /' \
    | sed 's/^#//'

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

Джон Эйкенберри
источник
0

Теперь есть действие GitHub, выполняющее это:

https://github.com/marketplace/actions/toc-generator

  1. Укажите местоположение оглавления (опция), например README.md
<!-- START doctoc -->
<!-- END doctoc -->
  1. Настройка рабочего процесса, например .github/workflows/toc.yml
on: push
name: TOC Generator
jobs:
  generateTOC:
    name: TOC Generator
    runs-on: ubuntu-latest
    steps:
      - uses: technote-space/toc-generator@v2
emazzotta
источник
0

Большинство других ответов требуют установки какого-либо инструмента. Я нашел быстрое и простое онлайн-решение https://imthenachoman.github.io/nGitHubTOC .

Для любого ввода уценки генерируется таблица вывода контента. Вы можете указать минимальный и максимальный уровень заголовка.

Исходный код находится по адресу https://github.com/imthenachoman/nGitHubTOC.

Майкл Фрейдгейм
источник