DiscoTOC - índice automático

: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 curtidas

4 posts foram divididos em um novo tópico: Como mover o TOC para o lado esquerdo da postagem?

Eu não sei como este componente é implementado ou muito sobre a estrutura frontend do Discourse, então só posso arriscar um palpite.

Será que a barra de progresso só poderia ser mostrada a) se houver mais de 1 post no tópico e b) ajustar seu início para ser a partir do 2º post (em vez do 3º), mas também c) adicionar uma margem inferior/superior confortável a um dos dois elementos para garantir que o outro permaneça distante o suficiente (ex: 1vh) para não ficar com uma aparência estranha?

Em outras palavras, em vez de usar o post inteiro como lacuna, use CSS para permitir algum espaço entre eles (se houver mais de 1 post).

Novamente, isso pode não fazer sentido algum, pois não sei muito sobre a forma como isso está funcionando no momento.

3 curtidas

Olá! Recentemente instalamos o DiscoTOC em nossos fóruns e estávamos nos perguntando se é possível fazer com que o componente leia o texto alternativo (alt text) em imagens? Usamos imagens para alguns cabeçalhos de notas de atualização…

assim:
Performance and Stability

E, infelizmente, o sistema TOC não parece conseguir analisar uma imagem como um cabeçalho, criando uma entrada em branco na lista e gerando um link que leva a uma página em branco. Existe alguma solução alternativa para isso além de “não usar imagens”? Obrigado! Adoramos o sistema de resto.

1 curtida

Minha suposição é que a solução é não usar imagens como títulos, mas talvez haja uma maneira de fazê-lo funcionar adicionando algum código ao seu site que se conecte ao código do DiscoTOC. Se vale a pena investigar isso ou não, dependerá de quão importante é para você usar imagens nos títulos das postagens.

3 curtidas

Temos usado imagens como cabeçalhos em nossas notas de atualização de forma consistente por um bom tempo, e isso faz parte da nossa marca e apresentação; não apenas nos fóruns, mas também no Steam e similares. Gostaríamos de ter a capacidade de continuar usando imagens como cabeçalhos ao usar o DiscoTOC para manter a consistência.

O DiscoTOC tem sido ótimo para outras coisas, como um resumo de AMA (Ask Me Anything), uma megapublicação sobre nosso aplicativo de inicialização de servidor dedicado, guias para novos jogadores, etc. Gostamos muito do sistema, mas adoraríamos um pouco de funcionalidade extra para a maneira como apresentamos as notas de atualização.

1 curtida

A funcionalidade de âncora de título neste componente conflita ligeiramente com a funcionalidade Automatic header links adicionada na 2.7.0beta6, já que os títulos recebem dois ícones ao passar o mouse, um do Discourse e outro do DiscoTOC. Existe uma maneira de contornar isso?

1 curtida

Olá,

Você pode ocultar a âncora Automatic header links com

.anchor {
  display: none;
}

Olá dodesz,

Eu deixei a largura da postagem muito maior que a padrão, e depois de instalar este componente, ela ficou com uma aparência estranha. Você poderia me dizer como corrigir este problema?

:heart: obrigado!

Selection_839

1 curtida

Em um fórum rodando Discourse 2.8.0.beta4 (90232af778), incluir o componente DiscoTOC leva a uma mensagem de erro:

oops

O componente havia sido ativado antes e também gerou um problema com a versão do Discourse instalada anteriormente, embora eu não possa dizer qual era essa versão.

Você consegue encontrar alguma mensagem de erro relacionada ao problema nos logs de erro do seu site?

Essa mensagem de erro é um erro de backend, enquanto o DiscoTOC é um componente de tema de front-end, então é difícil que estejam relacionados. Você tem algum plugin instalado?

1 curtida

Infelizmente, não consegui encontrar nada útil em /logs.

Eu tenho, aqui está o trecho relevante do 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 curtida

Quando um cabeçalho está dentro de uma citação, o cabeçalho não aparece no TOC (Tabela de Conteúdo). Esse comportamento poderia ser alterado?

Este cabeçalho não aparecerá no TOC

Conteúdo citado

Este cabeçalho APARECE no TOC

Conteúdo citado

Eu não sei como está planejado para funcionar, mas normalmente não, porque faz parte da citação, não um cabeçalho desse texto.

1 curtida

Você poderia tentar usar o <blockquote> do HTML em vez disso? Isso permitiria que o cabeçalho # ficasse no início de uma linha.

Exemplo:

<blockquote>

### Cabeçalho de Âncora

</blockquote>

Cabeçalho de Âncora

Eu não tentei em um TOC (Table of Contents - Índice), mas parece funcionar com os cabeçalhos com âncora automática em uma postagem normal.

Por que você quer que os cabeçalhos dentro de aspas apareçam no sumário? Qual é o seu caso de uso?

Obrigado pela ideia. Não funcionou para mim, no entanto.

Aqui está um exemplo de quando uso citações para estruturar visualmente o conteúdo que começa em Área de Problema: Idade

3 curtidas

Por que você está usando aspas dessa forma? Dizer a fonte é suficiente. Além disso, gramaticalmente isso está errado, inclusive em inglês.

Isto é um bug ou apenas mais um usuário, mas… como devo fechar o TOC? Eu estava procurando por instruções básicas sobre como um usuário final deve usar mensagens privadas e, claro, fui para a documentação de novos usuários e abri o TOC para ver se havia alguma informação.

Eu estava usando um iPad e o DiscourseHub.

Eu obtive isto:

kuva

O TOC está ótimo. Mas está sobrepondo o texto e eu não consegui suprimi-lo novamente. Então, o que diabos eu fiz de errado, ou não fiz nada :pleading_face: