From e80e3dcc1f5f8452af91667836277c7e5322d292 Mon Sep 17 00:00:00 2001 From: Mikhail Bazhenov Date: Wed, 9 Oct 2013 15:09:34 +0800 Subject: [PATCH] Example fix --- example/index.php | 6 +- example/petrovich/Petrovich.php | 193 ++++++++++++++++++++++++++++++++ example/petrovich/rules.js | 1 + 3 files changed, 197 insertions(+), 3 deletions(-) create mode 100644 example/petrovich/Petrovich.php create mode 100644 example/petrovich/rules.js diff --git a/example/index.php b/example/index.php index 53e9905..800e5f0 100644 --- a/example/index.php +++ b/example/index.php @@ -90,9 +90,9 @@ $petrovich = new Petrovich(); -$petrovich->firstname('',Petrovich::CASE_GENITIVE); -$petrovich->lastname('',Petrovich::CASE_GENITIVE); -$petrovich->middlename('',Petrovich::CASE_GENITIVE); +$petrovich->firstname('',Petrovich::CASE_GENITIVE); +$petrovich->lastname('',Petrovich::CASE_GENITIVE); +$petrovich->middlename('',Petrovich::CASE_GENITIVE); diff --git a/example/petrovich/Petrovich.php b/example/petrovich/Petrovich.php new file mode 100644 index 0000000..d98d585 --- /dev/null +++ b/example/petrovich/Petrovich.php @@ -0,0 +1,193 @@ +rules = get_object_vars(json_decode($rules_array)); + } + + /** + * Задаём имя и слоняем его + * + * @param $firstname + * @param $case + * @return bool|string + * @throws \ErrorException + */ + public function firstname($firstname,$case) { + if(empty($firstname)) + throw new ErrorException('Firstname cannot be empty.'); + + $this->firstname = $firstname; + return $this->inflect($this->firstname,$case,__FUNCTION__); + } + + /** + * Задём отчество и склоняем его + * + * @param $middlename + * @param $case + * @return bool|string + * @throws \ErrorException + */ + public function middlename($middlename,$case) { + if(empty($middlename)) + throw new ErrorException('Middlename cannot be empty.'); + + $this->middlename = $middlename; + return $this->inflect($this->middlename,$case,__FUNCTION__); + } + + /** + * Задаём фамилию и слоняем её + * + * @param $lastname + * @param $case + * @return bool|string + * @throws \ErrorException + */ + public function lastname($lastname,$case) { + if(empty($lastname)) + throw new ErrorException('Lastname cannot be empty.'); + + $this->lastname = $lastname; + return $this->inflect($this->lastname,$case,__FUNCTION__); + } + + /** + * Функция проверяет заданное имя,фамилию или отчество на исключение + * и склоняет + * + * @param $name + * @param $case + * @param $type + * @return bool|string + */ + private function inflect($name,$case,$type) { + + if(($exception = $this->checkException($name,$case,$type)) !== false) + return $exception; + + //если двойное имя или фамилия или отчество + if(substr_count($name,'-') > 0) { + $names_arr = explode('-',$name); + $result = ''; + + foreach($names_arr as $arr_name) { + $result .= $this->findInRules($arr_name,$case,$type).'-'; + } + return substr($result,0,strlen($result)-1); + } else { + return $this->findInRules($name,$case,$type); + } + } + + /** + * Поиск в массиве правил + * + * @param $name + * @param $case + * @param $type + * @return string + */ + private function findInRules($name,$case,$type) { + foreach($this->rules[$type]->suffixes as $rule) { + foreach($rule->test as $last_char) { + $last_name_char = substr($name,strlen($name)-strlen($last_char),strlen($last_char)); + if($last_char == $last_name_char) { + if($rule->mods[$case] == '.') + continue; + + if($this->gender == 'androgynous' || $this->gender == null) + $this->gender = $rule->gender; + + return $this->applyRule($rule->mods,$name,$case); + } + } + } + } + + /** + * Проверка на совпадение в исключениях + * + * @param $name + * @param $case + * @param $type + * @return bool|string + */ + private function checkException($name,$case,$type) { + if(!isset($this->rules[$type]->exceptions)) + return false; + + $lower_name = strtolower($name); + + foreach($this->rules[$type]->exceptions as $rule) { + if(array_search($lower_name,$rule->test) !== false) { + return $this->applyRule($rule->mods,$name,$case); + } + } + return false; + } + + /** + * Склоняем заданное слово + * + * @param $mods + * @param $name + * @param $case + * @return string + */ + private function applyRule($mods,$name,$case) { + $result = substr($name,0,strlen($name)-substr_count($mods[$case],'-')); + $result .= str_replace('-','',$mods[$case]); + return $result; + } + + /** + * Возвращает пол который возможно был определён при поиске в правилах + * @return string + */ + public function getGender() { + switch($this->gender) { + case 'male': + return 'мужской'; + case 'female': + return 'женский'; + case 'androgynous': + return 'не определён'; + } + } +} \ No newline at end of file diff --git a/example/petrovich/rules.js b/example/petrovich/rules.js new file mode 100644 index 0000000..d3f6762 --- /dev/null +++ b/example/petrovich/rules.js @@ -0,0 +1 @@ +{"lastname":{"exceptions":[{"gender":"androgynous","test":["\u0431\u043e\u043d\u0447","\u0430\u0431\u0434\u0443\u043b","\u0431\u0435\u043b\u0438\u0446","\u0433\u0430\u0441\u0430\u043d","\u0434\u044e\u0441\u0441\u0430\u0440","\u0434\u044e\u043c\u043e\u043d","\u043a\u043d\u0438\u043f\u043f\u0435\u0440","\u043a\u043e\u0440\u0432\u0438\u043d","\u0432\u0430\u043d","\u0448\u043e\u043b\u043e\u043c","\u0442\u0435\u0440","\u043f\u0440\u0438\u0437\u0432\u0430\u043d","\u043c\u0435\u043b\u0438\u043a","\u0432\u0430\u0440"],"mods":[".",".",".",".","."],"tags":["first_word"]},{"gender":"androgynous","test":["\u0434\u044e\u043c\u0430","\u0442\u043e\u043c\u0430","\u0434\u0435\u0433\u0430","\u043b\u044e\u043a\u0430","\u0444\u0435\u0440\u043c\u0430","\u0433\u0430\u043c\u0430\u0440\u0440\u0430","\u043f\u0435\u0442\u0438\u043f\u0430","\u0448\u0430\u043d\u0434\u0440\u0430","\u0441\u043a\u0430\u043b\u044f"],"mods":[".",".",".",".","."]},{"gender":"androgynous","test":["\u0433\u0443\u0441\u044c","\u0440\u0435\u043c\u0435\u043d\u044c","\u043a\u0430\u043c\u0435\u043d\u044c","\u043e\u043d\u0443\u043a","\u0431\u043e\u0433\u043e\u0434\u0430","\u043d\u0435\u0447\u0438\u043f\u0430\u0441","\u0434\u043e\u043b\u0433\u043e\u043f\u0430\u043b\u0435\u0446","\u043c\u0430\u043d\u0435\u043d\u043e\u043a","\u0440\u0435\u0432\u0430","\u043a\u0438\u0432\u0430"],"mods":[".",".",".",".","."]},{"gender":"androgynous","test":["\u0432\u0438\u0439","\u0441\u043e\u0439","\u0446\u043e\u0439","\u0445\u043e\u0439"],"mods":["-\u044f","-\u044e","-\u044f","-\u0435\u043c","-\u0435"]}],"suffixes":[{"gender":"female","test":["\u0431","\u0432","\u0433","\u0434","\u0436","\u0437","\u0439","\u043a","\u043b","\u043c","\u043d","\u043f","\u0440","\u0441","\u0442","\u0444","\u0445","\u0446","\u0447","\u0448","\u0449","\u044a","\u044c"],"mods":[".",".",".",".","."]},{"gender":"androgynous","test":["\u0433\u0430\u0432\u0430","\u043e\u0440\u043e\u0442\u0430"],"mods":[".",".",".",".","."]},{"gender":"female","test":["\u0441\u043a\u0430","\u0446\u043a\u0430"],"mods":["-\u043e\u0439","-\u043e\u0439","-\u0443\u044e","-\u043e\u0439","-\u043e\u0439"]},{"gender":"female","test":["\u0430\u044f"],"mods":["--\u043e\u0439","--\u043e\u0439","--\u0443\u044e","--\u043e\u0439","--\u043e\u0439"]},{"gender":"androgynous","test":["\u0441\u043a\u0430\u044f"],"mods":["--\u043e\u0439","--\u043e\u0439","--\u0443\u044e","--\u043e\u0439","--\u043e\u0439"]},{"gender":"female","test":["\u043d\u0430"],"mods":["-\u043e\u0439","-\u043e\u0439","-\u0443","-\u043e\u0439","-\u043e\u0439"]},{"gender":"androgynous","test":["\u0438\u043d\u043e\u0439"],"mods":["-\u044f","-\u044e","-\u044f","-\u0435\u043c","-\u0435"]},{"gender":"androgynous","test":["\u0443\u0439"],"mods":["-\u044f","-\u044e","-\u044f","-\u0435\u043c","-\u0435"]},{"gender":"androgynous","test":["\u0446\u0430"],"mods":["-\u044b","-\u0435","-\u0443","-\u0435\u0439","-\u0435"]},{"gender":"androgynous","test":["\u0440\u0438\u0445"],"mods":["\u0430","\u0443","\u0430","\u043e\u043c","\u0435"]},{"gender":"androgynous","test":["\u0438\u044f"],"mods":[".",".",".",".","."]},{"gender":"androgynous","test":["\u0438\u0430","\u0430\u0430","\u043e\u0430","\u0443\u0430","\u044b\u0430","\u0435\u0430","\u044e\u0430","\u044d\u0430"],"mods":[".",".",".",".","."]},{"gender":"androgynous","test":["\u0438\u0445","\u044b\u0445"],"mods":[".",".",".",".","."]},{"gender":"androgynous","test":["\u043e","\u0435","\u044d","\u0438","\u044b","\u0443","\u044e"],"mods":[".",".",".",".","."]},{"gender":"androgynous","test":["\u043e\u0432\u0430","\u0435\u0432\u0430"],"mods":["-\u043e\u0439","-\u043e\u0439","-\u0443","-\u043e\u0439","-\u043e\u0439"]},{"gender":"androgynous","test":["\u0433\u0430","\u043a\u0430","\u0445\u0430","\u0447\u0430","\u0449\u0430","\u0436\u0430"],"mods":["-\u0438","-\u0435","-\u0443","-\u043e\u0439","-\u0435"]},{"gender":"androgynous","test":["\u0446\u0430"],"mods":["-\u0438","-\u0435","-\u0443","-\u0435\u0439","-\u0435"]},{"gender":"androgynous","test":["\u0430"],"mods":["-\u044b","-\u0435","-\u0443","-\u043e\u0439","-\u0435"]},{"gender":"androgynous","test":["\u044c"],"mods":["-\u044f","-\u044e","-\u044f","-\u0435\u043c","-\u0435"]},{"gender":"androgynous","test":["\u0438\u044f"],"mods":["-\u0438","-\u0438","-\u044e","-\u0435\u0439","-\u0438"]},{"gender":"androgynous","test":["\u044f"],"mods":["-\u0438","-\u0435","-\u044e","-\u0435\u0439","-\u0435"]},{"gender":"androgynous","test":["\u0435\u0439"],"mods":["-\u044f","-\u044e","-\u044f","-\u0435\u043c","-\u0435"]},{"gender":"androgynous","test":["\u044f\u043d","\u0430\u043d","\u0439\u043d"],"mods":["\u0430","\u0443","\u0430","\u043e\u043c","\u0435"]},{"gender":"androgynous","test":["\u044b\u043d\u0435\u0446","\u043e\u0431\u0435\u0446"],"mods":["--\u0446\u0430","--\u0446\u0443","--\u0446\u0430","--\u0446\u0435\u043c","--\u0446\u0435"]},{"gender":"androgynous","test":["\u043e\u043d\u0435\u0446","\u043e\u0432\u0435\u0446"],"mods":["--\u0446\u0430","--\u0446\u0443","--\u0446\u0430","--\u0446\u043e\u043c","--\u0446\u0435"]},{"gender":"androgynous","test":["\u0430\u0439"],"mods":["-\u044f","-\u044e","-\u044f","-\u0435\u043c","-\u0435"]},{"gender":"androgynous","test":["\u0433\u043e\u0439","\u043a\u043e\u0439"],"mods":["-\u0433\u043e","-\u043c\u0443","-\u0433\u043e","--\u0438\u043c","-\u043c"]},{"gender":"androgynous","test":["\u043e\u0439"],"mods":["-\u0433\u043e","-\u043c\u0443","-\u0433\u043e","--\u044b\u043c","-\u043c"]},{"gender":"androgynous","test":["\u0430\u0445","\u0438\u0432"],"mods":["\u0430","\u0443","\u0430","\u043e\u043c","\u0435"]},{"gender":"androgynous","test":["\u0448\u0438\u0439","\u0449\u0438\u0439","\u0436\u0438\u0439","\u043d\u0438\u0439"],"mods":["--\u0435\u0433\u043e","--\u0435\u043c\u0443","--\u0435\u0433\u043e","-\u043c","--\u0435\u043c"]},{"gender":"androgynous","test":["\u043a\u0438\u0439","\u044b\u0439"],"mods":["--\u043e\u0433\u043e","--\u043e\u043c\u0443","--\u043e\u0433\u043e","-\u043c","--\u043e\u043c"]},{"gender":"androgynous","test":["\u0438\u0439"],"mods":["-\u044f","-\u044e","-\u044f","-\u0435\u043c","-\u0438"]},{"gender":"androgynous","test":["\u043e\u043a"],"mods":["--\u043a\u0430","--\u043a\u0443","--\u043a\u0430","--\u043a\u043e\u043c","--\u043a\u0435"]},{"gender":"androgynous","test":["\u0435\u0446"],"mods":["--\u0446\u0430","--\u0446\u0443","--\u0446\u0430","--\u0446\u043e\u043c","--\u0446\u0435"]},{"gender":"androgynous","test":["\u0446","\u0447","\u0448","\u0449"],"mods":["\u0430","\u0443","\u0430","\u0435\u043c","\u0435"]},{"gender":"androgynous","test":["\u0432","\u043d"],"mods":["\u0430","\u0443","\u0430","\u044b\u043c","\u0435"]},{"gender":"androgynous","test":["\u0431","\u0433","\u0434","\u0436","\u0437","\u043a","\u043b","\u043c","\u043f","\u0440","\u0441","\u0442","\u0444","\u0445"],"mods":["\u0430","\u0443","\u0430","\u043e\u043c","\u0435"]}]},"firstname":{"exceptions":[{"gender":"androgynous","test":["\u043b\u0435\u0432"],"mods":["--\u044c\u0432\u0430","--\u044c\u0432\u0443","--\u044c\u0432\u0430","--\u044c\u0432\u043e\u043c","--\u044c\u0432\u0435"]},{"gender":"androgynous","test":["\u043f\u0451\u0442\u0440"],"mods":["---\u0435\u0442\u0440\u0430","---\u0435\u0442\u0440\u0443","---\u0435\u0442\u0440\u0430","---\u0435\u0442\u0440\u043e\u043c","---\u0435\u0442\u0440\u0435"]},{"gender":"androgynous","test":["\u043f\u0430\u0432\u0435\u043b"],"mods":["--\u043b\u0430","--\u043b\u0443","--\u043b\u0430","--\u043b\u043e\u043c","--\u043b\u0435"]},{"gender":"male","test":["\u0448\u043e\u0442\u0430"],"mods":[".",".",".",".","."]},{"gender":"female","test":["\u0440\u0430\u0448\u0435\u043b\u044c","\u043d\u0438\u043d\u0435\u043b\u044c","\u043d\u0438\u043a\u043e\u043b\u044c","\u0433\u0430\u0431\u0440\u0438\u044d\u043b\u044c","\u0434\u0430\u043d\u0438\u044d\u043b\u044c"],"mods":[".",".",".",".","."]}],"suffixes":[{"gender":"androgynous","test":["\u0435","\u0451","\u0438","\u043e","\u0443","\u044b","\u044d","\u044e"],"mods":[".",".",".",".","."]},{"gender":"female","test":["\u0431","\u0432","\u0433","\u0434","\u0436","\u0437","\u0439","\u043a","\u043b","\u043c","\u043d","\u043f","\u0440","\u0441","\u0442","\u0444","\u0445","\u0446","\u0447","\u0448","\u0449","\u044a"],"mods":[".",".",".",".","."]},{"gender":"female","test":["\u044c"],"mods":["-\u0438","-\u0438",".","\u044e","-\u0438"]},{"gender":"male","test":["\u044c"],"mods":["-\u044f","-\u044e","-\u044f","-\u0435\u043c","-\u0435"]},{"gender":"androgynous","test":["\u0433\u0430","\u043a\u0430","\u0445\u0430","\u0447\u0430","\u0449\u0430","\u0436\u0430"],"mods":["-\u0438","-\u0435","-\u0443","-\u043e\u0439","-\u0435"]},{"gender":"female","test":["\u0448\u0430"],"mods":["-\u0438","-\u0435","-\u0443","-\u0435\u0439","-\u0435"]},{"gender":"androgynous","test":["\u0430"],"mods":["-\u044b","-\u0435","-\u0443","-\u043e\u0439","-\u0435"]},{"gender":"androgynous","test":["\u0438\u044f"],"mods":["-\u0438","-\u0438","-\u044e","-\u0435\u0439","-\u0438"]},{"gender":"androgynous","test":["\u044f"],"mods":["-\u0438","-\u0435","-\u044e","-\u0435\u0439","-\u0435"]},{"gender":"androgynous","test":["\u0435\u0439"],"mods":["-\u044f","-\u044e","-\u044f","-\u0435\u043c","-\u0435"]},{"gender":"androgynous","test":["\u0438\u0439"],"mods":["-\u044f","-\u044e","-\u044f","-\u0435\u043c","-\u0438"]},{"gender":"androgynous","test":["\u0439"],"mods":["-\u044f","-\u044e","-\u044f","-\u0435\u043c","-\u0435"]},{"gender":"androgynous","test":["\u0431","\u0432","\u0433","\u0434","\u0436","\u0437","\u043a","\u043b","\u043c","\u043d","\u043f","\u0440","\u0441","\u0442","\u0444","\u0445","\u0446","\u0447"],"mods":["\u0430","\u0443","\u0430","\u043e\u043c","\u0435"]}]},"middlename":{"suffixes":[{"gender":"androgynous","test":["\u0438\u0447"],"mods":["\u0430","\u0443","\u0430","\u0435\u043c","\u0435"]},{"gender":"androgynous","test":["\u043d\u0430"],"mods":["-\u044b","-\u0435","-\u0443","-\u043e\u0439","-\u0435"]}]}} \ No newline at end of file