You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
1.7 KiB
95 lines
1.7 KiB
'use strict'; |
|
|
|
module.exports = pluralize; |
|
|
|
/** |
|
* Pluralization rules. |
|
*/ |
|
|
|
exports.pluralization = [ |
|
[/human$/gi, 'humans'], |
|
[/(m)an$/gi, '$1en'], |
|
[/(pe)rson$/gi, '$1ople'], |
|
[/(child)$/gi, '$1ren'], |
|
[/^(ox)$/gi, '$1en'], |
|
[/(ax|test)is$/gi, '$1es'], |
|
[/(octop|vir)us$/gi, '$1i'], |
|
[/(alias|status)$/gi, '$1es'], |
|
[/(bu)s$/gi, '$1ses'], |
|
[/(buffal|tomat|potat)o$/gi, '$1oes'], |
|
[/([ti])um$/gi, '$1a'], |
|
[/sis$/gi, 'ses'], |
|
[/(?:([^f])fe|([lr])f)$/gi, '$1$2ves'], |
|
[/(hive)$/gi, '$1s'], |
|
[/([^aeiouy]|qu)y$/gi, '$1ies'], |
|
[/(x|ch|ss|sh)$/gi, '$1es'], |
|
[/(matr|vert|ind)ix|ex$/gi, '$1ices'], |
|
[/([m|l])ouse$/gi, '$1ice'], |
|
[/(kn|w|l)ife$/gi, '$1ives'], |
|
[/(quiz)$/gi, '$1zes'], |
|
[/^goose$/i, 'geese'], |
|
[/s$/gi, 's'], |
|
[/([^a-z])$/, '$1'], |
|
[/$/gi, 's'] |
|
]; |
|
const rules = exports.pluralization; |
|
|
|
/** |
|
* Uncountable words. |
|
* |
|
* These words are applied while processing the argument to `toCollectionName`. |
|
* @api public |
|
*/ |
|
|
|
exports.uncountables = [ |
|
'advice', |
|
'energy', |
|
'excretion', |
|
'digestion', |
|
'cooperation', |
|
'health', |
|
'justice', |
|
'labour', |
|
'machinery', |
|
'equipment', |
|
'information', |
|
'pollution', |
|
'sewage', |
|
'paper', |
|
'money', |
|
'species', |
|
'series', |
|
'rain', |
|
'rice', |
|
'fish', |
|
'sheep', |
|
'moose', |
|
'deer', |
|
'news', |
|
'expertise', |
|
'status', |
|
'media' |
|
]; |
|
const uncountables = exports.uncountables; |
|
|
|
/** |
|
* Pluralize function. |
|
* |
|
* @author TJ Holowaychuk (extracted from _ext.js_) |
|
* @param {String} string to pluralize |
|
* @api private |
|
*/ |
|
|
|
function pluralize(str) { |
|
let found; |
|
str = str.toLowerCase(); |
|
if (!~uncountables.indexOf(str)) { |
|
found = rules.filter(function(rule) { |
|
return str.match(rule[0]); |
|
}); |
|
if (found[0]) { |
|
return str.replace(found[0][0], found[0][1]); |
|
} |
|
} |
|
return str; |
|
}
|
|
|