Commit edadccde54

Andrew Kelley <andrew@ziglang.org>
2019-10-05 21:33:23
generated docs: add navigation bar
1 parent 5aa1e78
Changed files (2)
lib
std
special
lib/std/special/doc/index.html
@@ -5,22 +5,52 @@
     <title>Documentation - Zig</title>
     <link rel="icon" href="favicon.png">
     <style type="text/css">
-      .hidden {
-          display: none;
-      }
-
-      @media (prefers-color-scheme: dark) {
-        body{
-            background-color: #111;
-            color: #bbb;
+        body {
+            font-family: system-ui, -apple-system, Roboto, "Segoe UI", sans-serif;
+        }
+        .hidden {
+            display: none;
         }
         a {
-            color: #88f;
+            color: #2A6286;
+        }
+        #listNav {
+            list-style-type: none;
+            margin: 0;
+            padding: 0;
+            overflow: hidden;
+            background-color: #333;
+        }
+        #listNav li {
+            float:left;
+        }
+        #listNav li a {
+            display: block;
+            color: #fff;
+            text-align: center;
+            padding: .8em .8em;
+            text-decoration: none;
+        }
+        #listNav li a:hover {
+            background-color: #111;
+        }
+        #listNav li a.active {
+            background-color: #4CAF50;
+        }
+
+        @media (prefers-color-scheme: dark) {
+            body{
+                background-color: #111;
+                color: #bbb;
+            }
+            a {
+                color: #88f;
+            }
         }
-      }
     </style>
   </head>
   <body>
+    <div id="sectNav"><ul id="listNav"></ul></div>
     <p id="status">Loading...</p>
     <div id="sectPkgs" class="hidden">
         <h2>Packages</h2>
@@ -32,6 +62,11 @@
         <ul id="listTypes">
         </ul>
     </div>
+    <div id="sectFns" class="hidden">
+        <h2>Functions</h2>
+        <ul id="listFns">
+        </ul>
+    </div>
     <script src="data.js"></script>
     <script src="main.js"></script>
   </body>
lib/std/special/doc/main.js
@@ -1,9 +1,17 @@
 (function() {
     var domStatus = document.getElementById("status");
+    var domSectNav = document.getElementById("sectNav");
+    var domListNav = document.getElementById("listNav");
     var domSectPkgs = document.getElementById("sectPkgs");
     var domListPkgs = document.getElementById("listPkgs");
     var domSectTypes = document.getElementById("sectTypes");
     var domListTypes = document.getElementById("listTypes");
+    var domSectFns = document.getElementById("sectFns");
+    var domListFns = document.getElementById("listFns");
+
+    var typeKindTypeId;
+    var typeKindFnId;
+    findTypeKinds();
 
     var curNav = {
         // each element is a package name, e.g. @import("a") then within there @import("b")
@@ -19,14 +27,29 @@
     };
 
     var rootIsStd = detectRootIsStd();
-    var typeKindTypeId = findTypeKindType();
     var typeTypeId = findTypeTypeId();
     window.addEventListener('hashchange', onHashChange, false);
     onHashChange();
 
+    function renderTitle() {
+        var list = curNav.pkgNames.concat(curNav.declNames);
+        var suffix = " - Zig";
+        if (list.length === 0) {
+            if (rootIsStd) {
+                document.title = "std" + suffix;
+            } else {
+                document.title = zigAnalysis.params.rootName + suffix;
+            }
+        } else {
+            document.title = list.join('.') + suffix;
+        }
+    }
+
     function render() {
         domStatus.classList.add("hidden");
 
+        renderTitle();
+
         var pkg = zigAnalysis.packages[zigAnalysis.rootPkg];
         curNav.pkgObjs = [pkg];
         for (var i = 0; i < curNav.pkgNames.length; i += 1) {
@@ -58,6 +81,8 @@
             curNav.declObjs.push(decl);
         }
 
+        renderNav();
+
         var lastPkg = curNav.pkgObjs[curNav.pkgObjs.length - 1];
         renderPkgList(lastPkg);
 
@@ -69,11 +94,46 @@
         }
     }
 
+    function renderNav() {
+        var len = curNav.pkgNames.length + curNav.declNames.length;
+        resizeDomList(domListNav, len, '<li><a href="#"></a></li>');
+        var list = [];
+        var hrefPkgNames = [];
+        var hrefDeclNames = [];
+        for (var i = 0; i < curNav.pkgNames.length; i += 1) {
+            hrefPkgNames.push(curNav.pkgNames[i]);
+            list.push({
+                name: curNav.pkgNames[i],
+                link: navLink(hrefPkgNames, hrefDeclNames),
+            });
+        }
+        for (var i = 0; i < curNav.declNames.length; i += 1) {
+            hrefDeclNames.push(curNav.declNames[i]);
+            list.push({
+                name: curNav.declNames[i],
+                link: navLink(hrefPkgNames, hrefDeclNames),
+            });
+        }
+
+        for (var i = 0; i < list.length; i += 1) {
+            var liDom = domListNav.children[i];
+            var aDom = liDom.children[0];
+            aDom.textContent = list[i].name;
+            aDom.setAttribute('href', list[i].link);
+            if (i + 1 == list.length) {
+                aDom.classList.add("active");
+            } else {
+                aDom.classList.remove("active");
+            }
+        }
+    }
+
     function render404() {
         domStatus.textContent = "404 Not Found";
         domStatus.classList.remove("hidden");
         domSectPkgs.classList.add("hidden");
         domSectTypes.classList.add("hidden");
+        domSectFns.classList.add("hidden");
     }
 
     function renderPkgList(pkg) {
@@ -104,12 +164,22 @@
         }
     }
 
