internal Dictionary <string, Dictionary <string, ComparisonParagraphUnit> > GetComparisonParagraphUnits(Dictionary <string, Dictionary <string, ParagraphUnit> > xFileParagraphUnitsOriginal , Dictionary <string, Dictionary <string, ParagraphUnit> > xFileParagraphUnitsUpdated) { var comparisonFileParagraphUnits = new Dictionary <string, Dictionary <string, ComparisonParagraphUnit> >(); var iProgressCurrent = 0; var iProgressMaximum = xFileParagraphUnitsOriginal.Sum(xFileParagraphUnits => xFileParagraphUnits.Value.Count()); var errorMatchingFileLevel01 = false; var errorMatchingFileLevel = false; var errorMatchingFileLevelMessage = string.Empty; var errorMatchingParagraphLevel = false; #region | check for initial errors | foreach (var fileParagraphUnitOriginal in xFileParagraphUnitsOriginal) { if (!xFileParagraphUnitsUpdated.ContainsKey(fileParagraphUnitOriginal.Key)) { errorMatchingFileLevel = true; errorMatchingFileLevelMessage = string.Format( "Error: Structure mismatch; unable to locate the corresponding file : '{0}' in the updated file", fileParagraphUnitOriginal.Key); var fileNameOriginal = Path.GetFileName(fileParagraphUnitOriginal.Key); errorMatchingFileLevel01 = xFileParagraphUnitsUpdated.Select(kvp => Path.GetFileName(kvp.Key)).All(fileNameUpdated => string.Compare(fileNameOriginal, fileNameUpdated, StringComparison.OrdinalIgnoreCase) != 0); break; } var fileParagraphUnitUpdated = xFileParagraphUnitsUpdated[fileParagraphUnitOriginal.Key]; if ((from paragraphUnitOriginalPair in fileParagraphUnitOriginal.Value select paragraphUnitOriginalPair.Value into paragraphUnitOriginal let paragraphUnitUpdated = new ParagraphUnit(paragraphUnitOriginal.ParagraphUnitId, new List <SegmentPair>()) select paragraphUnitOriginal).Any(paragraphUnitOriginal => !fileParagraphUnitUpdated.ContainsKey(paragraphUnitOriginal.ParagraphUnitId))) { errorMatchingParagraphLevel = true; } } #endregion if (errorMatchingFileLevel01) { //not possible to compare these files; excluding the file path information, the file names are different... throw new Exception(errorMatchingFileLevelMessage); } if (errorMatchingFileLevel || errorMatchingParagraphLevel) { #region | compare structure missmatch | foreach (var fileParagraphUnitOriginal in xFileParagraphUnitsOriginal) { var fileName = Path.GetFileName(fileParagraphUnitOriginal.Key); var comparisonParagraphUnits = new Dictionary <string, ComparisonParagraphUnit>(); var fileParagraphUnitOriginalTmp = fileParagraphUnitOriginal.Value; var nameOriginal = Path.GetFileName(fileParagraphUnitOriginal.Key); var fileParagraphUnitUpdated = (from kvp in xFileParagraphUnitsUpdated let fileNameUpdated = Path.GetFileName(kvp.Key) where string.Compare(nameOriginal, fileNameUpdated, StringComparison.OrdinalIgnoreCase) == 0 select kvp.Value).FirstOrDefault(); if (fileParagraphUnitUpdated == null) { throw new Exception( string.Format( "Error: Structure mismatch; unable to locate the corresponding file : '{0}' in the updated file", fileParagraphUnitOriginal.Key)); } //update paragraph ids in the updated object xFileParagraphUnit_updated fileParagraphUnitUpdated = GetUpdatedParagraphsIds(fileParagraphUnitOriginalTmp, fileParagraphUnitUpdated); foreach (var paragraphUnitOriginalPair in fileParagraphUnitOriginalTmp) { OnProgress(iProgressMaximum, iProgressCurrent++, fileName); var comparisonParagraphUnit = new ComparisonParagraphUnit { ParagraphId = paragraphUnitOriginalPair.Key, ParagraphIsUpdated = false, ParagraphStatusChanged = false, ParagraphHasComments = false }; var paragraphUnitOriginal = paragraphUnitOriginalPair.Value; var paragraphUnitUpdated = new ParagraphUnit(paragraphUnitOriginal.ParagraphUnitId, new List <SegmentPair>()); if (fileParagraphUnitUpdated.ContainsKey(paragraphUnitOriginal.ParagraphUnitId)) { paragraphUnitUpdated = fileParagraphUnitUpdated[paragraphUnitOriginal.ParagraphUnitId]; } if (paragraphUnitUpdated != null) { if (paragraphUnitOriginal.SegmentPairs.Count >= paragraphUnitUpdated.SegmentPairs.Count) { #region | xParagraphUnit_original.xSegmentPairs.Count >= xParagraphUnit_updated.xSegmentPairs.Count | //if segment count has not changed (or greater than the segment count in the updated file) for (var i = 0; i < paragraphUnitOriginal.SegmentPairs.Count; i++) { var segmentPairOriginal = paragraphUnitOriginal.SegmentPairs[i]; var segmentPairUpdated = new SegmentPair(); if (paragraphUnitUpdated.SegmentPairs.Count > i) { segmentPairUpdated = paragraphUnitUpdated.SegmentPairs[i]; } var comparisonSegmentUnit = new ComparisonSegmentUnit(segmentPairOriginal.Id, segmentPairOriginal.SourceSections, segmentPairOriginal.TargetSections, segmentPairUpdated.TargetSections, segmentPairOriginal.IsLocked); AddToComparision(ref comparisonParagraphUnit, comparisonSegmentUnit, segmentPairOriginal, segmentPairUpdated); } #endregion } else if (paragraphUnitOriginal.SegmentPairs.Count < paragraphUnitUpdated.SegmentPairs.Count) { #region | xParagraphUnit_original.xSegmentPairs.Count < xParagraphUnit_updated.xSegmentPairs.Count | //if more segments now exist in the updated file for (var i = 0; i < paragraphUnitUpdated.SegmentPairs.Count; i++) { var segmentPairOriginal = new SegmentPair(); if (paragraphUnitOriginal.SegmentPairs.Count > i) { segmentPairOriginal = paragraphUnitOriginal.SegmentPairs[i]; } var segmentPairUpdated = paragraphUnitUpdated.SegmentPairs[i]; var comparisonSegmentUnit = new ComparisonSegmentUnit(segmentPairUpdated.Id, segmentPairOriginal.SourceSections, segmentPairOriginal.TargetSections, segmentPairUpdated.TargetSections, segmentPairOriginal.IsLocked); AddToComparision(ref comparisonParagraphUnit, comparisonSegmentUnit, segmentPairOriginal, segmentPairUpdated); } #endregion } } else { #region | else | foreach (var segmentPairOriginal in paragraphUnitOriginal.SegmentPairs) { var segmentPairUpdated = new SegmentPair(); var comparisonSegmentUnit = new ComparisonSegmentUnit(segmentPairOriginal.Id, segmentPairOriginal.SourceSections, segmentPairOriginal.TargetSections, segmentPairUpdated.TargetSections, segmentPairOriginal.IsLocked); AddToComparision(ref comparisonParagraphUnit, comparisonSegmentUnit, segmentPairOriginal, segmentPairUpdated); } #endregion } comparisonParagraphUnits.Add(comparisonParagraphUnit.ParagraphId, comparisonParagraphUnit); } comparisonFileParagraphUnits.Add(fileParagraphUnitOriginal.Key, comparisonParagraphUnits); } #endregion } else { #region | compare normal | foreach (var fileParagraphUnitOriginal in xFileParagraphUnitsOriginal) { var fileName = Path.GetFileName(fileParagraphUnitOriginal.Key); var comparisonParagraphUnits = new Dictionary <string, ComparisonParagraphUnit>(); if (!xFileParagraphUnitsUpdated.ContainsKey(fileParagraphUnitOriginal.Key)) { throw new Exception( string.Format( "Error: Structure mismatch; unable to locate the corresponding file : '{0}' in the updated file", fileParagraphUnitOriginal.Key)); } var fileParagraphUnitUpdated = xFileParagraphUnitsUpdated[fileParagraphUnitOriginal.Key]; foreach (var paragraphUnitOriginalPair in fileParagraphUnitOriginal.Value) { OnProgress(iProgressMaximum, iProgressCurrent++, fileName); var comparisonParagraphUnit = new ComparisonParagraphUnit { ParagraphId = paragraphUnitOriginalPair.Key, ParagraphIsUpdated = false, ParagraphStatusChanged = false, ParagraphHasComments = false }; var paragraphUnitOriginal = paragraphUnitOriginalPair.Value; ParagraphUnit paragraphUnitUpdated; if (fileParagraphUnitUpdated.ContainsKey(paragraphUnitOriginal.ParagraphUnitId)) { paragraphUnitUpdated = fileParagraphUnitUpdated[paragraphUnitOriginal.ParagraphUnitId]; } else { throw new Exception( string.Format( "Error: Structure mismatch; unable to locate the corresponding paragraph ID: '{0}' in the updated file", paragraphUnitOriginal.ParagraphUnitId)); } if (paragraphUnitOriginal.SegmentPairs.Count >= paragraphUnitUpdated.SegmentPairs.Count) { #region | xParagraphUnit_original.xSegmentPairs.Count >= xParagraphUnit_updated.xSegmentPairs.Count | //if segment count has not changed (or greater than the segment count in the updated file) for (var i = 0; i < paragraphUnitOriginal.SegmentPairs.Count; i++) { var segmentPairOriginal = paragraphUnitOriginal.SegmentPairs[i]; var segmentPairUpdated = new SegmentPair(); if (paragraphUnitUpdated.SegmentPairs.Count > i) { segmentPairUpdated = paragraphUnitUpdated.SegmentPairs[i]; } var comparisonSegmentUnit = new ComparisonSegmentUnit(segmentPairOriginal.Id, segmentPairOriginal.SourceSections, segmentPairOriginal.TargetSections, segmentPairUpdated.TargetSections, segmentPairOriginal.IsLocked); AddToComparision(ref comparisonParagraphUnit, comparisonSegmentUnit, segmentPairOriginal, segmentPairUpdated); } #endregion } else if (paragraphUnitOriginal.SegmentPairs.Count < paragraphUnitUpdated.SegmentPairs.Count) { #region | xParagraphUnit_original.xSegmentPairs.Count < xParagraphUnit_updated.xSegmentPairs.Count | //if more segments now exist in the updated file for (var i = 0; i < paragraphUnitUpdated.SegmentPairs.Count; i++) { var segmentPairOriginal = new SegmentPair(); if (paragraphUnitOriginal.SegmentPairs.Count > i) { segmentPairOriginal = paragraphUnitOriginal.SegmentPairs[i]; } var segmentPairUpdated = paragraphUnitUpdated.SegmentPairs[i]; var comparisonSegmentUnit = new ComparisonSegmentUnit(segmentPairUpdated.Id, segmentPairOriginal.SourceSections, segmentPairOriginal.TargetSections, segmentPairUpdated.TargetSections, segmentPairOriginal.IsLocked); AddToComparision(ref comparisonParagraphUnit, comparisonSegmentUnit, segmentPairOriginal, segmentPairUpdated); } #endregion } comparisonParagraphUnits.Add(comparisonParagraphUnit.ParagraphId, comparisonParagraphUnit); } comparisonFileParagraphUnits.Add(fileParagraphUnitOriginal.Key, comparisonParagraphUnits); } #endregion } return(comparisonFileParagraphUnits); }
internal Dictionary <string, ParagraphUnit> ReadRtf(string rtfFile) { var rtb = new RichTextBox { Enabled = false, LanguageOption = RichTextBoxLanguageOptions.AutoFont, ReadOnly = true, Visible = false, WordWrap = false, ShowSelectionMargin = false }; rtb.SendToBack(); rtb.SuspendLayout(); rtb.LoadFile(rtfFile, RichTextBoxStreamType.RichText); rtb.Rtf = rtb.Rtf.Replace("\\v\\", "\\v0\\"); rtb.AppendText("\n"); var indexProcessingCurrent = 0; OnProgress(1000, indexProcessingCurrent, "Initialzing..."); var paragraphUnits = new Dictionary <string, ParagraphUnit>(); var file = rtfFile; var fileAttributes = new FileAttributes(); var iTagId = 10000; var innerFileName = string.Empty; var regexFile = new Regex(@"\<file source\=""(?<x1>[^""]*)""\s+target\=""(?<x2>[^""]*)""\s+segmentCount\=""(?<x3>[^""]*)""\s+path\=""(?<x4>[^""]*)""[^\>]*\>", RegexOptions.IgnoreCase | RegexOptions.Singleline); var regexSeg = new Regex(@"\<seg id\=""(?<x1>[^""]*)""\s+pid\=""(?<x2>[^""]*)""\s+status\=""(?<x3>[^""]*)""\s+locked\=""(?<x4>[^""]*)""\s+match\=""(?<x5>[^""]*)""[^\>]*\>" + "\n" + @"(?<x6>.*?)" + "\n" + @"\<\/seg\>" + "\n", RegexOptions.IgnoreCase | RegexOptions.Singleline); var regexSource = new Regex(@"\{0\>(?<xSource>.*?)\<\}(?<xPercentage>[^\{]*)\{\>", RegexOptions.IgnoreCase | RegexOptions.Singleline); var matchFile = regexFile.Match(rtb.Text); if (matchFile.Success) { fileAttributes.FileSource = matchFile.Groups["x1"].Value; fileAttributes.FileTarget = matchFile.Groups["x2"].Value; fileAttributes.FileSegmentCount = matchFile.Groups["x3"].Value; fileAttributes.FilePath = matchFile.Groups["x4"].Value; } var matchesSeg = regexSeg.Matches(rtb.Text); foreach (Match matchSeg in matchesSeg) { #region | init | var isSource = false; var colorFormat = new StringColorType(); var sourceSections = new List <SegmentSection>(); var targetSections = new List <SegmentSection>(); var segmentPairs = new List <SegmentPair>(); var comments = new List <Comment>(); #endregion var segmentPair = new SegmentPair { Id = matchSeg.Groups["x1"].Value, ParagraphId = matchSeg.Groups["x2"].Value, SegmentStatus = Core.Processor.GetSegmentStatusFromVisual(matchSeg.Groups["x3"].Value), IsLocked = Convert.ToBoolean(matchSeg.Groups["x4"].Value), MatchTypeId = matchSeg.Groups["x5"].Value, Comments = comments }; var importTranslation = ImportTranslation(segmentPair); if (!importTranslation) { continue; } var content = matchSeg.Groups["x6"].Value; var paragraphUnit = new ParagraphUnit(segmentPair.ParagraphId, segmentPairs, innerFileName); var startIndex = matchSeg.Groups["x6"].Index; var endIndex = startIndex + content.Length; segmentPair.TranslationOrigin = new TranslationOrigin();; var matchSource = regexSource.Match(content); if (matchSource.Success) { var text = matchSource.Groups["xSource"].Value; var percentage = matchSource.Groups["xPercentage"].Value; if (colorFormat.Black != string.Empty) { sourceSections.Add(new SegmentSection(SegmentSection.ContentType.Text, string.Empty, text)); } segmentPair.Source = Core.Processor.GetSectionsToText(sourceSections); segmentPair.SourceSections = sourceSections; startIndex = startIndex + matchSource.Groups["xPercentage"].Index + percentage.Length + 2; var isTarget = true; for (var i = startIndex; i <= endIndex; i++) { rtb.SelectionStart = i; rtb.SelectionLength = 1; text = rtb.Text[i].ToString(); var color = rtb.SelectionColor; if (color == Color.Black) { if (colorFormat.Red != string.Empty) { UpdateTagFormatting(colorFormat, isSource ? sourceSections : targetSections); colorFormat.Red = string.Empty; colorFormat.Black = string.Empty; colorFormat.Purple = string.Empty; colorFormat.Gray = string.Empty; colorFormat.Black += text; } else { colorFormat.Black += text; } } else if (color == Color.Red) { colorFormat.Red += text; } else if (color == Color.Purple) { if (colorFormat.Red != string.Empty) { UpdateTagFormatting(colorFormat, isSource ? sourceSections : targetSections); colorFormat.Red = string.Empty; colorFormat.Black = string.Empty; colorFormat.Red = string.Empty; } colorFormat.Purple += text; if (!isTarget) { continue; } if (!colorFormat.Purple.Trim().EndsWith("<0}")) { continue; } if (colorFormat.Black != string.Empty) { targetSections.Add(new SegmentSection(SegmentSection.ContentType.Text, string.Empty, colorFormat.Black)); } isSource = false; isTarget = false; colorFormat.Black = string.Empty; colorFormat.Purple = string.Empty; colorFormat.Red = string.Empty; colorFormat.Gray = string.Empty; } else { //outside the scope of the markup; error colorFormat.Misc += text; } } if (colorFormat.Red != string.Empty) { UpdateTagFormatting(colorFormat, isSource ? sourceSections : targetSections); colorFormat.Red = string.Empty; colorFormat.Black = string.Empty; colorFormat.Red = string.Empty; } isSource = false; isTarget = false; colorFormat.Black = string.Empty; colorFormat.Purple = string.Empty; colorFormat.Red = string.Empty; MarkupTagContent(targetSections, ref iTagId); segmentPair.Target = Core.Processor.GetSectionsToText(targetSections); segmentPair.TargetSections = targetSections; paragraphUnit.SegmentPairs.Add(segmentPair); if (segmentPair.ParagraphId != string.Empty) { if (!paragraphUnits.ContainsKey(segmentPair.ParagraphId)) { paragraphUnits.Add(segmentPair.ParagraphId, paragraphUnit); } else { paragraphUnits[segmentPair.ParagraphId].SegmentPairs.AddRange(paragraphUnit.SegmentPairs); } } } indexProcessingCurrent++; OnProgress(matchesSeg.Count, indexProcessingCurrent, string.Format("Processing segment id: {0}", segmentPair.Id)); } return(paragraphUnits); }