private void ParseTextNodes(TextNodesString parseString)
        {
            var index      = 0;    // чтобы анализировать с первого символа, так как теперь поддерживаем ещё и такие ссылки, как "5:6 - ..."
            var verseEntry = stringParser.TryGetVerse(parseString.Value, index);

            var skipNodes = 0;

            while (verseEntry.VersePointerFound)
            {
                var verseWasRecognized = verseRecognitionService.TryRecognizeVerse(verseEntry, docParseContext);
                if (!verseWasRecognized && configurationManager.UseCommaDelimiter &&
                    verseEntry.EntryType <= VerseEntryType.ChapterVerse)
                {
                    verseEntry         = stringParser.TryGetVerse(parseString.Value, index, index, false);
                    verseWasRecognized = verseRecognitionService.TryRecognizeVerse(verseEntry, docParseContext);
                }

                if (verseWasRecognized)
                {
                    var verseNode = FindNodeAndMoveVerseTextInOneNodeIfNotReadonly(parseString, verseEntry, ref skipNodes);

                    if (!this.docParseContext.DocumentId.IsReadonly && !parseString.IsReadonly)
                    {
                        if (!NodeIsLink(verseNode.NodeEntry.Node.GetParentNode()))
                        {
                            InsertVerseLink(verseNode, verseEntry);
                        }
                        else
                        {
                            UpdateLinkNode(verseNode.NodeEntry.Node.GetParentNode(), verseEntry);
                        }
                    }

                    paragraphContextEditor.ParseResult.VerseEntries.Add(verseEntry);
                    paragraphContextEditor.SetLatestVerseEntry(verseEntry);
                }

                if (verseEntry.VersePointer.SubVerses.NotFoundVerses.Count > 0)
                {
                    paragraphContextEditor.ParseResult.NotFoundVerses.AddRange(verseEntry.VersePointer.SubVerses.NotFoundVerses);
                }

                var prevIndex = index;
                index = verseEntry.EndIndex + 1;
                if (index < parseString.Value.Length - 1)
                {
                    var leftBoundary = !verseWasRecognized && verseEntry.EntryType > VerseEntryType.ChapterVerse ? prevIndex : index;
                    verseEntry = stringParser.TryGetVerse(parseString.Value, index, leftBoundary, configurationManager.UseCommaDelimiter);
                }
                else
                {
                    break;
                }
            }
        }
        public void Test1()
        {
            var s = "Тест и Ин 5:6, а потом 5:7,8. 9 глава. 10 стих. и :7. ст.5-6. *:8-9*, [5:7], в 5 стихе, в главе 6. Лк 5-6,8 и 7:9";

            var verseEntry = _stringParser.TryGetVerse(s, 0);

            AssertVerseEntry(verseEntry, 7, 12, VerseEntryType.BookChapterVerse);

            verseEntry = _stringParser.TryGetVerse(s, verseEntry.EndIndex + 1);
            AssertVerseEntry(verseEntry, 23, 25, VerseEntryType.ChapterVerse);

            verseEntry = _stringParser.TryGetVerse(s, verseEntry.EndIndex + 1);
            AssertVerseEntry(verseEntry, 27, 27, VerseEntryType.ChapterOrVerse);

            //verseEntry = _verseRecognitionService.TryGetVerse(s, verseEntry.EndIndex + 1);
            //AssertVerseEntry(verseEntry, 30, 36, VerseEntryType.Chapter);

            //verseEntry = _verseRecognitionService.TryGetVerse(s, verseEntry.EndIndex + 1);
            //AssertVerseEntry(verseEntry, 39, 45, VerseEntryType.Verse);

            verseEntry = _stringParser.TryGetVerse(s, verseEntry.EndIndex + 1);
            AssertVerseEntry(verseEntry, 50, 51, VerseEntryType.Verse);

            //verseEntry = _verseRecognitionService.TryGetVerse(s, verseEntry.EndIndex + 1);
            //AssertVerseEntry(verseEntry, 54, 59, VerseEntryType.Verse);

            verseEntry = _stringParser.TryGetVerse(s, verseEntry.EndIndex + 1);
            AssertVerseEntry(verseEntry, 63, 66, VerseEntryType.Verse, VerseEntryOptions.ImportantVerse);

            //verseEntry = _verseRecognitionService.TryGetVerse(s, verseEntry.EndIndex + 1);
            //AssertVerseEntry(verseEntry, 71, 73, VerseEntryType.ChapterVerse, VerseEntryOptions.InSquareBrackets);

            //verseEntry = _verseRecognitionService.TryGetVerse(s, verseEntry.EndIndex + 1);
            //AssertVerseEntry(verseEntry, 79, 85, VerseEntryType.Verse);

            //verseEntry = _verseRecognitionService.TryGetVerse(s, verseEntry.EndIndex + 1);
            //AssertVerseEntry(verseEntry, 90, 96, VerseEntryType.Chapter);

            verseEntry = _stringParser.TryGetVerse(s, verseEntry.EndIndex + 1);
            AssertVerseEntry(verseEntry, 99, 104, VerseEntryType.BookChapter);

            verseEntry = _stringParser.TryGetVerse(s, verseEntry.EndIndex + 1);
            AssertVerseEntry(verseEntry, 106, 106, VerseEntryType.ChapterOrVerse);

            verseEntry = _stringParser.TryGetVerse(s, verseEntry.EndIndex + 1);
            AssertVerseEntry(verseEntry, 110, 112, VerseEntryType.ChapterVerse);
        }
