authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-07 13:57:01-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-07 13:57:01-04:00
log9237461b24664ecf12546b87530952f49f0e1166
tree8f6c146b20600edf887c531b8f5e901620c9b912
parent2ccb48ddc3f3b543bca0538da948013447afe429
signaturelock-open Commit is signed but in an unrecognized format.

generated docs: logo and basic search proof of concept


2 files changed, 139 insertions(+), 21 deletions(-)

lib/std/special/docs/index.html+15
...@@ -20,6 +20,7 @@...@@ -20,6 +20,7 @@
20 font-size:1em;20 font-size:1em;
21 background-color:#F5F5F5;21 background-color:#F5F5F5;
22 padding:1em;22 padding:1em;
23 overflow-x: auto;
23 }24 }
24 #listNav {25 #listNav {
25 list-style-type: none;26 list-style-type: none;
...@@ -45,6 +46,16 @@...@@ -45,6 +46,16 @@
45 background-color: #4CAF50;46 background-color: #4CAF50;
46 }47 }
4748
49 #logo {
50 width: 5em;
51 float: left;
52 padding: 0 1em 0 0;
53 }
54
55 #search {
56 width: 90%;
57 }
58
48 @media (prefers-color-scheme: dark) {59 @media (prefers-color-scheme: dark) {
49 body{60 body{
50 background-color: #111;61 background-color: #111;
...@@ -60,12 +71,16 @@...@@ -60,12 +71,16 @@
60 </style>71 </style>
61 </head>72 </head>
62 <body>73 <body>
74 <img alt="ZIG" id="logo" src="data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAxNTAgMTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxnIGZpbGw9IiNmN2E0MWQiPjxwYXRoIGQ9Im0wIDEwdjgwaDE5bDYtMTAgMTItMTBoLTE3di00MGgxNXYtMjB6bTQwIDB2MjBoNjJ2LTIwem05MSAwLTYgMTAtMTIgMTBoMTd2NDBoLTE1djIwaDM1di04MHptLTgzIDYwdjIwaDYydi0yMHoiIHNoYXBlLXJlbmRlcmluZz0iY3Jpc3BFZGdlcyIvPjxwYXRoIGQ9Im0zNyA3MC0xOCAyMHYtMTV6Ii8+PHBhdGggZD0ibTExMyAzMCAxOC0yMHYxNXoiLz48cGF0aCBkPSJtOTYuOTggMTAuNjMgMzYuMjgtMTAuNC04MC4yOSA4OS4xNy0zNi4yOCAxMC40eiIvPjwvZz48L3N2Zz4K"></img>
75 <input type="search" id="search" autocomplete="off" spellcheck="false" placeholder="`s` to search, `?` to see more options">
63 <p id="status">Loading...</p>76 <p id="status">Loading...</p>
64 <div id="sectNav" class="hidden"><ul id="listNav"></ul></div>77 <div id="sectNav" class="hidden"><ul id="listNav"></ul></div>
65 <div id="fnProto" class="hidden">78 <div id="fnProto" class="hidden">
66 <pre id="fnProtoCode"></pre>79 <pre id="fnProtoCode"></pre>
67 </div>80 </div>
68 <div id="fnDocs" class="hidden"></div>81 <div id="fnDocs" class="hidden"></div>
82 <div id="sectSearchResults" class="hidden"><ul id="listSearchResults"></ul></div>
83 <div id="sectSearchNoResults" class="hidden"><p>No search results.</p></div>
69 <div id="sectPkgs" class="hidden">84 <div id="sectPkgs" class="hidden">
70 <h2>Packages</h2>85 <h2>Packages</h2>
71 <ul id="listPkgs">86 <ul id="listPkgs">
lib/std/special/docs/main.js+124-21
...@@ -11,6 +11,13 @@...@@ -11,6 +11,13 @@
11 var domFnProto = document.getElementById("fnProto");11 var domFnProto = document.getElementById("fnProto");
12 var domFnProtoCode = document.getElementById("fnProtoCode");12 var domFnProtoCode = document.getElementById("fnProtoCode");
13 var domFnDocs = document.getElementById("fnDocs");13 var domFnDocs = document.getElementById("fnDocs");
14 var domSearch = document.getElementById("search");
15 var domSectSearchResults = document.getElementById("sectSearchResults");
16 var domListSearchResults = document.getElementById("listSearchResults");
17 var domSectSearchNoResults = document.getElementById("sectSearchNoResults");
18
19 var searchTimer = null;
20 var escapeHtmlReplacements = { "&": "&amp;", '"': "&quot;", "<": "&lt;", ">": "&gt;" };
1421
15 var typeKindTypeId;22 var typeKindTypeId;
16 var typeKindFnId;23 var typeKindFnId;
...@@ -31,10 +38,13 @@...@@ -31,10 +38,13 @@
31 // these will be all types, except the last one may be a type or a decl38 // these will be all types, except the last one may be a type or a decl
32 declObjs: [],39 declObjs: [],
33 };40 };
41 var curNavSearch = "";
3442
35 var rootIsStd = detectRootIsStd();43 var rootIsStd = detectRootIsStd();
36 var typeTypeId = findTypeTypeId();44 var typeTypeId = findTypeTypeId();
45 domSearch.addEventListener('keydown', onSearchKeyDown, false);
37 window.addEventListener('hashchange', onHashChange, false);46 window.addEventListener('hashchange', onHashChange, false);
47 window.addEventListener('keydown', onWindowKeyDown, false);
38 onHashChange();48 onHashChange();
3949
40 function renderTitle() {50 function renderTitle() {
...@@ -58,10 +68,14 @@...@@ -58,10 +68,14 @@
58 domSectPkgs.classList.add("hidden");68 domSectPkgs.classList.add("hidden");
59 domSectTypes.classList.add("hidden");69 domSectTypes.classList.add("hidden");
60 domSectFns.classList.add("hidden");70 domSectFns.classList.add("hidden");
6171 domSectSearchResults.classList.add("hidden");
6272
63 renderTitle();73 renderTitle();
6474
75 if (curNavSearch !== "") {
76 return renderSearch();
77 }
78
65 var pkg = zigAnalysis.packages[zigAnalysis.rootPkg];79 var pkg = zigAnalysis.packages[zigAnalysis.rootPkg];
66 curNav.pkgObjs = [pkg];80 curNav.pkgObjs = [pkg];
67 for (var i = 0; i < curNav.pkgNames.length; i += 1) {81 for (var i = 0; i < curNav.pkgNames.length; i += 1) {
...@@ -99,16 +113,16 @@...@@ -99,16 +113,16 @@
99 renderPkgList(lastPkg);113 renderPkgList(lastPkg);
100114
101 var lastDecl = curNav.declObjs[curNav.declObjs.length - 1];115 var lastDecl = curNav.declObjs[curNav.declObjs.length - 1];
102 if (lastDecl.pubDecls != null) {116 if (lastDecl.type != null) {
103 return renderContainer(lastDecl);
104 } else if (lastDecl.type != null) {
105 var typeObj = zigAnalysis.types[lastDecl.type];117 var typeObj = zigAnalysis.types[lastDecl.type];
106 if (typeObj.kind === typeKindFnId) {118 if (typeObj.kind === typeKindFnId) {
107 return renderFn(lastDecl);119 return renderFn(lastDecl);
108 }120 }
109 throw new Error("docs for this decl which is not a container");121 throw new Error("docs for this decl which is not a container");
110 } else {122 }
111 throw new Error("docs for this decl which is a type");123 renderType(lastDecl);
124 if (lastDecl.pubDecls != null) {
125 renderContainer(lastDecl);
112 }126 }
113 }127 }
114128
...@@ -164,10 +178,6 @@...@@ -164,10 +178,6 @@
164 function render404() {178 function render404() {
165 domStatus.textContent = "404 Not Found";179 domStatus.textContent = "404 Not Found";
166 domStatus.classList.remove("hidden");180 domStatus.classList.remove("hidden");
167 domSectPkgs.classList.add("hidden");
168 domSectTypes.classList.add("hidden");
169 domSectFns.classList.add("hidden");
170 domFnProto.classList.add("hidden");
171 }181 }
172182
173 function renderPkgList(pkg) {183 function renderPkgList(pkg) {
...@@ -183,9 +193,7 @@...@@ -183,9 +193,7 @@
183 return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase());193 return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase());
184 });194 });
185195
186 if (list.length === 0) {196 if (list.length !== 0) {
187 domSectPkgs.classList.add("hidden");
188 } else {
189 resizeDomList(domListPkgs, list.length, '<li><a href="#"></a></li>');197 resizeDomList(domListPkgs, list.length, '<li><a href="#"></a></li>');
190 for (var i = 0; i < list.length; i += 1) {198 for (var i = 0; i < list.length; i += 1) {
191 var liDom = domListPkgs.children[i];199 var liDom = domListPkgs.children[i];
...@@ -228,6 +236,11 @@...@@ -228,6 +236,11 @@
228 }236 }
229 }237 }
230238
239 function renderType(typeObj) {
240 domFnDocs.innerText = zigAnalysis.typeKinds[typeObj.kind] + ": " + typeObj.name;
241 domFnDocs.classList.remove("hidden");
242 }
243
231 function renderContainer(container) {244 function renderContainer(container) {
232 var typesList = [];245 var typesList = [];
233 var fnsList = [];246 var fnsList = [];
...@@ -251,9 +264,7 @@...@@ -251,9 +264,7 @@
251 return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase());264 return operatorCompare(a.name.toLowerCase(), b.name.toLowerCase());
252 });265 });
253266
254 if (typesList.length === 0) {267 if (typesList.length !== 0) {
255 domSectTypes.classList.add("hidden");
256 } else {
257 resizeDomList(domListTypes, typesList.length, '<li><a href="#"></a></li>');268 resizeDomList(domListTypes, typesList.length, '<li><a href="#"></a></li>');
258 for (var i = 0; i < typesList.length; i += 1) {269 for (var i = 0; i < typesList.length; i += 1) {
259 var liDom = domListTypes.children[i];270 var liDom = domListTypes.children[i];
...@@ -265,9 +276,7 @@...@@ -265,9 +276,7 @@
265 domSectTypes.classList.remove("hidden");276 domSectTypes.classList.remove("hidden");
266 }277 }
267278
268 if (fnsList.length === 0) {279 if (fnsList.length !== 0) {
269 domSectFns.classList.add("hidden");
270 } else {
271 resizeDomList(domListFns, fnsList.length, '<li><a href="#"></a></li>');280 resizeDomList(domListFns, fnsList.length, '<li><a href="#"></a></li>');
272 for (var i = 0; i < fnsList.length; i += 1) {281 for (var i = 0; i < fnsList.length; i += 1) {
273 var liDom = domListFns.children[i];282 var liDom = domListFns.children[i];
...@@ -332,8 +341,19 @@...@@ -332,8 +341,19 @@
332 declNames: [],341 declNames: [],
333 declObjs: [],342 declObjs: [],
334 };343 };
344 curNavSearch = "";
345
335 if (location.hash[0] === '#' && location.hash.length > 1) {346 if (location.hash[0] === '#' && location.hash.length > 1) {
336 var parts = location.hash.substring(1).split(";");347 var nonSearchAndSearchParts = location.hash.substring(1).split("?");
348 var nonSearchPart;
349 if (nonSearchAndSearchParts.length === 1) {
350 nonSearchPart = nonSearchAndSearchParts[0];
351 } else {
352 nonSearchPart = nonSearchAndSearchParts[0];
353 curNavSearch = nonSearchAndSearchParts[1];
354 }
355
356 var parts = nonSearchPart.split(";");
337 curNav.pkgNames = parts[0].split(".");357 curNav.pkgNames = parts[0].split(".");
338 if (parts[1] != null) {358 if (parts[1] != null) {
339 curNav.declNames = parts[1].split(".");359 curNav.declNames = parts[1].split(".");
...@@ -388,10 +408,93 @@...@@ -388,10 +408,93 @@
388 return list;408 return list;
389 }409 }
390410
391 var escapeHtmlReplacements = { "&": "&amp;", '"': "&quot;", "<": "&lt;", ">": "&gt;" };
392 function markdown(mdText) {411 function markdown(mdText) {
393 return mdText.replace(/[&"<>]/g, function (m) {412 return mdText.replace(/[&"<>]/g, function (m) {
394 return escapeHtmlReplacements[m];413 return escapeHtmlReplacements[m];
395 });414 });
396 }415 }
416
417 function onSearchKeyDown(ev) {
418 switch (ev.which) {
419 case 27:
420 domSearch.value = "";
421 domSearch.blur();
422 ev.preventDefault();
423 break;
424 }
425 ev.stopPropagation();
426 startAsyncSearch();
427 }
428
429 function onWindowKeyDown(ev) {
430 switch (ev.which) {
431 case 83:
432 domSearch.focus();
433 ev.preventDefault();
434 ev.stopPropagation();
435 startAsyncSearch();
436 break;
437 }
438 }
439
440 function clearAsyncSearch() {
441 if (searchTimer != null) clearTimeout(searchTimer);
442 }
443
444 function startAsyncSearch() {
445 clearAsyncSearch();
446 searchTimer = setTimeout(startSearch, 50);
447 }
448 function startSearch() {
449 var parts = location.hash.split("?");
450 var newPart2 = (domSearch.value === "") ? "" : ("?" + domSearch.value);
451 if (parts.length === 1) {
452 location.hash = location.hash + newPart2;
453 } else {
454 location.hash = parts[0] + newPart2;
455 }
456 }
457 function renderSearch() {
458 if (domSearch.value !== curNavSearch) {
459 domSearch.value = curNavSearch;
460 }
461
462 var matchedDecls = [];
463 var terms = curNavSearch.split(/[ \r\n\t]+/);
464 decl_loop: for (var declIndex = 0; declIndex < zigAnalysis.decls.length; declIndex += 1) {
465 var decl = zigAnalysis.decls[declIndex];
466 for (var termIndex = 0; termIndex < terms.length; termIndex += 1) {
467 var term = terms[termIndex];
468 if (decl.name.indexOf(term) >= 0) {
469 continue;
470 }
471 var astNode = zigAnalysis.astNodes[decl.src]
472 if (astNode.docs != null && astNode.docs.indexOf(term) >= 0) {
473 continue;
474 }
475 var file = zigAnalysis.files[astNode.file];
476 if (file.indexOf(term) >= 0) {
477 continue;
478 }
479
480 continue decl_loop;
481 }
482
483 matchedDecls.push(decl);
484 }
485
486 if (matchedDecls.length !== 0) {
487 resizeDomList(domListSearchResults, matchedDecls.length, '<li></li>');
488
489 for (var i = 0; i < matchedDecls.length; i += 1) {
490 var liDom = domListSearchResults.children[i];
491 var decl = matchedDecls[i];
492 liDom.textContent = decl.name;
493 }
494
495 domSectSearchResults.classList.remove("hidden");
496 } else {
497 domSectSearchNoResults.classList.remove("hidden");
498 }
499 }
397})();500})();