DiscoTOC - table des matières automatique

:discourse2: Summary DiscoTOC will allow you to generate an interactive table of contents for your topics with one click!
:eyeglasses: Preview Preview on Discourse Theme Creator
:hammer_and_wrench: Repository Link https://github.com/discourse/DiscoTOC
:open_book: New to Discourse Themes? Beginner’s guide to using Discourse Themes

Install this theme component

Samples

Desktop

Mobile

Features

toc = table of contents

  • Automatically generates the entire toc via a button in the composer gear menu

  • The toc will always be on the screen - scrolls with content like the topic progress widget

  • As you scroll past sections in the topic, the active element in the table of contents will be set to active (blue highlight)

  • adds id attributes to headings (you can link to a specific section from another topic / post)

  • clicking on any link in the toc will instruct the browser to navigate to relevant section (smooth-scrolling)

  • adds a copy-able link next to each heading (if you want to link to it)

  • RTL support

  • The colors are based on your current active color palette

How does it work?

In a nutshell, it looks for headings in topics which are marked to have a toc (via the composer button) and if it turns out the current topic is marked, then it takes all the headings and puts them in the toc (nested in order of heading levels) - this means that your markdown must be syntactically correct.

# heading 1
## heading 2
### heading 3
#### heading 4
##### heading 5
###### heading 6

You’re free to go back and fourth in heading levels, but the order must be correct

# heading 2 
## heading 3
## heading 3
### heading 4
## heading 3
# heading 2

etc...

In order for the links in the toc to work, headings must have id attributes. The component will check if the headings already have ids and if they do, then they are respected. This is handy if you ever manually created a toc.

If the headings don’t have ids, then it will generate an id for each heading based on its text (unwanted characters are stripped out)

once all of that is done, it will also add a link next to each button that links directly to that section:

Settings

Name Description
minimum trust level to create TOC The minimum trust level a user must have in order to see the TOC button in the composer
composer toc text Text that appears at the top of the preview pane of the composer to indicate the topic will have a table of contents
auto TOC categories Automatically enable TOC on topics in these categories
auto TOC tags Automatically enable TOC on topics with these tags
TOC min heading Minimum number of headings in a topic for the table of contents to be shown

Translations

Translation Default
table_of_contents table of contents
insert_table_of_contents Insert table of contents
jump_bottom Jump to end
toggle_toc.show_timeline Timeline
toggle_toc.show_toc Contents

The theme comes with three strings that you can translate or change.

table_of_contents: "table of contents"

this used for the button that opens the toc on mobile

insert_table_of_contents: "Insert table of contents"

this is used as the text for the toc button in the composer gear menu

topic_will_contain_a_table_of_contents: "This topic will contain a table of contents"

This is the text that shows up in the composer preview to indicate that the a toc will be generated for the topic

How do I create a toc?

  1. Write a topic with syntactically correct headings
  2. Click the toc button in the gear menu (only shows up when creating a regular topic - replies and PMs are ignored
  3. Profit.

What happens to the topic progress widget when a topic has a toc?

As you can probably guess, there’s no space to show both at the same time, so the way this component works is as follows

in a topic with a toc, the topic progress widget is hidden while the first post is on screen, and you see the toc instead.

Once you scroll past the first post, the toc will not scroll with you and the topic progress will be shown instead while you read any replies.

So, first posts get the toc, and subsequent posts get the regular topic progress widget.

The happens on both desktop and mobile.

Are there any downsides to using this component?

Nothing I am aware of, all the changes are done on the client-side. So you can easily remove the component and your posts would go back to the way they were before you installed it.

Limitations

This component assumes the standard topic layout. As such, it won’t work with themes that modify that layout such as the Vincent theme. Support for popular themes that modify the layout will come at a later stage in the form of component settings.

Credit

I started with Greg Franko’s tocify.js library. However, it looks like it’s not been updated in a while, so this is essentially a hard-fork that removes a lot of unnecessary features, integrates and styles the rest for Discourse.

So, there are no external requests and the total size is ~ 4kb gzip.

Big thanks to @erlend_sh for lots of valuable feedback and to @david for his help with translations.

:discourse2: Hosted by us? Theme components are available to use on our Pro, Business and Enterprise plans.

Last edited by @tobiaseigen 2025-06-24T03:17:08Z

Check documentPerform check on document:
181 « J'aime »

4 messages ont été déplacées vers un nouveau sujet : Comment déplacer la table des matières sur le côté gauche de l’article ?

Je ne sais pas comment ce composant est implémenté ni grand-chose sur la structure frontend de Discourse, donc je ne peux que faire une supposition.

Ne pourrait-on pas n’afficher la barre de progression a) que s’il y a plus d’un message dans le sujet et b) ajuster son début pour qu’il parte du 2e message (au lieu du 3e), mais aussi c) ajouter une marge inférieure/supérieure confortable à l’un des deux éléments pour s’assurer que l’autre reste suffisamment éloigné (par exemple 1vh) pour ne pas avoir un aspect étrange ?

En d’autres termes, au lieu d’utiliser l’intégralité du 2e message comme espace, utiliser du CSS pour permettre un certain espace entre eux (s’il y a plus d’un message).

Encore une fois, cela n’a peut-être aucun sens car je ne sais pas grand-chose sur la façon dont cela fonctionne actuellement.

3 « J'aime »

Bonjour ! Nous avons récemment installé DiscoTOC pour nos forums et nous nous demandions s’il était possible de faire en sorte que le composant lise le texte alternatif dans les images ? Nous avons utilisé des images pour certains en-têtes de notes de mise à jour…

