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