/// <summary> /// Получение вопросительного слова из подпредложения /// </summary> /// <param name="subSentence">подпредложение</param> /// <returns>вопросительное слово</returns> private Entity GetQuestionWord(SubSentence subSentence) { #region [.defense.] if (subSentence == null) { throw new ArgumentNullException("subSentence"); } #endregion Entity result = null; UnitTextBase unit = subSentence.Units.FirstOrDefault(_ => !_.IsEmptyText()); if ((unit != null) && unit.IsEntity) { Entity entity = (Entity)unit; if (entity.IsType(EntityType.Pretext)) { unit = unit.GetNonEmptyNext(); if (unit.IsEntity) { entity = (Entity)unit; } else { entity = null; } } if ((entity != null) && IsQuestionWord(entity)) { result = entity; } } return(result); }
/// <summary> /// Проверка, что между двумя юнитами есть однородный союз /// </summary> /// <param name="begin">начало интервала</param> /// <param name="end">конец интервала</param> /// <returns>результат проверки</returns> private bool IsHomogeneousConjunctionBetween(UnitTextBase begin, UnitTextBase end) { UnitTextBase current = begin; while ((current != null) && (current != end)) { if (DictionaryResource.IsHomogeneousConjunction(current.Text)) { return(true); } current = current.GetNonEmptyNext(); } return(false); }
/// <summary> /// Проверка, что заданный юнит является разделителем подпредложений /// </summary> /// <param name="unit">юнит</param> /// <returns>результат проверки</returns> private bool IsSubSentenceSeparator(UnitTextBase unit) { if (unit.IsSeparator(c_subSentenceSeparators)) { UnitTextBase previous = unit.GetNonEmptyPrevious(); UnitTextBase next = unit.GetNonEmptyNext(); if (IsNumericWithoutSeparator(previous, unit.Text) && IsNumericWithoutSeparator(next, unit.Text)) { return(false); } return(true); } return(false); }
/// <summary> /// Создание нового подпредложения /// </summary> /// <param name="last">последний юнит текущего подпредложения</param> public void CreateNewSubSentence(UnitTextBase last, bool isStrongPosition = false) { var separateUnit = isStrongPosition ? GetNextNearUnitSkipEmpty(last) : last.GetNonEmptyNext(); CurrentSubSentence.SubSentence.SetSubSentenceUnits(CurrentSubSentence.StartUnit, separateUnit); _subSentenceInfoList.Add(CurrentSubSentence); if (separateUnit != null) { CurrentSubSentence = new SubSentenceInfo(separateUnit, separateUnit.PositionInfo.Start); } else { CurrentSubSentence = null; } }
/// <summary> /// Проверка, что текущее подпредложение должно быть частью предыдущего подпредложения /// </summary> /// <param name="previous">предыдущее подпредложение</param> /// <param name="lastAdded">последнее добавленное подпредложение</param> /// <returns>результат проверки</returns> private bool IsCurrentPartOfPrevious(SubSentenceInfo previous, SubSentenceInfo lastAdded) { if ((previous != null) && !CurrentSubSentence.IsExistSubject()) { bool isPossiblePart = true; if (previous == lastAdded) { UnitTextBase firstUnit = CurrentSubSentence.SubSentence.Units.FirstOrDefault(_ => !_.IsEmptyText()); if ((firstUnit != null) && !DictionaryResource.IsHomogeneousConjunction(firstUnit.Text)) /// подпредложения не будут соединены { isPossiblePart = false; UnitTextBase secondUnit = firstUnit.GetNonEmptyNext(); if (IsAnyType(previous.SubSentence, SubSentenceType.Subordinate) && !(CurrentSubSentence.IsContainConjunction || (firstUnit.IsSeparator(",") && (secondUnit != null) && DictionaryResource.IsHomogeneousConjunction(secondUnit.Text)))) /// не пытаемся восстановить подлежащее { return(false); } } } if (IsAnyType(previous.SubSentence, SubSentenceType.Default, SubSentenceType.Subordinate)) { if (IsCurrentSubject(previous.SubSentence.Subject)) { if (CurrentSubSentence.IsContainConjunction || (CurrentSubSentence.IsExistVerb() && previous.IsExistVerb())) { CurrentSubSentence.SubSentence.set_SubjectSubSentence(previous.SubSentence); } else { return(isPossiblePart); } } } else if (!CurrentSubSentence.IsContainConjunction) { return(isPossiblePart && IsCurrentPartOfPrevious(previous)); } } return(false); }