main.js 3.69 KB
Newer Older
1
function initSidebar() {
2
  var filename = document.location.pathname;
3

4 5 6 7
  if (filename.slice(0, 5) == "/next") {
    filename = filename.slice(5);
  }

8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
  if (filename == "/") {
    filename = "/index.html";
  } else if (filename.slice(0, 6) == "/news/") {
    filename = "/news/";
  }

  var menu = document.getElementById("menu");
  var setMenuLayout = function() {
    if (window.innerWidth < 900) {
      document.body.className = "narrow";
      menu.className = "";
    } else {
      if (document.body.clientWidth < 1340) {
        document.body.className = "normal";
      } else {
        document.body.className = "wide";
      }

26 27 28
      var y = (window.pageYOffset !== undefined) ? window.pageYOffset :
        (document.documentElement || document.body.parentNode || document.body).scrollTop;

29
      if (y < 444 || window.innerHeight < menu.clientHeight + 100) {
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
        menu.className = "";
      } else {
        menu.className = "floating";
      }
    }
  };
  setMenuLayout();
  window.onresize = setMenuLayout;
  window.onscroll = setMenuLayout;

  var items = menu.getElementsByTagName("li");
  var toc = null;
  for (var i = 0; i < items.length; i++) {
    var link = items[i].getElementsByTagName("a")[0];
    var href = link.href;
    if (href.lastIndexOf(filename) >= 0) {
      var parent = link.parentNode;
47 48 49 50

      while (link.childNodes.length > 0) {
        var child = link.childNodes[0];
        link.removeChild(child);
51
        parent.appendChild(child);
52 53
      }
      parent.removeChild(link);
54 55 56 57 58 59 60 61 62 63 64 65 66
      items[i].className = "selected";
      toc = document.createElement("ul");
      toc.id = "toc";
      items[i].appendChild(toc);
    }
  }

  document.getElementById("main_content").style.minHeight = menu.clientHeight + 100 + "px";

  return toc;
}

function setupSidebar() {
67 68 69 70 71 72 73
  var filename = document.location.pathname;

  if (filename.slice(0, 5) == "/next") {
    filename = filename.slice(5);
  }

  var isNews = filename.slice(0, 6) == "/news/";
Kenton Varda's avatar
Kenton Varda committed
74

75 76 77 78 79 80 81
  var toc = initSidebar();
  if (toc) {
    var content = document.getElementById("main_content").childNodes;
    var headings = [];

    for (var i = 0; i < content.length; i++) {
      if (content[i].tagName == "H2" ||
Kenton Varda's avatar
Kenton Varda committed
82
          (!isNews && (content[i].tagName == "H3" || content[i].tagName == "H4"))) {
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
        headings.push(content[i]);
      }
    }

    var levels = [toc];
    for (var i in headings) {
      var hl = headings[i].tagName.slice(1) - 1;
      while (hl > levels.length) {
        var parent = levels[levels.length - 1];
        var item = parent.childNodes[parent.childNodes.length - 1];
        var sublist = document.createElement("ul");
        item.appendChild(sublist);
        levels.push(sublist);
      }
      while (hl < levels.length) {
        levels.pop();
      }

      var parent = levels[levels.length - 1];
      var item = document.createElement("li");
      var p = document.createElement("p");
      var link = document.createElement("a");
105
      p.appendChild(document.createTextNode(headings[i].innerText || headings[i].textContent));
106 107 108 109 110 111
      var hlinks = headings[i].getElementsByTagName("a");
      if (hlinks.length == 1) {
        link.href = hlinks[0].href;
      } else {
        link.href = "#" + headings[i].id;
      }
112 113
      link.appendChild(p);
      item.appendChild(link);
114 115 116 117 118 119 120 121 122 123 124 125
      parent.appendChild(item);
    }
  }
}

function setupNewsSidebar(items) {
  var toc = initSidebar();
  if (toc) {
    for (var i in items) {
      var item = document.createElement("li");
      var p = document.createElement("p");
      var link = document.createElement("a");
126
      p.appendChild(document.createTextNode(items[i].title));
127
      link.href = items[i].url;
128 129
      link.appendChild(p);
      item.appendChild(link);
130 131 132 133
      toc.appendChild(item);
    }
  }
}