Added in automatic inflection on english strings. Non-english strings may be added to the "irregular" array.
This commit is contained in:
130
laravel/pluralizer.php
Normal file
130
laravel/pluralizer.php
Normal file
@@ -0,0 +1,130 @@
|
||||
<?php namespace Laravel;
|
||||
|
||||
class Pluralizer {
|
||||
|
||||
/**
|
||||
* The "strings" configuration array.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $config;
|
||||
|
||||
/**
|
||||
* The cached copies of the plural inflections.
|
||||
*/
|
||||
protected $plural = array();
|
||||
|
||||
/**
|
||||
* The cached copies of the singular inflections.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $singular = array();
|
||||
|
||||
/**
|
||||
* Create a new pluralizer instance.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($config)
|
||||
{
|
||||
$this->config = $config;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the singular form of the given word.
|
||||
*
|
||||
* @param string $value
|
||||
* @return string
|
||||
*/
|
||||
public function singular($value)
|
||||
{
|
||||
// First we'll check the cache of inflected values. We cache each word that
|
||||
// is inflected so we don't have to spin through the regular expressions
|
||||
// each time we need to inflect a given value for the developer.
|
||||
if (isset($this->singular[$value]))
|
||||
{
|
||||
return $this->singular[$value];
|
||||
}
|
||||
|
||||
// English words may be automatically inflected using regular expressions.
|
||||
// If the word is english, we'll just pass off the word to the automatic
|
||||
// inflection method and return the result, which is cached.
|
||||
$irregular = $this->config['irregular'];
|
||||
|
||||
$result = $this->auto($value, $this->config['singular'], $irregular);
|
||||
|
||||
return $this->singular[$value] = $result ?: $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the plural form of the given word.
|
||||
*
|
||||
* @param string $value
|
||||
* @param int $count
|
||||
* @return string
|
||||
*/
|
||||
public function plural($value, $count = 2)
|
||||
{
|
||||
if ((int) $count == 1) return $value;
|
||||
|
||||
// First we'll check the cache of inflected values. We cache each word that
|
||||
// is inflected so we don't have to spin through the regular expressions
|
||||
// each time we need to inflect a given value for the developer.
|
||||
if (isset($this->plural[$value]))
|
||||
{
|
||||
return $this->plural[$value];
|
||||
}
|
||||
|
||||
// English words may be automatically inflected using regular expressions.
|
||||
// If the word is english, we'll just pass off the word to the automatic
|
||||
// inflection method and return the result, which is cached.
|
||||
$irregular = array_flip($this->config['irregular']);
|
||||
|
||||
$result = $this->auto($value, $this->config['plural'], $irregular);
|
||||
|
||||
return $this->plural[$value] = $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform auto inflection on an English word.
|
||||
*
|
||||
* @param string $value
|
||||
* @param array $source
|
||||
* @param array $irregular
|
||||
* @return string
|
||||
*/
|
||||
protected function auto($value, $source, $irregular)
|
||||
{
|
||||
// If the word hasn't been cached, we'll check the list of words that
|
||||
// that are "uncountable". This should be a quick look up since we
|
||||
// can just hit the array directly for the value.
|
||||
if (in_array(strtolower($value), $this->config['uncountable']))
|
||||
{
|
||||
return $value;
|
||||
}
|
||||
|
||||
// Next we will check the "irregular" patterns, which contains words
|
||||
// like "children" and "teeth" which can not be inflected using the
|
||||
// typically used regular expression matching approach.
|
||||
foreach ($irregular as $irregular => $pattern)
|
||||
{
|
||||
if (preg_match($pattern = '/'.$pattern.'$/i', $value))
|
||||
{
|
||||
return preg_replace($pattern, $irregular, $value);
|
||||
}
|
||||
}
|
||||
|
||||
// Finally we'll spin through the array of regular expressions and
|
||||
// and look for matches for the word. If we find a match we will
|
||||
// cache and return the inflected value for quick look up.
|
||||
foreach ($source as $pattern => $inflected)
|
||||
{
|
||||
if (preg_match($pattern, $value))
|
||||
{
|
||||
return preg_replace($pattern, $inflected, $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,6 +2,13 @@
|
||||
|
||||
class Str {
|
||||
|
||||
/**
|
||||
* The pluralizer instance.
|
||||
*
|
||||
* @var Pluralizer
|
||||
*/
|
||||
public static $pluralizer;
|
||||
|
||||
/**
|
||||
* Get the default string encoding for the application.
|
||||
*
|
||||
@@ -154,25 +161,17 @@ class Str {
|
||||
/**
|
||||
* Get the singular form of the given word.
|
||||
*
|
||||
* The word should be defined in the "strings" configuration file.
|
||||
*
|
||||
* @param string $value
|
||||
* @return string
|
||||
*/
|
||||
public static function singular($value)
|
||||
{
|
||||
$inflection = Config::get('strings.inflection');
|
||||
|
||||
$singular = array_get(array_flip($inflection), strtolower($value), $value);
|
||||
|
||||
return (ctype_upper($value[0])) ? static::title($singular) : $singular;
|
||||
return static::pluralizer()->singular($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the plural form of the given word.
|
||||
*
|
||||
* The word should be defined in the "strings" configuration file.
|
||||
*
|
||||
* <code>
|
||||
* // Returns the plural form of "child"
|
||||
* $plural = Str::plural('child', 10);
|
||||
@@ -187,11 +186,19 @@ class Str {
|
||||
*/
|
||||
public static function plural($value, $count = 2)
|
||||
{
|
||||
if ((int) $count == 1) return $value;
|
||||
return static::pluralizer()->plural($value, $count);
|
||||
}
|
||||
|
||||
$plural = array_get(Config::get('strings.inflection'), strtolower($value), $value);
|
||||
/**
|
||||
* Get the pluralizer instance.
|
||||
*
|
||||
* @return Pluralizer
|
||||
*/
|
||||
protected static function pluralizer()
|
||||
{
|
||||
$config = Config::get('strings');
|
||||
|
||||
return (ctype_upper($value[0])) ? static::title($plural) : $plural;
|
||||
return static::$pluralizer ?: static::$pluralizer = new Pluralizer($config);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user