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); }