authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-05 15:33:23-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-05 15:33:23-04:00
logedadccde549b99305882e795e44672a9f41be037
tree10b8e55e7a39bd303e1e49142be9b53a3934c324
parent5aa1e7880747d80ddbbd31a87fc1343af46e7db6
signaturelock-open Commit is signed but in an unrecognized format.

generated docs: add navigation bar


2 files changed, 170 insertions(+), 31 deletions(-)

lib/std/special/doc/index.html+45-10
...@@ -5,22 +5,52 @@...@@ -5,22 +5,52 @@
5 <title>Documentation - Zig</title>5 <title>Documentation - Zig</title>
6 <link rel="icon" href="favicon.png">6 <link rel="icon" href="favicon.png">
7 <style type="text/css">7 <style type="text/css">
8 .hidden {8 body {
9 display: none;9 font-family: system-ui, -apple-system, Roboto, "Segoe UI", sans-serif;
10 }10 }
1111 .hidden {
12 @media (prefers-color-scheme: dark) {12 display: none;
13 body{
14 background-color: #111;
15 color: #bbb;
16 }13 }
17 a {14 a {
18 color: #88f;15 color: #2A6286;
16 }
17 #listNav {
18 list-style-type: none;
19 margin: 0;
20 padding: 0;
21 overflow: hidden;
22 background-color: #333;
23 }
24 #listNav li {
25 float:left;
26 }
27 #listNav li a {
28 display: block;
29 color: #fff;
30 text-align: center;
31 padding: .8em .8em;
32 text-decoration: none;
33 }
34 #listNav li a:hover {
35 background-color: #111;
36 }
37 #listNav li a.active {
38 background-color: #4CAF50;
39 }
40
41 @media (prefers-color-scheme: dark) {
42 body{
43 background-color: #111;
44 color: #bbb;
45 }
46 a {
47 color: #88f;
48 }
19 }49 }
20 }
21 </style>50 </style>
22 </head>51 </head>
23 <body>52 <body>
53 <div id="sectNav"><ul id="listNav"></ul></div>
24 <p id="status">Loading...</p>54 <p id="status">Loading...</p>
25 <div id="sectPkgs" class="hidden">55 <div id="sectPkgs" class="hidden">
26 <h2>Packages</h2>56 <h2>Packages</h2>
...@@ -32,6 +62,11 @@...@@ -32,6 +62,11 @@
32 <ul id="listTypes">62 <ul id="listTypes">
33 </ul>63 </ul>
34 </div>64 </div>
65 <div id="sectFns" class="hidden">
66 <h2>Functions</h2>
67 <ul id="listFns">
68 </ul>
69 </div>
35 <script src="data.js"></script>70 <script src="data.js"></script>
36 <script src="main.js"></script>71 <script src="main.js"></script>
37 </body>72 </body>
lib/std/special/doc/main.js+125-21
...@@ -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();
715
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 };
2028
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();
2633
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");
2950
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 }
6083
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);
6388
...@@ -69,11 +94,46 @@...@@ -69,11 +94,46 @@
69 }94 }
70 }95 }
7196
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 }
78138
79 function renderPkgList(pkg) {139 function renderPkgList(pkg) {
...@@ -104,12 +164,22 @@...@@ -104,12 +164,22 @@
104 }164 }
105 }165 }
106166
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 }
110180
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 }
114184
115 function resizeDomList(listDom, desiredLen, templateHtml) {185 function resizeDomList(listDom, desiredLen, templateHtml) {
...@@ -125,28 +195,55 @@...@@ -125,28 +195,55 @@
125 }195 }
126196
127 function renderContainer(container) {197 function renderContainer(container) {
128 // Find only the types of this package198 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 });
139219
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 }
148233
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 }
151248
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 }
171268
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 }
180284
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();