/*jslint white: true, browser: true, vars: true */ /** * Generates a table of contents for your document based on the headings * present. Anchors are injected into the document and the * entries in the table of contents are linked to them. The table of * contents will be generated inside of the first element with the id `toc`. * @param {HTMLDOMDocument} documentRef Optional A reference to the document * object. Defaults to `document`. * @author Matthew Christopher Kastor-Inare III * @version 20130726 * @example * // call this after the page has loaded * generateTOC(); */ /** * Modified by @danpros * select only in selector ID * using the heading title as the slug IDs * insert the anchor inside the heading * fix browser not scrolling to the hash */ function generateTOC (id) { var documentRef = document; var selector = id + ' h1,' + id + ' h2,' + id + ' h3,' + id + ' h4,' + id + ' h5,' + id + ' h6'; var toc = documentRef.getElementById('toc' + id); var headings = [].slice.call(documentRef.body.querySelectorAll(selector)); if (headings && headings.length) { headings.forEach(function (heading, index) { heading.setAttribute('id', heading.textContent.replace(/\s+/g, '-').toLowerCase() + id); heading.setAttribute('class', 'toc-link'); var anchor = documentRef.createElement('a'); anchor.setAttribute('href', '#' + heading.textContent.replace(/\s+/g, '-').toLowerCase() + id); anchor.setAttribute('class', 'anchor'); anchor.setAttribute('aria-label', heading.textContent); anchor.innerHTML = ''; var link = documentRef.createElement('a'); link.setAttribute('href', '#' + heading.textContent.replace(/\s+/g, '-').toLowerCase() + id); link.textContent = heading.textContent; var div = documentRef.createElement('div'); div.setAttribute('class', heading.tagName.toLowerCase() + '-toc'); heading.appendChild(anchor); div.appendChild(link); toc.appendChild(div); }); documentRef.getElementById('toc-wrapper' + id).classList.add('visible'); documentRef.getElementById('toc-wrapper' + id).style.display = 'inline-block'; } if (window.location.hash) { var hash = window.location.hash; scrollToHash(hash); } } // fix browser not scrolling to the hash function scrollToHash (hash) { setTimeout(function() { hashtag = hash; location.hash = ''; location.hash = hashtag; }, 300); } try { module.exports = generateTOC; } catch (e) { // module.exports is not defined }