예제 #1
0
        /// <summary>
        /// Данная функция является основной в библиотеке и наиболее универсальной.
        /// В качестве параметров ей необходимо передать ФИО в виде трех строк (каждая из которых может
        /// быть пустой), явно указанный род, требуемое значение падежа.
        /// При таких условиях этой функцией можно склонять ФИО и его составляющие в любых комбинациях.
        /// Корректно обрабатываются фамилии с инициалами (Сидоров И.П.) – склоняться будет только фамилия
        /// (у Сидорова И.П.). Допускается использование инициалов, состоящих более чем из одного символа
        /// (Иванов Вс.Никод.). Кроме ФИО славянского типа эта функция может выполнять склонение корейских,
        /// китайских и им подобным имен. При этом первое слово в таком имени соответствует фамилии,
        /// второе – имени и третье – отчеству в наших терминах. Другими словами, при склонении Иванов Иван
        /// Иванович и Ли Си Цын не требуется перестановка составляющих ФИО. Поскольку имена подобного вида
        /// иногда записывают двумя словами (Ли Сицын), то при вызове функции склонения для такой формы записи
        /// необходимо первым параметром передать пустую строку. В подавляющем большинстве случаев эта функция
        /// пригодна и для склонения ФИО, записанного в формате "Фамилия Имя [Имя]" (Кеннеди Джон [Фиджеральд]).
        /// Допускается использование признаков рода в фамилии (-оглы/-кызы), записанных через дефис.
        /// </summary>
        /// <param name="surname">Фамилия</param>
        /// <param name="name">Имя</param>
        /// <param name="patronimic">Отчество</param>
        /// <param name="gender">Пол</param>
        /// <param name="declensionCase">Падеж</param>
        /// <returns>Результат склонения</returns>
        public static string GetSNPDeclension(string surname, string name, string patronimic, Gender gender,
                                              DeclensionCase declensionCase)
        {
            if (surname == null)
            {
                throw new ArgumentNullException("surname");
            }
            if (name == null)
            {
                throw new ArgumentNullException("name");
            }
            if (patronimic == null)
            {
                throw new ArgumentNullException("patronimic");
            }

            CheckGender(gender);
            CheckDeclensionCase(declensionCase);

            IntPtr[] ptrs = null;
            try
            {
                ptrs = StringsToIntPtrArray(surname, name, patronimic);

                int resultLen = MaxResultBufSize;
                int err       = decGetFIOPadeg(ptrs[0], ptrs[1], ptrs[2], (Int32)gender, (Int32)declensionCase,
                                               ptrs[3], ref resultLen);
                ThrowException(err);
                return(IntPtrToString(ptrs, resultLen));
            }
            finally
            {
                FreeIntPtr(ptrs);
            }
        }
예제 #2
0
        /// <summary>
        /// Функция выполняет преобразование ФИО, заданного одной строкой и не требует явного указания рода.
        /// Порядок следования составляющих ФИО в строке параметра – фамилия, имя, отчество. Эта функция,
        /// как и GetSNPDeclension, тоже допускает использование инициалов и может выполнять преобразование имен
        /// типа китайских. Для корректной работы функции необходимо наличие трех компонент ФИО
        /// (имена китайского типа допускается задавать двумя словами). В ряде случаев правильно обрабатываются
        /// ФИО, записанные в формате "Фамилия Имя [Имя]".
        /// </summary>
        /// <param name="surnameNamePatronimic">ФИО0</param>
        /// <param name="declensionCase">Падеж</param>
        /// <returns>Результат склонения</returns>
        public static string GetSNPDeclensionFSAS(string surnameNamePatronimic,
                                                  DeclensionCase declensionCase)

        /*public static string GetSNPDeclension(string surnameNamePatronimic,
         *                                    DeclensionCase declensionCase)*/
        {
            if (surnameNamePatronimic == null)
            {
                throw new ArgumentNullException("surnameNamePatronimic");
            }

            CheckDeclensionCase(declensionCase);

            IntPtr[] ptrs = null;
            try
            {
                ptrs = StringsToIntPtrArray(surnameNamePatronimic);

                int resultLen = MaxResultBufSize;
                int err       = decGetFIOPadegFSAS(ptrs[0], (Int32)declensionCase,
                                                   ptrs[1], ref resultLen);
                ThrowException(err);
                return(IntPtrToString(ptrs, resultLen));
            }
            finally
            {
                FreeIntPtr(ptrs);
            }
        }
