diff --git a/Packages/vChewing_Shared/Sources/Shared/CandidateNode.swift b/Packages/vChewing_Shared/Sources/Shared/CandidateNode.swift index eac86b74..a30ebf9a 100644 --- a/Packages/vChewing_Shared/Sources/Shared/CandidateNode.swift +++ b/Packages/vChewing_Shared/Sources/Shared/CandidateNode.swift @@ -20,155 +20,11 @@ public class CandidateNode { self.previous = previous } - public init(name: String, symbols: String) { - self.name = name - members = Array(symbols).map { CandidateNode(name: String($0), symbols: []) } - members.forEach { $0.previous = self } - } - public init(name: String, symbols: [String]) { self.name = name members = symbols.map { CandidateNode(name: $0, symbols: []) } members.forEach { $0.previous = self } } - public static func load(url: URL) { - DispatchQueue.main.async { - // 這兩個變數單獨拿出來,省得每次都重建還要浪費算力。 - var arrLines = [String.SubSequence]() - var fieldSlice = [Substring.SubSequence]() - var arrMembers = [CandidateNode]() - do { - arrLines = try String(contentsOfFile: url.path, encoding: .utf8).split(separator: "\n") - for strLine in arrLines.lazy.filter({ !$0.isEmpty }) { - fieldSlice = strLine.split(separator: "=") - switch fieldSlice.count { - case 1: arrMembers.append(.init(name: String(fieldSlice[0]))) - case 2: arrMembers.append(.init(name: String(fieldSlice[0]), symbols: .init(fieldSlice[1]))) - default: break - } - } - root = arrMembers.isEmpty ? defaultSymbolRoot : .init(name: "/", members: arrMembers) - } catch { - root = defaultSymbolRoot - } - } - } - - // MARK: - Static data. - - static let catCommonSymbols = NSLocalizedString("catCommonSymbols", comment: "") - static let catHoriBrackets = NSLocalizedString("catHoriBrackets", comment: "") - static let catVertBrackets = NSLocalizedString("catVertBrackets", comment: "") - static let catAlphabets = NSLocalizedString("catAlphabets", comment: "") - static let catSpecialNumbers = NSLocalizedString("catSpecialNumbers", comment: "") - static let catMathSymbols = NSLocalizedString("catMathSymbols", comment: "") - static let catCurrencyUnits = NSLocalizedString("catCurrencyUnits", comment: "") - static let catSpecialSymbols = NSLocalizedString("catSpecialSymbols", comment: "") - static let catUnicodeSymbols = NSLocalizedString("catUnicodeSymbols", comment: "") - static let catCircledKanjis = NSLocalizedString("catCircledKanjis", comment: "") - static let catCircledKataKana = NSLocalizedString("catCircledKataKana", comment: "") - static let catBracketKanjis = NSLocalizedString("catBracketKanjis", comment: "") - static let catSingleTableLines = NSLocalizedString("catSingleTableLines", comment: "") - static let catDoubleTableLines = NSLocalizedString("catDoubleTableLines", comment: "") - static let catFillingBlocks = NSLocalizedString("catFillingBlocks", comment: "") - static let catLineSegments = NSLocalizedString("catLineSegments", comment: "") - static let catKana = NSLocalizedString("catKana", comment: "") - static let catCombinations = NSLocalizedString("catCombinations", comment: "") - static let catPhonabets = NSLocalizedString("catPhonabets", comment: "") - static let catCircledASCII = NSLocalizedString("catCircledASCII", comment: "") - static let catBracketedASCII = NSLocalizedString("catBracketedASCII", comment: "") - static let catMusicSymbols = NSLocalizedString("catMusicSymbols", comment: "") - static let catThai = NSLocalizedString("catThai", comment: "") - static let catYi = NSLocalizedString("catYi", comment: "") - - public private(set) static var root: CandidateNode = .init(name: "/") - - private static let defaultSymbolRoot: CandidateNode = .init( - name: "/", - members: [ - CandidateNode(name: " "), - CandidateNode(name: "`"), - CandidateNode(name: catCommonSymbols, symbols: ",、。.?!;:‧‥﹐﹒˙·‘’“”〝〞‵′〃~$%﹪@&#*・…—〜/\_―‖﹫﹟﹠﹡"), - CandidateNode( - name: catHoriBrackets, - symbols: - "()[]{}〈〉《》「」『』【】〔〕〖〗〘〙〚〛︗︘︷︸︹︺︻︼︽︾︿﹀﹁﹂﹃﹄﹇﹈︵︶[]{}⁅⁆⎡⎢⎣⎤⎥⎦⎧⎨⎩⎪⎫⎬⎭⎰⎱「」❬❭❰❱❲❳❴❵⟦⟧⟨⟩⟪⟫⟬⟭⦃⦄⦇⦈⦉⦊⦋⦌⦍⦎⦏⦐⦑⦒⦓⦔⦕⦖⦗⦘⧼⧽⸂⸃⸄⸅⸉⸊⸌⸍⸜⸝⸢⸣⸤⸥⸦⸧⎴⎵⎶⏞⏟⏠⏡﹙﹚﹛﹜﹝﹞﹤﹥‘’“”〝〞‵′″'" - ), - CandidateNode(name: catVertBrackets, symbols: "︵︶﹁﹂︹︺︷︸︿﹀﹃﹄︽︾︻︼"), - CandidateNode( - name: catAlphabets, - symbols: - "αβγδεζηθικλμνξοπρστυφχψωΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩабвгдежзийклмнопрстуфхцчшщъыьэюяёАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯЁàáèéêìíòóùúüāēěīńňōūǎǐǒǔǖǘǚǜɑɡ¨·" - ), - CandidateNode( - name: catSpecialNumbers, symbols: "ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻ〇〡〢〣〤〥〦〧〨〩" - ), - CandidateNode( - name: catMathSymbols, - symbols: - "﹢﹤﹥+-<=>✕%+<=>¡¢«°±µ»¼½¾¿×÷ˇθπ‰₠₡₢₣₤₥₦₧₨₩₪₫€℀℁℃℅℆℉⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟∀∁∂∃∄∅∆∇∈∉∊∋∌∍∎∏∐∑−∓∔∕∖∗∘∙√∛∜∝∞∟∠∡∢∣∤∥∧∨∩∪∫∬∭∮∯∰∱∲∳∴∵∶∷∸∹∺∻∼∽∾∿≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≠≡≢≣≤≥≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊙⊚⊛⊜⊝⊞⊟⊠⊡⊢⊣⊤⊥⊦⊧⊨⊩⊪⊫⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷⊸⊹⊺⊻⊼⊽⊾⊿⋀⋁⋂⋃⋄⋅⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋔⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱" - ), - CandidateNode(name: catCurrencyUnits, symbols: "$€¥¢£₽₨₩฿₺₮₱₭₴₦৲৳૱௹﷼₹₲₪₡₫៛₵₢₸₤₳₥₠₣₰₧₯₶₷¤¢¥£$﹩₩"), - CandidateNode( - name: catSpecialSymbols, - symbols: - "↩⌘⎋⏏⇥⇤⇪⇧⌤⌥⎇␣⌃⌄⌅⌆⌦⌫⌧⇱↖↸⇲↘⇞⇟↑↓←→⇡⇣⇠⇢⚙⇭⌽⌀⌁⌂⌐⌑⌒⌓⌔⌕⌖⌗⌙⌨⎄⎅⎆⎈⎉⎊⎌⌚⌛⎗⎘⎙⎚⎀⎁⎂⎃⌇⌈⌉⌊⌋⌌⌍⌏⌠⎮⌡⌢⌣⌜⌝⌞⌟⁒〈〉⌬⌭⌮⌯⌰⌱⌲⌳↗↙↺⇩⇦⇨⇄⇆⇅⇵↻◎○●⊕⊙※△▲☆★◇◆□■▽▼№℡§〒♀♂↯¶©®™🜀🜁🜂🜃🜄🜅🜆🜇🜈🜉🜊🜋🜌🜍🜎🜏🜐🜑🜒🜓🜔🜕🜖🜗🜘🜙🜚🜛🜜🜝🜞🜟🜠🜡🜢🜣🜤🜥🜦🜧🜨🜩🜪🜫🜬🜭🜮🜯🜰🜱🜲🜳🜴🜵🜶🜷🜸🜹🜺🜻🜼🜽🜾🜿🝀🝁🝂🝃🝄🝅🝆🝇🝈🝉🝊🝋🝌🝍🝎🝏🝐🝑🝒🝓🝔🝕🝖🝗🝘🝙🝚🝛🝜🝝🝞🝟🝠🝡🝢🝣🝤🝥🝦🝧🝨🝩🝪🝫🝬🝭🝮🝯🝰🝱🝲🝳↚↛↜↝↞↟↠↡↢↣↤↥↦↧↨↪↫↬↭↮" - ), - CandidateNode( - name: catUnicodeSymbols, - symbols: - "※∮∴∵∽☀☁☂☃☺☻♠♣♥♦♨♩♪♫♬♭♯■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿◀◁◂◃◄◅◆◇◈◉◊○◌◍◎●◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿☄★☆☇☈☉☊☋☌☍☎☏☐☑☒☓☔☕☖☗☘☙☚☛☜☝☞☟☠☡☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹☼☽☾☿♀♁♂♃♄♅♆♇♈♉♊♋♌♍♎♏♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♡♢♤♧♮♰♱♲♳♴♵♶♷♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓⚔⚕⚖⚗⚘⚙⚚⚛⚜⚝⚞⚟⚠⚡⚢⚣⚤⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮⚯⚰⚱⚲⚳⚴⚵⚶⚷⚸⚹⚺⚻⚼⚽⚾⚿⛀⛁⛂⛃⛄⛅⛆⛇⛈⛉⛊⛋⛌⛍⛎⛏⛐⛑⛒⛓⛔⛕⛖⛗⛘⛙⛚⛛⛜⛝⛞⛟⛠⛡⛢⛣⛤⛥⛦⛧⛨⛩⛪⛫⛬⛭⛮⛯⛰⛱⛲⛳⛴⛵⛶⛷⛸⛹⛺⛻⛼⛽⛾⛿✁✂✃✄✅✆✇✈✉✊✋✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡✢✣✤✥✦✧✨✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋❌❍❎❏❐❑❒❓❔❕❖❗❘❙❚❛❜❝❞❟❠❡❢❣❤❥❦❧❨❩❪❫❬❭❮❯❰❱❲❳❴❵➔➕➖➗➘➙➚➛➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➰➱➲➳➴➵➶➷➸➹➺➻➼➽➾➿⬀⬁⬂⬃⬄⬅⬆⬇⬈⬉⬊⬋⬌⬍⬎⬏⬐⬑⬒⬓⬔⬕⬖⬗⬘⬙⬚⬛⬜⬝⬞⬟⬠⬡⬢⬣⬤⬥⬦⬧⬨⬩⬪⬫⬬⬭⬮⬯⬰⬱⬲⬳⬴⬵⬶⬷⬸⬹⬺⬻⬼⬽⬾⬿⭀⭁⭂⭃⭄⭅⭆⭇⭈⭉⭊⭋⭌⭐⭑⭒⭓⭔⭕⭖⭗⭘⭙₮〠〶ↀↁↂ₭〇〄㉿〆₯ℂ℄" - ), - CandidateNode( - name: catMusicSymbols, - symbols: - "𝄀𝄁𝄂𝄃𝄄𝄅𝄆𝄇𝄈𝄉𝄊𝄋𝄌𝄍𝄎𝄏𝄐𝄑𝄒𝄓𝄔𝄕𝄖𝄗𝄘𝄙𝄚𝄛𝄜𝄝𝄞𝄟𝄠𝄡𝄢𝄣𝄤𝄥𝄦𝄩𝄪𝄫𝄬𝄭𝄮𝄯𝄰𝄱𝄲𝄳𝄴𝄵𝄶𝄷𝄸𝄹𝄺𝄻𝄼𝄽𝄾𝄿𝅀𝅁𝅂𝅃𝅄𝅅𝅆𝅇𝅈𝅉𝅊𝅋𝅌𝅍𝅎𝅏𝅐𝅑𝅒𝅓𝅔𝅕𝅖𝅗𝅗𝅥𝅘𝅘𝅥𝅘𝅥𝅮𝅘𝅥𝅯𝅘𝅥𝅰𝅘𝅥𝅱𝅘𝅧𝅨𝅩𝅥𝅲𝅥𝅦𝅙𝅚𝅛𝅜𝅝𝅪𝅫𝅬𝅮𝅯𝅰𝅱𝅲𝅭𝅳𝅴𝅵𝅶𝅷𝅸𝅹𝅺𝅻𝅼𝅽𝅾𝅿𝆀𝆁𝆂𝆃𝆄𝆊𝆋𝆅𝆆𝆇𝆈𝆉𝆌𝆍𝆎𝆏𝆐𝆑𝆒𝆓𝆔𝆕𝆖𝆗𝆘𝆙𝆚𝆛𝆜𝆝𝆞𝆟𝆠𝆡𝆢𝆣𝆤𝆥𝆦𝆧𝆨𝆩𝆪𝆫𝆬𝆭𝆮𝆯𝆰𝆱𝆲𝆳𝆴𝆵𝆶𝆷𝆸𝆹𝆹𝅥𝆹𝅥𝅮𝆹𝅥𝅯𝆺𝆺𝅥𝆺𝅥𝅮𝆺𝅥𝅯𝇁𝇂𝇃𝇄𝇅𝇆𝇇𝇈𝇉𝇊𝇋𝇌𝇍𝇎𝇏𝇐𝇑𝇒𝇓𝇔𝇕𝇖𝇗𝇘𝇙𝇚𝇛𝇜𝇝𝇞𝇟𝇠𝇡𝇢𝇣𝇤𝇥𝇦𝇧𝇨" - ), - CandidateNode(name: catCircledKanjis, symbols: "㊊㊋㊌㊍㊎㊏㊐㊑㊒㊓㊔㊕㊖㊗︎㊘㊙︎㊚㊛㊜㊝㊞㊟㊠㊡㊢㊣㊤㊥㊦㊧㊨㊩㊪㊫㊬㊭㊮㊯㊰㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉🈚︎🈯︎"), - CandidateNode( - name: catCircledKataKana, symbols: "㋐㋑㋒㋓㋔㋕㋖㋗㋘㋙㋚㋛㋜㋝㋞㋟㋠㋡㋢㋣㋤㋥㋦㋧㋨㋩㋪㋫㋬㋭㋮㋯㋰㋱㋲㋳㋴㋵㋶㋷㋸㋹㋺㋻㋼㋽㋾" - ), - CandidateNode(name: catBracketKanjis, symbols: "㈪㈫㈬㈭㈮㈯㈰㈱㈲㈳㈴㈵㈶㈷㈸㈹㈺㈻㈼㈽㈾㈿㉀㉁㉂㉃"), - CandidateNode(name: catSingleTableLines, symbols: "─│┌┐└┕┘├┤┬┴┼═╞╡╪╭╮╯╰▕"), - CandidateNode(name: catDoubleTableLines, symbols: "═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬"), - CandidateNode(name: catFillingBlocks, symbols: "_ˍ▁▂▃▄▅▆▇█▏▎▍▌▋▊▉◢◣◥◤"), - CandidateNode(name: catLineSegments, symbols: "﹣﹦≡|∣∥–︱—︳╴¯ ̄﹉﹊﹍﹎﹋﹌﹏︴∕﹨╱╲/\ˍ━┃▕〓╳∏ˆ⌒┄┅┆┇┈┉┊┋"), - CandidateNode( - name: catKana, - symbols: - "ぁあぃいぅうゔぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばひびふぶへべほぼまみむめもゃやゅゆょよらら゚りり゚るる゚れれ゚ろろ゚ゎわわ゙ゐゐ゙ゑゑ゙をを゙んゕゖゝゞゟ〻゠ァアィイゥウヴェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨララ゚リリ゚ルル゚レレ゚ロロ゚ヮワヷヰヸヱヹヲヺンヵヶ・ーヽヾヿ々ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン ゙ ゚〲〱〳〴〵" - ), - CandidateNode( - name: catCombinations, - symbols: - "㍘㍙㍚㍛㍜㍝㍞㍟㍠㍡㍢㍣㍤㍥㍦㍧㍨㍩㍪㍫㍬㍭㍮㍯㍰㏠㏡㏢㏣㏤㏥㏦㏧㏨㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳㏴㏵㏶㏷㏸㏹㏺㏻㏼㏽㏾㍱㍲㍳㍴㍵㍶㍷㍸㍹㍺㎀㎁㎂㎃㎄㎅㎆㎇㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗㎘㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏋㏌㏍㏎㏏㏐㏑㏒㏓㏔㏕㏖㏗㏘㏙㏚㏛㏜㏝㏞㏟㏿㋿㍼㍽㍾㍻㍿㌀㌁㌂㌃㌄㌅㌆㌇㌈㌉㌊㌋㌌㌍㌎㌏㌐㌑㌒㌓㌔㌕㌖㌗㌘㌙㌚㌛㌜㌝㌞㌟㌠㌡㌢㌣㌤㌥㌦㌧㌨㌩㌪㌫㌬㌭㌮㌯㌰㌱㌲㌳㌴㌵㌶㌷㌸㌹㌺㌻㌼㌽㌾㌿㍀㍁㍂㍃㍄㍅㍆㍇㍈㍉㍊㍋㍌㍍㍎㍏㍐㍑㍒㍓㍔㍕㍖㍗" - ), - CandidateNode( - name: catPhonabets, symbols: "ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩㄪㄫㄬㄭㄮㄯㆵㆠㆡㆢㆣㆤㆥㆦㆧㆨㆩㆪㆫㆬㆭㆮㆯㆰㆱㆲㆳㆴㆶㆷㆸㆹㆺㆻㆼㆽㆾㆿ˙ˊˇˋ˪˫" - ), - CandidateNode( - name: catCircledASCII, - symbols: - "①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓂ︎ⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ⓪⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾⓿❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓🄰🄱🄲🄳🄴🄵🄶🄷🄸🄹🄺🄻🄼🄽🄾🄿🅀🅁🅂🅃🅄🅅🅆🅇🅈🅉🅐🅑🅒🅓🅔🅕🅖🅗🅘🅙🅚🅛🅜🅝🅞🅟🅠🅡🅢🅣🅤🅥🅦🅧🅨🅩🅰🅱🅲🅳🅴🅵🅶🅷🅸🅹🅺🅻🅼🅽🅾🅿︎🆀🆁🆂🆃🆄🆅🆆🆇🆈🆉" - ), - CandidateNode( - name: catBracketedASCII, symbols: "⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵🄐🄑🄒🄓🄔🄕🄖🄗🄘🄙🄚🄛🄜🄝🄞🄟🄠🄡🄢🄣🄤🄥🄦🄧🄨🄩" - ), - CandidateNode( - name: catThai, - symbols: [ - "ก", "ข", "ฃ", "ค", "ฅ", "ฆ", "ง", "จ", "ฉ", "ช", "ซ", "ฌ", "ญ", "ฎ", "ฏ", "ฐ", "ฑ", "ฒ", "ณ", "ด", "ต", "ถ", - "ท", "ธ", "น", "บ", "ป", "ผ", "ฝ", "พ", "ฟ", "ภ", "ม", "ย", "ร", "ฤ", "ล", "ฦ", "ว", "ศ", "ษ", "ส", "ห", "ฬ", - "อ", "ฮ", "ฯ", "ะ", "ั", "า", "ำ", "ิ", "ี", "ึ", "ื", "ุ", "ู", "ฺ", "เ", "แ", "โ", "ใ", "ไ", "ๅ", "ๆ", - "็", "่", "้", "๊", "๋", "์", "ํ", "๎", "๏", "๐", "๑", "๒", "๓", "๔", "๕", "๖", "๗", "๘", "๙", "๚", "๛", - ] - ), - CandidateNode( - name: catYi, - symbols: - "ꀀꀁꀂꀃꀄꀅꀆꀇꀈꀉꀊꀋꀌꀍꀎꀏꀐꀑꀒꀓꀔꀕꀖꀗꀘꀙꀚꀛꀜꀝꀞꀟꀠꀡꀢꀣꀤꀥꀦꀧꀨꀩꀪꀫꀬꀭꀮꀯꀰꀱꀲꀳꀴꀵꀶꀷꀸꀹꀺꀻꀼꀽꀾꀿꁀꁁꁂꁃꁄꁅꁆꁇꁈꁉꁊꁋꁌꁍꁎꁏꁐꁑꁒꁓꁔꁕꁖꁗꁘꁙꁚꁛꁜꁝꁞꁟꁠꁡꁢꁣꁤꁥꁦꁧꁨꁩꁪꁫꁬꁭꁮꁯꁰꁱꁲꁳꁴꁵꁶꁷꁸꁹꁺꁻꁼꁽꁾꁿꂀꂁꂂꂃꂄꂅꂆꂇꂈꂉꂊꂋꂌꂍꂎꂏꂐꂑꂒꂓꂔꂕꂖꂗꂘꂙꂚꂛꂜꂝꂞꂟꂠꂡꂢꂣꂤꂥꂦꂧꂨꂩꂪꂫꂬꂭꂮꂯꂰꂱꂲꂳꂴꂵꂶꂷꂸꂹꂺꂻꂼꂽꂾꂿꃀꃁꃂꃃꃄꃅꃆꃇꃈꃉꃊꃋꃌꃍꃎꃏꃐꃑꃒꃓꃔꃕꃖꃗꃘꃙꃚꃛꃜꃝꃞꃟꃠꃡꃢꃣꃤꃥꃦꃧꃨꃩꃪꃫꃬꃭꃮꃯꃰꃱꃲꃳꃴꃵꃶꃷꃸꃹꃺꃻꃼꃽꃾꃿꄀꄁꄂꄃꄄꄅꄆꄇꄈꄉꄊꄋꄌꄍꄎꄏꄐꄑꄒꄓꄔꄕꄖꄗꄘꄙꄚꄛꄜꄝꄞꄟꄠꄡꄢꄣꄤꄥꄦꄧꄨꄩꄪꄫꄬꄭꄮꄯꄰꄱꄲꄳꄴꄵꄶꄷꄸꄹꄺꄻꄼꄽꄾꄿꅀꅁꅂꅃꅄꅅꅆꅇꅈꅉꅊꅋꅌꅍꅎꅏꅐꅑꅒꅓꅔꅕꅖꅗꅘꅙꅚꅛꅜꅝꅞꅟꅠꅡꅢꅣꅤꅥꅦꅧꅨꅩꅪꅫꅬꅭꅮꅯꅰꅱꅲꅳꅴꅵꅶꅷꅸꅹꅺꅻꅼꅽꅾꅿꆀꆁꆂꆃꆄꆅꆆꆇꆈꆉꆊꆋꆌꆍꆎꆏꆐꆑꆒꆓꆔꆕꆖꆗꆘꆙꆚꆛꆜꆝꆞꆟꆠꆡꆢꆣꆤꆥꆦꆧꆨꆩꆪꆫꆬꆭꆮꆯꆰꆱꆲꆳꆴꆵꆶꆷꆸꆹꆺꆻꆼꆽꆾꆿꇀꇁꇂꇃꇄꇅꇆꇇꇈꇉꇊꇋꇌꇍꇎꇏꇐꇑꇒꇓꇔꇕꇖꇗꇘꇙꇚꇛꇜꇝꇞꇟꇠꇡꇢꇣꇤꇥꇦꇧꇨꇩꇪꇫꇬꇭꇮꇯꇰꇱꇲꇳꇴꇵꇶꇷꇸꇹꇺꇻꇼꇽꇾꇿꈀꈁꈂꈃꈄꈅꈆꈇꈈꈉꈊꈋꈌꈍꈎꈏꈐꈑꈒꈓꈔꈕꈖꈗꈘꈙꈚꈛꈜꈝꈞꈟꈠꈡꈢꈣꈤꈥꈦꈧꈨꈩꈪꈫꈬꈭꈮꈯꈰꈱꈲꈳꈴꈵꈶꈷꈸꈹꈺꈻꈼꈽꈾꈿꉀꉁꉂꉃꉄꉅꉆꉇꉈꉉꉊꉋꉌꉍꉎꉏꉐꉑꉒꉓꉔꉕꉖꉗꉘꉙꉚꉛꉜꉝꉞꉟꉠꉡꉢꉣꉤꉥꉦꉧꉨꉩꉪꉫꉬꉭꉮꉯꉰꉱꉲꉳꉴꉵꉶꉷꉸꉹꉺꉻꉼꉽꉾꉿꊀꊁꊂꊃꊄꊅꊆꊇꊈꊉꊊꊋꊌꊍꊎꊏꊐꊑꊒꊓꊔꊕꊖꊗꊘꊙꊚꊛꊜꊝꊞꊟꊠꊡꊢꊣꊤꊥꊦꊧꊨꊩꊪꊫꊬꊭꊮꊯꊰꊱꊲꊳꊴꊵꊶꊷꊸꊹꊺꊻꊼꊽꊾꊿꋀꋁꋂꋃꋄꋅꋆꋇꋈꋉꋊꋋꋌꋍꋎꋏꋐꋑꋒꋓꋔꋕꋖꋗꋘꋙꋚꋛꋜꋝꋞꋟꋠꋡꋢꋣꋤꋥꋦꋧꋨꋩꋪꋫꋬꋭꋮꋯꋰꋱꋲꋳꋴꋵꋶꋷꋸꋹꋺꋻꋼꋽꋾꋿꌀꌁꌂꌃꌄꌅꌆꌇꌈꌉꌊꌋꌌꌍꌎꌏꌐꌑꌒꌓꌔꌕꌖꌗꌘꌙꌚꌛꌜꌝꌞꌟꌠꌡꌢꌣꌤꌥꌦꌧꌨꌩꌪꌫꌬꌭꌮꌯꌰꌱꌲꌳꌴꌵꌶꌷꌸꌹꌺꌻꌼꌽꌾꌿꍀꍁꍂꍃꍄꍅꍆꍇꍈꍉꍊꍋꍌꍍꍎꍏꍐꍑꍒꍓꍔꍕꍖꍗꍘꍙꍚꍛꍜꍝꍞꍟꍠꍡꍢꍣꍤꍥꍦꍧꍨꍩꍪꍫꍬꍭꍮꍯꍰꍱꍲꍳꍴꍵꍶꍷꍸꍹꍺꍻꍼꍽꍾꍿꎀꎁꎂꎃꎄꎅꎆꎇꎈꎉꎊꎋꎌꎍꎎꎏꎐꎑꎒꎓꎔꎕꎖꎗꎘꎙꎚꎛꎜꎝꎞꎟꎠꎡꎢꎣꎤꎥꎦꎧꎨꎩꎪꎫꎬꎭꎮꎯꎰꎱꎲꎳꎴꎵꎶꎷꎸꎹꎺꎻꎼꎽꎾꎿꏀꏁꏂꏃꏄꏅꏆꏇꏈꏉꏊꏋꏌꏍꏎꏏꏐꏑꏒꏓꏔꏕꏖꏗꏘꏙꏚꏛꏜꏝꏞꏟꏠꏡꏢꏣꏤꏥꏦꏧꏨꏩꏪꏫꏬꏭꏮꏯꏰꏱꏲꏳꏴꏵꏶꏷꏸꏹꏺꏻꏼꏽꏾꏿꐀꐁꐂꐃꐄꐅꐆꐇꐈꐉꐊꐋꐌꐍꐎꐏꐐꐑꐒꐓꐔꐕꐖꐗꐘꐙꐚꐛꐜꐝꐞꐟꐠꐡꐢꐣꐤꐥꐦꐧꐨꐩꐪꐫꐬꐭꐮꐯꐰꐱꐲꐳꐴꐵꐶꐷꐸꐹꐺꐻꐼꐽꐾꐿꑀꑁꑂꑃꑄꑅꑆꑇꑈꑉꑊꑋꑌꑍꑎꑏꑐꑑꑒꑓꑔꑕꑖꑗꑘꑙꑚꑛꑜꑝꑞꑟꑠꑡꑢꑣꑤꑥꑦꑧꑨꑩꑪꑫꑬꑭꑮꑯꑰꑱꑲꑳꑴꑵꑶꑷꑸꑹꑺꑻꑼꑽꑾꑿꒀꒁꒂꒃꒄꒅꒆꒇꒈꒉꒊꒋꒌ꒐꒑꒒꒓꒔꒕꒖꒗꒘꒙꒚꒛꒜꒝꒞꒟꒠꒡꒢꒣꒤꒥꒦꒧꒨꒩꒪꒫꒬꒭꒮꒯꒰꒱꒲꒳꒴꒵꒶꒷꒸꒹꒺꒻꒼꒽꒾꒿꓀꓁꓂꓃꓄꓅꓆" - ), - ] - ) + public static var root: CandidateNode = .init(name: "/") } diff --git a/Source/Modules/SymbolMenuDefaultData.swift b/Source/Modules/SymbolMenuDefaultData.swift new file mode 100644 index 00000000..3af5b4c5 --- /dev/null +++ b/Source/Modules/SymbolMenuDefaultData.swift @@ -0,0 +1,393 @@ +// (c) 2021 and onwards The vChewing Project (MIT-NTL License). +// ==================== +// This code is released under the MIT license (SPDX-License-Identifier: MIT) +// ... with NTL restriction stating that: +// No trademark license is granted to use the trade names, trademarks, service +// marks, or product names of Contributor, except as required to fulfill notice +// requirements defined in MIT License. + +import Shared + +extension CandidateNode { + public static func load(url: URL) { + DispatchQueue.main.async { + // 這兩個變數單獨拿出來,省得每次都重建還要浪費算力。 + var arrLines = [String.SubSequence]() + var fieldSlice = [Substring.SubSequence]() + var arrMembers = [CandidateNode]() + do { + arrLines = try String(contentsOfFile: url.path, encoding: .utf8).split(separator: "\n") + for strLine in arrLines.lazy.filter({ !$0.isEmpty }) { + fieldSlice = strLine.split(separator: "=") + switch fieldSlice.count { + case 1: arrMembers.append(.init(name: String(fieldSlice[0]))) + case 2: + arrMembers.append(.init(name: String(fieldSlice[0]), symbols: .init(fieldSlice[1].map { String($0) }))) + default: break + } + } + Self.root = arrMembers.isEmpty ? defaultSymbolRoot : .init(name: "/", members: arrMembers) + } catch { + Self.root = defaultSymbolRoot + } + } + } + + // MARK: - Static data. + + static let catCommonSymbols = NSLocalizedString("catCommonSymbols", comment: "") + static let catHoriBrackets = NSLocalizedString("catHoriBrackets", comment: "") + static let catVertBrackets = NSLocalizedString("catVertBrackets", comment: "") + static let catAlphabets = NSLocalizedString("catAlphabets", comment: "") + static let catSpecialNumbers = NSLocalizedString("catSpecialNumbers", comment: "") + static let catMathSymbols = NSLocalizedString("catMathSymbols", comment: "") + static let catCurrencyUnits = NSLocalizedString("catCurrencyUnits", comment: "") + static let catSpecialSymbols = NSLocalizedString("catSpecialSymbols", comment: "") + static let catUnicodeSymbols = NSLocalizedString("catUnicodeSymbols", comment: "") + static let catCircledKanjis = NSLocalizedString("catCircledKanjis", comment: "") + static let catCircledKataKana = NSLocalizedString("catCircledKataKana", comment: "") + static let catBracketKanjis = NSLocalizedString("catBracketKanjis", comment: "") + static let catSingleTableLines = NSLocalizedString("catSingleTableLines", comment: "") + static let catDoubleTableLines = NSLocalizedString("catDoubleTableLines", comment: "") + static let catFillingBlocks = NSLocalizedString("catFillingBlocks", comment: "") + static let catLineSegments = NSLocalizedString("catLineSegments", comment: "") + static let catKana = NSLocalizedString("catKana", comment: "") + static let catCombinations = NSLocalizedString("catCombinations", comment: "") + static let catPhonabets = NSLocalizedString("catPhonabets", comment: "") + static let catCircledASCII = NSLocalizedString("catCircledASCII", comment: "") + static let catBracketedASCII = NSLocalizedString("catBracketedASCII", comment: "") + static let catMusicSymbols = NSLocalizedString("catMusicSymbols", comment: "") + static let catThai = NSLocalizedString("catThai", comment: "") + static let catYi = NSLocalizedString("catYi", comment: "") + + private static let defaultSymbolRoot: CandidateNode = .init( + name: "/", + members: [ + CandidateNode(name: " "), + CandidateNode(name: "`"), + CandidateNode( + name: catCommonSymbols, + symbols: [ + ",", "、", "。", ".", "?", "!", ";", ":", "‧", "‥", "﹐", "﹒", "˙", "·", "‘", "’", "“", "”", "〝", "〞", "‵", "′", + "〃", "~", "$", "%", "﹪", "@", "&", "#", "*", "・", "…", "—", "〜", "/", "\", "_", "―", "‖", "﹫", "﹟", "﹠", "﹡", + ] + ), + CandidateNode( + name: catHoriBrackets, + symbols: [ + "(", ")", "[", "]", "{", "}", "〈", "〉", "《", "》", "「", "」", "『", "』", "【", "】", "〔", "〕", "〖", "〗", "〘", "〙", + "〚", "〛", "︗", "︘", "︷", "︸", "︹", "︺", "︻", "︼", "︽", "︾", "︿", "﹀", "﹁", "﹂", "﹃", "﹄", "﹇", "﹈", "︵", "︶", + "[", "]", "{", "}", "⁅", "⁆", "⎡", "⎢", "⎣", "⎤", "⎥", "⎦", "⎧", "⎨", "⎩", "⎪", "⎫", "⎬", "⎭", "⎰", "⎱", "「", + "」", "❬", "❭", "❰", "❱", "❲", "❳", "❴", "❵", "⟦", "⟧", "⟨", "⟩", "⟪", "⟫", "⟬", "⟭", "⦃", "⦄", "⦇", "⦈", "⦉", + "⦊", "⦋", "⦌", "⦍", "⦎", "⦏", "⦐", "⦑", "⦒", "⦓", "⦔", "⦕", "⦖", "⦗", "⦘", "⧼", "⧽", "⸂", "⸃", "⸄", "⸅", "⸉", + "⸊", "⸌", "⸍", "⸜", "⸝", "⸢", "⸣", "⸤", "⸥", "⸦", "⸧", "⎴", "⎵", "⎶", "⏞", "⏟", "⏠", "⏡", "﹙", "﹚", "﹛", "﹜", + "﹝", "﹞", "﹤", "﹥", "‘", "’", "“", "”", "〝", "〞", "‵", "′", "″", "'", + ] + ), + CandidateNode( + name: catVertBrackets, + symbols: ["︵", "︶", "﹁", "﹂", "︹", "︺", "︷", "︸", "︿", "﹀", "﹃", "﹄", "︽", "︾", "︻", "︼"] + ), + CandidateNode( + name: catAlphabets, + symbols: [ + "α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ", "λ", "μ", "ν", "ξ", "ο", "π", "ρ", "σ", "τ", "υ", "φ", "χ", + "ψ", "ω", "Α", "Β", "Γ", "Δ", "Ε", "Ζ", "Η", "Θ", "Ι", "Κ", "Λ", "Μ", "Ν", "Ξ", "Ο", "Π", "Ρ", "Σ", "Τ", "Υ", + "Φ", "Χ", "Ψ", "Ω", "а", "б", "в", "г", "д", "е", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", + "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы", "ь", "э", "ю", "я", "ё", "А", "Б", "В", "Г", "Д", "Е", "Ж", + "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", + "Э", "Ю", "Я", "Ё", "à", "á", "è", "é", "ê", "ì", "í", "ò", "ó", "ù", "ú", "ü", "ā", "ē", "ě", "ī", "ń", "ň", + "ō", "ū", "ǎ", "ǐ", "ǒ", "ǔ", "ǖ", "ǘ", "ǚ", "ǜ", "ɑ", "ɡ", "¨", "·", + ] + ), + CandidateNode( + name: catSpecialNumbers, + symbols: [ + "Ⅰ", "Ⅱ", "Ⅲ", "Ⅳ", "Ⅴ", "Ⅵ", "Ⅶ", "Ⅷ", "Ⅸ", "Ⅹ", "Ⅺ", "Ⅻ", "ⅰ", "ⅱ", "ⅲ", "ⅳ", "ⅴ", "ⅵ", "ⅶ", "ⅷ", "ⅸ", "ⅹ", + "ⅺ", "ⅻ", "〇", "〡", "〢", "〣", "〤", "〥", "〦", "〧", "〨", "〩", + ] + ), + CandidateNode( + name: catMathSymbols, + symbols: [ + "﹢", "﹤", "﹥", "+", "-", "<", "=", ">", "✕", "%", "+", "<", "=", ">", "¡", "¢", "«", "°", "±", "µ", "»", "¼", + "½", "¾", "¿", "×", "÷", "ˇ", "θ", "π", "‰", "₠", "₡", "₢", "₣", "₤", "₥", "₦", "₧", "₨", "₩", "₪", "₫", "€", + "℀", "℁", "℃", "℅", "℆", "℉", "⅓", "⅔", "⅕", "⅖", "⅗", "⅘", "⅙", "⅚", "⅛", "⅜", "⅝", "⅞", "⅟", "∀", "∁", "∂", + "∃", "∄", "∅", "∆", "∇", "∈", "∉", "∊", "∋", "∌", "∍", "∎", "∏", "∐", "∑", "−", "∓", "∔", "∕", "∖", "∗", "∘", + "∙", "√", "∛", "∜", "∝", "∞", "∟", "∠", "∡", "∢", "∣", "∤", "∥", "∧", "∨", "∩", "∪", "∫", "∬", "∭", "∮", "∯", + "∰", "∱", "∲", "∳", "∴", "∵", "∶", "∷", "∸", "∹", "∺", "∻", "∼", "∽", "∾", "∿", "≀", "≁", "≂", "≃", "≄", "≅", + "≆", "≇", "≈", "≉", "≊", "≋", "≌", "≍", "≎", "≏", "≐", "≑", "≒", "≓", "≔", "≕", "≖", "≗", "≘", "≙", "≚", "≛", + "≜", "≝", "≞", "≟", "≠", "≡", "≢", "≣", "≤", "≥", "≦", "≧", "≨", "≩", "≪", "≫", "≬", "≭", "≮", "≯", "≰", "≱", + "≲", "≳", "≴", "≵", "≶", "≷", "≸", "≹", "≺", "≻", "≼", "≽", "≾", "≿", "⊀", "⊁", "⊂", "⊃", "⊄", "⊅", "⊆", "⊇", + "⊈", "⊉", "⊊", "⊋", "⊌", "⊍", "⊎", "⊏", "⊐", "⊑", "⊒", "⊓", "⊔", "⊕", "⊖", "⊗", "⊘", "⊙", "⊚", "⊛", "⊜", "⊝", + "⊞", "⊟", "⊠", "⊡", "⊢", "⊣", "⊤", "⊥", "⊦", "⊧", "⊨", "⊩", "⊪", "⊫", "⊬", "⊭", "⊮", "⊯", "⊰", "⊱", "⊲", "⊳", + "⊴", "⊵", "⊶", "⊷", "⊸", "⊹", "⊺", "⊻", "⊼", "⊽", "⊾", "⊿", "⋀", "⋁", "⋂", "⋃", "⋄", "⋅", "⋆", "⋇", "⋈", "⋉", + "⋊", "⋋", "⋌", "⋍", "⋎", "⋏", "⋐", "⋑", "⋒", "⋓", "⋔", "⋕", "⋖", "⋗", "⋘", "⋙", "⋚", "⋛", "⋜", "⋝", "⋞", "⋟", + "⋠", "⋡", "⋢", "⋣", "⋤", "⋥", "⋦", "⋧", "⋨", "⋩", "⋪", "⋫", "⋬", "⋭", "⋮", "⋯", "⋰", "⋱", + ] + ), + CandidateNode( + name: catCurrencyUnits, + symbols: [ + "$", "€", "¥", "¢", "£", "₽", "₨", "₩", "฿", "₺", "₮", "₱", "₭", "₴", "₦", "৲", "৳", "૱", "௹", "﷼", "₹", "₲", + "₪", "₡", "₫", "៛", "₵", "₢", "₸", "₤", "₳", "₥", "₠", "₣", "₰", "₧", "₯", "₶", "₷", "¤", "¢", "¥", "£", "$", + "﹩", "₩", + ] + ), + CandidateNode( + name: catSpecialSymbols, + symbols: [ + "↩", "⌘", "⎋", "⏏", "⇥", "⇤", "⇪", "⇧", "⌤", "⌥", "⎇", "␣", "⌃", "⌄", "⌅", "⌆", "⌦", "⌫", "⌧", "⇱", "↖", "↸", + "⇲", "↘", "⇞", "⇟", "↑", "↓", "←", "→", "⇡", "⇣", "⇠", "⇢", "⚙", "⇭", "⌽", "⌀", "⌁", "⌂", "⌐", "⌑", "⌒", "⌓", + "⌔", "⌕", "⌖", "⌗", "⌙", "⌨", "⎄", "⎅", "⎆", "⎈", "⎉", "⎊", "⎌", "⌚", "⌛", "⎗", "⎘", "⎙", "⎚", "⎀", "⎁", "⎂", + "⎃", "⌇", "⌈", "⌉", "⌊", "⌋", "⌌", "⌍", "⌏", "⌠", "⎮", "⌡", "⌢", "⌣", "⌜", "⌝", "⌞", "⌟", "⁒", "〈", "〉", "⌬", + "⌭", "⌮", "⌯", "⌰", "⌱", "⌲", "⌳", "↗", "↙", "↺", "⇩", "⇦", "⇨", "⇄", "⇆", "⇅", "⇵", "↻", "◎", "○", "●", "⊕", + "⊙", "※", "△", "▲", "☆", "★", "◇", "◆", "□", "■", "▽", "▼", "№", "℡", "§", "〒", "♀", "♂", "↯", "¶", "©", "®", + "™", "🜀", "🜁", "🜂", "🜃", "🜄", "🜅", "🜆", "🜇", "🜈", "🜉", "🜊", "🜋", "🜌", "🜍", "🜎", "🜏", "🜐", "🜑", "🜒", "🜓", "🜔", + "🜕", "🜖", "🜗", "🜘", "🜙", "🜚", "🜛", "🜜", "🜝", "🜞", "🜟", "🜠", "🜡", "🜢", "🜣", "🜤", "🜥", "🜦", "🜧", "🜨", "🜩", "🜪", + "🜫", "🜬", "🜭", "🜮", "🜯", "🜰", "🜱", "🜲", "🜳", "🜴", "🜵", "🜶", "🜷", "🜸", "🜹", "🜺", "🜻", "🜼", "🜽", "🜾", "🜿", "🝀", + "🝁", "🝂", "🝃", "🝄", "🝅", "🝆", "🝇", "🝈", "🝉", "🝊", "🝋", "🝌", "🝍", "🝎", "🝏", "🝐", "🝑", "🝒", "🝓", "🝔", "🝕", "🝖", + "🝗", "🝘", "🝙", "🝚", "🝛", "🝜", "🝝", "🝞", "🝟", "🝠", "🝡", "🝢", "🝣", "🝤", "🝥", "🝦", "🝧", "🝨", "🝩", "🝪", "🝫", "🝬", + "🝭", "🝮", "🝯", "🝰", "🝱", "🝲", "🝳", "↚", "↛", "↜", "↝", "↞", "↟", "↠", "↡", "↢", "↣", "↤", "↥", "↦", "↧", "↨", + "↪", "↫", "↬", "↭", "↮", + ] + ), + CandidateNode( + name: catUnicodeSymbols, + symbols: [ + "※", "∮", "∴", "∵", "∽", "☀", "☁", "☂", "☃", "☺", "☻", "♠", "♣", "♥", "♦", "♨", "♩", "♪", "♫", "♬", "♭", "♯", + "■", "□", "▢", "▣", "▤", "▥", "▦", "▧", "▨", "▩", "▪", "▫", "▬", "▭", "▮", "▯", "▰", "▱", "▲", "△", "▴", "▵", + "▶", "▷", "▸", "▹", "►", "▻", "▼", "▽", "▾", "▿", "◀", "◁", "◂", "◃", "◄", "◅", "◆", "◇", "◈", "◉", "◊", "○", + "◌", "◍", "◎", "●", "◐", "◑", "◒", "◓", "◔", "◕", "◖", "◗", "◘", "◙", "◚", "◛", "◜", "◝", "◞", "◟", "◠", "◡", + "◢", "◣", "◤", "◥", "◦", "◧", "◨", "◩", "◪", "◫", "◬", "◭", "◮", "◯", "◰", "◱", "◲", "◳", "◴", "◵", "◶", "◷", + "◸", "◹", "◺", "◻", "◼", "◽", "◾", "◿", "☄", "★", "☆", "☇", "☈", "☉", "☊", "☋", "☌", "☍", "☎", "☏", "☐", "☑", + "☒", "☓", "☔", "☕", "☖", "☗", "☘", "☙", "☚", "☛", "☜", "☝", "☞", "☟", "☠", "☡", "☢", "☣", "☤", "☥", "☦", "☧", + "☨", "☩", "☪", "☫", "☬", "☭", "☮", "☯", "☰", "☱", "☲", "☳", "☴", "☵", "☶", "☷", "☸", "☹", "☼", "☽", "☾", "☿", + "♀", "♁", "♂", "♃", "♄", "♅", "♆", "♇", "♈", "♉", "♊", "♋", "♌", "♍", "♎", "♏", "♐", "♑", "♒", "♓", "♔", "♕", + "♖", "♗", "♘", "♙", "♚", "♛", "♜", "♝", "♞", "♟", "♡", "♢", "♤", "♧", "♮", "♰", "♱", "♲", "♳", "♴", "♵", "♶", + "♷", "♸", "♹", "♺", "♻", "♼", "♽", "♾", "♿", "⚀", "⚁", "⚂", "⚃", "⚄", "⚅", "⚆", "⚇", "⚈", "⚉", "⚊", "⚋", "⚌", + "⚍", "⚎", "⚏", "⚐", "⚑", "⚒", "⚓", "⚔", "⚕", "⚖", "⚗", "⚘", "⚙", "⚚", "⚛", "⚜", "⚝", "⚞", "⚟", "⚠", "⚡", "⚢", + "⚣", "⚤", "⚥", "⚦", "⚧", "⚨", "⚩", "⚪", "⚫", "⚬", "⚭", "⚮", "⚯", "⚰", "⚱", "⚲", "⚳", "⚴", "⚵", "⚶", "⚷", "⚸", + "⚹", "⚺", "⚻", "⚼", "⚽", "⚾", "⚿", "⛀", "⛁", "⛂", "⛃", "⛄", "⛅", "⛆", "⛇", "⛈", "⛉", "⛊", "⛋", "⛌", "⛍", "⛎", + "⛏", "⛐", "⛑", "⛒", "⛓", "⛔", "⛕", "⛖", "⛗", "⛘", "⛙", "⛚", "⛛", "⛜", "⛝", "⛞", "⛟", "⛠", "⛡", "⛢", "⛣", "⛤", + "⛥", "⛦", "⛧", "⛨", "⛩", "⛪", "⛫", "⛬", "⛭", "⛮", "⛯", "⛰", "⛱", "⛲", "⛳", "⛴", "⛵", "⛶", "⛷", "⛸", "⛹", "⛺", + "⛻", "⛼", "⛽", "⛾", "⛿", "✁", "✂", "✃", "✄", "✅", "✆", "✇", "✈", "✉", "✊", "✋", "✌", "✍", "✎", "✏", "✐", "✑", + "✒", "✓", "✔", "✕", "✖", "✗", "✘", "✙", "✚", "✛", "✜", "✝", "✞", "✟", "✠", "✡", "✢", "✣", "✤", "✥", "✦", "✧", + "✨", "✩", "✪", "✫", "✬", "✭", "✮", "✯", "✰", "✱", "✲", "✳", "✴", "✵", "✶", "✷", "✸", "✹", "✺", "✻", "✼", "✽", + "✾", "✿", "❀", "❁", "❂", "❃", "❄", "❅", "❆", "❇", "❈", "❉", "❊", "❋", "❌", "❍", "❎", "❏", "❐", "❑", "❒", "❓", + "❔", "❕", "❖", "❗", "❘", "❙", "❚", "❛", "❜", "❝", "❞", "❟", "❠", "❡", "❢", "❣", "❤", "❥", "❦", "❧", "❨", "❩", + "❪", "❫", "❬", "❭", "❮", "❯", "❰", "❱", "❲", "❳", "❴", "❵", "➔", "➕", "➖", "➗", "➘", "➙", "➚", "➛", "➜", "➝", + "➞", "➟", "➠", "➡", "➢", "➣", "➤", "➥", "➦", "➧", "➨", "➩", "➪", "➫", "➬", "➭", "➮", "➯", "➰", "➱", "➲", "➳", + "➴", "➵", "➶", "➷", "➸", "➹", "➺", "➻", "➼", "➽", "➾", "➿", "⬀", "⬁", "⬂", "⬃", "⬄", "⬅", "⬆", "⬇", "⬈", "⬉", + "⬊", "⬋", "⬌", "⬍", "⬎", "⬏", "⬐", "⬑", "⬒", "⬓", "⬔", "⬕", "⬖", "⬗", "⬘", "⬙", "⬚", "⬛", "⬜", "⬝", "⬞", "⬟", + "⬠", "⬡", "⬢", "⬣", "⬤", "⬥", "⬦", "⬧", "⬨", "⬩", "⬪", "⬫", "⬬", "⬭", "⬮", "⬯", "⬰", "⬱", "⬲", "⬳", "⬴", "⬵", + "⬶", "⬷", "⬸", "⬹", "⬺", "⬻", "⬼", "⬽", "⬾", "⬿", "⭀", "⭁", "⭂", "⭃", "⭄", "⭅", "⭆", "⭇", "⭈", "⭉", "⭊", "⭋", + "⭌", "⭐", "⭑", "⭒", "⭓", "⭔", "⭕", "⭖", "⭗", "⭘", "⭙", "₮", "〠", "〶", "ↀ", "ↁ", "ↂ", "₭", "〇", "〄", "㉿", "〆", + "₯", "ℂ", "℄", + ] + ), + CandidateNode( + name: catMusicSymbols, + symbols: [ + "𝄀", "𝄁", "𝄂", "𝄃", "𝄄", "𝄅", "𝄆", "𝄇", "𝄈", "𝄉", "𝄊", "𝄋", "𝄌", "𝄍", "𝄎", "𝄏", "𝄐", "𝄑", "𝄒", "𝄓", "𝄔", "𝄕", + "𝄖", "𝄗", "𝄘", "𝄙", "𝄚", "𝄛", "𝄜", "𝄝", "𝄞", "𝄟", "𝄠", "𝄡", "𝄢", "𝄣", "𝄤", "𝄥", "𝄦", "𝄩", "𝄪", "𝄫", "𝄬", "𝄭", + "𝄮", "𝄯", "𝄰", "𝄱", "𝄲", "𝄳", "𝄴", "𝄵", "𝄶", "𝄷", "𝄸", "𝄹", "𝄺", "𝄻", "𝄼", "𝄽", "𝄾", "𝄿", "𝅀", "𝅁", "𝅂", "𝅃", + "𝅄", "𝅅", "𝅆", "𝅇", "𝅈", "𝅉", "𝅊", "𝅋", "𝅌", "𝅍", "𝅎", "𝅏", "𝅐", "𝅑", "𝅒", "𝅓", "𝅔", "𝅕", "𝅖", "𝅗", "𝅗𝅥", "𝅘", + "𝅘𝅥", "𝅘𝅥𝅮", "𝅘𝅥𝅯", "𝅘𝅥𝅰", "𝅘𝅥𝅱", "𝅘𝅧𝅨𝅩𝅥𝅲𝅥𝅦", "𝅙", "𝅚", "𝅛", "𝅜", "𝅝", "𝅪", "𝅫", "𝅬𝅮𝅯𝅰𝅱𝅲𝅭", "𝅳", "𝅴", "𝅵", "𝅶", "𝅷", "𝅸", "𝅹", "𝅺", + "𝅻𝅼𝅽𝅾𝅿𝆀𝆁𝆂", "𝆃", "𝆄𝆊𝆋𝆅𝆆𝆇𝆈𝆉", "𝆌", "𝆍", "𝆎", "𝆏", "𝆐", "𝆑", "𝆒", "𝆓", "𝆔", "𝆕", "𝆖", "𝆗", "𝆘", "𝆙", "𝆚", "𝆛", "𝆜", "𝆝", "𝆞", + "𝆟", "𝆠", "𝆡", "𝆢", "𝆣", "𝆤", "𝆥", "𝆦", "𝆧", "𝆨", "𝆩𝆪𝆫𝆬𝆭", "𝆮", "𝆯", "𝆰", "𝆱", "𝆲", "𝆳", "𝆴", "𝆵", "𝆶", "𝆷", "𝆸", + "𝆹", "𝆹𝅥", "𝆹𝅥𝅮", "𝆹𝅥𝅯", "𝆺", "𝆺𝅥", "𝆺𝅥𝅮", "𝆺𝅥𝅯", "𝇁", "𝇂", "𝇃", "𝇄", "𝇅", "𝇆", "𝇇", "𝇈", "𝇉", "𝇊", "𝇋", "𝇌", "𝇍", "𝇎", + "𝇏", "𝇐", "𝇑", "𝇒", "𝇓", "𝇔", "𝇕", "𝇖", "𝇗", "𝇘", "𝇙", "𝇚", "𝇛", "𝇜", "𝇝", "𝇞", "𝇟", "𝇠", "𝇡", "𝇢", "𝇣", "𝇤", + "𝇥", "𝇦", "𝇧", "𝇨", + ] + ), + CandidateNode( + name: catCircledKanjis, + symbols: [ + "㊊", "㊋", "㊌", "㊍", "㊎", "㊏", "㊐", "㊑", "㊒", "㊓", "㊔", "㊕", "㊖", "㊗︎", "㊘", "㊙︎", "㊚", "㊛", "㊜", "㊝", "㊞", "㊟", + "㊠", "㊡", "㊢", "㊣", "㊤", "㊥", "㊦", "㊧", "㊨", "㊩", "㊪", "㊫", "㊬", "㊭", "㊮", "㊯", "㊰", "㊀", "㊁", "㊂", "㊃", "㊄", + "㊅", "㊆", "㊇", "㊈", "㊉", "🈚︎", "🈯︎", + ] + ), + CandidateNode( + name: catCircledKataKana, + symbols: [ + "㋐", "㋑", "㋒", "㋓", "㋔", "㋕", "㋖", "㋗", "㋘", "㋙", "㋚", "㋛", "㋜", "㋝", "㋞", "㋟", "㋠", "㋡", "㋢", "㋣", "㋤", "㋥", + "㋦", "㋧", "㋨", "㋩", "㋪", "㋫", "㋬", "㋭", "㋮", "㋯", "㋰", "㋱", "㋲", "㋳", "㋴", "㋵", "㋶", "㋷", "㋸", "㋹", "㋺", "㋻", + "㋼", "㋽", "㋾", + ] + ), + CandidateNode( + name: catBracketKanjis, + symbols: [ + "㈪", "㈫", "㈬", "㈭", "㈮", "㈯", "㈰", "㈱", "㈲", "㈳", "㈴", "㈵", "㈶", "㈷", "㈸", "㈹", "㈺", "㈻", "㈼", "㈽", "㈾", "㈿", + "㉀", "㉁", "㉂", "㉃", + ] + ), + CandidateNode( + name: catSingleTableLines, + symbols: [ + "─", "│", "┌", "┐", "└", "┕", "┘", "├", "┤", "┬", "┴", "┼", "═", "╞", "╡", "╪", "╭", "╮", "╯", "╰", "▕", + ] + ), + CandidateNode( + name: catDoubleTableLines, + symbols: [ + "═", "║", "╒", "╓", "╔", "╕", "╖", "╗", "╘", "╙", "╚", "╛", "╜", "╝", "╞", "╟", "╠", "╡", "╢", "╣", "╤", "╥", + "╦", "╧", "╨", "╩", "╪", "╫", "╬", + ] + ), + CandidateNode( + name: catFillingBlocks, + symbols: [ + "_", "ˍ", "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█", "▏", "▎", "▍", "▌", "▋", "▊", "▉", "◢", "◣", "◥", "◤", + ] + ), + CandidateNode( + name: catLineSegments, + symbols: [ + "﹣", "﹦", "≡", "|", "∣", "∥", "–", "︱", "—", "︳", "╴", "¯", " ̄", "﹉", "﹊", "﹍", "﹎", "﹋", "﹌", "﹏", "︴", "∕", + "﹨", "╱", "╲", "/", "\", "ˍ", "━", "┃", "▕", "〓", "╳", "∏", "ˆ", "⌒", "┄", "┅", "┆", "┇", "┈", "┉", "┊", "┋", + ] + ), + CandidateNode( + name: catKana, + symbols: [ + "ぁ", "あ", "ぃ", "い", "ぅ", "う", "ゔ", "ぇ", "え", "ぉ", "お", "か", "が", "き", "ぎ", "く", "ぐ", "け", "げ", "こ", "ご", "さ", + "ざ", "し", "じ", "す", "ず", "せ", "ぜ", "そ", "ぞ", "た", "だ", "ち", "ぢ", "っ", "つ", "づ", "て", "で", "と", "ど", "な", "に", + "ぬ", "ね", "の", "は", "ば", "ひ", "び", "ふ", "ぶ", "へ", "べ", "ほ", "ぼ", "ま", "み", "む", "め", "も", "ゃ", "や", "ゅ", "ゆ", + "ょ", "よ", "ら", "ら゚", "り", "り゚", "る", "る゚", "れ", "れ゚", "ろ", "ろ゚", "ゎ", "わ", "わ゙", "ゐ", "ゐ゙", "ゑ", "ゑ゙", "を", "を゙", "ん", + "ゕ", "ゖ", "ゝ", "ゞ", "ゟ", "〻", "゠", "ァ", "ア", "ィ", "イ", "ゥ", "ウ", "ヴ", "ェ", "エ", "ォ", "オ", "カ", "ガ", "キ", "ギ", + "ク", "グ", "ケ", "ゲ", "コ", "ゴ", "サ", "ザ", "シ", "ジ", "ス", "ズ", "セ", "ゼ", "ソ", "ゾ", "タ", "ダ", "チ", "ヂ", "ッ", "ツ", + "ヅ", "テ", "デ", "ト", "ド", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "バ", "パ", "ヒ", "ビ", "ピ", "フ", "ブ", "プ", "ヘ", "ベ", "ペ", + "ホ", "ボ", "ポ", "マ", "ミ", "ム", "メ", "モ", "ャ", "ヤ", "ュ", "ユ", "ョ", "ヨ", "ラ", "ラ゚", "リ", "リ゚", "ル", "ル゚", "レ", "レ゚", + "ロ", "ロ゚", "ヮ", "ワ", "ヷ", "ヰ", "ヸ", "ヱ", "ヹ", "ヲ", "ヺ", "ン", "ヵ", "ヶ", "・", "ー", "ヽ", "ヾ", "ヿ", "々", "ㇰ", "ㇱ", + "ㇲ", "ㇳ", "ㇴ", "ㇵ", "ㇶ", "ㇷ", "ㇸ", "ㇹ", "ㇺ", "ㇻ", "ㇼ", "ㇽ", "ㇾ", "ㇿ", "・", "ヲ", "ァ", "ィ", "ゥ", "ェ", "ォ", "ャ", + "ュ", "ョ", "ッ", "ー", "ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ツ", + "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", + "ル", "レ", "ロ", "ワ", "ン", " ゙", " ゚", "〲", "〱", "〳", "〴", "〵", + ] + ), + CandidateNode( + name: catCombinations, + symbols: [ + "㍘", "㍙", "㍚", "㍛", "㍜", "㍝", "㍞", "㍟", "㍠", "㍡", "㍢", "㍣", "㍤", "㍥", "㍦", "㍧", "㍨", "㍩", "㍪", "㍫", "㍬", "㍭", + "㍮", "㍯", "㍰", "㏠", "㏡", "㏢", "㏣", "㏤", "㏥", "㏦", "㏧", "㏨", "㏩", "㏪", "㏫", "㏬", "㏭", "㏮", "㏯", "㏰", "㏱", "㏲", + "㏳", "㏴", "㏵", "㏶", "㏷", "㏸", "㏹", "㏺", "㏻", "㏼", "㏽", "㏾", "㍱", "㍲", "㍳", "㍴", "㍵", "㍶", "㍷", "㍸", "㍹", "㍺", + "㎀", "㎁", "㎂", "㎃", "㎄", "㎅", "㎆", "㎇", "㎈", "㎉", "㎊", "㎋", "㎌", "㎍", "㎎", "㎏", "㎐", "㎑", "㎒", "㎓", "㎔", "㎕", + "㎖", "㎗", "㎘", "㎙", "㎚", "㎛", "㎜", "㎝", "㎞", "㎟", "㎠", "㎡", "㎢", "㎣", "㎤", "㎥", "㎦", "㎧", "㎨", "㎩", "㎪", "㎫", + "㎬", "㎭", "㎮", "㎯", "㎰", "㎱", "㎲", "㎳", "㎴", "㎵", "㎶", "㎷", "㎸", "㎹", "㎺", "㎻", "㎼", "㎽", "㎾", "㎿", "㏀", "㏁", + "㏂", "㏃", "㏄", "㏅", "㏆", "㏇", "㏈", "㏉", "㏊", "㏋", "㏌", "㏍", "㏎", "㏏", "㏐", "㏑", "㏒", "㏓", "㏔", "㏕", "㏖", "㏗", + "㏘", "㏙", "㏚", "㏛", "㏜", "㏝", "㏞", "㏟", "㏿", "㋿", "㍼", "㍽", "㍾", "㍻", "㍿", "㌀", "㌁", "㌂", "㌃", "㌄", "㌅", "㌆", + "㌇", "㌈", "㌉", "㌊", "㌋", "㌌", "㌍", "㌎", "㌏", "㌐", "㌑", "㌒", "㌓", "㌔", "㌕", "㌖", "㌗", "㌘", "㌙", "㌚", "㌛", "㌜", + "㌝", "㌞", "㌟", "㌠", "㌡", "㌢", "㌣", "㌤", "㌥", "㌦", "㌧", "㌨", "㌩", "㌪", "㌫", "㌬", "㌭", "㌮", "㌯", "㌰", "㌱", "㌲", + "㌳", "㌴", "㌵", "㌶", "㌷", "㌸", "㌹", "㌺", "㌻", "㌼", "㌽", "㌾", "㌿", "㍀", "㍁", "㍂", "㍃", "㍄", "㍅", "㍆", "㍇", "㍈", + "㍉", "㍊", "㍋", "㍌", "㍍", "㍎", "㍏", "㍐", "㍑", "㍒", "㍓", "㍔", "㍕", "㍖", "㍗", + ] + ), + CandidateNode( + name: catPhonabets, + symbols: [ + "ㄅ", "ㄆ", "ㄇ", "ㄈ", "ㄉ", "ㄊ", "ㄋ", "ㄌ", "ㄍ", "ㄎ", "ㄏ", "ㄐ", "ㄑ", "ㄒ", "ㄓ", "ㄔ", "ㄕ", "ㄖ", "ㄗ", "ㄘ", "ㄙ", "ㄚ", + "ㄛ", "ㄜ", "ㄝ", "ㄞ", "ㄟ", "ㄠ", "ㄡ", "ㄢ", "ㄣ", "ㄤ", "ㄥ", "ㄦ", "ㄧ", "ㄨ", "ㄩ", "ㄪ", "ㄫ", "ㄬ", "ㄭ", "ㄮ", "ㄯ", "ㆵ", + "ㆠ", "ㆡ", "ㆢ", "ㆣ", "ㆤ", "ㆥ", "ㆦ", "ㆧ", "ㆨ", "ㆩ", "ㆪ", "ㆫ", "ㆬ", "ㆭ", "ㆮ", "ㆯ", "ㆰ", "ㆱ", "ㆲ", "ㆳ", "ㆴ", "ㆶ", + "ㆷ", "ㆸ", "ㆹ", "ㆺ", "ㆻ", "ㆼ", "ㆽ", "ㆾ", "ㆿ", "˙", "ˊ", "ˇ", "ˋ", "˪", "˫", + ] + ), + CandidateNode( + name: catCircledASCII, + symbols: [ + "①", "②", "③", "④", "⑤", "⑥", "⑦", "⑧", "⑨", "⑩", "⑪", "⑫", "⑬", "⑭", "⑮", "⑯", "⑰", "⑱", "⑲", "⑳", "Ⓐ", "Ⓑ", + "Ⓒ", "Ⓓ", "Ⓔ", "Ⓕ", "Ⓖ", "Ⓗ", "Ⓘ", "Ⓙ", "Ⓚ", "Ⓛ", "Ⓜ", "Ⓜ︎", "Ⓝ", "Ⓞ", "Ⓟ", "Ⓠ", "Ⓡ", "Ⓢ", "Ⓣ", "Ⓤ", "Ⓥ", "Ⓦ", + "Ⓧ", "Ⓨ", "Ⓩ", "ⓐ", "ⓑ", "ⓒ", "ⓓ", "ⓔ", "ⓕ", "ⓖ", "ⓗ", "ⓘ", "ⓙ", "ⓚ", "ⓛ", "ⓜ", "ⓝ", "ⓞ", "ⓟ", "ⓠ", "ⓡ", "ⓢ", + "ⓣ", "ⓤ", "ⓥ", "ⓦ", "ⓧ", "ⓨ", "ⓩ", "⓪", "⓫", "⓬", "⓭", "⓮", "⓯", "⓰", "⓱", "⓲", "⓳", "⓴", "⓵", "⓶", "⓷", "⓸", + "⓹", "⓺", "⓻", "⓼", "⓽", "⓾", "⓿", "❶", "❷", "❸", "❹", "❺", "❻", "❼", "❽", "❾", "❿", "➀", "➁", "➂", "➃", "➄", + "➅", "➆", "➇", "➈", "➉", "➊", "➋", "➌", "➍", "➎", "➏", "➐", "➑", "➒", "➓", "🄰", "🄱", "🄲", "🄳", "🄴", "🄵", "🄶", + "🄷", "🄸", "🄹", "🄺", "🄻", "🄼", "🄽", "🄾", "🄿", "🅀", "🅁", "🅂", "🅃", "🅄", "🅅", "🅆", "🅇", "🅈", "🅉", "🅐", "🅑", "🅒", + "🅓", "🅔", "🅕", "🅖", "🅗", "🅘", "🅙", "🅚", "🅛", "🅜", "🅝", "🅞", "🅟", "🅠", "🅡", "🅢", "🅣", "🅤", "🅥", "🅦", "🅧", "🅨", + "🅩", "🅰", "🅱", "🅲", "🅳", "🅴", "🅵", "🅶", "🅷", "🅸", "🅹", "🅺", "🅻", "🅼", "🅽", "🅾", "🅿︎", "🆀", "🆁", "🆂", "🆃", "🆄", + "🆅", "🆆", "🆇", "🆈", "🆉", + ] + ), + CandidateNode( + name: catBracketedASCII, + symbols: [ + "⑴", "⑵", "⑶", "⑷", "⑸", "⑹", "⑺", "⑻", "⑼", "⑽", "⑾", "⑿", "⒀", "⒁", "⒂", "⒃", "⒄", "⒅", "⒆", "⒇", "⒜", "⒝", + "⒞", "⒟", "⒠", "⒡", "⒢", "⒣", "⒤", "⒥", "⒦", "⒧", "⒨", "⒩", "⒪", "⒫", "⒬", "⒭", "⒮", "⒯", "⒰", "⒱", "⒲", "⒳", + "⒴", "⒵", "🄐", "🄑", "🄒", "🄓", "🄔", "🄕", "🄖", "🄗", "🄘", "🄙", "🄚", "🄛", "🄜", "🄝", "🄞", "🄟", "🄠", "🄡", "🄢", "🄣", + "🄤", "🄥", "🄦", "🄧", "🄨", "🄩", + ] + ), + CandidateNode( + name: catThai, + symbols: [ + "ก", "ข", "ฃ", "ค", "ฅ", "ฆ", "ง", "จ", "ฉ", "ช", "ซ", "ฌ", "ญ", "ฎ", "ฏ", "ฐ", "ฑ", "ฒ", "ณ", "ด", "ต", "ถ", + "ท", "ธ", "น", "บ", "ป", "ผ", "ฝ", "พ", "ฟ", "ภ", "ม", "ย", "ร", "ฤ", "ล", "ฦ", "ว", "ศ", "ษ", "ส", "ห", "ฬ", + "อ", "ฮ", "ฯ", "ะ", "ั", "า", "ำ", "ิ", "ี", "ึ", "ื", "ุ", "ู", "ฺ", "เ", "แ", "โ", "ใ", "ไ", "ๅ", "ๆ", + "็", "่", "้", "๊", "๋", "์", "ํ", "๎", "๏", "๐", "๑", "๒", "๓", "๔", "๕", "๖", "๗", "๘", "๙", "๚", "๛", + ] + ), + CandidateNode( + name: catYi, + symbols: [ + "ꀀ", "ꀁ", "ꀂ", "ꀃ", "ꀄ", "ꀅ", "ꀆ", "ꀇ", "ꀈ", "ꀉ", "ꀊ", "ꀋ", "ꀌ", "ꀍ", "ꀎ", "ꀏ", "ꀐ", "ꀑ", "ꀒ", "ꀓ", "ꀔ", "ꀕ", + "ꀖ", "ꀗ", "ꀘ", "ꀙ", "ꀚ", "ꀛ", "ꀜ", "ꀝ", "ꀞ", "ꀟ", "ꀠ", "ꀡ", "ꀢ", "ꀣ", "ꀤ", "ꀥ", "ꀦ", "ꀧ", "ꀨ", "ꀩ", "ꀪ", "ꀫ", + "ꀬ", "ꀭ", "ꀮ", "ꀯ", "ꀰ", "ꀱ", "ꀲ", "ꀳ", "ꀴ", "ꀵ", "ꀶ", "ꀷ", "ꀸ", "ꀹ", "ꀺ", "ꀻ", "ꀼ", "ꀽ", "ꀾ", "ꀿ", "ꁀ", "ꁁ", + "ꁂ", "ꁃ", "ꁄ", "ꁅ", "ꁆ", "ꁇ", "ꁈ", "ꁉ", "ꁊ", "ꁋ", "ꁌ", "ꁍ", "ꁎ", "ꁏ", "ꁐ", "ꁑ", "ꁒ", "ꁓ", "ꁔ", "ꁕ", "ꁖ", "ꁗ", + "ꁘ", "ꁙ", "ꁚ", "ꁛ", "ꁜ", "ꁝ", "ꁞ", "ꁟ", "ꁠ", "ꁡ", "ꁢ", "ꁣ", "ꁤ", "ꁥ", "ꁦ", "ꁧ", "ꁨ", "ꁩ", "ꁪ", "ꁫ", "ꁬ", "ꁭ", + "ꁮ", "ꁯ", "ꁰ", "ꁱ", "ꁲ", "ꁳ", "ꁴ", "ꁵ", "ꁶ", "ꁷ", "ꁸ", "ꁹ", "ꁺ", "ꁻ", "ꁼ", "ꁽ", "ꁾ", "ꁿ", "ꂀ", "ꂁ", "ꂂ", "ꂃ", + "ꂄ", "ꂅ", "ꂆ", "ꂇ", "ꂈ", "ꂉ", "ꂊ", "ꂋ", "ꂌ", "ꂍ", "ꂎ", "ꂏ", "ꂐ", "ꂑ", "ꂒ", "ꂓ", "ꂔ", "ꂕ", "ꂖ", "ꂗ", "ꂘ", "ꂙ", + "ꂚ", "ꂛ", "ꂜ", "ꂝ", "ꂞ", "ꂟ", "ꂠ", "ꂡ", "ꂢ", "ꂣ", "ꂤ", "ꂥ", "ꂦ", "ꂧ", "ꂨ", "ꂩ", "ꂪ", "ꂫ", "ꂬ", "ꂭ", "ꂮ", "ꂯ", + "ꂰ", "ꂱ", "ꂲ", "ꂳ", "ꂴ", "ꂵ", "ꂶ", "ꂷ", "ꂸ", "ꂹ", "ꂺ", "ꂻ", "ꂼ", "ꂽ", "ꂾ", "ꂿ", "ꃀ", "ꃁ", "ꃂ", "ꃃ", "ꃄ", "ꃅ", + "ꃆ", "ꃇ", "ꃈ", "ꃉ", "ꃊ", "ꃋ", "ꃌ", "ꃍ", "ꃎ", "ꃏ", "ꃐ", "ꃑ", "ꃒ", "ꃓ", "ꃔ", "ꃕ", "ꃖ", "ꃗ", "ꃘ", "ꃙ", "ꃚ", "ꃛ", + "ꃜ", "ꃝ", "ꃞ", "ꃟ", "ꃠ", "ꃡ", "ꃢ", "ꃣ", "ꃤ", "ꃥ", "ꃦ", "ꃧ", "ꃨ", "ꃩ", "ꃪ", "ꃫ", "ꃬ", "ꃭ", "ꃮ", "ꃯ", "ꃰ", "ꃱ", + "ꃲ", "ꃳ", "ꃴ", "ꃵ", "ꃶ", "ꃷ", "ꃸ", "ꃹ", "ꃺ", "ꃻ", "ꃼ", "ꃽ", "ꃾ", "ꃿ", "ꄀ", "ꄁ", "ꄂ", "ꄃ", "ꄄ", "ꄅ", "ꄆ", "ꄇ", + "ꄈ", "ꄉ", "ꄊ", "ꄋ", "ꄌ", "ꄍ", "ꄎ", "ꄏ", "ꄐ", "ꄑ", "ꄒ", "ꄓ", "ꄔ", "ꄕ", "ꄖ", "ꄗ", "ꄘ", "ꄙ", "ꄚ", "ꄛ", "ꄜ", "ꄝ", + "ꄞ", "ꄟ", "ꄠ", "ꄡ", "ꄢ", "ꄣ", "ꄤ", "ꄥ", "ꄦ", "ꄧ", "ꄨ", "ꄩ", "ꄪ", "ꄫ", "ꄬ", "ꄭ", "ꄮ", "ꄯ", "ꄰ", "ꄱ", "ꄲ", "ꄳ", + "ꄴ", "ꄵ", "ꄶ", "ꄷ", "ꄸ", "ꄹ", "ꄺ", "ꄻ", "ꄼ", "ꄽ", "ꄾ", "ꄿ", "ꅀ", "ꅁ", "ꅂ", "ꅃ", "ꅄ", "ꅅ", "ꅆ", "ꅇ", "ꅈ", "ꅉ", + "ꅊ", "ꅋ", "ꅌ", "ꅍ", "ꅎ", "ꅏ", "ꅐ", "ꅑ", "ꅒ", "ꅓ", "ꅔ", "ꅕ", "ꅖ", "ꅗ", "ꅘ", "ꅙ", "ꅚ", "ꅛ", "ꅜ", "ꅝ", "ꅞ", "ꅟ", + "ꅠ", "ꅡ", "ꅢ", "ꅣ", "ꅤ", "ꅥ", "ꅦ", "ꅧ", "ꅨ", "ꅩ", "ꅪ", "ꅫ", "ꅬ", "ꅭ", "ꅮ", "ꅯ", "ꅰ", "ꅱ", "ꅲ", "ꅳ", "ꅴ", "ꅵ", + "ꅶ", "ꅷ", "ꅸ", "ꅹ", "ꅺ", "ꅻ", "ꅼ", "ꅽ", "ꅾ", "ꅿ", "ꆀ", "ꆁ", "ꆂ", "ꆃ", "ꆄ", "ꆅ", "ꆆ", "ꆇ", "ꆈ", "ꆉ", "ꆊ", "ꆋ", + "ꆌ", "ꆍ", "ꆎ", "ꆏ", "ꆐ", "ꆑ", "ꆒ", "ꆓ", "ꆔ", "ꆕ", "ꆖ", "ꆗ", "ꆘ", "ꆙ", "ꆚ", "ꆛ", "ꆜ", "ꆝ", "ꆞ", "ꆟ", "ꆠ", "ꆡ", + "ꆢ", "ꆣ", "ꆤ", "ꆥ", "ꆦ", "ꆧ", "ꆨ", "ꆩ", "ꆪ", "ꆫ", "ꆬ", "ꆭ", "ꆮ", "ꆯ", "ꆰ", "ꆱ", "ꆲ", "ꆳ", "ꆴ", "ꆵ", "ꆶ", "ꆷ", + "ꆸ", "ꆹ", "ꆺ", "ꆻ", "ꆼ", "ꆽ", "ꆾ", "ꆿ", "ꇀ", "ꇁ", "ꇂ", "ꇃ", "ꇄ", "ꇅ", "ꇆ", "ꇇ", "ꇈ", "ꇉ", "ꇊ", "ꇋ", "ꇌ", "ꇍ", + "ꇎ", "ꇏ", "ꇐ", "ꇑ", "ꇒ", "ꇓ", "ꇔ", "ꇕ", "ꇖ", "ꇗ", "ꇘ", "ꇙ", "ꇚ", "ꇛ", "ꇜ", "ꇝ", "ꇞ", "ꇟ", "ꇠ", "ꇡ", "ꇢ", "ꇣ", + "ꇤ", "ꇥ", "ꇦ", "ꇧ", "ꇨ", "ꇩ", "ꇪ", "ꇫ", "ꇬ", "ꇭ", "ꇮ", "ꇯ", "ꇰ", "ꇱ", "ꇲ", "ꇳ", "ꇴ", "ꇵ", "ꇶ", "ꇷ", "ꇸ", "ꇹ", + "ꇺ", "ꇻ", "ꇼ", "ꇽ", "ꇾ", "ꇿ", "ꈀ", "ꈁ", "ꈂ", "ꈃ", "ꈄ", "ꈅ", "ꈆ", "ꈇ", "ꈈ", "ꈉ", "ꈊ", "ꈋ", "ꈌ", "ꈍ", "ꈎ", "ꈏ", + "ꈐ", "ꈑ", "ꈒ", "ꈓ", "ꈔ", "ꈕ", "ꈖ", "ꈗ", "ꈘ", "ꈙ", "ꈚ", "ꈛ", "ꈜ", "ꈝ", "ꈞ", "ꈟ", "ꈠ", "ꈡ", "ꈢ", "ꈣ", "ꈤ", "ꈥ", + "ꈦ", "ꈧ", "ꈨ", "ꈩ", "ꈪ", "ꈫ", "ꈬ", "ꈭ", "ꈮ", "ꈯ", "ꈰ", "ꈱ", "ꈲ", "ꈳ", "ꈴ", "ꈵ", "ꈶ", "ꈷ", "ꈸ", "ꈹ", "ꈺ", "ꈻ", + "ꈼ", "ꈽ", "ꈾ", "ꈿ", "ꉀ", "ꉁ", "ꉂ", "ꉃ", "ꉄ", "ꉅ", "ꉆ", "ꉇ", "ꉈ", "ꉉ", "ꉊ", "ꉋ", "ꉌ", "ꉍ", "ꉎ", "ꉏ", "ꉐ", "ꉑ", + "ꉒ", "ꉓ", "ꉔ", "ꉕ", "ꉖ", "ꉗ", "ꉘ", "ꉙ", "ꉚ", "ꉛ", "ꉜ", "ꉝ", "ꉞ", "ꉟ", "ꉠ", "ꉡ", "ꉢ", "ꉣ", "ꉤ", "ꉥ", "ꉦ", "ꉧ", + "ꉨ", "ꉩ", "ꉪ", "ꉫ", "ꉬ", "ꉭ", "ꉮ", "ꉯ", "ꉰ", "ꉱ", "ꉲ", "ꉳ", "ꉴ", "ꉵ", "ꉶ", "ꉷ", "ꉸ", "ꉹ", "ꉺ", "ꉻ", "ꉼ", "ꉽ", + "ꉾ", "ꉿ", "ꊀ", "ꊁ", "ꊂ", "ꊃ", "ꊄ", "ꊅ", "ꊆ", "ꊇ", "ꊈ", "ꊉ", "ꊊ", "ꊋ", "ꊌ", "ꊍ", "ꊎ", "ꊏ", "ꊐ", "ꊑ", "ꊒ", "ꊓ", + "ꊔ", "ꊕ", "ꊖ", "ꊗ", "ꊘ", "ꊙ", "ꊚ", "ꊛ", "ꊜ", "ꊝ", "ꊞ", "ꊟ", "ꊠ", "ꊡ", "ꊢ", "ꊣ", "ꊤ", "ꊥ", "ꊦ", "ꊧ", "ꊨ", "ꊩ", + "ꊪ", "ꊫ", "ꊬ", "ꊭ", "ꊮ", "ꊯ", "ꊰ", "ꊱ", "ꊲ", "ꊳ", "ꊴ", "ꊵ", "ꊶ", "ꊷ", "ꊸ", "ꊹ", "ꊺ", "ꊻ", "ꊼ", "ꊽ", "ꊾ", "ꊿ", + "ꋀ", "ꋁ", "ꋂ", "ꋃ", "ꋄ", "ꋅ", "ꋆ", "ꋇ", "ꋈ", "ꋉ", "ꋊ", "ꋋ", "ꋌ", "ꋍ", "ꋎ", "ꋏ", "ꋐ", "ꋑ", "ꋒ", "ꋓ", "ꋔ", "ꋕ", + "ꋖ", "ꋗ", "ꋘ", "ꋙ", "ꋚ", "ꋛ", "ꋜ", "ꋝ", "ꋞ", "ꋟ", "ꋠ", "ꋡ", "ꋢ", "ꋣ", "ꋤ", "ꋥ", "ꋦ", "ꋧ", "ꋨ", "ꋩ", "ꋪ", "ꋫ", + "ꋬ", "ꋭ", "ꋮ", "ꋯ", "ꋰ", "ꋱ", "ꋲ", "ꋳ", "ꋴ", "ꋵ", "ꋶ", "ꋷ", "ꋸ", "ꋹ", "ꋺ", "ꋻ", "ꋼ", "ꋽ", "ꋾ", "ꋿ", "ꌀ", "ꌁ", + "ꌂ", "ꌃ", "ꌄ", "ꌅ", "ꌆ", "ꌇ", "ꌈ", "ꌉ", "ꌊ", "ꌋ", "ꌌ", "ꌍ", "ꌎ", "ꌏ", "ꌐ", "ꌑ", "ꌒ", "ꌓ", "ꌔ", "ꌕ", "ꌖ", "ꌗ", + "ꌘ", "ꌙ", "ꌚ", "ꌛ", "ꌜ", "ꌝ", "ꌞ", "ꌟ", "ꌠ", "ꌡ", "ꌢ", "ꌣ", "ꌤ", "ꌥ", "ꌦ", "ꌧ", "ꌨ", "ꌩ", "ꌪ", "ꌫ", "ꌬ", "ꌭ", + "ꌮ", "ꌯ", "ꌰ", "ꌱ", "ꌲ", "ꌳ", "ꌴ", "ꌵ", "ꌶ", "ꌷ", "ꌸ", "ꌹ", "ꌺ", "ꌻ", "ꌼ", "ꌽ", "ꌾ", "ꌿ", "ꍀ", "ꍁ", "ꍂ", "ꍃ", + "ꍄ", "ꍅ", "ꍆ", "ꍇ", "ꍈ", "ꍉ", "ꍊ", "ꍋ", "ꍌ", "ꍍ", "ꍎ", "ꍏ", "ꍐ", "ꍑ", "ꍒ", "ꍓ", "ꍔ", "ꍕ", "ꍖ", "ꍗ", "ꍘ", "ꍙ", + "ꍚ", "ꍛ", "ꍜ", "ꍝ", "ꍞ", "ꍟ", "ꍠ", "ꍡ", "ꍢ", "ꍣ", "ꍤ", "ꍥ", "ꍦ", "ꍧ", "ꍨ", "ꍩ", "ꍪ", "ꍫ", "ꍬ", "ꍭ", "ꍮ", "ꍯ", + "ꍰ", "ꍱ", "ꍲ", "ꍳ", "ꍴ", "ꍵ", "ꍶ", "ꍷ", "ꍸ", "ꍹ", "ꍺ", "ꍻ", "ꍼ", "ꍽ", "ꍾ", "ꍿ", "ꎀ", "ꎁ", "ꎂ", "ꎃ", "ꎄ", "ꎅ", + "ꎆ", "ꎇ", "ꎈ", "ꎉ", "ꎊ", "ꎋ", "ꎌ", "ꎍ", "ꎎ", "ꎏ", "ꎐ", "ꎑ", "ꎒ", "ꎓ", "ꎔ", "ꎕ", "ꎖ", "ꎗ", "ꎘ", "ꎙ", "ꎚ", "ꎛ", + "ꎜ", "ꎝ", "ꎞ", "ꎟ", "ꎠ", "ꎡ", "ꎢ", "ꎣ", "ꎤ", "ꎥ", "ꎦ", "ꎧ", "ꎨ", "ꎩ", "ꎪ", "ꎫ", "ꎬ", "ꎭ", "ꎮ", "ꎯ", "ꎰ", "ꎱ", + "ꎲ", "ꎳ", "ꎴ", "ꎵ", "ꎶ", "ꎷ", "ꎸ", "ꎹ", "ꎺ", "ꎻ", "ꎼ", "ꎽ", "ꎾ", "ꎿ", "ꏀ", "ꏁ", "ꏂ", "ꏃ", "ꏄ", "ꏅ", "ꏆ", "ꏇ", + "ꏈ", "ꏉ", "ꏊ", "ꏋ", "ꏌ", "ꏍ", "ꏎ", "ꏏ", "ꏐ", "ꏑ", "ꏒ", "ꏓ", "ꏔ", "ꏕ", "ꏖ", "ꏗ", "ꏘ", "ꏙ", "ꏚ", "ꏛ", "ꏜ", "ꏝ", + "ꏞ", "ꏟ", "ꏠ", "ꏡ", "ꏢ", "ꏣ", "ꏤ", "ꏥ", "ꏦ", "ꏧ", "ꏨ", "ꏩ", "ꏪ", "ꏫ", "ꏬ", "ꏭ", "ꏮ", "ꏯ", "ꏰ", "ꏱ", "ꏲ", "ꏳ", + "ꏴ", "ꏵ", "ꏶ", "ꏷ", "ꏸ", "ꏹ", "ꏺ", "ꏻ", "ꏼ", "ꏽ", "ꏾ", "ꏿ", "ꐀ", "ꐁ", "ꐂ", "ꐃ", "ꐄ", "ꐅ", "ꐆ", "ꐇ", "ꐈ", "ꐉ", + "ꐊ", "ꐋ", "ꐌ", "ꐍ", "ꐎ", "ꐏ", "ꐐ", "ꐑ", "ꐒ", "ꐓ", "ꐔ", "ꐕ", "ꐖ", "ꐗ", "ꐘ", "ꐙ", "ꐚ", "ꐛ", "ꐜ", "ꐝ", "ꐞ", "ꐟ", + "ꐠ", "ꐡ", "ꐢ", "ꐣ", "ꐤ", "ꐥ", "ꐦ", "ꐧ", "ꐨ", "ꐩ", "ꐪ", "ꐫ", "ꐬ", "ꐭ", "ꐮ", "ꐯ", "ꐰ", "ꐱ", "ꐲ", "ꐳ", "ꐴ", "ꐵ", + "ꐶ", "ꐷ", "ꐸ", "ꐹ", "ꐺ", "ꐻ", "ꐼ", "ꐽ", "ꐾ", "ꐿ", "ꑀ", "ꑁ", "ꑂ", "ꑃ", "ꑄ", "ꑅ", "ꑆ", "ꑇ", "ꑈ", "ꑉ", "ꑊ", "ꑋ", + "ꑌ", "ꑍ", "ꑎ", "ꑏ", "ꑐ", "ꑑ", "ꑒ", "ꑓ", "ꑔ", "ꑕ", "ꑖ", "ꑗ", "ꑘ", "ꑙ", "ꑚ", "ꑛ", "ꑜ", "ꑝ", "ꑞ", "ꑟ", "ꑠ", "ꑡ", + "ꑢ", "ꑣ", "ꑤ", "ꑥ", "ꑦ", "ꑧ", "ꑨ", "ꑩ", "ꑪ", "ꑫ", "ꑬ", "ꑭ", "ꑮ", "ꑯ", "ꑰ", "ꑱ", "ꑲ", "ꑳ", "ꑴ", "ꑵ", "ꑶ", "ꑷ", + "ꑸ", "ꑹ", "ꑺ", "ꑻ", "ꑼ", "ꑽ", "ꑾ", "ꑿ", "ꒀ", "ꒁ", "ꒂ", "ꒃ", "ꒄ", "ꒅ", "ꒆ", "ꒇ", "ꒈ", "ꒉ", "ꒊ", "ꒋ", "ꒌ", "꒐", + "꒑", "꒒", "꒓", "꒔", "꒕", "꒖", "꒗", "꒘", "꒙", "꒚", "꒛", "꒜", "꒝", "꒞", "꒟", "꒠", "꒡", "꒢", "꒣", "꒤", "꒥", "꒦", + "꒧", "꒨", "꒩", "꒪", "꒫", "꒬", "꒭", "꒮", "꒯", "꒰", "꒱", "꒲", "꒳", "꒴", "꒵", "꒶", "꒷", "꒸", "꒹", "꒺", "꒻", "꒼", + "꒽", "꒾", "꒿", "꓀", "꓁", "꓂", "꓃", "꓄", "꓅", "꓆", + ] + ), + ] + ) +} diff --git a/vChewing.xcodeproj/project.pbxproj b/vChewing.xcodeproj/project.pbxproj index a516b2fd..961a4e92 100644 --- a/vChewing.xcodeproj/project.pbxproj +++ b/vChewing.xcodeproj/project.pbxproj @@ -20,6 +20,7 @@ 5B40113C28D71C0100A9D4CB /* Uninstaller in Frameworks */ = {isa = PBXBuildFile; productRef = 5B40113B28D71C0100A9D4CB /* Uninstaller */; }; 5B5A603028E81CC50001AE8D /* SwiftUIBackports in Frameworks */ = {isa = PBXBuildFile; productRef = 5B5A602F28E81CC50001AE8D /* SwiftUIBackports */; }; 5B62A33D27AE7CC100A19448 /* ctlAboutWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B62A33C27AE7CC100A19448 /* ctlAboutWindow.swift */; }; + 5B660A8628F64A8800E5E4F6 /* SymbolMenuDefaultData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B660A8528F64A8800E5E4F6 /* SymbolMenuDefaultData.swift */; }; 5B6C141228A9D4B30098ADF8 /* SessionCtl_HandleEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B6C141128A9D4B30098ADF8 /* SessionCtl_HandleEvent.swift */; }; 5B73FB5E27B2BE1300E9BF49 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5B73FB6027B2BE1300E9BF49 /* InfoPlist.strings */; }; 5B782EC4280C243C007276DE /* InputHandler_HandleCandidate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B782EC3280C243C007276DE /* InputHandler_HandleCandidate.swift */; }; @@ -207,6 +208,7 @@ 5B5A602E28E81CB00001AE8D /* ShapsBenkau_SwiftUIBackports */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = ShapsBenkau_SwiftUIBackports; path = Packages/ShapsBenkau_SwiftUIBackports; sourceTree = ""; }; 5B62A33C27AE7CC100A19448 /* ctlAboutWindow.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = ctlAboutWindow.swift; sourceTree = ""; tabWidth = 2; usesTabs = 0; }; 5B65B919284D0185007C558B /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 5B660A8528F64A8800E5E4F6 /* SymbolMenuDefaultData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SymbolMenuDefaultData.swift; sourceTree = ""; }; 5B6C141128A9D4B30098ADF8 /* SessionCtl_HandleEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionCtl_HandleEvent.swift; sourceTree = ""; }; 5B73FB5427B2BD6900E9BF49 /* PhraseEditor-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "PhraseEditor-Info.plist"; path = "UserPhraseEditor/PhraseEditor-Info.plist"; sourceTree = SOURCE_ROOT; }; 5B73FB5F27B2BE1300E9BF49 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -682,6 +684,7 @@ 5B21176B287539BB000443A9 /* SessionCtl_HandleStates.swift */, 5B00FA0B28DEC17200F6D436 /* SessionCtl_IMKCandidatesData.swift */, 5BB802D927FABA8300CF1C19 /* SessionCtl_Menu.swift */, + 5B660A8528F64A8800E5E4F6 /* SymbolMenuDefaultData.swift */, ); path = Modules; sourceTree = ""; @@ -1054,6 +1057,7 @@ 5B963CA828D5DB1400DCEE88 /* PrefMgr_Core.swift in Sources */, D427F76C278CA2B0004A2160 /* AppDelegate.swift in Sources */, 5B7F225D2808501000DDD3CB /* InputHandler_HandleInput.swift in Sources */, + 5B660A8628F64A8800E5E4F6 /* SymbolMenuDefaultData.swift in Sources */, 5BA9FD1227FEDB6B002DE248 /* suiPrefPaneExperience.swift in Sources */, 5BF56F9828C39A2700DD6839 /* IMEState.swift in Sources */, 5B62A33D27AE7CC100A19448 /* ctlAboutWindow.swift in Sources */,