Пример #1
0
        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++;
                }
            }
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
 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("}");
                }
        }
Пример #5
0
        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));
        }
Пример #6
0
        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));
        }
Пример #7
0
        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));
        }
Пример #8
0
 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") !);
 }
Пример #9
0
 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"));
 }