<?php
/*
 *  $Id: Inflector.php 3189 2007-11-18 20:37:44Z meus $
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * This software consists of voluntary contributions made by many individuals
 * and is licensed under the LGPL. For more information, see
 * <http://www.phpdoctrine.org>.
 */

#namespace Doctrine::ORM::Tools;

/**
 * Doctrine_Inflector has static methods for inflecting text
 * 
 * The methods in these classes are from several different sources collected
 * across the internet through php development for several years.
 * They have been updated and modified a little bit for Doctrine but are mainly untouched.
 *
 * @package     Doctrine
 * @subpackage  Inflector
 * @license     http://www.opensource.org/licenses/lgpl-license.php LGPL
 * @link        www.phpdoctrine.org
 * @since       1.0
 * @version     $Revision: 3189 $
 * @author      Konsta Vesterinen <kvesteri@cc.hut.fi>
 */
class Doctrine_Inflector
{
    /**
    * pluralize
    *
    * @param    string $word English noun to pluralize
    * @return   string Plural noun
    */
    public static function pluralize($word)
    {
        $plural = array('/(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)ies$/i' => '\1y',
                        '/([^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');

        $uncountable = array('equipment',
                             'information',
                             'rice',
                             'money',
                             'species',
                             'series',
                             'fish',
                             'sheep');

        $irregular = array('person' => 'people',
                           'man'    => 'men',
                           'child'  => 'children',
                           'sex'    => 'sexes',
                           'move'   => 'moves');

        $lowercasedWord = strtolower($word);

        foreach ($uncountable as $_uncountable) {
            if(substr($lowercasedWord, (-1 * strlen($_uncountable))) == $_uncountable) {
                return $word;
            }
        }

        foreach ($irregular as $_plural=> $_singular){
            if (preg_match('/('.$_plural.')$/i', $word, $arr)) {
                return preg_replace('/('.$_plural.')$/i', substr($arr[0],0,1) . substr($_singular,1), $word);
            }
        }

        foreach ($plural as $rule => $replacement) {
            if (preg_match($rule, $word)) {
                return preg_replace($rule, $replacement, $word);
            }
        }

        return false;
    }

    /**
    * singularize
    *
    * @param    string    $word    English noun to singularize
    * @return   string Singular noun.
    */
    public static function singularize($word)
    {
        $singular = array('/(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' => '');

        $uncountable = array('equipment',
                             'information',
                             'rice',
                             'money',
                             'species',
                             'series',
                             'fish',
                             'sheep',
                             'sms');

        $irregular = array('person' => 'people',
                           'man'    => 'men',
                           'child'  => 'children',
                           'sex'    => 'sexes',
                           'move'   => 'moves');

        $lowercasedWord = strtolower($word);
        foreach ($uncountable as $_uncountable){
            if(substr($lowercasedWord, ( -1 * strlen($_uncountable))) == $_uncountable){
                return $word;
            }
        }

        foreach ($irregular as $_singular => $_plural) {
            if (preg_match('/('.$_plural.')$/i', $word, $arr)) {
                return preg_replace('/('.$_plural.')$/i', substr($arr[0],0,1).substr($_singular,1), $word);
            }
        }

        foreach ($singular as $rule => $replacement) {
            if (preg_match($rule, $word)) {
                return preg_replace($rule, $replacement, $word);
            }
        }

        return $word;
    }

    /**
     * variablize
     * 
     * @param string $word 
     * @return void
     */
    public static function variablize($word)
    {
        $word = self::camelize($word);

        return strtolower($word[0]) . substr($word, 1);
    }

    /**
     * tableize
     *
     * @param string $name
     * @return void
     */
    public static function tableize($name)
    {
        // Would prefer this but it breaks unit tests. Forces the table underscore pattern
        // return self::pluralize(self::underscore($name));
        return strtolower(preg_replace('~(?<=\\w)([A-Z])~', '_$1', $name));
    }

    /**
     * classify
     *
     * @param string $word
     */
    public static function classify($word)
    {
        return preg_replace_callback('~(_?)(_)([\w])~', array("Doctrine_Inflector", "classifyCallback"), ucfirst(strtolower($word)));
    }

    /**
     * classifyCallback
     *
     * Callback function to classify a classname properly.
     *
     * @param array $matches An array of matches from a pcre_replace call
     * @return string A string with matches 1 and mathces 3 in upper case.
     */
    public static function classifyCallback($matches)
    {
        return $matches[1] . strtoupper($matches[3]);
    }