+    function navLink(pkgNames, declNames) {
+        if (pkgNames.length === 0 && declNames.length === 0) {
+            return '#';
+        } else if (declNames.length === 0) {
+            return '#' + pkgNames.join('.');
+        } else {
+            return '#' + pkgNames.join('.') + ';' + declNames.join('.');
+        }
+    }
+
     function navLinkPkg(childName) {
-        return '#' + (curNav.pkgNames.concat([childName])).join(',');
+        return navLink(curNav.pkgNames.concat([childName]), []);
     }
 
     function navLinkDecl(childName) {
-        return '#' + curNav.pkgNames.join(",") + ';' + (curNav.declNames.concat([childName])).join(",");
+        return navLink(curNav.pkgNames, curNav.declNames.concat([childName]));
     }
 
     function resizeDomList(listDom, desiredLen, templateHtml) {
@@ -125,28 +195,55 @@
     }
 
     function renderContainer(container) {
-        // Find only the types of this package
-        var list = [];
+        var typesList = [];
+        var fnsList = [];
         for (var i = 0; i < container.decls.length; i += 1) {
             var decl = zigAnalysis.decls[container.decls[i]];
-            if (decl.type == typeTypeId) {
-                list.push(decl);
+            if (decl.type != null) {
+                if (decl.type == typeTypeId) {
+                    typesList.push(decl);
+                } else {
+                    var typeKind = zigAnalysis.types[decl.type].kind;
+                    if (typeKind === typeKindFnId) {
+                        fnsList.push(decl);
+                    }
+                }
             }
         }
-        list.sort(function(a, b) {
+        typesList.sort(function(a, b) {
+            return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase());
+        });
+        fnsList.sort(function(a, b) {
             return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase());
         });
 
-        resizeDomList(domListTypes, list.length, '<li><a href="#"></a></li>');
-        for (var i = 0; i < list.length; i += 1) {
-            var liDom = domListTypes.children[i];
-            var aDom = liDom.children[0];
-            var decl = list[i];
-            aDom.textContent = decl.name;
-            aDom.setAttribute('href', navLinkDecl(decl.name));
+        if (typesList.length === 0) {
+            domSectTypes.classList.add("hidden");
+        } else {
+            resizeDomList(domListTypes, typesList.length, '<li><a href="#"></a></li>');
+            for (var i = 0; i < typesList.length; i += 1) {
+                var liDom = domListTypes.children[i];
+                var aDom = liDom.children[0];
+                var decl = typesList[i];
+                aDom.textContent = decl.name;
+                aDom.setAttribute('href', navLinkDecl(decl.name));
+            }
+            domSectTypes.classList.remove("hidden");
         }
 
-        domSectTypes.classList.remove("hidden");
+        if (fnsList.length === 0) {
+            domSectFns.classList.add("hidden");
+        } else {
+            resizeDomList(domListFns, fnsList.length, '<li><a href="#"></a></li>');
+            for (var i = 0; i < fnsList.length; i += 1) {
+                var liDom = domListFns.children[i];
+                var aDom = liDom.children[0];
+                var decl = fnsList[i];
+                aDom.textContent = decl.name;
+                aDom.setAttribute('href', navLinkDecl(decl.name));
+            }
+            domSectFns.classList.remove("hidden");
+        }
     }
 
     function operatorCompare(a, b) {
@@ -169,13 +266,20 @@
         return rootPkg.file === stdPkg.file;
     }
 
-    function findTypeKindType() {
+    function findTypeKinds() {
         for (var i = 0; i < zigAnalysis.typeKinds.length; i += 1) {
             if (zigAnalysis.typeKinds[i] === "Type") {
-                return i;
+                typeKindTypeId = i;
+            } else if (zigAnalysis.typeKinds[i] === "Fn") {
+                typeKindFnId = i;
             }
         }
-        throw new Error("No type kind 'Type' found");
+        if (typeKindTypeId == null) {
+            throw new Error("No type kind 'Type' found");
+        }
+        if (typeKindFnId == null) {
+            throw new Error("No type kind 'Fn' found");
+        }
     }
 
     function findTypeTypeId() {
@@ -194,11 +298,11 @@
             declNames: [],
             declObjs: [],
         };
-        if (location.hash[0] === '#') {
+        if (location.hash[0] === '#' && location.hash.length > 1) {
             var parts = location.hash.substring(1).split(";");
             curNav.pkgNames = parts[0].split(".");
             if (parts[1] != null) {
-                curNav.declNames = parts[1] ? parts[1].split(".") : [];
+                curNav.declNames = parts[1].split(".");
             }
         }
         render();