Пример #1
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);
        }
        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("}");
                }
        }