main.js (5878B)
1 function initSidebar() { 2 var filename = document.location.pathname; 3 4 if (filename.slice(0, 5) == "/next") { 5 filename = filename.slice(5); 6 } 7 8 if (filename == "/") { 9 filename = "/index.html"; 10 } else if (filename.slice(0, 6) == "/news/") { 11 filename = "/news/"; 12 } 13 14 var menu = document.getElementById("menu"); 15 var setMenuLayout = function() { 16 if (window.innerWidth < 900) { 17 document.body.className = "narrow"; 18 menu.className = ""; 19 document.getElementById("main_content").style.minHeight = "0"; 20 } else { 21 if (document.body.clientWidth < 1340) { 22 document.body.className = "normal"; 23 } else { 24 document.body.className = "wide"; 25 } 26 27 var y = (window.pageYOffset !== undefined) ? window.pageYOffset : 28 (document.documentElement || document.body.parentNode || document.body).scrollTop; 29 30 if (y < 444 || window.innerHeight < menu.clientHeight + 100) { 31 menu.className = ""; 32 } else { 33 menu.className = "floating"; 34 } 35 36 setTimeout(function () { 37 document.getElementById("main_content").style.minHeight = menu.clientHeight + 100 + "px"; 38 }, 10); 39 } 40 }; 41 setMenuLayout(); 42 window.onresize = setMenuLayout; 43 window.onscroll = setMenuLayout; 44 45 var items = menu.getElementsByTagName("li"); 46 var toc = null; 47 for (var i = 0; i < items.length; i++) { 48 var link = items[i].getElementsByTagName("a")[0]; 49 var href = link.href; 50 if (href.lastIndexOf(filename) >= 0) { 51 var parent = link.parentNode; 52 53 while (link.childNodes.length > 0) { 54 var child = link.childNodes[0]; 55 link.removeChild(child); 56 parent.appendChild(child); 57 } 58 parent.removeChild(link); 59 items[i].className = "selected"; 60 toc = document.createElement("ul"); 61 toc.id = "toc"; 62 items[i].appendChild(toc); 63 } 64 } 65 66 return toc; 67 } 68 69 function setupSidebar() { 70 if (window.CAPNP_NEWS_SIDEBAR) { 71 setupNewsSidebar(CAPNP_NEWS_SIDEBAR); 72 return; 73 } 74 75 var filename = document.location.pathname; 76 77 if (filename.slice(0, 5) == "/next") { 78 filename = filename.slice(5); 79 } 80 81 var isNews = filename.slice(0, 6) == "/news/"; 82 83 var toc = initSidebar(); 84 if (toc) { 85 var content = document.getElementById("main_content").childNodes; 86 var headings = []; 87 88 for (var i = 0; i < content.length; i++) { 89 if (content[i].tagName == "H2" || 90 (!isNews && (content[i].tagName == "H3" || content[i].tagName == "H4"))) { 91 headings.push(content[i]); 92 } 93 } 94 95 var levels = [toc]; 96 for (var i in headings) { 97 var hl = headings[i].tagName.slice(1) - 1; 98 while (hl > levels.length) { 99 var parent = levels[levels.length - 1]; 100 var item = parent.childNodes[parent.childNodes.length - 1]; 101 var sublist = document.createElement("ul"); 102 item.appendChild(sublist); 103 levels.push(sublist); 104 } 105 while (hl < levels.length) { 106 levels.pop(); 107 } 108 109 var parent = levels[levels.length - 1]; 110 var item = document.createElement("li"); 111 var p = document.createElement("p"); 112 var link = document.createElement("a"); 113 p.appendChild(document.createTextNode(headings[i].innerText || headings[i].textContent)); 114 var hlinks = headings[i].getElementsByTagName("a"); 115 if (hlinks.length == 1) { 116 link.href = hlinks[0].href; 117 } else { 118 link.href = "#" + headings[i].id; 119 } 120 link.appendChild(p); 121 item.appendChild(link); 122 parent.appendChild(item); 123 } 124 } 125 } 126 127 function setupNewsSidebar(items) { 128 var toc = initSidebar(); 129 if (toc) { 130 for (var i in items) { 131 var item = document.createElement("li"); 132 var p = document.createElement("p"); 133 var link = document.createElement("a"); 134 p.appendChild(document.createTextNode(items[i].title)); 135 link.href = items[i].url; 136 link.appendChild(p); 137 item.appendChild(link); 138 toc.appendChild(item); 139 } 140 } 141 } 142 143 function setupSlides() { 144 var slides = document.querySelectorAll("body.slides main section"); 145 var headerTitle = document.querySelector("body.slides header .title"); 146 var slideNum = document.querySelector("#slide-num"); 147 148 var current = 0; 149 var hash = document.location.hash; 150 if (hash) { 151 current = parseInt(hash.slice(1)) - 1; 152 } 153 slides[current].className = "current"; 154 headerTitle.textContent = slides[current].dataset.title || ""; 155 slideNum.textContent = window.location.hash; 156 157 function navSlide(diff) { 158 slides[current].className = ""; 159 current = Math.min(slides.length - 1, Math.max(0, current + diff)); 160 slides[current].className = "current"; 161 162 headerTitle.textContent = slides[current].dataset.title || ""; 163 if (current) { 164 history.replaceState({}, "", "#" + (current + 1)); 165 slideNum.textContent = "#" + (current + 1); 166 } else { 167 history.replaceState({}, "", window.location.pathname); 168 slideNum.textContent = ""; 169 } 170 } 171 172 document.body.addEventListener("keydown", event => { 173 if (event.keyCode == 39) { 174 navSlide(1); 175 } else if (event.keyCode == 37) { 176 navSlide(-1); 177 } 178 }); 179 180 document.querySelector("body.slides footer button.back").addEventListener("click", event => { 181 navSlide(-1); 182 }); 183 document.querySelector("body.slides footer button.forward").addEventListener("click", event => { 184 navSlide(1); 185 }); 186 187 if (document.location.hostname === "localhost") { 188 var lastModified = new Date(document.lastModified); 189 setInterval(function () { 190 var req = new Request(".", {headers: { 191 "If-Modified-Since": lastModified.toUTCString()}}); 192 fetch(req).then(response => { 193 if (response.status == 200 && 194 new Date(response.headers.get("Last-Modified")) > lastModified) { 195 document.location.reload(); 196 } 197 }); 198 }, 1000); 199 } 200 }