Skip to content

Commit 042bc40

Browse files
author
Thomas Hambach
committed
Added support to convert to diff-match-patch
1 parent 6feca8a commit 042bc40

File tree

11 files changed

+175
-70
lines changed

11 files changed

+175
-70
lines changed

CSharpDiff.Tests/DiffCharacterTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public void ShouldDiffChars()
1111
{
1212
var diff = new Diff();
1313
var result = diff.diff("New Value.", "New ValueMoreData.");
14-
Assert.Equal("New Value<ins>MoreData</ins>.", DiffConvertXml.Convert(result));
14+
Assert.Equal("New Value<ins>MoreData</ins>.", DiffConvert.ToXml(result));
1515
}
1616

1717
[Fact]
@@ -22,7 +22,7 @@ public void ShouldConsiderCase()
2222
IgnoreCase = true
2323
});
2424
var result = diff.diff("New Value.", "New value.");
25-
Assert.Equal("New value.", DiffConvertXml.Convert(result));
25+
Assert.Equal("New value.", DiffConvert.ToXml(result));
2626
}
2727

2828
[Fact]
@@ -33,7 +33,7 @@ public void ShouldConsiderCaseWithDifference()
3333
IgnoreCase = true
3434
});
3535
var result = diff.diff("New Values.", "New value.");
36-
Assert.Equal("New value<del>s</del>.", DiffConvertXml.Convert(result));
36+
Assert.Equal("New value<del>s</del>.", DiffConvert.ToXml(result));
3737
}
3838
}
3939
}

CSharpDiff.Tests/DiffConvertTests.cs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using CSharpDiff.Converters;
2+
using CSharpDiff.Diffs;
3+
using CSharpDiff.Diffs.Models;
4+
5+
namespace CSharpDiff.Tests
6+
{
7+
public class DiffConvertXmlTests
8+
{
9+
[Fact]
10+
public void ShouldConvertToXml()
11+
{
12+
13+
var changes = new List<DiffResult> {
14+
new DiffResult {
15+
added = false,
16+
removed = true,
17+
value = "test"
18+
},
19+
new DiffResult {
20+
added = true,
21+
removed = false,
22+
value = "test"
23+
},
24+
};
25+
26+
var converted = DiffConvert.ToXml(changes);
27+
Assert.Equal("<del>test</del><ins>test</ins>", converted);
28+
29+
}
30+
31+
[Fact]
32+
public void ShouldConvertToDmp()
33+
{
34+
var changes = new List<DiffResult> {
35+
new DiffResult {
36+
added = false,
37+
removed = true,
38+
value = "test"
39+
},
40+
new DiffResult {
41+
added = true,
42+
removed = false,
43+
value = "test"
44+
},
45+
new DiffResult {
46+
added = false,
47+
removed = false,
48+
value = "test"
49+
},
50+
};
51+
52+
var converted = DiffConvert.ToDmp(changes);
53+
Assert.Equal(-1, converted[0].Item1);
54+
Assert.Equal("test", converted[0].Item2);
55+
Assert.Equal(1, converted[1].Item1);
56+
Assert.Equal("test", converted[1].Item2);
57+
Assert.Equal(0, converted[2].Item1);
58+
}
59+
60+
}
61+
}

CSharpDiff.Tests/DiffConvertXmlTests.cs

Lines changed: 0 additions & 30 deletions
This file was deleted.

CSharpDiff.Tests/DiffSentenceTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public void ShouldDiffSentences()
1111
{
1212
var diff = new DiffSentence();
1313
var diffResult = diff.diff("New Value.", "New ValueMoreData.");
14-
var converted = DiffConvertXml.Convert(diffResult);
14+
var converted = DiffConvert.ToXml(diffResult);
1515
Assert.Equal("<del>New Value.</del><ins>New ValueMoreData.</ins>", converted);
1616
}
1717

@@ -20,7 +20,7 @@ public void ShouldDiffLastSentence()
2020
{
2121
var diff = new DiffSentence();
2222
var diffResult = diff.diff("Here im. Rock you like old man.", "Here im. Rock you like hurricane.");
23-
var converted = DiffConvertXml.Convert(diffResult);
23+
var converted = DiffConvert.ToXml(diffResult);
2424
Assert.Equal("Here im. <del>Rock you like old man.</del><ins>Rock you like hurricane.</ins>", converted);
2525
}
2626
}

