xref: /aosp_15_r20/external/google-styleguide/include/jsguide.js (revision 8c35d5ee8e2913d4bd6623e2b93232b1da0ab719)
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