Skip to content

Commit 0e92639

Browse files
committed
Update jfcherng/php-levenshtein-distance ^2.0
1 parent 15c7ae9 commit 0e92639

File tree

2 files changed

+22
-32
lines changed

2 files changed

+22
-32
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
},
2626
"require": {
2727
"php": "^7.1.3",
28-
"jfcherng/php-levenshtein-distance": "^1.0",
28+
"jfcherng/php-levenshtein-distance": "^2.0",
2929
"jfcherng/php-mb-string": "^1.2"
3030
},
3131
"require-dev": {

src/Renderer/Html/AbstractHtml.php

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
use Jfcherng\Diff\Renderer\AbstractRenderer;
88
use Jfcherng\Diff\Utility\SequenceMatcher;
9-
use Jfcherng\Utility\LevenshteinDistance;
9+
use Jfcherng\Utility\LevenshteinDistance as LD;
1010
use Jfcherng\Utility\MbString;
1111
use RuntimeException;
1212

@@ -243,56 +243,46 @@ protected function renderChangedExtentCharLevel(MbString $mbFromLine, MbString $
243243
// we prefer the char-level diff but if there is an exception like
244244
// "line too long", we fallback to line-level diff.
245245
try {
246-
$editInfo = LevenshteinDistance::calculate(
246+
$editInfo = LD::calculate(
247247
$mbFromLine->get(),
248248
$mbToLine->get(),
249-
LevenshteinDistance::PROGRESS_SIMPLE
249+
true,
250+
LD::PROGRESS_MERGE_NEIGHBOR
250251
);
251252
} catch (RuntimeException $e) {
252253
return $this->renderChangedExtentLineLevel($mbFromLine, $mbToLine);
253254
}
254255

255256
// start to render
256-
foreach ($editInfo['progresses'] as $step => $operation) {
257+
foreach ($editInfo['progresses'] as [$operation, $position,, $length]) {
257258
switch ($operation) {
259+
// default never happens though
260+
default:
258261
// copy, render nothing
259-
case LevenshteinDistance::OP_COPY:
260-
--$fromEditPos;
261-
--$toEditPos;
262+
case LD::OP_COPY:
263+
$fromEditPos -= $length;
264+
$toEditPos -= $length;
262265
break;
263266
// delete, render 'from'
264-
case LevenshteinDistance::OP_DELETE:
265-
--$fromEditPos;
266-
$mbFromLine->str_enclose_i(self::CLOSURES, $fromEditPos, 1);
267+
case LD::OP_DELETE:
268+
$fromEditPos -= $length;
269+
$mbFromLine->str_enclose_i(self::CLOSURES, $fromEditPos, $length);
267270
break;
268271
// insert, render 'to'
269-
case LevenshteinDistance::OP_INSERT:
270-
--$toEditPos;
271-
$mbToLine->str_enclose_i(self::CLOSURES, $toEditPos, 1);
272+
case LD::OP_INSERT:
273+
$toEditPos -= $length;
274+
$mbToLine->str_enclose_i(self::CLOSURES, $toEditPos, $length);
272275
break;
273276
// replace, render both
274-
case LevenshteinDistance::OP_REPLACE:
275-
--$fromEditPos;
276-
$mbFromLine->str_enclose_i(self::CLOSURES, $fromEditPos, 1);
277-
--$toEditPos;
278-
$mbToLine->str_enclose_i(self::CLOSURES, $toEditPos, 1);
277+
case LD::OP_REPLACE:
278+
$fromEditPos -= $length;
279+
$mbFromLine->str_enclose_i(self::CLOSURES, $fromEditPos, $length);
280+
$toEditPos -= $length;
281+
$mbToLine->str_enclose_i(self::CLOSURES, $toEditPos, $length);
279282
break;
280283
}
281284
}
282285

283-
// check for editPos, render for the string head
284-
// Note: at least, one of the editPos must be zero
285-
assert($fromEditPos === 0 || $toEditPos === 0);
286-
287-
// render the string head
288-
if ($fromEditPos !== $toEditPos) {
289-
if ($fromEditPos === 0) {
290-
$mbToLine->str_enclose_i(self::CLOSURES, 0, $toEditPos);
291-
} else {
292-
$mbFromLine->str_enclose_i(self::CLOSURES, 0, $fromEditPos);
293-
}
294-
}
295-
296286
// cleanup redundant tags
297287
$mbFromLine->str_replace_i(self::CLOSURES[1] . self::CLOSURES[0], '');
298288
$mbToLine->str_replace_i(self::CLOSURES[1] . self::CLOSURES[0], '');

0 commit comments

Comments
 (0)