Esempio n. 1
0
        public static string FormatHtmlDiff(string original, string updated)
        {
            if (original == null || updated == null)
            {
                return("");
            }

            var diffAlg = new Garland.UI.External.diff_match_patch();
            var diffs   = diffAlg.diff_lineModeCustom(original, updated, DateTime.MaxValue);

            diffAlg.diff_cleanupSemantic(diffs);

            if (diffs.Count <= 1)
            {
                return(WrapHtmlDiff("Files are identical."));
            }

            var html = new StringBuilder();

            foreach (var aDiff in diffs)
            {
                string text = aDiff.text
                              .Replace("&", "&amp;")
                              .Replace("<", "&lt;")
                              .Replace(">", "&gt;")
                              .Replace("\r\n", "<br>");

                if (string.IsNullOrEmpty(text))
                {
                    continue;
                }

                switch (aDiff.operation)
                {
                case Operation.INSERT:
                    html.Append(_startMarker)
                    .Append("<ins>")
                    .Append(text)
                    .Append("</ins>")
                    .Append(_endMarker);
                    break;

                case Operation.DELETE:
                    html.Append(_startMarker)
                    .Append("<del>")
                    .Append(text)
                    .Append("</del>")
                    .Append(_endMarker);
                    break;

                case Operation.EQUAL:
                    html.Append(text);
                    break;
                }
            }

            return(WrapHtmlDiff(CutNoncontextualLines(html.ToString())));
        }
Esempio n. 2
0
        public static string FormatDiff(string original, string updated)
        {
            var lineDelimiter = new string[] { "\r\n" };

            var sb            = new StringBuilder();
            var diffAlgorithm = new Garland.UI.External.diff_match_patch();
            //var diffList = diffAlgorithm.diff_main(original, updated);
            var diffList = diffAlgorithm.diff_lineModeCustom(original, updated, DateTime.MaxValue);

            diffAlgorithm.diff_cleanupSemantic(diffList);

            var diffs = diffList.ToArray();
            var hunks = new List <string>();

            for (var i = 0; i < diffs.Length; i++)
            {
                var diff = diffs[i];
                if (diff.operation == External.Operation.EQUAL)
                {
                    continue;
                }

                var isFirst = sb.Length == 0;

                var prevDiff      = diffs[i - 1];
                var prevDiffLines = prevDiff.text.TrimEnd().Split(lineDelimiter, StringSplitOptions.None);

                var nextDiff      = diffs[i + 1];
                var nextDiffLines = nextDiff.text.Split(lineDelimiter, StringSplitOptions.None);

                var prefix    = diff.operation == External.Operation.DELETE ? "- " : "+ ";
                var textLines = diff.text.TrimEnd().Split(lineDelimiter, StringSplitOptions.None);

                if (prevDiff.operation == External.Operation.EQUAL)
                {
                    sb.AppendLine(string.Join("\r\n", prevDiffLines.Reverse().Take(3).Reverse().Select(l => "  " + l)));
                }

                sb.AppendLine(string.Join("\r\n", textLines.Select(l => prefix + l)));

                if (nextDiff.operation == External.Operation.EQUAL)
                {
                    sb.AppendLine(string.Join("\r\n", nextDiffLines.Take(3).Select(l => "  " + l)));
                    hunks.Add(sb.ToString());
                    sb.Clear();
                }
            }

            if (sb.Length > 0)
            {
                hunks.Add(sb.ToString());
            }
            return(string.Join("========================================\r\n", hunks));
        }