//_____________________________________________________________________________ // 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("(ошибка)"); } }
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); }
/// <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); } }
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); }
public string GetPersonNameDeclension(string FIO, DeclensionCase declensionCase, DeclensionGender gender, string part, int z5) { throw new NotImplementedException(); }