Blame | Letzte Änderung | Log anzeigen | RSS feed
<?phpdeclare(strict_types=1);namespace Doctrine\Inflector;use RuntimeException;use function chr;use function function_exists;use function lcfirst;use function mb_strtolower;use function ord;use function preg_match;use function preg_replace;use function sprintf;use function str_replace;use function strlen;use function strtolower;use function strtr;use function trim;use function ucwords;class Inflector{private const ACCENTED_CHARACTERS = ['À' => 'A','Á' => 'A','Â' => 'A','Ã' => 'A','Ä' => 'Ae','Æ' => 'Ae','Å' => 'Aa','æ' => 'a','Ç' => 'C','È' => 'E','É' => 'E','Ê' => 'E','Ë' => 'E','Ì' => 'I','Í' => 'I','Î' => 'I','Ï' => 'I','Ñ' => 'N','Ò' => 'O','Ó' => 'O','Ô' => 'O','Õ' => 'O','Ö' => 'Oe','Ù' => 'U','Ú' => 'U','Û' => 'U','Ü' => 'Ue','Ý' => 'Y','ß' => 'ss','à' => 'a','á' => 'a','â' => 'a','ã' => 'a','ä' => 'ae','å' => 'aa','ç' => 'c','è' => 'e','é' => 'e','ê' => 'e','ë' => 'e','ì' => 'i','í' => 'i','î' => 'i','ï' => 'i','ñ' => 'n','ò' => 'o','ó' => 'o','ô' => 'o','õ' => 'o','ö' => 'oe','ù' => 'u','ú' => 'u','û' => 'u','ü' => 'ue','ý' => 'y','ÿ' => 'y','Ä€' => 'A','ā' => 'a','Ä‚' => 'A','ă' => 'a','Ą' => 'A','ą' => 'a','Ć' => 'C','ć' => 'c','Ĉ' => 'C','ĉ' => 'c','ÄŠ' => 'C','ċ' => 'c','Č' => 'C','č' => 'c','Ď' => 'D','ď' => 'd','Đ' => 'D','Ä‘' => 'd','Ä’' => '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','IJ' => 'IJ','ij' => 'ij','Ä´' => 'J','ĵ' => 'j','Ķ' => 'K','Ä·' => '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','Å’' => 'OE','Å“' => 'oe','Ø' => 'O','ø' => 'o','Å”' => 'R','Å•' => 'r','Å–' => 'R','Å—' => 'r','Ř' => 'R','ř' => 'r','Ś' => 'S','ś' => 's','Ŝ' => 'S','ŝ' => 's','Åž' => 'S','ş' => 's','Š' => 'S','š' => 's','Å¢' => 'T','Å£' => 't','Ť' => 'T','ť' => 't','Ŧ' => 'T','ŧ' => 't','Ũ' => 'U','Å©' => 'u','Ū' => 'U','Å«' => 'u','Ŭ' => 'U','ŭ' => 'u','Ů' => 'U','ů' => 'u','Ű' => 'U','ű' => 'u','Ų' => 'U','ų' => 'u','Å´' => 'W','ŵ' => 'w','Ŷ' => 'Y','Å·' => 'y','Ÿ' => 'Y','Ź' => 'Z','ź' => 'z','Ż' => 'Z','ż' => 'z','Ž' => 'Z','ž' => 'z','Å¿' => 's','€' => 'E','£' => '',];/** @var WordInflector */private $singularizer;/** @var WordInflector */private $pluralizer;public function __construct(WordInflector $singularizer, WordInflector $pluralizer){$this->singularizer = $singularizer;$this->pluralizer = $pluralizer;}/*** Converts a word into the format for a Doctrine table name. Converts 'ModelName' to 'model_name'.*/public function tableize(string $word): string{$tableized = preg_replace('~(?<=\\w)([A-Z])~u', '_$1', $word);if ($tableized === null) {throw new RuntimeException(sprintf('preg_replace returned null for value "%s"',$word));}return mb_strtolower($tableized);}/*** Converts a word into the format for a Doctrine class name. Converts 'table_name' to 'TableName'.*/public function classify(string $word): string{return str_replace([' ', '_', '-'], '', ucwords($word, ' _-'));}/*** Camelizes a word. This uses the classify() method and turns the first character to lowercase.*/public function camelize(string $word): string{return lcfirst($this->classify($word));}/*** Uppercases words with configurable delimiters between words.** Takes a string and capitalizes all of the words, like PHP's built-in* ucwords function. This extends that behavior, however, by allowing the* word delimiters to be configured, rather than only separating on* whitespace.** Here is an example:* <code>* <?php* $string = 'top-o-the-morning to all_of_you!';* echo $inflector->capitalize($string);* // Top-O-The-Morning To All_of_you!** echo $inflector->capitalize($string, '-_ ');* // Top-O-The-Morning To All_Of_You!* ?>* </code>** @param string $string The string to operate on.* @param string $delimiters A list of word separators.** @return string The string with all delimiter-separated words capitalized.*/public function capitalize(string $string, string $delimiters = " \n\t\r\0\x0B-"): string{return ucwords($string, $delimiters);}/*** Checks if the given string seems like it has utf8 characters in it.** @param string $string The string to check for utf8 characters in.*/public function seemsUtf8(string $string): bool{for ($i = 0; $i < strlen($string); $i++) {if (ord($string[$i]) < 0x80) {continue; // 0bbbbbbb}if ((ord($string[$i]) & 0xE0) === 0xC0) {$n = 1; // 110bbbbb} elseif ((ord($string[$i]) & 0xF0) === 0xE0) {$n = 2; // 1110bbbb} elseif ((ord($string[$i]) & 0xF8) === 0xF0) {$n = 3; // 11110bbb} elseif ((ord($string[$i]) & 0xFC) === 0xF8) {$n = 4; // 111110bb} elseif ((ord($string[$i]) & 0xFE) === 0xFC) {$n = 5; // 1111110b} else {return false; // Does not match any model}for ($j = 0; $j < $n; $j++) { // n bytes matching 10bbbbbb follow ?if (++$i === strlen($string) || ((ord($string[$i]) & 0xC0) !== 0x80)) {return false;}}}return true;}/*** Remove any illegal characters, accents, etc.** @param string $string String to unaccent** @return string Unaccented string*/public function unaccent(string $string): string{if (preg_match('/[\x80-\xff]/', $string) === false) {return $string;}if ($this->seemsUtf8($string)) {$string = strtr($string, self::ACCENTED_CHARACTERS);} else {$characters = [];// Assume ISO-8859-1 if not UTF-8$characters['in'] =chr(128). chr(131). chr(138). chr(142). chr(154). chr(158). chr(159). chr(162). chr(165). chr(181). chr(192). chr(193). chr(194). chr(195). chr(196). chr(197). chr(199). chr(200). chr(201). chr(202). chr(203). chr(204). chr(205). chr(206). chr(207). chr(209). chr(210). chr(211). chr(212). chr(213). chr(214). chr(216). chr(217). chr(218). chr(219). chr(220). chr(221). chr(224). chr(225). chr(226). chr(227). chr(228). chr(229). chr(231). chr(232). chr(233). chr(234). chr(235). chr(236). chr(237). chr(238). chr(239). chr(241). chr(242). chr(243). chr(244). chr(245). chr(246). chr(248). chr(249). chr(250). chr(251). chr(252). chr(253). chr(255);$characters['out'] = 'EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy';$string = strtr($string, $characters['in'], $characters['out']);$doubleChars = [];$doubleChars['in'] = [chr(140),chr(156),chr(198),chr(208),chr(222),chr(223),chr(230),chr(240),chr(254),];$doubleChars['out'] = ['OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th'];$string = str_replace($doubleChars['in'], $doubleChars['out'], $string);}return $string;}/*** Convert any passed string to a url friendly string.* Converts 'My first blog post' to 'my-first-blog-post'** @param string $string String to urlize.** @return string Urlized string.*/public function urlize(string $string): string{// Remove all non url friendly characters with the unaccent function$unaccented = $this->unaccent($string);if (function_exists('mb_strtolower')) {$lowered = mb_strtolower($unaccented);} else {$lowered = strtolower($unaccented);}$replacements = ['/\W/' => ' ','/([A-Z]+)([A-Z][a-z])/' => '\1_\2','/([a-z\d])([A-Z])/' => '\1_\2','/[^A-Z^a-z^0-9^\/]+/' => '-',];$urlized = $lowered;foreach ($replacements as $pattern => $replacement) {$replaced = preg_replace($pattern, $replacement, $urlized);if ($replaced === null) {throw new RuntimeException(sprintf('preg_replace returned null for value "%s"',$urlized));}$urlized = $replaced;}return trim($urlized, '-');}/*** Returns a word in singular form.** @param string $word The word in plural form.** @return string The word in singular form.*/public function singularize(string $word): string{return $this->singularizer->inflect($word);}/*** Returns a word in plural form.** @param string $word The word in singular form.** @return string The word in plural form.*/public function pluralize(string $word): string{return $this->pluralizer->inflect($word);}}