| ... | @@ -6,28 +6,76 @@ | ... | @@ -6,28 +6,76 @@ |
| 6 | var domListTypes = document.getElementById("listTypes"); | 6 | var domListTypes = document.getElementById("listTypes"); |
| 7 | | 7 | |
| 8 | var curNav = { | 8 | var curNav = { |
| 9 | kind: "pkg", | 9 | // each element is a package name, e.g. @import("a") then within there @import("b") |
| 10 | index: zigAnalysis.rootPkg, | 10 | // starting implicitly from root package |
| | 11 | pkgNames: [], |
| | 12 | // same as above except actual packages, not names |
| | 13 | pkgObjs: [], |
| | 14 | // Each element is a decl name, `a.b.c`, a is 0, b is 1, c is 2, etc. |
| | 15 | // empty array means refers to the package itself |
| | 16 | declNames: [], |
| | 17 | // these will be all types, except the last one may be a type or a decl |
| | 18 | declObjs: [], |
| 11 | }; | 19 | }; |
| 12 | | 20 | |
| 13 | var rootIsStd = detectRootIsStd(); | 21 | var rootIsStd = detectRootIsStd(); |
| 14 | var typeKindTypeId = findTypeKindType(); | 22 | var typeKindTypeId = findTypeKindType(); |
| 15 | var typeTypeId = findTypeTypeId(); | 23 | var typeTypeId = findTypeTypeId(); |
| 16 | render(); | 24 | window.addEventListener('hashchange', onHashChange, false); |
| | 25 | onHashChange(); |
| 17 | | 26 | |
| 18 | function render() { | 27 | function render() { |
| 19 | domStatus.classList.add("hidden"); | 28 | domStatus.classList.add("hidden"); |
| 20 | | 29 | |
| 21 | if (curNav.kind === "pkg") { | 30 | var pkg = zigAnalysis.packages[zigAnalysis.rootPkg]; |
| 22 | var pkg = zigAnalysis.packages[curNav.index]; | 31 | curNav.pkgObjs = [pkg]; |
| 23 | renderPkgList(pkg); | 32 | for (var i = 0; i < curNav.pkgNames.length; i += 1) { |
| 24 | var pkgStruct = zigAnalysis.types[pkg.main]; | 33 | var childPkg = zigAnalysis.packages[pkg.table[curNav.pkgNames[i]]]; |
| 25 | renderContainer(pkgStruct); | 34 | if (childPkg == null) { |
| | 35 | return render404(); |
| | 36 | } |
| | 37 | pkg = childPkg; |
| | 38 | curNav.pkgObjs.push(pkg); |
| | 39 | } |
| | 40 | |
| | 41 | var decl = zigAnalysis.types[pkg.main]; |
| | 42 | curNav.declObjs = [decl]; |
| | 43 | for (var i = 0; i < curNav.declNames.length; i += 1) { |
| | 44 | var childDecl = findSubDecl(decl, curNav.declNames[i]); |
| | 45 | if (childDecl == null) { |
| | 46 | return render404(); |
| | 47 | } |
| | 48 | var container = getDeclContainerType(childDecl); |
| | 49 | if (container == null) { |
| | 50 | if (i + 1 === curNav.declNames.length) { |
| | 51 | curNav.declObjs.push(childDecl); |
| | 52 | break; |
| | 53 | } else { |
| | 54 | return render404(); |
| | 55 | } |
| | 56 | } |
| | 57 | decl = container; |
| | 58 | curNav.declObjs.push(decl); |
| | 59 | } |
| | 60 | |
| | 61 | var lastPkg = curNav.pkgObjs[curNav.pkgObjs.length - 1]; |
| | 62 | renderPkgList(lastPkg); |
| | 63 | |
| | 64 | var lastDecl = curNav.declObjs[curNav.declObjs.length - 1]; |
| | 65 | if (lastDecl.decls != null) { |
| | 66 | return renderContainer(lastDecl); |
| 26 | } else { | 67 | } else { |
| 27 | throw new Error("TODO"); | 68 | throw new Error("docs for this decl which is not a container"); |
| 28 | } | 69 | } |
| 29 | } | 70 | } |
| 30 | | 71 | |
| | 72 | function render404() { |
| | 73 | domStatus.textContent = "404 Not Found"; |
| | 74 | domStatus.classList.remove("hidden"); |
| | 75 | domSectPkgs.classList.add("hidden"); |
| | 76 | domListPkgs.classList.add("hidden"); |
| | 77 | } |
| | 78 | |
| 31 | function renderPkgList(pkg) { | 79 | function renderPkgList(pkg) { |
| 32 | var list = []; | 80 | var list = []; |
| 33 | for (var key in pkg.table) { | 81 | for (var key in pkg.table) { |
| ... | @@ -41,14 +89,19 @@ | ... | @@ -41,14 +89,19 @@ |
| 41 | return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); | 89 | return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); |
| 42 | }); | 90 | }); |
| 43 | | 91 | |
| 44 | resizeDomList(domListPkgs, list.length, '<li></li>'); | 92 | if (list.length === 0) { |
| 45 | var domItems = domListPkgs.children; | 93 | domSectPkgs.classList.remove("hidden"); |
| 46 | for (var i = 0; i < list.length; i += 1) { | 94 | } else { |
| 47 | var domItem = domItems[i]; | 95 | resizeDomList(domListPkgs, list.length, '<li><a href="#"></a></li>'); |
| 48 | domItem.textContent = list[i].name; | 96 | for (var i = 0; i < list.length; i += 1) { |
| 49 | } | 97 | var liDom = domListPkgs.children[i]; |
| | 98 | var aDom = liDom.children[0]; |
| | 99 | aDom.textContent = list[i].name; |
| | 100 | aDom.setAttribute('href', "#" + list[i].name); |
| | 101 | } |
| 50 | | 102 | |
| 51 | domSectPkgs.classList.remove("hidden"); | 103 | domSectPkgs.classList.remove("hidden"); |
| | 104 | } |
| 52 | } | 105 | } |
| 53 | | 106 | |
| 54 | function resizeDomList(listDom, desiredLen, templateHtml) { | 107 | function resizeDomList(listDom, desiredLen, templateHtml) { |
| ... | @@ -123,4 +176,40 @@ | ... | @@ -123,4 +176,40 @@ |
| 123 | } | 176 | } |
| 124 | throw new Error("No type 'type' found"); | 177 | throw new Error("No type 'type' found"); |
| 125 | } | 178 | } |
| | 179 | |
| | 180 | function onHashChange() { |
| | 181 | curNav = { |
| | 182 | pkgNames: [], |
| | 183 | pkgObjs: [], |
| | 184 | declNames: [], |
| | 185 | declObjs: [], |
| | 186 | }; |
| | 187 | if (location.hash[0] === '#') { |
| | 188 | var parts = location.hash.substring(1).split(";"); |
| | 189 | curNav.pkgNames = parts[0].split("."); |
| | 190 | if (parts[1] != null) { |
| | 191 | curNav.declNames = parts[1] ? parts[1].split(".") : []; |
| | 192 | } |
| | 193 | } |
| | 194 | render(); |
| | 195 | } |
| | 196 | |
| | 197 | function findSubDecl(parentType, childName) { |
| | 198 | if (parentType.decls == null) throw new Error("parent object has no decls"); |
| | 199 | for (var i = 0; i < parentType.decls.length; i += 1) { |
| | 200 | var declIndex = parentType.decls[i]; |
| | 201 | var childDecl = zigAnalysis.decls[declIndex]; |
| | 202 | if (childDecl.name === childName) { |
| | 203 | return childDecl; |
| | 204 | } |
| | 205 | } |
| | 206 | return null; |
| | 207 | } |
| | 208 | |
| | 209 | function getDeclContainerType(decl) { |
| | 210 | if (decl.type === typeTypeId) { |
| | 211 | return zigAnalysis.types[decl.value]; |
| | 212 | } |
| | 213 | return null; |
| | 214 | } |
| 126 | })(); | 215 | })(); |