| // This was derived from http://golang.org/doc/godocs.js, which has: |
| // Except as noted, this content is licensed under Creative Commons |
| // Attribution 3.0 |
| |
| |
| // Listen to the load event for the document. |
| if (window.addEventListener) { |
| window.addEventListener('load', onload_handler, false); |
| } else if (window.attachEvent) { |
| window.attachEvent('onload', onload_handler); |
| } |
| |
| function onload_handler() { |
| generateTOC(); |
| addTopLinks(); |
| } |
| |
| /* 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 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 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); |
| } |
| } |