Esempio n. 1
0
        //_____________________________________________________________________________
        // z1 - фамилия имя отчество например Железняков Юрий Юрьевич
        // z2 - Падеж ( по  умолчанию = 2 - родительный)
        // 2 - родительный  ( нет кого?    ) Железнякова Юрия Юрьевича
        // 3 - дательный    ( кому?        ) Железнякову Юрию Юрьевичу
        // 4 - винительный  ( вижу кого?   ) Железнякова Юрия Юрьевича
        // 5 - творительный ( кем?         ) Железняковым Юрием Юрьевичем
        // 6 - предложный   ( о ком?       ) Железнякове Юрии Юрьевиче
        // Если задать Z2 меньше 0, то на выходе получим от -1=Железняков Ю. Ю. до -6=Железнякове Ю. Ю.
        // z3 - параметр Пол может не указываться, но при наличии фамилий с
        // инициалами точное определение пола невозможно, поэтому предлагается задавать пол этим
        // параметром  1 - мужской 2 - женский
        // ---------------------------------------------------------------------------------------
        // Бибик Галушка Цой Николайчик Наталия Петровна Герценберг Кривошей Капица-Метелица
        // Если Падеж(Фио ,1 ,3),       то на выходе получим Фамилия Имя Отчество и т.д.
        // Если Падеж(Фио ,1 ,3,"1"),  то                   Фамилия
        // Если Падеж(Фио ,1 ,3,"2"),  то                   Имя
        // Если Падеж(Фио ,1 ,3,"3"),  то                   Отчество
        // Если Падеж(Фио, 1 ,3,"12"), то                   Фамилия Имя
        // Если Падеж(Фио, 1 ,3,"23"), то                   Имя Отчество
        // Если Падеж(Фио,-1 ,3,"231"),то                   И. О. Фамилия
        // Если Падеж(Фио,-1 ,3,"23"), то                   И. О.

        /// <summary>
        ///
        /// Author: Железняков Юрий Юрьевич (aka SuperJur) (mailto:[email protected])
        /// </summary>
        /// <param name="fn">фамилия имя отчество, например Железняков Юрий Юрьевич</param>
        /// <param name="declCase">падеж</param>
        /// <param name="gender">параметр 'пол' может не указываться, но при наличии фамилий с
        /// инициалами точное определение пола невозможно, поэтому предлагается задавать пол этим
        /// параметром</param>
        /// <param name="part"></param>
        /// <param name="z5"></param>
        /// <returns></returns>
        public static string GetDeclension(string fn, DeclensionCase declCase, DeclensionGender gender = DeclensionGender.Neutral,
                                           string partsMask = "123", int part = 1)
        {
            try
            {
                string z6 = LCase(Right(RTrim(fn), 4));
                string z7 = Right(z6, 1);

                string sp = part.ToString();
                if (part < 4 && partsMask.Contains(sp))
                {
                    string _FIO   = Replace(Mid(fn, InStr(fn + " ", " ") + 1), ".", ". ").Trim();
                    string _base  = ((part == 3) && (z7 == "ы") ? fn : Left(fn, InStr(fn + " ", " ") - 1));
                    string _token = _declension(_base, (int)declCase, Mid("ча" + z7, (gender == DeclensionGender.Neutral ? (z6 == "оглы" || z6 == "кызы" ? 1 : 3) : (int)gender), 1), part) + " ";
                    partsMask = Replace(partsMask, sp, _token);

                    return(GetDeclension(_FIO, declCase, gender, partsMask, part + 1).Trim());
                }
                else
                {
                    return(partsMask);
                }
            }
            catch
            {
                return("(ошибка)");
            }
        }
