Skip to content

Commit

Permalink
#2006 improves Inflector::slug() performance
Browse files Browse the repository at this point in the history
  • Loading branch information
Schlaefer committed Oct 18, 2013
1 parent 1dcf55c commit 1d87673
Show file tree
Hide file tree
Showing 2 changed files with 224 additions and 56 deletions.
8 changes: 4 additions & 4 deletions Cake/Test/TestCase/Utility/InflectorTest.php
Expand Up @@ -250,7 +250,7 @@ public function testInflectorSlug() {
* @return void
*/
public function testInflectorSlugWithMap() {
Inflector::rules('transliteration', array('/r/' => '1'));
Inflector::rules('transliteration', array('r' => '1'));
$result = Inflector::slug('replace every r');
$expected = '1eplace_eve1y_1';
$this->assertEquals($expected, $result);
Expand All @@ -266,7 +266,7 @@ public function testInflectorSlugWithMap() {
* @return void
*/
public function testInflectorSlugWithMapOverridingDefault() {
Inflector::rules('transliteration', array('/å/' => 'aa', '/ø/' => 'oe'));
Inflector::rules('transliteration', array('å' => 'aa', 'ø' => 'oe'));
$result = Inflector::slug('Testing æ ø å', '-');
$expected = 'Testing-ae-oe-aa';
$this->assertEquals($expected, $result);
Expand Down Expand Up @@ -397,10 +397,10 @@ public function testCustomSingularRule() {
public function testCustomTransliterationRule() {
$this->assertEquals(Inflector::slug('Testing æ ø å'), 'Testing_ae_o_a');

Inflector::rules('transliteration', array('/å/' => 'aa', '/ø/' => 'oe'));
Inflector::rules('transliteration', array('å' => 'aa', 'ø' => 'oe'));
$this->assertEquals(Inflector::slug('Testing æ ø å'), 'Testing_ae_oe_aa');

Inflector::rules('transliteration', array('/ä|æ/' => 'ae', '/å/' => 'aa'), true);
Inflector::rules('transliteration', array('æ' => 'ae', 'å' => 'aa'), true);
$this->assertEquals(Inflector::slug('Testing æ ø å'), 'Testing_ae_ø_aa');
}

Expand Down
272 changes: 220 additions & 52 deletions Cake/Utility/Inflector.php
Expand Up @@ -177,56 +177,224 @@ class Inflector {
* @var array
*/
protected static $_transliteration = array(
'/ä|æ|ǽ/' => 'ae',
'/ö|œ/' => 'oe',
'/ü/' => 'ue',
'/Ä/' => 'Ae',
'/Ü/' => 'Ue',
'/Ö/' => 'Oe',
'/À|Á|Â|Ã|Å|Ǻ|Ā|Ă|Ą|Ǎ/' => 'A',
'/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª/' => 'a',
'/Ç|Ć|Ĉ|Ċ|Č/' => 'C',
'/ç|ć|ĉ|ċ|č/' => 'c',
'/Ð|Ď|Đ/' => 'D',
'/ð|ď|đ/' => 'd',
'/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě/' => 'E',
'/è|é|ê|ë|ē|ĕ|ė|ę|ě/' => 'e',
'/Ĝ|Ğ|Ġ|Ģ/' => 'G',
'/ĝ|ğ|ġ|ģ/' => 'g',
'/Ĥ|Ħ/' => 'H',
'/ĥ|ħ/' => 'h',
'/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ/' => 'I',
'/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı/' => 'i',
'/Ĵ/' => 'J',
'/ĵ/' => 'j',
'/Ķ/' => 'K',
'/ķ/' => 'k',
'/Ĺ|Ļ|Ľ|Ŀ|Ł/' => 'L',
'/ĺ|ļ|ľ|ŀ|ł/' => 'l',
'/Ñ|Ń|Ņ|Ň/' => 'N',
'/ñ|ń|ņ|ň|ʼn/' => 'n',
'/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ/' => 'O',
'/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º/' => 'o',
'/Ŕ|Ŗ|Ř/' => 'R',
'/ŕ|ŗ|ř/' => 'r',
'/Ś|Ŝ|Ş|Ș|Š/' => 'S',
'/ś|ŝ|ş|ș|š|ſ/' => 's',
'/Ţ|Ț|Ť|Ŧ/' => 'T',
'/ţ|ț|ť|ŧ/' => 't',
'/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ/' => 'U',
'/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ/' => 'u',
'/Ý|Ÿ|Ŷ/' => 'Y',
'/ý|ÿ|ŷ/' => 'y',
'/Ŵ/' => 'W',
'/ŵ/' => 'w',
'/Ź|Ż|Ž/' => 'Z',
'/ź|ż|ž/' => 'z',
'/Æ|Ǽ/' => 'AE',
'/ß/' => 'ss',
'/IJ/' => 'IJ',
'/ij/' => 'ij',
'/Œ/' => 'OE',
'/ƒ/' => 'f'
'ä' => 'ae',
'æ' => 'ae',
'ǽ' => 'ae',
'ö' => 'oe',
'œ' => 'oe',
'ü' => 'ue',
'Ä' => 'Ae',
'Ü' => 'Ue',
'Ö' => 'Oe',
'À' => 'A',
'Á' => 'A',
'Â' => 'A',
'Ã' => 'A',
'Å' => 'A',
'Ǻ' => 'A',
'Ā' => 'A',
'Ă' => 'A',
'Ą' => 'A',
'Ǎ' => 'A',
'à' => 'a',
'á' => 'a',
'â' => 'a',
'ã' => 'a',
'å' => 'a',
'ǻ' => 'a',
'ā' => 'a',
'ă' => 'a',
'ą' => 'a',
'ǎ' => 'a',
'ª' => 'a',
'Ç' => 'C',
'Ć' => 'C',
'Ĉ' => 'C',
'Ċ' => 'C',
'Č' => 'C',
'ç' => 'c',
'ć' => 'c',
'ĉ' => 'c',
'ċ' => 'c',
'č' => 'c',
'Ð' => 'D',
'Ď' => 'D',
'Đ' => 'D',
'ð' => 'd',
'ď' => 'd',
'đ' => 'd',
'È' => 'E',
'É' => 'E',
'Ê' => 'E',
'Ë' => 'E',
'Ē' => 'E',
'Ĕ' => 'E',
'Ė' => 'E',
'Ę' => 'E',
'Ě' => 'E',
'è' => 'e',
'é' => 'e',
'ê' => 'e',
'ë' => 'e',
'ē' => 'e',
'ĕ' => 'e',
'ė' => 'e',
'ę' => 'e',
'ě' => 'e',
'Ĝ' => 'G',
'Ğ' => 'G',
'Ġ' => 'G',
'Ģ' => 'G',
'ĝ' => 'g',
'ğ' => 'g',
'ġ' => 'g',
'ģ' => 'g',
'Ĥ' => 'H',
'Ħ' => 'H',
'ĥ' => 'h',
'ħ' => 'h',
'Ì' => 'I',
'Í' => 'I',
'Î' => 'I',
'Ï' => 'I',
'Ĩ' => 'I',
'Ī' => 'I',
'Ĭ' => 'I',
'Ǐ' => 'I',
'Į' => 'I',
'İ' => 'I',
'ì' => 'i',
'í' => 'i',
'î' => 'i',
'ï' => 'i',
'ĩ' => 'i',
'ī' => 'i',
'ĭ' => 'i',
'ǐ' => 'i',
'į' => 'i',
'ı' => 'i',
'Ĵ' => 'J',
'ĵ' => 'j',
'Ķ' => 'K',
'ķ' => 'k',
'Ĺ' => 'L',
'Ļ' => 'L',
'Ľ' => 'L',
'Ŀ' => 'L',
'Ł' => 'L',
'ĺ' => 'l',
'ļ' => 'l',
'ľ' => 'l',
'ŀ' => 'l',
'ł' => 'l',
'Ñ' => 'N',
'Ń' => 'N',
'Ņ' => 'N',
'Ň' => 'N',
'ñ' => 'n',
'ń' => 'n',
'ņ' => 'n',
'ň' => 'n',
'ʼn' => 'n',
'Ò' => 'O',
'Ó' => 'O',
'Ô' => 'O',
'Õ' => 'O',
'Ō' => 'O',
'Ŏ' => 'O',
'Ǒ' => 'O',
'Ő' => 'O',
'Ơ' => 'O',
'Ø' => 'O',
'Ǿ' => 'O',
'ò' => 'o',
'ó' => 'o',
'ô' => 'o',
'õ' => 'o',
'ō' => 'o',
'ŏ' => 'o',
'ǒ' => 'o',
'ő' => 'o',
'ơ' => 'o',
'ø' => 'o',
'ǿ' => 'o',
'º' => 'o',
'Ŕ' => 'R',
'Ŗ' => 'R',
'Ř' => 'R',
'ŕ' => 'r',
'ŗ' => 'r',
'ř' => 'r',
'Ś' => 'S',
'Ŝ' => 'S',
'Ş' => 'S',
'Ș' => 'S',
'Š' => 'S',
'ś' => 's',
'ŝ' => 's',
'ş' => 's',
'ș' => 's',
'š' => 's',
'ſ' => 's',
'Ţ' => 'T',
'Ț' => 'T',
'Ť' => 'T',
'Ŧ' => 'T',
'ţ' => 't',
'ț' => 't',
'ť' => 't',
'ŧ' => 't',
'Ù' => 'U',
'Ú' => 'U',
'Û' => 'U',
'Ũ' => 'U',
'Ū' => 'U',
'Ŭ' => 'U',
'Ů' => 'U',
'Ű' => 'U',
'Ų' => 'U',
'Ư' => 'U',
'Ǔ' => 'U',
'Ǖ' => 'U',
'Ǘ' => 'U',
'Ǚ' => 'U',
'Ǜ' => 'U',
'ù' => 'u',
'ú' => 'u',
'û' => 'u',
'ũ' => 'u',
'ū' => 'u',
'ŭ' => 'u',
'ů' => 'u',
'ű' => 'u',
'ų' => 'u',
'ư' => 'u',
'ǔ' => 'u',
'ǖ' => 'u',
'ǘ' => 'u',
'ǚ' => 'u',
'ǜ' => 'u',
'Ý' => 'Y',
'Ÿ' => 'Y',
'Ŷ' => 'Y',
'ý' => 'y',
'ÿ' => 'y',
'ŷ' => 'y',
'Ŵ' => 'W',
'ŵ' => 'w',
'Ź' => 'Z',
'Ż' => 'Z',
'Ž' => 'Z',
'ź' => 'z',
'ż' => 'z',
'ž' => 'z',
'Æ' => 'AE',
'Ǽ' => 'AE',
'ß' => 'ss',
'IJ' => 'IJ',
'ij' => 'ij',
'Œ' => 'OE',
'ƒ' => 'f',
);

/**
Expand Down Expand Up @@ -541,13 +709,13 @@ public static function variable($string) {
public static function slug($string, $replacement = '_') {
$quotedReplacement = preg_quote($replacement, '/');

$merge = array(
$map = array(
'/[^\s\p{Ll}\p{Lm}\p{Lo}\p{Lt}\p{Lu}\p{Nd}]/mu' => ' ',
'/\\s+/' => $replacement,
sprintf('/^[%s]+|[%s]+$/', $quotedReplacement, $quotedReplacement) => '',
);

$map = static::$_transliteration + $merge;
$string = str_replace(array_keys(self::$_transliteration), array_values(self::$_transliteration), $string);
return preg_replace(array_keys($map), array_values($map), $string);
}

Expand Down

0 comments on commit 1d87673

Please sign in to comment.