예제 #1
0
 public GrammaticalResult(string text, GrammaticalCase inputCase)
 {
     Text       = text;
     TextAfter  = text;
     InputCase  = inputCase;
     OutputCase = inputCase;
 }
 public RuleTwoWords(GrammaticalCase dealWith, string firstWordEnd, string firstWordEndChange, string secondWordEnd, string secondWordEndChange)
 {
     this.DealWith            = dealWith;
     this.FirstWordEnd        = firstWordEnd;
     this.FirstWordEndChange  = firstWordEndChange;
     this.SecondWordEnd       = secondWordEnd;
     this.SecondWordEndChange = secondWordEndChange;
 }
        public static GrammaticalResult ChangeCase(string text, GrammaticalCase toCaseType)
        {
            var result    = new GrammaticalResult(text, toCaseType);
            var newString = string.Empty;


            if (string.IsNullOrEmpty(text))
            {
                return(result);
            }
            if (text.Length < 2)
            {
                return(result);
            }

            //multiples
            if (text.Contains(' '))
            {
                var parts = text.Split(' ');
                //two-pronged
                if (parts.Count() == 2)
                {
                    if (toCaseType == GrammaticalCase.Locative)
                    {
                        var rules = RuleBuilder.LocativeRulesTwoWords;
                        return(rules.FindMatchingAndReplace(text, GrammaticalCase.Locative));
                    }
                }
            }
            else
            {
                if (toCaseType == GrammaticalCase.Locative)
                {
                    var rules = RuleBuilder.LocativeRules;
                    return(rules.FindMatchingAndReplace(text, GrammaticalCase.Locative));
                }
            }


            return(result);
        }
        public static GrammaticalResult FindMatchingAndReplace(this List <Rule> rules, string text, GrammaticalCase toCaseType)
        {
            var result    = new GrammaticalResult(text, toCaseType);
            var newString = string.Empty;


            foreach (var rule in rules)
            {
                if (rule.WordEnd.Length > text.Length)
                {
                    return(result);
                }

                var wordEnd = text.Substring(text.Length - rule.WordEnd.Length);
                if (rule.WordEnd.Equals(wordEnd))
                {
                    return(result.Update(text.Remove(text.Length - rule.WordEnd.Length) + rule.WordEndChange, toCaseType));
                }
            }



            return(result);
        }
        public static GrammaticalResult FindMatchingAndReplace(this List <RuleTwoWords> rules, string text, GrammaticalCase toCaseType)
        {
            var result    = new GrammaticalResult(text, toCaseType);
            var newString = string.Empty;

            var parts = text.Split(' ');

            if (parts.Count() != 2)
            {
                return(result);
            }

            foreach (var rule in rules)
            {
                if (rule.FirstWordEnd.Length > parts[0].Length || rule.SecondWordEnd.Length > parts[1].Length)
                {
                    return(result);
                }

                var end       = parts[0].Substring(parts[0].Length - rule.FirstWordEnd.Length);
                var secondEnd = parts[1].Substring(parts[1].Length - rule.SecondWordEnd.Length);

                if (rule.FirstWordEnd == end && rule.SecondWordEnd == secondEnd)
                {
                    newString = parts[0].Remove(parts[0].Length - rule.FirstWordEnd.Length) + rule.FirstWordEndChange + " " + parts[1].Remove(parts[1].Length - rule.SecondWordEnd.Length) + rule.SecondWordEndChange;
                    return(result.Update(newString, GrammaticalCase.Locative));
                }
            }

            return(result);
        }
