|
349 | 349 | var valLower = query.query.toLowerCase(),
|
350 | 350 | val = valLower,
|
351 | 351 | typeFilter = itemTypeFromName(query.type),
|
352 |
| - results = [], |
| 352 | + results = {}, |
353 | 353 | split = valLower.split("::");
|
354 | 354 |
|
355 | 355 | // remove empty keywords
|
|
360 | 360 | }
|
361 | 361 | }
|
362 | 362 |
|
| 363 | + function min(a, b) { |
| 364 | + if (a < b) { |
| 365 | + return a; |
| 366 | + } |
| 367 | + return b; |
| 368 | + } |
| 369 | + |
| 370 | + function nbElements(obj) { |
| 371 | + var size = 0, key; |
| 372 | + for (key in obj) { |
| 373 | + if (obj.hasOwnProperty(key)) { |
| 374 | + size += 1; |
| 375 | + } |
| 376 | + } |
| 377 | + return size; |
| 378 | + } |
| 379 | + |
363 | 380 | function findArg(obj, val) {
|
| 381 | + var lev_distance = MAX_LEV_DISTANCE + 1; |
364 | 382 | if (obj && obj.type && obj.type.inputs.length > 0) {
|
365 | 383 | for (var i = 0; i < obj.type.inputs.length; i++) {
|
366 | 384 | if (obj.type.inputs[i].name === val) {
|
367 |
| - return true; |
| 385 | + // No need to check anything else: we found it. Let's just move on. |
| 386 | + return 0; |
| 387 | + } |
| 388 | + lev_distance = min(levenshtein(obj.type.inputs[i].name, val), lev_distance); |
| 389 | + if (lev_distance === 0) { |
| 390 | + return 0; |
368 | 391 | }
|
369 | 392 | }
|
370 | 393 | }
|
371 |
| - return false; |
| 394 | + return lev_distance; |
| 395 | + } |
| 396 | + |
| 397 | + function checkReturned(obj, val) { |
| 398 | + var lev_distance = MAX_LEV_DISTANCE + 1; |
| 399 | + if (obj && obj.type && obj.type.output) { |
| 400 | + if (obj.type.output.name.toLowerCase() === val) { |
| 401 | + return 0; |
| 402 | + } |
| 403 | + lev_distance = min(levenshtein(obj.type.output.name, val)); |
| 404 | + if (lev_distance === 0) { |
| 405 | + return 0; |
| 406 | + } |
| 407 | + } |
| 408 | + return lev_distance; |
372 | 409 | }
|
373 | 410 |
|
374 | 411 | function typePassesFilter(filter, type) {
|
|
398 | 435 | if ((val.charAt(0) === "\"" || val.charAt(0) === "'") &&
|
399 | 436 | val.charAt(val.length - 1) === val.charAt(0))
|
400 | 437 | {
|
401 |
| - val = val.substr(1, val.length - 2); |
| 438 | + val = val.substr(1, val.length - 2).toLowerCase(); |
402 | 439 | for (var i = 0; i < nSearchWords; ++i) {
|
| 440 | + var ty = searchIndex[i]; |
403 | 441 | if (searchWords[i] === val) {
|
404 | 442 | // filter type: ... queries
|
405 | 443 | if (typePassesFilter(typeFilter, searchIndex[i].ty)) {
|
406 |
| - results.push({id: i, index: -1}); |
| 444 | + results[ty.path + ty.name] = {id: i, index: -1}; |
407 | 445 | }
|
408 |
| - } else if (findArg(searchIndex[i], val.toLowerCase()) || |
409 |
| - (searchIndex[i].type && |
410 |
| - searchIndex[i].type.output && |
411 |
| - searchIndex[i].type.output.name === val.toLowerCase())) { |
| 446 | + } else if (findArg(searchIndex[i], val) || |
| 447 | + (ty.type && |
| 448 | + ty.type.output && |
| 449 | + ty.type.output.name === val)) { |
412 | 450 | if (typePassesFilter(typeFilter, searchIndex[i].ty)) {
|
413 |
| - results.push({id: i, index: -1, dontValidate: true}); |
| 451 | + results[ty.path + ty.name] = { |
| 452 | + id: i, |
| 453 | + index: -1, |
| 454 | + dontValidate: true, |
| 455 | + }; |
414 | 456 | }
|
415 | 457 | }
|
416 |
| - if (results.length === max) { |
| 458 | + if (nbElements(results) === max) { |
417 | 459 | break;
|
418 | 460 | }
|
419 | 461 | }
|
|
431 | 473 |
|
432 | 474 | for (var i = 0; i < nSearchWords; ++i) {
|
433 | 475 | var type = searchIndex[i].type;
|
| 476 | + var ty = searchIndex[i]; |
434 | 477 | if (!type) {
|
435 | 478 | continue;
|
436 | 479 | }
|
|
444 | 487 | var typeOutput = type.output ? type.output.name : "";
|
445 | 488 | if (output === "*" || output == typeOutput) {
|
446 | 489 | if (input === "*") {
|
447 |
| - results.push({id: i, index: -1, dontValidate: true}); |
| 490 | + results[ty.path + ty.name] = {id: i, index: -1, dontValidate: true}; |
448 | 491 | } else {
|
449 | 492 | var allFound = true;
|
450 | 493 | for (var it = 0; allFound === true && it < inputs.length; it++) {
|
|
455 | 498 | allFound = found;
|
456 | 499 | }
|
457 | 500 | if (allFound === true) {
|
458 |
| - results.push({id: i, index: -1, dontValidate: true}); |
| 501 | + results[ty.path + ty.name] = { |
| 502 | + id: i, |
| 503 | + index: -1, |
| 504 | + dontValidate: true, |
| 505 | + }; |
459 | 506 | }
|
460 | 507 | }
|
461 | 508 | }
|
|
471 | 518 | for (var i = 0; i < split.length; ++i) {
|
472 | 519 | for (var j = 0; j < nSearchWords; ++j) {
|
473 | 520 | var lev_distance;
|
| 521 | + var ty = searchIndex[j]; |
| 522 | + if (!ty) { |
| 523 | + continue; |
| 524 | + } |
474 | 525 | if (searchWords[j].indexOf(split[i]) > -1 ||
|
475 | 526 | searchWords[j].indexOf(val) > -1 ||
|
476 | 527 | searchWords[j].replace(/_/g, "").indexOf(val) > -1)
|
477 | 528 | {
|
478 | 529 | // filter type: ... queries
|
479 | 530 | if (typePassesFilter(typeFilter, searchIndex[j].ty)) {
|
480 |
| - results.push({ |
| 531 | + results[ty.path + ty.name] = { |
481 | 532 | id: j,
|
482 | 533 | index: searchWords[j].replace(/_/g, "").indexOf(val),
|
483 | 534 | lev: 0,
|
484 |
| - }); |
| 535 | + }; |
485 | 536 | }
|
486 | 537 | } else if (
|
487 |
| - (lev_distance = levenshtein(searchWords[j], val)) <= |
488 |
| - MAX_LEV_DISTANCE) { |
| 538 | + (lev_distance = levenshtein(searchWords[j], val)) <= MAX_LEV_DISTANCE) { |
489 | 539 | if (typePassesFilter(typeFilter, searchIndex[j].ty)) {
|
490 |
| - results.push({ |
491 |
| - id: j, |
492 |
| - index: 0, |
493 |
| - // we want lev results to go lower than others |
494 |
| - lev: lev_distance, |
495 |
| - }); |
| 540 | + if (results[ty.path + ty.name] === undefined || |
| 541 | + results[ty.path + ty.name].lev > lev_distance) { |
| 542 | + results[ty.path + ty.name] = { |
| 543 | + id: j, |
| 544 | + index: 0, |
| 545 | + // we want lev results to go lower than others |
| 546 | + lev: lev_distance, |
| 547 | + }; |
| 548 | + } |
496 | 549 | }
|
497 |
| - } else if (findArg(searchIndex[j], val)) { |
| 550 | + } else if ( |
| 551 | + (lev_distance = findArg(searchIndex[j], val)) <= MAX_LEV_DISTANCE) { |
498 | 552 | if (typePassesFilter(typeFilter, searchIndex[j].ty)) {
|
499 |
| - results.push({ |
500 |
| - id: j, |
501 |
| - index: 0, |
502 |
| - // we want lev results to go lower than others |
503 |
| - lev: lev_distance, |
504 |
| - }); |
| 553 | + if (results[ty.path + ty.name] === undefined || |
| 554 | + results[ty.path + ty.name].lev > lev_distance) { |
| 555 | + results[ty.path + ty.name] = { |
| 556 | + id: j, |
| 557 | + index: 0, |
| 558 | + // we want lev results to go lower than others |
| 559 | + lev: lev_distance, |
| 560 | + }; |
| 561 | + } |
| 562 | + } |
| 563 | + } else if ( |
| 564 | + (lev_distance = checkReturned(searchIndex[j], val)) <= |
| 565 | + MAX_LEV_DISTANCE) { |
| 566 | + if (typePassesFilter(typeFilter, searchIndex[j].ty)) { |
| 567 | + if (results[ty.path + ty.name] === undefined || |
| 568 | + results[ty.path + ty.name].lev > lev_distance) { |
| 569 | + results[ty.path + ty.name] = { |
| 570 | + id: j, |
| 571 | + index: 0, |
| 572 | + // we want lev results to go lower than others |
| 573 | + lev: lev_distance, |
| 574 | + }; |
| 575 | + } |
505 | 576 | }
|
506 | 577 | }
|
507 |
| - if (results.length === max) { |
| 578 | + if (nbElements(results) === max) { |
508 | 579 | break;
|
509 | 580 | }
|
510 | 581 | }
|
511 | 582 | }
|
512 | 583 | }
|
513 | 584 |
|
| 585 | + var ar = []; |
| 586 | + for (var entry in results) { |
| 587 | + if (results.hasOwnProperty(entry)) { |
| 588 | + ar.push(results[entry]); |
| 589 | + } |
| 590 | + } |
| 591 | + results = ar; |
514 | 592 | var nresults = results.length;
|
515 | 593 | for (var i = 0; i < nresults; ++i) {
|
516 | 594 | results[i].word = searchWords[results[i].id];
|
|
586 | 664 | return 0;
|
587 | 665 | });
|
588 | 666 |
|
589 |
| - // remove duplicates, according to the data provided |
590 |
| - for (var i = results.length - 1; i > 0; i -= 1) { |
591 |
| - if (results[i].word === results[i - 1].word && |
592 |
| - results[i].item.ty === results[i - 1].item.ty && |
593 |
| - results[i].item.path === results[i - 1].item.path && |
594 |
| - (results[i].item.parent || {}).name === (results[i - 1].item.parent || {}).name) |
595 |
| - { |
596 |
| - results[i].id = -1; |
597 |
| - } |
598 |
| - } |
599 | 667 | for (var i = 0; i < results.length; ++i) {
|
600 | 668 | var result = results[i],
|
601 | 669 | name = result.item.name.toLowerCase(),
|
|
884 | 952 | elems[0].onclick = function() { printTab(0); };
|
885 | 953 | elems[1].onclick = function() { printTab(1); };
|
886 | 954 | elems[2].onclick = function() { printTab(2); };
|
| 955 | + printTab(currentTab); |
887 | 956 | }
|
888 | 957 |
|
889 | 958 | function search(e) {
|
|
951 | 1020 | }
|
952 | 1021 | }
|
953 | 1022 | if (results['others'].length < maxResults &&
|
954 |
| - ((query.search && obj.name.indexOf(query.search)) || added === false)) { |
| 1023 | + ((query.search && obj.name.indexOf(query.search) !== -1) || |
| 1024 | + added === false)) { |
955 | 1025 | results['others'].push(obj);
|
956 | 1026 | }
|
957 | 1027 | }
|
|
0 commit comments