예제 #3
0
        /// <summary>
        /// Функция предназначена для склонения пар "Имя Фамилия" (Марк Твен) и требует явного указания рода.
        /// Эта функция также пригодна для склонения имен собственных типа Джон Фиджеральд Кеннеди.
        /// В этом случае Джон Фиджеральд следует передавать одним параметром, как имя. Разделитель слов в
        /// параметре – пробел.
        /// </summary>
        /// <param name="nameSurname">ИФ</param>
        /// <param name="gender">Пол</param>
        /// <param name="declensionCase">Падеж</param>
        /// <returns>Результат склонения</returns>
        public static string GetNSDeclension(string nameSurname, Gender gender, DeclensionCase declensionCase)
        {
            if (nameSurname == null)
            {
                throw new ArgumentNullException("nameSurname");
            }

            CheckGender(gender);
            CheckDeclensionCase(declensionCase);

            IntPtr[] ptrs = null;
            try
            {
                ptrs = StringsToIntPtrArray(nameSurname);

                int resultLen = MaxResultBufSize;
                int err       = decGetIFPadegFS(ptrs[0], (Int32)gender, (Int32)declensionCase,
                                                ptrs[1], ref resultLen);
                ThrowException(err);
                return(IntPtrToString(ptrs, resultLen));
            }
            finally
            {
                FreeIntPtr(ptrs);
            }
        }
예제 #4
0
        /// <summary>
        /// Функция позволяет получить полное наименование должности и выполнить его преобразование в заданный
        /// падеж. При объединении удаляются повторяющиеся слова при их наличии. Например: должность –
        /// Начальник цеха; подразделение – Цех нестандартного оборудования; результат – Начальник цеха
        /// нестандартного оборудования.
        /// </summary>
        /// <param name="appointment">Название должности</param>
        /// <param name="office">Название подразделения</param>
        /// <param name="declensionCase">Падеж</param>
        /// <returns>Результат склонения</returns>
        public static string GetAppointmentOfficeDeclension(string appointment, string office,
                                                            DeclensionCase declensionCase)
        {
            if (appointment == null)
            {
                throw new ArgumentNullException("appointment");
            }
            if (office == null)
            {
                throw new ArgumentNullException("office");
            }

            CheckDeclensionCase(declensionCase);

            IntPtr[] ptrs = null;
            try
            {
                ptrs = StringsToIntPtrArray(appointment, office);

                int resultLen = MaxResultBufSize;
                int err       = decGetFullAppointmentPadeg(ptrs[0], ptrs[1], (Int32)declensionCase, ptrs[2], ref resultLen);
                ThrowException(err);
                return(IntPtrToString(ptrs, resultLen));
            }
            finally
            {
                FreeIntPtr(ptrs);
            }
        }
예제 #5
0
 private void DeclensionFileTest()
 {
     using (FileLog l = new FileLog("declensionFileTest", new FileLogSettings()
     {
         DateFolderMask = "yyyy-MM-dd"
     }))
     {
         string[] decl = { "И", "Р", "Д", "В", "Т", "П" };
         string[] test = CommonTest.testData1.declensionTestData.Split("\r\n".ToCharArray());
         foreach (string s in test)
         {
             string[] a = s.Split('\t');
             if (a.Length > 3)
             {
                 DeclensionCase _dc = (DeclensionCase)(decl.IndexOf(a[1]) + 1);
                 if (_dc != DeclensionCase.NotDefind)
                 {
                     string result = Declension.GetDeclension(a[0], _dc).TrimEnd();
                     if (!result.Equals(a[2].Trim(), StringComparison.OrdinalIgnoreCase))
                     {
                         l.Debug("\n" + a[0] + "\t" + a[1] + "\t" + a[2] + "\t" + result);
                     }
                 }
             }
         }
     }
 }
예제 #6
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("(ошибка)");
            }
        }