CSharpDiff.Tests/DiffTests.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public void ShouldDiffLines()
1111
{
1212
var diff = new DiffLines();
1313
var diffResult = diff.diff("line\nold value\nline", "line\nnew value\nline");
14-
var converted = DiffConvertXml.Convert(diffResult);
14+
var converted = DiffConvert.ToXml(diffResult);
1515
Assert.Equal("line\n<del>old value\n</del><ins>new value\n</ins>line", converted);
1616
}
1717

@@ -20,7 +20,7 @@ public void ShouldDiffTheSameLines()
2020
{
2121
var diff = new DiffLines();
2222
var diffResult = diff.diff("line\nvalue\nline", "line\nvalue\nline");
23-
var converted = DiffConvertXml.Convert(diffResult);
23+
var converted = DiffConvert.ToXml(diffResult);
2424
Assert.Equal("line\nvalue\nline", converted);
2525
}
2626

@@ -29,7 +29,7 @@ public void ShouldHandleTrailingSpaces()
2929
{
3030
var diff = new DiffLines();
3131
var diffResult = diff.diff("line\nvalue \nline", "line\nvalue\nline");
32-
var converted = DiffConvertXml.Convert(diffResult);
32+
var converted = DiffConvert.ToXml(diffResult);
3333
Assert.Equal("line\n<del>value \n</del><ins>value\n</ins>line", converted);
3434
}
3535

@@ -38,7 +38,7 @@ public void ShouldHandleWindowsLineEndings()
3838
{
3939
var diff = new DiffLines();
4040
var diffResult = diff.diff("line\r\nold value\r\nline", "line\r\nnew value\r\nline");
41-
var converted = DiffConvertXml.Convert(diffResult);
41+
var converted = DiffConvert.ToXml(diffResult);
4242
Assert.Equal("line\r\n<del>old value\r\n</del><ins>new value\r\n</ins>line", converted);
4343
}
4444

@@ -47,7 +47,7 @@ public void ShouldHandleEmptyLines()
4747
{
4848
var diff = new DiffLines();
4949
var diffResult = diff.diff("line\n\nold value \n\nline", "line\n\nnew value\n\nline");
50-
var converted = DiffConvertXml.Convert(diffResult);
50+
var converted = DiffConvert.ToXml(diffResult);
5151
Assert.Equal("line\n\n<del>old value \n</del><ins>new value\n</ins>\nline", converted);
5252
}
5353

@@ -56,7 +56,7 @@ public void ShouldHandleEmptyInput()
5656
{
5757
var diff = new DiffLines();
5858
var diffResult = diff.diff("line\n\nold value \n\nline", "");
59-
var converted = DiffConvertXml.Convert(diffResult);
59+
var converted = DiffConvert.ToXml(diffResult);
6060
Assert.Equal("<del>line\n\nold value \n\nline</del>", converted);
6161
}
6262

CSharpDiff.Tests/DiffWordTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public void ShouldDiffWhitespace()
1111
{
1212
var diff = new DiffWord();
1313
var diffResult = diff.diff("New Value", "New ValueMoreData");
14-
var converted = DiffConvertXml.Convert(diffResult);
14+
var converted = DiffConvert.ToXml(diffResult);
1515
Assert.Equal("New <del>Value</del><ins>ValueMoreData</ins>", converted);
1616
}
1717

@@ -20,7 +20,7 @@ public void ShouldDiffMultipleWhitespace()
2020
{
2121
var diff = new DiffWord();
2222
var diffResult = diff.diff("New Value ", "New ValueMoreData ");
23-
var converted = DiffConvertXml.Convert(diffResult);
23+
var converted = DiffConvert.ToXml(diffResult);
2424
Assert.Equal("New <del>Value</del><ins>ValueMoreData</ins> ", converted);
2525
}
2626