Esempio n. 2
0
        public static string MorphAdjective(String adjective, DeclensionCase c, Number q, DeclensionGender g)
        {
            if (((adjective != null) ? adjective.Length : 0) < 4)
            {
                throw new Exception(SWordTooShort);
            }

            char e2 = adjective[adjective.Length - 1];
            char e  = adjective[adjective.Length - 2];

            string _base;
            bool   soft;

            if (e == 'ы' && e2 == 'й')
            {
                _base = adjective.Substring(0, adjective.Length - 2);
                soft  = false;
            }
            else
            {
                if (e == 'и' && e2 == 'й')
                {
                    _base = adjective.Substring(0, adjective.Length - 2);
                    soft  = true;
                }
                else
                {
                    if (e == 'о' && e2 == 'й')
                    {
                        _base = adjective.Substring(0, adjective.Length - 2);
                        soft  = true;
                    }
                    else
                    {
                        if (e == 'а' && e2 == 'я')
                        {
                            _base = adjective.Substring(0, adjective.Length - 2);
                            soft  = false;
                        }
                        else
                        {
                            if (e == 'я' && e2 == 'я')
                            {
                                _base = adjective.Substring(0, adjective.Length - 2);
                                soft  = true;
                            }
                            else
                            {
                                if (e == 'о' && e2 == 'е')
                                {
                                    _base = adjective.Substring(0, adjective.Length - 2);
                                    soft  = false;
                                }
                                else
                                {
                                    if (e == 'е' && e2 == 'е')
                                    {
                                        _base = adjective.Substring(0, adjective.Length - 2);
                                        soft  = true;
                                    }
                                    else
                                    {
                                        if (!isConsonant(e))
                                        {
                                            return(adjective);
                                        }
                                        _base = adjective;
                                        soft  = false;
                                    }
                                }
                            }
                        }
                    }
                }
            }

            if (((_base != null) ? _base.Length : 0) < 2)
            {
                throw new Exception(SBaseTooShort);
            }

            string ending = AdjectiveEndings[(int)g - 1, (int)(soft ? 1 : 0), (int)q - 1, (int)c - 1];

            return(_base + ending);
        }
Esempio n. 3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="FIO">фамилия имя отчество например Железняков Юрий Юрьевич</param>
        /// <param name="declansionCase">Падеж</param>
        /// <param name="gender">параметр Пол может не указываться, но при наличии фамилий с
        /// инициалами точное определение пола невозможно, поэтому предлагается задавать пол этим
        /// параметром  1 - мужской 2 - женский  </param>
        /// <param name="part"></param>
        /// <param name="z5"></param>
        /// <returns></returns>
        public static string GetDeclension(string FIO, DeclensionCase declensionCase /*=2*/, DeclensionGender gender /*=3*/, /*Знач*/ string part /*="123"*/, int z5 /*=1*/)
        {
            string z6 = LCase(Right(RTrim(FIO), 4));
            string z7 = Right(z6, 1);

            if (z5 < 4)
            {
                string _FIO   = Trim(Replace(Mid(FIO, InStr(FIO + " ", " ") + 1), ".", ". "));
                string _token = _declension(((z5 == 3) && (z7 == "ы") ? FIO : Left(FIO, InStr(FIO + " ", " ") - 1)),
                                            (int)declensionCase, Mid("ча" + z7, (gender == DeclensionGender.NotDefind ? (z6 == "оглы" || z6 == "кызы" ? 1 : 3) : (int)gender), 1), z5) + " ";
                string _part = Replace(part, z5.ToString(), _token);
                return(GetDeclension(_FIO, declensionCase, gender, _part, z5 + 1));
            }
            else
            {
                return(part);
            }
        }
