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