예제 #6
0
        public static string ConvertToDateByWordsString(DateTime date, GrammaticalCase grammaticalCase)
        {
            string[] days = DayNominative;
            switch (grammaticalCase)
            {
                case GrammaticalCase.Genitive:
                    days = DayGenitive;
                    break;
                case GrammaticalCase.Nominative:
                    days = DayNominative;
                    break;
            }

            var dayAsString = days[date.Day - 1];

            var monthAsString = MonthGenitive[date.Month - 1];

            var yearAsString = ConvertToNumberByWordsString(date.Year, true);

            int indexOfLastWordInDateStr = yearAsString.LastIndexOf(" ", StringComparison.Ordinal);
            if (indexOfLastWordInDateStr == -1)
            {
                yearAsString = string.Empty;
            }
            else
            {
                yearAsString = yearAsString.Substring(0, indexOfLastWordInDateStr + 1);
            }

            int year = date.Year % 10;
            int decade = date.Year % 100;
            int century = date.Year % 1000;
            if (year != 0 && decade < 20) // year like 1914
            {
                yearAsString += DayGenitive[decade - 1];
            }
            else if (year != 0 && decade > 20) // year like 1926
            {
                yearAsString += DayGenitive[year - 1];
            }
            else // year like 1930 || 1900 || 2000
            {
                if (decade != 0) // year like 1930
                {
                    yearAsString += DecadeGenitive[decade / 10 - 1];
                }
                else if (century != 0) // year like 1930
                {
                    yearAsString += CenturyGenitive[century / 100 - 1];
                }
                else
                {
                    indexOfLastWordInDateStr = yearAsString.Trim().LastIndexOf(" ", StringComparison.Ordinal);
                    yearAsString = yearAsString.Substring(0, indexOfLastWordInDateStr + 1);
                    yearAsString += ThousandGenitive[date.Year / 1000 - 1];
                }
            }

            return string.Format("{0} {1} {2} года", dayAsString, monthAsString, yearAsString);
        }
예제 #7
0
 /// <summary>
 /// Turns the provided date into ordinal words
 /// </summary>
 /// <param name="input">The date to be made into ordinal words</param>
 /// <param name="grammaticalCase">The grammatical case to use for output words</param>
 /// <returns>The date in ordinal words</returns>
 public static string ToOrdinalWords(this DateOnly input, GrammaticalCase grammaticalCase)
 {
     return(Configurator.DateOnlyToOrdinalWordsConverter.Convert(input, grammaticalCase));
 }
예제 #8
0
 public virtual string Convert(DateTime date, GrammaticalCase grammaticalCase)
 {
     return(Convert(date));
 }
예제 #9
0
 public Rule(GrammaticalCase dealWith, string wordEnd, string wordEndChange)
 {
     this.DealWith      = dealWith;
     this.WordEnd       = wordEnd;
     this.WordEndChange = wordEndChange;
 }
 /// <inheritdoc />
 public string Convert(DateTime date, GrammaticalCase grammaticalCase)
 => Transformer.Transform(Inner.Convert(date, grammaticalCase));
예제 #11
0
 public static Model.GrammaticalResult GetLocative(this string text, GrammaticalCase caseType)
 {
     return(GrammaticalFunctions.ChangeCase(text, caseType));
 }
예제 #12
0
        public static string ConvertToDateByWordsString(DateTime date, GrammaticalCase grammaticalCase)
        {
            string[] days = DayNominative;
            switch (grammaticalCase)
            {
            case GrammaticalCase.Genitive:
                days = DayGenitive;
                break;

            case GrammaticalCase.Nominative:
                days = DayNominative;
                break;
            }

            var dayAsString = days[date.Day - 1];

            var monthAsString = MonthGenitive[date.Month - 1];

            var yearAsString = ConvertToNumberByWordsString(date.Year, true);

            int indexOfLastWordInDateStr = yearAsString.LastIndexOf(" ", StringComparison.Ordinal);

            if (indexOfLastWordInDateStr == -1)
            {
                yearAsString = string.Empty;
            }
            else
            {
                yearAsString = yearAsString.Substring(0, indexOfLastWordInDateStr + 1);
            }

            int year    = date.Year % 10;
            int decade  = date.Year % 100;
            int century = date.Year % 1000;

            if (year != 0 && decade < 20) // year like 1914
            {
                yearAsString += DayGenitive[decade - 1];
            }
            else if (year != 0 && decade > 20) // year like 1926
            {
                yearAsString += DayGenitive[year - 1];
            }
            else // year like 1930 || 1900 || 2000
            {
                if (decade != 0) // year like 1930
                {
                    yearAsString += DecadeGenitive[decade / 10 - 1];
                }
                else if (century != 0) // year like 1930
                {
                    yearAsString += CenturyGenitive[century / 100 - 1];
                }
                else
                {
                    indexOfLastWordInDateStr = yearAsString.Trim().LastIndexOf(" ", StringComparison.Ordinal);
                    yearAsString             = yearAsString.Substring(0, indexOfLastWordInDateStr + 1);
                    yearAsString            += ThousandGenitive[date.Year / 1000 - 1];
                }
            }

            return(string.Format("{0} {1} {2} года", dayAsString, monthAsString, yearAsString));
        }
예제 #13
0
 public GrammaticalResult Update(string textAfter, GrammaticalCase outputCase)
 {
     TextAfter  = textAfter;
     OutputCase = outputCase;
     return(this);
 }