diff options
Diffstat (limited to 'target/doc/main.js')
-rw-r--r-- | target/doc/main.js | 680 |
1 files changed, 464 insertions, 216 deletions
diff --git a/target/doc/main.js b/target/doc/main.js index 9bb7246..53e3412 100644 --- a/target/doc/main.js +++ b/target/doc/main.js @@ -37,10 +37,63 @@ "associatedconstant", "union"]; + function hasClass(elem, className) { + if (elem && className && elem.className) { + var elemClass = elem.className; + var start = elemClass.indexOf(className); + if (start == -1) { + return false; + } else if (elemClass.length == className.length) { + return true; + } else { + if (start > 0 && elemClass[start - 1] != ' ') { + return false; + } + var end = start + className.length; + if (end < elemClass.length && elemClass[end] != ' ') { + return false; + } + return true; + } + } + return false; + } + + function addClass(elem, className) { + if (elem && className && !hasClass(elem, className)) { + if (elem.className && elem.className.length > 0) { + elem.className += ' ' + className; + } else { + elem.className = className; + } + } + } + + function removeClass(elem, className) { + if (elem && className && elem.className) { + elem.className = (" " + elem.className + " ").replace(" " + className + " ", " ") + .trim(); + } + } + + 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) + } + // used for special search precedence var TY_PRIMITIVE = itemTypes.indexOf("primitive"); - $('.js-only').removeClass('js-only'); + onEach(document.getElementsByClassName('js-only'), function(e) { + removeClass(e, 'js-only'); + }); function getQueryStringParams() { var params = {}; @@ -65,18 +118,28 @@ from = parseInt(match[1], 10); to = Math.min(50000, parseInt(match[2] || match[1], 10)); from = Math.min(from, to); - if ($('#' + from).length === 0) { + var elem = document.getElementById(from); + if (!elem) { return; } - if (ev === null) { $('#' + from)[0].scrollIntoView(); }; - $('.line-numbers span').removeClass('line-highlighted'); + if (ev === null) { + var x = document.getElementById(from); + if (x) { + x.scrollIntoView(); + } + }; + onEach(document.getElementsByClassName('line-numbers'), function(e) { + onEach(e.getElementsByTagName('span'), function(i_e) { + removeClass(i_e, 'line-highlighted'); + }); + }) for (i = from; i <= to; ++i) { - $('#' + i).addClass('line-highlighted'); + addClass(document.getElementById(i), 'line-highlighted'); } } } highlightSourceLines(null); - $(window).on('hashchange', highlightSourceLines); + window.onhashchange = highlightSourceLines; // Gets the human-readable string for the virtual-key code of the // given KeyboardEvent, ev. @@ -99,23 +162,25 @@ } function handleShortcut(ev) { - if (document.activeElement.tagName == "INPUT") + if (document.activeElement.tagName === "INPUT") return; // Don't interfere with browser shortcuts if (ev.ctrlKey || ev.altKey || ev.metaKey) return; + var help = document.getElementById("help"); switch (getVirtualKey(ev)) { case "Escape": - if (!$("#help").hasClass("hidden")) { + var search = document.getElementById("search"); + if (!hasClass(help, "hidden")) { ev.preventDefault(); - $("#help").addClass("hidden"); - $("body").removeClass("blur"); - } else if (!$("#search").hasClass("hidden")) { + addClass(help, "hidden"); + removeClass(document.body, "blur"); + } else if (!hasClass(search, "hidden")) { ev.preventDefault(); - $("#search").addClass("hidden"); - $("#main").removeClass("hidden"); + addClass(search, "hidden"); + removeClass(document.getElementById("main"), "hidden"); } break; @@ -131,42 +196,76 @@ break; case "?": - if (ev.shiftKey && $("#help").hasClass("hidden")) { + if (ev.shiftKey && hasClass(help, "hidden")) { ev.preventDefault(); - $("#help").removeClass("hidden"); - $("body").addClass("blur"); + removeClass(help, "hidden"); + addClass(document.body, "blur"); } break; } } - $(document).on("keypress", handleShortcut); - $(document).on("keydown", handleShortcut); - $(document).on("click", function(ev) { - if (!$(ev.target).closest("#help > div").length) { - $("#help").addClass("hidden"); - $("body").removeClass("blur"); - } - }); + document.onkeypress = handleShortcut; + document.onkeydown = handleShortcut; + document.onclick = function(ev) { + if (hasClass(ev.target, 'collapse-toggle')) { + collapseDocs(ev.target); + } else if (hasClass(ev.target.parentNode, 'collapse-toggle')) { + collapseDocs(ev.target.parentNode); + } else if (ev.target.tagName === 'SPAN' && hasClass(ev.target.parentNode, 'line-numbers')) { + var prev_id = 0; + + var set_fragment = function (name) { + if (browserSupportsHistoryApi()) { + history.replaceState(null, null, '#' + name); + window.hashchange(); + } else { + location.replace('#' + name); + } + }; + + var cur_id = parseInt(ev.target.id, 10); + + if (ev.shiftKey && prev_id) { + if (prev_id > cur_id) { + var tmp = prev_id; + prev_id = cur_id; + cur_id = tmp; + } - $('.version-selector').on('change', function() { - var i, match, - url = document.location.href, - stripped = '', - len = rootPath.match(/\.\.\//g).length + 1; + set_fragment(prev_id + '-' + cur_id); + } else { + prev_id = cur_id; - for (i = 0; i < len; ++i) { - match = url.match(/\/[^\/]*$/); - if (i < len - 1) { - stripped = match[0] + stripped; + set_fragment(cur_id); } - url = url.substring(0, url.length - match[0].length); + } else if (!hasClass(document.getElementById("help"), "hidden")) { + addClass(document.getElementById("help"), "hidden"); + removeClass(document.body, "blur"); } + }; - url += '/' + $('.version-selector').val() + stripped; + var x = document.getElementsByClassName('version-selector'); + if (x.length > 0) { + x[0].onchange = function() { + var i, match, + url = document.location.href, + stripped = '', + len = rootPath.match(/\.\.\//g).length + 1; - document.location.href = url; - }); + for (i = 0; i < len; ++i) { + match = url.match(/\/[^\/]*$/); + if (i < len - 1) { + stripped = match[0] + stripped; + } + url = url.substring(0, url.length - match[0].length); + } + + url += '/' + document.getElementsByClassName('version-selector')[0].value + stripped; + + document.location.href = url; + }; + } /** * A function to compute the Levenshtein distance between two strings @@ -214,8 +313,8 @@ // but only if the input bar is empty. This avoid the obnoxious issue // where you start trying to do a search, and the index loads, and // suddenly your search is gone! - if ($(".search-input")[0].value === "") { - $(".search-input")[0].value = params.search || ''; + if (document.getElementsByClassName("search-input")[0].value === "") { + document.getElementsByClassName("search-input")[0].value = params.search || ''; } /** @@ -484,7 +583,8 @@ } function getQuery() { - var matches, type, query, raw = $('.search-input').val(); + var matches, type, query, raw = + document.getElementsByClassName('search-input')[0].value; query = raw; matches = query.match(/^(fn|mod|struct|enum|trait|type|const|macro)\s*:\s*/i); @@ -502,54 +602,92 @@ } function initSearchNav() { - var hoverTimeout, $results = $('.search-results .result'); + var hoverTimeout; - $results.on('click', function() { - var dst = $(this).find('a')[0]; + var click_func = function(e) { + var el = e.target; + // to retrieve the real "owner" of the event. + while (el.tagName !== 'TR') { + el = el.parentNode; + } + var dst = e.target.getElementsByTagName('a'); + if (dst.length < 1) { + return; + } + dst = dst[0]; if (window.location.pathname === dst.pathname) { - $('#search').addClass('hidden'); - $('#main').removeClass('hidden'); + addClass(document.getElementById('search'), 'hidden'); + removeClass(document.getElementById('main'), 'hidden'); document.location.href = dst.href; } - }).on('mouseover', function() { - var $el = $(this); + }; + var mouseover_func = function(e) { + var el = e.target; + // to retrieve the real "owner" of the event. + while (el.tagName !== 'TR') { + el = el.parentNode; + } clearTimeout(hoverTimeout); hoverTimeout = setTimeout(function() { - $results.removeClass('highlighted'); - $el.addClass('highlighted'); + onEach(document.getElementsByClassName('search-results'), function(e) { + onEach(e.getElementsByClassName('result'), function(i_e) { + removeClass(i_e, 'highlighted'); + }); + }); + addClass(el, 'highlighted'); }, 20); + }; + onEach(document.getElementsByClassName('search-results'), function(e) { + onEach(e.getElementsByClassName('result'), function(i_e) { + i_e.onclick = click_func; + i_e.onmouseover = mouseover_func; + }); }); - $(document).off('keydown.searchnav'); - $(document).on('keydown.searchnav', function(e) { - var $active = $results.filter('.highlighted'); + var search_input = document.getElementsByClassName('search-input')[0]; + search_input.onkeydown = null; + search_input.onkeydown = function(e) { + var actives = []; + onEach(document.getElementsByClassName('search-results'), function(e) { + onEach(document.getElementsByClassName('highlighted'), function(e) { + actives.push(e); + }); + }); if (e.which === 38) { // up - if (!$active.length || !$active.prev()) { + if (!actives.length || !actives[0].previousElementSibling) { return; } - $active.prev().addClass('highlighted'); - $active.removeClass('highlighted'); + addClass(actives[0].previousElementSibling, 'highlighted'); + removeClass(actives[0], 'highlighted'); } else if (e.which === 40) { // down - if (!$active.length) { - $results.first().addClass('highlighted'); - } else if ($active.next().length) { - $active.next().addClass('highlighted'); - $active.removeClass('highlighted'); + if (!actives.length) { + var results = document.getElementsByClassName('search-results'); + if (results.length > 0) { + var res = results[0].getElementsByClassName('result'); + if (res.length > 0) { + addClass(res[0], 'highlighted'); + } + } + } else if (actives[0].nextElementSibling) { + addClass(actives[0].nextElementSibling, 'highlighted'); + removeClass(actives[0], 'highlighted'); } } else if (e.which === 13) { // return - if ($active.length) { - document.location.href = $active.find('a').prop('href'); + if (actives.length) { + document.location.href = actives[0].getElementsByTagName('a')[0].href; } - } else { - $active.removeClass('highlighted'); + } else if (actives.length > 0) { + removeClass(actives[0], 'highlighted'); } - }); + }; } function escape(content) { - return $('<h1/>').text(content).html(); + var h1 = document.createElement('h1'); + h1.textContent = content; + return h1.innerHTML; } function showResults(results) { @@ -609,7 +747,7 @@ displayPath + '<span class="' + type + '">' + name + '</span></a></td><td>' + '<a href="' + href + '">' + - '<span class="desc">' + item.desc + + '<span class="desc">' + escape(item.desc) + ' </span></a></td></tr>'; }); } else { @@ -619,10 +757,19 @@ } output += "</p>"; - $('#main.content').addClass('hidden'); - $('#search.content').removeClass('hidden').html(output); - $('#search .desc').width($('#search').width() - 40 - - $('#search td:first-child').first().width()); + addClass(document.getElementById('main'), 'hidden'); + var search = document.getElementById('search'); + removeClass(search, 'hidden'); + search.innerHTML = output; + var tds = search.getElementsByTagName('td'); + var td_width = 0; + if (tds.length > 0) { + td_width = tds[0].offsetWidth; + } + var width = search.offsetWidth - 40 - td_width; + onEach(search.getElementsByClassName('desc'), function(e) { + e.style.width = width + 'px'; + }); initSearchNav(); } @@ -645,17 +792,15 @@ } // Update document title to maintain a meaningful browser history - $(document).prop("title", "Results for " + query.query + " - Rust"); + document.title = "Results for " + query.query + " - Rust"; // Because searching is incremental by character, only the most // recent search query is added to the browser history. if (browserSupportsHistoryApi()) { if (!history.state && !params.search) { - history.pushState(query, "", "?search=" + - encodeURIComponent(query.raw)); + history.pushState(query, "", "?search=" + encodeURIComponent(query.raw)); } else { - history.replaceState(query, "", "?search=" + - encodeURIComponent(query.raw)); + history.replaceState(query, "", "?search=" + encodeURIComponent(query.raw)); } } @@ -744,49 +889,68 @@ function startSearch() { var searchTimeout; - $(".search-input").on("keyup input",function() { + var callback = function() { + var search_input = document.getElementsByClassName('search-input'); + if (search_input.length < 1) { return; } + search_input = search_input[0]; clearTimeout(searchTimeout); - if ($(this).val().length === 0) { + if (search_input.value.length === 0) { if (browserSupportsHistoryApi()) { history.replaceState("", "std - Rust", "?search="); } - $('#main.content').removeClass('hidden'); - $('#search.content').addClass('hidden'); + var main = document.getElementById('main'); + if (hasClass(main, 'content')) { + removeClass(main, 'hidden'); + } + var search_c = document.getElementById('search'); + if (hasClass(search_c, 'content')) { + addClass(search_c, 'hidden'); + } } else { searchTimeout = setTimeout(search, 500); } - }); - $('.search-form').on('submit', function(e){ + }; + var search_input = document.getElementsByClassName("search-input")[0]; + search_input.onkeyup = callback; + search_input.oninput = callback; + document.getElementsByClassName("search-form")[0].onsubmit = function(e){ e.preventDefault(); clearTimeout(searchTimeout); search(); - }); - $('.search-input').on('change paste', function(e) { + }; + search_input.onchange = function(e) { // Do NOT e.preventDefault() here. It will prevent pasting. clearTimeout(searchTimeout); // zero-timeout necessary here because at the time of event handler execution the // pasted content is not in the input field yet. Shouldn’t make any difference for // change, though. setTimeout(search, 0); - }); + }; + search_input.onpaste = search_input.onchange; // Push and pop states are used to add search results to the browser // history. if (browserSupportsHistoryApi()) { // Store the previous <title> so we can revert back to it later. - var previousTitle = $(document).prop("title"); + var previousTitle = document.title; - $(window).on('popstate', function(e) { + window.onpopstate = function(e) { var params = getQueryStringParams(); // When browsing back from search results the main page // visibility must be reset. if (!params.search) { - $('#main.content').removeClass('hidden'); - $('#search.content').addClass('hidden'); + var main = document.getElementById('main'); + if (hasClass(main, 'content')) { + removeClass(main, 'hidden'); + } + var search_c = document.getElementById('search'); + if (hasClass(search_c, 'content')) { + addClass(search_c, 'hidden'); + } } // Revert to the previous title manually since the History // API ignores the title parameter. - $(document).prop("title", previousTitle); + document.title = previousTitle; // When browsing forward to search results the previous // search will be repeated, so the currentResults are // cleared to ensure the search is successful. @@ -795,35 +959,33 @@ // perform the search. This will empty the bar if there's // nothing there, which lets you really go back to a // previous state with nothing in the bar. - $('.search-input').val(params.search); + if (params.search) { + document.getElementsByClassName('search-input')[0].value = params.search; + } else { + document.getElementsByClassName('search-input')[0].value = ''; + } // Some browsers fire 'onpopstate' for every page load // (Chrome), while others fire the event only when actually // popping a state (Firefox), which is why search() is // called both here and at the end of the startSearch() // function. search(); - }); + }; } search(); } - function plainSummaryLine(markdown) { - markdown.replace(/\n/g, ' ') - .replace(/'/g, "\'") - .replace(/^#+? (.+?)/, "$1") - .replace(/\[(.*?)\]\(.*?\)/g, "$1") - .replace(/\[(.*?)\]\[.*?\]/g, "$1"); - } - index = buildIndex(rawSearchIndex); startSearch(); // Draw a convenient sidebar of known crates if we have a listing if (rootPath === '../') { - var sidebar = $('.sidebar'); - var div = $('<div>').attr('class', 'block crate'); - div.append($('<h3>').text('Crates')); - var ul = $('<ul>').appendTo(div); + var sidebar = document.getElementsByClassName('sidebar')[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) { @@ -836,15 +998,17 @@ if (crates[i] === window.currentCrate) { klass += ' current'; } - if (rawSearchIndex[crates[i]].items[0]) { - var desc = rawSearchIndex[crates[i]].items[0][3]; - var link = $('<a>', {'href': '../' + crates[i] + '/index.html', - 'title': plainSummaryLine(desc), - 'class': klass}).text(crates[i]); - ul.append($('<li>').append(link)); - } + 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.append(div); + sidebar.appendChild(div); } } @@ -852,16 +1016,19 @@ // delayed sidebar rendering. function initSidebarItems(items) { - var sidebar = $('.sidebar'); + var sidebar = document.getElementsByClassName('sidebar')[0]; var current = window.sidebarCurrent; function block(shortty, longty) { var filtered = items[shortty]; if (!filtered) { return; } - var div = $('<div>').attr('class', 'block ' + shortty); - div.append($('<h3>').text(longty)); - var ul = $('<ul>').appendTo(div); + var div = document.createElement('div'); + div.className = 'block ' + shortty; + var h3 = document.createElement('h3'); + h3.textContent = longty; + div.appendChild(h3); + var ul = document.createElement('ul'); for (var i = 0; i < filtered.length; ++i) { var item = filtered[i]; @@ -878,12 +1045,17 @@ } else { path = shortty + '.' + name + '.html'; } - var link = $('<a>', {'href': current.relpath + path, - 'title': desc, - 'class': klass}).text(name); - ul.append($('<li>').append(link)); + var link = document.createElement('a'); + link.href = current.relpath + path; + link.title = desc; + link.className = klass; + link.textContent = name; + var li = document.createElement('li'); + li.appendChild(link); + ul.appendChild(li); } - sidebar.append(div); + div.appendChild(ul); + sidebar.appendChild(div); } block("primitive", "Primitive Types"); @@ -901,21 +1073,25 @@ window.initSidebarItems = initSidebarItems; window.register_implementors = function(imp) { - var list = $('#implementors-list'); + var list = document.getElementById('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]]; for (var j = 0; j < structs.length; ++j) { - var code = $('<code>').append(structs[j]); - $.each(code.find('a'), function(idx, a) { - var href = $(a).attr('href'); + var code = document.createElement('code'); + code.innerHTML = structs[j]; + + var x = code.getElementsByTagName('a'); + for (var k = 0; k < x.length; k++) { + var href = x[k].getAttribute('href'); if (href && href.indexOf('http') !== 0) { - $(a).attr('href', rootPath + href); + x[k].setAttribute('href', rootPath + href); } - }); - var li = $('<li>').append(code); - list.append(li); + } + var li = document.createElement('li'); + li.appendChild(code); + list.appendChild(li); } } }; @@ -923,15 +1099,6 @@ window.register_implementors(window.pending_implementors); } - // See documentation in html/render.rs for what this is doing. - var query = getQueryStringParams(); - if (query['gotosrc']) { - window.location = $('#src-' + query['gotosrc']).attr('href'); - } - if (query['gotomacrosrc']) { - window.location = $('.srclink').attr('href'); - } - function labelForToggleButton(sectionIsCollapsed) { if (sectionIsCollapsed) { // button will expand the section @@ -942,105 +1109,186 @@ return "\u2212"; // "\u2212" is '−' minus sign } + function onEveryMatchingChild(elem, className, func) { + if (elem && className && func) { + for (var i = 0; i < elem.childNodes.length; i++) { + if (hasClass(elem.childNodes[i], className)) { + func(elem.childNodes[i]); + } else { + onEveryMatchingChild(elem.childNodes[i], className, func); + } + } + } + } + function toggleAllDocs() { - var toggle = $("#toggle-all-docs"); - if (toggle.hasClass("will-expand")) { - toggle.removeClass("will-expand"); - toggle.children(".inner").text(labelForToggleButton(false)); - toggle.attr("title", "collapse all docs"); - $(".docblock").show(); - $(".toggle-label").hide(); - $(".toggle-wrapper").removeClass("collapsed"); - $(".collapse-toggle").children(".inner").text(labelForToggleButton(false)); + var toggle = document.getElementById("toggle-all-docs"); + if (hasClass(toggle, "will-expand")) { + 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); + }); + }); } else { - toggle.addClass("will-expand"); - toggle.children(".inner").text(labelForToggleButton(true)); - toggle.attr("title", "expand all docs"); - $(".docblock").hide(); - $(".toggle-label").show(); - $(".toggle-wrapper").addClass("collapsed"); - $(".collapse-toggle").children(".inner").text(labelForToggleButton(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); + }); + }); } } - $("#toggle-all-docs").on("click", toggleAllDocs); - - $(document).on("click", ".collapse-toggle", function() { - var toggle = $(this); - var relatedDoc = toggle.parent().next(); - if (relatedDoc.is(".stability")) { - relatedDoc = relatedDoc.next(); + function collapseDocs(toggle) { + if (!toggle || !toggle.parentNode) { + return; } - if (relatedDoc.is(".docblock")) { - if (relatedDoc.is(":visible")) { - relatedDoc.slideUp({duration: 'fast', easing: 'linear'}); - toggle.parent(".toggle-wrapper").addClass("collapsed"); - toggle.children(".inner").text(labelForToggleButton(true)); - toggle.children(".toggle-label").fadeIn(); + 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')) { + e.style.display = 'inline-block'; + } + if (hasClass(e, 'inner')) { + e.innerHTML = labelForToggleButton(true); + } + }); + addClass(toggle.parentNode, 'collapsed'); } else { - relatedDoc.slideDown({duration: 'fast', easing: 'linear'}); - toggle.parent(".toggle-wrapper").removeClass("collapsed"); - toggle.children(".inner").text(labelForToggleButton(false)); - toggle.children(".toggle-label").hide(); + relatedDoc.style.display = 'block'; + removeClass(toggle.parentNode, 'collapsed'); + onEach(toggle.childNodes, function(e) { + if (hasClass(e, 'toggle-label')) { + e.style.display = 'none'; + } + if (hasClass(e, 'inner')) { + e.innerHTML = labelForToggleButton(false); + } + }); } } - }); - - $(function() { - var toggle = $("<a/>", {'href': 'javascript:void(0)', 'class': 'collapse-toggle'}) - .html("[<span class='inner'></span>]"); - toggle.children(".inner").text(labelForToggleButton(false)); + } - $(".method").each(function() { - if ($(this).next().is(".docblock") || - ($(this).next().is(".stability") && $(this).next().next().is(".docblock"))) { - $(this).children().last().after(toggle.clone()); - } - }); + var x = document.getElementById('toggle-all-docs'); + if (x) { + x.onclick = toggleAllDocs; + } - var mainToggle = - $(toggle).append( - $('<span/>', {'class': 'toggle-label'}) - .css('display', 'none') - .html(' Expand description')); - var wrapper = $("<div class='toggle-wrapper'>").append(mainToggle); - $("#main > .docblock").before(wrapper); - }); + function insertAfter(newNode, referenceNode) { + referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling); + } - $('pre.line-numbers').on('click', 'span', function() { - var prev_id = 0; + var toggle = document.createElement('a'); + toggle.href = 'javascript:void(0)'; + toggle.className = 'collapse-toggle'; + toggle.innerHTML = "[<span class='inner'>"+labelForToggleButton(false)+"</span>]"; - function set_fragment(name) { - if (browserSupportsHistoryApi()) { - history.replaceState(null, null, '#' + name); - $(window).trigger('hashchange'); - } else { - location.replace('#' + name); - } + var func = function(e) { + var next = e.nextElementSibling; + if (!next) { + return; } + if (hasClass(next, 'docblock') || + (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-items'), function(e) { + onEach(e.getElementsByClassName('associatedconstant'), func); + }); - return function(ev) { - var cur_id = parseInt(ev.target.id, 10); + var span = document.createElement('span'); + span.className = 'toggle-label'; + span.style.display = 'none'; + span.innerHTML = ' Expand description'; - if (ev.shiftKey && prev_id) { - if (prev_id > cur_id) { - var tmp = prev_id; - prev_id = cur_id; - cur_id = tmp; - } + var mainToggle = toggle.cloneNode(true); + mainToggle.appendChild(span); - set_fragment(prev_id + '-' + cur_id); - } else { - prev_id = cur_id; + var wrapper = document.createElement('div'); + wrapper.className = 'toggle-wrapper'; + wrapper.appendChild(mainToggle); - set_fragment(cur_id); - } - }; - }()); + onEach(document.getElementById('main').getElementsByClassName('docblock'), function(e) { + if (e.parentNode.id === "main") { + e.parentNode.insertBefore(wrapper, e); + } + }); + onEach(document.getElementsByClassName('docblock'), function(e) { + if (hasClass(e, 'autohide')) { + var wrap = e.previousElementSibling; + if (wrap && hasClass(wrap, 'toggle-wrapper')) { + var toggle = wrap.childNodes[0]; + if (e.childNodes[0].tagName === 'H3') { + onEach(toggle.getElementsByClassName('toggle-label'), function(i_e) { + i_e.innerHTML = " Show " + e.childNodes[0].innerHTML; + }); + } + e.style.display = 'none'; + addClass(wrap, 'collapsed'); + onEach(toggle.getElementsByClassName('inner'), function(e) { + e.innerHTML = labelForToggleButton(true); + }); + onEach(toggle.getElementsByClassName('toggle-label'), function(e) { + e.style.display = 'block'; + }); + } + } + }) + + var span = document.createElement('span'); + span.className = 'toggle-label'; + span.style.display = 'none'; + span.innerHTML = ' Expand attributes'; + toggle.appendChild(span); + + var wrapper = document.createElement('div'); + wrapper.className = 'toggle-wrapper toggle-attributes'; + wrap |