Ao criar um artigo, como uma postagem de blog para freeCodeCamp, Hashnode, Medium ou DEV.to, você pode ajudar a orientar o leitor criando um Índice (ToC). Neste artigo, explicarei como criar um com a ajuda de JavaScript e DevTools do navegador. O artigo explicará como usar as ferramentas de desenvolvimento do Google Chrome. Mas o mesmo pode ser aplicado a qualquer navegador moderno.
O processo neste artigo precisa ser feito uma vez por plataforma. Depois de ter o código, você pode aplicá-lo sempre para criar um ToC. Observe que se a plataforma mudar alguma coisa, pode ser necessário ajustar o script.
Índice
Ferramentas de desenvolvimento do navegador
Dev Tools é uma extensão do navegador que permite inspecionar e manipular o DOM (Modelo de objeto de documento), que é uma representação do HTML que o navegador mantém na memória em forma de árvore. Também dá acesso ao console JavaScript, onde você pode escrever pequenos trechos de código para testar algo. Tem muito mais recursos, mas usaremos apenas esses dois.
Para abrir as Ferramentas de Desenvolvimento (no Google Chrome), você pode pressionar F12 ou clicar com o botão direito do mouse na página e clicar em Inspecionar.
Acima está a captura de tela do DevTools com uma prévia deste artigo. À direita, você pode ver um selecionado h1 Tag HTML (o título) e CSS aplicados a essa tag. A estrutura em árvore que você vê é o DOM.
💡
Ao criar um ToC para freeCodeCamp, você deve abrir a visualização em uma nova guia.
Consola JavaScript
Precisaremos ter acesso ao console JavaScript. Para abrir o console no Google Chrome, você pode usar F12, clicar com o botão direito na página e selecionar Inspecionar no menu de contexto, ou usar o atalho CTRL+SHIFT+C (Windows, Linux) ou CMD+OPTION+C (Mac).
No Chrome DevTools, você pode escolher a guia Console na parte superior do DevTools. Mas isso irá ocultar a árvore DOM. É melhor abrir a gaveta de baixo. Você precisa clicar nos 3 pontos no canto superior direito e escolher “mostrar gaveta do console”.

As ferramentas de desenvolvimento ficarão assim:

💡
Você pode ignorar quaisquer erros ou avisos no console. Você pode clicar neste ícone 🚫 no lado esquerdo da gaveta e o console será limpo.
O console é chamado Ler-Eval-Imprimir-Loop. Uma interface clássica, onde você digita alguns comandos, aqui código JavaScript, e ao pressionar enter, o código é executado no contexto da página em que o DevTools está.

