Ejemplo n.º 1
0
        private void UpdateLinkNode(IXmlNode node, VerseEntry verseEntry)
        {
            var hrefAttrName  = "href"; // todo: а может быть такое, что в провайдере другой атрибут используется для ссылок?
            var hrefAttrValue = this.verseLinkService.GetVerseLink(verseEntry.VersePointer);

            node.SetAttributeValue(hrefAttrName, hrefAttrValue);
        }
        /// <summary>
        /// Например, ":5"
        /// </summary>
        /// <param name="verseEntry"></param>
        /// <param name="docParseContext"></param>
        /// <returns></returns>
        private static bool VerseRule(VerseEntry verseEntry, IDocumentParseContext docParseContext)
        {
            var latestVp = docParseContext.CurrentParagraph.LatestVerseEntry?.VersePointer;

            if (latestVp == null)
            {
                var chapterEntry = docParseContext.CurrentParagraph.GetHierarchyChapterEntry()
                                   ?? docParseContext.CurrentHierarchy?.GetHierarchyChapterEntry();

                if (chapterEntry?.Found == true)
                {
                    latestVp = chapterEntry.ChapterPointer;
                }
                else if (docParseContext.TitleChapter?.Found == true)
                {
                    latestVp = docParseContext.TitleChapter.ChapterPointer;
                }
            }

            if (latestVp != null && latestVp.MultiVerseType <= MultiVerse.OneChapter)
            {
                verseEntry.VersePointer.Book            = latestVp.Book;
                verseEntry.VersePointer.ModuleShortName = latestVp.ModuleShortName;

                var latestTopChapter = string.IsNullOrEmpty(latestVp.ModuleShortName) ? latestVp.MostTopChapter : latestVp.OriginalMostTopChapter;
                verseEntry.VersePointer.SetChapter(latestTopChapter);
                return(true);
            }

            return(false);
        }
Ejemplo n.º 3
0
        private VerseEntry TryGetVerseEntry(string text, int startIndex, int indexOfDigit, bool useCommaDelimiter)
        {
            var textFragmentInfo = GetTextFragmentInfo(text, startIndex, indexOfDigit, useCommaDelimiter);

            CheckTextFragment(textFragmentInfo, text, useCommaDelimiter);

            if (textFragmentInfo.IsEmpty)
            {
                return new VerseEntry()
                       {
                           EntryType = VerseEntryType.None
                       }
            }
            ;

            var result = new VerseEntry()
            {
                EntryType    = textFragmentInfo.EntryType,
                EntryOptions = textFragmentInfo.GetEntryOptions(),
                StartIndex   = textFragmentInfo.Boundaries.StartIndex,
                EndIndex     = textFragmentInfo.Boundaries.EndIndex,
                VersePointer = new VersePointer(
                    textFragmentInfo.BibleBookInfo,
                    textFragmentInfo.ModuleName,
                    textFragmentInfo.GetVerseText(),
                    textFragmentInfo.VerseNumber,
                    textFragmentInfo.TopVerseNumber)
            };

            return(result);
        }
        /// <summary>
        /// Например, "; 5"
        /// </summary>
        /// <param name="verseEntry"></param>
        /// <param name="docParseContext"></param>
        /// <returns></returns>
        private static bool ChapterRule(VerseEntry verseEntry, IDocumentParseContext docParseContext)
        {
            if (docParseContext.CurrentParagraph.LatestVerseEntry != null)
            {
                var latestVp = docParseContext.CurrentParagraph.LatestVerseEntry.VersePointer;
                verseEntry.VersePointer.Book            = latestVp.Book;
                verseEntry.VersePointer.ModuleShortName = latestVp.ModuleShortName;
                return(true);
            }

            return(false);
        }
