|
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