Spaces:
Sleeping
Sleeping
| import "number"; | |
| d3.interpolateString = d3_interpolateString; | |
| function d3_interpolateString(a, b) { | |
| var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, // scan index for next number in b | |
| am, // current match in a | |
| bm, // current match in b | |
| bs, // string preceding current number in b, if any | |
| i = -1, // index in s | |
| s = [], // string constants and placeholders | |
| q = []; // number interpolators | |
| // Coerce inputs to strings. | |
| a = a + "", b = b + ""; | |
| // Interpolate pairs of numbers in a & b. | |
| while ((am = d3_interpolate_numberA.exec(a)) | |
| && (bm = d3_interpolate_numberB.exec(b))) { | |
| if ((bs = bm.index) > bi) { // a string precedes the next number in b | |
| bs = b.slice(bi, bs); | |
| if (s[i]) s[i] += bs; // coalesce with previous string | |
| else s[++i] = bs; | |
| } | |
| if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match | |
| if (s[i]) s[i] += bm; // coalesce with previous string | |
| else s[++i] = bm; | |
| } else { // interpolate non-matching numbers | |
| s[++i] = null; | |
| q.push({i: i, x: d3_interpolateNumber(am, bm)}); | |
| } | |
| bi = d3_interpolate_numberB.lastIndex; | |
| } | |
| // Add remains of b. | |
| if (bi < b.length) { | |
| bs = b.slice(bi); | |
| if (s[i]) s[i] += bs; // coalesce with previous string | |
| else s[++i] = bs; | |
| } | |
| // Special optimization for only a single match. | |
| // Otherwise, interpolate each of the numbers and rejoin the string. | |
| return s.length < 2 | |
| ? (q[0] ? (b = q[0].x, function(t) { return b(t) + ""; }) | |
| : function() { return b; }) | |
| : (b = q.length, function(t) { | |
| for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); | |
| return s.join(""); | |
| }); | |
| } | |
| var d3_interpolate_numberA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, | |
| d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, "g"); | |