Ejemplo n.º 5
0
        private void AssertVerseEntry(
            VerseEntry verseEntryInfo,
            int startIndex,
            int endIndex,
            VerseEntryType verseEntryType,
            VerseEntryOptions?verseEntryOptions = null)
        {
            Assert.AreEqual(startIndex, verseEntryInfo.StartIndex);
            Assert.AreEqual(endIndex, verseEntryInfo.EndIndex);
            Assert.AreEqual(verseEntryType, verseEntryInfo.EntryType);

            if (verseEntryOptions.HasValue)
            {
                Assert.AreEqual(verseEntryOptions.Value, verseEntryInfo.EntryOptions);
            }
        }
        public bool TryRecognizeVerse(VerseEntry verseEntry, IDocumentParseContext docParseContext)
        {
            if (!verseEntry.VersePointerFound)
            {
                return(false);
            }

            foreach (var func in _funcs[verseEntry.EntryType])
            {
                if (func(verseEntry, docParseContext))
                {
                    return(_verseCorrectionService.CheckAndCorrectVerse(verseEntry.VersePointer));
                }
            }

            return(false);
        }
Ejemplo n.º 7
0
        private void InsertVerseLink(VerseInNodeEntry verseInNodeEntry, VerseEntry verseEntry)
        {
            var verseLink = documentProvider.GetVersePointerLink(verseEntry.VersePointer);

            var verseInNodeStartIndex = verseInNodeEntry.StartIndex + verseInNodeEntry.NodeEntry.Shift;
            var verseInNodeEndIndex   = verseInNodeEntry.EndIndex + verseInNodeEntry.NodeEntry.Shift + 1;

            verseInNodeEntry.NodeEntry.Node.InnerXml = string.Concat(
                verseInNodeEntry.NodeEntry.Node.InnerXml.Substring(0, verseInNodeStartIndex),
                verseLink,
                verseInNodeEndIndex < verseInNodeEntry.NodeEntry.Node.InnerXml.Length
                    ? verseInNodeEntry.NodeEntry.Node.InnerXml.Substring(verseInNodeEndIndex)
                    : string.Empty);

            var shift = verseLink.Length - verseEntry.VersePointer.OriginalVerseName.Length;

            verseInNodeEntry.NodeEntry.Shift += shift;
        }
Ejemplo n.º 8
0
        public VerseEntry TryGetVerse(string text, int startIndex, int leftBoundary, bool useCommaDelimiter)
        {
            VerseEntry result = null;

            var maxBookNameLength = _applicationManager.CurrentModuleInfo.MaxBookNameLength - 2;
            var indexOfDigit      = StringUtils.GetNextIndexOfDigit(text, startIndex);

            while (indexOfDigit != -1)
            {
                if (EntryIsLikeVerse(text, indexOfDigit, useCommaDelimiter))
                {
                    var actualStringStartIndex = indexOfDigit - maxBookNameLength;
                    if (actualStringStartIndex < leftBoundary)
                    {
                        actualStringStartIndex = leftBoundary;
                    }

                    result = TryGetVerseEntry(text, actualStringStartIndex, indexOfDigit, useCommaDelimiter);
                }

                if (result != null && result.VersePointerFound)
                {
                    break;
                }
                else
                {
                    indexOfDigit = StringUtils.GetNextIndexOfDigit(text, indexOfDigit + 1);
                }
            }

            if (result == null)
            {
                result = new VerseEntry()
                {
                    EntryType = VerseEntryType.None
                }
            }
            ;

            return(result);
        }
        /// <summary>
        /// Например, ",5-6"
        /// </summary>
        /// <param name="verseEntry"></param>
        /// <param name="docParseContext"></param>
        /// <returns></returns>
        private static bool ChapterOrVerseRule(VerseEntry verseEntry, IDocumentParseContext docParseContext)
        {
            if (docParseContext.CurrentParagraph.LatestVerseEntry != null &&
                StringUtils.CheckDivergence(docParseContext.CurrentParagraph.ParseResult.Text, docParseContext.CurrentParagraph.LatestVerseEntry.EndIndex, verseEntry.StartIndex, 2, ','))
            {
                var latestVp = docParseContext.CurrentParagraph.LatestVerseEntry.VersePointer;

                verseEntry.VersePointer.Book            = latestVp.Book;
                verseEntry.VersePointer.ModuleShortName = latestVp.ModuleShortName;
                verseEntry.EntryType = latestVp.VerseNumber.IsChapter
                    ? VerseEntryType.Chapter
                    : VerseEntryType.Verse;

                var latestTopChapter = string.IsNullOrEmpty(latestVp.ModuleShortName) ? latestVp.MostTopChapter : latestVp.OriginalMostTopChapter;

                if (verseEntry.EntryType == VerseEntryType.Verse)
                {
                    verseEntry.VersePointer.MoveChapterToVerse(latestTopChapter);

                    var latestTopVerse = string.IsNullOrEmpty(latestVp.ModuleShortName) ? latestVp.MostTopVerse : latestVp.OriginalMostTopVerse;
                    if (verseEntry.VersePointer.Verse <= latestTopVerse)
                    {
                        return(false);
                    }
                }
                else
                {
                    if (verseEntry.VersePointer.Chapter <= latestTopChapter)
                    {
                        return(false);
                    }
                }

                return(true);
            }

            return(false);
        }
