|
377 | 377 | results = {},
|
378 | 378 | split = valLower.split("::");
|
379 | 379 |
|
380 |
| - // remove empty keywords |
381 |
| - for (var j = 0; j < split.length; ++j) { |
382 |
| - split[j].toLowerCase(); |
383 |
| - if (split[j] === "") { |
384 |
| - split.splice(j, 1); |
| 380 | + for (var z = 0; z < split.length; ++z) { |
| 381 | + if (split[z] === "") { |
| 382 | + split.splice(z, 1); |
| 383 | + z -= 1; |
385 | 384 | }
|
386 | 385 | }
|
387 | 386 |
|
|
408 | 407 | if (obj.generics &&
|
409 | 408 | obj.generics.length >= val.generics.length) {
|
410 | 409 | var elems = obj.generics.slice(0);
|
411 |
| - for (var y = 0; |
412 |
| - y < val.generics.length; |
413 |
| - ++y) { |
| 410 | + for (var y = 0; y < val.generics.length; ++y) { |
414 | 411 | // The point here is to find the type that matches the most.
|
415 | 412 | var lev = { pos: -1, lev: MAX_LEV_DISTANCE + 1};
|
416 | 413 | for (var x = 0; x < elems.length; ++x) {
|
|
532 | 529 | return literalSearch === true ? false : lev_distance;
|
533 | 530 | }
|
534 | 531 |
|
| 532 | + function checkPath(startsWith, lastElem, ty) { |
| 533 | + var ret_lev = MAX_LEV_DISTANCE + 1; |
| 534 | + var path = ty.path.split("::"); |
| 535 | + |
| 536 | + if (ty.parent && ty.parent.name) { |
| 537 | + path.push(ty.parent.name.toLowerCase()); |
| 538 | + } |
| 539 | + |
| 540 | + if (startsWith.length > path.length) { |
| 541 | + return MAX_LEV_DISTANCE + 1; |
| 542 | + } |
| 543 | + for (var i = 0; i < path.length; ++i) { |
| 544 | + if (i + startsWith.length > path.length) { |
| 545 | + break; |
| 546 | + } |
| 547 | + var lev_total = 0; |
| 548 | + var aborted = false; |
| 549 | + for (var x = 0; x < startsWith.length; ++x) { |
| 550 | + var lev = levenshtein(path[i + x], startsWith[x]); |
| 551 | + if (lev > MAX_LEV_DISTANCE) { |
| 552 | + aborted = true; |
| 553 | + break; |
| 554 | + } |
| 555 | + lev_total += lev; |
| 556 | + } |
| 557 | + if (aborted === false) { |
| 558 | + var extra = MAX_LEV_DISTANCE + 1; |
| 559 | + if (i + startsWith.length < path.length) { |
| 560 | + extra = levenshtein(path[i + startsWith.length], lastElem); |
| 561 | + } |
| 562 | + if (extra > MAX_LEV_DISTANCE) { |
| 563 | + extra = levenshtein(ty.name, lastElem); |
| 564 | + } |
| 565 | + if (extra < MAX_LEV_DISTANCE + 1) { |
| 566 | + lev_total += extra; |
| 567 | + ret_lev = Math.min(ret_lev, |
| 568 | + Math.round(lev_total / (startsWith.length + 1))); |
| 569 | + } |
| 570 | + } |
| 571 | + } |
| 572 | + return ret_lev; |
| 573 | + } |
| 574 | + |
535 | 575 | function typePassesFilter(filter, type) {
|
536 | 576 | // No filter
|
537 | 577 | if (filter < 0) return true;
|
|
668 | 708 | query.search = val;
|
669 | 709 | // gather matching search results up to a certain maximum
|
670 | 710 | val = val.replace(/\_/g, "");
|
671 |
| - var valGenerics = extractGenerics(val); |
| 711 | + |
672 | 712 | var results_length = 0;
|
673 |
| - for (var i = 0; i < split.length; ++i) { |
674 |
| - for (var j = 0; j < nSearchWords; ++j) { |
675 |
| - var lev_distance; |
676 |
| - var ty = searchIndex[j]; |
677 |
| - if (!ty) { |
| 713 | + var valGenerics = extractGenerics(val); |
| 714 | + |
| 715 | + var paths = valLower.split("::"); |
| 716 | + var j; |
| 717 | + for (j = 0; j < paths.length; ++j) { |
| 718 | + if (paths[j] === "") { |
| 719 | + paths.splice(j, 1); |
| 720 | + j -= 1; |
| 721 | + } |
| 722 | + } |
| 723 | + val = paths[paths.length - 1]; |
| 724 | + var startsWith = paths.slice(0, paths.length > 1 ? paths.length - 1 : 1); |
| 725 | + |
| 726 | + for (j = 0; j < nSearchWords; ++j) { |
| 727 | + var lev_distance; |
| 728 | + var ty = searchIndex[j]; |
| 729 | + if (!ty) { |
| 730 | + continue; |
| 731 | + } |
| 732 | + var lev_add = 0; |
| 733 | + if (paths.length > 1) { |
| 734 | + var lev = checkPath(startsWith, paths[paths.length - 1], ty); |
| 735 | + if (lev > MAX_LEV_DISTANCE) { |
678 | 736 | continue;
|
| 737 | + } else if (lev > 0) { |
| 738 | + lev_add = 1; |
679 | 739 | }
|
680 |
| - var returned = false; |
681 |
| - var in_args = false; |
682 |
| - var index = -1; |
683 |
| - // we want lev results to go lower than others |
684 |
| - var lev = MAX_LEV_DISTANCE; |
685 |
| - var fullId = itemTypes[ty.ty] + ty.path + ty.name; |
686 |
| - |
687 |
| - if (searchWords[j].indexOf(split[i]) > -1 || |
688 |
| - searchWords[j].indexOf(val) > -1 || |
689 |
| - searchWords[j].replace(/_/g, "").indexOf(val) > -1) |
690 |
| - { |
691 |
| - // filter type: ... queries |
692 |
| - if (typePassesFilter(typeFilter, ty) && |
693 |
| - results[fullId] === undefined) { |
694 |
| - index = searchWords[j].replace(/_/g, "").indexOf(val); |
695 |
| - } |
| 740 | + } |
| 741 | + |
| 742 | + var returned = false; |
| 743 | + var in_args = false; |
| 744 | + var index = -1; |
| 745 | + // we want lev results to go lower than others |
| 746 | + var lev = MAX_LEV_DISTANCE + 1; |
| 747 | + var fullId = itemTypes[ty.ty] + ty.path + ty.name; |
| 748 | + |
| 749 | + if (searchWords[j].indexOf(val) > -1 || |
| 750 | + searchWords[j].replace(/_/g, "").indexOf(val) > -1) |
| 751 | + { |
| 752 | + // filter type: ... queries |
| 753 | + if (typePassesFilter(typeFilter, ty) && |
| 754 | + results[fullId] === undefined) { |
| 755 | + index = searchWords[j].replace(/_/g, "").indexOf(val); |
696 | 756 | }
|
697 |
| - if ((lev_distance = levenshtein(searchWords[j], val)) <= MAX_LEV_DISTANCE) { |
698 |
| - if (typePassesFilter(typeFilter, ty) && |
699 |
| - (results[fullId] === undefined || |
700 |
| - results[fullId].lev > lev_distance)) { |
701 |
| - lev = Math.min(lev, lev_distance); |
702 |
| - index = Math.max(0, index); |
703 |
| - } |
| 757 | + } |
| 758 | + if ((lev_distance = levenshtein(searchWords[j], val)) <= MAX_LEV_DISTANCE) { |
| 759 | + if (typePassesFilter(typeFilter, ty) && |
| 760 | + (results[fullId] === undefined || |
| 761 | + results[fullId].lev > lev_distance)) { |
| 762 | + lev = Math.min(lev, lev_distance); |
| 763 | + index = Math.max(0, index); |
704 | 764 | }
|
705 |
| - if ((lev_distance = findArg(searchIndex[j], valGenerics)) |
706 |
| - <= MAX_LEV_DISTANCE) { |
707 |
| - if (typePassesFilter(typeFilter, ty) && |
708 |
| - (results[fullId] === undefined || |
709 |
| - results[fullId].lev > lev_distance)) { |
710 |
| - in_args = true; |
711 |
| - lev = Math.min(lev_distance, lev); |
712 |
| - index = Math.max(0, index); |
713 |
| - } |
| 765 | + } |
| 766 | + if ((lev_distance = findArg(searchIndex[j], valGenerics)) |
| 767 | + <= MAX_LEV_DISTANCE) { |
| 768 | + if (typePassesFilter(typeFilter, ty) && |
| 769 | + (results[fullId] === undefined || |
| 770 | + results[fullId].lev > lev_distance)) { |
| 771 | + in_args = true; |
| 772 | + lev = Math.min(lev_distance, lev); |
| 773 | + index = Math.max(0, index); |
714 | 774 | }
|
715 |
| - if ((lev_distance = checkReturned(searchIndex[j], valGenerics)) <= |
716 |
| - MAX_LEV_DISTANCE) { |
717 |
| - if (typePassesFilter(typeFilter, ty) && |
718 |
| - (results[fullId] === undefined || |
719 |
| - results[fullId].lev > lev_distance)) { |
720 |
| - returned = true; |
721 |
| - lev = Math.min(lev_distance, lev); |
722 |
| - index = Math.max(0, index); |
723 |
| - } |
| 775 | + } |
| 776 | + if ((lev_distance = checkReturned(searchIndex[j], valGenerics)) <= |
| 777 | + MAX_LEV_DISTANCE) { |
| 778 | + if (typePassesFilter(typeFilter, ty) && |
| 779 | + (results[fullId] === undefined || |
| 780 | + results[fullId].lev > lev_distance)) { |
| 781 | + returned = true; |
| 782 | + lev = Math.min(lev_distance, lev); |
| 783 | + index = Math.max(0, index); |
724 | 784 | }
|
725 |
| - if (index !== -1) { |
726 |
| - if (results[fullId] === undefined) { |
727 |
| - results[fullId] = { |
728 |
| - id: j, |
729 |
| - index: index, |
730 |
| - lev: lev, |
731 |
| - in_args: in_args, |
732 |
| - returned: returned, |
733 |
| - }; |
734 |
| - results_length += 1; |
735 |
| - } else { |
736 |
| - if (results[fullId].lev > lev) { |
737 |
| - results[fullId].lev = lev; |
738 |
| - } |
739 |
| - if (in_args === true) { |
740 |
| - results[fullId].in_args = true; |
741 |
| - } |
742 |
| - if (returned === true) { |
743 |
| - results[fullId].returned = true; |
744 |
| - } |
| 785 | + } |
| 786 | + lev += lev_add; |
| 787 | + if (index !== -1) { |
| 788 | + if (results[fullId] === undefined) { |
| 789 | + results[fullId] = { |
| 790 | + id: j, |
| 791 | + index: index, |
| 792 | + lev: lev, |
| 793 | + in_args: in_args, |
| 794 | + returned: returned, |
| 795 | + }; |
| 796 | + results_length += 1; |
| 797 | + } else { |
| 798 | + if (results[fullId].lev > lev) { |
| 799 | + results[fullId].lev = lev; |
| 800 | + } |
| 801 | + if (in_args === true) { |
| 802 | + results[fullId].in_args = true; |
| 803 | + } |
| 804 | + if (returned === true) { |
| 805 | + results[fullId].returned = true; |
745 | 806 | }
|
746 | 807 | }
|
747 |
| - if (results_length === max) { |
748 |
| - break; |
749 |
| - } |
| 808 | + } |
| 809 | + if (results_length === max) { |
| 810 | + break; |
750 | 811 | }
|
751 | 812 | }
|
752 | 813 | }
|
|
837 | 898 | var result = results[i];
|
838 | 899 |
|
839 | 900 | // this validation does not make sense when searching by types
|
840 |
| - if (result.dontValidate) { |
| 901 | + if (result.dontValidate || result.returned === true && result.param === true) { |
841 | 902 | continue;
|
842 | 903 | }
|
843 | 904 | var name = result.item.name.toLowerCase(),
|
844 | 905 | path = result.item.path.toLowerCase(),
|
845 | 906 | parent = result.item.parent;
|
846 | 907 |
|
847 |
| - if (result.returned === false && result.param === false && |
848 |
| - validateResult(name, path, split, parent) === false) |
849 |
| - { |
| 908 | + if (validateResult(name, path, split, parent) === false) { |
850 | 909 | result.id = -1;
|
851 | 910 | }
|
852 | 911 | }
|
|
0 commit comments