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("&", "&") .Replace("<", "<") .Replace(">", ">") .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()))); }
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)); }