1 # String Lerp
3 This is a library to linearly interpolate between two string values,
4 that is, progressively turn one string into another. It implements
5 several ways to do this, and can automatically pick the best one based
6 on the strings given to it.
8 For example, it knows:
10 * "explore" is between "implore" and "explode".
11 * Or conversely, "implode" between "explode" and "implore".
12 * "chicken wing" and "buffalo wing" are actually the same "wing".
13 * Likewise, "apple core" and "core dump" can keep the "core".
14 * 1/3 of the way from "0%" to "100%" is "33%".
15 * Halfway between rgb(255, 0, 0) and rgb(0, 0, 255) is rgb(128, 0, 128).
16 (Well, it's good at strings, not color science.)
18 To try more, open up [demo.html][] in your browser.
20 ## Setting Up
22 Include the following in your HTML:
24 <script type="text/javascript" src="string-lerp.js"></script>
26 Then, you can use `window.stringLerp` (or just `stringLerp`).
28 Or if you're using Node or some other non-browser whatever,
30 var stringLerp = require("string-lerp");
32 If you want a minified version, at a shell run
34 \$ make ugly
36 If you think something's wrong, or make changes, run
38 \$ make check
42 ## API
44 ### stringLerp.lerp(source, target, amount)
46 Interpolate between strings as best as possible.
48 This automatically picks the best interpolator based on the strings
49 provided. If the strings are identical aside from numbers in them,
50 they are passed through `numericLerp`.
52 If the strings are not numbers and short, they are passed through
53 `diffLerp`.
55 Otherwise, they are passed through `fastLerp`.
58 ### stringLerp.numericLerp(source, target, amount)
60 Interpolate numerically between strings containing numbers.
62 Numbers may have a leading "-" and a single "." to mark the decimal
63 point, but something must be after the ".". No other floating point
64 syntax (e.g. `1e6`) is supported. They are treated as fixed-point
65 values, with the point's position itself interpolating.
67 For example, `numericLerp("0.0", "100.0", 0.123) === "12.3"` because
68 the `.` in `0.0` is interpreted as a decimal point.
70 But `numericLerp("0.", "100.", 0.123) === "12."` because the strings
71 are interpreted as integers followed by a full stop.
73 Calling this functions on strings that differ in more than numerals
74 gives undefined results.
77 ### stringLerp.diffLerp(source, target, amount)
79 Interpolate between two strings using edit operations.
81 This interpolation algorithm applys a partial edit of one string into
82 the other. This produces nice looking results, but can take a
83 significant amount of time and memory to compute the edits. It is not
84 recommended for strings longer than a few hundred characters.
87 ### stringLerp.fastLerp(source, target, amount)
89 Interpolate between `source` to `target` based on length.
91 This interpolation algorithm progressively replaces the front of one
92 string with another. This approach is fast but does not look good when
93 the strings are similar.
96 ### stringLerp.diff(source, target) and stringLerp.patch(diff, source)
98 These are the functions used to implement `diffLerp`. `diff`
99 calculates an array of edit operations - substitutions, insertions,
100 and deletions - to turn `source` into `target`.
102 The type of the edit operations is unspecified. What is guaranteed is:
104 * There's an Array of them.
105 * The array can be cut up and applied in-order but piecemeal.
106 * They are simple objects, i.e. can be (de)serialized via JSON and fed
107 into the same version of `patch` later.
109 Do not rely on edit operations to be exactly the same type (or same
110 operations) between versions / installations.
113 ### stringLerp.costMatrix(source, target, ins, del, sub)
115 Calculate the edit distance between the source and target sequences,
116 and return a matrix representing the possible edits and their
117 costs. The matrix returned is a flat typed array.
119 Because stringLerp needs to be able to reconstruct the edit path, this
120 is not an optimal algorithm if you only need the Levenshtein distance.
123 ## Unicode Concerns
125 String Lerp handles Unicode reasonably well. Surrogate pairs are
126 recognized and not split, and combining characters stay attached to
127 the character they started with. All algorithms will be notably
128 slower, and memory-intensive, when given such strings.
130 Some scripts, such as Hangul and Tamil, do not work ideally.
131 Multi-glyph graphemes will be split up, and potentially rejoined,
132 during interpolation. The intermediate string is always a valid
133 Unicode string containing only glyphs present in one string or the
134 other, but the glyphs may be arranged very differently.
136 A similar problem occurs when switching between LTR and RTL in the
137 same string. The codepoints indicating bidi switches may move around
138 the string capturing glyphs in ways that are not visually appealing.
143 Licensed under the terms of the GNU GPL v2 or later
145 @source: http://yukkurigames.com/string-lerp/
147 This program is free software; you can redistribute it and/or
148 modify it under the terms of the GNU General Public License as
149 published by the Free Software Foundation; either version 2 of the