aboutsummaryrefslogtreecommitdiff
path: root/node_modules/fast-diff
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-12-27 19:33:54 +0100
committerFlorian Dold <florian.dold@gmail.com>2017-12-27 19:34:16 +0100
commit0e6de2c31dbf8c21277481f112e99c52b913940f (patch)
tree91789032de3b8eec9d789acd1323f25fc5d08422 /node_modules/fast-diff
parentceda0da31ad542c598c68146ae0712ca03df3d71 (diff)
node_modules
Diffstat (limited to 'node_modules/fast-diff')
-rw-r--r--node_modules/fast-diff/.npmignore1
-rw-r--r--node_modules/fast-diff/diff.js40
-rw-r--r--node_modules/fast-diff/package.json2
-rw-r--r--node_modules/fast-diff/test.js39
4 files changed, 80 insertions, 2 deletions
diff --git a/node_modules/fast-diff/.npmignore b/node_modules/fast-diff/.npmignore
deleted file mode 100644
index 3c3629e64..000000000
--- a/node_modules/fast-diff/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/node_modules/fast-diff/diff.js b/node_modules/fast-diff/diff.js
index c6e3f3ddd..a2dfb4d09 100644
--- a/node_modules/fast-diff/diff.js
+++ b/node_modules/fast-diff/diff.js
@@ -82,6 +82,7 @@ function diff_main(text1, text2, cursor_pos) {
if (cursor_pos != null) {
diffs = fix_cursor(diffs, cursor_pos);
}
+ diffs = fix_emoji(diffs);
return diffs;
};
@@ -671,7 +672,46 @@ function fix_cursor (diffs, cursor_pos) {
return diffs;
}
}
+}
+
+/*
+ * Check diff did not split surrogate pairs.
+ * Ex. [0, '\uD83D'], [-1, '\uDC36'], [1, '\uDC2F'] -> [-1, '\uD83D\uDC36'], [1, '\uD83D\uDC2F']
+ * '\uD83D\uDC36' === '🐶', '\uD83D\uDC2F' === '🐯'
+ *
+ * @param {Array} diffs Array of diff tuples
+ * @return {Array} Array of diff tuples
+ */
+function fix_emoji (diffs) {
+ var compact = false;
+ var starts_with_pair_end = function(str) {
+ return str.charCodeAt(0) >= 0xDC00 && str.charCodeAt(0) <= 0xDFFF;
+ }
+ var ends_with_pair_start = function(str) {
+ return str.charCodeAt(str.length-1) >= 0xD800 && str.charCodeAt(str.length-1) <= 0xDBFF;
+ }
+ for (var i = 2; i < diffs.length; i += 1) {
+ if (diffs[i-2][0] === DIFF_EQUAL && ends_with_pair_start(diffs[i-2][1]) &&
+ diffs[i-1][0] === DIFF_DELETE && starts_with_pair_end(diffs[i-1][1]) &&
+ diffs[i][0] === DIFF_INSERT && starts_with_pair_end(diffs[i][1])) {
+ compact = true;
+
+ diffs[i-1][1] = diffs[i-2][1].slice(-1) + diffs[i-1][1];
+ diffs[i][1] = diffs[i-2][1].slice(-1) + diffs[i][1];
+ diffs[i-2][1] = diffs[i-2][1].slice(0, -1);
+ }
+ }
+ if (!compact) {
+ return diffs;
+ }
+ var fixed_diffs = [];
+ for (var i = 0; i < diffs.length; i += 1) {
+ if (diffs[i][1].length > 0) {
+ fixed_diffs.push(diffs[i]);
+ }
+ }
+ return fixed_diffs;
}
/*
diff --git a/node_modules/fast-diff/package.json b/node_modules/fast-diff/package.json
index 054ea84a2..1f814f9c6 100644
--- a/node_modules/fast-diff/package.json
+++ b/node_modules/fast-diff/package.json
@@ -1,6 +1,6 @@
{
"name": "fast-diff",
- "version": "1.1.1",
+ "version": "1.1.2",
"description": "Fast Javascript text diff",
"author": "Jason Chen <jhchen7@gmail.com>",
"main": "diff.js",
diff --git a/node_modules/fast-diff/test.js b/node_modules/fast-diff/test.js
index 5a33eed74..731c0dccb 100644
--- a/node_modules/fast-diff/test.js
+++ b/node_modules/fast-diff/test.js
@@ -49,4 +49,43 @@ for(var i = 0; i < ITERATIONS; ++i) {
}
}
+console.log('Running emoji tests');
+(function() {
+ var result = diff('🐶', '🐯');
+ var expected = [
+ [diff.DELETE, '🐶'],
+ [diff.INSERT, '🐯'],
+ ];
+ if (!_.isEqual(result, expected)) {
+ console.log(result, '!==', expected);
+ throw new Error('Emoji simple case test failed');
+ }
+})();
+
+(function() {
+ var result = diff('👨🏽', '👩🏽');
+ var expected = [
+ [diff.DELETE, '👨'],
+ [diff.INSERT, '👩'],
+ [diff.EQUAL, '🏽']
+ ];
+ if (!_.isEqual(result, expected)) {
+ console.log(result, '!==', expected);
+ throw new Error('Emoji before case test failed');
+ }
+})();
+
+(function() {
+ var result = diff('👩🏼', '👩🏽');
+ var expected = [
+ [diff.EQUAL, '👩'],
+ [diff.DELETE, '🏼'],
+ [diff.INSERT, '🏽'],
+ ];
+ if (!_.isEqual(result, expected)) {
+ console.log(result, '!==', expected);
+ throw new Error('Emoji after case test failed');
+ }
+})();
+
console.log("Success!");