private void AddErrorsForUnpairedItems(NumberTexts textAreas, bool isSource) { for (var i = 0; i < textAreas.Texts.Count; i++) { var visitedIndexes = isSource ? _visitedSourceIndexes : _visitedTargetIndexes; var message = isSource ? PluginResources.Error_NumbersRemoved : PluginResources.Error_NumberAdded; if (!visitedIndexes.Contains(i)) { textAreas.Texts[i].AddError(NumberText.ErrorLevel.SegmentPairLevel, message); } } }
private void Verify(out NumberTexts sourceNumberTexts, out NumberTexts targetNumberTexts, List <ExcludedRange> sourceExcludedRanges, List <ExcludedRange> targetExcludedRanges) { sourceNumberTexts = new NumberTexts(_sourceText, GetNumberFormattingSettings(true, sourceExcludedRanges)); targetNumberTexts = new NumberTexts(_targetText, GetNumberFormattingSettings(false, targetExcludedRanges)); if (_settings.CheckInOrder) { CheckAlignment(sourceNumberTexts, targetNumberTexts); } else { CrossCheck(sourceNumberTexts, targetNumberTexts); } }
private void CrossCheck(NumberTexts sourceTextAreas, NumberTexts targetTextAreas) { _visitedTargetIndexes = new List <int>(); _visitedSourceIndexes = new List <int>(); var crossComparisons = new List <ComparisonItem>(); for (var i = 0; i < targetTextAreas.Texts.Count; i++) { var sourceIndexList = sourceTextAreas.IndexesOf(targetTextAreas[i]); sourceIndexList.ForEach(sourceIndex => crossComparisons.Add(new ComparisonItem { SourceIndex = sourceIndex.Item1, TargetIndex = i, Comparer = sourceIndex.Item2 })); } crossComparisons = crossComparisons.OrderByDescending(i => i.Comparer.SimilarityDegree).ToList(); var actualComparisonScores = crossComparisons.Select(cc => cc.Comparer.SimilarityDegree).Distinct(); foreach (var score in actualComparisonScores) { var comparisonsOfCurrentResult = crossComparisons.Where(cc => cc.Comparer.SimilarityDegree == score).ToList(); if (!comparisonsOfCurrentResult.Any()) { continue; } //group comparisons by the element toBeCompared var grouped = comparisonsOfCurrentResult.GroupBy(c => c.TargetIndex); foreach (var group in grouped) { //since comparisonResults are ordered descendingly, the first in the group should be of highest similarity -> compare against that one var first = group.FirstOrDefault(IndexesNotVisisted); if (first == null) { continue; } AddError(targetTextAreas[first.TargetIndex], first.Comparer); UpdateVisitedList(first.SourceIndex, first.TargetIndex); } } AddErrorsForUnpairedItems(sourceTextAreas, true); AddErrorsForUnpairedItems(targetTextAreas, false); }
private void CheckAlignment(NumberTexts sourceTextAreas, NumberTexts targetTextAreas) { for (var i = 0; i < sourceTextAreas.Texts.Count; i++) { if (i >= targetTextAreas.Texts.Count) { var message = PluginResources.Error_NumbersRemoved; sourceTextAreas[i].AddError(NumberText.ErrorLevel.SegmentPairLevel, message); continue; } var sourceTargetComparison = sourceTextAreas[i].Compare(targetTextAreas[i]); AddError(targetTextAreas[i], sourceTargetComparison); } for (var i = sourceTextAreas.Texts.Count; i < targetTextAreas.Texts.Count; i++) { targetTextAreas[i].AddError(NumberText.ErrorLevel.SegmentPairLevel, PluginResources.Error_NumberAdded); } }
public void Verify(string sourceText, string targetText, INumberVerifierSettings settings, out NumberTexts sourceNumberTexts, out NumberTexts targetNumberTexts, List <ExcludedRange> sourceExcludedRanges = null, List <ExcludedRange> targetExcludedRanges = null) { _settings = settings; _sourceText = sourceText?.Normalize(System.Text.NormalizationForm.FormKC); _targetText = targetText?.Normalize(System.Text.NormalizationForm.FormKC); if (_sourceText is null && _targetText is null) { sourceNumberTexts = null; targetNumberTexts = null; return; } _sourceThousandSeparators = GetAllowedThousandSeparators(true); _sourceDecimalSeparators = GetAllowedDecimalSeparators(true).Select(Regex.Unescape).ToList(); _targetThousandSeparators = GetAllowedThousandSeparators(false); _targetDecimalSeparators = GetAllowedDecimalSeparators(false).Select(Regex.Unescape).ToList(); _sourceNumberAreaSeparatorsList = GetSourceNumberAreaSeparators(); _targetNumberAreaSeparatorsList = GetTargetNumberAreaSeparators(); Verify(out sourceNumberTexts, out targetNumberTexts, sourceExcludedRanges, targetExcludedRanges); }