internal bool AddDate(Pullenti.Ner.Decree.Internal.DecreeToken dt) { if (dt == null) { return(false); } if (dt.Ref != null && (dt.Ref.Referent is Pullenti.Ner.Date.DateReferent)) { Pullenti.Ner.Date.DateReferent dr = dt.Ref.Referent as Pullenti.Ner.Date.DateReferent; if (dr.IsRelative) { return(false); } int year = dr.Year; int mon = dr.Month; int day = dr.Day; if (year == 0) { return(false); } StringBuilder tmp = new StringBuilder(); tmp.Append(year); if (mon > 0) { tmp.AppendFormat(".{0}", mon.ToString("D02")); } if (day > 0) { tmp.AppendFormat(".{0}", day.ToString("D02")); } this.AddSlot(ATTR_DATE, tmp.ToString(), false, 0); return(true); } if (dt.Ref != null && (dt.Ref.Referent is Pullenti.Ner.Date.DateRangeReferent)) { this.AddSlot(ATTR_DATE, dt.Ref.Referent, false, 0); return(true); } if (dt.Value != null) { this.AddSlot(ATTR_DATE, dt.Value, false, 0); return(true); } return(false); }
public static bool CalculateDateRange(Pullenti.Ner.Date.DateReferent dr, DateTime now, out DateTime from, out DateTime to, int tense) { if (dr.Pointer == Pullenti.Ner.Date.DatePointerType.Today) { from = now; to = now; return(true); } if (!dr.IsRelative && dr.Dt != null) { from = (to = dr.Dt.Value); return(true); } DateExToken det = new DateExToken(null, null); det.ItemsFrom = _createDateEx(dr); return(det.GetDates(now, out from, out to, tense)); }
internal bool AddDate(object dt) { if (dt == null) { return(false); } if (dt is Pullenti.Ner.Decree.Internal.DecreeToken) { if ((dt as Pullenti.Ner.Decree.Internal.DecreeToken).Ref is Pullenti.Ner.ReferentToken) { return(this.AddDate(((dt as Pullenti.Ner.Decree.Internal.DecreeToken).Ref as Pullenti.Ner.ReferentToken).Referent)); } if ((dt as Pullenti.Ner.Decree.Internal.DecreeToken).Value != null) { this.AddSlot(ATTR_DATE, (dt as Pullenti.Ner.Decree.Internal.DecreeToken).Value, true, 0); return(true); } return(false); } if (dt is Pullenti.Ner.ReferentToken) { return(this.AddDate((dt as Pullenti.Ner.ReferentToken).Referent)); } if (dt is Pullenti.Ner.Date.DateReferent) { Pullenti.Ner.Date.DateReferent dr = dt as Pullenti.Ner.Date.DateReferent; int year = dr.Year; int mon = dr.Month; int day = dr.Day; if (year == 0) { return(dr.Pointer == Pullenti.Ner.Date.DatePointerType.Undefined); } DateTime?exDate = Date; if (exDate != null && exDate.Value.Year == year) { if (mon == 0 && exDate.Value.Month > 0) { return(false); } if (day == 0 && exDate.Value.Day > 0) { return(false); } bool delExist = false; if (mon > 0 && exDate.Value.Month == 0) { delExist = true; } if (delExist) { foreach (Pullenti.Ner.Slot s in Slots) { if (s.TypeName == ATTR_DATE) { Slots.Remove(s); break; } } } } StringBuilder tmp = new StringBuilder(); tmp.Append(year); if (mon > 0) { tmp.AppendFormat(".{0}", mon.ToString("D02")); } if (day > 0) { tmp.AppendFormat(".{0}", day.ToString("D02")); } this.AddSlot(Pullenti.Ner.Decree.DecreeReferent.ATTR_DATE, tmp.ToString(), false, 0); return(true); } if (dt is string) { this.AddSlot(ATTR_DATE, dt as string, true, 0); return(true); } return(false); }
static BookLinkToken _tryParse(Pullenti.Ner.Token t, int lev) { if (t == null || lev > 3) { return(null); } if (t.IsChar('[')) { BookLinkToken re = _tryParse(t.Next, lev + 1); if (re != null && re.EndToken.Next != null && re.EndToken.Next.IsChar(']')) { re.BeginToken = t; re.EndToken = re.EndToken.Next; return(re); } if (re != null && re.EndToken.IsChar(']')) { re.BeginToken = t; return(re); } if (re != null) { if (re.Typ == BookLinkTyp.Sostavitel || re.Typ == BookLinkTyp.Editors) { return(re); } } Pullenti.Ner.Core.BracketSequenceToken br = Pullenti.Ner.Core.BracketHelper.TryParse(t, Pullenti.Ner.Core.BracketParseAttr.No, 100); if (br != null) { if ((br.EndToken.Previous is Pullenti.Ner.NumberToken) && (br.LengthChar < 30)) { return new BookLinkToken(t, br.EndToken) { Typ = BookLinkTyp.Number, Value = Pullenti.Ner.Core.MiscHelper.GetTextValue(br.BeginToken.Next, br.EndToken.Previous, Pullenti.Ner.Core.GetTextAttr.No) } } ; } } Pullenti.Ner.Token t0 = t; if (t is Pullenti.Ner.ReferentToken) { if (t.GetReferent() is Pullenti.Ner.Person.PersonReferent) { return(TryParseAuthor(t, Pullenti.Ner.Person.Internal.FioTemplateType.Undefined)); } if (t.GetReferent() is Pullenti.Ner.Geo.GeoReferent) { return new BookLinkToken(t, t) { Typ = BookLinkTyp.Geo, Ref = t.GetReferent() } } ; if (t.GetReferent() is Pullenti.Ner.Date.DateReferent) { Pullenti.Ner.Date.DateReferent dr = t.GetReferent() as Pullenti.Ner.Date.DateReferent; if (dr.Slots.Count == 1 && dr.Year > 0) { return new BookLinkToken(t, t) { Typ = BookLinkTyp.Year, Value = dr.Year.ToString() } } ; if (dr.Year > 0 && t.Previous != null && t.Previous.IsComma) { return new BookLinkToken(t, t) { Typ = BookLinkTyp.Year, Value = dr.Year.ToString() } } ; } if (t.GetReferent() is Pullenti.Ner.Org.OrganizationReferent) { Pullenti.Ner.Org.OrganizationReferent org = t.GetReferent() as Pullenti.Ner.Org.OrganizationReferent; if (org.Kind == Pullenti.Ner.Org.OrganizationKind.Press) { return new BookLinkToken(t, t) { Typ = BookLinkTyp.Press, Ref = org } } ; } if (t.GetReferent() is Pullenti.Ner.Uri.UriReferent) { Pullenti.Ner.Uri.UriReferent uri = t.GetReferent() as Pullenti.Ner.Uri.UriReferent; if ((uri.Scheme == "http" || uri.Scheme == "https" || uri.Scheme == "ftp") || uri.Scheme == null) { return new BookLinkToken(t, t) { Typ = BookLinkTyp.Url, Ref = uri } } ; } } Pullenti.Ner.Core.TerminToken tok = m_Termins.TryParse(t, Pullenti.Ner.Core.TerminParseAttr.No); if (tok != null) { BookLinkTyp typ = (BookLinkTyp)tok.Termin.Tag; bool ok = true; if (typ == BookLinkTyp.Type || typ == BookLinkTyp.NameTail || typ == BookLinkTyp.ElectronRes) { if (t.Previous != null && ((t.Previous.IsCharOf(".:[") || t.Previous.IsHiphen))) { } else { ok = false; } } if (ok) { return new BookLinkToken(t, tok.EndToken) { Typ = typ, Value = tok.Termin.CanonicText } } ; if (typ == BookLinkTyp.ElectronRes) { for (Pullenti.Ner.Token tt = tok.EndToken.Next; tt != null; tt = tt.Next) { if ((tt is Pullenti.Ner.TextToken) && !tt.Chars.IsLetter) { continue; } if (tt.GetReferent() is Pullenti.Ner.Uri.UriReferent) { return new BookLinkToken(t, tt) { Typ = BookLinkTyp.ElectronRes, Ref = tt.GetReferent() } } ; break; } } } if (t.IsChar('/')) { BookLinkToken res = new BookLinkToken(t, t) { Typ = BookLinkTyp.Delimeter, Value = "/" }; if (t.Next != null && t.Next.IsChar('/')) { res.EndToken = t.Next; res.Value = "//"; } if (!t.IsWhitespaceBefore && !t.IsWhitespaceAfter) { int coo = 3; bool no = true; for (Pullenti.Ner.Token tt = t.Next; tt != null && coo > 0; tt = tt.Next, coo--) { BookLinkToken vvv = TryParse(tt, lev + 1); if (vvv != null && vvv.Typ != BookLinkTyp.Number) { no = false; break; } } if (no) { return(null); } } return(res); } if ((t is Pullenti.Ner.NumberToken) && (t as Pullenti.Ner.NumberToken).IntValue != null && (t as Pullenti.Ner.NumberToken).Typ == Pullenti.Ner.NumberSpellingType.Digit) { BookLinkToken res = new BookLinkToken(t, t) { Typ = BookLinkTyp.Number, Value = (t as Pullenti.Ner.NumberToken).Value.ToString() }; int val = (t as Pullenti.Ner.NumberToken).IntValue.Value; if (val >= 1930 && (val < 2030)) { res.Typ = BookLinkTyp.Year; } if (t.Next != null && t.Next.IsChar('.')) { res.EndToken = t.Next; } else if ((t.Next != null && t.Next.LengthChar == 1 && !t.Next.Chars.IsLetter) && t.Next.IsWhitespaceAfter) { res.EndToken = t.Next; } else if (t.Next is Pullenti.Ner.TextToken) { string term = (t.Next as Pullenti.Ner.TextToken).Term; if (((term == "СТР" || term == "C" || term == "С") || term == "P" || term == "S") || term == "PAGES") { res.EndToken = t.Next; res.Typ = BookLinkTyp.Pages; res.Value = (t as Pullenti.Ner.NumberToken).Value.ToString(); } } return(res); } if (t is Pullenti.Ner.TextToken) { string term = (t as Pullenti.Ner.TextToken).Term; if (((((((term == "СТР" || term == "C" || term == "С") || term == "ТОМ" || term == "T") || term == "Т" || term == "P") || term == "PP" || term == "V") || term == "VOL" || term == "S") || term == "СТОР" || t.IsValue("PAGE", null)) || t.IsValue("СТРАНИЦА", "СТОРІНКА")) { Pullenti.Ner.Token tt = t.Next; while (tt != null) { if (tt.IsCharOf(".:~")) { tt = tt.Next; } else { break; } } if (tt is Pullenti.Ner.NumberToken) { BookLinkToken res = new BookLinkToken(t, tt) { Typ = BookLinkTyp.PageRange }; Pullenti.Ner.Token tt0 = tt; Pullenti.Ner.Token tt1 = tt; for (tt = tt.Next; tt != null; tt = tt.Next) { if (tt.IsCharOf(",") || tt.IsHiphen) { if (tt.Next is Pullenti.Ner.NumberToken) { tt = tt.Next; res.EndToken = tt; tt1 = tt; continue; } } break; } res.Value = Pullenti.Ner.Core.MiscHelper.GetTextValue(tt0, tt1, Pullenti.Ner.Core.GetTextAttr.No); return(res); } } if ((term == "M" || term == "М" || term == "СПБ") || term == "K" || term == "К") { if (t.Next != null && t.Next.IsCharOf(":;")) { BookLinkToken re = new BookLinkToken(t, t.Next) { Typ = BookLinkTyp.Geo }; return(re); } if (t.Next != null && t.Next.IsCharOf(".")) { BookLinkToken res = new BookLinkToken(t, t.Next) { Typ = BookLinkTyp.Geo }; if (t.Next.Next != null && t.Next.Next.IsCharOf(":;")) { res.EndToken = t.Next.Next; } else if (t.Next.Next != null && (t.Next.Next is Pullenti.Ner.NumberToken)) { } else if (t.Next.Next != null && t.Next.Next.IsComma && (t.Next.Next.Next is Pullenti.Ner.NumberToken)) { } else { return(null); } return(res); } } if (term == "ПЕР" || term == "ПЕРЕВ" || term == "ПЕРЕВОД") { Pullenti.Ner.Token tt = t; if (tt.Next != null && tt.Next.IsChar('.')) { tt = tt.Next; } if (tt.Next != null && ((tt.Next.IsValue("C", null) || tt.Next.IsValue("С", null)))) { tt = tt.Next; if (tt.Next == null || tt.WhitespacesAfterCount > 2) { return(null); } BookLinkToken re = new BookLinkToken(t, tt.Next) { Typ = BookLinkTyp.Translate }; return(re); } } if (term == "ТАМ" || term == "ТАМЖЕ") { BookLinkToken res = new BookLinkToken(t, t) { Typ = BookLinkTyp.Tamze }; if (t.Next != null && t.Next.IsValue("ЖЕ", null)) { res.EndToken = t.Next; } return(res); } if (((term == "СМ" || term == "CM" || term == "НАПР") || term == "НАПРИМЕР" || term == "SEE") || term == "ПОДРОБНЕЕ" || term == "ПОДРОБНО") { BookLinkToken res = new BookLinkToken(t, t) { Typ = BookLinkTyp.See }; for (t = t.Next; t != null; t = t.Next) { if (t.IsCharOf(".:") || t.IsValue("ALSO", null)) { res.EndToken = t; continue; } if (t.IsValue("В", null) || t.IsValue("IN", null)) { res.EndToken = t; continue; } BookLinkToken vvv = _tryParse(t, lev + 1); if (vvv != null && vvv.Typ == BookLinkTyp.See) { res.EndToken = vvv.EndToken; break; } break; } return(res); } if (term == "БОЛЕЕ") { BookLinkToken vvv = _tryParse(t.Next, lev + 1); if (vvv != null && vvv.Typ == BookLinkTyp.See) { vvv.BeginToken = t; return(vvv); } } Pullenti.Ner.Token no = Pullenti.Ner.Core.MiscHelper.CheckNumberPrefix(t); if (no is Pullenti.Ner.NumberToken) { return new BookLinkToken(t, no) { Typ = BookLinkTyp.N } } ; if (((term == "B" || term == "В")) && (t.Next is Pullenti.Ner.NumberToken) && (t.Next.Next is Pullenti.Ner.TextToken)) { string term2 = (t.Next.Next as Pullenti.Ner.TextToken).Term; if (((term2 == "Т" || term2 == "T" || term2.StartsWith("ТОМ")) || term2 == "TT" || term2 == "ТТ") || term2 == "КН" || term2.StartsWith("КНИГ")) { return new BookLinkToken(t, t.Next.Next) { Typ = BookLinkTyp.Volume } } ; } } if (t.IsChar('(')) { if (((t.Next is Pullenti.Ner.NumberToken) && (t.Next as Pullenti.Ner.NumberToken).IntValue != null && t.Next.Next != null) && t.Next.Next.IsChar(')')) { int num = (t.Next as Pullenti.Ner.NumberToken).IntValue.Value; if (num > 1900 && num <= 2040) { if (num <= DateTime.Now.Year) { return new BookLinkToken(t, t.Next.Next) { Typ = BookLinkTyp.Year, Value = num.ToString() } } ; } } if (((t.Next is Pullenti.Ner.ReferentToken) && (t.Next.GetReferent() is Pullenti.Ner.Date.DateReferent) && t.Next.Next != null) && t.Next.Next.IsChar(')')) { int num = (t.Next.GetReferent() as Pullenti.Ner.Date.DateReferent).Year; if (num > 0) { return new BookLinkToken(t, t.Next.Next) { Typ = BookLinkTyp.Year, Value = num.ToString() } } ; } } return(null); }
static List <Pullenti.Ner.ReferentToken> _createRefs(List <DateExToken.DateExItemToken> its) { List <Pullenti.Ner.ReferentToken> res = new List <Pullenti.Ner.ReferentToken>(); Pullenti.Ner.Date.DateReferent own = null; for (int i = 0; i < its.Count; i++) { DateExToken.DateExItemToken it = its[i]; Pullenti.Ner.Date.DateReferent d = new Pullenti.Ner.Date.DateReferent(); if (it.IsValueRelate) { d.IsRelative = true; } if (own != null) { d.Higher = own; } if (it.Typ == DateExToken.DateExItemTokenType.Day) { d.Day = it.Value; } else if (it.Typ == DateExToken.DateExItemTokenType.DayOfWeek) { d.DayOfWeek = it.Value; } else if (it.Typ == DateExToken.DateExItemTokenType.Hour) { d.Hour = it.Value; if (((i + 1) < its.Count) && its[i + 1].Typ == DateExToken.DateExItemTokenType.Minute && !its[i + 1].IsValueRelate) { d.Minute = its[i + 1].Value; i++; } } else if (it.Typ == DateExToken.DateExItemTokenType.Minute) { d.Minute = it.Value; } else if (it.Typ == DateExToken.DateExItemTokenType.Month) { d.Month = it.Value; } else if (it.Typ == DateExToken.DateExItemTokenType.Quartal) { d.Quartal = it.Value; } else if (it.Typ == DateExToken.DateExItemTokenType.Week) { d.Week = it.Value; } else if (it.Typ == DateExToken.DateExItemTokenType.Year) { d.Year = it.Value; } else { continue; } res.Add(new Pullenti.Ner.ReferentToken(d, it.BeginToken, it.EndToken)); own = d; it.Src = d; } if (res.Count > 0) { res[0].Tag = own; } return(res); }
static List <DateExToken.DateExItemToken> _createDateEx(Pullenti.Ner.Date.DateReferent dr) { List <DateExToken.DateExItemToken> res = new List <DateExToken.DateExItemToken>(); for (; dr != null; dr = dr.Higher) { int n; foreach (Pullenti.Ner.Slot s in dr.Slots) { DateExToken.DateExItemToken it = new DateExToken.DateExItemToken(null, null) { Typ = DateExToken.DateExItemTokenType.Undefined }; if (dr.GetStringValue(Pullenti.Ner.Date.DateReferent.ATTR_ISRELATIVE) == "true") { it.IsValueRelate = true; } if (s.TypeName == Pullenti.Ner.Date.DateReferent.ATTR_YEAR) { it.Typ = DateExToken.DateExItemTokenType.Year; if (int.TryParse(s.Value as string, out n)) { it.Value = n; } } else if (s.TypeName == Pullenti.Ner.Date.DateReferent.ATTR_QUARTAL) { it.Typ = DateExToken.DateExItemTokenType.Quartal; if (int.TryParse(s.Value as string, out n)) { it.Value = n; } } else if (s.TypeName == Pullenti.Ner.Date.DateReferent.ATTR_MONTH) { it.Typ = DateExToken.DateExItemTokenType.Month; if (int.TryParse(s.Value as string, out n)) { it.Value = n; } } else if (s.TypeName == Pullenti.Ner.Date.DateReferent.ATTR_WEEK) { it.Typ = DateExToken.DateExItemTokenType.Week; if (int.TryParse(s.Value as string, out n)) { it.Value = n; } } else if (s.TypeName == Pullenti.Ner.Date.DateReferent.ATTR_DAYOFWEEK) { it.Typ = DateExToken.DateExItemTokenType.DayOfWeek; if (int.TryParse(s.Value as string, out n)) { it.Value = n; } } else if (s.TypeName == Pullenti.Ner.Date.DateReferent.ATTR_DAY) { it.Typ = DateExToken.DateExItemTokenType.Day; if (int.TryParse(s.Value as string, out n)) { it.Value = n; } } else if (s.TypeName == Pullenti.Ner.Date.DateReferent.ATTR_HOUR) { it.Typ = DateExToken.DateExItemTokenType.Hour; if (int.TryParse(s.Value as string, out n)) { it.Value = n; } } else if (s.TypeName == Pullenti.Ner.Date.DateReferent.ATTR_MINUTE) { it.Typ = DateExToken.DateExItemTokenType.Minute; if (int.TryParse(s.Value as string, out n)) { it.Value = n; } } if (it.Typ != DateExToken.DateExItemTokenType.Undefined) { res.Insert(0, it); } } } res.Sort(); return(res); }