private void InitiateParsing() { if (parsingString.StartsWith(KATHISMA_TEXT)) { //кафизма ElementType = PsalterElementKind.Kathisma; Element = CreateKathisma() as IPsalterElement; parsingString = null; } else if (parsingString.StartsWith(PSALM_TEXT)) { //псалом ElementType = PsalterElementKind.Psalm; Element = CreatePsalm() as IPsalterElement; parsingString = null; } else if (parsingString.StartsWith(SLAVA_TEXT)) { //слава ElementType = PsalterElementKind.Slava; Element = null; parsingString = null; } else { //стих //смотрим предыдущее состояние if (ElementType == PsalterElementKind.Psalm /*|| ElementType == PsalterElementKind.PsalmAnnotation*/) { //Аннотация ElementType = PsalterElementKind.PsalmAnnotation; ContinueParsing(); } else { //Текст ElementType = PsalterElementKind.PsalmText; ContinueParsing(); } } }
private void ContinueParsing() { var fragments = parsingString.Split(new Char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); string text = ""; int? number = null; foreach (var str in fragments) { if (TryParse(str, out int i)) { //цифра - значит начало стиха if (number == null) { number = i; RemoveFragment(str); } else { //новый стих, который нам уже не нужен break; } } else { //просто текст - добавляем его text += $"{str} "; RemoveFragment(str); } } Element = CreateStihos(number, text); void RemoveFragment(string f) { int length = (parsingString.Length > f.Length) ? f.Length + 1 : f.Length; parsingString = parsingString.Remove(0, length); } }
/// <summary> /// Осуществляет миграцию Кафизм на основании текстовых документов, а также существующих в БД псалмов /// </summary> /// <param name="reader"></param> /// <param name="typiconEntity"></param> /// <exception cref="ResourceNotFoundException">В случае отсутствия Псалмов в БД</exception> public void MigrateKathismas(IPsalterReader reader, TypiconEntity typiconEntity) { if (reader == null) { throw new ArgumentNullException("IPsalterReader in MigrateKathismas"); } if (typiconEntity == null) { throw new ArgumentNullException("TypiconEntity in MigrateKathismas"); } DeleteAllKathismas(typiconEntity); Kathisma kathisma = null; PsalmLink psalmLink = null; IPsalterElement currentElement = null; while (reader.Read()) { switch (reader.ElementType) { case PsalterElementKind.Kathisma: currentElement = reader.Element; kathisma = typiconEntity.AppendKathisma(reader.Element as Kathisma); break; case PsalterElementKind.Psalm: //если до этого читали Псалом, то добавляем его, очищая ссылки на стихи if (currentElement is PsalmLink p) { ClearStihosIndexes(p); kathisma?.AppendPsalmLink(p); } currentElement = reader.Element; psalmLink = CreatePsalmLink((reader.Element as Psalm).Number); break; case PsalterElementKind.PsalmAnnotation: //не нужна- ничего не делаем break; case PsalterElementKind.PsalmText: if (currentElement == null) { //значит пришли сюда после чтения "Славы" //создаем новую ссылку на Псалом (17 кафизма) psalmLink = CreatePsalmLink(psalmLink); } psalmLink?.AppendStihos(reader.Element as BookStihos); currentElement = psalmLink; break; case PsalterElementKind.Slava: kathisma?.AppendNewSlava(); if (currentElement is PsalmLink pl) { kathisma?.AppendPsalmLink(pl); } currentElement = null; break; } } }
/// <summary> /// Осуществляет миграцию Кафизм на основании текстовых документов, а также существующих в БД псалмов /// </summary> /// <param name="reader"></param> /// <param name="typiconEntity"></param> /// <param name="migrateOnlyKathismaName">Только лишь обновляет/добавляет имена у кафизм для заданного языка</param> /// <exception cref="ResourceNotFoundException">В случае отсутствия Псалмов в БД</exception> public void MigrateKathismas(IPsalterReader reader, TypiconVersion typiconEntity, bool migrateOnlyKathismaName = false) { if (reader == null) { throw new ArgumentNullException("IPsalterReader in MigrateKathismas"); } if (typiconEntity == null) { throw new ArgumentNullException("TypiconVersion in MigrateKathismas"); } //Удаляем все кафизмы, если установлен флаг //if (clearBeforeMigration) //{ // DeleteAllKathismas(typiconEntity); //} Kathisma kathisma = null; PsalmLink psalmLink = null; IPsalterElement currentElement = null; while (reader.Read()) { switch (reader.ElementType) { case PsalterElementKind.Kathisma: { currentElement = reader.Element; kathisma = typiconEntity.AppendOrUpdateKathisma(reader.Element as Kathisma); psalmLink = null; } break; case PsalterElementKind.Psalm: { if (!migrateOnlyKathismaName) { //если до этого читали Псалом, то добавляем его, очищая ссылки на стихи if (psalmLink != null) { AppendAndClearPsalmLink(kathisma, psalmLink); } currentElement = reader.Element; psalmLink = CreatePsalmLink((reader.Element as Psalm).Number); } } break; case PsalterElementKind.PsalmAnnotation: //не нужна- ничего не делаем break; case PsalterElementKind.PsalmText: { if (!migrateOnlyKathismaName) { if (currentElement == null) { //значит пришли сюда после чтения "Славы" //добавляем сформированную Ссылку //и создаем новую ссылку на Псалом (17 кафизма) if (psalmLink != null) { kathisma.AppendOrUpdatePsalmLink(psalmLink); } psalmLink = CreatePsalmLink(psalmLink); } psalmLink.AppendStihos(reader.Element as BookStihos); currentElement = psalmLink; } } break; case PsalterElementKind.Slava: { if (!migrateOnlyKathismaName) { //Добавляем новую Славу kathisma.AppendNewSlava(); //добавляем Ссылку if (currentElement is PsalmLink p) { if (kathisma.SlavaElements.Count >= 3) { kathisma.AppendOrUpdatePsalmLink(p); } } currentElement = null; } } break; } } void AppendAndClearPsalmLink(Kathisma k, PsalmLink p) { //Пока убираем, потому как в текст Псалма будут входить и аннотации //ClearStihosIndexes(p); k.AppendOrUpdatePsalmLink(p); } }