| ... | @@ -1,9 +1,17 @@ | ... | @@ -1,9 +1,17 @@ |
| 1 | (function() { | 1 | (function() { |
| 2 | var domStatus = document.getElementById("status"); | 2 | var domStatus = document.getElementById("status"); |
| | 3 | var domSectNav = document.getElementById("sectNav"); |
| | 4 | var domListNav = document.getElementById("listNav"); |
| 3 | var domSectPkgs = document.getElementById("sectPkgs"); | 5 | var domSectPkgs = document.getElementById("sectPkgs"); |
| 4 | var domListPkgs = document.getElementById("listPkgs"); | 6 | var domListPkgs = document.getElementById("listPkgs"); |
| 5 | var domSectTypes = document.getElementById("sectTypes"); | 7 | var domSectTypes = document.getElementById("sectTypes"); |
| 6 | var domListTypes = document.getElementById("listTypes"); | 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 | var curNav = { | 16 | var curNav = { |
| 9 | // each element is a package name, e.g. @import("a") then within there @import("b") | 17 | // each element is a package name, e.g. @import("a") then within there @import("b") |
| ... | @@ -19,14 +27,29 @@ | ... | @@ -19,14 +27,29 @@ |
| 19 | }; | 27 | }; |
| 20 | | 28 | |
| 21 | var rootIsStd = detectRootIsStd(); | 29 | var rootIsStd = detectRootIsStd(); |
| 22 | var typeKindTypeId = findTypeKindType(); | | |
| 23 | var typeTypeId = findTypeTypeId(); | 30 | var typeTypeId = findTypeTypeId(); |
| 24 | window.addEventListener('hashchange', onHashChange, false); | 31 | window.addEventListener('hashchange', onHashChange, false); |
| 25 | onHashChange(); | 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 | function render() { | 48 | function render() { |
| 28 | domStatus.classList.add("hidden"); | 49 | domStatus.classList.add("hidden"); |
| 29 | | 50 | |
| | 51 | renderTitle(); |
| | 52 | |
| 30 | var pkg = zigAnalysis.packages[zigAnalysis.rootPkg]; | 53 | var pkg = zigAnalysis.packages[zigAnalysis.rootPkg]; |
| 31 | curNav.pkgObjs = [pkg]; | 54 | curNav.pkgObjs = [pkg]; |
| 32 | for (var i = 0; i < curNav.pkgNames.length; i += 1) { | 55 | for (var i = 0; i < curNav.pkgNames.length; i += 1) { |
| ... | @@ -58,6 +81,8 @@ | ... | @@ -58,6 +81,8 @@ |
| 58 | curNav.declObjs.push(decl); | 81 | curNav.declObjs.push(decl); |
| 59 | } | 82 | } |
| 60 | | 83 | |
| | 84 | renderNav(); |
| | 85 | |
| 61 | var lastPkg = curNav.pkgObjs[curNav.pkgObjs.length - 1]; | 86 | var lastPkg = curNav.pkgObjs[curNav.pkgObjs.length - 1]; |
| 62 | renderPkgList(lastPkg); | 87 | renderPkgList(lastPkg); |
| 63 | | 88 | |
| ... | @@ -69,11 +94,46 @@ | ... | @@ -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 | function render404() { | 131 | function render404() { |
| 73 | domStatus.textContent = "404 Not Found"; | 132 | domStatus.textContent = "404 Not Found"; |
| 74 | domStatus.classList.remove("hidden"); | 133 | domStatus.classList.remove("hidden"); |
| 75 | domSectPkgs.classList.add("hidden"); | 134 | domSectPkgs.classList.add("hidden"); |
| 76 | domSectTypes.classList.add("hidden"); | 135 | domSectTypes.classList.add("hidden"); |
| | 136 | domSectFns.classList.add("hidden"); |
| 77 | } | 137 | } |
| 78 | | 138 | |
| 79 | function renderPkgList(pkg) { | 139 | function renderPkgList(pkg) { |
| ... | @@ -104,12 +164,22 @@ | ... | @@ -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 | function navLinkPkg(childName) { | 177 | function navLinkPkg(childName) { |
| 108 | return '#' + (curNav.pkgNames.concat([childName])).join(','); | 178 | return navLink(curNav.pkgNames.concat([childName]), []); |
| 109 | } | 179 | } |
| 110 | | 180 | |
| 111 | function navLinkDecl(childName) { | 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 | function resizeDomList(listDom, desiredLen, templateHtml) { | 185 | function resizeDomList(listDom, desiredLen, templateHtml) { |
| ... | @@ -125,28 +195,55 @@ | ... | @@ -125,28 +195,55 @@ |
| 125 | } | 195 | } |
| 126 | | 196 | |
| 127 | function renderContainer(container) { | 197 | function renderContainer(container) { |
| 128 | // Find only the types of this package | 198 | var typesList = []; |
| 129 | var list = []; | 199 | var fnsList = []; |
| 130 | for (var i = 0; i < container.decls.length; i += 1) { | 200 | for (var i = 0; i < container.decls.length; i += 1) { |
| 131 | var decl = zigAnalysis.decls[container.decls[i]]; | 201 | var decl = zigAnalysis.decls[container.decls[i]]; |
| 132 | if (decl.type == typeTypeId) { | 202 | if (decl.type != null) { |
| 133 | list.push(decl); | 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 | return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); | 217 | return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); |
| 138 | }); | 218 | }); |
| 139 | | 219 | |
| 140 | resizeDomList(domListTypes, list.length, '<li><a href="#"></a></li>'); | 220 | if (typesList.length === 0) { |
| 141 | for (var i = 0; i < list.length; i += 1) { | 221 | domSectTypes.classList.add("hidden"); |
| 142 | var liDom = domListTypes.children[i]; | 222 | } else { |
| 143 | var aDom = liDom.children[0]; | 223 | resizeDomList(domListTypes, typesList.length, '<li><a href="#"></a></li>'); |
| 144 | var decl = list[i]; | 224 | for (var i = 0; i < typesList.length; i += 1) { |
| 145 | aDom.textContent = decl.name; | 225 | var liDom = domListTypes.children[i]; |
| 146 | aDom.setAttribute('href', navLinkDecl(decl.name)); | 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 | function operatorCompare(a, b) { | 249 | function operatorCompare(a, b) { |
| ... | @@ -169,13 +266,20 @@ | ... | @@ -169,13 +266,20 @@ |
| 169 | return rootPkg.file === stdPkg.file; | 266 | return rootPkg.file === stdPkg.file; |
| 170 | } | 267 | } |
| 171 | | 268 | |
| 172 | function findTypeKindType() { | 269 | function findTypeKinds() { |
| 173 | for (var i = 0; i < zigAnalysis.typeKinds.length; i += 1) { | 270 | for (var i = 0; i < zigAnalysis.typeKinds.length; i += 1) { |
| 174 | if (zigAnalysis.typeKinds[i] === "Type") { | 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 | function findTypeTypeId() { | 285 | function findTypeTypeId() { |
| ... | @@ -194,11 +298,11 @@ | ... | @@ -194,11 +298,11 @@ |
| 194 | declNames: [], | 298 | declNames: [], |
| 195 | declObjs: [], | 299 | declObjs: [], |
| 196 | }; | 300 | }; |
| 197 | if (location.hash[0] === '#') { | 301 | if (location.hash[0] === '#' && location.hash.length > 1) { |
| 198 | var parts = location.hash.substring(1).split(";"); | 302 | var parts = location.hash.substring(1).split(";"); |
| 199 | curNav.pkgNames = parts[0].split("."); | 303 | curNav.pkgNames = parts[0].split("."); |
| 200 | if (parts[1] != null) { | 304 | if (parts[1] != null) { |
| 201 | curNav.declNames = parts[1] ? parts[1].split(".") : []; | 305 | curNav.declNames = parts[1].split("."); |
| 202 | } | 306 | } |
| 203 | } | 307 | } |
| 204 | render(); | 308 | render(); |