Skip to content

Commit 0cebb14

Browse files
committed
added Helpers::getSuggestion()
1 parent c1db15e commit 0cebb14

File tree

4 files changed

+57
-12
lines changed

4 files changed

+57
-12
lines changed

src/Utils/Helpers.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,22 @@ public static function falseToNull($val)
3232
{
3333
return $val === false ? null : $val;
3434
}
35+
36+
37+
/**
38+
* Finds the best suggestion (for 8-bit encoding).
39+
* @param string[] $possibilities
40+
*/
41+
public static function getSuggestion(array $possibilities, string $value): ?string
42+
{
43+
$best = null;
44+
$min = (strlen($value) / 4 + 1) * 10 + .1;
45+
foreach (array_unique($possibilities) as $item) {
46+
if ($item !== $value && ($len = levenshtein($item, $value, 10, 11, 10)) < $min) {
47+
$min = $len;
48+
$best = $item;
49+
}
50+
}
51+
return $best;
52+
}
3553
}

src/Utils/ObjectHelpers.php

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -131,20 +131,18 @@ public static function getMagicProperties(string $class): array
131131
*/
132132
public static function getSuggestion(array $possibilities, string $value): ?string
133133
{
134-
$norm = preg_replace($re = '#^(get|set|has|is|add)(?=[A-Z])#', '', $value);
135-
$best = null;
136-
$min = (strlen($value) / 4 + 1) * 10 + .1;
137-
foreach (array_unique($possibilities, SORT_REGULAR) as $item) {
134+
foreach ($possibilities as &$item) {
138135
$item = $item instanceof \Reflector ? $item->getName() : $item;
139-
if ($item !== $value && (
140-
($len = levenshtein($item, $value, 10, 11, 10)) < $min
141-
|| ($len = levenshtein(preg_replace($re, '', $item), $norm, 10, 11, 10) + 20) < $min
142-
)) {
143-
$min = $len;
144-
$best = $item;
145-
}
146136
}
147-
return $best;
137+
if ($res = Helpers::getSuggestion($possibilities, $value)) {
138+
return $res;
139+
}
140+
$norm = preg_replace($re = '#^(get|set|has|is|add)(?=[A-Z])#', '+', $value);
141+
$dict = [];
142+
foreach ($possibilities as $item) {
143+
$dict[preg_replace($re, '*', $item)] = $item === $value ? null : $item;
144+
}
145+
return $dict[Helpers::getSuggestion(array_keys($dict), $norm)] ?? null;
148146
}
149147

150148

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Nette\Utils\Helpers;
6+
use Tester\Assert;
7+
8+
9+
require __DIR__ . '/../bootstrap.php';
10+
11+
12+
Assert::same(null, Helpers::getSuggestion([], ''));
13+
Assert::same(null, Helpers::getSuggestion([], 'a'));
14+
Assert::same(null, Helpers::getSuggestion(['a'], 'a'));
15+
Assert::same('a', Helpers::getSuggestion(['a', 'b'], ''));
16+
Assert::same('b', Helpers::getSuggestion(['a', 'b'], 'a')); // ignore 100% match
17+
Assert::same('a1', Helpers::getSuggestion(['a1', 'a2'], 'a')); // take first
18+
Assert::same(null, Helpers::getSuggestion(['aaa', 'bbb'], 'a'));
19+
Assert::same(null, Helpers::getSuggestion(['aaa', 'bbb'], 'ab'));
20+
Assert::same(null, Helpers::getSuggestion(['aaa', 'bbb'], 'abc'));
21+
Assert::same('bar', Helpers::getSuggestion(['foo', 'bar', 'baz'], 'baz'));
22+
Assert::same('abcd', Helpers::getSuggestion(['abcd'], 'acbd'));
23+
Assert::same('abcd', Helpers::getSuggestion(['abcd'], 'axbd'));
24+
Assert::same(null, Helpers::getSuggestion(['abcd'], 'axyd')); // 'tags' vs 'this'
25+
Assert::same(null, Helpers::getSuggestion(['setItem'], 'item'));

tests/Utils/ObjectHelpers.getSuggestion().phpt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ Assert::same(null, ObjectHelpers::getSuggestion(['setItem'], 'item'));
3030
Assert::same('setItem', ObjectHelpers::getSuggestion(['setItem'], 'Item'));
3131
Assert::same('setItem', ObjectHelpers::getSuggestion(['setItem'], 'addItem'));
3232
Assert::same(null, ObjectHelpers::getSuggestion(['addItem'], 'addItem'));
33+
Assert::same('set', ObjectHelpers::getSuggestion(['set'], 'get'));
34+
Assert::same('getA', ObjectHelpers::getSuggestion(['getA'], 'gtA'));
35+
Assert::same('trim', ObjectHelpers::getSuggestion([new ReflectionFunction('trim')], 'trm'));
36+
Assert::same('trim', ObjectHelpers::getSuggestion([new ReflectionFunction('trim')], 'getTrim'));
3337

3438

3539
/*

0 commit comments

Comments
 (0)