예제 #7
0
 private static void CheckDeclensionCase(DeclensionCase declensionCase)
 {
     if (!Enum.IsDefined(typeof(DeclensionCase), declensionCase) ||
         declensionCase == DeclensionCase.NotDefind)
     {
         throw new ArgumentException("Недопустимое значение падежа: " + declensionCase, "declensionCase");
     }
 }
예제 #8
0
 public string GetPersonNameDeclension(string FIO, DeclensionCase declensionCase)
 {
     lock (_locker)
     {
         string name       = null;
         string surname    = null;
         string patronymic = null;
         BLL.Declension.DeclensionBLL.GetSNM(FIO, out surname, out name, out patronymic);
         string totalName = BLL.Declension.DeclensionBLL.GetSNPDeclension(surname, name, patronymic, (BLL.Declension.DeclensionCase)(int) declensionCase);
         return(totalName);
     }
 }
예제 #9
0
        string GetPattern(string alias, FilterType filterType, DeclensionCase declensionCase)
        {
            string pattern = alias;

            if (filterType != FilterType.None)
            {
                pattern += $"|{filterType.GetDecription()}";
            }

            if (declensionCase != DeclensionCase.NotDefind)
            {
                pattern += $"|{declensionCase.GetDecription()}";
            }

            return(pattern);
        }
예제 #10
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);
            }
        }
