8000 Add support for contractions to case methods. · lodash/lodash@4275a73 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4275a73

Browse files
committed
Add support for contractions to case methods.
1 parent 78a157d commit 4275a73

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

lodash.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,8 @@
187187
rsBreakRange = rsMathOpRange + rsNonCharRange + rsQuoteRange + rsSpaceRange;
188188

189189
/** Used to compose unicode capture groups. */
190-
var rsAstral = '[' + rsAstralRange + ']',
190+
var rsApos = "['\u2019]",
191+
rsAstral = '[' + rsAstralRange + ']',
191192
rsBreak = '[' + rsBreakRange + ']',
192193
rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',
193194
rsDigits = '\\d+',
@@ -205,13 +206,18 @@
205206
/** Used to compose unicode regexes. */
206207
var rsLowerMisc = '(?:' + rsLower + '|' + rsMisc + ')',
207208
rsUpperMisc = '(?:' + rsUpper + '|' + rsMisc + ')',
209+
rsOptLowerContr = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
210+
rsOptUpperContr = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
208211
reOptMod = rsModifier + '?',
209212
rsOptVar = '[' + rsVarRange + ']?',
210213
rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
211214
rsSeq = rsOptVar + reOptMod + rsOptJoin,
212215
rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
213216
rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
214217

218+
/** Used to match apostrophes. */
219+
var reApos = RegExp(rsApos, 'g');
220+
215221
/**
216222
* Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
217223
* [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
@@ -223,10 +229,10 @@
223229

224230
/** Used to match complex or compound words. */
225231
var reComplexWord = RegExp([
226-
rsUpper + '?' + rsLower + '+(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
227-
rsUpperMisc + '+(?=' + [rsBreak, rsUpper + rsLowerMisc, '$'].join('|') + ')',
228-
rsUpper + '?' + rsLowerMisc + '+',
229-
rsUpper + '+',
232+
rsUpper + '?' + rsLower + '+' + rsOptLowerContr + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
233+
rsUpperMisc + '+' + rsOptUpperContr + '(?=' + [rsBreak, rsUpper + rsLowerMisc, '$'].join('|') + ')',
234+
rsUpper + '?' + rsLowerMisc + '+' + rsOptLowerContr,
235+
rsUpper + '+' + rsOptUpperContr,
230236
rsDigits,
231237
rsEmoji
232238
].join('|'), 'g');
@@ -4388,7 +4394,7 @@
43884394
*/
43894395
function createCompounder(callback) {
43904396
return function(string) {
4391-
return arrayReduce(words(deburr(string)), callback, '');
4397+
return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
43924398
};
43934399
}
43944400

test/test.js

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2134,7 +2134,32 @@
21342134
assert.deepEqual(actual, lodashStable.map(burredLetters, alwaysTrue));
21352135
});
21362136

2137-
QUnit.test('`_.' + methodName + '` should trim latin-1 mathematical operators', function(assert) {
2137+
QUnit.test('`_.' + methodName + '` should remove contraction apostrophes', function(assert) {
2138+
assert.expect(2);
2139+
2140+
var postfixes = ['d', 'll', 'm', 're', 's', 't', 've'];
2141+
2142+
lodashStable.each(["'", '\u2019'], function(apos) {
2143+
var actual = lodashStable.map(postfixes, function(postfix) {
2144+
return func('a b' + apos + postfix + ' c');
2145+
});
2146+
2147+
var expected = lodashStable.map(postfixes, function(postfix) {
2148+
switch (caseName) {
2149+
case 'camel': return 'aB' + postfix + 'C';
2150+
case 'kebab': return 'a-b' + postfix + '-c';
2151+
case 'lower': return 'a b' + postfix + ' c';
2152+
case 'snake': return 'a_b' + postfix + '_c';
2153+
case 'start': return 'A B' + postfix + ' C';
2154+
case 'upper': return 'A B' + postfix.toUpperCase() + ' C';
2155+
}
2156+
});
2157+
2158+
assert.deepEqual(actual, expected);
2159+
});
2160+
});
2161+
2162+
QUnit.test('`_.' + methodName + '` should remove latin-1 mathematical operators', function(assert) {
21382163
assert.expect(1);
21392164

21402165
var actual = lodashStable.map(['\xd7', '\xf7'], func);
@@ -2176,7 +2201,7 @@
21762201
QUnit.test('should get the original value after cycling through all case methods', function(assert) {
21772202
assert.expect(1);
21782203

2179-
var funcs = [_.camelCase, _.kebabCase, _.snakeCase, _.startCase, _.camelCase];
2204+
var funcs = [_.camelCase, _.kebabCase, _.lowerCase, _.snakeCase, _.startCase, _.lowerCase, _.camelCase];
21802205

21812206
var actual = lodashStable.reduce(funcs, function(result, func) {
21822207
return func(result);

0 commit comments

Comments
 (0)
0