Skip to content

Instantly share code, notes, and snippets.

@jo32
Created December 16, 2015 07:58
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 jo32/0602bfec3b7eeace791e to your computer and use it in GitHub Desktop.
Save jo32/0602bfec3b7eeace791e to your computer and use it in GitHub Desktop.
auto toc
var autoToc = (function() {
function getHeadingArray(container, headingStartLevel) {
var array = [];
var currentNode = document.querySelector(container + ' h' + headingStartLevel);
var counter = 0;
while (currentNode) {
if (currentNode.tagName.match(/^H[1-9]$/)) {
var id = "SECTION-" + ++counter;
currentNode.setAttribute('id', id);
array.push({
level: parseInt(currentNode.tagName.slice(1)),
text: currentNode.innerText,
id: id
});
}
currentNode = currentNode.nextSibling;
}
return array;
}
function __multiplyString(tpl, times) {
var s = "";
for (var i = 0; i < times; i++) {
s += tpl;
}
return s;
}
function getTocString(container, headingStartLevel) {
var headingArray = getHeadingArray(container, headingStartLevel);
var s = "";
var depth = headingStartLevel - 1;
headingArray.forEach(function(val) {
if (depth != val.level) {
if (depth < val.level) {
s += __multiplyString("<ol>", Math.abs(val.level - depth));
} else {
s += __multiplyString("</ol>", Math.abs(val.level - depth));
}
}
s += "<li><a href='#" + val.id + "'>" + val.text + "</a></li>";
depth = val.level;
});
s += __multiplyString("</ol>", Math.abs(depth - headingStartLevel + 1));
return s;
}
return function autoToc(opts) {
opts = opts || {};
var headingStartLevel = opts.headingStartLevel || 1;
var container = opts.container;
var target = opts.target;
if (!container) {
throw new Error('option container is not given');
}
if (!target) {
throw new Error('option target is not given');
}
target = Object.prototype.toString.apply(target) == '[object String]' ? document.querySelector(target) : target;
var tocString = getTocString(container, headingStartLevel);
target.innerHTML = tocString;
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment