/// <summary> /// Определение является ли контент частью данного предложения и /// распределение сущностей между предложением и контентов в противном случае /// </summary> /// <param name="contentIndex">индекс контента</param> /// <param name="sentenceInfo">информация о корректируемом предложении</param> /// <param name="contentInfo">информация о корректируемом контенте</param> /// <param name="entityIndex">индекс сущности</param> private void DecomposeEntitiesAndContentToSentence(int contentIndex, CorrectedSentenceInfo sentenceInfo, CorrectedContentInfo contentInfo, ref int entityIndex) { ChildContent content = Children[contentIndex]; int notPotencialPartsShift = contentInfo.IsOnlyPotencialParts ? GetFullContentsLength(contentIndex, true) : 0; int contentStartPosition = content.StartPosition - notPotencialPartsShift; int contentEndPosition = contentStartPosition + content.GetFullLength(); List <Entity> contentEntities = new List <Entity>(); bool isShiftedContent = !contentInfo.IsOnlyPotencialParts || content.IsPotencialParentPart; bool isRemovedContent = false; if (isShiftedContent) { for (; entityIndex < sentenceInfo.SentenceItems.Entities.Length; ++entityIndex) { Entity entity = sentenceInfo.SentenceItems.Entities[entityIndex]; if (entity.PositionInfo.End <= contentStartPosition) { AddEntity(entity, contentInfo.CurrentEntityShift); continue; } else if (entity.PositionInfo.Start >= contentEndPosition) { break; } else if ((entity.PositionInfo.Start < contentStartPosition) && (contentEndPosition < entity.PositionInfo.End)) /// сущность полностью содержит контент - контент включаем в родителя { ++entityIndex; AddEntity(entity, contentInfo.CurrentEntityShift); RemoveChildContent(sentenceInfo, contentInfo, contentIndex); isRemovedContent = true; break; } else if ((contentStartPosition < entity.PositionInfo.Start) && (entity.PositionInfo.End < contentEndPosition)) { contentEntities.Add(entity); } #region [.defense.] else /// сущность пересекается с дочерним контентом - пропускаем такую сущность { ++entityIndex; } #endregion } } if (!isRemovedContent) { UpdateUnitsPosition(contentEntities, notPotencialPartsShift - content.TextStartPosition); content.SetEntitiesForContentAndChildren(contentEntities, contentInfo.IsOnlyPotencialParts); if (isShiftedContent) { contentInfo.CurrentEntityShift += content.GetFullLength(); } } }
/// <summary> /// Получение нового текста предложения /// </summary> /// <param name="sentenceItems">элементы предложения</param> /// <param name="contentInfo">информация о корректируемом контенте</param> /// <returns>новый текст предложения</returns> private string GetNewSentenceText(SentenceItems sentenceItems, CorrectedContentInfo contentInfo) { var sentenceInfo = new CorrectedSentenceInfo(sentenceItems); int entityIndex = 0; int startContentIndex = sentenceInfo.SentenceItems.ContentIndex - contentInfo.RemovedContentCount; int removedContentCountStart = contentInfo.RemovedContentCount; foreach (int index in GetContentIndexesInsideSentence(sentenceItems.Sentence, ref startContentIndex, contentInfo.RemovedContentLength)) { int removedContentCount = contentInfo.RemovedContentCount - removedContentCountStart; DecomposeEntitiesAndContentToSentence(index - removedContentCount, sentenceInfo, contentInfo, ref entityIndex); } for (int i = sentenceItems.Entities.Length - 1; i >= entityIndex; --i) { AddEntity(sentenceItems.Entities[i], contentInfo.CurrentEntityShift); } return(sentenceInfo.NewSentenceText.ToString()); }
/// <summary> /// Удаление дочернего контента /// </summary> /// <param name="sentenceInfo">информация о корректируемом предложении</param> /// <param name="contentInfo">информация о корректируемом контенте</param> /// <param name="contentIndex">индекс удаляемого контента</param> private void RemoveChildContent(CorrectedSentenceInfo sentenceInfo, CorrectedContentInfo contentInfo, int contentIndex) { ChildContent content = Children[contentIndex]; string contentText = content.GetFullText(); int startPosition = GetContentCorrectedStart(contentIndex) - (sentenceInfo.SentenceItems.Sentence.GetFullStartPosition() + contentInfo.RemovedContentLength); sentenceInfo.NewSentenceText.Insert(startPosition, contentText); foreach (var entity in content.Entities) { AddEntity(entity, -(startPosition + content.TextStartPosition - content.StartPosition)); } Children.RemoveAt(contentIndex); ++contentInfo.RemovedContentCount; contentInfo.RemovedContentLength += contentText.Length; }