authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-09 18:08:11-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-10-09 18:09:35-04:00
log6d54e8fc3c41247dc3fa5bd399733b629e9d621d
tree05f251af4c3cfd2fc5486f1ed4b0b2e4ba9dc2de
parent13ae7d47b77c4ac7b1769f3ac3b394c32ffebe6e
signaturelock-open Commit is signed but in an unrecognized format.

generated docs: render values

also fix pressing enter in search box before search finishes closes #3409

3 files changed, 127 insertions(+), 44 deletions(-)

lib/std/math.zig+3
......@@ -4,7 +4,10 @@ const TypeId = builtin.TypeId;
44const assert = std.debug.assert;
55const testing = std.testing;
66
7/// Euler's number (e)
78pub const e = 2.71828182845904523536028747135266249775724709369995;
9
10/// Archimedes' constant (π)
811pub const pi = 3.14159265358979323846264338327950288419716939937510;
912
1013// From a small c++ [program using boost float128](https://github.com/winksaville/cpp_boost_float128)
lib/std/special/docs/index.html+8-1
......@@ -156,7 +156,7 @@
156156 font-weight: bold;
157157 }
158158
159 #sectGlobalVars td, #sectFns td, #sectFields td {
159 td {
160160 vertical-align: top;
161161 margin: 0;
162162 padding: 0.5em;
......@@ -338,6 +338,13 @@
338338 </tbody>
339339 </table>
340340 </div>
341 <div id="sectValues" class="hidden">
342 <h2>Values</h2>
343 <table>
344 <tbody id="listValues">
345 </tbody>
346 </table>
347 </div>
341348 <div id="sectErrSets" class="hidden">
342349 <h2>Error Sets</h2>
343350 <ul id="listErrSets">
lib/std/special/docs/main.js+116-43
......@@ -16,6 +16,8 @@
1616 var domListFields = document.getElementById("listFields");
1717 var domSectGlobalVars = document.getElementById("sectGlobalVars");
1818 var domListGlobalVars = document.getElementById("listGlobalVars");
19 var domSectValues = document.getElementById("sectValues");
20 var domListValues = document.getElementById("listValues");
1921 var domFnProto = document.getElementById("fnProto");
2022 var domFnProtoCode = document.getElementById("fnProtoCode");
2123 var domFnDocs = document.getElementById("fnDocs");
......@@ -63,6 +65,7 @@
6365 };
6466 var curNavSearch = "";
6567 var curSearchIndex = -1;
68 var imFeelingLucky = false;
6669
6770 var rootIsStd = detectRootIsStd();
6871
......@@ -111,6 +114,7 @@
111114 domFnErrorsAnyError.classList.add("hidden");
112115 domTableFnErrors.classList.add("hidden");
113116 domSectGlobalVars.classList.add("hidden");
117 domSectValues.classList.add("hidden");
114118
115119 renderTitle();
116120 renderInfo();
......@@ -157,13 +161,13 @@
157161 var lastDecl = curNav.declObjs[curNav.declObjs.length - 1];
158162 if (lastDecl.kind === 'var') {
159163 return renderVar(lastDecl);
160 }
161 if (lastDecl.type != null) {
164 } else if (lastDecl.kind === 'const' && lastDecl.type != null) {
162165 var typeObj = zigAnalysis.types[lastDecl.type];
163166 if (typeObj.kind === typeKinds.Fn) {
164167 return renderFn(lastDecl);
168 } else {
169 return renderValue(lastDecl);
165170 }
166 throw new Error("docs for this decl which is not a container");
167171 }
168172 if (lastDecl.kind != null) {
169173 renderType(lastDecl);
......@@ -208,7 +212,7 @@
208212 var retType = zigAnalysis.types[typeObj.ret];
209213 if (retType.kind === typeKinds.ErrorSet) {
210214 errSetTypeIndex = typeObj.ret;
211 } else if (retType.kind === typeKinds.Union) {
215 } else if (retType.kind === typeKinds.ErrorUnion) {
212216 errSetTypeIndex = retType.err;
213217 }
214218 }
......@@ -515,7 +519,7 @@
515519 return typeObj.name;
516520 }
517521 }
518 case typeKinds.Union:
522 case typeKinds.ErrorUnion:
519523 var errSetTypeObj = zigAnalysis.types[typeObj.err];
520524 var payloadHtml = typeIndexName(typeObj.payload, wantHtml, wantSubLink, null);
521525 if (fnDecl != null && errSetTypeObj.fn === fnDecl.value) {
......@@ -625,6 +629,19 @@
625629 return true;
626630 }
627631
632 function renderValue(decl) {
633 domFnProtoCode.innerHTML = '<span class="tok-kw">pub</span> <span class="tok-kw">const</span> ' +
634 escapeHtml(decl.name) + ': ' + typeIndexName(decl.type, true, true);
635
636 var docs = zigAnalysis.astNodes[decl.src].docs;
637 if (docs != null) {
638 domFnDocs.innerHTML = markdown(docs);
639 domFnDocs.classList.remove("hidden");
640 }
641
642 domFnProto.classList.remove("hidden");
643 }
644
628645 function renderVar(decl) {
629646 domFnProtoCode.innerHTML = '<span class="tok-kw">pub</span> <span class="tok-kw">var</span> ' +
630647 escapeHtml(decl.name) + ': ' + typeIndexName(decl.type, true, true);
......@@ -644,13 +661,13 @@
644661 var errSetsList = [];
645662 var fnsList = [];
646663 var varsList = [];
664 var valsList = [];
647665 for (var i = 0; i < container.pubDecls.length; i += 1) {
648666 var decl = zigAnalysis.decls[container.pubDecls[i]];
649667 if (decl.kind === 'var') {
650668 varsList.push(decl);
651669 continue;
652 }
653 if (decl.type != null) {
670 } else if (decl.kind === 'const' && decl.type != null) {
654671 if (decl.type == typeTypeId) {
655672 if (typeIsErrSet(decl.value)) {
656673 errSetsList.push(decl);
......@@ -667,25 +684,18 @@
667684 } else {
668685 fnsList.push(decl);
669686 }
687 } else {
688 valsList.push(decl);
670689 }
671690 }
672691 }
673692 }
674 typesList.sort(function(a, b) {
675 return operatorCompare(a.name, b.name);
676 });
677 namespacesList.sort(function(a, b) {
678 return operatorCompare(a.name, b.name);
679 });
680 errSetsList.sort(function(a, b) {
681 return operatorCompare(a.name, b.name);
682 });
683 fnsList.sort(function(a, b) {
684 return operatorCompare(a.name, b.name);
685 });
686 varsList.sort(function(a, b) {
687 return operatorCompare(a.name, b.name);
688 });
693 typesList.sort(byNameProperty);
694 namespacesList.sort(byNameProperty);
695 errSetsList.sort(byNameProperty);
696 fnsList.sort(byNameProperty);
697 varsList.sort(byNameProperty);
698 valsList.sort(byNameProperty);
689699
690700 if (typesList.length !== 0) {
691701 resizeDomList(domListTypes, typesList.length, '<li><a href="#"></a></li>');
......@@ -793,6 +803,33 @@
793803 }
794804 domSectGlobalVars.classList.remove("hidden");
795805 }
806
807 if (valsList.length !== 0) {
808 resizeDomList(domListValues, valsList.length,
809 '<tr><td><a href="#"></a></td><td></td><td></td></tr>');
810 for (var i = 0; i < valsList.length; i += 1) {
811 var decl = valsList[i];
812 var trDom = domListValues.children[i];
813
814 var tdName = trDom.children[0];
815 var tdNameA = tdName.children[0];
816 var tdType = trDom.children[1];
817 var tdDesc = trDom.children[2];
818
819 tdNameA.setAttribute('href', navLinkDecl(decl.name));
820 tdNameA.textContent = decl.name;
821
822 tdType.innerHTML = typeIndexName(decl.type, true, true);
823
824 var docs = zigAnalysis.astNodes[decl.src].docs;
825 if (docs != null) {
826 tdDesc.innerHTML = shortDescMarkdown(docs);
827 } else {
828 tdDesc.textContent = "";
829 }
830 }
831 domSectValues.classList.remove("hidden");
832 }
796833 }
797834
798835 function operatorCompare(a, b) {
......@@ -840,7 +877,7 @@
840877 throw new Error("No type 'type' found");
841878 }
842879
843 function onHashChange() {
880 function updateCurNav() {
844881 curNav = {
845882 pkgNames: [],
846883 pkgObjs: [],
......@@ -865,10 +902,18 @@
865902 curNav.declNames = decodeURIComponent(parts[1]).split(".");
866903 }
867904 }
905 }
906
907 function onHashChange() {
908 updateCurNav();
868909 if (domSearch.value !== curNavSearch) {
869910 domSearch.value = curNavSearch;
870911 }
871912 render();
913 if (imFeelingLucky) {
914 imFeelingLucky = false;
915 activateSelectedResult();
916 }
872917 }
873918
874919 function findSubDecl(parentType, childName) {
......@@ -999,21 +1044,38 @@
9991044 return escapeHtml(mdText);
10001045 }
10011046
1047 function activateSelectedResult() {
1048 if (domSectSearchResults.classList.contains("hidden")) {
1049 return;
1050 }
1051
1052 var liDom = domListSearchResults.children[curSearchIndex];
1053 if (liDom == null && domListSearchResults.children.length !== 0) {
1054 liDom = domListSearchResults.children[0];
1055 }
1056 if (liDom != null) {
1057 var aDom = liDom.children[0];
1058 location.href = aDom.getAttribute("href");
1059 curSearchIndex = -1;
1060 }
1061 domSearch.blur();
1062 }
1063
10021064 function onSearchKeyDown(ev) {
10031065 switch (ev.which) {
10041066 case 13:
1005 var liDom = domListSearchResults.children[curSearchIndex];
1006 if (liDom == null && domListSearchResults.children.length !== 0) {
1007 liDom = domListSearchResults.children[0];
1008 }
1009 if (liDom != null) {
1010 var aDom = liDom.children[0];
1011 location.href = aDom.getAttribute("href");
1012 curSearchIndex = -1;
1013 ev.preventDefault();
1014 ev.stopPropagation();
1015 return;
1016 }
1067 // detect if this search changes anything
1068 var terms1 = getSearchTerms();
1069 startSearch();
1070 updateCurNav();
1071 var terms2 = getSearchTerms();
1072 // we might have to wait for onHashChange to trigger
1073 imFeelingLucky = (terms1.join(' ') !== terms2.join(' '));
1074 if (!imFeelingLucky) activateSelectedResult();
1075
1076 ev.preventDefault();
1077 ev.stopPropagation();
1078 return;
10171079 case 27:
10181080 domSearch.value = "";
10191081 domSearch.blur();
......@@ -1036,6 +1098,7 @@
10361098 curSearchIndex = -1;
10371099 ev.stopPropagation();
10381100 startAsyncSearch();
1101 return;
10391102 }
10401103 }
10411104
......@@ -1090,7 +1153,10 @@
10901153 }
10911154
10921155 function clearAsyncSearch() {
1093 if (searchTimer != null) clearTimeout(searchTimer);
1156 if (searchTimer != null) {
1157 clearTimeout(searchTimer);
1158 searchTimer = null;
1159 }
10941160 }
10951161
10961162 function startAsyncSearch() {
......@@ -1098,18 +1164,21 @@
10981164 searchTimer = setTimeout(startSearch, 100);
10991165 }
11001166 function startSearch() {
1101 var parts = location.hash.split("?");
1167 clearAsyncSearch();
1168 var oldHash = location.hash;
1169 var parts = oldHash.split("?");
11021170 var newPart2 = (domSearch.value === "") ? "" : ("?" + domSearch.value);
1103 if (parts.length === 1) {
1104 location.hash = location.hash + newPart2;
1105 } else {
1106 location.hash = parts[0] + newPart2;
1107 }
1171 location.hash = (parts.length === 1) ? (oldHash + newPart2) : (parts[0] + newPart2);
1172 }
1173 function getSearchTerms() {
1174 var list = curNavSearch.trim().split(/[ \r\n\t]+/);
1175 list.sort();
1176 return list;
11081177 }
11091178 function renderSearch() {
11101179 var matchedItems = [];
11111180 var ignoreCase = (curNavSearch.toLowerCase() === curNavSearch);
1112 var terms = curNavSearch.split(/[ \r\n\t]+/);
1181 var terms = getSearchTerms();
11131182
11141183 decl_loop: for (var declIndex = 0; declIndex < zigAnalysis.decls.length; declIndex += 1) {
11151184 var canonPath = getCanonDeclPath(declIndex);
......@@ -1226,4 +1295,8 @@
12261295 }
12271296 return map;
12281297 }
1298
1299 function byNameProperty(a, b) {
1300 return operatorCompare(a.name, b.name);
1301 }
12291302})();