/// <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;
        }
        /// <summary>
        /// Получение нового параграфа
        /// </summary>
        /// <param name="sentenceItemsCollection">коллекция элементов предложений</param>
        /// <param name="startPosition">начальная позиция</param>
        /// <param name="contentInfo">информация о корректируемом контенте</param>
        /// <returns>новый параграф</returns>
        private Paragraph GetNewParagraph(IEnumerable <SentenceItems> sentenceItemsCollection,
                                          int startPosition, CorrectedContentInfo contentInfo)
        {
            List <TextParsing.Sentence> sentences = new List <TextParsing.Sentence>();

            int sentenceStartPosition = 0;

            foreach (var sentenceItems in sentenceItemsCollection)
            {
                var sentence = new TextParsing.Sentence(GetNewSentenceText(sentenceItems, contentInfo), sentenceStartPosition);
                sentences.Add(sentence);
                sentenceStartPosition = sentence.EndPosition;
            }

            Paragraph result = new Paragraph(sentences.GetText(), startPosition);

            result.SetSentences(sentences);
            return(result);
        }
        /// <summary>
        /// Задание сущностей для контента и дочерних частей
        /// </summary>
        /// <param name="isOnlyPotencial">флаг, что нужно выбирать только потенциальные части</param>
        /// <param name="entities">коллекция сущностей</param>
        public void SetEntitiesForContentAndChildren(IEnumerable <Entity> entities, bool isOnlyPotencial = true)
        {
            int sentenceIndex          = 0;
            var sentenceItems          = GetSentencesItems(GetSentencesWithChildrenParts(isOnlyPotencial), entities);
            int paragraphStartPosition = 0;
            var correctedContentInfo   = new CorrectedContentInfo()
            {
                IsOnlyPotencialParts = isOnlyPotencial
            };

            for (int i = 0; i < _paragraphs.Length; ++i)
            {
                var paragraphSentenceItems = sentenceItems.GetRange(sentenceIndex, _paragraphs[i].Sentences.Length);
                sentenceIndex         += _paragraphs[i].Sentences.Length;
                _paragraphs[i]         = GetNewParagraph(paragraphSentenceItems, paragraphStartPosition, correctedContentInfo);
                paragraphStartPosition = _paragraphs[i].EndPosition;
            }
            SetFullText(_paragraphs.GetText());
        }