Skip to content

Instantly share code, notes, and snippets.

@abishekrsrikaanth
Forked from simov/html-toc.js
Created September 23, 2022 20:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save abishekrsrikaanth/77bb53c86049f0a7efa1c7fa1748634c to your computer and use it in GitHub Desktop.
Save abishekrsrikaanth/77bb53c86049f0a7efa1c7fa1748634c to your computer and use it in GitHub Desktop.
Generate Table of Contents (TOC) from rendered HTML document's header tags
// extract all headers
var headers = []
function walk (nodes) {
nodes.forEach((node) => {
var sub = Array.from(node.childNodes)
if (sub.length) {
walk(sub)
}
if (/h[1-6]/i.test(node.tagName)) {
headers.push({
id: node.getAttribute('id'),
level: parseInt(node.tagName.replace('H', '')),
title: node.innerText
})
}
})
}
walk(Array.from(document.body.childNodes))
console.dir(headers)
// generate TOC
var link = (header) =>
'<li><a href="#' + header.id + '">' + header.title + '</a></li>'
var html = '<ul>'
headers.forEach((header, index) => {
if (index) {
var prev = headers[index - 1]
}
if (!index || prev.level === header.level) {
html += link(header)
}
else if (prev.level > header.level) {
html += '</ul>' + link(header)
}
else if (prev.level < header.level) {
html += '<ul>' + link(header)
}
})
html += '</ul>'
document.body.insertAdjacentHTML('afterbegin', html)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment