| ... | ... | @@ -1,9 +1,17 @@ |
| 1 | 1 | (function() { |
| 2 | 2 | var domStatus = document.getElementById("status"); |
| 3 | var domSectNav = document.getElementById("sectNav"); |
| 4 | var domListNav = document.getElementById("listNav"); |
| 3 | 5 | var domSectPkgs = document.getElementById("sectPkgs"); |
| 4 | 6 | var domListPkgs = document.getElementById("listPkgs"); |
| 5 | 7 | var domSectTypes = document.getElementById("sectTypes"); |
| 6 | 8 | var domListTypes = document.getElementById("listTypes"); |
| 9 | var domSectFns = document.getElementById("sectFns"); |
| 10 | var domListFns = document.getElementById("listFns"); |
| 11 | |
| 12 | var typeKindTypeId; |
| 13 | var typeKindFnId; |
| 14 | findTypeKinds(); |
| 7 | 15 | |
| 8 | 16 | var curNav = { |
| 9 | 17 | // each element is a package name, e.g. @import("a") then within there @import("b") |
| ... | ... | @@ -19,14 +27,29 @@ |
| 19 | 27 | }; |
| 20 | 28 | |
| 21 | 29 | var rootIsStd = detectRootIsStd(); |
| 22 | | var typeKindTypeId = findTypeKindType(); |
| 23 | 30 | var typeTypeId = findTypeTypeId(); |
| 24 | 31 | window.addEventListener('hashchange', onHashChange, false); |
| 25 | 32 | onHashChange(); |
| 26 | 33 | |
| 34 | function renderTitle() { |
| 35 | var list = curNav.pkgNames.concat(curNav.declNames); |
| 36 | var suffix = " - Zig"; |
| 37 | if (list.length === 0) { |
| 38 | if (rootIsStd) { |
| 39 | document.title = "std" + suffix; |
| 40 | } else { |
| 41 | document.title = zigAnalysis.params.rootName + suffix; |
| 42 | } |
| 43 | } else { |
| 44 | document.title = list.join('.') + suffix; |
| 45 | } |
| 46 | } |
| 47 | |
| 27 | 48 | function render() { |
| 28 | 49 | domStatus.classList.add("hidden"); |
| 29 | 50 | |
| 51 | renderTitle(); |
| 52 | |
| 30 | 53 | var pkg = zigAnalysis.packages[zigAnalysis.rootPkg]; |
| 31 | 54 | curNav.pkgObjs = [pkg]; |
| 32 | 55 | for (var i = 0; i < curNav.pkgNames.length; i += 1) { |
| ... | ... | @@ -58,6 +81,8 @@ |
| 58 | 81 | curNav.declObjs.push(decl); |
| 59 | 82 | } |
| 60 | 83 | |
| 84 | renderNav(); |
| 85 | |
| 61 | 86 | var lastPkg = curNav.pkgObjs[curNav.pkgObjs.length - 1]; |
| 62 | 87 | renderPkgList(lastPkg); |
| 63 | 88 | |
| ... | ... | @@ -69,11 +94,46 @@ |
| 69 | 94 | } |
| 70 | 95 | } |
| 71 | 96 | |
| 97 | function renderNav() { |
| 98 | var len = curNav.pkgNames.length + curNav.declNames.length; |
| 99 | resizeDomList(domListNav, len, '<li><a href="#"></a></li>'); |
| 100 | var list = []; |
| 101 | var hrefPkgNames = []; |
| 102 | var hrefDeclNames = []; |
| 103 | for (var i = 0; i < curNav.pkgNames.length; i += 1) { |
| 104 | hrefPkgNames.push(curNav.pkgNames[i]); |
| 105 | list.push({ |
| 106 | name: curNav.pkgNames[i], |
| 107 | link: navLink(hrefPkgNames, hrefDeclNames), |
| 108 | }); |
| 109 | } |
| 110 | for (var i = 0; i < curNav.declNames.length; i += 1) { |
| 111 | hrefDeclNames.push(curNav.declNames[i]); |
| 112 | list.push({ |
| 113 | name: curNav.declNames[i], |
| 114 | link: navLink(hrefPkgNames, hrefDeclNames), |
| 115 | }); |
| 116 | } |
| 117 | |
| 118 | for (var i = 0; i < list.length; i += 1) { |
| 119 | var liDom = domListNav.children[i]; |
| 120 | var aDom = liDom.children[0]; |
| 121 | aDom.textContent = list[i].name; |
| 122 | aDom.setAttribute('href', list[i].link); |
| 123 | if (i + 1 == list.length) { |
| 124 | aDom.classList.add("active"); |
| 125 | } else { |
| 126 | aDom.classList.remove("active"); |
| 127 | } |
| 128 | } |
| 129 | } |
| 130 | |
| 72 | 131 | function render404() { |
| 73 | 132 | domStatus.textContent = "404 Not Found"; |
| 74 | 133 | domStatus.classList.remove("hidden"); |
| 75 | 134 | domSectPkgs.classList.add("hidden"); |
| 76 | 135 | domSectTypes.classList.add("hidden"); |
| 136 | domSectFns.classList.add("hidden"); |
| 77 | 137 | } |
| 78 | 138 | |
| 79 | 139 | function renderPkgList(pkg) { |
| ... | ... | @@ -104,12 +164,22 @@ |
| 104 | 164 | } |
| 105 | 165 | } |
| 106 | 166 | |
| 167 | function navLink(pkgNames, declNames) { |
| 168 | if (pkgNames.length === 0 && declNames.length === 0) { |
| 169 | return '#'; |
| 170 | } else if (declNames.length === 0) { |
| 171 | return '#' + pkgNames.join('.'); |
| 172 | } else { |
| 173 | return '#' + pkgNames.join('.') + ';' + declNames.join('.'); |
| 174 | } |
| 175 | } |
| 176 | |
| 107 | 177 | function navLinkPkg(childName) { |
| 108 | | return '#' + (curNav.pkgNames.concat([childName])).join(','); |
| 178 | return navLink(curNav.pkgNames.concat([childName]), []); |
| 109 | 179 | } |
| 110 | 180 | |
| 111 | 181 | function navLinkDecl(childName) { |
| 112 | | return '#' + curNav.pkgNames.join(",") + ';' + (curNav.declNames.concat([childName])).join(","); |
| 182 | return navLink(curNav.pkgNames, curNav.declNames.concat([childName])); |
| 113 | 183 | } |
| 114 | 184 | |
| 115 | 185 | function resizeDomList(listDom, desiredLen, templateHtml) { |
| ... | ... | @@ -125,28 +195,55 @@ |
| 125 | 195 | } |
| 126 | 196 | |
| 127 | 197 | function renderContainer(container) { |
| 128 | | // Find only the types of this package |
| 129 | | var list = []; |
| 198 | var typesList = []; |
| 199 | var fnsList = []; |
| 130 | 200 | for (var i = 0; i < container.decls.length; i += 1) { |
| 131 | 201 | var decl = zigAnalysis.decls[container.decls[i]]; |
| 132 | | if (decl.type == typeTypeId) { |
| 133 | | list.push(decl); |
| 202 | if (decl.type != null) { |
| 203 | if (decl.type == typeTypeId) { |
| 204 | typesList.push(decl); |
| 205 | } else { |
| 206 | var typeKind = zigAnalysis.types[decl.type].kind; |
| 207 | if (typeKind === typeKindFnId) { |
| 208 | fnsList.push(decl); |
| 209 | } |
| 210 | } |
| 134 | 211 | } |
| 135 | 212 | } |
| 136 | | list.sort(function(a, b) { |
| 213 | typesList.sort(function(a, b) { |
| 214 | return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); |
| 215 | }); |
| 216 | fnsList.sort(function(a, b) { |
| 137 | 217 | return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); |
| 138 | 218 | }); |
| 139 | 219 | |
| 140 | | resizeDomList(domListTypes, list.length, '<li><a href="#"></a></li>'); |
| 141 | | for (var i = 0; i < list.length; i += 1) { |
| 142 | | var liDom = domListTypes.children[i]; |
| 143 | | var aDom = liDom.children[0]; |
| 144 | | var decl = list[i]; |
| 145 | | aDom.textContent = decl.name; |
| 146 | | aDom.setAttribute('href', navLinkDecl(decl.name)); |
| 220 | if (typesList.length === 0) { |
| 221 | domSectTypes.classList.add("hidden"); |
| 222 | } else { |
| 223 | resizeDomList(domListTypes, typesList.length, '<li><a href="#"></a></li>'); |
| 224 | for (var i = 0; i < typesList.length; i += 1) { |
| 225 | var liDom = domListTypes.children[i]; |
| 226 | var aDom = liDom.children[0]; |
| 227 | var decl = typesList[i]; |
| 228 | aDom.textContent = decl.name; |
| 229 | aDom.setAttribute('href', navLinkDecl(decl.name)); |
| 230 | } |
| 231 | domSectTypes.classList.remove("hidden"); |
| 147 | 232 | } |
| 148 | 233 | |
| 149 | | domSectTypes.classList.remove("hidden"); |
| 234 | if (fnsList.length === 0) { |
| 235 | domSectFns.classList.add("hidden"); |
| 236 | } else { |
| 237 | resizeDomList(domListFns, fnsList.length, '<li><a href="#"></a></li>'); |
| 238 | for (var i = 0; i < fnsList.length; i += 1) { |
| 239 | var liDom = domListFns.children[i]; |
| 240 | var aDom = liDom.children[0]; |
| 241 | var decl = fnsList[i]; |
| 242 | aDom.textContent = decl.name; |
| 243 | aDom.setAttribute('href', navLinkDecl(decl.name)); |
| 244 | } |
| 245 | domSectFns.classList.remove("hidden"); |
| 246 | } |
| 150 | 247 | } |
| 151 | 248 | |
| 152 | 249 | function operatorCompare(a, b) { |
| ... | ... | @@ -169,13 +266,20 @@ |
| 169 | 266 | return rootPkg.file === stdPkg.file; |
| 170 | 267 | } |
| 171 | 268 | |
| 172 | | function findTypeKindType() { |
| 269 | function findTypeKinds() { |
| 173 | 270 | for (var i = 0; i < zigAnalysis.typeKinds.length; i += 1) { |
| 174 | 271 | if (zigAnalysis.typeKinds[i] === "Type") { |
| 175 | | return i; |
| 272 | typeKindTypeId = i; |
| 273 | } else if (zigAnalysis.typeKinds[i] === "Fn") { |
| 274 | typeKindFnId = i; |
| 176 | 275 | } |
| 177 | 276 | } |
| 178 | | throw new Error("No type kind 'Type' found"); |
| 277 | if (typeKindTypeId == null) { |
| 278 | throw new Error("No type kind 'Type' found"); |
| 279 | } |
| 280 | if (typeKindFnId == null) { |
| 281 | throw new Error("No type kind 'Fn' found"); |
| 282 | } |
| 179 | 283 | } |
| 180 | 284 | |
| 181 | 285 | function findTypeTypeId() { |
| ... | ... | @@ -194,11 +298,11 @@ |
| 194 | 298 | declNames: [], |
| 195 | 299 | declObjs: [], |
| 196 | 300 | }; |
| 197 | | if (location.hash[0] === '#') { |
| 301 | if (location.hash[0] === '#' && location.hash.length > 1) { |
| 198 | 302 | var parts = location.hash.substring(1).split(";"); |
| 199 | 303 | curNav.pkgNames = parts[0].split("."); |
| 200 | 304 | if (parts[1] != null) { |
| 201 | | curNav.declNames = parts[1] ? parts[1].split(".") : []; |
| 305 | curNav.declNames = parts[1].split("."); |
| 202 | 306 | } |
| 203 | 307 | } |
| 204 | 308 | render(); |