X-Git-Url: https://git.yukkurigames.com/?p=string-lerp.git;a=blobdiff_plain;f=string-lerp.js;h=3a304886374373c3471aaf530a92f2615ea5544d;hp=8d5a87974ef8049aabff8fe01b331dab1cc9ce81;hb=dd1c5bcbe8357a8bc2b83fc711ee16d0c7c8eaac;hpb=27efc68c521bfd7d29467c9e528001aa5992d6d2 diff --git a/string-lerp.js b/string-lerp.js index 8d5a879..3a30488 100644 --- a/string-lerp.js +++ b/string-lerp.js @@ -31,7 +31,7 @@ function editPath(d, t) { /** Given a Levenshtein matrix and target, create an edit list */ - var path = [] + var path = []; var j = t.length; var n = j + 1; var i = d.length / n - 1; @@ -88,12 +88,17 @@ compute the edits. It is not recommended for strings longer than a few hundred characters. */ - var edits = diff(a, b); - var partial = edits.slice(0, Math.round(p * edits.length)); - return patch(partial, a); + + // The edit path works from the string end, forwards, because + // that's how Levenshtein edits work. To match LTR reading + // direction (and the behavior of fastLerp), swap the strings + // and invert the parameter when editing. + var edits = diff(b, a); + var partial = edits.slice(0, Math.round((1 - p) * edits.length)); + return patch(partial, b); } - var NUMBERS = /(-?\d+(?:\.\d+)?)/g + var NUMBERS = /(-?\d+(?:\.\d+)?)/g; function areNumericTwins(a, b) { /** Check if a and b differ only in numerals @@ -129,7 +134,7 @@ var aParts = a.split(NUMBERS); var bParts = b.split(NUMBERS); for (var i = 1; i < aParts.length; i += 2) { - var part = nlerp(+aParts[i], +bParts[i], p) + var part = nlerp(+aParts[i], +bParts[i], p); if (aParts[i].indexOf(".") === -1 && bParts[i].indexOf(".") === -1) part = Math.round(part); aParts[i] = part.toString(); @@ -168,7 +173,7 @@ if (p === 1) return b; if (areNumericTwins(a, b)) - return numericLerp(a, b, p) + return numericLerp(a, b, p); // Numeric lerps should over- and under-shoot when fed numbers // outside 0 to 1, but other types cannot. @@ -176,9 +181,7 @@ if (p > 1) return b; var n = a.length * b.length; - return (n && n < MAX_MATRIX_SIZE) - ? diffLerp(a, b, p) - : fastLerp(a, b, p); + return ((n && n < MAX_MATRIX_SIZE) ? diffLerp : fastLerp)(a, b, p); } exports.levenshteinMatrix = levenshteinMatrix;