Commit ddc02a82 authored by Taylor Otwell's avatar Taylor Otwell

Refactor the inflector.

parent 8adb9194
...@@ -2,19 +2,19 @@ ...@@ -2,19 +2,19 @@
class Inflector { class Inflector {
/** /**
* The words that have been converted to singular. * The words that have been converted to singular.
* *
* @var array * @var array
*/ */
private static $singular_cache = array(); private static $singular_cache = array();
/** /**
* The words that have been converted to plural. * The words that have been converted to plural.
* *
* @var array * @var array
*/ */
private static $plural_cache = array(); private static $plural_cache = array();
/** /**
* Plural word forms. * Plural word forms.
...@@ -22,96 +22,96 @@ class Inflector { ...@@ -22,96 +22,96 @@ class Inflector {
* @var array * @var array
*/ */
private static $plural = array( private static $plural = array(
'/(quiz)$/i' => "$1zes", '/(quiz)$/i' => "$1zes",
'/^(ox)$/i' => "$1en", '/^(ox)$/i' => "$1en",
'/([m|l])ouse$/i' => "$1ice", '/([m|l])ouse$/i' => "$1ice",
'/(matr|vert|ind)ix|ex$/i' => "$1ices", '/(matr|vert|ind)ix|ex$/i' => "$1ices",
'/(x|ch|ss|sh)$/i' => "$1es", '/(x|ch|ss|sh)$/i' => "$1es",
'/([^aeiouy]|qu)y$/i' => "$1ies", '/([^aeiouy]|qu)y$/i' => "$1ies",
'/(hive)$/i' => "$1s", '/(hive)$/i' => "$1s",
'/(?:([^f])fe|([lr])f)$/i' => "$1$2ves", '/(?:([^f])fe|([lr])f)$/i' => "$1$2ves",
'/(shea|lea|loa|thie)f$/i' => "$1ves", '/(shea|lea|loa|thie)f$/i' => "$1ves",
'/sis$/i' => "ses", '/sis$/i' => "ses",
'/([ti])um$/i' => "$1a", '/([ti])um$/i' => "$1a",
'/(tomat|potat|ech|her|vet)o$/i' => "$1oes", '/(tomat|potat|ech|her|vet)o$/i' => "$1oes",
'/(bu)s$/i' => "$1ses", '/(bu)s$/i' => "$1ses",
'/(alias)$/i' => "$1es", '/(alias)$/i' => "$1es",
'/(octop)us$/i' => "$1i", '/(octop)us$/i' => "$1i",
'/(ax|test)is$/i' => "$1es", '/(ax|test)is$/i' => "$1es",
'/(us)$/i' => "$1es", '/(us)$/i' => "$1es",
'/s$/i' => "s", '/s$/i' => "s",
'/$/' => "s" '/$/' => "s"
); );
/** /**
* Singular word forms. * Singular word forms.
* *
* @var array * @var array
*/ */
private static $singular = array( private static $singular = array(
'/(quiz)zes$/i' => "$1", '/(quiz)zes$/i' => "$1",
'/(matr)ices$/i' => "$1ix", '/(matr)ices$/i' => "$1ix",
'/(vert|ind)ices$/i' => "$1ex", '/(vert|ind)ices$/i' => "$1ex",
'/^(ox)en$/i' => "$1", '/^(ox)en$/i' => "$1",
'/(alias)es$/i' => "$1", '/(alias)es$/i' => "$1",
'/(octop|vir)i$/i' => "$1us", '/(octop|vir)i$/i' => "$1us",
'/(cris|ax|test)es$/i' => "$1is", '/(cris|ax|test)es$/i' => "$1is",
'/(shoe)s$/i' => "$1", '/(shoe)s$/i' => "$1",
'/(o)es$/i' => "$1", '/(o)es$/i' => "$1",
'/(bus)es$/i' => "$1", '/(bus)es$/i' => "$1",
'/([m|l])ice$/i' => "$1ouse", '/([m|l])ice$/i' => "$1ouse",
'/(x|ch|ss|sh)es$/i' => "$1", '/(x|ch|ss|sh)es$/i' => "$1",
'/(m)ovies$/i' => "$1ovie", '/(m)ovies$/i' => "$1ovie",
'/(s)eries$/i' => "$1eries", '/(s)eries$/i' => "$1eries",
'/([^aeiouy]|qu)ies$/i' => "$1y", '/([^aeiouy]|qu)ies$/i' => "$1y",
'/([lr])ves$/i' => "$1f", '/([lr])ves$/i' => "$1f",
'/(tive)s$/i' => "$1", '/(tive)s$/i' => "$1",
'/(hive)s$/i' => "$1", '/(hive)s$/i' => "$1",
'/(li|wi|kni)ves$/i' => "$1fe", '/(li|wi|kni)ves$/i' => "$1fe",
'/(shea|loa|lea|thie)ves$/i' => "$1f", '/(shea|loa|lea|thie)ves$/i' => "$1f",
'/(^analy)ses$/i' => "$1sis", '/(^analy)ses$/i' => "$1sis",
'/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i' => "$1$2sis", '/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i' => "$1$2sis",
'/([ti])a$/i' => "$1um", '/([ti])a$/i' => "$1um",
'/(n)ews$/i' => "$1ews", '/(n)ews$/i' => "$1ews",
'/(h|bl)ouses$/i' => "$1ouse", '/(h|bl)ouses$/i' => "$1ouse",
'/(corpse)s$/i' => "$1", '/(corpse)s$/i' => "$1",
'/(us)es$/i' => "$1", '/(us)es$/i' => "$1",
'/(us|ss)$/i' => "$1", '/(us|ss)$/i' => "$1",
'/s$/i' => "", '/s$/i' => "",
); );
/** /**
* Irregular word forms. * Irregular word forms.
* *
* @var array * @var array
*/ */
private static $irregular = array( private static $irregular = array(
'move' => 'moves', 'move' => 'moves',
'foot' => 'feet', 'foot' => 'feet',
'goose' => 'geese', 'goose' => 'geese',
'sex' => 'sexes', 'sex' => 'sexes',
'child' => 'children', 'child' => 'children',
'man' => 'men', 'man' => 'men',
'tooth' => 'teeth', 'tooth' => 'teeth',
'person' => 'people', 'person' => 'people',
); );
/** /**
* Uncountable word forms. * Uncountable word forms.
* *
* @var array * @var array
*/ */
private static $uncountable = array( private static $uncountable = array(
'sheep', 'sheep',
'fish', 'fish',
'deer', 'deer',
'series', 'series',
'species', 'species',
'money', 'money',
'rice', 'rice',
'information', 'information',
'equipment', 'equipment',
); );
/** /**
* Convert a word to its plural form. * Convert a word to its plural form.
...@@ -121,35 +121,35 @@ class Inflector { ...@@ -121,35 +121,35 @@ class Inflector {
*/ */
public static function plural($value) public static function plural($value)
{ {
if (array_key_exists($value, static::$plural_cache)) if (array_key_exists($value, static::$plural_cache))
{ {
return static::$plural_cache[$value]; return static::$plural_cache[$value];
} }
if (in_array(strtolower($value), static::$uncountable)) if (in_array(strtolower($value), static::$uncountable))
{ {
return static::$plural_cache[$value] = $value; return static::$plural_cache[$value] = $value;
} }
foreach (static::$irregular as $pattern => $irregular) foreach (static::$irregular as $pattern => $irregular)
{ {
$pattern = '/'.$pattern.'$/i'; $pattern = '/'.$pattern.'$/i';
if (preg_match($pattern, $value)) if (preg_match($pattern, $value))
{ {
return static::$plural_cache[$value] = preg_replace($pattern, $irregular, $value); return static::$plural_cache[$value] = preg_replace($pattern, $irregular, $value);
} }
} }
foreach (static::$plural as $pattern => $plural) foreach (static::$plural as $pattern => $plural)
{ {
if (preg_match($pattern, $value)) if (preg_match($pattern, $value))
{ {
return static::$plural_cache[$value] = preg_replace($pattern, $plural, $value); return static::$plural_cache[$value] = preg_replace($pattern, $plural, $value);
} }
} }
return static::$plural_cache[$value] = $value; return static::$plural_cache[$value] = $value;
} }
/** /**
...@@ -160,42 +160,42 @@ class Inflector { ...@@ -160,42 +160,42 @@ class Inflector {
*/ */
public static function singular($value) public static function singular($value)
{ {
if (array_key_exists($value, static::$singular_cache)) if (array_key_exists($value, static::$singular_cache))
{ {
return static::$singular_cache[$value]; return static::$singular_cache[$value];
} }
if (in_array(strtolower($value), static::$uncountable)) if (in_array(strtolower($value), static::$uncountable))
{ {
return static::$singular_cache[$value] = $value; return static::$singular_cache[$value] = $value;
} }
foreach (static::$irregular as $irregular => $pattern) foreach (static::$irregular as $irregular => $pattern)
{ {
$pattern = '/'.$pattern.'$/i'; $pattern = '/'.$pattern.'$/i';
if (preg_match($pattern, $value)) if (preg_match($pattern, $value))
{ {
return static::$singular_cache[$value] = preg_replace($pattern, $irregular, $value); return static::$singular_cache[$value] = preg_replace($pattern, $irregular, $value);
} }
} }
foreach (static::$singular as $pattern => $singular) foreach (static::$singular as $pattern => $singular)
{ {
if (preg_match($pattern, $value)) if (preg_match($pattern, $value))
{ {
return static::$singular_cache[$value] = preg_replace($pattern, $singular, $value); return static::$singular_cache[$value] = preg_replace($pattern, $singular, $value);
} }
} }
return static::$singular_cache[$value] = $value; return static::$singular_cache[$value] = $value;
} }
/** /**
* Get the plural form of a word if the count is greater than zero. * Get the plural form of a word if the count is greater than zero.
* *
* @param string $value * @param string $value
* @param int $count * @param int $count
* @return string * @return string
*/ */
public static function plural_if($value, $count) public static function plural_if($value, $count)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment