Automatisches Inhaltsverzeichnis in Github-Geschmacksabschlag


214

Ist es möglich, mit Github Flavored Markdown ein automatisches Inhaltsverzeichnis zu erstellen ?


2
versuchen Sie es mit markiertem Toc , es kann nicht viel einfacher werden.
Jonschlinkert

1
Wenn Sie Linux verwenden und keine zusätzliche Software installieren möchten, versuchen Sie es mit github-markdown-toc (nur awk unter der Haube).
Shorrty

Ich rendere mehrere Markdown-Dateien in Jade-Vorlagen in HTML. Daher muss mein Inhaltsverzeichnis mehr Informationen enthalten, als in einer Markdown-Datei enthalten sind. Meine Lösung besteht darin, das Inhaltsverzeichnis aus dem HTML-Code selbst mit der Bibliothek node.js zu generierentoc
Plato

2
Ich habe drei verschiedene Markdown-Inhaltsverzeichnisgeneratoren erstellt, die versuchen, "es richtig zu machen", einschließlich des oben aufgeführten Markierungs-Inhaltsverzeichnisses. markdown-toc ist mein Favorit, es verwendet einen echten Markdown-Parser ( bemerkenswert , der der Spezifikation [commonmark] (commonmark.org) folgt, ermöglicht die Aktualisierung von Inhaltsverzeichnissen, verfügt über eine CLI und eine API und wird jetzt in Tausenden von Projekten verwendet
jonschlinkert

Antworten:


141

Ich habe zwei Optionen erstellt, um ein Toc für Markdown mit Github-Geschmack zu generieren:

DocToc Command Line Tool ( Quelle ) erfordert node.js

Installation:

npm install doctoc

Verwendung:

npx doctoc . Hinzufügen eines Inhaltsverzeichnisses zu allen Markdown-Dateien im aktuellen und allen Unterverzeichnissen.

DocToc WebApp

Wenn Sie es zuerst online ausprobieren möchten, gehen Sie zur Doctoc- Site, fügen Sie den Link der Markdown-Seite ein und es wird ein Inhaltsverzeichnis generiert, das Sie oben in Ihre Markdown-Datei einfügen können.

Github Wikis und Anker

Wie Matthew Flaschen in den Kommentaren unten hervorhob, hat GitHub für seine Wiki-Seiten zuvor nicht die Anker generiert, die davon doctocabhängen.

UPDATE: Sie haben dieses Problem jedoch behoben .


3
Das Inhaltsverzeichnis sieht gut aus, aber GitHub generiert keine Anker für die tatsächlichen Abschnitte, sodass die Links unterbrochen werden. Ich werde sie vorerst manuell hinzufügen. Dies ist ein GitHub-Wiki.
Matthew Flaschen

2
Dies wird als GitHub-Problem protokolliert. Automatische Anker für Überschriften im Wiki .
Matthew Flaschen

1
Wenn Sie dies genauso ärgerlich finden wie ich, gehen Sie bitte auf den Link in @ MatthewFlaschens Kommentar und +1 auf diese Ausgabe.
Blak3r

2
@MatthewFlaschen Ihr Link brach - die neue Adresse ist github.com/gollum/gollum/issues/380
Adam Spiers

3
Die DocToc-Webanwendung funktioniert nicht. Ich habe Markdown-toc
DynamicDan

23

GitHub Pages (im Grunde genommen ein Wrapper für Jekyll) scheint kramdown zu verwenden , das Maruku vollständig implementiert , und unterstützt daher ein automatisch generiertes Inhaltsverzeichnis über ein tocAttribut:

* auto-gen TOC:
{:toc}

Die erste Zeile startet nur eine ungeordnete Liste und wird tatsächlich weggeworfen.

Dies führt zu einem verschachtelten Satz ungeordneter Listen unter Verwendung der Überschriften im Dokument.

Hinweis: Dies sollte für GitHub-Seiten funktionieren, nicht für GitHub Flavored Markdown (GFM), wie es in Kommentaren oder Wiki-Seiten verwendet wird. AFAIK dafür gibt es keine Lösung.


1
Das funktioniert nicht. Dieser Text wird nur gerendert. Können Sie eine Datei verknüpfen, die ein solches Inhaltsverzeichnis verwendet?
Geoffrey De Smet


2
Beachten Sie, dass dies eine Maruku-Funktion ist, nicht Markdown an sich und wahrscheinlich nicht einmal GH Flavored Markdown. GH-Seiten verwenden jedoch Maruku.
Rebecca Scott

@ KevinSuttle bist du sicher? Jekyll enthält Redcarpet, aber Maruku sieht immer noch wie die Standardeinstellung aus (es sei denn, GH verwendet eine andere Jekyll-Konfiguration). Github.com/mojombo/jekyll/blob/master/lib/jekyll.rb#L66
Rebecca Scott

10
@ BenScott Es sieht so aus, als ob Ihre Lösung nur für Github-Seiten funktioniert. Kennen Sie eine Lösung für das Github-Wiki?
Reprogrammierer

13

Wenn Sie Markdown-Dateien mit Vim bearbeiten, können Sie dieses Plugin vim-markdown-toc ausprobieren .

Die Verwendung ist einfach. Bewegen Sie den Cursor einfach an die Stelle, an der Sie das Inhaltsverzeichnis anhängen und ausführen möchten :GenTocGFM . Fertig!

Screenshots:

vim-markdown-toc

Eigenschaften:

  1. Generieren Sie toc für Markdown-Dateien. (Unterstützt GitHub Flavored Markdown und Redcarpet)

  2. Aktualisieren Sie das vorhandene toc.

  3. Auto Update toc beim Speichern.


Stellen Sie sicher, dass Sie einen gemeinsamen Inhaltsverzeichnisstil finden, falls Sie an MD-Dateien zusammenarbeiten und verschiedene Editoren / Plugins beteiligt sind, damit nicht bei jedem anderen Commit Änderungen am Inhaltsverzeichnis vorgenommen werden. Mögliche Ergänzungen ~/.vimrcdazu: Listenzeichen ändern mit let g:vmt_list_item_char = "-", Überschriften vor Inhaltsverzeichnis mit einfügen let g:vmt_include_headings_before = 1. Weitere Informationen finden Sie im Abschnitt mit den Dokumentoptionen , z. B. zum Ändern des Zauntextes.
Wolfson

9

Es ist nicht automatisch, verwendet jedoch reguläre Notepad ++ - Ausdrücke:

Ersetzen Sie alle zuerst durch die zweiten (entfernt alle Zeilen ohne Überschriften)

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

Dann (konvertiert Header III in Leerzeichen)

-##
        -

Dann (konvertiert Header II in Leerzeichen)

-#
    -

Dann (entfernen Sie nicht verwendete Zeichen am Anfang und am Ende des Link-Titels)

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

Dann (letzte Token in Kleinbuchstaben umwandeln und anstelle von Leerzeichen streichen)

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

Entfernen Sie nicht verwendete letzte Pfund und anfängliche Striche:

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

Entfernen Sie nutzlose Zeichen in Links:

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

Und schließlich fügen Sie Klammern um die letzten Links hinzu:

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

Und voilà! Sie können dies sogar in ein globales Makro einfügen, wenn Sie es genügend oft wiederholen.


9

Es ist nicht möglich, außer für die vorgeschlagenen Problemumgehungen.

Ich schlug support@github.com und Steven die Erweiterung des TOC von Kramdown und andere Möglichkeiten vor ! Ragnarök antwortete mit dem Üblichen:

Danke für den Vorschlag und die Links. Ich werde es unserer internen Funktionsanforderungsliste hinzufügen, damit das Team es sehen kann.

Lassen Sie uns diese Frage positiv bewerten, bis es passiert.

Eine andere Problemumgehung besteht darin, Asciidoc anstelle von Markdown zu verwenden, wodurch Inhaltsverzeichnisse gerendert werden . Ich bin heutzutage für meinen Inhalt zu diesem Ansatz übergegangen.


Ich würde eher hoffen, dass GFM es eines Tages zur Verfügung stellt. Es ist wirklich eine Courius-Sache für mich, während SourceForges Markdown die Syntax hat, um dieses Inhaltsverzeichnis standardmäßig zu generieren .
Chetabahana

8

Github Flavored Markdown verwendet RedCarpet als Markdown-Engine. Aus dem RedCarpet-Repo :

: with_toc_data - Fügen Sie jedem Header im Ausgabe-HTML HTML-Anker hinzu, um die Verknüpfung mit jedem Abschnitt zu ermöglichen.

Es scheint, dass Sie auf Renderer-Ebene gehen müssen, um dieses Flag zu setzen, was auf Github offensichtlich nicht möglich ist. Beim neuesten Update von Github Pages scheint die automatische Verankerung für Header aktiviert zu sein, wodurch verknüpfbare Überschriften erstellt werden. Nicht genau das, was Sie wollen, aber es könnte Ihnen helfen, ein Inhaltsverzeichnis für Ihr Dokument etwas einfacher zu erstellen (wenn auch manuell).


5

Eine sehr bequeme Möglichkeit, ein Inhaltsverzeichnis für eine Mardown-Datei zu erstellen, wenn Sie mit Visual Studio Code arbeiten, ist die Erweiterung Markdown-TOC .

Es kann vorhandenen Markdown-Dateien einen Toc hinzufügen und den Toc beim Speichern sogar auf dem neuesten Stand halten.

Geben Sie hier die Bildbeschreibung ein


Ein weiteres nettes VS-Code-Plugin (großartige .md-Unterstützung mit netten Funktionen, einschließlich GitHub & GitLab-TOC) ist Markdown-All-in-One .
Wolfson

4

Es ist möglich, automatisch eine Webseite mit http://documentup.com/ aus der README.mdDatei zu generieren . Es wird kein Inhaltsverzeichnis erstellt, aber für viele könnte es den Grund für die Erstellung eines Inhaltsverzeichnisses lösen.

Eine weitere Alternative zu Documentup ist Flatdoc: http://ricostacruz.com/flatdoc/


3

Gitdown ist ein Markdown-Präprozessor für Github.

Mit Gitdown können Sie:

  • Inhaltsverzeichnis erstellen
  • Finden Sie tote URLs und Fragment-IDs
  • Variablen einschließen
  • Dateien einschließen
  • Dateigröße abrufen
  • Abzeichen generieren
  • Datum des Drucks
  • Drucken Sie Informationen zum Repository selbst

Gitdown optimiert allgemeine Aufgaben im Zusammenhang mit der Verwaltung einer Dokumentationsseite für ein GitHub-Repository.

Die Verwendung ist unkompliziert:

var Gitdown = require('gitdown');

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

Sie können es entweder als separates Skript oder als Teil der Build-Skript-Routine (z. B. Gulp ) verwenden.



1

Mein Kollege @schmiedc und ich haben ein GreaseMonkey-Skript erstellt , das eine neue TOCSchaltfläche links von der h1Schaltfläche installiert, die die hervorragende markdown-jsBibliothek zum Hinzufügen / Aktualisieren eines Inhaltsverzeichnisses verwendet.

Der Vorteil gegenüber Lösungen wie doctoc besteht darin, dass es in den Wiki-Editor von GitHub integriert ist und keine Benutzer an ihrer Befehlszeile arbeiten müssen (und dass Benutzer Tools wie installieren müssen node.js). In Chrome funktioniert dies durch Ziehen und Ablegen auf die Seite "Erweiterungen". In Firefox müssen Sie die Erweiterung "GreaseMonkey" installieren.

Es funktioniert mit einfachem Markdown (dh es werden Codeblöcke nicht korrekt behandelt, da dies eine GitHub-Erweiterung für Markdown ist). Beiträge willkommen.


Vielen Dank! Ich musste Tampermonkey verwenden, wie in dieser Antwort vorgeschlagen , um es in Chrome zu installieren, und es funktionierte! Was würde es brauchen, damit Ihr Skript Inhaltsverzeichnisse für normale Markdown-Dateien im Github-Repo generiert?
Lebensbalance

1

Dies ist keine direkte Antwort auf diese Frage, da so viele Leute Problemumgehungen bereitgestellt haben. Ich glaube nicht, dass die Erstellung eines Inhaltsverzeichnisses bisher offiziell von Github unterstützt wurde. Wenn Sie möchten, dass GitHub automatisch ein Inhaltsverzeichnis auf den GFM-Vorschauseiten rendert, nehmen Sie an der Diskussion zum offiziellen Problem mit Funktionsanfragen teil .


0

Derzeit ist die Verwendung der Markdown-Syntax nicht möglich (siehe die laufende Diskussion bei GitHub ). Sie können jedoch einige externe Tools verwenden, z.


Alternativ können Sie AsciiDocstattdessen (z. B. README.adoc) z

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

## A

### A2

## B

### B2

wie in diesem Kommentar vorgeschlagen . Überprüfen Sie die Demo hier .


Das Hosting des Online-Inhaltsverzeichnisses (raychenon / play-table-of- content ) auf tableofcontent.eu wurde aufgrund der Kosten von AWS eingestellt.
Michael Freidgeim

0

Für Githubs Texteditor Atom sehen Sie sich dieses fantastische Plugin (oder "Paket" in Atom-lingo) an, das "Inhaltsverzeichnis) von Überschriften aus analysierten Markdown- Dateien generiert :

Markdown-toc

Einmal als Atom-Paket installiert, können Sie über die Verknüpfung ctrl-alt-cein Inhaltsverzeichnis basierend auf Ihrer Markdown-Doc-Struktur an der aktuellen Cursorposition einfügen ...

Screenshots:

Geben Sie hier die Bildbeschreibung ein

Atom-Tastenkombinationen

markdown-toc bietet Ihnen die folgenden Standard-Tastenkombinationen zur Steuerung des Plugins in Atom:

  • ctrl-alt-c => Erstellen Sie das Inhaltsverzeichnis an der Cursorposition
  • ctrl-alt-u => Inhaltsverzeichnis aktualisieren
  • ctrl-alt-r => Inhaltsverzeichnis löschen

Plugin-Funktionen (aus der README-Datei des Projekts)

  • Automatische Verknüpfung über Ankertags, z. B. # A 1#a-1
  • Tiefenkontrolle [1-6] mit depthFrom:1 unddepthTo:6
  • Aktivieren oder deaktivieren Sie Links mit withLinks:1
  • Liste beim Speichern mit aktualisieren updateOnSave:1
  • Verwenden Sie die geordnete Liste (1. ..., 2. ...) mit orderedList:0

0

Hier ist ein Shell-Skript, das ich heute dafür zusammengestellt habe. Möglicherweise müssen Sie es an Ihre Bedürfnisse anpassen, aber es sollte ein guter Ausgangspunkt sein.

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/^#//'

Wenn jemand einen besseren Weg kennt, um diese endgültigen # Ersetzungen vorzunehmen, fügen Sie bitte einen Kommentar hinzu. Ich habe verschiedene Dinge ausprobiert und war mit keinem zufrieden, also habe ich es nur brutal erzwungen.


0

Es gibt jetzt eine GitHub-Aktion, die dies erreicht:

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

  1. Geben Sie den Ort des Inhaltsverzeichnisses an (Option), z README.md
<!-- START doctoc -->
<!-- END doctoc -->
  1. Workflow einrichten z .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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.