Beispiel #3
0
        public ParallelBibleInfo GetParallelBibleInfo(
            string baseModuleShortName,
            string parallelModuleShortName,
            BibleTranslationDifferences baseBookTranslationDifferences,
            BibleTranslationDifferences parallelBookTranslationDifferences,
            bool refreshCache = false)
        {
            var key = GetKey(baseModuleShortName, parallelModuleShortName);

            if (refreshCache || !_cache.TryGetValue(key, out ParallelBibleInfo result))
            {
                result = new ParallelBibleInfo();

                if (baseModuleShortName.ToLower() != parallelModuleShortName.ToLower())
                {
                    var verseFactory = new BibleTranslationDifferencesBaseVersesFormula.VerseFactory((s, bookIndex) =>
                    {
                        var verseEntry = _stringParser.TryGetVerse(s, 0);
                        if (verseEntry.VersePointerFound)
                        {
                            return(verseEntry.VersePointer.ToModuleVersePointer(false, bookIndex));
                        }
                        else
                        {
                            throw new NotSupportedException($"Verse formula is invalid: {s}");
                        }
                    });

                    var baseTranslationDifferencesEx     = new BibleTranslationDifferencesEx(baseBookTranslationDifferences, verseFactory);
                    var parallelTranslationDifferencesEx = new BibleTranslationDifferencesEx(parallelBookTranslationDifferences, verseFactory);

                    ProcessForBaseBookVerses(baseTranslationDifferencesEx, parallelTranslationDifferencesEx, result);
                    ProcessForParallelBookVerses(baseTranslationDifferencesEx, parallelTranslationDifferencesEx, result);
                }

                lock (_locker)
                {
                    if (!_cache.ContainsKey(key))
                    {
                        _cache.Add(key, result);
                    }
                    else
                    {
                        _cache[key] = result;
                    }
                }
            }

            return(result);
        }
Beispiel #4
0
        public VersePointer CreateVersePointer(string text)
        {
            var verseEntry = _stringParser.TryGetVerse(text, 0);

            if (verseEntry.VersePointerFound &&
                (verseEntry.EntryType == VerseEntryType.BookChapter || verseEntry.EntryType == VerseEntryType.BookChapterVerse) &&
                verseEntry.StartIndex == 0
                //&& verseEntry.EndIndex == text.Length - 1
                )
            {
                return(verseEntry.VersePointer);
            }

            return(null);
        }