GraphemeChunker.DiffPlex
1.0.0
dotnet add package GraphemeChunker.DiffPlex --version 1.0.0
NuGet\Install-Package GraphemeChunker.DiffPlex -Version 1.0.0
<PackageReference Include="GraphemeChunker.DiffPlex" Version="1.0.0" />
paket add GraphemeChunker.DiffPlex --version 1.0.0
#r "nuget: GraphemeChunker.DiffPlex, 1.0.0"
// Install GraphemeChunker.DiffPlex as a Cake Addin #addin nuget:?package=GraphemeChunker.DiffPlex&version=1.0.0 // Install GraphemeChunker.DiffPlex as a Cake Tool #tool nuget:?package=GraphemeChunker.DiffPlex&version=1.0.0
GraphemeChunker.DiffPlex
An implementation of DiffPlex.IChunker that splits string by Unicode grapheme.
CharacterChunker, which is built into DiffPlex, splits by char unit, so surrogate pairs such as some kanji and emoji, and ligatures such as family emoji and country flags are broken apart.
GraphemeChunker splits by Unicode grapheme unit, so those characters that you don't want to be splitted are properly processed as a single part.
NuGet package
https://www.nuget.org/packages/GraphemeChunker.DiffPlex/
Install-Package GraphemeChunker.DiffPlex
Sample Code
var before = "👨\u200D👨\u200D👦\u200D👧👩\u200D👩\u200D👧\u200D👦";
var after = "👨\u200D👨\u200D👧\u200D👧👩\u200D👩\u200D👧\u200D👦";
Console.OutputEncoding = Encoding.Unicode;
Console.WriteLine($"Before: {before}");
Console.WriteLine($"After: {after}");
var defaultColor = Console.BackgroundColor;
void WriteDiff(DiffPaneModel diffPaneModel)
{
foreach (var line in diffPaneModel.Lines)
{
foreach (var piece in line.SubPieces)
{
Console.BackgroundColor = piece.Type switch
{
ChangeType.Inserted => ConsoleColor.Green,
ChangeType.Deleted => ConsoleColor.Red,
_ => defaultColor
};
Console.Write(piece.Text);
}
Console.BackgroundColor = defaultColor;
}
}
Console.Write($"Diff (GraphemeChunker): ");
var diff = SideBySideDiffBuilder.Diff(new Differ(), before, after, wordChunker: new GraphemeChunker());
Console.WriteLine();
WriteDiff(diff.OldText);
Console.WriteLine();
WriteDiff(diff.NewText);
Console.WriteLine();
This sample, there is two emoji that family of four, this is, two graphemes, but is composed of surrogate pairs and ZWJ ligatures, so it counts as 22 characters in UTF-16. If you split it up like this, you'll unfortunately end up being the perpetrator in the emoji families dismembered murder case.
By splitting by grapheme unit, the textual diffs can be displayed without dismembering human bodies or breakup of families.
Notes
This library uses GraphemeSplitter in lower than .NET 5.0.
In .NET 5.0 or higher, uses StringInfo.GetTextElementEnumerator
.
GraphemeSplitter does not support splitting multiple consecutive regional indicaters, so they are treated as a single grapheme.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 is compatible. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp1.0 was computed. netcoreapp1.1 was computed. netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard1.0 is compatible. netstandard1.1 was computed. netstandard1.2 was computed. netstandard1.3 was computed. netstandard1.4 was computed. netstandard1.5 was computed. netstandard1.6 was computed. netstandard2.0 was computed. netstandard2.1 was computed. |
.NET Framework | net35 is compatible. net40 was computed. net403 was computed. net45 was computed. net451 was computed. net452 was computed. net46 was computed. net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen30 was computed. tizen40 was computed. tizen60 was computed. |
Universal Windows Platform | uap was computed. uap10.0 was computed. |
Windows Phone | wp8 was computed. wp81 was computed. wpa81 was computed. |
Windows Store | netcore was computed. netcore45 was computed. netcore451 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 3.5
- DiffPlex (>= 1.7.1)
- GraphemeSplitter (>= 1.0.2)
-
.NETStandard 1.0
- DiffPlex (>= 1.7.1)
- GraphemeSplitter (>= 1.0.2)
- NETStandard.Library (>= 1.6.1)
-
net5.0
- DiffPlex (>= 1.7.1)
-
net6.0
- DiffPlex (>= 1.7.1)
-
net7.0
- DiffPlex (>= 1.7.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.0.0 | 230 | 12/28/2022 |