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); }
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("_"); }