authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-07 17:46:22-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-07 17:46:22-04:00
log4a97558ae86f802d2bb2d9e7517fdd5d9101a2c6
tree5276ea5694563ce170c4cc8514516aee48585308
parentd46234ef72c5ab1a45d27cfba1a7ebd5a9f3beb5
signaturelock-open Commit is signed but in an unrecognized format.

generated docs: navigable search results


2 files changed, 146 insertions(+), 12 deletions(-)

lib/std/special/docs/index.html+16
......@@ -139,6 +139,10 @@
139139 cursor: default;
140140 }
141141
142 #listSearchResults li.selected {
143 background-color: #93e196;
144 }
145
142146 @media (prefers-color-scheme: dark) {
143147 body{
144148 background-color: #111;
......@@ -150,6 +154,12 @@
150154 pre{
151155 background-color:#2A2A2A;
152156 }
157 #listNav li a:hover {
158 background-color: #000;
159 }
160 #listNav li a.active {
161 background-color: #4CAF50;
162 }
153163 #listPkgs {
154164 background-color: #333;
155165 }
......@@ -160,6 +170,12 @@
160170 background-color: #555;
161171 color: #fff;
162172 }
173 #listSearchResults li.selected {
174 background-color: #000;
175 }
176 #listSearchResults li.selected a {
177 color: #fff;
178 }
163179 }
164180 </style>
165181 </head>
lib/std/special/docs/main.js+130-12
......@@ -31,6 +31,7 @@
3131
3232 // for each package, is an array with packages to get to this one
3333 var canonPkgPaths = computeCanonicalPackagePaths();
34 var canonDeclPaths = null; // lazy; use getCanonDeclPath
3435
3536 var curNav = {
3637 // each element is a package name, e.g. @import("a") then within there @import("b")
......@@ -45,6 +46,7 @@
4546 declObjs: [],
4647 };
4748 var curNavSearch = "";
49 var curSearchIndex = -1;
4850
4951 var rootIsStd = detectRootIsStd();
5052 var typeTypeId = findTypeTypeId();
......@@ -78,6 +80,7 @@
7880 domSectSearchNoResults.classList.add("hidden");
7981 domSectInfo.classList.add("hidden");
8082 domHdrName.classList.add("hidden");
83 domSectNav.classList.add("hidden");
8184
8285 renderTitle();
8386 renderInfo();
......@@ -413,7 +416,7 @@
413416 pkg: rootPkg,
414417 }];
415418 while (stack.length !== 0) {
416 var item = stack.pop();
419 var item = stack.shift();
417420 for (var key in item.pkg.table) {
418421 var childPkgIndex = item.pkg.table[key];
419422 if (list[childPkgIndex] != null) continue;
......@@ -430,6 +433,51 @@
430433 return list;
431434 }
432435
436 function computeCanonDeclPaths() {
437 var list = new Array(zigAnalysis.decls.length);
438
439 for (var pkgI = 0; pkgI < zigAnalysis.packages.length; pkgI += 1) {
440 var pkg = zigAnalysis.packages[pkgI];
441 var pkgNames = canonPkgPaths[pkgI];
442 var stack = [{
443 declNames: [],
444 type: zigAnalysis.types[pkg.main],
445 }];
446 while (stack.length !== 0) {
447 var item = stack.shift();
448
449 if (item.type.pubDecls != null) {
450 for (var declI = 0; declI < item.type.pubDecls.length; declI += 1) {
451 var mainDeclIndex = item.type.pubDecls[declI];
452 if (list[mainDeclIndex] != null) continue;
453
454 var decl = zigAnalysis.decls[mainDeclIndex];
455 var declNames = item.declNames.concat([decl.name]);
456 list[mainDeclIndex] = {
457 pkgNames: pkgNames,
458 declNames: declNames,
459 };
460 var containerType = getDeclContainerType(decl);
461 if (containerType != null) {
462 stack.push({
463 declNames: declNames,
464 type: containerType,
465 });
466 }
467 }
468 }
469 }
470 }
471 return list;
472 }
473
474 function getCanonDeclPath(index) {
475 if (canonDeclPaths == null) {
476 canonDeclPaths = computeCanonDeclPaths();
477 }
478 return canonDeclPaths[index];
479 }
480
433481 function markdown(mdText) {
434482 return mdText.replace(/[&"<>]/g, function (m) {
435483 return escapeHtmlReplacements[m];
......@@ -438,14 +486,63 @@
438486
439487 function onSearchKeyDown(ev) {
440488 switch (ev.which) {
489 case 13:
490 var liDom = null;
491 if (domListSearchResults.children.length === 1) {
492 liDom = domListSearchResults.children[0];
493 } else {
494 liDom = domListSearchResults.children[curSearchIndex];
495 }
496 if (liDom != null) {
497 var aDom = liDom.children[0];
498 location.href = aDom.getAttribute("href");
499 curSearchIndex = -1;
500 ev.preventDefault();
501 ev.stopPropagation();
502 return;
503 }
441504 case 27:
442505 domSearch.value = "";
443506 domSearch.blur();
507 curSearchIndex = -1;
444508 ev.preventDefault();
445 break;
509 ev.stopPropagation();
510 startSearch();
511 return;
512 case 38:
513 moveSearchCursor(-1);
514 ev.preventDefault();
515 ev.stopPropagation();
516 return;
517 case 40:
518 moveSearchCursor(1);
519 ev.preventDefault();
520 ev.stopPropagation();
521 return;
522 default:
523 curSearchIndex = -1;
524 ev.stopPropagation();
525 startAsyncSearch();
526 }
527 }
528
529 function moveSearchCursor(dir) {
530 if (curSearchIndex < 0 || curSearchIndex >= domListSearchResults.children.length) {
531 if (dir > 0) {
532 curSearchIndex = -1 + dir;
533 } else if (dir < 0) {
534 curSearchIndex = domListSearchResults.children.length + dir;
535 }
536 } else {
537 curSearchIndex += dir;
538 }
539 if (curSearchIndex < 0) {
540 curSearchIndex = 0;
541 }
542 if (curSearchIndex >= domListSearchResults.children.length) {
543 curSearchIndex = domListSearchResults.children.length - 1;
446544 }
447 ev.stopPropagation();
448 startAsyncSearch();
545 renderSearchCursor();
449546 }
450547
451548 function onWindowKeyDown(ev) {
......@@ -496,16 +593,20 @@
496593 }
497594 }
498595 function renderSearch() {
499 var matchedDecls = [];
596 var matchedItems = [];
500597 var terms = curNavSearch.split(/[ \r\n\t]+/);
598
501599 decl_loop: for (var declIndex = 0; declIndex < zigAnalysis.decls.length; declIndex += 1) {
600 var canonPath = getCanonDeclPath(declIndex);
601 if (canonPath == null) continue;
602
502603 var decl = zigAnalysis.decls[declIndex];
503604 for (var termIndex = 0; termIndex < terms.length; termIndex += 1) {
504605 var term = terms[termIndex];
505606 if (decl.name.indexOf(term) >= 0) {
506607 continue;
507608 }
508 var astNode = zigAnalysis.astNodes[decl.src]
609 var astNode = zigAnalysis.astNodes[decl.src];
509610 if (astNode.docs != null && astNode.docs.indexOf(term) >= 0) {
510611 continue;
511612 }
......@@ -517,21 +618,38 @@
517618 continue decl_loop;
518619 }
519620
520 matchedDecls.push(decl);
621 matchedItems.push({
622 decl: decl,
623 path: canonPath,
624 });
521625 }
522626
523 if (matchedDecls.length !== 0) {
524 resizeDomList(domListSearchResults, matchedDecls.length, '<li></li>');
627 if (matchedItems.length !== 0) {
628 resizeDomList(domListSearchResults, matchedItems.length, '<li><a href="#"></a></li>');
525629
526 for (var i = 0; i < matchedDecls.length; i += 1) {
630 for (var i = 0; i < matchedItems.length; i += 1) {
527631 var liDom = domListSearchResults.children[i];
528 var decl = matchedDecls[i];
529 liDom.textContent = decl.name;
632 var aDom = liDom.children[0];
633 var match = matchedItems[i];
634 aDom.textContent = match.path.declNames.join('.');
635 aDom.setAttribute('href', navLink(match.path.pkgNames, match.path.declNames));
530636 }
637 renderSearchCursor();
531638
532639 domSectSearchResults.classList.remove("hidden");
533640 } else {
534641 domSectSearchNoResults.classList.remove("hidden");
535642 }
536643 }
644
645 function renderSearchCursor() {
646 for (var i = 0; i < domListSearchResults.children.length; i += 1) {
647 var liDom = domListSearchResults.children[i];
648 if (curSearchIndex === i) {
649 liDom.classList.add("selected");
650 } else {
651 liDom.classList.remove("selected");
652 }
653 }
654 }
537655})();