authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2020-05-16 16:43:41+03:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-05-16 16:43:41+03:00
logd061e5854a0891a3d4290183aa4f9d033d10d8c2
treef43d3573f847c92c8141cf3b2972f3ada8c1e1ca
parent758de71d9769b3539f042aea8821c3ac18bed74c
parentf31e0d98344625c85fb42b7d7710780ad648b479
signature Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #5020 from jinroh/docs/search-perf

docs: search perf

2 files changed, 87 insertions(+), 54 deletions(-)

lib/std/special/docs/index.html+1
......@@ -576,6 +576,7 @@
576576 <div id="sectSearchResults" class="hidden">
577577 <h2>Search Results</h2>
578578 <ul id="listSearchResults"></ul>
579 <p id="sectSearchAllResultsLink" class="hidden"><a href="">show all results</a></p>
579580 </div>
580581 <div id="sectSearchNoResults" class="hidden">
581582 <h2>No Results Found</h2>
lib/std/special/docs/main.js+86-54
......@@ -35,6 +35,7 @@
3535 var domSectSearchResults = document.getElementById("sectSearchResults");
3636 var domListSearchResults = document.getElementById("listSearchResults");
3737 var domSectSearchNoResults = document.getElementById("sectSearchNoResults");
38 var domSectSearchAllResultsLink = document.getElementById("sectSearchAllResultsLink");
3839 var domSectInfo = document.getElementById("sectInfo");
3940 var domTdTarget = document.getElementById("tdTarget");
4041 var domTdZigVer = document.getElementById("tdZigVer");
......@@ -42,6 +43,7 @@
4243 var domHelpModal = document.getElementById("helpDialog");
4344
4445 var searchTimer = null;
46 var searchTrimResults = true;
4547 var escapeHtmlReplacements = { "&": "&amp;", '"': "&quot;", "<": "&lt;", ">": "&gt;" };
4648
4749 var typeKinds = indexTypeKinds();
......@@ -82,6 +84,8 @@
8284 var nodesToCallsMap = indexNodesToCalls();
8385
8486 domSearch.addEventListener('keydown', onSearchKeyDown, false);
87 domSectSearchAllResultsLink.addEventListener('click', onClickSearchShowAllResults, false);
88
8589 window.addEventListener('hashchange', onHashChange, false);
8690 window.addEventListener('keydown', onWindowKeyDown, false);
8791 onHashChange();
......@@ -113,6 +117,7 @@
113117 domSectFields.classList.add("hidden");
114118 domSectSearchResults.classList.add("hidden");
115119 domSectSearchNoResults.classList.add("hidden");
120 domSectSearchAllResultsLink.classList.add("hidden");
116121 domSectInfo.classList.add("hidden");
117122 domHdrName.classList.add("hidden");
118123 domSectNav.classList.add("hidden");
......@@ -256,13 +261,15 @@
256261 if (fnObj.combined === undefined) fnObj.combined = allCompTimeFnCallsResult(calls);
257262 if (fnObj.combined != null) renderContainer(fnObj.combined);
258263
259 resizeDomList(domListFnExamples, calls.length, '<li></li>');
264 var domListFnExamplesFragment = createDomListFragment(calls.length, '<li></li>');
260265
261266 for (var callI = 0; callI < calls.length; callI += 1) {
262 var liDom = domListFnExamples.children[callI];
267 var liDom = domListFnExamplesFragment.children[callI];
263268 liDom.innerHTML = getCallHtml(fnDecl, calls[callI]);
264269 }
265270
271 domListFnExamples.innerHTML = "";
272 domListFnExamples.appendChild(domListFnExamplesFragment);
266273 domFnExamples.classList.remove("hidden");
267274 } else if (instantiations != null) {
268275 // TODO
......@@ -303,7 +310,7 @@
303310 return;
304311 }
305312
306 resizeDomList(domListParams, docCount, '<div></div>');
313 var domListParamsFragment = createDomListFragment(docCount, '<div></div>');
307314 var domIndex = 0;
308315
309316 for (var i = 0; i < fields.length; i += 1) {
......@@ -312,7 +319,7 @@
312319 if (fieldNode.docs == null) {
313320 continue;
314321 }
315 var divDom = domListParams.children[domIndex];
322 var divDom = domListParamsFragment.children[domIndex];
316323 domIndex += 1;
317324 var argTypeIndex = typeObj.args[i];
318325
......@@ -333,12 +340,15 @@
333340 }
334341 divDom.innerHTML = html;
335342 }
343
344 domListParams.innerHTML = "";
345 domListParams.appendChild(domListParamsFragment);
336346 domSectParams.classList.remove("hidden");
337347 }
338348
339349 function renderNav() {
340350 var len = curNav.pkgNames.length + curNav.declNames.length;
341 resizeDomList(domListNav, len, '<li><a href="#"></a></li>');
351 var domListNavFragment = createDomListFragment(len, '<li><a href="#"></a></li>');
342352 var list = [];
343353 var hrefPkgNames = [];
344354 var hrefDeclNames = [];
......@@ -358,7 +368,7 @@
358368 }
359369
360370 for (var i = 0; i < list.length; i += 1) {
361 var liDom = domListNav.children[i];
371 var liDom = domListNavFragment.children[i];
362372 var aDom = liDom.children[0];
363373 aDom.textContent = list[i].name;
364374 aDom.setAttribute('href', list[i].link);
......@@ -369,6 +379,8 @@
369379 }
370380 }
371381
382 domListNav.innerHTML = "";
383 domListNav.appendChild(domListNavFragment);
372384 domSectNav.classList.remove("hidden");
373385 }
374386
......@@ -401,9 +413,9 @@
401413 });
402414
403415 if (list.length !== 0) {
404 resizeDomList(domListPkgs, list.length, '<li><a href="#"></a></li>');
416 var domListPkgsFragment = createDomListFragment(list.length, '<li><a href="#"></a></li>');
405417 for (var i = 0; i < list.length; i += 1) {
406 var liDom = domListPkgs.children[i];
418 var liDom = domListPkgsFragment.children[i];
407419 var aDom = liDom.children[0];
408420 aDom.textContent = list[i].name;
409421 aDom.setAttribute('href', navLinkPkg(list[i].pkg));
......@@ -414,6 +426,8 @@
414426 }
415427 }
416428
429 domListPkgs.innerHTML = "";
430 domListPkgs.appendChild(domListPkgsFragment);
417431 domSectPkgs.classList.remove("hidden");
418432 }
419433 }
......@@ -454,29 +468,10 @@
454468 return navLink(curNav.pkgNames, declNamesCopy);
455469 }
456470
457 function resizeDomListDl(dlDom, desiredLen) {
458 // add the missing dom entries
459 var i, ev;
460 for (i = dlDom.childElementCount / 2; i < desiredLen; i += 1) {
461 dlDom.insertAdjacentHTML('beforeend', '<dt></dt><dd></dd>');
462 }
463 // remove extra dom entries
464 while (desiredLen < dlDom.childElementCount / 2) {
465 dlDom.removeChild(dlDom.lastChild);
466 dlDom.removeChild(dlDom.lastChild);
467 }
468 }
469
470 function resizeDomList(listDom, desiredLen, templateHtml) {
471 // add the missing dom entries
472 var i, ev;
473 for (i = listDom.childElementCount; i < desiredLen; i += 1) {
474 listDom.insertAdjacentHTML('beforeend', templateHtml);
475 }
476 // remove extra dom entries
477 while (desiredLen < listDom.childElementCount) {
478 listDom.removeChild(listDom.lastChild);
479 }
471 function createDomListFragment(desiredLen, templateHtml) {
472 var domTemplate = document.createElement("template");
473 domTemplate.innerHTML = templateHtml.repeat(desiredLen);
474 return domTemplate.content;
480475 }
481476
482477 function typeIndexName(typeIndex, wantHtml, wantLink, fnDecl, linkFnNameDecl) {
......@@ -831,10 +826,10 @@
831826 return operatorCompare(a.err.name.toLowerCase(), b.err.name.toLowerCase());
832827 });
833828
834 resizeDomListDl(domListFnErrors, errorList.length);
829 var domListFnErrorsFragment = createDomListFragment(errorList.length, "<dt></dt><dd></dd>");
835830 for (var i = 0; i < errorList.length; i += 1) {
836 var nameTdDom = domListFnErrors.children[i * 2 + 0];
837 var descTdDom = domListFnErrors.children[i * 2 + 1];
831 var nameTdDom = domListFnErrorsFragment.children[i * 2 + 0];
832 var descTdDom = domListFnErrorsFragment.children[i * 2 + 1];
838833 nameTdDom.textContent = errorList[i].err.name;
839834 var docs = errorList[i].docs;
840835 if (docs != null) {
......@@ -843,6 +838,8 @@
843838 descTdDom.textContent = "";
844839 }
845840 }
841 domListFnErrors.innerHTML = "";
842 domListFnErrors.appendChild(domListFnErrorsFragment);
846843 domTableFnErrors.classList.remove("hidden");
847844 }
848845 domSectFnErrors.classList.remove("hidden");
......@@ -1022,45 +1019,51 @@
10221019 }
10231020
10241021 if (typesList.length !== 0) {
1025 resizeDomList(domListTypes, typesList.length, '<li><a href="#"></a></li>');
1022 var domListTypesFragment = createDomListFragment(typesList.length, '<li><a href="#"></a></li>');
10261023 for (var i = 0; i < typesList.length; i += 1) {
1027 var liDom = domListTypes.children[i];
1024 var liDom = domListTypesFragment.children[i];
10281025 var aDom = liDom.children[0];
10291026 var decl = typesList[i];
10301027 aDom.textContent = decl.name;
10311028 aDom.setAttribute('href', navLinkDecl(decl.name));
10321029 }
1030 domListTypes.innerHTML = "";
1031 domListTypes.appendChild(domListTypesFragment);
10331032 domSectTypes.classList.remove("hidden");
10341033 }
10351034 if (namespacesList.length !== 0) {
1036 resizeDomList(domListNamespaces, namespacesList.length, '<li><a href="#"></a></li>');
1035 var domListNamespacesFragment = createDomListFragment(namespacesList.length, '<li><a href="#"></a></li>');
10371036 for (var i = 0; i < namespacesList.length; i += 1) {
1038 var liDom = domListNamespaces.children[i];
1037 var liDom = domListNamespacesFragment.children[i];
10391038 var aDom = liDom.children[0];
10401039 var decl = namespacesList[i];
10411040 aDom.textContent = decl.name;
10421041 aDom.setAttribute('href', navLinkDecl(decl.name));
10431042 }
1043 domListNamespaces.innerHTML = "";
1044 domListNamespaces.appendChild(domListNamespacesFragment);
10441045 domSectNamespaces.classList.remove("hidden");
10451046 }
10461047
10471048 if (errSetsList.length !== 0) {
1048 resizeDomList(domListErrSets, errSetsList.length, '<li><a href="#"></a></li>');
1049 var domListErrSetsFragment = createDomListFragment(errSetsList.length, '<li><a href="#"></a></li>');
10491050 for (var i = 0; i < errSetsList.length; i += 1) {
1050 var liDom = domListErrSets.children[i];
1051 var liDom = domListErrSetsFragment.children[i];
10511052 var aDom = liDom.children[0];
10521053 var decl = errSetsList[i];
10531054 aDom.textContent = decl.name;
10541055 aDom.setAttribute('href', navLinkDecl(decl.name));
10551056 }
1057 domListErrSets.innerHTML = "";
1058 domListErrSets.appendChild(domListErrSetsFragment);
10561059 domSectErrSets.classList.remove("hidden");
10571060 }
10581061
10591062 if (fnsList.length !== 0) {
1060 resizeDomList(domListFns, fnsList.length, '<tr><td></td><td></td></tr>');
1063 var domListFnsFragment = createDomListFragment(fnsList.length, '<tr><td></td><td></td></tr>');
10611064 for (var i = 0; i < fnsList.length; i += 1) {
10621065 var decl = fnsList[i];
1063 var trDom = domListFns.children[i];
1066 var trDom = domListFnsFragment.children[i];
10641067
10651068 var tdFnCode = trDom.children[0];
10661069 var tdDesc = trDom.children[1];
......@@ -1074,17 +1077,19 @@
10741077 tdDesc.textContent = "";
10751078 }
10761079 }
1080 domListFns.innerHTML = "";
1081 domListFns.appendChild(domListFnsFragment);
10771082 domSectFns.classList.remove("hidden");
10781083 }
10791084
10801085 if (container.fields != null && container.fields.length !== 0) {
1081 resizeDomList(domListFields, container.fields.length, '<div></div>');
1086 var domListFieldsFragment = createDomListFragment(container.fields.length, '<div></div>');
10821087
10831088 var containerNode = zigAnalysis.astNodes[container.src];
10841089 for (var i = 0; i < container.fields.length; i += 1) {
10851090 var field = container.fields[i];
10861091 var fieldNode = zigAnalysis.astNodes[containerNode.fields[i]];
1087 var divDom = domListFields.children[i];
1092 var divDom = domListFieldsFragment.children[i];
10881093
10891094 var html = '<div class="mobile-scroll-container"><pre class="scroll-item">' + escapeHtml(fieldNode.name);
10901095
......@@ -1107,15 +1112,17 @@
11071112 }
11081113 divDom.innerHTML = html;
11091114 }
1115 domListFields.innerHTML = "";
1116 domListFields.appendChild(domListFieldsFragment);
11101117 domSectFields.classList.remove("hidden");
11111118 }
11121119
11131120 if (varsList.length !== 0) {
1114 resizeDomList(domListGlobalVars, varsList.length,
1121 var domListGlobalVarsFragment = createDomListFragment(varsList.length,
11151122 '<tr><td><a href="#"></a></td><td></td><td></td></tr>');
11161123 for (var i = 0; i < varsList.length; i += 1) {
11171124 var decl = varsList[i];
1118 var trDom = domListGlobalVars.children[i];
1125 var trDom = domListGlobalVarsFragment.children[i];
11191126
11201127 var tdName = trDom.children[0];
11211128 var tdNameA = tdName.children[0];
......@@ -1134,15 +1141,17 @@
11341141 tdDesc.textContent = "";
11351142 }
11361143 }
1144 domListGlobalVars.innerHTML = "";
1145 domListGlobalVars.appendChild(domListGlobalVarsFragment);
11371146 domSectGlobalVars.classList.remove("hidden");
11381147 }
11391148
11401149 if (valsList.length !== 0) {
1141 resizeDomList(domListValues, valsList.length,
1150 var domListValuesFragment = createDomListFragment(valsList.length,
11421151 '<tr><td><a href="#"></a></td><td></td><td></td></tr>');
11431152 for (var i = 0; i < valsList.length; i += 1) {
11441153 var decl = valsList[i];
1145 var trDom = domListValues.children[i];
1154 var trDom = domListValuesFragment.children[i];
11461155
11471156 var tdName = trDom.children[0];
11481157 var tdNameA = tdName.children[0];
......@@ -1161,6 +1170,8 @@
11611170 tdDesc.textContent = "";
11621171 }
11631172 }
1173 domListValues.innerHTML = "";
1174 domListValues.appendChild(domListValuesFragment);
11641175 domSectValues.classList.remove("hidden");
11651176 }
11661177 }
......@@ -1807,7 +1818,7 @@
18071818 if (ev.ctrlKey) name = "Ctrl+" + name;
18081819 return name;
18091820 }
1810
1821
18111822 function onWindowKeyDown(ev) {
18121823 switch (getKeyString(ev)) {
18131824 case "Esc":
......@@ -1839,6 +1850,13 @@
18391850 domHelpModal.focus();
18401851 }
18411852
1853 function onClickSearchShowAllResults(ev) {
1854 ev.preventDefault();
1855 ev.stopPropagation();
1856 searchTrimResults = false;
1857 onHashChange();
1858 }
1859
18421860 function clearAsyncSearch() {
18431861 if (searchTimer != null) {
18441862 clearTimeout(searchTimer);
......@@ -1848,7 +1866,8 @@
18481866
18491867 function startAsyncSearch() {
18501868 clearAsyncSearch();
1851 searchTimer = setTimeout(startSearch, 100);
1869 searchTrimResults = true;
1870 searchTimer = setTimeout(startSearch, 10);
18521871 }
18531872 function startSearch() {
18541873 clearAsyncSearch();
......@@ -1920,25 +1939,38 @@
19201939 }
19211940
19221941 if (matchedItems.length !== 0) {
1923 resizeDomList(domListSearchResults, matchedItems.length, '<li><a href="#"></a></li>');
1924
19251942 matchedItems.sort(function(a, b) {
19261943 var cmp = operatorCompare(b.points, a.points);
19271944 if (cmp != 0) return cmp;
19281945 return operatorCompare(a.decl.name, b.decl.name);
19291946 });
19301947
1948 var searchTrimmed = false
1949 var searchTrimResultsMaxItems = 200
1950 if (searchTrimResults && matchedItems.length > searchTrimResultsMaxItems) {
1951 matchedItems = matchedItems.slice(0, searchTrimResultsMaxItems)
1952 searchTrimmed = true
1953 }
1954
1955 var domListSearchResultsFragment = createDomListFragment(matchedItems.length, '<li><a href="#"></a></li>');
19311956 for (var i = 0; i < matchedItems.length; i += 1) {
1932 var liDom = domListSearchResults.children[i];
1957 var liDom = domListSearchResultsFragment.children[i];
19331958 var aDom = liDom.children[0];
19341959 var match = matchedItems[i];
19351960 var lastPkgName = match.path.pkgNames[match.path.pkgNames.length - 1];
19361961 aDom.textContent = lastPkgName + "." + match.path.declNames.join('.');
19371962 aDom.setAttribute('href', navLink(match.path.pkgNames, match.path.declNames));
19381963 }
1939 renderSearchCursor();
19401964
1965 domListSearchResults.innerHTML = "";
1966 domListSearchResults.appendChild(domListSearchResultsFragment);
19411967 domSectSearchResults.classList.remove("hidden");
1968
1969 if (searchTrimmed) {
1970 domSectSearchAllResultsLink.classList.remove("hidden");
1971 }
1972
1973 renderSearchCursor();
19421974 } else {
19431975 domSectSearchNoResults.classList.remove("hidden");
19441976 }