Esempio n. 4
0
        public static string MorphNoun(string noun, DeclensionCase ncase, Number num, DeclensionGender gender, bool animate, bool endingstressed)
        {
            if (((noun != null) ? noun.Length : 0) < 2)
            {
                throw new Exception(SWordTooShort);
            }

            char       e = noun[noun.Length - 1];
            string     _base;
            bool       jot;
            Declension decl;
            bool       soft;
            string     result;

            switch (e)
            {
            case 'а':
                _base = noun.Substring(0, noun.Length - 1);
                jot   = false;
                decl  = Declension.d1;
                soft  = false;
                break;

            case 'я':
                _base = noun.Substring(0, noun.Length - 1);
                jot   = (isVowel(endof(_base)) || endof(_base) == 'ь');
                decl  = Declension.d1;
                soft  = true;
                break;

            case 'о':
                _base = noun.Substring(0, noun.Length - 1);
                jot   = false;
                decl  = Declension.d3;
                soft  = false;
                break;

            case 'е':
            case 'ё':
                _base = noun.Substring(0, noun.Length - 1);
                jot   = (isVowel(endof(_base)) || endof(_base) == 'ь');
                decl  = Declension.d3;
                soft  = true;
                break;

            case 'й':
                _base = noun.Substring(0, noun.Length - 1);
                jot   = true;
                decl  = Declension.d2;
                soft  = true;
                break;

            case 'ь':
                _base = noun.Substring(0, noun.Length - 1);
                jot   = false;
                decl  = Declension.d4;
                soft  = false;
                break;

            default:
                if (isConsonant(e))
                {
                    _base = noun;
                    jot   = false;
                    decl  = Declension.d2;
                    soft  = false;
                }
                else
                {
                    result = noun;
                    return(result);
                }
                break;
            }

            if (((_base != null) ? _base.Length : 0) < 2)
            {
                throw new Exception(SBaseTooShort);
            }

            if (animate && ncase == DeclensionCase.Accusative && ((decl == Declension.d1 && num == Number.nPlural) || decl == Declension.d2))
            {
                ncase = DeclensionCase.Genitive;
            }

            string ending = NounEndings[(int)decl - 1, (soft ? 1 : 0), (int)num - 1, (int)ncase - 1];

            if (gender == DeclensionGender.Neutral && num == Number.nPlural && ncase == DeclensionCase.Genitive)
            {
                ending = "";
            }

            if (num == Number.nSingle && ncase == DeclensionCase.Prepositional && jot && endof(_base) == 'и')
            {
                ending = "и";
            }

            if (ends_in_one_of(_base, mixedconsonants) && ending.CompareTo("ы") == 0)
            {
                ending = "и";
            }

            if (decl == Declension.d1)
            {
                if (((ending != null) ? ending.Length : 0) == 0 & jot)
                {
                    _base += "й";
                }
                if (num == Number.nSingle)
                {
                    if (ncase == DeclensionCase.Instrumental)
                    {
                        if (ends_in_one_of(_base, "жшщчц"))
                        {
                            if (endingstressed)
                            {
                                ending = "ой";
                            }
                            else
                            {
                                ending = "ей";
                            }
                        }
                        else
                        {
                            if (soft & endingstressed)
                            {
                                ending = "ёй";
                            }
                        }
                    }
                    if ((ncase == DeclensionCase.Dative & jot) && endof(_base) == 'и')
                    {
                        ending = "и";
                    }
                }
                else
                {
                    if (ncase == DeclensionCase.Genitive)
                    {
                        if (_base[((_base != null) ? _base.Length : 0) - 1] == 'ь')
                        {
                            _base = _base.Substring(0, _base.Length - 1) + _base.Substring(_base.Length);
                        }
                        char c2     = _base[((_base != null) ? _base.Length : 0) - 1 - 1];
                        char c3     = _base[((_base != null) ? _base.Length : 0) - 1];
                        bool harden = false;
                        if ((isConsonant(c2) || c2 == 'ь') && isConsonant(c3))
                        {
                            char vowel = '\0';
                            if (_base.CompareTo("кочерг") == 0)
                            {
                                vowel = 'ё';
                            }
                            else
                            {
                                if (soft)
                                {
                                    if (jot & endingstressed)
                                    {
                                        vowel = 'е';
                                    }
                                    else
                                    {
                                        vowel = 'и';
                                    }
                                    if (c3 == 'н')
                                    {
                                        harden = (_base.CompareTo("барышн") != 0 && _base.CompareTo("боярышн") != 0 && _base.CompareTo("деревн") != 0);
                                    }
                                }
                                else
                                {
                                    if (c2 == 'ь')
                                    {
                                        vowel = 'е';
                                    }
                                    else
                                    {
                                        if (c3 == 'к')
                                        {
                                            if (c2 == 'й')
                                            {
                                                vowel = 'е';
                                            }
                                            else
                                            {
                                                vowel = 'о';
                                            }
                                        }
                                    }
                                }
                            }

                            if (vowel != '\0')
                            {
                                if (c2 == 'ь' || c2 == 'й')
                                {
                                    StringBuilder sb = new StringBuilder(_base);
                                    sb[_base.Length - 2] = vowel;
                                    _base = sb.ToString();
                                }
                                else
                                {
                                    StringBuilder sb = new StringBuilder(_base);
                                    sb.Insert(_base.Length - 1, vowel);
                                    _base = sb.ToString();
                                }
                            }
                        }
                        if (soft && !jot && !harden)
                        {
                            _base += "ь";
                        }
                    }
                }
            }
            else
            {
                if (decl == Declension.d2)
                {
                    if (ncase == DeclensionCase.Accusative)
                    {
                        ncase = DeclensionCase.Nominative;
                    }
                    if (num == Number.nSingle && ncase == DeclensionCase.Nominative)
                    {
                        if (e == 'е')
                        {
                            ending = "е";
                        }
                        if (e == 'о')
                        {
                            ending = "о";
                        }
                    }
                    if (((ending != null) ? ending.Length : 0) == 0 & jot)
                    {
                        _base += "й";
                    }
                    if (gender == DeclensionGender.Neutral && num == Number.nPlural && ncase == DeclensionCase.Nominative)
                    {
                        if (soft)
                        {
                            ending = "я";
                        }
                        else
                        {
                            ending = "а";
                        }
                    }
                }
            }
            result = _base + ending;
            return(result);
        }
Esempio n. 5
0
 public string GetPersonNameDeclension(string FIO, DeclensionCase declensionCase, DeclensionGender gender, string part, int z5)
 {
     throw new NotImplementedException();
 }