mirror of
https://github.com/golang/go
synced 2024-11-24 21:30:10 -07:00
84c7e83b4c
Uses placeholder attribute instead of changing the value of search field on browsers that support it. On other browsers, the fake placeholder text is restored when the empty box loses focus. R=golang-dev, gri CC=golang-dev https://golang.org/cl/4441041
187 lines
4.9 KiB
JavaScript
187 lines
4.9 KiB
JavaScript
// Except as noted, this content is licensed under Creative Commons
|
|
// Attribution 3.0
|
|
|
|
/* 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)
|
|
*/
|
|
|
|
/* 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);
|
|
}
|
|
}
|
|
bindEvent(window, 'load', godocs_onload);
|
|
|
|
function godocs_onload() {
|
|
godocs_bindSearchEvents();
|
|
godocs_generateTOC();
|
|
godocs_addTopLinks();
|
|
}
|
|
|
|
function godocs_bindSearchEvents() {
|
|
var search = document.getElementById('search');
|
|
function clearInactive() {
|
|
if (search.className == "inactive") {
|
|
search.value = "";
|
|
search.className = "";
|
|
}
|
|
}
|
|
function restoreInactive() {
|
|
if (search.value != "") {
|
|
return;
|
|
}
|
|
if (search.type != "search") {
|
|
search.value = search.getAttribute("placeholder");
|
|
}
|
|
search.className = "inactive";
|
|
}
|
|
restoreInactive();
|
|
bindEvent(search, 'focus', clearInactive);
|
|
bindEvent(search, 'blur', restoreInactive);
|
|
}
|
|
|
|
/* 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() {
|
|
var navbar = document.getElementById('nav');
|
|
if (!navbar) { return; }
|
|
|
|
var toc_items = [];
|
|
|
|
var i;
|
|
for (i = 0; i < navbar.parentNode.childNodes.length; i++) {
|
|
var node = navbar.parentNode.childNodes[i];
|
|
if ((node.tagName == 'h2') || (node.tagName == 'H2')) {
|
|
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
|
|
var item = document.createElement('dt');
|
|
|
|
item.appendChild(link);
|
|
toc_items.push(item);
|
|
}
|
|
if ((node.tagName == 'h3') || (node.tagName == 'H3')) {
|
|
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
|
|
var item = document.createElement('dd');
|
|
|
|
item.appendChild(link);
|
|
toc_items.push(item);
|
|
}
|
|
}
|
|
|
|
if (!toc_items.length) { return; }
|
|
|
|
var dl1 = document.createElement('dl');
|
|
var dl2 = document.createElement('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 (/* keep using i */; i < toc_items.length; i++) {
|
|
dl2.appendChild(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);
|
|
|
|
// 1st column
|
|
var tocCell = document.createElement('td');
|
|
tocCell.className = 'first';
|
|
tocRow.appendChild(tocCell);
|
|
tocCell.appendChild(dl1);
|
|
|
|
// 2nd column
|
|
tocCell = document.createElement('td');
|
|
tocRow.appendChild(tocCell);
|
|
tocCell.appendChild(dl2);
|
|
}
|
|
|
|
/* Returns the "This sweet header" from <h2>This <i>sweet</i> header</h2>.
|
|
* Takes a node, returns a string.
|
|
*/
|
|
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);
|
|
}
|
|
}
|
|
return text;
|
|
}
|
|
|
|
/* For each H2 heading, add a link up to the #top of the document.
|
|
* (As part of this: ensure existence of 'top' named anchor link
|
|
* (theoretically at doc's top).)
|
|
*/
|
|
function godocs_addTopLinks() {
|
|
/* Make sure there's a "top" to link to. */
|
|
var top = document.getElementById('top');
|
|
if (!top) {
|
|
document.body.id = 'top';
|
|
}
|
|
|
|
if (!document.getElementsByTagName) return; // no browser support
|
|
|
|
var headers = document.getElementsByTagName('h2');
|
|
|
|
for (var i = 0; i < headers.length; i++) {
|
|
var span = document.createElement('span');
|
|
span.className = 'navtop';
|
|
var link = document.createElement('a');
|
|
span.appendChild(link);
|
|
link.href = '#top';
|
|
var textNode = document.createTextNode('[Top]');
|
|
link.appendChild(textNode);
|
|
headers[i].appendChild(span);
|
|
}
|
|
}
|