public static List <Diff> GenerateDiffCache(string textA, string textB) { diff_match_patch dmp = new diff_match_patch(); (string chars1, string chars2, List <string> lines)a = dmp.diff_linesToChars(textA, textB); List <Diff> diffs = dmp.diff_main(a.chars1, a.chars2, true); // Convert the diff back to original text. dmp.diff_charsToLines(diffs, a.lines); // Eliminate freak matches (e.g. blank lines) // dmp.diff_cleanupSemantic(diffs); return(diffs); }
public static string GetDiffMessage(object currentSnapshot, object newSnapshot) { var currentSnapshotJObject = JObjectHelper.FromObject(currentSnapshot); var newSnapshotJObject = JObjectHelper.FromObject(newSnapshot); var dmp = new diff_match_patch(); var a = dmp.diff_linesToChars(currentSnapshotJObject.ToString(), newSnapshotJObject.ToString()); var lineText1 = (string)a[0]; var lineText2 = (string)a[1]; var lineArray = (List <string>)a[2]; var diffs = dmp.diff_main(lineText1, lineText2, false); dmp.diff_charsToLines(diffs, lineArray); dmp.diff_cleanupEfficiency(diffs); var builder = new StringBuilder(Environment.NewLine); builder.AppendLine("Snapshots do not match"); builder.AppendLine(RemovedLegendString); builder.AppendLine(AddedLegendString); builder.AppendLine(Environment.NewLine); for (var i = 0; i < diffs.Count; i++) { var diff = diffs[i]; var lines = GetLines(diff.text); switch (diff.operation) { case Operation.DELETE: lines.ForEach(l => builder.AppendLine($"- {l}")); break; case Operation.INSERT: lines.ForEach(l => builder.AppendLine($"+ {l}")); break; case Operation.EQUAL: GetEqualLines(lines, i == 0, i == diffs.Count - 1).ForEach(l => builder.AppendLine(l)); break; } } return(builder.ToString()); }
private void ShowDifferencesInBrowser(string build1Text, string build2Text) { var diff = new diff_match_patch(); var linesResult = diff.diff_linesToChars(build1Text, build2Text); var lineText1 = linesResult[0]; var lineText2 = linesResult[1]; var lineArray = linesResult[2] as List <string>; var diffs = diff.diff_main(lineText1.ToString(), lineText2.ToString(), true); diff.diff_charsToLines(diffs, lineArray); var diffPrettyHtml = diff.diff_prettyHtmlSidebySide(diffs); var mydocpath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); using (var outputFile = new StreamWriter(mydocpath + @"\CompareBuilds.html")) { outputFile.WriteLine(diffPrettyHtml); } Process.Start("IExplore.exe", mydocpath + @"\CompareBuilds.html"); }
private void GenerateDiff(MarkdownPage page, string newPage) { var diffEngine = new diff_match_patch(); var a = diffEngine.diff_linesToChars(page.Content, newPage); var text1 = (string)a[0]; var text2 = (string)a[1]; var lineArray = (List <string>)a[2]; var diff = diffEngine.diff_main(text1, text2, false); diffEngine.diff_charsToLines(diff, lineArray); diffEngine.diff_cleanupSemantic(diff); var htmlDiff = diffEngine.diff_prettyHtml(diff); Frame.Navigate(typeof(ImportDiffPage), Tuple.Create(diff, Page.Id)); }
private static string GetDiffMessage(JToken old, JToken @new) { var dmp = new diff_match_patch(); var a = dmp.diff_linesToChars(old.ToString(), @new.ToString()); var lineText1 = (string)a[0]; var lineText2 = (string)a[1]; var lineArray = (List <string>)a[2]; var diffs = dmp.diff_main(lineText1, lineText2, false); dmp.diff_charsToLines(diffs, lineArray); dmp.diff_cleanupEfficiency(diffs); var builder = new StringBuilder("\n"); builder.AppendLine("- Snapshot"); builder.AppendLine("+ Receieved\n\n"); for (var i = 0; i < diffs.Count; i++) { var diff = diffs[i]; var lines = GetLines(diff.text); switch (diff.operation) { case Operation.DELETE: lines.ForEach(l => builder.AppendLine($"- {l}")); break; case Operation.INSERT: lines.ForEach(l => builder.AppendLine($"+ {l}")); break; case Operation.EQUAL: GetEqualLines(lines, i == 0, i == diffs.Count - 1).ForEach(l => builder.AppendLine(l)); break; } } return(builder.ToString()); }
/// <summary> /// The compare. /// </summary> /// <param name="leftString"> /// The left string. /// </param> /// <param name="rightString"> /// The right string. /// </param> private static void Compare(ref string leftString, ref string rightString) { var diffMatchPatchWorker = new diff_match_patch(); var result = diffMatchPatchWorker.diff_linesToChars(leftString, rightString); var stringHash = result[2] as List <string>; var diffs = diffMatchPatchWorker.diff_main(result[0] as string, result[1] as string, false); leftString = string.Empty; rightString = string.Empty; // white space to patch int whiteSpaceCountToPatch = 0; // insert delete or delete insert match bool nextDiffMatch = false; for (int i = 0; i < diffs.Count; i++) { var diff = diffs[i]; char[] indexArray = diff.text.ToCharArray(); if (diff.operation == Operation.INSERT) { if (nextDiffMatch) { AddStringAndPatch(0 - whiteSpaceCountToPatch, ref rightString, ref leftString, indexArray, stringHash); nextDiffMatch = false; } else { whiteSpaceCountToPatch = indexArray.Length; Diff nextDiffer = null; if (i + 1 < diffs.Count) { nextDiffer = diffs[i + 1]; } if (null != nextDiffer) { // next if delete if (nextDiffer.operation == Operation.DELETE) { var nextIndexArray = nextDiffer.text.ToCharArray(); whiteSpaceCountToPatch = indexArray.Length - nextIndexArray.Length; nextDiffMatch = true; } } AddStringAndPatch(whiteSpaceCountToPatch, ref rightString, ref leftString, indexArray, stringHash); } } if (diff.operation == Operation.EQUAL) { whiteSpaceCountToPatch = 0; foreach (var index in indexArray) { if (stringHash != null) { leftString += stringHash[index]; rightString += stringHash[index]; } } } if (diff.operation == Operation.DELETE) { if (nextDiffMatch) { AddStringAndPatch(0 - whiteSpaceCountToPatch, ref leftString, ref rightString, indexArray, stringHash); nextDiffMatch = false; } else { whiteSpaceCountToPatch = indexArray.Length; Diff nextDiffer = null; if (i + 1 < diffs.Count) { nextDiffer = diffs[i + 1]; } if (null != nextDiffer) { // next if delete if (nextDiffer.operation == Operation.INSERT) { var nextIndexArray = nextDiffer.text.ToCharArray(); whiteSpaceCountToPatch = indexArray.Length - nextIndexArray.Length; nextDiffMatch = true; } } AddStringAndPatch(whiteSpaceCountToPatch, ref leftString, ref rightString, indexArray, stringHash); } } } }