diff options
Diffstat (limited to 'target/doc/main.js')
-rw-r--r-- | target/doc/main.js | 398 |
1 files changed, 270 insertions, 128 deletions
diff --git a/target/doc/main.js b/target/doc/main.js index f688be8..3c115e2 100644 --- a/target/doc/main.js +++ b/target/doc/main.js @@ -49,6 +49,13 @@ var themesWidth = null; + if (!String.prototype.startsWith) { + String.prototype.startsWith = function(searchString, position) { + position = position || 0; + return this.indexOf(searchString, position) === position; + }; + } + function hasClass(elem, className) { if (elem && className && elem.className) { var elemClass = elem.className; @@ -96,14 +103,6 @@ } } - function onEach(arr, func) { - if (arr && arr.length > 0 && func) { - for (var i = 0; i < arr.length; i++) { - func(arr[i]); - } - } - } - function isHidden(elem) { return (elem.offsetParent === null) } @@ -247,49 +246,59 @@ } } - function handleShortcut(ev) { - if (document.activeElement.tagName === "INPUT") - return; + function handleEscape(ev, help) { + hideModal(); + var search = document.getElementById("search"); + if (!hasClass(help, "hidden")) { + displayHelp(false, ev); + } else if (!hasClass(search, "hidden")) { + ev.preventDefault(); + addClass(search, "hidden"); + removeClass(document.getElementById("main"), "hidden"); + } + defocusSearchBar(); + } + function handleShortcut(ev) { // Don't interfere with browser shortcuts - if (ev.ctrlKey || ev.altKey || ev.metaKey) + if (ev.ctrlKey || ev.altKey || ev.metaKey) { return; + } var help = document.getElementById("help"); - switch (getVirtualKey(ev)) { - case "Escape": - hideModal(); - var search = document.getElementById("search"); - if (!hasClass(help, "hidden")) { - displayHelp(false, ev); - } else if (!hasClass(search, "hidden")) { - ev.preventDefault(); - addClass(search, "hidden"); - removeClass(document.getElementById("main"), "hidden"); + if (document.activeElement.tagName === "INPUT") { + switch (getVirtualKey(ev)) { + case "Escape": + handleEscape(ev, help); + break; } - defocusSearchBar(); - break; + } else { + switch (getVirtualKey(ev)) { + case "Escape": + handleEscape(ev, help); + break; - case "s": - case "S": - displayHelp(false, ev); - hideModal(); - ev.preventDefault(); - focusSearchBar(); - break; + case "s": + case "S": + displayHelp(false, ev); + hideModal(); + ev.preventDefault(); + focusSearchBar(); + break; - case "+": - case "-": - ev.preventDefault(); - toggleAllDocs(); - break; + case "+": + case "-": + ev.preventDefault(); + toggleAllDocs(); + break; - case "?": - if (ev.shiftKey) { - hideModal(); - displayHelp(true, ev); + case "?": + if (ev.shiftKey) { + hideModal(); + displayHelp(true, ev); + } + break; } - break; } } @@ -297,9 +306,9 @@ document.onkeydown = handleShortcut; document.onclick = function(ev) { if (hasClass(ev.target, 'collapse-toggle')) { - collapseDocs(ev.target); + collapseDocs(ev.target, "toggle"); } else if (hasClass(ev.target.parentNode, 'collapse-toggle')) { - collapseDocs(ev.target.parentNode); + collapseDocs(ev.target.parentNode, "toggle"); } else if (ev.target.tagName === 'SPAN' && hasClass(ev.target.parentNode, 'line-numbers')) { var prev_id = 0; @@ -1162,6 +1171,10 @@ return h1.innerHTML; } + function pathSplitter(path) { + return '<span>' + path.replace(/::/g, '::</span><span>'); + } + function addTab(array, query, display) { var extraStyle = ''; if (display === false) { @@ -1216,7 +1229,7 @@ output += '<tr class="' + type + ' result"><td>' + '<a href="' + href + '">' + - displayPath + '<span class="' + type + '">' + + pathSplitter(displayPath) + '<span class="' + type + '">' + name + '</span></a></td><td>' + '<a href="' + href + '">' + '<span class="desc">' + escape(item.desc) + @@ -1465,36 +1478,38 @@ // Draw a convenient sidebar of known crates if we have a listing if (rootPath === '../') { var sidebar = document.getElementsByClassName('sidebar-elems')[0]; - var div = document.createElement('div'); - div.className = 'block crate'; - div.innerHTML = '<h3>Crates</h3>'; - var ul = document.createElement('ul'); - div.appendChild(ul); - - var crates = []; - for (var crate in rawSearchIndex) { - if (!rawSearchIndex.hasOwnProperty(crate)) { - continue; + if (sidebar) { + var div = document.createElement('div'); + div.className = 'block crate'; + div.innerHTML = '<h3>Crates</h3>'; + var ul = document.createElement('ul'); + div.appendChild(ul); + + var crates = []; + for (var crate in rawSearchIndex) { + if (!rawSearchIndex.hasOwnProperty(crate)) { + continue; + } + crates.push(crate); } - crates.push(crate); - } - crates.sort(); - for (var i = 0; i < crates.length; ++i) { - var klass = 'crate'; - if (crates[i] === window.currentCrate) { - klass += ' current'; + crates.sort(); + for (var i = 0; i < crates.length; ++i) { + var klass = 'crate'; + if (crates[i] === window.currentCrate) { + klass += ' current'; + } + var link = document.createElement('a'); + link.href = '../' + crates[i] + '/index.html'; + link.title = rawSearchIndex[crates[i]].doc; + link.className = klass; + link.textContent = crates[i]; + + var li = document.createElement('li'); + li.appendChild(link); + ul.appendChild(li); } - var link = document.createElement('a'); - link.href = '../' + crates[i] + '/index.html'; - link.title = rawSearchIndex[crates[i]].doc; - link.className = klass; - link.textContent = crates[i]; - - var li = document.createElement('li'); - li.appendChild(link); - ul.appendChild(li); + sidebar.appendChild(div); } - sidebar.appendChild(div); } } @@ -1563,14 +1578,31 @@ window.initSidebarItems = initSidebarItems; window.register_implementors = function(imp) { - var list = document.getElementById('implementors-list'); + var implementors = document.getElementById('implementors-list'); + var synthetic_implementors = document.getElementById('synthetic-implementors-list'); + var libs = Object.getOwnPropertyNames(imp); for (var i = 0; i < libs.length; ++i) { if (libs[i] === currentCrate) { continue; } var structs = imp[libs[i]]; + + struct_loop: for (var j = 0; j < structs.length; ++j) { + var struct = structs[j]; + + var list = struct.synthetic ? synthetic_implementors : implementors; + + if (struct.synthetic) { + for (var k = 0; k < struct.types.length; k++) { + if (window.inlined_types.has(struct.types[k])) { + continue struct_loop; + } + window.inlined_types.add(struct.types[k]); + } + } + var code = document.createElement('code'); - code.innerHTML = structs[j]; + code.innerHTML = struct.text; var x = code.getElementsByTagName('a'); for (var k = 0; k < x.length; k++) { @@ -1614,81 +1646,155 @@ function toggleAllDocs() { var toggle = document.getElementById("toggle-all-docs"); if (hasClass(toggle, "will-expand")) { + updateLocalStorage("rustdoc-collapse", "false"); removeClass(toggle, "will-expand"); onEveryMatchingChild(toggle, "inner", function(e) { e.innerHTML = labelForToggleButton(false); }); toggle.title = "collapse all docs"; - onEach(document.getElementsByClassName("docblock"), function(e) { - e.style.display = 'block'; - }); - onEach(document.getElementsByClassName("toggle-label"), function(e) { - e.style.display = 'none'; - }); - onEach(document.getElementsByClassName("toggle-wrapper"), function(e) { - removeClass(e, "collapsed"); - }); onEach(document.getElementsByClassName("collapse-toggle"), function(e) { - onEveryMatchingChild(e, "inner", function(i_e) { - i_e.innerHTML = labelForToggleButton(false); - }); + collapseDocs(e, "show"); }); } else { + updateLocalStorage("rustdoc-collapse", "true"); addClass(toggle, "will-expand"); onEveryMatchingChild(toggle, "inner", function(e) { e.innerHTML = labelForToggleButton(true); }); toggle.title = "expand all docs"; - onEach(document.getElementsByClassName("docblock"), function(e) { - e.style.display = 'none'; - }); - onEach(document.getElementsByClassName("toggle-label"), function(e) { - e.style.display = 'inline-block'; - }); - onEach(document.getElementsByClassName("toggle-wrapper"), function(e) { - addClass(e, "collapsed"); - }); + onEach(document.getElementsByClassName("collapse-toggle"), function(e) { - onEveryMatchingChild(e, "inner", function(i_e) { - i_e.innerHTML = labelForToggleButton(true); - }); + collapseDocs(e, "hide"); }); } } - function collapseDocs(toggle) { + function collapseDocs(toggle, mode) { if (!toggle || !toggle.parentNode) { return; } - var relatedDoc = toggle.parentNode.nextElementSibling; - if (hasClass(relatedDoc, "stability")) { - relatedDoc = relatedDoc.nextElementSibling; - } - if (hasClass(relatedDoc, "docblock")) { - if (!isHidden(relatedDoc)) { - relatedDoc.style.display = 'none'; - onEach(toggle.childNodes, function(e) { - if (hasClass(e, 'toggle-label')) { + + function adjustToggle(arg) { + return function(e) { + if (hasClass(e, 'toggle-label')) { + if (arg) { e.style.display = 'inline-block'; + } else { + e.style.display = 'none'; } - if (hasClass(e, 'inner')) { - e.innerHTML = labelForToggleButton(true); + } + if (hasClass(e, 'inner')) { + e.innerHTML = labelForToggleButton(arg); + } + }; + }; + + if (!hasClass(toggle.parentNode, "impl")) { + var relatedDoc = toggle.parentNode.nextElementSibling; + if (hasClass(relatedDoc, "stability")) { + relatedDoc = relatedDoc.nextElementSibling; + } + if (hasClass(relatedDoc, "docblock")) { + var action = mode; + if (action === "toggle") { + if (hasClass(relatedDoc, "hidden-by-usual-hider")) { + action = "show"; + } else { + action = "hide"; } - }); - addClass(toggle.parentNode, 'collapsed'); - } else { - relatedDoc.style.display = 'block'; - removeClass(toggle.parentNode, 'collapsed'); - onEach(toggle.childNodes, function(e) { - if (hasClass(e, 'toggle-label')) { - e.style.display = 'none'; + } + if (action === "hide") { + addClass(relatedDoc, "hidden-by-usual-hider"); + onEach(toggle.childNodes, adjustToggle(true)); + addClass(toggle.parentNode, 'collapsed'); + } else if (action === "show") { + removeClass(relatedDoc, "hidden-by-usual-hider"); + removeClass(toggle.parentNode, 'collapsed'); + onEach(toggle.childNodes, adjustToggle(false)); + } + } + } else { + // we are collapsing the impl block + function implHider(addOrRemove) { + return function(n) { + var is_method = hasClass(n, "method"); + if (is_method || hasClass(n, "type")) { + if (is_method === true) { + if (addOrRemove) { + addClass(n, "hidden-by-impl-hider"); + } else { + removeClass(n, "hidden-by-impl-hider"); + } + } + var ns = n.nextElementSibling; + while (true) { + if (ns && ( + hasClass(ns, "docblock") || + hasClass(ns, "stability"))) { + if (addOrRemove) { + addClass(ns, "hidden-by-impl-hider"); + } else { + removeClass(ns, "hidden-by-impl-hider"); + } + ns = ns.nextElementSibling; + continue; + } + break; + } } - if (hasClass(e, 'inner')) { - e.innerHTML = labelForToggleButton(false); + } + } + + var relatedDoc = toggle.parentNode; + var docblock = relatedDoc.nextElementSibling; + + while (!hasClass(relatedDoc, "impl-items")) { + relatedDoc = relatedDoc.nextElementSibling; + } + + if (!relatedDoc && !hasClass(docblock, "docblock")) { + return; + } + + // Hide all functions, but not associated types/consts + + var action = mode; + if (action === "toggle") { + if (hasClass(relatedDoc, "fns-now-collapsed") || + hasClass(docblock, "hidden-by-impl-hider")) { + action = "show"; + } else { + action = "hide"; + } + } + + if (action === "show") { + removeClass(relatedDoc, "fns-now-collapsed"); + removeClass(docblock, "hidden-by-usual-hider"); + onEach(toggle.childNodes, adjustToggle(false)); + onEach(relatedDoc.childNodes, implHider(false)); + } else if (action === "hide") { + addClass(relatedDoc, "fns-now-collapsed"); + addClass(docblock, "hidden-by-usual-hider"); + onEach(toggle.childNodes, adjustToggle(true)); + onEach(relatedDoc.childNodes, implHider(true)); + } + } + } + + function autoCollapseAllImpls() { + // Automatically minimize all non-inherent impls + onEach(document.getElementsByClassName('impl'), function(n) { + // inherent impl ids are like 'impl' or impl-<number>' + var inherent = (n.id.match(/^impl(?:-\d+)?$/) !== null); + if (!inherent) { + onEach(n.childNodes, function(m) { + if (hasClass(m, "collapse-toggle")) { + collapseDocs(m, "hide"); } }); } - } + }); } var x = document.getElementById('toggle-all-docs'); @@ -1700,32 +1806,55 @@ referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling); } + function checkIfThereAreMethods(elems) { + var areThereMethods = false; + + onEach(elems, function(e) { + if (hasClass(e, "method")) { + areThereMethods = true; + return true; + } + }); + return areThereMethods; + } + var toggle = document.createElement('a'); toggle.href = 'javascript:void(0)'; toggle.className = 'collapse-toggle'; - toggle.innerHTML = "[<span class='inner'>"+labelForToggleButton(false)+"</span>]"; + toggle.innerHTML = "[<span class='inner'>" + labelForToggleButton(false) + "</span>]"; var func = function(e) { var next = e.nextElementSibling; + if (hasClass(e, 'impl') && next && hasClass(next, 'docblock')) { + next = next.nextElementSibling; + } if (!next) { return; } - if (hasClass(next, 'docblock') || - (hasClass(next, 'stability') && - hasClass(next.nextElementSibling, 'docblock'))) { + if ((checkIfThereAreMethods(next.childNodes) || hasClass(e, 'method')) && + (hasClass(next, 'docblock') || + hasClass(e, 'impl') || + (hasClass(next, 'stability') && + hasClass(next.nextElementSibling, 'docblock')))) { insertAfter(toggle.cloneNode(true), e.childNodes[e.childNodes.length - 1]); } } onEach(document.getElementsByClassName('method'), func); + onEach(document.getElementsByClassName('impl'), func); onEach(document.getElementsByClassName('impl-items'), function(e) { onEach(e.getElementsByClassName('associatedconstant'), func); }); - function createToggle() { + function createToggle(otherMessage) { var span = document.createElement('span'); span.className = 'toggle-label'; span.style.display = 'none'; - span.innerHTML = ' Expand description'; + if (!otherMessage) { + span.innerHTML = ' Expand description'; + } else { + span.innerHTML = otherMessage; + span.style.fontSize = '20px'; + } var mainToggle = toggle.cloneNode(true); mainToggle.appendChild(span); @@ -1738,7 +1867,14 @@ onEach(document.getElementById('main').getElementsByClassName('docblock'), function(e) { if (e.parentNode.id === "main") { - e.parentNode.insertBefore(createToggle(), e); + var otherMessage; + if (hasClass(e, "type-decl")) { + otherMessage = ' Show type declaration'; + } + e.parentNode.insertBefore(createToggle(otherMessage), e); + if (otherMessage) { + collapseDocs(e.previousSibling.childNodes[0], "toggle"); + } } }); @@ -1764,6 +1900,8 @@ } }) + autoCollapseAllImpls(); + function createToggleWrapper() { var span = document.createElement('span'); span.className = 'toggle-label'; @@ -1804,7 +1942,7 @@ onEach(document.getElementById('main').getElementsByTagName('pre'), function(e) { onEach(e.getElementsByClassName('attributes'), function(i_e) { i_e.parentNode.insertBefore(createToggleWrapper(), i_e); - collapseDocs(i_e.previousSibling.childNodes[0]); + collapseDocs(i_e.previousSibling.childNodes[0], "toggle"); }); }); @@ -1890,6 +2028,10 @@ window.onresize = function() { hideSidebar(); }; + + if (getCurrentValue("rustdoc-collapse") === "true") { + toggleAllDocs(); + } }()); // Sets the focus on the search bar at the top of the page |