Ejemplo n.º 10
0
        public void SetLatestVerseEntry(VerseEntry verseEntry)
        {
            LatestVerseEntry = verseEntry;

            ParseResult.VersesCount += verseEntry.VersePointer.SubVerses.VersesCount;
        }
Ejemplo n.º 11
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="parseString"></param>
        /// <param name="verseEntryInfo"></param>
        /// <param name="skipNodes">Чтобы не проверять строку с начала</param>
        /// <returns></returns>
        private VerseInNodeEntry FindNodeAndMoveVerseTextInOneNodeIfNotReadonly(TextNodesString parseString, VerseEntry verseEntryInfo, ref int skipNodes)
        {
            var result = new VerseInNodeEntry();

            if (parseString.NodesInfo.Count > 1)
            {
                foreach (var nodeEntry in parseString.NodesInfo.Skip(skipNodes))
                {
                    if (result.NodeEntry == null)
                    {
                        if (nodeEntry.StartIndex <= verseEntryInfo.StartIndex && verseEntryInfo.StartIndex <= nodeEntry.EndIndex)
                        {
                            if (!nodeEntry.WasCleaned)
                            {
                                nodeEntry.Clean();  // то есть, если в этой ноде есть стих, тогда мы можем немного её почистить. Чтобы другие ноды не изменять.
                            }
                            result.NodeEntry  = nodeEntry;
                            result.StartIndex = verseEntryInfo.StartIndex - nodeEntry.StartIndex;
                            result.EndIndex   = (nodeEntry.EndIndex >= verseEntryInfo.EndIndex ? verseEntryInfo.EndIndex : nodeEntry.EndIndex) - nodeEntry.StartIndex;

                            if (this.docParseContext.DocumentId.IsReadonly || parseString.IsReadonly)
                            {
                                break;
                            }

                            if (nodeEntry.EndIndex >= verseEntryInfo.EndIndex)
                            {
                                break;
                            }
                        }
                    }
                    else
                    {
                        if (!nodeEntry.WasCleaned)
                        {
                            nodeEntry.Clean();
                        }

                        var moveCharsCount = (verseEntryInfo.EndIndex > nodeEntry.EndIndex ? nodeEntry.EndIndex : verseEntryInfo.EndIndex) - nodeEntry.StartIndex + 1;
                        var verseTextPart  = nodeEntry.Node.InnerXml.Substring(0, moveCharsCount);
                        result.EndIndex                += moveCharsCount;
                        nodeEntry.StartIndex           += moveCharsCount; // здесь может быть ситуация, когда Startindex > EndIndex. Когда нода была из одного символа. Похоже, что это нормально. Так как мы больше нигде не используем эти ноды.
                        result.NodeEntry.Node.InnerXml += verseTextPart;
                        nodeEntry.Node.InnerXml         = nodeEntry.Node.InnerXml.Remove(0, moveCharsCount);

                        if (verseEntryInfo.EndIndex <= nodeEntry.EndIndex)
                        {
                            break;
                        }
                    }
                    skipNodes++;
                }
            }
            else
            {
                result.NodeEntry  = parseString.NodesInfo.First();
                result.StartIndex = verseEntryInfo.StartIndex;
                result.EndIndex   = verseEntryInfo.EndIndex;

                if (!result.NodeEntry.WasCleaned)
                {
                    result.NodeEntry.Clean();
                }
            }

            return(result);
        }
 private static bool FullVerseRule(VerseEntry verseEntry, IDocumentParseContext docParseContext)
 {
     return(true);
 }