Acima, você pode ver um alerta de página executado no console.
Compreendendo a estrutura do DOM
A primeira etapa para criar um ToC é inspecionar o DOM e encontrar os cabeçalhos. Eles geralmente são H1…H6 etiquetas. H1 costuma ser o título da página. Em um mundo ideal, sempre seria.
No meu caso, o cabeçalho fica assim:
O artigo possui apenas tags H2, mas posteriormente neste artigo também explicarei como criar um ToC aninhado.
💡
Seus cabeçalhos precisam ter um atributo “id”. Pode parecer diferente, por exemplo, estar em um elemento diferente, mas tem que estar no DOM. Posteriormente neste artigo, explicarei algumas estruturas diferentes e como lidar com elas.
Agora, com o DevTools, podemos escrever código que encontrará todos os cabeçalhos:
document.querySelectorAll('h2(id), h3(id), main h4(id)');
No caso do meu artigo sobre freeCodeCamp, ele retornou esta saída:
NodeList(5) (h2#heading-dev-tools, h2#heading-javascript-console, h2#heading-understanding-the-dom-structure, h2#trending-guides.col-header, h2#mobile-app.col-header)
Primeiro, é um NodeList que precisamos converter em um Array. A segunda é que além dos cabeçalhos que temos até agora, também temos dois cabeçalhos que fazem parte do site e não do conteúdo principal. Portanto, precisamos descobrir o único elemento que é o pai dos cabeçalhos de que precisamos.
Você pode clicar com o botão direito na página em branco que contém o artigo e escolher Inspecionar Elemento. No nosso caso, encontrou um elemento . Portanto, podemos reescrever nosso seletor como:
document.querySelectorAll('main h2(id), main h3(id), main h4(id)');
E agora retorna nossos cabeçalhos e nada mais.
💡
O (id) o seletor de atributos não é necessário aqui, na verdade. Pelo menos não no freeCodeCamp.
Como criar o ToC no Markdown
Muitas plataformas de blog suportam Markdown, então será a primeira coisa que criaremos.
Primeiro, converteremos a lista de nós em um array. Podemos usar o operador de propagação:
(...document.querySelectorAll('main h2(id), main h3(id), main h4(id)'));
Em seguida, podemos mapear o array e criar os links Markdown que apontam para o cabeçalho fornecido.
const headers = (...document.querySelectorAll('main h2(id), main h3(id), main h4(id)'));
headers.map(function(node) {
// H2 header should have 0 indent
const level = parseInt(node.nodeName.replace('H', '')) - 2;
const hash = node.getAttribute('id');
const indent=" ".repeat(level * 2);
return `({indent}* (){node.innerText})(#${hash})`;
});
A saída é semelhante a esta:
(4) ('* (Dev Tools)(#heading-dev-tools)', '* (JavaScript Console)(#heading-javascript-console)', '* (Understanding the DOM Structure)(#heading-understanding-the-dom-structure)', '* (What to do if I don’t have headers?)(#heading-what-to-do-if-i-dont-have-headers)')
Para obter o texto, podemos juntar o array com um caractere de nova linha e usar console.log para exibir a saída. Se não usarmos console.logele mostrará uma string com n personagens.
const headers = (...document.querySelectorAll('main h2(id), main h3(id), main h4(id)'));
console.log(headers.map(function(node) {
// H2 header should have 0 indent
const level = parseInt(node.nodeName.replace('H', '')) - 2;
const hash = node.getAttribute('id');
const indent=" ".repeat(level * 2);
return `({indent}* (){node.innerText})(#${hash})`;
}).join('n'));
A saída deste artigo será semelhante a esta:
* (Dev Tools)(#heading-dev-tools)
* (JavaScript Console)(#heading-javascript-console)
* (Understanding the DOM Structure)(#heading-understanding-the-dom-structure)
* (Creating TOC in Markdown)(#heading-creating-toc-in-markdown)
* (This is fake header)(#heading-this-is-fake-header)
Eu criei um subcabeçalho falso. As plataformas, mesmo quando não oferecem suporte ao Markdown ao escrever artigos, geralmente oferecem suporte ao Markdown quando copiadas e coladas. O ToC na parte superior do artigo foi criado copiando e colando o markdown gerado com o último snippet de JavaScript.
Como criar um ToC HTML
Se a sua plataforma não suporta Markdown (como o Medium), você pode criar HTML, visualizar esse HTML e copiar a saída para a área de transferência. Colá-lo no editor da plataforma que você está usando deve manter a formatação.
💡
No Medium, o conteúdo está dentro de um
Para converter Markdown em HTML, você pode usar qualquer ferramenta online, mas verá como criá-la você mesmo no snippet. Será mais rápido depois de criar o código.
const headers = (...document.querySelectorAll('main h2(id), main h3(id), main h4(id)'))
function indent(state) {
return ' '.repeat((state.level - 1) * 2);
}
function closeUlTags(state, targetLevel) {
while (state.level > targetLevel) {
state.level--;
state.lines.push(`${indent(state)}`);
}
}
function openUlTags(state, targetLevel) {
while (state.level < targetLevel) {
state.lines.push(`${indent(state)}`);
state.level++;
}
}
const result = headers.reduce((state, node) => {
const level = parseInt(node.nodeName.replace('H', ''));
closeUlTags(state, level);
openUlTags(state, level);
const hash = node.getAttribute('id');
state.lines.push(`({indent(state)}- ${node.innerText}
`);
return state;
}, { lines: (), level: 1 });
closeUlTags(result, 1);
console.log(result.lines.join('n'));
Esta é a saída do código neste artigo:
Adicionei alguns cabeçalhos no final, para que você possa ver que funcionará para qualquer nível de cabeçalhos aninhados. Observe que também temos o ToC como o primeiro elemento da lista.
💡
Observe que o código HTML acima inclui um link para o Índice. Isso acontece se você executar o script novamente após adicionar o sumário. Você pode removê-lo manualmente. Se quiser melhorar o código, você pode adicionar um filtro.
Copie o código HTML para o editor
A maioria dos chamados WYSIWYG os editores usam HTML e você deve ser capaz de copiar a saída do código HTML com formatação e colá-la nesse editor. O mais fácil é simplesmente salvar em um arquivo, abrir esse arquivo e selecionar o texto:

O que fazer se eu não tiver cabeçalhos?
Você precisa encontrar algo que possa ser direcionado com CSS. Se eles são p tags com uma classe específica (como cabeçalho), você pode usar p.header em vez de h2.
Como criar um índice para DEV.to
Se você tiver uma estrutura DOM diferente, poderá usar métodos DOM diferentes para extrair o elemento necessário. Por exemplo, em DEV.to, os cabeçalhos são assim:
Overview
Portanto, o seletor precisa ser apenas main h2. Mas quando você executa este código:
(...document.querySelectorAll('main h2, main h3, main h4'));
Você verá que há muito mais cabeçalhos do que conteúdo do documento. Felizmente, podemos usar um novo seletor em CSS :has(). O seletor final para um cabeçalho pode ser assim: main h2:has(a(name)).
Aqui está o código completo:
const selector="main h2:has(a(name)), main h3:has(a(name)), main h4:has(a(name))";
const headers = (...document.querySelectorAll(selector));
console.log(headers.map(function(node) {
// H2 header should have 0 indent
const level = parseInt(node.nodeName.replace('H', '')) - 2;
// this is how you get the hash
// you can also access href attribute and remove # from the output string
const hash = node.querySelector('a').getAttribute('name');
const indent=" ".repeat(level);
return `({indent}* (){node.innerText})(#${hash})`;
}).join('n'));
Conclusão
Criar um índice pode ajudar seus leitores a digerir seu artigo. Como a maioria das pessoas não lê o artigo inteiro, elas apenas procuram o que precisam. Você também pode encontrar muitos artigos sobre seu impacto no SEO. Portanto, sempre vale a pena adicionar um se o artigo for mais longo.
E como você pode ver, criar um ToC não é tão difícil com um pouco de conhecimento em desenvolvimento web.
Se você gostou deste artigo, você pode me seguir nas redes sociais: (Twitter/X, GitHube/ou LinkedIn). Você também pode verificar meu site pessoal e meu novo blog.
Deseja saber mais sobre Programação e Desenvolvimento Clique Aqui!
