Ejemplo n.º 1
0
        protected override bool ParseMatch(DatesRawData data, Match match, DateTime userDate)
        {
            var date = new AbstractPeriod();

            // day of week
            var dayOfWeek     = ParserUtils.FindIndex(data.Tokens[match.Groups[2].Index].Value, Keywords.DaysOfWeek()) + 1;
            var userDayOfWeek = (int)userDate.DayOfWeek;

            if (userDayOfWeek == 0)
            {
                userDayOfWeek = 7;                     // starts from Monday, not Sunday
            }
            var diff = dayOfWeek - userDayOfWeek;

            if (match.Groups[1].Success)
            {
                switch (match.Groups[1].Value)
                {
                case "y":     // "closest next"
                    if (diff < 0)
                    {
                        diff += 7;
                    }
                    date.Date = userDate.AddDays(diff);
                    break;

                case "x":     // "next"
                    date.Date = userDate.AddDays(diff + 7);
                    break;

                case "s":     // "previous"
                    date.Date = userDate.AddDays(diff - 7);
                    break;

                case "u":     // "current"
                    date.Date = userDate.AddDays(diff);
                    break;
                }
                date.FixDownTo(FixPeriod.Day);
            }
            else
            {
                date.Date = userDate.AddDays(diff);
                date.Fix(FixPeriod.Day);
                date.FixDayOfWeek = true;
            }

            // remove and insert
            data.ReplaceTokensByDates(match.Index, match.Length, date);

            return(true);
        }
Ejemplo n.º 2
0
        internal static string CreatePatternFromToken(string token)
        {
            var t = token.ToLower().Replace("[^0-9а-яё-]", "").Trim();

            if (Morph.HasOneOfLemmas(t, Keywords.Year))
            {
                return("Y");
            }
            if (Morph.HasOneOfLemmas(t, Keywords.Months().ToArray()))
            {
                return("M");
            }
            if (Morph.HasOneOfLemmas(t, Keywords.DaysOfWeek().ToArray()))
            {
                return("D");
            }
            if (Morph.HasOneOfLemmas(t, Keywords.PreviousPostfix))
            {
                return("b");
            }
            if (Morph.HasOneOfLemmas(t, Keywords.AfterPostfix))
            {
                return("l");
            }
            if (Morph.HasOneOfLemmas(t, Keywords.After))
            {
                return("i");
            }
            if (Morph.HasOneOfLemmas(t, Keywords.Holiday))
            {
                return("W");
            }

            var p = PeriodFromToken(t);

            switch (p)
            {
            case Period.Minute:
                return("e");

            case Period.Hour:
                return("h");

            case Period.Day:
                return("d");

            case Period.Week:
                return("w");

            case Period.Month:
                return("m");
            }

            var r = RelativeModeFromToken(t);

            switch (r)
            {
            case RelativeMode.Previous:
                return("s");

            case RelativeMode.Current:
                return("u");

            case RelativeMode.CurrentNext:
                return("y");

            case RelativeMode.Next:
                return("x");
            }

            var n = NeighbourDaysFromToken(t);

            if (n > int.MinValue)
            {
                return((n + 4).ToString());
            }

            var d = DaytimeFromToken(t);

            switch (d)
            {
            case DayTime.Morning:
                return("r");

            case DayTime.Noon:
                return("n");

            case DayTime.Day:
                return("a");

            case DayTime.Evening:
                return("v");

            case DayTime.Night:
                return("g");
            }

            var pt = PartTimeFromToken(t);

            switch (pt)
            {
            case PartTime.Quarter:
                return("Q");

            case PartTime.Half:
                return("H");
            }

            if (int.TryParse(t, out var c))
            {
                if (c < 0 || c > 9999)
                {
                    return("_");
                }
                if (c > 1900)
                {
                    return("1");
                }
                return("0");
            }

            if (Morph.HasOneOfLemmas(t, Keywords.TimeFrom))
            {
                return("f");
            }
            if (Morph.HasOneOfLemmas(t, Keywords.TimeTo))
            {
                return("t");
            }
            if (Morph.HasOneOfLemmas(t, Keywords.TimeOn))
            {
                return("o");
            }
            if (Morph.HasOneOfLemmas(t, Keywords.DayInMonth))
            {
                return("#");
            }

            if (t == "и")
            {
                return("N");
            }

            return("_");
        }