@@ -30,7 +30,7 @@ public void ShouldDiffOnWordBoundaries()
3030
{
3131
var diff = new DiffWord();
3232
var diffResult = diff.diff("New :Value:Test", "New ValueMoreData ");
33-
var converted = DiffConvertXml.Convert(diffResult);
33+
var converted = DiffConvert.ToXml(diffResult);
3434
Assert.Equal("New <del>:Value:Test</del><ins>ValueMoreData </ins>", converted);
3535

3636
// @todo Tests below still bug out due to the REGEX in DiffWord.Tokenize

CSharpDiff/CSharpDiff.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<TargetFramework>net6.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<PackageId>CSharpDiff</PackageId>
7-
<Version>0.0.6</Version>
7+
<Version>0.0.7</Version>
88
<Authors>ThomasHambach</Authors>
99
<Description>
1010
Unified Diff support for .NET. Based on the popular library JSDIFF.

CSharpDiff/Converters/DiffConvertXml.cs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33

44
namespace CSharpDiff.Converters
55
{
6-
public static class DiffConvertXml
6+
public static class DiffConvert
77
{
88
/// <summary>
99
/// Convert the changes to an XML structure
1010
/// </summary>
1111
/// <param name="changes"></param>
1212
/// <returns></returns>
13-
public static string Convert(IList<DiffResult> changes)
13+
public static string ToXml(IList<DiffResult> changes)
1414
{
1515

1616
var ret = new List<string>();
@@ -40,5 +40,38 @@ public static string Convert(IList<DiffResult> changes)
4040

4141
return String.Join("", ret);
4242
}
43+
44+
/// <summary>
45+
/// Convert to diff-match-patch format
46+
/// </summary>
47+
/// <param name="changes"></param>
48+
/// <returns></returns>
49+
public static IList<Tuple<int, string>> ToDmp(IList<DiffResult> changes)
50+
{
51+
var ret = new List<Tuple<int, string>>();
52+
DiffResult change = null;
53+
var operation = 0;
54+
for (var i = 0; i < changes.Count; i++)
55+
{
56+
change = changes[i];
57+
if (change.added == true)
58+
{
59+
operation = 1;
60+
}
61+
else if (change.removed == true)
62+
{
63+
operation = -1;
64+
}
65+
else
66+
{
67+
operation = 0;
68+
}
69+
70+
ret.Add(new Tuple<int, string>(operation, change.value));
71+
}
72+
73+
return ret;
74+
}
75+
4376
}
4477
}

CSharpDiff/Patches/IPatch.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,36 @@ public interface IPatch
66
{
77
string[] contextLines(string[] lines);
88

9+
/// <summary>
10+
/// Create a text version of a unified diff patch.
11+
/// </summary>
12+
/// <param name="filename"></param>
13+
/// <param name="oldStr"></param>
14+
/// <param name="newStr"></param>
15+
/// <returns></returns>
16+
string create(string filename, string oldStr, string newStr);
17+
18+
/// <summary>
19+
/// Create a text version of a unified diff patch.
20+
/// </summary>
21+
/// <param name="oldFileName"></param>
22+
/// <param name="newFileName"></param>
23+
/// <param name="oldStr"></param>
24+
/// <param name="newStr"></param>
25+
/// <returns></returns>
26+
string create(string oldFileName, string newFileName, string oldStr, string newStr);
27+
28+
/// <summary>
29+
/// Create a text version of a unified diff patch.
30+
/// </summary>
31+
/// <param name="filename"></param>
32+
/// <param name="oldStr"></param>
33+
/// <param name="newStr"></param>
34+
/// <param name="oldHeader"></param>
35+
/// <param name="newHeader"></param>
36+
/// <returns></returns>
37+
string create(string filename, string oldStr, string newStr, string oldHeader, string newHeader);
38+
939
/// <summary>
1040
/// Create a text version of a unified diff patch.
1141
/// </summary>

CSharpDiff/Patches/Patch.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,21 @@ public string[] contextLines(string[] lines)
3333
return lines.Select((entry) => { return ' ' + entry; }).ToArray();
3434
}
3535

36+
public string create(string filename, string oldStr, string newStr)
37+
{
38+
return create(filename, filename, oldStr, newStr, null, null);
39+
}
40+
41+
public string create(string oldFileName, string newFileName, string oldStr, string newStr)
42+
{
43+
return create(oldFileName, newFileName, oldStr, newStr, null, null);
44+
}
45+
46+
public string create(string filename, string oldStr, string newStr, string oldHeader, string newHeader)
47+
{
48+
return create(filename, filename, oldStr, newStr, oldHeader, newHeader);
49+
}
50+
3651
public string create(string oldFileName, string newFileName, string oldStr, string newStr, string oldHeader, string newHeader)
3752
{
3853
var result = createPatchResult(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader);

0 commit comments

Comments
 (0)