Skip to content

Instantly share code, notes, and snippets.

@alinnert
Last active November 16, 2017 14:14
Show Gist options
  • Save alinnert/6f44464185017bfc3000 to your computer and use it in GitHub Desktop.
Save alinnert/6f44464185017bfc3000 to your computer and use it in GitHub Desktop.
Automatically inserts a TOC to HTML files generated from markdown

mdTOC

If inserted in a HTML document auto-generated from markdown a TOC sidebar gets generated automatically.

to do

  • headline elements don't receive the id attribute because that version of the content gets deleted and replaced by the original one.
  • some parameters to adjust the script more easily.
'use strict';
function addTOC() {
var tocElement, bodyContent, mainElement;
tocElement = document.createElement('nav');
tocElement.setAttribute('id', 'toc');
bodyContent = document.body.innerHTML;
mainElement = document.createElement('main');
mainElement.insertAdjacentHTML('afterbegin', bodyContent);
generateTOC(tocElement);
document.body.innerHTML = '';
document.body.insertAdjacentHTML('afterbegin', tocElement.outerHTML);
document.body.insertAdjacentHTML('beforeend', mainElement.outerHTML);
// FUNCTIONS
function generateTOC(tocElement) {
var headlineElements,
currentElement,
currentHeadlineElement,
currentHeadlineLinkElement,
i;
headlineElements = document.querySelectorAll('h1, h2, h3, h4, h5, h6');
for (i = 1; i < headlineElements.length; i++) {
currentElement = headlineElements[i];
currentElement.setAttribute('id', i);
currentHeadlineLinkElement = document.createElement('a');
currentHeadlineLinkElement.setAttribute('href', '#' + i);
currentHeadlineLinkElement.innerHTML = currentElement.innerHTML;
currentHeadlineElement = document.createElement('div');
currentHeadlineElement.classList.add(currentElement.tagName.replace('H', 'level-'));
currentHeadlineElement.insertAdjacentHTML('afterbegin', currentHeadlineLinkElement.outerHTML);
tocElement.insertAdjacentHTML('beforeend', currentHeadlineElement.outerHTML);
}
}
}
document.addEventListener('DOMContentLoaded', addTOC, false);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment