feature<Diff>: highlights differences for modified lines (both added and removed)

This commit is contained in:
leo 2021-07-28 15:02:06 +08:00
parent 776defe6c3
commit 92de6f2b79
7 changed files with 142 additions and 29 deletions

View file

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace SourceGit.Commands {
@ -8,6 +9,8 @@ namespace SourceGit.Commands {
public class Diff : Command {
private static readonly Regex REG_INDICATOR = new Regex(@"^@@ \-(\d+),?\d* \+(\d+),?\d* @@");
private Models.TextChanges changes = new Models.TextChanges();
private List<Models.TextChanges.Line> deleted = new List<Models.TextChanges.Line>();
private List<Models.TextChanges.Line> added = new List<Models.TextChanges.Line>();
private int oldLine = 0;
private int newLine = 0;
@ -18,6 +21,7 @@ namespace SourceGit.Commands {
public Models.TextChanges Result() {
Exec();
ProcessChanges();
if (changes.IsBinary) changes.Lines.Clear();
return changes;
}
@ -37,6 +41,7 @@ namespace SourceGit.Commands {
changes.Lines.Add(new Models.TextChanges.Line(Models.TextChanges.LineMode.Indicator, line, "", ""));
} else {
if (line.Length == 0) {
ProcessChanges();
changes.Lines.Add(new Models.TextChanges.Line(Models.TextChanges.LineMode.Normal, "", $"{oldLine}", $"{newLine}"));
oldLine++;
newLine++;
@ -45,12 +50,13 @@ namespace SourceGit.Commands {
var ch = line[0];
if (ch == '-') {
changes.Lines.Add(new Models.TextChanges.Line(Models.TextChanges.LineMode.Deleted, line.Substring(1), $"{oldLine}", ""));
deleted.Add(new Models.TextChanges.Line(Models.TextChanges.LineMode.Deleted, line.Substring(1), $"{oldLine}", ""));
oldLine++;
} else if (ch == '+') {
changes.Lines.Add(new Models.TextChanges.Line(Models.TextChanges.LineMode.Added, line.Substring(1), "", $"{newLine}"));
added.Add(new Models.TextChanges.Line(Models.TextChanges.LineMode.Added, line.Substring(1), "", $"{newLine}"));
newLine++;
} else if (ch != '\\') {
ProcessChanges();
var match = REG_INDICATOR.Match(line);
if (match.Success) {
oldLine = int.Parse(match.Groups[1].Value);
@ -64,5 +70,29 @@ namespace SourceGit.Commands {
}
}
}
private void ProcessChanges() {
if (deleted.Count > 0) {
if (added.Count == deleted.Count) {
for (int i = added.Count - 1; i >= 0; i--) {
var left = deleted[i];
var right = added[i];
var result = DiffPlex.Differ.Instance.CreateCharacterDiffs(left.Content, right.Content, false, false);
foreach (var block in result.DiffBlocks) {
left.Highlights.Add(new Models.TextChanges.HighlightRange(block.DeleteStartA, block.DeleteCountA));
right.Highlights.Add(new Models.TextChanges.HighlightRange(block.InsertStartB, block.InsertCountB));
}
}
}
changes.Lines.AddRange(deleted);
deleted.Clear();
}
if (added.Count > 0) {
changes.Lines.AddRange(added);
added.Clear();
}
}
}
}