コード例 #1
0
 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();
         }
     }
 }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        /// <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;
                }
            }
        }
コード例 #4
0
        /// <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);
            }
        }