mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-09 18:37:50 +00:00
Add support for unicode modifiers.
This commit is contained in:
11
lodash.js
11
lodash.js
@@ -148,28 +148,31 @@
|
|||||||
rsDigits = '\\d+',
|
rsDigits = '\\d+',
|
||||||
rsDingbat = '[\\u2700-\\u27bf]',
|
rsDingbat = '[\\u2700-\\u27bf]',
|
||||||
rsLowers = '[a-z\\xdf-\\xf6\\xf8-\\xff]+',
|
rsLowers = '[a-z\\xdf-\\xf6\\xf8-\\xff]+',
|
||||||
|
rsModifier = '(?:\\ud83c[\\udffb-\\udfff])',
|
||||||
rsNonAstral = '[^' + rsAstralRange + ']',
|
rsNonAstral = '[^' + rsAstralRange + ']',
|
||||||
rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
|
rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
|
||||||
rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
|
rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
|
||||||
|
rsSymbol = '(?:' + [rsNonAstral, rsRegional, rsSurrPair, rsAstral].join('|') + ')',
|
||||||
rsUpper = '[A-Z\\xc0-\\xd6\\xd8-\\xde]',
|
rsUpper = '[A-Z\\xc0-\\xd6\\xd8-\\xde]',
|
||||||
rsVS = '\\ufe0e\\ufe0f',
|
rsVS = '\\ufe0e\\ufe0f',
|
||||||
rsZWJ = '\\u200d',
|
rsZWJ = '\\u200d',
|
||||||
|
reOptMod = rsModifier + '?',
|
||||||
rsOptVS = '[' + rsVS + ']?',
|
rsOptVS = '[' + rsVS + ']?',
|
||||||
rsJoiner = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVS + ')*',
|
rsJoiner = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVS + reOptMod + ')*',
|
||||||
rsSymbol = '(?:' + [rsNonAstral, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
|
rsSeq = rsOptVS + reOptMod + rsJoiner;
|
||||||
|
|
||||||
/** Used to match [zero-width joiners and code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
|
/** Used to match [zero-width joiners and code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
|
||||||
var reAdvSymbol = RegExp('[' + rsZWJ + rsVS + rsAstralRange + ']');
|
var reAdvSymbol = RegExp('[' + rsZWJ + rsVS + rsAstralRange + ']');
|
||||||
|
|
||||||
/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
|
/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
|
||||||
var reStrSymbol = RegExp(rsSymbol + rsOptVS + rsJoiner, 'g');
|
var reStrSymbol = RegExp(rsSymbol + rsSeq, 'g');
|
||||||
|
|
||||||
/** Used to match words to create compound words. */
|
/** Used to match words to create compound words. */
|
||||||
var reWord = RegExp([
|
var reWord = RegExp([
|
||||||
rsUpper + '+(?=' + rsUpper + rsLowers + ')',
|
rsUpper + '+(?=' + rsUpper + rsLowers + ')',
|
||||||
rsUpper + '?' + rsLowers,
|
rsUpper + '?' + rsLowers,
|
||||||
rsUpper + '+',
|
rsUpper + '+',
|
||||||
'(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsOptVS + rsJoiner,
|
'(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
|
||||||
rsDigits
|
rsDigits
|
||||||
].join('|'), 'g');
|
].join('|'), 'g');
|
||||||
|
|
||||||
|
|||||||
52
test/test.js
52
test/test.js
@@ -18888,12 +18888,16 @@
|
|||||||
QUnit.module('astral symbols');
|
QUnit.module('astral symbols');
|
||||||
|
|
||||||
(function() {
|
(function() {
|
||||||
var flag = '\ud83c\uddfa\ud83c\uddf8',
|
var emojiVar = '\ufe0f',
|
||||||
|
flag = '\ud83c\uddfa\ud83c\uddf8',
|
||||||
|
heart = '\u2764' + emojiVar,
|
||||||
hearts = '\ud83d\udc95',
|
hearts = '\ud83d\udc95',
|
||||||
leafs = '\ud83c\udf42',
|
leafs = '\ud83c\udf42',
|
||||||
|
raisedHand = '\u270B' + emojiVar,
|
||||||
rocket = '\ud83d\ude80',
|
rocket = '\ud83d\ude80',
|
||||||
varHeart = '\u2764\ufe0f',
|
thumbsUp = '\ud83d\udc4d',
|
||||||
comboGlyph = '\ud83d\udc68\u200d' + varHeart + '\u200d\ud83d\udc8B\u200d\ud83d\udc68';
|
comboGlyph = '\ud83d\udc68\u200d' + heart + '\u200d\ud83d\udc8B\u200d\ud83d\udc68',
|
||||||
|
modifiers = ['\ud83c\udffb', '\ud83c\udffc', '\ud83c\udffd', '\ud83c\udffe', '\ud83c\udfff'];
|
||||||
|
|
||||||
QUnit.test('should account for astral symbols', function(assert) {
|
QUnit.test('should account for astral symbols', function(assert) {
|
||||||
assert.expect(25);
|
assert.expect(25);
|
||||||
@@ -18972,9 +18976,45 @@
|
|||||||
QUnit.test('should account for variation selectors', function(assert) {
|
QUnit.test('should account for variation selectors', function(assert) {
|
||||||
assert.expect(3);
|
assert.expect(3);
|
||||||
|
|
||||||
assert.strictEqual(_.size(varHeart), 1);
|
assert.strictEqual(_.size(heart), 1);
|
||||||
assert.deepEqual(_.toArray(varHeart), [varHeart]);
|
assert.deepEqual(_.toArray(heart), [heart]);
|
||||||
assert.deepEqual(_.words(varHeart), [varHeart]);
|
assert.deepEqual(_.words(heart), [heart]);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('should account for modifiers', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
|
||||||
|
var values = _.map(modifiers, function(modifier) {
|
||||||
|
return thumbsUp + modifier;
|
||||||
|
});
|
||||||
|
|
||||||
|
var expected = _.map(values, function(value) {
|
||||||
|
return [1, [value], [value]];
|
||||||
|
});
|
||||||
|
|
||||||
|
var actual = _.map(values, function(value) {
|
||||||
|
return [_.size(value), _.toArray(value), _.words(value)];
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.deepEqual(actual, expected);
|
||||||
|
});
|
||||||
|
|
||||||
|
QUnit.test('should account for variation selectors with modifiers', function(assert) {
|
||||||
|
assert.expect(1);
|
||||||
|
|
||||||
|
var values = _.map(modifiers, function(modifier) {
|
||||||
|
return raisedHand + modifier;
|
||||||
|
});
|
||||||
|
|
||||||
|
var expected = _.map(values, function(value) {
|
||||||
|
return [1, [value], [value]];
|
||||||
|
});
|
||||||
|
|
||||||
|
var actual = _.map(values, function(value) {
|
||||||
|
return [_.size(value), _.toArray(value), _.words(value)];
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.deepEqual(actual, expected);
|
||||||
});
|
});
|
||||||
}());
|
}());
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user