Skip to content

Commit

Permalink
dont split surrogate pairs, fixes #1
Browse files Browse the repository at this point in the history
  • Loading branch information
jhchen committed Sep 17, 2017
1 parent de7329a commit a5cecd8
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 0 deletions.
40 changes: 40 additions & 0 deletions diff.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};

Expand Down Expand Up @@ -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;
}

/*
Expand Down
39 changes: 39 additions & 0 deletions test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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!");

0 comments on commit a5cecd8

Please sign in to comment.