|
342 | 342 | }
|
343 | 343 | }
|
344 | 344 |
|
| 345 | + function findArg(obj, val) { |
| 346 | + if (obj && obj.type && obj.type.inputs.length > 0) { |
| 347 | + for (var i = 0; i < obj.type.inputs.length; i++) { |
| 348 | + if (obj.type.inputs[i].name === val) { |
| 349 | + return true; |
| 350 | + } |
| 351 | + } |
| 352 | + } |
| 353 | + return false; |
| 354 | + } |
| 355 | + |
345 | 356 | function typePassesFilter(filter, type) {
|
346 | 357 | // No filter
|
347 | 358 | if (filter < 0) return true;
|
|
376 | 387 | if (typePassesFilter(typeFilter, searchIndex[i].ty)) {
|
377 | 388 | results.push({id: i, index: -1});
|
378 | 389 | }
|
| 390 | + } else if (findArg(searchIndex[i], val.toLowerCase()) || |
| 391 | + (searchIndex[i].type && |
| 392 | + searchIndex[i].type.output && |
| 393 | + searchIndex[i].type.output.name === val.toLowerCase())) { |
| 394 | + if (typePassesFilter(typeFilter, searchIndex[i].ty)) { |
| 395 | + results.push({id: i, index: -1, dontValidate: true}); |
| 396 | + } |
379 | 397 | }
|
380 | 398 | if (results.length === max) {
|
381 | 399 | break;
|
382 | 400 | }
|
383 | 401 | }
|
| 402 | + query.inputs = [val]; |
| 403 | + query.output = val; |
| 404 | + query.search = val; |
384 | 405 | // searching by type
|
385 | 406 | } else if (val.search("->") > -1) {
|
386 | 407 | var trimmer = function (s) { return s.trim(); };
|
387 | 408 | var parts = val.split("->").map(trimmer);
|
388 | 409 | var input = parts[0];
|
389 | 410 | // sort inputs so that order does not matter
|
390 |
| - var inputs = input.split(",").map(trimmer).sort().toString(); |
| 411 | + var inputs = input.split(",").map(trimmer).sort(); |
391 | 412 | var output = parts[1];
|
392 | 413 |
|
393 | 414 | for (var i = 0; i < nSearchWords; ++i) {
|
|
403 | 424 |
|
404 | 425 | // allow searching for void (no output) functions as well
|
405 | 426 | var typeOutput = type.output ? type.output.name : "";
|
406 |
| - if ((inputs === "*" || inputs === typeInputs.toString()) && |
407 |
| - (output === "*" || output == typeOutput)) { |
408 |
| - results.push({id: i, index: -1, dontValidate: true}); |
| 427 | + if (output === "*" || output == typeOutput) { |
| 428 | + if (input === "*") { |
| 429 | + results.push({id: i, index: -1, dontValidate: true}); |
| 430 | + } else { |
| 431 | + var allFound = true; |
| 432 | + for (var it = 0; allFound === true && it < inputs.length; it++) { |
| 433 | + var found = false; |
| 434 | + for (var y = 0; found === false && y < typeInputs.length; y++) { |
| 435 | + found = typeInputs[y] === inputs[it]; |
| 436 | + } |
| 437 | + allFound = found; |
| 438 | + } |
| 439 | + if (allFound === true) { |
| 440 | + results.push({id: i, index: -1, dontValidate: true}); |
| 441 | + } |
| 442 | + } |
409 | 443 | }
|
410 | 444 | }
|
| 445 | + query.inputs = inputs; |
| 446 | + query.output = output; |
411 | 447 | } else {
|
| 448 | + query.inputs = [val]; |
| 449 | + query.output = val; |
| 450 | + query.search = val; |
412 | 451 | // gather matching search results up to a certain maximum
|
413 | 452 | val = val.replace(/\_/g, "");
|
414 | 453 | for (var i = 0; i < split.length; ++i) {
|
|
437 | 476 | lev: lev_distance,
|
438 | 477 | });
|
439 | 478 | }
|
| 479 | + } else if (findArg(searchIndex[j], val)) { |
| 480 | + if (typePassesFilter(typeFilter, searchIndex[j].ty)) { |
| 481 | + results.push({ |
| 482 | + id: j, |
| 483 | + index: 0, |
| 484 | + // we want lev results to go lower than others |
| 485 | + lev: lev_distance, |
| 486 | + }); |
| 487 | + } |
440 | 488 | }
|
441 | 489 | if (results.length === max) {
|
442 | 490 | break;
|
|
576 | 624 | (parent !== undefined &&
|
577 | 625 | parent.name.toLowerCase().indexOf(keys[i]) > -1) ||
|
578 | 626 | // lastly check to see if the name was a levenshtein match
|
579 |
| - levenshtein(name.toLowerCase(), keys[i]) <= |
580 |
| - MAX_LEV_DISTANCE)) { |
| 627 | + levenshtein(name.toLowerCase(), keys[i]) <= MAX_LEV_DISTANCE)) { |
581 | 628 | return false;
|
582 | 629 | }
|
583 | 630 | }
|
|
692 | 739 | return h1.innerHTML;
|
693 | 740 | }
|
694 | 741 |
|
695 |
| - function showResults(results) { |
696 |
| - var output, shown, query = getQuery(); |
697 |
| - |
698 |
| - currentResults = query.id; |
699 |
| - output = '<h1>Results for ' + escape(query.query) + |
700 |
| - (query.type ? ' (type: ' + escape(query.type) + ')' : '') + '</h1>'; |
701 |
| - output += '<table class="search-results">'; |
| 742 | + function addTab(array, query, display) { |
| 743 | + var extraStyle = ''; |
| 744 | + if (display === false) { |
| 745 | + extraStyle = ' style="display: none;"'; |
| 746 | + } |
702 | 747 |
|
703 |
| - if (results.length > 0) { |
704 |
| - shown = []; |
| 748 | + var output = ''; |
| 749 | + if (array.length > 0) { |
| 750 | + output = `<table class="search-results"${extraStyle}>`; |
| 751 | + var shown = []; |
705 | 752 |
|
706 |
| - results.forEach(function(item) { |
| 753 | + array.forEach(function(item) { |
707 | 754 | var name, type, href, displayPath;
|
708 | 755 |
|
709 | 756 | if (shown.indexOf(item) !== -1) {
|
|
752 | 799 | '<span class="desc">' + escape(item.desc) +
|
753 | 800 | ' </span></a></td></tr>';
|
754 | 801 | });
|
| 802 | + output += '</table>'; |
755 | 803 | } else {
|
756 |
| - output += 'No results :( <a href="https://duckduckgo.com/?q=' + |
| 804 | + output = `<div class="search-failed"${extraStyle}>No results :(<br/>` + |
| 805 | + 'Try on <a href="https://duckduckgo.com/?q=' + |
757 | 806 | encodeURIComponent('rust ' + query.query) +
|
758 |
| - '">Try on DuckDuckGo?</a>'; |
| 807 | + '">DuckDuckGo</a>?</div>'; |
759 | 808 | }
|
| 809 | + return output; |
| 810 | + } |
| 811 | + |
| 812 | + function showResults(results) { |
| 813 | + var output, query = getQuery(); |
| 814 | + |
| 815 | + currentResults = query.id; |
| 816 | + output = '<h1>Results for ' + escape(query.query) + |
| 817 | + (query.type ? ' (type: ' + escape(query.type) + ')' : '') + '</h1>' + |
| 818 | + '<div id="titles">' + |
| 819 | + '<div class="selected">Types/modules</div>' + |
| 820 | + '<div>As parameters</div>' + |
| 821 | + '<div>As return value</div></div><div id="results">'; |
| 822 | + |
| 823 | + output += addTab(results['others'], query); |
| 824 | + output += addTab(results['in_args'], query, false); |
| 825 | + output += addTab(results['returned'], query, false); |
| 826 | + output += '</div>'; |
760 | 827 |
|
761 |
| - output += "</p>"; |
762 | 828 | addClass(document.getElementById('main'), 'hidden');
|
763 | 829 | var search = document.getElementById('search');
|
764 | 830 | removeClass(search, 'hidden');
|
|
773 | 839 | e.style.width = width + 'px';
|
774 | 840 | });
|
775 | 841 | initSearchNav();
|
| 842 | + var elems = document.getElementById('titles').childNodes; |
| 843 | + elems[0].onclick = function() { printTab(0); }; |
| 844 | + elems[1].onclick = function() { printTab(1); }; |
| 845 | + elems[2].onclick = function() { printTab(2); }; |
776 | 846 | }
|
777 | 847 |
|
778 | 848 | function search(e) {
|
779 | 849 | var query,
|
780 | 850 | filterdata = [],
|
781 | 851 | obj, i, len,
|
782 |
| - results = [], |
| 852 | + results = {"in_args": [], "returned": [], "others": []}, |
783 | 853 | maxResults = 200,
|
784 | 854 | resultIndex;
|
785 | 855 | var params = getQueryStringParams();
|
|
810 | 880 | len = resultIndex.length;
|
811 | 881 | for (i = 0; i < len; ++i) {
|
812 | 882 | if (resultIndex[i].id > -1) {
|
| 883 | + var added = false; |
813 | 884 | obj = searchIndex[resultIndex[i].id];
|
814 | 885 | filterdata.push([obj.name, obj.ty, obj.path, obj.desc]);
|
815 |
| - results.push(obj); |
| 886 | + if (obj.type) { |
| 887 | + if (results['returned'].length < maxResults && |
| 888 | + obj.type.output && |
| 889 | + obj.type.output.name.toLowerCase() === query.output) { |
| 890 | + results['returned'].push(obj); |
| 891 | + added = true; |
| 892 | + } |
| 893 | + if (results['in_args'].length < maxResults && obj.type.inputs.length > 0) { |
| 894 | + var all_founds = true; |
| 895 | + for (var it = 0; |
| 896 | + all_founds === true && it < query.inputs.length; |
| 897 | + it++) { |
| 898 | + var found = false; |
| 899 | + for (var y = 0; |
| 900 | + found === false && y < obj.type.inputs.length; |
| 901 | + y++) { |
| 902 | + found = query.inputs[it] === obj.type.inputs[y].name; |
| 903 | + } |
| 904 | + all_founds = found; |
| 905 | + } |
| 906 | + if (all_founds === true) { |
| 907 | + results['in_args'].push(obj); |
| 908 | + added = true; |
| 909 | + } |
| 910 | + } |
| 911 | + } |
| 912 | + if (results['others'].length < maxResults && |
| 913 | + ((query.search && obj.name.indexOf(query.search)) || added === false)) { |
| 914 | + results['others'].push(obj); |
| 915 | + } |
816 | 916 | }
|
817 |
| - if (results.length >= maxResults) { |
| 917 | + if (results['others'].length >= maxResults && |
| 918 | + results['in_args'].length >= maxResults && |
| 919 | + results['returned'].length >= maxResults) { |
818 | 920 | break;
|
819 | 921 | }
|
820 | 922 | }
|
|
1290 | 1392 | return wrapper;
|
1291 | 1393 | }
|
1292 | 1394 |
|
| 1395 | + // In the search display, allows to switch between tabs. |
| 1396 | + function printTab(nb) { |
| 1397 | + var nb_copy = nb; |
| 1398 | + onEach(document.getElementById('titles').childNodes, function(elem) { |
| 1399 | + if (nb_copy === 0) { |
| 1400 | + addClass(elem, 'selected'); |
| 1401 | + } else { |
| 1402 | + removeClass(elem, 'selected'); |
| 1403 | + } |
| 1404 | + nb_copy -= 1; |
| 1405 | + }); |
| 1406 | + onEach(document.getElementById('results').childNodes, function(elem) { |
| 1407 | + if (nb === 0) { |
| 1408 | + elem.style.display = ''; |
| 1409 | + } else { |
| 1410 | + elem.style.display = 'none'; |
| 1411 | + } |
| 1412 | + nb -= 1; |
| 1413 | + }); |
| 1414 | + } |
| 1415 | + |
1293 | 1416 | onEach(document.getElementById('main').getElementsByTagName('pre'), function(e) {
|
1294 | 1417 | onEach(e.getElementsByClassName('attributes'), function(i_e) {
|
1295 | 1418 | i_e.parentNode.insertBefore(createToggleWrapper(), i_e);
|
|
0 commit comments