    /**
     * camelize
     *
     * @param string $word 
     * @return void
     */
    public static function camelize($word)
    {
        if (preg_match_all('/\/(.?)/', $word, $got)) {
            foreach ($got[1] as $k => $v){
                $got[1][$k] = '::' . strtoupper($v);
            }

            $word = str_replace($got[0], $got[1], $word);
        }

        return str_replace(' ', '', ucwords(preg_replace('/[^A-Z^a-z^0-9^:]+/', ' ', $word)));
    }

    /**
     * unaccent
     *
     * @param string $text 
     * @return void
     */
    public static function unaccent($text)
    {
        $chars = array('À' => 'A',
                      'Á' => 'A',
                      'Â' => 'A',
                      'Ã' => 'A',
                      'Ä' => 'A',
                      'Å' => 'A',
                      'Æ' => 'AE',
                      'Ā' => 'A',
                      'Ą' => 'A',
                      'Ă' => 'A',
                      'Ç' => 'C',
                      'Ć' => 'C',
                      'Č' => 'C',
                      'Ĉ' => 'C',
                      'Ċ' => 'C',
                      'Ď' => 'D',
                      'Đ' => 'D',
                      'È' => 'E',
                      'É' => 'E',
                      'Ê' => 'E',
                      'Ë' => 'E',
                      'Ē' => 'E',
                      'Ę' => 'E',
                      'Ě' => 'E',
                      'Ĕ' => 'E',
                      'Ė' => 'E',
                      'Ĝ' => 'G',
                      'Ğ' => 'G',
                      'Ġ' => 'G',
                      'Ģ' => 'G',
                      'Ĥ' => 'H',
                      'Ħ' => 'H',
                      'Ì' => 'I',
                      'Í' => 'I',
                      'Î' => 'I',
                      'Ï' => 'I',
                      'Ī' => 'I',
                      'Ĩ' => 'I',
                      'Ĭ' => 'I',
                      'Į' => 'I',
                      'İ' => 'I',
                      'IJ' => 'IJ',
                      'Ĵ' => 'J',
                      'Ķ' => 'K',
                      'Ľ' => 'L',
                      'Ĺ' => 'L',
                      'Ļ' => 'K',
                      'Ŀ' => 'K',
                      'Ł' => 'L',
                      'Ñ' => 'N',
                      'Ń' => 'N',
                      'Ň' => 'N',
                      'Ņ' => 'N',
                      'Ŋ' => 'N',
                      'Ò' => 'O',
                      'Ó' => 'O',
                      'Ô' => 'O',
                      'Õ' => 'O',
                      'Ö' => 'O',
                      'Ø' => 'O',
                      'Ō' => 'O',
                      'Ő' => 'O',
                      'Ŏ' => 'O',
                      'Œ' => 'OE',
                      'Ŕ' => 'R',
                      'Ř' => 'R',
                      'Ŗ' => 'R',
                      'Ś' => 'S',
                      'Ş' => 'S',
                      'Ŝ' => 'S',
                      'Ș' => 'S',
                      'Š' => 'S',
                      'Ť' => 'T',
                      'Ţ' => 'T',
                      'Ŧ' => 'T',
                      'Ț' => 'T',
                      'Ù' => 'U',
                      'Ú' => 'U',
                      'Û' => 'U',
                      'Ü' => 'Ue',
                      'Ū' => 'U',
                      'Ů' => 'U',
                      'Ű' => 'U',
                      'Ŭ' => 'U',
                      'Ũ' => 'U',
                      'Ų' => 'U',
                      'Ŵ' => 'W',
                      'Ŷ' => 'Y',
                      'Ÿ' => 'Y',
                      'Ý' => 'Y',
                      'Ź' => 'Z',
                      'Ż' => 'Z',
                      'Ž' => 'Z',
                      'à' => 'a',
                      'á' => 'a',
                      'â' => 'a',
                      'ã' => 'a',
                      'ä' => 'a',
                      'ā' => 'a',
                      'ą' => 'a',
                      'ă' => 'a',
                      'å' => 'a',
                      'æ' => 'ae',
                      'ç' => 'c',
                      'ć' => 'c',
                      'č' => 'c',
                      'ĉ' => 'c',
                      'ċ' => 'c',
                      'ď' => 'd',
                      'đ' => 'd',
                      'è' => 'e',
                      'é' => 'e',
                      'ê' => 'e',
                      'ë' => 'e',
                      'ē' => 'e',
                      'ę' => 'e',
                      'ě' => 'e',
                      'ĕ' => 'e',
                      'ė' => 'e',
                      'ƒ' => 'f',
                      'ĝ' => 'g',
                      'ğ' => 'g',
                      'ġ' => 'g',
                      'ģ' => 'g',
                      'ĥ' => 'h',
                      'ħ' => 'h',
                      'ì' => 'i',
                      'í' => 'i',
                      'î' => 'i',
                      'ï' => 'i',
                      'ī' => 'i',
                      'ĩ' => 'i',
                      'ĭ' => 'i',
                      'į' => 'i',
                      'ı' => 'i',
                      'ij' => 'ij',
                      'ĵ' => 'j',
                      'ķ' => 'k',
                      'ĸ' => 'k',
                      'ł' => 'l',
                      'ľ' => 'l',
                      'ĺ' => 'l',
                      'ļ' => 'l',
                      'ŀ' => 'l',
                      'ñ' => 'n',
                      'ń' => 'n',
                      'ň' => 'n',
                      'ņ' => 'n',
                      'ʼn' => 'n',
                      'ŋ' => 'n',
                      'ò' => 'o',
                      'ó' => 'o',
                      'ô' => 'o',
                      'õ' => 'o',
                      'ö' => 'o',
                      'ø' => 'o',
                      'ō' => 'o',
                      'ő' => 'o',
                      'ŏ' => 'o',
                      'œ' => 'oe',
                      'ŕ' => 'r',
                      'ř' => 'r',
                      'ŗ' => 'r',
                      'ś' => 's',
                      'š' => 's',
                      'ť' => 't',
                      'ù' => 'u',
                      'ú' => 'u',
                      'û' => 'u',
                      'ü' => 'u',
                      'ū' => 'u',
                      'ů' => 'u',
                      'ű' => 'u',
                      'ŭ' => 'u',
                      'ũ' => 'u',
                      'ų' => 'u',
                      'ŵ' => 'w',
                      'ÿ' => 'y',
                      'ý' => 'y',
                      'ŷ' => 'y',
                      'ż' => 'z',
                      'ź' => 'z',
                      'ž' => 'z',
                      'ß' => 'ss',
                      'ſ' => 'ss',
                      'Α' => 'A',
                      'Ά' => 'A',
                      'Ἀ' => 'A',
                      'Ἁ' => 'A',
                      'Ἂ' => 'A',
                      'Ἃ' => 'A',
                      'Ἄ' => 'A',
                      'Ἅ' => 'A',
                      'Ἆ' => 'A',
                      'Ἇ' => 'A',
                      'ᾈ' => 'A',
                      'ᾉ' => 'A',
                      'ᾊ' => 'A',
                      'ᾋ' => 'A',
                      'ᾌ' => 'A',
                      'ᾍ' => 'A',
                      'ᾎ' => 'A',
                      'ᾏ' => 'A',
                      'Ᾰ' => 'A',
                      'Ᾱ' => 'A',
                      'Ὰ' => 'A',
                      'Ά' => 'A',
                      'ᾼ' => 'A',
                      'Β' => 'B',
                      'Γ' => 'G',
                      'Δ' => 'D',
                      'Ε' => 'E',
                      'Έ' => 'E',
                      'Ἐ' => 'E',
                      'Ἑ' => 'E',
                      'Ἒ' => 'E',
                      'Ἓ' => 'E',
                      'Ἔ' => 'E',
                      'Ἕ' => 'E',
                      'Έ' => 'E',
                      'Ὲ' => 'E',
                      'Ζ' => 'Z',
                      'Η' => 'I',
                      'Ή' => 'I',
                      'Ἠ' => 'I',
                      'Ἡ' => 'I',
                      'Ἢ' => 'I',
                      'Ἣ' => 'I',
                      'Ἤ' => 'I',
                      'Ἥ' => 'I',
                      'Ἦ' => 'I',
                      'Ἧ' => 'I',
                      'ᾘ' => 'I',
                      'ᾙ' => 'I',
                      'ᾚ' => 'I',
                      'ᾛ' => 'I',
                      'ᾜ' => 'I',
                      'ᾝ' => 'I',
                      'ᾞ' => 'I',
                      'ᾟ' => 'I',
                      'Ὴ' => 'I',
                      'Ή' => 'I',
                      'ῌ' => 'I',
                      'Θ' => 'TH',
                      'Ι' => 'I',
                      'Ί' => 'I',
                      'Ϊ' => 'I',
                      'Ἰ' => 'I',
                      'Ἱ' => 'I',
                      'Ἲ' => 'I',
                      'Ἳ' => 'I',
                      'Ἴ' => 'I',
                      'Ἵ' => 'I',
                      'Ἶ' => 'I',
                      'Ἷ' => 'I',
                      'Ῐ' => 'I',
                      'Ῑ' => 'I',
                      'Ὶ' => 'I',
                      'Ί' => 'I',
                      'Κ' => 'K',
                      'Λ' => 'L',
                      'Μ' => 'M',
                      'Ν' => 'N',
                      'Ξ' => 'KS',
                      'Ο' => 'O',
                      'Ό' => 'O',
                      'Ὀ' => 'O',
                      'Ὁ' => 'O',
                      'Ὂ' => 'O',
                      'Ὃ' => 'O',
                      'Ὄ' => 'O',
                      'Ὅ' => 'O',
                      'Ὸ' => 'O',
                      'Ό' => 'O',
                      'Π' => 'P',
                      'Ρ' => 'R',
                      'Ῥ' => 'R',
                      'Σ' => 'S',
                      'Τ' => 'T',
                      'Υ' => 'Y',
                      'Ύ' => 'Y',
                      'Ϋ' => 'Y',
                      'Ὑ' => 'Y',
                      'Ὓ' => 'Y',
                      'Ὕ' => 'Y',
                      'Ὗ' => 'Y',
                      'Ῠ' => 'Y',
                      'Ῡ' => 'Y',
                      'Ὺ' => 'Y',
                      'Ύ' => 'Y',
                      'Φ' => 'F',
                      'Χ' => 'X',
                      'Ψ' => 'PS',
                      'Ω' => 'O',
                      'Ώ' => 'O',
                      'Ὠ' => 'O',
                      'Ὡ' => 'O',
                      'Ὢ' => 'O',
                      'Ὣ' => 'O',
                      'Ὤ' => 'O',
                      'Ὥ' => 'O',
                      'Ὦ' => 'O',
                      'Ὧ' => 'O',
                      'ᾨ' => 'O',
                      'ᾩ' => 'O',
                      'ᾪ' => 'O',
                      'ᾫ' => 'O',
                      'ᾬ' => 'O',
                      'ᾭ' => 'O',
                      'ᾮ' => 'O',
                      'ᾯ' => 'O',
                      'Ὼ' => 'O',
                      'Ώ' => 'O',
                      'ῼ' => 'O',
                      'α' => 'a',
                      'ά' => 'a',
                      'ἀ' => 'a',
                      'ἁ' => 'a',
                      'ἂ' => 'a',
                      'ἃ' => 'a',
                      'ἄ' => 'a',
                      'ἅ' => 'a',
                      'ἆ' => 'a',
                      'ἇ' => 'a',
                      'ᾀ' => 'a',
                      'ᾁ' => 'a',
                      'ᾂ' => 'a',
                      'ᾃ' => 'a',
                      'ᾄ' => 'a',
                      'ᾅ' => 'a',
                      'ᾆ' => 'a',
                      'ᾇ' => 'a',
                      'ὰ' => 'a',
                      'ά' => 'a',
                      'ᾰ' => 'a',
                      'ᾱ' => 'a',
                      'ᾲ' => 'a',
                      'ᾳ' => 'a',
                      'ᾴ' => 'a',
                      'ᾶ' => 'a',
                      'ᾷ' => 'a',
                      'β' => 'b',
                      'γ' => 'g',
                      'δ' => 'd',
                      'ε' => 'e',
                      'έ' => 'e',
                      'ἐ' => 'e',
                      'ἑ' => 'e',
                      'ἒ' => 'e',
                      'ἓ' => 'e',
                      'ἔ' => 'e',
                      'ἕ' => 'e',
                      'ὲ' => 'e',
                      'έ' => 'e',
                      'ζ' => 'z',
                      'η' => 'i',
                      'ή' => 'i',
                      'ἠ' => 'i',
                      'ἡ' => 'i',
                      'ἢ' => 'i',
                      'ἣ' => 'i',
                      'ἤ' => 'i',
                      'ἥ' => 'i',
                      'ἦ' => 'i',
                      'ἧ' => 'i',
                      'ᾐ' => 'i',
                      'ᾑ' => 'i',
                      'ᾒ' => 'i',
                      'ᾓ' => 'i',
                      'ᾔ' => 'i',
                      'ᾕ' => 'i',
                      'ᾖ' => 'i',
                      'ᾗ' => 'i',
                      'ὴ' => 'i',
                      'ή' => 'i',
                      'ῂ' => 'i',
                      'ῃ' => 'i',
                      'ῄ' => 'i',
                      'ῆ' => 'i',
                      'ῇ' => 'i',
                      'θ' => 'th',
                      'ι' => 'i',
                      'ί' => 'i',
                      'ϊ' => 'i',
                      'ΐ' => 'i',
                      'ἰ' => 'i',
                      'ἱ' => 'i',
                      'ἲ' => 'i',
                      'ἳ' => 'i',
                      'ἴ' => 'i',
                      'ἵ' => 'i',
                      'ἶ' => 'i',
                      'ἷ' => 'i',
                      'ὶ' => 'i',
                      'ί' => 'i',
                      'ῐ' => 'i',
                      'ῑ' => 'i',
                      'ῒ' => 'i',
                      'ΐ' => 'i',
                      'ῖ' => 'i',
                      'ῗ' => 'i',
                      'κ' => 'k',
                      'λ' => 'l',
                      'μ' => 'm',
                      'ν' => 'n',
                      'ξ' => 'ks',
                      'ο' => 'o',
                      'ό' => 'o',
                      'ὀ' => 'o',
                      'ὁ' => 'o',
                      'ὂ' => 'o',
                      'ὃ' => 'o',
                      'ὄ' => 'o',
                      'ὅ' => 'o',
                      'ὸ' => 'o',
                      'ό' => 'o',
                      'π' => 'p',
                      'ρ' => 'r',
                      'ῤ' => 'r',
                      'ῥ' => 'r',
                      'σ' => 's',
                      'ς' => 's',
                      'τ' => 't',
                      'υ' => 'y',
                      'ύ' => 'y',
                      'ϋ' => 'y',
                      'ΰ' => 'y',
                      'ὐ' => 'y',
                      'ὑ' => 'y',
                      'ὒ' => 'y',
                      'ὓ' => 'y',
                      'ὔ' => 'y',
                      'ὕ' => 'y',
                      'ὖ' => 'y',
                      'ὗ' => 'y',
                      'ὺ' => 'y',
                      'ύ' => 'y',
                      'ῠ' => 'y',
                      'ῡ' => 'y',
                      'ῢ' => 'y',
                      'ΰ' => 'y',
                      'ῦ' => 'y',
                      'ῧ' => 'y',
                      'φ' => 'f',
                      'χ' => 'x',
                      'ψ' => 'ps',
                      'ω' => 'o',
                      'ώ' => 'o',
                      'ὠ' => 'o',
                      'ὡ' => 'o',
                      'ὢ' => 'o',
                      'ὣ' => 'o',
                      'ὤ' => 'o',
                      'ὥ' => 'o',
                      'ὦ' => 'o',
                      'ὧ' => 'o',
                      'ᾠ' => 'o',
                      'ᾡ' => 'o',
                      'ᾢ' => 'o',
                      'ᾣ' => 'o',
                      'ᾤ' => 'o',
                      'ᾥ' => 'o',
                      'ᾦ' => 'o',
                      'ᾧ' => 'o',
                      'ὼ' => 'o',
                      'ώ' => 'o',
                      'ῲ' => 'o',
                      'ῳ' => 'o',
                      'ῴ' => 'o',
                      'ῶ' => 'o',
                      'ῷ' => 'o',
                      '¨' => '',
                      '΅' => '',
                      '᾿' => '',
                      '῾' => '',
                      '῍' => '',
                      '῝' => '',
                      '῎' => '',
                      '῞' => '',
                      '῏' => '',
                      '῟' => '',
                      '῀' => '',
                      '῁' => '',
                      '΄' => '',
                      '΅' => '',
                      '`' => '',
                      '῭' => '',
                      'ͺ' => '',
                      '᾽' => '',
                      'А' => 'A',
                      'Б' => 'B',
                      'В' => 'V',
                      'Г' => 'G',
                      'Д' => 'D',
                      'Е' => 'E',
                      'Ё' => 'E',
                      'Ж' => 'ZH',
                      'З' => 'Z',
                      'И' => 'I',
                      'Й' => 'I',
                      'К' => 'K',
                      'Л' => 'L',
                      'М' => 'M',
                      'Н' => 'N',
                      'О' => 'O',
                      'П' => 'P',
                      'Р' => 'R',
                      'С' => 'S',
                      'Т' => 'T',
                      'У' => 'U',
                      'Ф' => 'F',
                      'Х' => 'KH',
                      'Ц' => 'TS',
                      'Ч' => 'CH',
                      'Ш' => 'SH',
                      'Щ' => 'SHCH',
                      'Ы' => 'Y',
                      'Э' => 'E',
                      'Ю' => 'YU',
                      'Я' => 'YA',
                      'а' => 'A',
                      'б' => 'B',
                      'в' => 'V',
                      'г' => 'G',
                      'д' => 'D',
                      'е' => 'E',
                      'ё' => 'E',
                      'ж' => 'ZH',
                      'з' => 'Z',
                      'и' => 'I',
                      'й' => 'I',
                      'к' => 'K',
                      'л' => 'L',
                      'м' => 'M',
                      'н' => 'N',
                      'о' => 'O',
                      'п' => 'P',
                      'р' => 'R',
                      'с' => 'S',
                      'т' => 'T',
                      'у' => 'U',
                      'ф' => 'F',
                      'х' => 'KH',
                      'ц' => 'TS',
                      'ч' => 'CH',
                      'ш' => 'SH',
                      'щ' => 'SHCH',
                      'ы' => 'Y',
                      'э' => 'E',
                      'ю' => 'YU',
                      'я' => 'YA',
                      'Ъ' => '',
                      'ъ' => '',
                      'Ь' => '',
                      'ь' => '',
                      'ð' => 'd',
                      'Ð' => 'D',
                      'þ' => 'th',
                      'Þ' => 'TH',
                      'ა' => 'a',
                      'ბ' => 'b',
                      'გ' => 'g',
                      'დ' => 'd',
                      'ე' => 'e',
                      'ვ' => 'v',
                      'ზ' => 'z',
                      'თ' => 't',
                      'ი' => 'i',
                      'კ' => 'k',
                      'ლ' => 'l',
                      'მ' => 'm',
                      'ნ' => 'n',
                      'ო' => 'o',
                      'პ' => 'p',
                      'ჟ' => 'zh',
                      'რ' => 'r',
                      'ს' => 's',
                      'ტ' => 't',
                      'უ' => 'u',
                      'ფ' => 'p',
                      'ქ' => 'k',
                      'ღ' => 'gh',
                      'ყ' => 'q',
                      'შ' => 'sh',
                      'ჩ' => 'ch',
                      'ც' => 'ts',
                      'ძ' => 'dz',
                      'წ' => 'ts',
                      'ჭ' => 'ch',
                      'ხ' => 'kh',
                      'ჯ' => 'j',
                      'ჰ' => 'h');
        
        return strtr($text, $chars);
    }

    /**
     * urlize
     *
     * @param string $text 
     * @return void
     */
    public static function urlize($text)
    {
        // Remove all non url friendly characters with the unaccent function
        $text = self::unaccent($text);
        
        // Remove all none word characters
        $text = preg_replace('/\W/', ' ', $text);
        
        // More stripping. Replace spaces with dashes
        $text = strtolower(preg_replace('/[^A-Z^a-z^0-9^\/]+/', '-',
                           preg_replace('/([a-z\d])([A-Z])/', '\1_\2',
                           preg_replace('/([A-Z]+)([A-Z][a-z])/', '\1_\2',
                           preg_replace('/::/', '/', $text)))));
        
        return trim($text, '-');
    }

    /**
     * underscore
     *
     * @param string $word 
     * @return void
     */
    public static function underscore($word)
    {
        return strtolower(preg_replace('/[^A-Z^a-z^0-9^\/]+/', '_',
               preg_replace('/([a-z\d])([A-Z])/', '\1_\2',
               preg_replace('/([A-Z]+)([A-Z][a-z])/', '\1_\2',
               preg_replace('/::/', '/', $word)))));
    }
}