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