Esempio n. 1
0
 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);
 }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
 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);
 }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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);
        }