| ... | ... | @@ -6,28 +6,76 @@ |
| 6 | 6 | var domListTypes = document.getElementById("listTypes"); |
| 7 | 7 | |
| 8 | 8 | var curNav = { |
| 9 | | kind: "pkg", |
| 10 | | index: zigAnalysis.rootPkg, |
| 9 | // each element is a package name, e.g. @import("a") then within there @import("b") |
| 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 | 21 | var rootIsStd = detectRootIsStd(); |
| 14 | 22 | var typeKindTypeId = findTypeKindType(); |
| 15 | 23 | var typeTypeId = findTypeTypeId(); |
| 16 | | render(); |
| 24 | window.addEventListener('hashchange', onHashChange, false); |
| 25 | onHashChange(); |
| 17 | 26 | |
| 18 | 27 | function render() { |
| 19 | 28 | domStatus.classList.add("hidden"); |
| 20 | 29 | |
| 21 | | if (curNav.kind === "pkg") { |
| 22 | | var pkg = zigAnalysis.packages[curNav.index]; |
| 23 | | renderPkgList(pkg); |
| 24 | | var pkgStruct = zigAnalysis.types[pkg.main]; |
| 25 | | renderContainer(pkgStruct); |
| 30 | var pkg = zigAnalysis.packages[zigAnalysis.rootPkg]; |
| 31 | curNav.pkgObjs = [pkg]; |
| 32 | for (var i = 0; i < curNav.pkgNames.length; i += 1) { |
| 33 | var childPkg = zigAnalysis.packages[pkg.table[curNav.pkgNames[i]]]; |
| 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 | 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 | 79 | function renderPkgList(pkg) { |
| 32 | 80 | var list = []; |
| 33 | 81 | for (var key in pkg.table) { |
| ... | ... | @@ -41,14 +89,19 @@ |
| 41 | 89 | return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase()); |
| 42 | 90 | }); |
| 43 | 91 | |
| 44 | | resizeDomList(domListPkgs, list.length, '<li></li>'); |
| 45 | | var domItems = domListPkgs.children; |
| 46 | | for (var i = 0; i < list.length; i += 1) { |
| 47 | | var domItem = domItems[i]; |
| 48 | | domItem.textContent = list[i].name; |
| 49 | | } |
| 92 | if (list.length === 0) { |
| 93 | domSectPkgs.classList.remove("hidden"); |
| 94 | } else { |
| 95 | resizeDomList(domListPkgs, list.length, '<li><a href="#"></a></li>'); |
| 96 | for (var i = 0; i < list.length; i += 1) { |
| 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 | 107 | function resizeDomList(listDom, desiredLen, templateHtml) { |
| ... | ... | @@ -123,4 +176,40 @@ |
| 123 | 176 | } |
| 124 | 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 | })(); |