comme ceci :
Performance and Stability

Et malheureusement, le système TOC ne semble pas être capable d’analyser une image comme un en-tête, créant une entrée vide dans la liste et créant un lien qui mène à une page vide. Existe-t-il une solution de contournement à cela, autre que « ne pas utiliser d’images » ? Merci ! Nous aimons beaucoup le système par ailleurs.

1 « J'aime »

Je suppose que la solution consiste à ne pas utiliser d’images comme titres, mais il sera peut-être possible d’y parvenir en ajoutant du code à votre site qui s’intègre au code de DiscoTOC. La pertinence d’examiner cela dépendra de l’importance que vous accordez à l’utilisation d’images dans les titres des publications.

3 « J'aime »

Nous utilisons des images comme en-têtes dans nos notes de mise à jour de manière constante depuis un certain temps, et cela fait partie de notre image de marque et de notre présentation ; non seulement sur les forums, mais aussi sur Steam et autres plateformes. Nous aimerions avoir la possibilité de continuer à utiliser des images comme en-têtes tout en utilisant DiscoTOC afin de maintenir notre cohérence.

DiscoTOC a été excellent pour d’autres choses, comme le récapitulatif d’une AMA (Ask Me Anything), un méga-post sur notre application de lancement de serveur dédié, des guides pour les nouveaux joueurs, etc. Nous apprécions beaucoup le système, mais nous aimerions une fonctionnalité supplémentaire pour la manière dont nous présentons les notes de mise à jour.

1 « J'aime »

La fonctionnalité d’ancre de titre sur ce composant entre légèrement en conflit avec la fonctionnalité Liens automatiques d’en-tête ajoutée dans la version 2.7.0beta6, car les titres affichent deux icônes au survol, une de Discourse et une de DiscoTOC. Y a-t-il un moyen de contourner ce problème ?

1 « J'aime »

Bonjour,

Vous pouvez masquer l’ancre Automatic header links avec

.anchor {
  display: none;
}

Bonjour dodesz,

J’ai rendu la largeur des publications beaucoup plus grande que celle par défaut, et après avoir installé ce composant, cela semble incorrect. Pourriez-vous me dire comment résoudre ce problème ?

:heart: merci !

Selection_839

1 « J'aime »

Sur un forum utilisant Discourse 2.8.0.beta4 (90232af778), l’activation du composant DiscoTOC entraîne un message d’erreur :

oops

Le composant avait déjà été activé et avait soulevé un problème avec la version précédente de Discourse, bien que je ne puisse pas dire de quelle version il s’agissait.

Êtes-vous en mesure de trouver des messages d’erreur liés au problème dans les journaux d’erreurs de votre site ?

Ce message d’erreur est une erreur de backend, tandis que DiscoTOC est un composant de thème de frontend, il est donc difficile qu’ils soient liés. Avez-vous installé des plugins ?

1 « J'aime »

Malheureusement, je n’ai rien trouvé d’utile dans /logs.

Oui, voici l’extrait pertinent de app.yml :

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-openid-connect.git
          - git clone https://github.com/discourse/discourse-checklist.git
          - git clone https://github.com/discourse/discourse-push-notifications.git
          - git clone https://github.com/discourse/discourse-characters-required.git
          - git clone https://github.com/angusmcleod/discourse-news.git
          - git clone https://github.com/discourse/discourse-data-explorer.git
          - git clone https://github.com/DNOeV/discourse-watch-category.git
          - git clone https://github.com/discourse/discourse-footnote.git
          - git clone https://github.com/discourse/discourse-knowledge-explorer.git
1 « J'aime »

Lorsqu’un titre est dans une citation, il n’apparaît pas dans la table des matières (TOC). Ce comportement pourrait-il être modifié ?

Ce titre n’apparaîtra pas dans la TOC

Contenu cité

Ce titre apparaît bien dans la TOC

Contenu cité

Je ne sais pas comment cela est prévu pour fonctionner, mais normalement non, car cela fait partie de la citation, pas d’un titre de ce texte.

1 « J'aime »

Pourriez-vous essayer d’utiliser le <blockquote> HTML à la place ? Cela permettrait au titre # d’être au début d’une ligne.

Exemple :

<blockquote>

### En-tête d'ancre

</blockquote>

En-tête d’ancre

Je n’ai pas essayé dans une table des matières (TOC), mais cela semble fonctionner avec les en-têtes auto-ancrés dans une publication normale.

Pourquoi voulez-vous que les en-têtes entre guillemets apparaissent dans la table des matières ? Quel est votre cas d’utilisation ?

Merci pour l’idée. Cela n’a pas fonctionné pour moi, cependant.

Voici un exemple de quand j’utilise des citations pour structurer visuellement le contenu commençant sous Zone de problème : Âge

3 « J'aime »

Pourquoi utilisez-vous le guillemet de cette façon ? Indiquer la source suffit. De plus, grammaticalement, c’est faux, même en anglais.

Est-ce un bug ou juste un autre utilisateur, mais… comment dois-je fermer la table des matières (TOC) ? Je cherchais des instructions de base sur la façon dont un utilisateur final doit utiliser les messages privés et bien sûr, je suis allé dans la documentation pour les nouveaux utilisateurs et j’ai ouvert la TOC pour voir s’il y avait des informations.

J’utilisais un iPad et DiscourseHub.

J’ai obtenu ceci :

kuva

La TOC est très bien. Mais elle chevauche le texte et je n’ai pas réussi à la faire disparaître. Alors, qu’est-ce que j’ai fait de mal, ou rien du tout :pleading_face: