コード例 #1
0
ファイル: Comparer.cs プロジェクト: zebraone/Sdl-Community
        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);
        }
コード例 #2
0
        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);
        }