예제 #11
0
        /// <summary>
        /// Функция для склонения одного слова.
        /// Author: Железняков Юрий Юрьевич (aka SuperJur) (mailto:[email protected])
        /// </summary>
        /// <param name="word">само слово</param>
        /// <param name="declCase">номер падежа </param>
        /// <param name="gender">пол</param>
        /// <param name="part">1-склонять как фамилию, 2-имя, 3-отчество</param>
        /// <returns></returns>
        private static string _declension(string word, int declCase /*=2*/, string gender /* = "*" */, int part /* =0 */)
        {
            if (word.Length == 2 && part == 1)
            {
                return(word);
            }

            int    z5 = InStr(word, "-");
            string z6 = string.Empty;

            if (z5 > 0)
            {
                string[] _name = word.Split('-');
                if (part == 1)
                {
                    z6   = "-" + _declension(_name[1], declCase, gender, part);
                    word = LCase(_name[0]);
                }
                else
                {
                    word = LCase(_name[0]) + "-" + UCase(Left(_name[1], 1)) + Mid(_name[1], 2);
                }
            }
            else
            {
                word = LCase(word);
            }

            string         res;
            DeclensionCase _dc = (DeclensionCase)Math.Max(declCase, -declCase);

            string z7 = Right(word, 3);
            string z8 = Right(z7, 2);
            string z9 = Right(z8, 1);

            z5 = word.Length;

            // ая , ия, ел = орел, ок = брелок на = весна, ма = зима
            int za = InStr("ая ия ел ок яц ий па да ца ша ба та га ка на ма", z8);
            int zb = InStr("аеёийоуэюяжнгхкчшщ", Left(z7, 1));
            int zd = (za == 4) ? 5 : InStr("айяь", z9);

            if (_dc == DeclensionCase.Nominative || z9 == "." ||
                (part == 2 && InStr("оиеу" + (gender == "ч" ? "" : "бвгджзклмнпрстфхцчшщъ"), z9) > 0) ||
                (part == 1 && InStr("мия мяэ лия кия жая лея", z7) > 0) ||
                (part < 3 && InStr("эы", z9) > 0))
            {
                zd = 9;
            }
            else if (zd == 4 && gender == "ч")
            {
                zd = 2;
            }
            else if (part == 1)
            {
                if (InStr("оеиую", z9) + InStr("их ых аа еа ёа иа оа уа ыа эа юа яа", z8) > 0)
                {
                    zd = 9;
                }
                else if (gender != "ч")
                {
                    if (za == 1)
                    {
                        zd = 7;
                    }
                    else if (z9 == "а")
                    {
                        zd = (za > 18 && z8 != "на") ? 1 : 6;
                    }
                    else
                    {
                        zd = 9;
                    }
                }
                else if (((InStr("ой ый", z8) > 0) && (z5 > 4) && (InStr("опой вбой", Right(word, 4)) == 0)) || (zb > 10 && za == 16))
                {
                    zd = 8;
                }
            }

            int ze = InStr("лец нёк вей бей дец пец мец нец рец вец бец тец жец аец иец ыец бер", z7);

            if (zd == 8 && _dc != DeclensionCase.Instrumental)
            {
                res = (zb > 15 || InStr("жий ний", z7) > 0) ? "е" : "о";
            }
            else if (word == "лев")
            {
                res = "ьв";
            }
            else
            {
                if (InStr("аеёийоуыэюя", Mid(word, z5 - 3, 1)) == 0 && (zb > 11 || zb == 0) && ze != 61)
                {
                    res = "";
                }
                else if (za == 7)
                {
                    res = "л";
                }
                else if (za == 10)
                {
                    res = "к";
                }
                else if (za == 13)
                {
                    res = "йц";
                }
                else if (ze == 0)
                {
                    res = "";
                }
                else if (ze == 13)
                {
                    res = "е";
                }
                else if (ze < 16)
                {
                    res = "ь" + (ze == 1 ? "ц" : (ze == 5 ? "к" : ""));
                }
                else if (ze < 53)
                {
                    res = "ц";
                }
                else if (ze < 65)
                {
                    res = "йц";
                }
                else
                {
                    res = "р";
                }
            }

            if (zd == 9 || ((part == 3) && (Right(word, 1) == "ы")))
            {
                res = word;
            }
            else
            {
                StringBuilder temp = new StringBuilder(128);
                temp.Append("а у а ");
                if ((z8 == "ич" && !fomitch(word)) || (z8 == "ыш"))
                {
                    temp.Append("е");
                }
                else if ((z8 == "ов") || (z8 == "ев" && part == 1) || (z8 == "ин" && part != 2))
                {
                    temp.Append("ы");
                }
                else
                {
                    temp.Append("о");
                }

                temp.Append("ме ");
                temp.Append(InStr("гжкхш", Left(z8, 1)) > 0 ? "и" : "ы");
                temp.Append(" е у ");
                temp.Append(z8 == "ца" ? "е" : "о");
                temp.Append("йе я ю я ем");
                temp.Append(za == 16 ? "и" : "е");
                temp.Append(" и е ю ейе и и ь ьюи и и ю ейи ойойу ойойойойуюойойгомуго");
                temp.Append((res == "е") || (za == 16) || ((zb > 12) && (zb < 16)) ? "и" : "ы");
                temp.Append("мм");

                string template = temp.ToString();

                res = Left(word, z5 - ((zd > 6) || (!string.IsNullOrEmpty(res)) ? 2 : (zd > 0 ? 1 : 0))) + res +
                      RTrim(Mid(template, 10 * zd + 2 * (int)_dc - 3, 2));
            }

            return(string.IsNullOrEmpty(word) ? "" : (part > 0 ? UCase(Left(res, 1)) + ((declCase < 0) && (part > 1) ? "." : Mid(res, 2)) : res) + z6);
        }
예제 #12
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);
        }
예제 #13
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);
        }
예제 #14
0
 public string GetApproimentDeclension(string approiment, DeclensionCase declensionCase)
 {
     lock (_locker)
         return(BLL.Declension.DeclensionBLL.GetAppointmentDeclension(approiment, (BLL.Declension.DeclensionCase)(int) declensionCase));
 }
예제 #15
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" ), то                   И. О.
        // 10-11-2003 3-20

        public static string GetDeclension(string FIO, DeclensionCase declensionCase)
        {
            return(GetDeclension(FIO, declensionCase, DeclensionGender.NotDefind, "123", 1));
        }
예제 #16
0
 public string GetPersonNameDeclension(string FIO, DeclensionCase declensionCase, DeclensionGender gender, string part, int z5)
 {
     throw new NotImplementedException();
 }
예제 #17
0
 public FilterAttribute(FilterType type, DeclensionCase declensionCase) : this(type)
 {
     Declension = declensionCase;
 }
예제 #18
0
 public DeclensionAttribute(DeclensionCase declensionCase)
 {
     Declension = declensionCase;
 }
예제 #19
0
 public string GetApproimentDeclension(string approiment, DeclensionCase declensionCase)
 {
     throw new NotImplementedException();
 }