public void RunRangeChecks(TestRange[] testRanges, CheckValue[] checkValues) { uint initialValue = testRanges[0].Value; const uint errorValue = 0x0bad; var builder = new UnicodeTrieBuilder(initialValue, errorValue); for (int i = 1; i < testRanges.Length; i++) { TestRange r = testRanges[i]; builder.SetRange(r.Start, r.End - 1, r.Value, r.Overwrite); } UnicodeTrie frozen = builder.Freeze(); int cp = 0; for (int i = 0; i < checkValues.Length; i++) { CheckValue v = checkValues[i]; while (cp < v.CodePoint) { Assert.Equal(v.Value, builder.Get(cp)); Assert.Equal(v.Value, frozen.Get(cp)); cp++; } } }
/// <summary> /// Generates the UnicodeTrie for the LineBreak code point ranges. /// </summary> public static void GenerateLineBreakTrie() { var regex = new Regex(@"^([0-9A-F]+)(?:\.\.([0-9A-F]+))?\s*;\s*(.*?)\s*#"); var builder = new UnicodeTrieBuilder((uint)LineBreakClass.XX); using (StreamReader sr = GetStreamReader("LineBreak.txt")) { string line; while ((line = sr.ReadLine()) != null) { Match match = regex.Match(line); if (match.Success) { var start = match.Groups[1].Value; var end = match.Groups[2].Value; var point = match.Groups[3].Value; if (end?.Length == 0) { end = start; } builder.SetRange(int.Parse(start, NumberStyles.HexNumber), int.Parse(end, NumberStyles.HexNumber), (uint)Enum.Parse <LineBreakClass>(point), true); } } } UnicodeTrie trie = builder.Freeze(); using FileStream stream = GetStreamWriter("LineBreak.trie"); trie.Save(stream); }
static UnicodeClasses() { // Load trie resources _bidiTrie = new UnicodeTrie(typeof(LineBreaker).Assembly.GetManifestResourceStream("Topten.RichTextKit.Resources.BidiClasses.trie")); _classesTrie = new UnicodeTrie(typeof(LineBreaker).Assembly.GetManifestResourceStream("Topten.RichTextKit.Resources.LineBreakClasses.trie")); _boundaryTrie = new UnicodeTrie(typeof(LineBreaker).Assembly.GetManifestResourceStream("Topten.RichTextKit.Resources.WordBoundaryClasses.trie")); _graphemeTrie = new UnicodeTrie(typeof(LineBreaker).Assembly.GetManifestResourceStream("Topten.RichTextKit.Resources.GraphemeClusterClasses.trie")); }
public static void GenerateTrieClass(string name, UnicodeTrie trie) { var stream = new MemoryStream(); trie.Save(stream); using (var fileStream = File.Create($"Generated\\{name}.trie.cs")) using (var writer = new StreamWriter(fileStream)) { writer.WriteLine("using System;"); writer.WriteLine("namespace Avalonia.Media.TextFormatting.Unicode"); writer.WriteLine("{"); writer.WriteLine($" internal static class {name}Trie"); writer.WriteLine(" {"); writer.WriteLine(" public static ReadOnlySpan<byte> Data => new byte[]"); writer.WriteLine(" {"); stream.Position = 0; writer.Write(" "); long length = stream.Length; while (true) { var b = stream.ReadByte(); if (b == -1) { break; } writer.Write(b.ToString()); if (stream.Position % 100 > 0 && stream.Position != length) { writer.Write(", "); } else { writer.Write(','); writer.Write(Environment.NewLine); if (stream.Position != length) { writer.Write(" "); } } } writer.WriteLine(" };"); writer.WriteLine(" }"); writer.WriteLine("}"); } }
public void SetRangeCompacted() { var builder = new UnicodeTrieBuilder(10, 666); builder.SetRange(13, 6666, 7788, false); builder.SetRange(6000, 7000, 9900, true); UnicodeTrie trie = builder.Freeze(); Assert.Equal(10u, trie.Get(12)); Assert.Equal(7788u, trie.Get(13)); Assert.Equal(7788u, trie.Get(5999)); Assert.Equal(9900u, trie.Get(6000)); Assert.Equal(9900u, trie.Get(7000)); Assert.Equal(10u, trie.Get(7001)); Assert.Equal(666u, trie.Get(0x110000)); }
public void SetRangeSerialized() { var builder = new UnicodeTrieBuilder(10, 666); builder.SetRange(13, 6666, 7788, false); builder.SetRange(6000, 7000, 9900, true); var data = builder.ToBuffer(); var trie = new UnicodeTrie(data); Assert.Equal(10u, trie.Get(12)); Assert.Equal(7788u, trie.Get(13)); Assert.Equal(7788u, trie.Get(5999)); Assert.Equal(9900u, trie.Get(6000)); Assert.Equal(9900u, trie.Get(7000)); Assert.Equal(10u, trie.Get(7001)); Assert.Equal(666u, trie.Get(0x110000)); }
public void SetRangeSerialized() { var builder = new UnicodeTrieBuilder(10, 666); builder.SetRange(13, 6666, 7788, false); builder.SetRange(6000, 7000, 9900, true); using var ms = new MemoryStream(); builder.Freeze().Save(ms); ms.Position = 0; var trie = new UnicodeTrie(ms); Assert.Equal(10u, trie.Get(12)); Assert.Equal(7788u, trie.Get(13)); Assert.Equal(7788u, trie.Get(5999)); Assert.Equal(9900u, trie.Get(6000)); Assert.Equal(9900u, trie.Get(7000)); Assert.Equal(10u, trie.Get(7001)); Assert.Equal(666u, trie.Get(0x110000)); }
static UnicodeData() { s_unicodeDataTrie = new UnicodeTrie(typeof(UnicodeData).Assembly.GetManifestResourceStream("Avalonia.Assets.UnicodeData.trie") !); s_graphemeBreakTrie = new UnicodeTrie(typeof(UnicodeData).Assembly.GetManifestResourceStream("Avalonia.Assets.GraphemeBreak.trie") !); }
static UnicodeClasses() { // Load trie resources _bidiTrie = new UnicodeTrie(typeof(LineBreaker).Assembly.GetManifestResourceStream("Topten.RichTextKit.Resources.BidiData.trie")); _classesTrie = new UnicodeTrie(typeof(LineBreaker).Assembly.GetManifestResourceStream("Topten.RichTextKit.Resources.LineBreakClasses.trie")); }