Javascript Inflector (update)
Join the DZone community and get the full member experience.
Join For FreeMany thanks to Todd for the original version of this code:
http://www.bigbold.com/snippets/posts/show/3205
I have updated his implementation with two goals:
1. Add support for singularize()
2. Update to use Object.extend and add functions to String.prototype
This requires Prototype.
Sadly, the Javascript Number simple type does not allow you to 9.pluralize() // "9th" -- NO LOVE FOR YOU
pluralize(9) // "9th"
'dog'.pluralize() // "dogs"
'dog'.pluralize(4) // "4 dogs"
'dog'.pluralize(2, 'dogs too many') // "2 dogs too many"
'dogs'.singularize() // "dog"
'dogs'.singularize(1) // "1 dog"
Dogs suck! CATS FOREVER!
Inflector = {
Inflections: {
plural: [
[/(quiz)$/i, "$1zes" ],
[/^(ox)$/i, "$1en" ],
[/([m|l])ouse$/i, "$1ice" ],
[/(matr|vert|ind)ix|ex$/i, "$1ices" ],
[/(x|ch|ss|sh)$/i, "$1es" ],
[/([^aeiouy]|qu)y$/i, "$1ies" ],
[/(hive)$/i, "$1s" ],
[/(?:([^f])fe|([lr])f)$/i, "$1$2ves"],
[/sis$/i, "ses" ],
[/([ti])um$/i, "$1a" ],
[/(buffal|tomat)o$/i, "$1oes" ],
[/(bu)s$/i, "$1ses" ],
[/(alias|status)$/i, "$1es" ],
[/(octop|vir)us$/i, "$1i" ],
[/(ax|test)is$/i, "$1es" ],
[/s$/i, "s" ],
[/$/, "s" ]
],
singular: [
[/(quiz)zes$/i, "$1" ],
[/(matr)ices$/i, "$1ix" ],
[/(vert|ind)ices$/i, "$1ex" ],
[/^(ox)en/i, "$1" ],
[/(alias|status)es$/i, "$1" ],
[/(octop|vir)i$/i, "$1us" ],
[/(cris|ax|test)es$/i, "$1is" ],
[/(shoe)s$/i, "$1" ],
[/(o)es$/i, "$1" ],
[/(bus)es$/i, "$1" ],
[/([m|l])ice$/i, "$1ouse" ],
[/(x|ch|ss|sh)es$/i, "$1" ],
[/(m)ovies$/i, "$1ovie" ],
[/(s)eries$/i, "$1eries"],
[/([^aeiouy]|qu)ies$/i, "$1y" ],
[/([lr])ves$/i, "$1f" ],
[/(tive)s$/i, "$1" ],
[/(hive)s$/i, "$1" ],
[/([^f])ves$/i, "$1fe" ],
[/(^analy)ses$/i, "$1sis" ],
[/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i, "$1$2sis"],
[/([ti])a$/i, "$1um" ],
[/(n)ews$/i, "$1ews" ],
[/s$/i, "" ]
],
irregular: [
['move', 'moves' ],
['sex', 'sexes' ],
['child', 'children'],
['man', 'men' ],
['person', 'people' ]
],
uncountable: [
"sheep",
"fish",
"series",
"species",
"money",
"rice",
"information",
"equipment"
]
},
ordinalize: function(number) {
if (11 <= parseInt(number) % 100 && parseInt(number) % 100 <= 13) {
return number + "th";
} else {
switch (parseInt(number) % 10) {
case 1: return number + "st";
case 2: return number + "nd";
case 3: return number + "rd";
default: return number + "th";
}
}
},
pluralize: function(word) {
for (var i = 0; i < Inflector.Inflections.uncountable.length; i++) {
var uncountable = Inflector.Inflections.uncountable[i];
if (word.toLowerCase == uncountable) {
return uncountable;
}
}
for (var i = 0; i < Inflector.Inflections.irregular.length; i++) {
var singular = Inflector.Inflections.irregular[i][0];
var plural = Inflector.Inflections.irregular[i][1];
if ((word.toLowerCase == singular) || (word == plural)) {
return plural;
}
}
for (var i = 0; i < Inflector.Inflections.plural.length; i++) {
var regex = Inflector.Inflections.plural[i][0];
var replace_string = Inflector.Inflections.plural[i][1];
if (regex.test(word)) {
return word.replace(regex, replace_string);
}
}
},
singularize: function(word) {
for (var i = 0; i < Inflector.Inflections.uncountable.length; i++) {
var uncountable = Inflector.Inflections.uncountable[i];
if (word.toLowerCase == uncountable) {
return uncountable;
}
}
for (var i = 0; i < Inflector.Inflections.irregular.length; i++) {
var singular = Inflector.Inflections.irregular[i][0];
var plural = Inflector.Inflections.irregular[i][1];
if ((word.toLowerCase == singular) || (word == plural)) {
return plural;
}
}
for (var i = 0; i < Inflector.Inflections.singular.length; i++) {
var regex = Inflector.Inflections.singular[i][0];
var replace_string = Inflector.Inflections.singular[i][1];
if (regex.test(word)) {
return word.replace(regex, replace_string);
}
}
}
}
function ordinalize(number) {
return Inflector.ordinalize(number);
}
Object.extend(String.prototype, {
pluralize: function(count, plural) {
if (typeof count == 'undefined') {
return Inflector.pluralize(this);
} else {
return count + ' ' + (1 == parseInt(count) ? this : plural || Inflector.pluralize(this));
}
},
singularize: function(count) {
if (typeof count == 'undefined') {
return Inflector.singularize(this);
} else {
return count + " " + Inflector.singularize(this);
}
}
});
JavaScript
Opinions expressed by DZone contributors are their own.
Comments