public static UnicodeTrie GenerateUnicodeDataTrie(out UnicodeDataEntries dataEntries, out Dictionary <int, UnicodeDataItem> unicodeData) { var generalCategoryEntries = UnicodeEnumsGenerator.CreateGeneralCategoryEnum(); var generalCategoryMappings = CreateTagToIndexMappings(generalCategoryEntries); var scriptEntries = UnicodeEnumsGenerator.CreateScriptEnum(); var scriptMappings = CreateNameToIndexMappings(scriptEntries); var lineBreakClassEntries = UnicodeEnumsGenerator.CreateLineBreakClassEnum(); var lineBreakClassMappings = CreateTagToIndexMappings(lineBreakClassEntries); unicodeData = GetUnicodeData(generalCategoryMappings, scriptMappings, lineBreakClassMappings); var unicodeDataTrieBuilder = new UnicodeTrieBuilder(/*initialValue*/); foreach (var properties in unicodeData.Values) { //[line break]|[biDi]|[script]|[category] var value = (properties.LineBreakClass << UnicodeData.LINEBREAK_SHIFT) | (properties.Script << UnicodeData.SCRIPT_SHIFT) | properties.GeneralCategory; unicodeDataTrieBuilder.Set(properties.Codepoint, (uint)value); } dataEntries = new UnicodeDataEntries { Scripts = scriptEntries, GeneralCategories = generalCategoryEntries, LineBreakClasses = lineBreakClassEntries }; using (var stream = File.Create("Generated\\UnicodeData.trie")) { var trie = unicodeDataTrieBuilder.Freeze(); trie.Save(stream); return(trie); } }
public static void Execute() { var codepoints = new Dictionary <int, UnicodeDataItem>(); var generalCategoryEntries = UnicodeEnumsGenerator.CreateGeneralCategoryEnum(); var generalCategoryMappings = CreateTagToIndexMappings(generalCategoryEntries); var generalCategoryData = ReadGeneralCategoryData(); foreach (var(range, name) in generalCategoryData) { var generalCategory = generalCategoryMappings[name]; AddGeneralCategoryRange(codepoints, range, generalCategory); } var scriptEntries = UnicodeEnumsGenerator.CreateScriptEnum(); var scriptMappings = CreateNameToIndexMappings(scriptEntries); var scriptData = ReadScriptData(); foreach (var(range, name) in scriptData) { var script = scriptMappings[name]; AddScriptRange(codepoints, range, script); } var biDiClassEntries = UnicodeEnumsGenerator.CreateBiDiClassEnum(); var biDiClassMappings = CreateTagToIndexMappings(biDiClassEntries); var biDiData = ReadBiDiData(); foreach (var(range, name) in biDiData) { var biDiClass = biDiClassMappings[name]; AddBiDiClassRange(codepoints, range, biDiClass); } var lineBreakClassEntries = UnicodeEnumsGenerator.CreateLineBreakClassEnum(); var lineBreakClassMappings = CreateTagToIndexMappings(lineBreakClassEntries); var lineBreakClassData = ReadLineBreakClassData(); foreach (var(range, name) in lineBreakClassData) { var lineBreakClass = lineBreakClassMappings[name]; AddLineBreakClassRange(codepoints, range, lineBreakClass); } //const int initialValue = (0 << UnicodeData.LINEBREAK_SHIFT) | // (0 << UnicodeData.BIDI_SHIFT) | // (0 << UnicodeData.SCRIPT_SHIFT) | (int)GeneralCategory.Other; var builder = new UnicodeTrieBuilder(/*initialValue*/); foreach (var properties in codepoints.Values) { //[line break]|[biDi]|[script]|[category] var value = (properties.LineBreakClass << UnicodeData.LINEBREAK_SHIFT) | (properties.BiDiClass << UnicodeData.BIDI_SHIFT) | (properties.Script << UnicodeData.SCRIPT_SHIFT) | properties.GeneralCategory; builder.Set(properties.Codepoint, (uint)value); } using (var stream = File.Create("Generated\\UnicodeData.trie")) { var trie = builder.Freeze(); trie.Save(stream); } UnicodeEnumsGenerator.CreatePropertyValueAliasHelper(scriptEntries, generalCategoryEntries, biDiClassEntries, lineBreakClassEntries); }