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