Example #1
0
        static Datace AnalyzujDataci(string sSlovniPopis)
        {
            Datace        dt              = new Datace();
            List <string> glsCoObsahuje   = new List <string>();
            List <string> glsNeznamaSlova = new List <string>();

            AnalyzatorDatace.ZjistiObsahANeznamaSlova(sSlovniPopis, ref glsCoObsahuje, ref glsNeznamaSlova);

            if (glsNeznamaSlova.Count > 0)
            {
                dt.Upresneni = "neznámé výrazy (" + String.Join("; ", glsNeznamaSlova.ToArray()) + ")";
                return(dt);
            }

            string mstrSlovniPopis = sSlovniPopis;
            string sPopis          = mstrSlovniPopis;
            int    iPocatek;

            RozebratUpresneniVPopisu(ref sPopis, csOtaznik, ref dt);
            RozebratUpresneniVPopisu(ref sPopis, csOkoloRoku, ref dt);
            RozebratUpresneniVPopisu(ref sPopis, csPoRoce, ref dt);
            if (sPopis.Contains(csPrelom))
            {
                dt.RelativniChronologie = 1;
                RozebratUpresneniVPopisu(ref sPopis, csPrelom, ref dt);
            }

            //datace typu 1578 nebo 1579
            if (sPopis.Contains(csNebo))
            {
                string[] asRozhrani = sPopis.Split(new string[] { csNebo }, StringSplitOptions.RemoveEmptyEntries);
                sPopis = asRozhrani[asRozhrani.Length - 1];
                if (Int32.TryParse(asRozhrani[0], out iPocatek))
                {
                    dt.NePredRokem = iPocatek;
                }
                else
                {
                    dt = new Datace(asRozhrani[0]);
                    dt.AnalyzovatSlovniPopis(asRozhrani[0]);
                    dt.NePredRokem = dt.NePredRokem;
                }
            }

            //datace typu 1432/1433
            if (sPopis.Contains("/"))
            {
                string[] asRozhrani = sPopis.Split(new char[] { '/' });
                sPopis = asRozhrani[asRozhrani.Length - 1];
                if (Int32.TryParse(asRozhrani[0], out iPocatek))
                {
                    dt.NePredRokem = iPocatek;
                }
            }
            //datace typu 1502–1503
            if (sPopis.Contains("–"))
            {
                string[] asRozhrani = sPopis.Split(new char[] { '–' });
                sPopis = asRozhrani[asRozhrani.Length - 1];
                if (Int32.TryParse(asRozhrani[0], out iPocatek))
                {
                    dt.NePredRokem = iPocatek;
                }
            }

            int iRok;

            if (Int32.TryParse(sPopis, out iRok))
            {
                UrciDataciNaZakladeRoku(dt, iRok);
            }
            else
            {
                sPopis = mstrSlovniPopis;
            }

            //doplnit zpracovní csNebo
            //rozdělit řetězec na 2 části, zpracovat dataci a vybrat tu pozdější

            if (sPopis.Contains(csPrelom))
            {
                dt.PolovinaStoleti = 1;
                sPopis             = sPopis.Replace(csPrelom, "");
                if (sPopis.Contains(csA))
                {
                    sPopis = sPopis.Substring(sPopis.IndexOf(csA) + csA.Length);
                }
                dt.RelativniChronologie = 1;
            }

            if (sPopis.Contains(cs1polovina))
            {
                dt.PolovinaStoleti      = 1;
                dt.RelativniChronologie = 3;
                sPopis = sPopis.Replace(cs1polovina, "");
            }
            if (sPopis.Contains(cs2polovina))
            {
                dt.PolovinaStoleti = 2;
                //Desetileti = 5;???
                dt.RelativniChronologie = 7;
                sPopis = sPopis.Replace(cs2polovina, "");
            }

            int iPozice;
            int iRozsah;
            int iKolikata;

            if (sPopis.Contains(csCtvrtina))
            {
                iRozsah = 25;
                iPozice = sPopis.IndexOf(csCtvrtina);
                if (Int32.TryParse(sPopis.Substring(iPozice - 1, 1), out iKolikata))
                {
                    dt.PolovinaStoleti      = PolovinaStoletiNaZakladeDesetileti((iKolikata * iRozsah - 1));
                    dt.Desetileti           = (iKolikata * iRozsah - 1) / 10;
                    dt.RelativniChronologie = RelativniChronologieNaZakladeRoku(iKolikata * iRozsah - 1);
                    //dt.NePredRokem = dt.Stoleti + (iKolikata * iKolikata);
                    //dt.NePoRoce = dt.Stoleti + (iKolikata * iKolikata) + iRozsah;
                    sPopis = sPopis.Remove(iPozice - 1, csCtvrtina.Length + 2);
                }
            }
            if (sPopis.Contains(csTretina))
            {
                iRozsah = 33;
                iPozice = sPopis.IndexOf(csTretina);
                if (Int32.TryParse(sPopis.Substring(iPozice - 1, 1), out iKolikata))
                {
                    dt.PolovinaStoleti      = PolovinaStoletiNaZakladeDesetileti(((iKolikata * iRozsah) - 1));
                    dt.Desetileti           = ((iKolikata * iRozsah) - 10) / 10;
                    dt.RelativniChronologie = RelativniChronologieNaZakladeRoku(iKolikata * iRozsah - 10);
                    //dt.NePredRokem = dt.Stoleti + (iKolikata * iRozsah);
                    //dt.NePoRoce = dt.Stoleti + (iKolikata * iRozsah) + iRozsah;
                    sPopis = sPopis.Remove(iPozice - 1, csTretina.Length + 2);
                }
            }

            iPozice = sPopis.IndexOf(csLeta);
            if (iPozice > 0)
            {
                string sText = sPopis.Substring(iPozice - 2, 2);
                int    iDesetileti;
                if (Int32.TryParse(sText, out iDesetileti))
                {
                    dt.PolovinaStoleti      = PolovinaStoletiNaZakladeDesetileti(iDesetileti);
                    dt.Desetileti           = iDesetileti / 10;
                    dt.RelativniChronologie = RelativniChronologieNaZakladeRoku(dt.Desetileti * 10 + 9);
                    //dt.NePredRokem = dt.Stoleti + (iDesetileti);
                    //dt.NePoRoce = dt.Stoleti + (iDesetileti) + iDesetileti;

                    sPopis = sPopis.Remove(iPozice - 2, csLeta.Length + 2);
                }
            }

            iPozice = sPopis.IndexOf(csStoleti);
            if (iPozice > 0)
            {
                //předpokládá se dvoumístný údaj o století - rozšířit i na 9. století a níže
                string sText = sPopis.Substring(iPozice - 2, 2);
                int    iStoleti;
                if (Int32.TryParse(sText, out iStoleti))
                {
                    dt.Stoleti = (iStoleti - 1) * 100;
                    if (dt.RelativniChronologie == 0)
                    {
                        dt.RelativniChronologie = 9;
                        dt.NePredRokem          = dt.Stoleti;
                        dt.NePoRoce             = dt.Stoleti + (100);
                    }

                    //if (iRozsah != 0) {

                    //}
                    if (dt.RelativniChronologie == 2 && dt.Desetileti == 2)
                    {
                        dt.NePredRokem = dt.Stoleti;
                        dt.NePoRoce    = dt.Stoleti + (dt.Desetileti * 10) + (int)(dt.RelativniChronologie * 12.5 - 1);
                    }
                    if (dt.RelativniChronologie == 4 && dt.Desetileti == 4)
                    {
                        dt.NePredRokem = dt.Stoleti + (dt.Desetileti * 10) - (int)(25);
                        dt.NePoRoce    = dt.Stoleti + (dt.Desetileti * 10) + (int)(25);
                    }
                    if (dt.RelativniChronologie == 8 && dt.Desetileti == 9)
                    {
                        dt.NePredRokem = dt.Stoleti + (25 * 3);
                        dt.NePoRoce    = dt.Stoleti + (25 * 4);
                    }
                    if (dt.RelativniChronologie == 8 && dt.Desetileti == 9)
                    {
                        dt.NePredRokem = dt.Stoleti + (dt.Desetileti * 10);
                        dt.NePoRoce    = dt.Stoleti + (dt.Desetileti * 10) + 10;
                    }
                    if (dt.RelativniChronologie == 3)
                    {
                        dt.NePredRokem = dt.Stoleti;
                        dt.NePoRoce    = dt.Stoleti + (dt.PolovinaStoleti * 50);
                    }
                    if (dt.RelativniChronologie == 7)
                    {
                        dt.NePredRokem = dt.Stoleti + (50);
                        dt.NePoRoce    = dt.Stoleti + 100;
                    }
                    if (dt.RelativniChronologie == 1)
                    {
                        dt.NePredRokem = dt.Stoleti - (int)(12.5);
                        dt.NePoRoce    = dt.Stoleti + (int)(12.5);
                    }

                    sPopis = sPopis.Remove(iPozice - 2, csStoleti.Length + 2);
                }
            }

            sPopis = sPopis.Trim();
            if (sPopis == csPolovina)
            {
                dt.Desetileti           = 5;
                dt.PolovinaStoleti      = 2;
                dt.RelativniChronologie = 5;

                dt.NePredRokem = dt.Stoleti + (50 - 25);
                dt.NePoRoce    = dt.Stoleti + (50 + 25);

                sPopis = null;
            }

            switch (sPopis)
            {
            case csZacatek:
                dt.PolovinaStoleti      = 1;
                dt.RelativniChronologie = 2;

                dt.NePredRokem = dt.Stoleti;
                dt.NePoRoce    = dt.Stoleti + (int)(dt.RelativniChronologie * 12.5);

                dt.Upresneni = String.IsNullOrEmpty(dt.Upresneni) ? sPopis : dt.Upresneni + " " + sPopis;
                break;

            case csKonec:
                dt.PolovinaStoleti      = 2;
                dt.RelativniChronologie = 8;

                dt.NePredRokem = dt.Stoleti + 100 - (int)(12.5);
                dt.NePoRoce    = dt.Stoleti + 100;
                break;

            case csPolovina:
                dt.RelativniChronologie = 5;
                //dt.NePredRokem = dt.Stoleti;
                //dt.NePoRoce = dt.Stoleti * (dt.RelativniChronologie * 12.5);

                dt.Upresneni = String.IsNullOrEmpty(dt.Upresneni) ? sPopis : dt.Upresneni + " " + sPopis;
                break;
            }

            if (dt.Stoleti == 0)
            {
                if (!String.IsNullOrEmpty(sPopis))
                {
                    dt.Upresneni = sPopis;
                }
                else
                {
                    int iCislo;
                    if (!Int32.TryParse(sPopis, out iCislo))
                    {
                        dt.Upresneni += " " + sPopis;
                    }
                }
            }
            return(dt);
        }