private Datace AnalyzujDataci2(string sSlovniPopis)
        {
            char[]        chOddelovace    = new char[] { '/', '–', ',' };
            var           dt              = new Datace(CultureInfo);
            List <string> glsCoObsahuje   = new List <string>();
            List <string> glsNeznamaSlova = new List <string>();

            ZjistiObsahANeznamaSlova(sSlovniPopis, ref glsCoObsahuje, ref glsNeznamaSlova);

            List <TextovyPrvek> gltpTextovePrvky = new TextovePrvky(sSlovniPopis);
            List <string>       glsNeznameVyrazy = new List <string>();

            foreach (TextovyPrvek tp in gltpTextovePrvky)
            {
                if (tp.Typ == TypTextovehoPrvku.Neurceno)
                {
                    glsNeznameVyrazy.Add(tp.Text);
                }
            }

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

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

            string mstrSlovniPopis = sSlovniPopis;
            string sPopis          = mstrSlovniPopis;

            if (glsCoObsahuje.Contains(csOtaznik))
            {
                dt.Upresneni = csOtaznik;
                glsCoObsahuje.Remove(csOtaznik);
                sPopis = sPopis.Replace(csOtaznik, "").Trim();
            }

            string[] asRozhrani = null;
            if (sSlovniPopis.IndexOfAny(chOddelovace) > 0)
            {
                asRozhrani = sPopis.Split(chOddelovace);
            }

            if (glsCoObsahuje.Contains(csNebo))
            {
                asRozhrani = sPopis.Split(new string[] { csNebo }, StringSplitOptions.RemoveEmptyEntries);
            }
            if (asRozhrani != null)
            {
                string zacatek = asRozhrani[0].Trim();
                if (asRozhrani[1].Contains(csLeta) && !asRozhrani[0].Contains(csLeta))
                {
                    zacatek = zacatek + asRozhrani[1].Substring(asRozhrani[1].IndexOf(csLeta, StringComparison.Ordinal) + 1);
                }
                Datace dtZacatek = new Datace(zacatek.Trim(), CultureInfo);
                Datace dtKonec   = new Datace(asRozhrani[1].Trim(), CultureInfo);
                dt             = dtKonec;
                dt.NePredRokem = dtZacatek.NePredRokem;
                if (dtZacatek.Upresneni != null)
                {
                    if (dtKonec.Upresneni != null)
                    {
                        dt.Upresneni = String.Format("{0}; {1}", dtZacatek.Upresneni, dtKonec.Upresneni);
                    }
                    else
                    {
                        dt.Upresneni = dtZacatek.Upresneni;
                    }
                }

                return(dt);
            }

            if (glsCoObsahuje.Contains(csPrelom))
            {
                //vypreparovat první a druhé století
                sPopis     = sPopis.Remove(sPopis.IndexOf(csPrelom), csPrelom.Length + 1);
                asRozhrani = sPopis.Split(new string[] { " a " }, StringSplitOptions.RemoveEmptyEntries);
                dt.RelativniChronologie = 0;
                Datace dtKonec   = new Datace(asRozhrani[1], CultureInfo);
                Datace dtZacatek = new Datace();
                dtZacatek.Stoleti = dtKonec.Stoleti - cintStoLet;
                dtZacatek.RelativniChronologie = 9;
                dtZacatek.NePredRokem          = dtZacatek.Stoleti + (cintStoLet - cintPrelom);
                dt.Stoleti         = dtKonec.Stoleti;
                dt.PolovinaStoleti = dtKonec.PolovinaStoleti;
                dt.NePredRokem     = dtZacatek.NePredRokem;
                dt.NePoRoce        = dtZacatek.Stoleti + (cintStoLet + cintPrelom);
                dt.Upresneni       = csPrelom;
            }

            if (glsCoObsahuje.Count == 2 && glsCoObsahuje.Contains(csA) && glsCoObsahuje.Contains(csStoleti))
            {
                int iStoleti = ZjistiStoleti(sPopis);
                sPopis = sPopis.Replace(((iStoleti / cintStoLet) + 1).ToString() + csStoleti, "").Replace(csA, "").Trim();

                int iStoletiStart = ZjistiStoleti(sPopis);
                dt.Stoleti = iStoleti;
                dt.RelativniChronologie = 0;
                dt.PolovinaStoleti      = 0;
                dt.Desetileti           = 0;
                dt.NePredRokem          = iStoletiStart + 1;
                dt.NePoRoce             = iStoleti + cintStoLet;
                //dt.SlovniPopis = sSlovniPopis;
                return(dt);
            }

            if (glsCoObsahuje.Contains(csStoleti))
            {
                //vypreparovat století, analayzovat zbytek
                int iStoleti = ZjistiStoleti(sPopis);
                dt.Stoleti = iStoleti;

                sPopis = sPopis.Replace(((iStoleti / cintStoLet) + 1).ToString() + csStoleti, "").Trim();
                if (glsCoObsahuje.Contains(csLeta) ||
                    glsCoObsahuje.Contains(csPolovina) ||
                    glsCoObsahuje.Contains(csTretina) ||
                    glsCoObsahuje.Contains(csCtvrtina) ||
                    glsCoObsahuje.Contains(csJenPolovina))
                {
                    CasovyZlomek zl = ZjistiZlomek(sPopis);
                    sPopis = sPopis.Replace(zl.CitatelPopis + zl.JmenovatelPopis, "").Trim();

                    if (zl.Jmenovatel == 10)
                    {
                        dt.Desetileti      = zl.Citatel;
                        dt.PolovinaStoleti = PolovinaStoletiNaZakladeDesetileti(dt.Desetileti * zl.Jmenovatel);
                        dt.NePredRokem     = dt.Stoleti + zl.Jmenovatel * (zl.Citatel == 1 ? 0 : zl.Citatel) + 1;
                        dt.NePoRoce        = dt.NePredRokem + zl.Jmenovatel;
                    }
                    else if (zl.Jmenovatel == 2 && zl.Citatel == -1)
                    {
                        dt.PolovinaStoleti      = 0;
                        dt.RelativniChronologie = 5;
                        dt.Upresneni            = csJenPolovina;

                        dt.NePredRokem = dt.Stoleti + (50) - cintJenPolovina + 1;
                        dt.NePoRoce    = dt.NePredRokem + 50;
                        //int desetileti = dt.NePoRoce - dt.Stoleti;
                        //dt.PolovinaStoleti = PolovinaStoletiNaZakladeDesetileti(desetileti);
                    }
                    else
                    {
                        dt.Stoleti         = iStoleti;
                        dt.PolovinaStoleti = PolovinaStoletiNaZakladeDesetileti(((cintStoLet / zl.Jmenovatel) * (zl.Citatel)));
                        dt.Desetileti      = ((cintStoLet / zl.Jmenovatel) * (zl.Citatel)) / 10;

                        dt.NePredRokem = dt.Stoleti + ((cintStoLet / zl.Jmenovatel) * (zl.Citatel - 1)) + 1;
                        dt.NePoRoce    = dt.Stoleti + ((cintStoLet / zl.Jmenovatel) * (zl.Citatel));

                        RelativniChronologieNaZakladeRoku(dt.NePoRoce);
                    }
                }
                else if (glsCoObsahuje.Count == 1)
                {
                    dt.RelativniChronologie = 0;
                    dt.NePredRokem          = dt.Stoleti + 1;
                    dt.NePoRoce             = dt.Stoleti + cintStoLet;
                }
            }
            if (sPopis == csZacatek)
            {
                dt.RelativniChronologie = 1;
                dt.NePredRokem          = dt.Stoleti;
                dt.NePoRoce             = dt.Stoleti + cintZacatekKonec;
                dt.Upresneni            = csZacatek;
                dt.Desetileti           = 2;
                dt.PolovinaStoleti      = 1;
                sPopis = sPopis.Replace(csZacatek, "").Trim();
            }
            if (sPopis == csKonec)
            {
                dt.NePoRoce             = dt.Stoleti + cintStoLet;
                dt.NePredRokem          = dt.Stoleti + cintStoLet - cintZacatekKonec;
                dt.RelativniChronologie = 9;
                dt.PolovinaStoleti      = 2;
                dt.Desetileti           = 9;
                dt.Upresneni            = csKonec;
                sPopis = sPopis.Replace(csKonec, "").Trim();
            }

            if (glsCoObsahuje.Contains(csPoRoce))
            {
                sPopis       = sPopis.Remove(sPopis.IndexOf(csPoRoce), csPoRoce.Length);
                dt.Upresneni = csPoRoce;
                int iRok;
                if (Int32.TryParse(sPopis, out iRok))
                {
                    UrciDataciNaZakladeRoku(dt, iRok);
                    dt.NePoRoce    = dt.Rok + cintOkoloRoku; //TODO Tady by mělo být koncové datum, např. úmrtí autora
                    dt.NePredRokem = dt.Rok;
                }
            }
            if (glsCoObsahuje.Contains(csOkoloRoku))
            {
                sPopis       = sPopis.Remove(sPopis.IndexOf(csOkoloRoku), csOkoloRoku.Length);
                dt.Upresneni = csOkoloRoku;
                int iRok;
                if (Int32.TryParse(sPopis, out iRok))
                {
                    UrciDataciNaZakladeRoku(dt, iRok);
                    dt.NePoRoce    = dt.Rok + cintOkoloRoku;
                    dt.NePredRokem = dt.Rok - cintOkoloRoku;
                    int desetileti = dt.NePoRoce - dt.Stoleti;
                    dt.PolovinaStoleti = PolovinaStoletiNaZakladeDesetileti(desetileti);
                }
            }

            if (glsCoObsahuje.Contains(csPost))
            {
                sPopis       = sPopis.Remove(sPopis.IndexOf(csPost), csPost.Length + 1);
                dt.Upresneni = csPost;
                int iRok;
                if (Int32.TryParse(sPopis.Substring(0, 4), out iRok))
                {
                    UrciDataciNaZakladeRoku(dt, iRok);
                    dt.NePoRoce = iRok;
                }
            }

            if (glsCoObsahuje.Contains(csAnte))
            {
                sPopis = sPopis.Remove(sPopis.IndexOf(csAnte), csAnte.Length + 1);
                if (!String.IsNullOrEmpty(dt.Upresneni))
                {
                    dt.Upresneni += "; " + csAnte;
                }
                else
                {
                    dt.Upresneni = csAnte;
                }
                int iRok;
                if (Int32.TryParse(sPopis.Substring(0, 4), out iRok))
                {
                    UrciDataciNaZakladeRoku(dt, iRok);
                    dt.NePoRoce = iRok;
                }
            }

            if (glsCoObsahuje.Count == 1 && glsCoObsahuje.Contains(csA))
            {
                asRozhrani = sPopis.Split(new string[] { csA }, StringSplitOptions.RemoveEmptyEntries);

                if (asRozhrani != null)
                {
                    string zacatek = asRozhrani[0].Trim();
                    if (asRozhrani[1].Contains(csLeta) && !asRozhrani[0].Contains(csLeta))
                    {
                        zacatek = zacatek + asRozhrani[1].Substring(asRozhrani[1].IndexOf(csLeta, StringComparison.Ordinal) + 1);
                    }
                    Datace dtZacatek = new Datace(zacatek.Trim(), CultureInfo);
                    Datace dtKonec   = new Datace(asRozhrani[1].Trim(), CultureInfo);
                    dt             = dtKonec;
                    dt.NePredRokem = dtZacatek.NePredRokem;
                    if (dtZacatek.Upresneni != null)
                    {
                        if (dtKonec.Upresneni != null)
                        {
                            dt.Upresneni = String.Format("{0}; {1}", dtZacatek.Upresneni, dtKonec.Upresneni);
                        }
                        else
                        {
                            dt.Upresneni = dtZacatek.Upresneni;
                        }
                    }

                    return(dt);
                }
            }

            //jde pouze o rok
            if (glsCoObsahuje.Count == 0)
            {
                int      iRok;
                DateTime date;
                if (DateTime.TryParse(sPopis, CultureInfo, DateTimeStyles.None, out date))
                {
                    iRok = date.Year;
                    UrciDataciNaZakladeRoku(dt, iRok);
                }
                else if (Int32.TryParse(sPopis, out iRok))
                {
                    UrciDataciNaZakladeRoku(dt, iRok);
                }
                // TODO: upozorňovat na neplatné údaje pomocí výjimek, které se na vhodné úrovni zachytí a vytvoří se popis, co je v dataci špatné nebo neznámé
            }
            return(dt);
        }
 // TODO: VS píše, že se tato funkce nepoužívá -- už nebo ještě?
 private static void RozebratUpresneniVPopisu(ref string sPopis, string sUpresneni, ref Datace dtDatace)
 {
     if (sPopis.Contains(sUpresneni))
     {
         dtDatace.Upresneni = String.IsNullOrEmpty(dtDatace.Upresneni) ? sUpresneni : dtDatace.Upresneni + " " + sUpresneni;
         sPopis             = sPopis.Replace(sUpresneni, "").Trim();
     }
 }
Example #3
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);
        }