You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.2 KiB
80 lines
2.2 KiB
function filterToc(toc, callback) {
|
|
var li = toc.firstChild;
|
|
var allmatched = true;
|
|
while (li) {
|
|
if (li.nodeType == Node.ELEMENT_NODE) {
|
|
var id = li.firstChild.hash.substr(1);
|
|
var target = document.getElementById(id);
|
|
var matched = false;
|
|
while (target && !matched && target != document.body) {
|
|
if (target.className == 'impl')
|
|
matched = true;
|
|
else
|
|
target = target.parentNode;
|
|
}
|
|
if (matched) {
|
|
li.className = 'impl';
|
|
} else {
|
|
allmatched = false;
|
|
var ol = li.getElementsByTagName('ol')[0];
|
|
if (ol)
|
|
filterToc(ol);
|
|
}
|
|
}
|
|
li = li.nextSibling;
|
|
}
|
|
if (allmatched)
|
|
toc.className += ' impl';
|
|
}
|
|
|
|
function initToc() {
|
|
var ols = document.getElementsByTagName('ol');
|
|
var toc;
|
|
for (var index = 0; index < ols.length; index += 1) {
|
|
if (ols[index].className == 'toc') {
|
|
toc = ols[index];
|
|
break;
|
|
}
|
|
}
|
|
if (!toc)
|
|
throw "Failed to find TOC";
|
|
|
|
// filter 'impl' bits
|
|
filterToc(toc);
|
|
|
|
if (toc.getElementsByTagName('ol').length < 10)
|
|
return; // don't bother generating minitoc if there's not much to minify
|
|
|
|
// generate short toc once it's done
|
|
var newtoc = document.createElement('ol');
|
|
newtoc.className = 'brief toc';
|
|
var li = toc.firstChild;
|
|
var id = 1;
|
|
while (li) {
|
|
if (li.nodeType == Node.ELEMENT_NODE) {
|
|
var newli = document.createElement('li');
|
|
newli.className = li.className;
|
|
var newa = li.firstChild.cloneNode(true);
|
|
li.id = 'auto-toc-' + id;
|
|
newa.href = '#auto-toc-' + id;
|
|
newli.appendChild(newa);
|
|
newtoc.appendChild(newli);
|
|
id += 1;
|
|
}
|
|
li = li.nextSibling;
|
|
}
|
|
var scrollPos = scrollY;
|
|
var originalTop = toc.offsetTop;
|
|
toc.parentNode.insertBefore(newtoc, toc);
|
|
var h3 = document.createElement('h3');
|
|
h3.textContent = 'Full table of contents';
|
|
toc.parentNode.insertBefore(h3, toc);
|
|
if (scrollPos >= originalTop)
|
|
scrollTo(scrollX, scrollPos + (toc.offsetTop - originalTop));
|
|
}
|
|
|
|
// setup
|
|
var tocTimer = new Date();
|
|
initToc();
|
|
if (getCookie('profile') == '1')
|
|
document.getElementsByTagName('h2')[0].textContent += '; toc.js: ' + (new Date() - tocTimer) + 'ms';
|