diff options
Diffstat (limited to 'doc/godocs.js')
-rw-r--r-- | doc/godocs.js | 294 |
1 files changed, 138 insertions, 156 deletions
diff --git a/doc/godocs.js b/doc/godocs.js index 8fd32fef0..5d12da131 100644 --- a/doc/godocs.js +++ b/doc/godocs.js @@ -1,213 +1,195 @@ -// Except as noted, this content is licensed under Creative Commons -// Attribution 3.0 +// Copyright 2012 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. /* A little code to ease navigation of these documents. * * On window load we: - * + Generate a table of contents (godocs_generateTOC) - * + Add links up to the top of the doc from each section (godocs_addTopLinks) + * + Bind search box hint placeholder show/hide events (bindSearchEvents) + * + Generate a table of contents (generateTOC) + * + Bind foldable sections (bindToggles) + * + Bind links to foldable sections (bindToggleLinks) */ -/* We want to do some stuff on page load (after the HTML is rendered). - So listen for that: - */ -function bindEvent(el, e, fn) { - if (el.addEventListener){ - el.addEventListener(e, fn, false); - } else if (el.attachEvent){ - el.attachEvent('on'+e, fn); - } -} +(function() { +'use strict'; -function godocs_bindSearchEvents() { - var search = document.getElementById('search'); - if (!search) { - // no search box (index disabled) - return; +function bindSearchEvents() { + + var search = $('#search'); + if (search.length === 0) { + return; // no search box } + function clearInactive() { - if (search.className == "inactive") { - search.value = ""; - search.className = ""; + if (search.is('.inactive')) { + search.val(''); + search.removeClass('inactive'); } } + function restoreInactive() { - if (search.value !== "") { + if (search.val() !== '') { return; } - if (search.type != "search") { - search.value = search.getAttribute("placeholder"); - } - search.className = "inactive"; + search.val(search.attr('placeholder')); + search.addClass('inactive'); } + + search.on('focus', clearInactive); + search.on('blur', restoreInactive); + restoreInactive(); - bindEvent(search, 'focus', clearInactive); - bindEvent(search, 'blur', restoreInactive); } -/* Returns the "This sweet header" from <h2>This <i>sweet</i> header</h2>. - * Takes a node, returns a string. +/* Generates a table of contents: looks for h2 and h3 elements and generates + * links. "Decorates" the element with id=="nav" with this table of contents. */ -function godocs_nodeToText(node) { - var TEXT_NODE = 3; // Defined in Mozilla but not MSIE :( - - var text = ''; - for (var j = 0; j != node.childNodes.length; j++) { - var child = node.childNodes[j]; - if (child.nodeType == TEXT_NODE) { - if (child.nodeValue != '[Top]') { //ok, that's a hack, but it works. - text = text + child.nodeValue; - } - } else { - text = text + godocs_nodeToText(child); - } +function generateTOC() { + if ($('#manual-nav').length > 0) { + return; } - return text; -} -/* Generates a table of contents: looks for h2 and h3 elements and generates - * links. "Decorates" the element with id=="nav" with this table of contents. - */ -function godocs_generateTOC() { - if (document.getElementById('manual-nav')) { return; } - var navbar = document.getElementById('nav'); - if (!navbar) { return; } + var nav = $('#nav'); + if (nav.length === 0) { + return; + } var toc_items = []; - - var i; - var seenNav = false; - for (i = 0; i < navbar.parentNode.childNodes.length; i++) { - var node = navbar.parentNode.childNodes[i]; - if (!seenNav) { - if (node.id == 'nav') { - seenNav = true; - } - continue; - } - if ((node.tagName != 'h2') && (node.tagName != 'H2') && - (node.tagName != 'h3') && (node.tagName != 'H3')) { - continue; - } - if (!node.id) { - node.id = 'tmp_' + i; - } - var text = godocs_nodeToText(node); - if (!text) { continue; } - - var textNode = document.createTextNode(text); - - var link = document.createElement('a'); - link.href = '#' + node.id; - link.appendChild(textNode); - - // Then create the item itself + $(nav).nextAll('h2, h3').each(function() { + var node = this; + if (node.id == '') + node.id = 'tmp_' + toc_items.length; + var link = $('<a/>').attr('href', '#' + node.id).text($(node).text()); var item; - if ((node.tagName == 'h2') || (node.tagName == 'H2')) { - item = document.createElement('dt'); + if ($(node).is('h2')) { + item = $('<dt/>'); } else { // h3 - item = document.createElement('dd'); + item = $('<dd/>'); } - - item.appendChild(link); + item.append(link); toc_items.push(item); + }); + if (toc_items.length <= 1) { + return; } - if (toc_items.length <= 1) { return; } - - var dl1 = document.createElement('dl'); - var dl2 = document.createElement('dl'); + var dl1 = $('<dl/>'); + var dl2 = $('<dl/>'); var split_index = (toc_items.length / 2) + 1; if (split_index < 8) { split_index = toc_items.length; } - - for (i = 0; i < split_index; i++) { - dl1.appendChild(toc_items[i]); + for (var i = 0; i < split_index; i++) { + dl1.append(toc_items[i]); } for (/* keep using i */; i < toc_items.length; i++) { - dl2.appendChild(toc_items[i]); + dl2.append(toc_items[i]); } - var tocTable = document.createElement('table'); - navbar.appendChild(tocTable); - tocTable.className = 'unruled'; - var tocBody = document.createElement('tbody'); - tocTable.appendChild(tocBody); - - var tocRow = document.createElement('tr'); - tocBody.appendChild(tocRow); + var tocTable = $('<table class="unruled"/>').appendTo(nav); + var tocBody = $('<tbody/>').appendTo(tocTable); + var tocRow = $('<tr/>').appendTo(tocBody); // 1st column - var tocCell = document.createElement('td'); - tocCell.className = 'first'; - tocRow.appendChild(tocCell); - tocCell.appendChild(dl1); - + $('<td class="first"/>').appendTo(tocRow).append(dl1); // 2nd column - tocCell = document.createElement('td'); - tocRow.appendChild(tocCell); - tocCell.appendChild(dl2); -} - -function getElementsByClassName(base, clazz) { - if (base.getElementsByClassName) { - return base.getElementsByClassName(clazz); - } - var elements = base.getElementsByTagName('*'), foundElements = []; - for (var n in elements) { - if (clazz == elements[n].className) { - foundElements.push(elements[n]); - } - } - return foundElements; + $('<td/>').appendTo(tocRow).append(dl2); } -function godocs_bindToggle(el) { - var button = getElementsByClassName(el, "toggleButton"); - var callback = function() { - if (el.className == "toggle") { - el.className = "toggleVisible"; +function bindToggle(el) { + $('.toggleButton', el).click(function() { + if ($(el).is('.toggle')) { + $(el).addClass('toggleVisible').removeClass('toggle'); } else { - el.className = "toggle"; + $(el).addClass('toggle').removeClass('toggleVisible'); } - }; - for (var i = 0; i < button.length; i++) { - bindEvent(button[i], "click", callback); - } + }); } -function godocs_bindToggles(className) { - var els = getElementsByClassName(document, className); - for (var i = 0; i < els.length; i++) { - godocs_bindToggle(els[i]); - } +function bindToggles(selector) { + $(selector).each(function(i, el) { + bindToggle(el); + }); } -function godocs_bindToggleLink(l, prefix) { - bindEvent(l, "click", function() { - var i = l.href.indexOf("#"+prefix); + +function bindToggleLink(el, prefix) { + $(el).click(function() { + var href = $(el).attr('href'); + var i = href.indexOf('#'+prefix); if (i < 0) { return; } - var id = prefix + l.href.slice(i+1+prefix.length); - var eg = document.getElementById(id); - eg.className = "toggleVisible"; + var id = '#' + prefix + href.slice(i+1+prefix.length); + if ($(id).is('.toggle')) { + $(id).find('.toggleButton').first().click(); + } }); } -function godocs_bindToggleLinks(className, prefix) { - var links = getElementsByClassName(document, className); - for (i = 0; i < links.length; i++) { - godocs_bindToggleLink(links[i], prefix); +function bindToggleLinks(selector, prefix) { + $(selector).each(function(i, el) { + bindToggleLink(el, prefix); + }); +} + +function setupDropdownPlayground() { + if (!$('#page').is('.wide')) { + return; // don't show on front page } + var button = $('#playgroundButton'); + var div = $('#playground'); + var setup = false; + button.toggle(function() { + button.addClass('active'); + div.show(); + if (setup) { + return; + } + setup = true; + playground({ + 'codeEl': $('.code', div), + 'outputEl': $('.output', div), + 'runEl': $('.run', div), + 'fmtEl': $('.fmt', div), + 'shareEl': $('.share', div), + 'shareRedirect': 'http://play.golang.org/p/' + }); + }, + function() { + button.removeClass('active'); + div.hide(); + }); + button.show(); + $('#menu').css('min-width', '+=60'); } -function godocs_onload() { - godocs_bindSearchEvents(); - godocs_generateTOC(); - godocs_bindToggles("toggle"); - godocs_bindToggles("toggleVisible"); - godocs_bindToggleLinks("exampleLink", "example_"); - godocs_bindToggleLinks("overviewLink", ""); +// fixFocus tries to put focus to div#page so that keyboard navigation works. +function fixFocus() { + var page = $('div#page'); + var topbar = $('div#topbar'); + page.css('outline', 0); // disable outline when focused + page.attr('tabindex', -1); // and set tabindex so that it is focusable + $(window).resize(function (evt) { + // only focus page when the topbar is at fixed position (that is, it's in + // front of page, and keyboard event will go to the former by default.) + // by focusing page, keyboard event will go to page so that up/down arrow, + // space, etc. will work as expected. + if (topbar.css('position') == "fixed") + page.focus(); + }).resize(); } -bindEvent(window, 'load', godocs_onload); +$(document).ready(function() { + bindSearchEvents(); + generateTOC(); + bindToggles(".toggle"); + bindToggles(".toggleVisible"); + bindToggleLinks(".exampleLink", "example_"); + bindToggleLinks(".overviewLink", ""); + bindToggleLinks(".examplesLink", ""); + bindToggleLinks(".indexLink", ""); + setupDropdownPlayground(); + fixFocus(); +}); + +})(); |