1*8c35d5eeSXin Liwindow.initStyleGuide = function(init) { 2*8c35d5eeSXin Li // Runs the callback on every element matched by the query selector. 3*8c35d5eeSXin Li function find(querySelector, callback) { 4*8c35d5eeSXin Li var elements = [].slice.call(document.querySelectorAll(querySelector)); 5*8c35d5eeSXin Li for (var i = 0; i < elements.length; i++) { 6*8c35d5eeSXin Li callback(elements[i]); 7*8c35d5eeSXin Li } 8*8c35d5eeSXin Li } 9*8c35d5eeSXin Li // Add the tocDiv at the top. 10*8c35d5eeSXin Li var title = document.getElementsByTagName('h1')[0]; 11*8c35d5eeSXin Li var toc = document.createElement('div'); 12*8c35d5eeSXin Li toc.id = 'tocDiv'; 13*8c35d5eeSXin Li toc.className = 'vertical_toc'; 14*8c35d5eeSXin Li title.parentNode.insertBefore(toc, title.nextSibling); 15*8c35d5eeSXin Li 16*8c35d5eeSXin Li // If a paragraph starts with (e.g.) "Note:" or "Tip:" then add 17*8c35d5eeSXin Li // that "callout class" to its element. 18*8c35d5eeSXin Li find('p', function(paragraph) { 19*8c35d5eeSXin Li var match = /^([a-z]+):/i.exec(paragraph.textContent); 20*8c35d5eeSXin Li if (match) { 21*8c35d5eeSXin Li paragraph.classList.add(match[1].toLowerCase()); 22*8c35d5eeSXin Li } 23*8c35d5eeSXin Li }); 24*8c35d5eeSXin Li 25*8c35d5eeSXin Li // Fill in text for intra-document links, ensuring that links 26*8c35d5eeSXin Li // remain up-to-date even if sections are moved or renumbered. 27*8c35d5eeSXin Li // This triggers on any link with "??" as its text and a URL 28*8c35d5eeSXin Li // starting with "#", and the filled-in text is exactly the same 29*8c35d5eeSXin Li // as the text of the referenced section heading. 30*8c35d5eeSXin Li find('a[href^="#"]', function(link) { 31*8c35d5eeSXin Li var href = link.getAttribute('href'); 32*8c35d5eeSXin Li var heading = document.getElementById(href.substring(1)); 33*8c35d5eeSXin Li // Fill in link text with heading title 34*8c35d5eeSXin Li if (heading && link.textContent == '??') { 35*8c35d5eeSXin Li link.textContent = heading.textContent; 36*8c35d5eeSXin Li } 37*8c35d5eeSXin Li }); 38*8c35d5eeSXin Li 39*8c35d5eeSXin Li // Hoedown renders fenced code blocks incompatibly with what 40*8c35d5eeSXin Li // prettify expects. As a result, prettify doesn't handle them 41*8c35d5eeSXin Li // properly. Fix it by moving the code directly into the pre. 42*8c35d5eeSXin Li find('pre > code', function(code) { 43*8c35d5eeSXin Li var pre = code.parentElement; 44*8c35d5eeSXin Li pre.className = code.className; 45*8c35d5eeSXin Li pre.innerHTML = code.innerHTML; 46*8c35d5eeSXin Li }); 47*8c35d5eeSXin Li 48*8c35d5eeSXin Li // Run the normal init function. 49*8c35d5eeSXin Li init(); 50*8c35d5eeSXin Li 51*8c35d5eeSXin Li // Call the pretty-printer after we've fixed up the code blocks. 52*8c35d5eeSXin Li var pretty = document.createElement('script'); 53*8c35d5eeSXin Li pretty.src = 'https://cdn.rawgit.com/google/code-prettify/master/loader/' + 54*8c35d5eeSXin Li 'run_prettify.js'; 55*8c35d5eeSXin Li document.body.appendChild(pretty); 56*8c35d5eeSXin Li}.bind(null, window.initStyleGuide); 57