/// <summary> /// The following member performs the actual verification. It traverses the segment pairs of the current document, /// and checks whether a particular segment has any numbers. It then determines whether /// the target and the source contains the same numbers. /// If not, a warning message will be generated, which is then displayed between the source and target segments, /// and in the Messages window of SDL Trados Studio. /// </summary> /// <param name="paragraphUnit"></param> public void CheckParagraphUnit(IParagraphUnit paragraphUnit) { // loop through the whole paragraph unit foreach (var segmentPair in paragraphUnit.SegmentPairs.Where(FilterSegmentPairs)) { var sourceText = GetSegmentText(segmentPair.Source); var targetText = GetSegmentText(segmentPair.Target); var errorMessageList = CheckSourceAndTarget(sourceText, targetText); #region ReportingMessage foreach (var errorMessage in errorMessageList) { if (errorMessage.ExtendedErrorMessage != string.Empty && VerificationSettings.ReportExtendedMessages) { var extendedMessageReporter = MessageReporter as IBilingualContentMessageReporterWithExtendedData; if (extendedMessageReporter != null) { #region CreateExtendedData var extendedData = new NumberVerifierMessageData(errorMessage.SourceNumberIssues, errorMessage.TargetNumberIssues, segmentPair.Target); #endregion #region ReportingMessageWithExtendedData extendedMessageReporter.ReportMessage(this, PluginResources.Plugin_Name, errorMessage.ErrorLevel, errorMessage.ExtendedErrorMessage, new TextLocation(new Location(segmentPair.Target, true), 0), new TextLocation(new Location(segmentPair.Target, false), segmentPair.Target.ToString().Length - 1), extendedData); #endregion } } else if (errorMessage.ErrorMessage != string.Empty) { #region ReportingMessageWithoutExtendedData MessageReporter.ReportMessage(this, PluginResources.Plugin_Name, errorMessage.ErrorLevel, errorMessage.ErrorMessage, new TextLocation(new Location(segmentPair.Target, true), 0), new TextLocation(new Location(segmentPair.Target, false), segmentPair.Target.ToString().Length - 1)); #endregion } } } }
private void ReportErrors(ISegmentPair segmentPair, List <ErrorReporting> errorMessages) { foreach (var errorMessage in errorMessages) { if (errorMessage.ExtendedErrorMessage != string.Empty && VerificationSettings.ReportExtendedMessages) { if (MessageReporter is IBilingualContentMessageReporterWithExtendedData extendedMessageReporter) { var messageDataModel = new MessageDataModel { SourceIssues = errorMessage.SourceNumberIssues?.Replace(Environment.NewLine, string.Empty), TargetIssues = errorMessage.TargetNumberIssues?.Replace(Environment.NewLine, string.Empty), ReplacementSuggestion = segmentPair.Target, InitialSourceIssues = errorMessage.InitialSourceNumber, InitialTargetIssues = errorMessage.InitialTargetNumber, ErrorMessage = errorMessage.ErrorMessage, IsHindiVerification = errorMessage.IsHindiVerification }; var extendedData = new NumberVerifierMessageData(messageDataModel); extendedMessageReporter.ReportMessage(this, PluginResources.Plugin_Name, errorMessage.ErrorLevel, errorMessage.ExtendedErrorMessage, new TextLocation(new Location(segmentPair.Target, true), 0), new TextLocation(new Location(segmentPair.Target, false), segmentPair.Target.ToString().Length - 1), extendedData); } } else if (errorMessage.ErrorMessage != string.Empty) { if (!string.IsNullOrEmpty(errorMessage.TargetNumberIssues)) { if (errorMessage.ErrorMessage == PluginResources.Error_AlphanumericsModified) { var alphaList = new List <string>(); List <string> alphaTargetList = new List <string>(); var alphanumericsText = Regex.Matches(errorMessage.TargetNumberIssues, @"^-?\u2212?(^(?=.*[a-zA-Z{0}])(?=.*[0-9]).+$)"); foreach (Match alphanumericText in alphanumericsText) { var words = Regex.Split(alphanumericText.Value, @"\s"); alphaList.AddRange( from word in words from Match match in Regex.Matches(word.Normalize(NormalizationForm.FormKC), @"^-?\u2212?(^(?=.*[a-zA-Z{0}])(?=.*[0-9]).+$)") select match.Value); foreach (var alphaElement in alphaList) { var alphanumericTarget = $@"""{alphaElement}"""; alphaTargetList.Add(alphanumericTarget); } var alphanumericRes = string.Join(", ", alphaTargetList.ToArray()); errorMessage.ErrorMessage = string.Concat(errorMessage.ErrorMessage, " (", alphanumericRes, ")"); } } else { var targetNumbers = new List <string>(); var numbers = Regex.Matches(errorMessage.TargetNumberIssues, @"[\+\-]?\s*[0-9\.\,]*[Ee]?[\+\-]?\d+", RegexOptions.Singleline); foreach (var value in numbers) { var targetNumber = $@"""{value}"""; targetNumbers.Add(targetNumber); } var res = string.Join(", ", targetNumbers.ToArray()); errorMessage.ErrorMessage = string.Concat(errorMessage.ErrorMessage, " (", res, ")"); } } MessageReporter.ReportMessage(this, PluginResources.Plugin_Name, errorMessage.ErrorLevel, errorMessage.ErrorMessage, new TextLocation(new Location(segmentPair.Target, true), 0), new TextLocation(new Location(segmentPair.Target, false), segmentPair.Target.ToString().Length - 1)); } } }
/// <summary> /// The following member performs the actual verification. It traverses the segment pairs of the current document, /// and checks whether a particular segment has any numbers. It then determines whether /// the target and the source contains the same numbers. /// If not, a warning message will be generated, which is then displayed between the source and target segments, /// and in the Messages window of SDL Trados Studio. /// </summary> /// <param name="paragraphUnit"></param> private void CheckParagraphUnit(IParagraphUnit paragraphUnit) { var sourceNumberList = new List <string>(); var targetNumberList = new List <string>(); var sourceNormalizedNumberList = new List <string>(); var targetNormalizedNumberList = new List <string>(); // loop through the whole paragraph unit foreach (var segmentPair in paragraphUnit.SegmentPairs.Where(FilterSegmentPairs)) { var sourceText = GetSegmentText(segmentPair.Source); var targetText = GetSegmentText(segmentPair.Target); // find all alphanumeric names in source and add to list var sourceAlphanumericsList = GetAlphanumericList(sourceText); // find all alphanumeric names in target and add to list var targetAlphanumericsList = GetAlphanumericList(targetText); // remove alphanumeric names found both in source and target from respective list RemoveMatchingAlphanumerics(sourceAlphanumericsList, targetAlphanumericsList); // find all numbers in source and add to list sourceNumberList.Clear(); sourceNormalizedNumberList.Clear(); NormalizeAlphanumerics(sourceText, sourceNumberList, sourceNormalizedNumberList, _sourceThousandSeparators, _sourceDecimalSeparators, VerificationSettings.SourceNoSeparator); // find all numbers in target and add to list targetNumberList.Clear(); targetNormalizedNumberList.Clear(); NormalizeAlphanumerics(targetText, targetNumberList, targetNormalizedNumberList, _targetThousandSeparators, _targetDecimalSeparators, VerificationSettings.TargetNoSeparator); // remove identical numbers found both in source and target from respective list RemoveIdenticalNumbers(sourceNumberList, targetNumberList, targetNormalizedNumberList, sourceNormalizedNumberList); // remove numbers found both in source and target from respective list disregarding difference in thousands and decimal separators RemoveNumbersIgnoreThousandsAndDecimalSeparators(sourceNumberList, targetNormalizedNumberList, sourceNormalizedNumberList, targetNumberList); // remove numbers found both in source and target from respective list disregarding difference when thousands and decimal separators are undefined due to ambiguity RemoveNumbersUndefinedThousandsAndDecimalSeparator(targetNumberList, sourceNumberList, sourceNormalizedNumberList, targetNormalizedNumberList); var errorLevel = ErrorLevel.Unspecified; var errorMessage = String.Empty; var extendedErrorMessage = String.Empty; // check if numbers have been modified and should be reported if (sourceNumberList.Count > 0 && targetNumberList.Count > 0 && VerificationSettings.ReportModifiedNumbers.Value) { switch (VerificationSettings.ModifiedNumbersErrorType.Value) { case "Error": errorLevel = ErrorLevel.Error; break; case "Warning": errorLevel = ErrorLevel.Warning; break; default: errorLevel = ErrorLevel.Note; break; } errorMessage = errorMessage + PluginResources.Error_NumbersNotIdentical; } // check if numbers have been added and should be reported if (sourceNumberList.Count < targetNumberList.Count && VerificationSettings.ReportAddedNumbers.Value) { if (VerificationSettings.AddedNumbersErrorType.Value == "Error") { errorLevel = ErrorLevel.Error; } else if (VerificationSettings.AddedNumbersErrorType.Value == "Warning" && errorLevel != ErrorLevel.Error) { errorLevel = ErrorLevel.Warning; } else if (errorLevel != ErrorLevel.Error && errorLevel != ErrorLevel.Warning) { errorLevel = ErrorLevel.Note; } errorMessage = errorMessage + PluginResources.Error_NumbersAdded; } // check if numbers have been removed and should be reported if (sourceNumberList.Count > targetNumberList.Count && VerificationSettings.ReportRemovedNumbers.Value) { if (VerificationSettings.RemovedNumbersErrorType.Value == "Error") { errorLevel = ErrorLevel.Error; } else if (VerificationSettings.RemovedNumbersErrorType.Value == "Warning" && errorLevel != ErrorLevel.Error) { errorLevel = ErrorLevel.Warning; } else if (errorLevel != ErrorLevel.Error && errorLevel != ErrorLevel.Warning) { errorLevel = ErrorLevel.Note; } errorMessage = errorMessage + PluginResources.Error_NumbersRemoved; } // check if alphanumeric names are mismatched and should be reported if ((targetAlphanumericsList.Count > 0 || sourceAlphanumericsList.Count > 0) && VerificationSettings.ReportModifiedAlphanumerics.Value) { if (VerificationSettings.ModifiedAlphanumericsErrorType.Value == "Error") { errorLevel = ErrorLevel.Error; } else if (VerificationSettings.ModifiedAlphanumericsErrorType.Value == "Warning" && errorLevel != ErrorLevel.Error) { errorLevel = ErrorLevel.Warning; } else if (errorLevel != ErrorLevel.Error && errorLevel != ErrorLevel.Warning) { errorLevel = ErrorLevel.Note; } errorMessage = errorMessage + PluginResources.Error_AlphanumericsModified; } // if there are any mismatched numbers or alphanumerics to report, output a warning message if (errorMessage == String.Empty) { continue; } // collate remaining numbers and put into string variables for reporting of details var sourceNumberIssues = String.Empty; if (sourceNumberList.Count > 0 && (VerificationSettings.ReportAddedNumbers.Value || VerificationSettings.ReportRemovedNumbers.Value || VerificationSettings.ReportModifiedNumbers.Value)) { sourceNumberIssues = sourceNumberList.Aggregate(sourceNumberIssues, (current, t) => current + (t + " \r\n")); } if (sourceAlphanumericsList.Count > 0 && VerificationSettings.ReportModifiedAlphanumerics.Value) { sourceNumberIssues = sourceAlphanumericsList.Aggregate(sourceNumberIssues, (current, t) => current + (t + " \r\n")); } var targetNumberIssues = String.Empty; if (targetNumberList.Count > 0 && (VerificationSettings.ReportAddedNumbers.Value || VerificationSettings.ReportRemovedNumbers.Value || VerificationSettings.ReportModifiedNumbers.Value)) { targetNumberIssues = targetNumberList.Aggregate(targetNumberIssues, (current, t) => current + (t + " \r\n")); } if (targetAlphanumericsList.Count > 0 && VerificationSettings.ReportModifiedAlphanumerics.Value) { targetNumberIssues = targetAlphanumericsList.Aggregate(targetNumberIssues, (current, t) => current + (t + " \r\n")); } if (VerificationSettings.ReportExtendedMessages == true) { extendedErrorMessage = "\r\n SOURCE: " + TextGeneratorProcessor.GetPlainText(segmentPair.Source, !VerificationSettings.ExcludeTagText.Value) + " \r\n TARGET: " + TextGeneratorProcessor.GetPlainText(segmentPair.Target, !VerificationSettings.ExcludeTagText.Value); } #region ReportingMessage var extendedMessageReporter = MessageReporter as IBilingualContentMessageReporterWithExtendedData; if (extendedMessageReporter != null) { #region CreateExtendedData var extendedData = new NumberVerifierMessageData(sourceNumberIssues, targetNumberIssues, segmentPair.Target); #endregion #region ReportingMessageWithExtendedData extendedMessageReporter.ReportMessage(this, PluginResources.Plugin_Name, errorLevel, errorMessage + extendedErrorMessage, new TextLocation(new Location(segmentPair.Target, true), 0), new TextLocation(new Location(segmentPair.Target, false), segmentPair.Target.ToString().Length - 1), extendedData); #endregion } else { #region ReportingMessageWithoutExtendedData MessageReporter.ReportMessage(this, PluginResources.Plugin_Name, errorLevel, errorMessage + extendedErrorMessage, new TextLocation(new Location(segmentPair.Target, true), 0), new TextLocation(new Location(segmentPair.Target, false), segmentPair.Target.ToString().Length - 1)); #endregion } } }