예제 #1
0
        /// <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
                    }
                }
            }
        }
예제 #2
0
        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));
                }
            }
        }
예제 #3
0
        /// <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
                }
            }
        }