font_index/
emacs.rs

1use isolang::Language;
2use once_cell::sync::Lazy as LazyLock;
3use swash::{Stretch, Style, Weight};
4
5use crate::{
6    types::OpentypeSpec,
7    util::{fxhash::FxHashMap, string::SmallString},
8};
9
10pub static EMACS_CHARSET_MAP: LazyLock<FxHashMap<SmallString, (Vec<u32>, Option<SmallString>)>> =
11    LazyLock::new(|| {
12        log::trace!("EMACS_CHARSET_MAP is being created...");
13        let mut charset_map = FxHashMap::default();
14        charset_map.insert(
15            SmallString::new("iso8859-1"),
16            (vec![0x00A0, 0x00A1, 0x00B4, 0x00BC, 0x00D0], None),
17        );
18        charset_map.insert(SmallString::new("iso8859-2"), (vec![0x00A0, 0x010E], None));
19        charset_map.insert(SmallString::new("iso8859-3"), (vec![0x00A0, 0x0108], None));
20        charset_map.insert(
21            SmallString::new("iso8859-4"),
22            (vec![0x00A0, 0x00AF, 0x0128, 0x0156, 0x02C7], None),
23        );
24        charset_map.insert(SmallString::new("iso8859-5"), (vec![0x00A0, 0x0401], None));
25        charset_map.insert(SmallString::new("iso8859-6"), (vec![0x00A0, 0x060C], None));
26        charset_map.insert(SmallString::new("iso8859-7"), (vec![0x00A0, 0x0384], None));
27        charset_map.insert(SmallString::new("iso8859-8"), (vec![0x00A0, 0x05D0], None));
28        charset_map.insert(
29            SmallString::new("iso8859-9"),
30            (vec![0x00A0, 0x00A1, 0x00BC, 0x011E], None),
31        );
32        charset_map.insert(
33            SmallString::new("iso8859-10"),
34            (vec![0x00A0, 0x00D0, 0x0128, 0x2015], None),
35        );
36        charset_map.insert(SmallString::new("iso8859-11"), (vec![0x00A0, 0x0E01], None));
37        charset_map.insert(SmallString::new("iso8859-13"), (vec![0x00A0, 0x201C], None));
38        charset_map.insert(SmallString::new("iso8859-14"), (vec![0x00A0, 0x0174], None));
39        charset_map.insert(
40            SmallString::new("iso8859-15"),
41            (vec![0x00A0, 0x00A1, 0x00D0, 0x0152], None),
42        );
43        charset_map.insert(SmallString::new("iso8859-16"), (vec![0x00A0, 0x0218], None));
44        charset_map.insert(
45            SmallString::new("gb2312.1980-0"),
46            (vec![0x4E13], Some(SmallString::new("zh-Hans"))),
47        );
48
49        charset_map.insert(
50            SmallString::new("big5-0"),
51            (
52                vec![/* 0x9C21 in ftfont.c */ 0x4EDC],
53                Some(SmallString::new("zh-Hant")),
54            ),
55        );
56        charset_map.insert(
57            SmallString::new("jisx0208.1983-0"),
58            (vec![0x4E55], Some(SmallString::new("ja"))),
59        );
60        charset_map.insert(
61            SmallString::new("ksc5601.1987-0"),
62            (vec![0xAC00], Some(SmallString::new("ko"))),
63        );
64        charset_map.insert(
65            SmallString::new("cns11643.1992-1"),
66            (vec![0xFE32], Some(SmallString::new("zh-Hant"))),
67        );
68        charset_map.insert(
69            SmallString::new("cns11643.1992-2"),
70            (vec![0x4E33, 0x7934], None),
71        );
72        charset_map.insert(SmallString::new("cns11643.1992-3"), (vec![0x201A9], None));
73        charset_map.insert(SmallString::new("cns11643.1992-4"), (vec![0x20057], None));
74        charset_map.insert(SmallString::new("cns11643.1992-5"), (vec![0x20000], None));
75        charset_map.insert(SmallString::new("cns11643.1992-6"), (vec![0x20003], None));
76        charset_map.insert(SmallString::new("cns11643.1992-7"), (vec![0x20055], None));
77        charset_map.insert(
78            SmallString::new("gbk-0"),
79            (vec![0x4E06], Some(SmallString::new("zh-Hans"))),
80        );
81        charset_map.insert(SmallString::new("jisx0212.1990-0"), (vec![0x4E44], None));
82        charset_map.insert(
83            SmallString::new("jisx0213.2000-1"),
84            (vec![0xFA10], Some(SmallString::new("ja"))),
85        );
86        charset_map.insert(SmallString::new("jisx0213.2000-2"), (vec![0xFA49], None));
87        charset_map.insert(SmallString::new("jisx0213.2004-1"), (vec![0x20B9F], None));
88        charset_map.insert(
89            SmallString::new("viscii1.1-1"),
90            (vec![0x1EA0, 0x1EAE, 0x1ED2], Some(SmallString::new("vi"))),
91        );
92        charset_map.insert(
93            SmallString::new("tis620.2529-1"),
94            (vec![0x0E01], Some(SmallString::new("th"))),
95        );
96        charset_map.insert(
97            SmallString::new("windows-1251"),
98            (vec![0x0401, 0x0490], Some(SmallString::new("ru"))),
99        );
100        charset_map.insert(
101            SmallString::new("koi8-r"),
102            (vec![0x0401, 0x2219], Some(SmallString::new("ru"))),
103        );
104        charset_map.insert(
105            SmallString::new("mulelao-1"),
106            (vec![0x0E81], Some(SmallString::new("lo"))),
107        );
108        charset_map.insert(SmallString::new("unicode-sip"), (vec![0x20000], None));
109
110        charset_map
111    });
112
113pub static SCRIPT_REPRESENTATIVE_CHARS: LazyLock<FxHashMap<SmallString, Vec<u32>>> =
114    LazyLock::new(|| {
115        log::trace!("SCRIPT_REPRESENTATIVE_CHARS is being created...");
116        let mut charset_map = FxHashMap::default();
117        charset_map.insert(
118            SmallString::new("latin"),
119            vec![
120                'A'.into(),
121                'Z'.into(),
122                'a'.into(),
123                'z'.into(),
124                0x00C0,
125                0x0100,
126                0x0180,
127                0x1e00,
128            ],
129        );
130        charset_map.insert(SmallString::new("phonetic"), vec![0x250, 0x283]);
131        charset_map.insert(SmallString::new("greek"), vec![0x3A9]);
132        charset_map.insert(SmallString::new("coptic"), vec![0x3E2, 0x2C80, 0x2CAE]);
133        charset_map.insert(SmallString::new("cyrillic"), vec![0x42F]);
134        charset_map.insert(SmallString::new("armenian"), vec![0x531]);
135        charset_map.insert(SmallString::new("hebrew"), vec![0x5D0]);
136        charset_map.insert(SmallString::new("vai"), vec![0xA500]);
137        // U+06C1 prevents us from using bad fonts, like DejaVu Sans,
138        // for Arabic text.
139        charset_map.insert(SmallString::new("arabic"), vec![0x628, 0x6C1]);
140        charset_map.insert(SmallString::new("syriac"), vec![0x710]);
141        charset_map.insert(SmallString::new("thaana"), vec![0x78C]);
142        charset_map.insert(SmallString::new("devanagari"), vec![0x915]);
143        charset_map.insert(SmallString::new("bengali"), vec![0x995]);
144        charset_map.insert(SmallString::new("gurmukhi"), vec![0xA15]);
145        charset_map.insert(SmallString::new("gujarati"), vec![0xA95]);
146        charset_map.insert(SmallString::new("oriya"), vec![0xB15]);
147        charset_map.insert(SmallString::new("tamil"), vec![0xB95]);
148        charset_map.insert(SmallString::new("telugu"), vec![0xC15]);
149        charset_map.insert(SmallString::new("kannada"), vec![0xC95]);
150        charset_map.insert(SmallString::new("malayalam"), vec![0xD15]);
151        charset_map.insert(SmallString::new("sinhala"), vec![0xD95]);
152        charset_map.insert(SmallString::new("thai"), vec![0xE17]);
153        charset_map.insert(SmallString::new("lao"), vec![0xEA5]);
154        charset_map.insert(SmallString::new("tibetan"), vec![0xF40]);
155        charset_map.insert(SmallString::new("burmese"), vec![0x1000]);
156        charset_map.insert(SmallString::new("georgian"), vec![0x10D3]);
157        charset_map.insert(SmallString::new("ethiopic"), vec![0x1208]);
158        charset_map.insert(SmallString::new("cherokee"), vec![0x13B6]);
159        charset_map.insert(SmallString::new("canadian-aboriginal"), vec![0x14C0]);
160        charset_map.insert(SmallString::new("ogham"), vec![0x168F]);
161        charset_map.insert(SmallString::new("runic"), vec![0x16A0]);
162        charset_map.insert(SmallString::new("tagalog"), vec![0x1700]);
163        charset_map.insert(SmallString::new("hanunoo"), vec![0x1720]);
164        charset_map.insert(SmallString::new("buhid"), vec![0x1740]);
165        charset_map.insert(SmallString::new("tagbanwa"), vec![0x1760]);
166        charset_map.insert(SmallString::new("khmer"), vec![0x1780]);
167        charset_map.insert(SmallString::new("mongolian"), vec![0x1826]);
168        charset_map.insert(SmallString::new("limbu"), vec![0x1901, 0x1920, 0x1936]);
169        charset_map.insert(SmallString::new("buginese"), vec![0x1A00, 0x1A1E]);
170        charset_map.insert(SmallString::new("balinese"), vec![0x1B13, 0x1B35, 0x1B5E]);
171        charset_map.insert(SmallString::new("sundanese"), vec![0x1B8A, 0x1BAB, 0x1CC4]);
172        charset_map.insert(SmallString::new("batak"), vec![0x1BC2, 0x1BE7, 0x1BFF]);
173        charset_map.insert(SmallString::new("lepcha"), vec![0x1C00, 0x1C24, 0x1C40]);
174        charset_map.insert(SmallString::new("tai-le"), vec![0x1950]);
175        charset_map.insert(SmallString::new("tai-lue"), vec![0x1980]);
176        charset_map.insert(
177            SmallString::new("tai-tham"),
178            vec![0x1A20, 0x1A55, 0x1A61, 0x1A80],
179        );
180        charset_map.insert(SmallString::new("symbol"), vec![0x201C, 0x2200, 0x2500]);
181        charset_map.insert(SmallString::new("braille"), vec![0x2800]);
182        charset_map.insert(SmallString::new("ideographic-description"), vec![0x2FF0]);
183        charset_map.insert(
184            SmallString::new("cjk-misc"),
185            vec![0x300E, 0xff0c, 0x300a, 0xff09, 0x5b50],
186        );
187        charset_map.insert(SmallString::new("kana"), vec![0x304B]);
188        charset_map.insert(SmallString::new("bopomofo"), vec![0x3105]);
189        charset_map.insert(SmallString::new("kanbun"), vec![0x319D]);
190        charset_map.insert(SmallString::new("han"), vec![0x5B57]);
191        charset_map.insert(SmallString::new("yi"), vec![0xA288]);
192        charset_map.insert(
193            SmallString::new("syloti-nagri"),
194            vec![0xA807, 0xA823, 0xA82C],
195        );
196        charset_map.insert(SmallString::new("rejang"), vec![0xA930, 0xA947, 0xA95F]);
197        charset_map.insert(SmallString::new("javanese"), vec![0xA98F, 0xA9B4, 0xA9CA]);
198        charset_map.insert(SmallString::new("cham"), vec![0xAA00]);
199        charset_map.insert(SmallString::new("tai-viet"), vec![0xAA80]);
200        charset_map.insert(
201            SmallString::new("meetei-mayek"),
202            vec![0xABC0, 0xABE3, 0xAAE0, 0xAAF6],
203        );
204        charset_map.insert(SmallString::new("hangul"), vec![0xAC00]);
205        charset_map.insert(SmallString::new("linear-b"), vec![0x10000]);
206        charset_map.insert(SmallString::new("aegean-number"), vec![0x10100]);
207        charset_map.insert(SmallString::new("ancient-greek-number"), vec![0x10140]);
208        charset_map.insert(SmallString::new("ancient-symbol"), vec![0x10190]);
209        charset_map.insert(SmallString::new("phaistos-disc"), vec![0x101D0]);
210        charset_map.insert(SmallString::new("lycian"), vec![0x10280]);
211        charset_map.insert(SmallString::new("carian"), vec![0x102A0]);
212        charset_map.insert(SmallString::new("old-italic"), vec![0x10300]);
213        charset_map.insert(SmallString::new("gothic"), vec![0x10330, 0x10348]);
214        charset_map.insert(SmallString::new("ugaritic"), vec![0x10380]);
215        charset_map.insert(SmallString::new("old-permic"), vec![0x10350]);
216        charset_map.insert(SmallString::new("old-persian"), vec![0x103A0]);
217        charset_map.insert(SmallString::new("deseret"), vec![0x10400]);
218        charset_map.insert(SmallString::new("shavian"), vec![0x10450]);
219        charset_map.insert(SmallString::new("osmanya"), vec![0x10480]);
220        charset_map.insert(SmallString::new("osage"), vec![0x104B0]);
221        charset_map.insert(SmallString::new("elbasan"), vec![0x10500]);
222        charset_map.insert(SmallString::new("caucasian-albanian"), vec![0x10530]);
223        charset_map.insert(SmallString::new("vithkuqi"), vec![0x10570]);
224        charset_map.insert(SmallString::new("linear-a"), vec![0x10600]);
225        charset_map.insert(SmallString::new("cypriot-syllabary"), vec![0x10800]);
226        charset_map.insert(SmallString::new("palmyrene"), vec![0x10860]);
227        charset_map.insert(SmallString::new("nabataean"), vec![0x10880]);
228        charset_map.insert(SmallString::new("phoenician"), vec![0x10900]);
229        charset_map.insert(SmallString::new("lydian"), vec![0x10920]);
230        charset_map.insert(SmallString::new("kharoshthi"), vec![0x10A00]);
231        charset_map.insert(SmallString::new("manichaean"), vec![0x10AC0]);
232        charset_map.insert(
233            SmallString::new("hanifi-rohingya"),
234            vec![0x10D00, 0x10D24, 0x10D39],
235        );
236        charset_map.insert(SmallString::new("yezidi"), vec![0x10E80]);
237        charset_map.insert(SmallString::new("old-sogdian"), vec![0x10F00]);
238        charset_map.insert(SmallString::new("sogdian"), vec![0x10F30]);
239        charset_map.insert(SmallString::new("chorasmian"), vec![0x10FB0]);
240        charset_map.insert(SmallString::new("elymaic"), vec![0x10FE0]);
241        charset_map.insert(SmallString::new("old-uyghur"), vec![0x10F70]);
242        charset_map.insert(
243            SmallString::new("brahmi"),
244            vec![0x11013, 0x11045, 0x11052, 0x11065],
245        );
246        charset_map.insert(SmallString::new("kaithi"), vec![0x1108D, 0x110B0, 0x110BD]);
247        charset_map.insert(SmallString::new("mahajani"), vec![0x11150]);
248        charset_map.insert(SmallString::new("sharada"), vec![0x11191, 0x111B3, 0x111CD]);
249        charset_map.insert(SmallString::new("khojki"), vec![0x11200]);
250        charset_map.insert(SmallString::new("khudawadi"), vec![0x112B0]);
251        charset_map.insert(SmallString::new("grantha"), vec![0x11315, 0x1133E, 0x11374]);
252        charset_map.insert(SmallString::new("newa"), vec![0x11400]);
253        charset_map.insert(SmallString::new("tirhuta"), vec![0x11481, 0x1148F, 0x114D0]);
254        charset_map.insert(SmallString::new("siddham"), vec![0x1158E, 0x115AF, 0x115D4]);
255        charset_map.insert(SmallString::new("modi"), vec![0x1160E, 0x11630, 0x11655]);
256        charset_map.insert(SmallString::new("takri"), vec![0x11680]);
257        charset_map.insert(SmallString::new("dogra"), vec![0x11800]);
258        charset_map.insert(SmallString::new("warang-citi"), vec![0x118A1]);
259        charset_map.insert(SmallString::new("dives-akuru"), vec![0x11900]);
260        charset_map.insert(SmallString::new("nandinagari"), vec![0x119a0]);
261        charset_map.insert(SmallString::new("zanabazar-square"), vec![0x11A00]);
262        charset_map.insert(SmallString::new("soyombo"), vec![0x11A50]);
263        charset_map.insert(SmallString::new("pau-cin-hau"), vec![0x11AC0]);
264        charset_map.insert(SmallString::new("bhaiksuki"), vec![0x11C00]);
265        charset_map.insert(SmallString::new("marchen"), vec![0x11C72]);
266        charset_map.insert(SmallString::new("masaram-gondi"), vec![0x11D00]);
267        charset_map.insert(SmallString::new("gunjala-gondi"), vec![0x11D60]);
268        charset_map.insert(SmallString::new("makasar"), vec![0x11EE0, 0x11EF7]);
269        charset_map.insert(SmallString::new("kawi"), vec![0x11F04, 0x11F41, 0x11F4F]);
270        charset_map.insert(SmallString::new("cuneiform"), vec![0x12000]);
271        charset_map.insert(SmallString::new("cypro-minoan"), vec![0x12F90]);
272        charset_map.insert(SmallString::new("egyptian"), vec![0x13000]);
273        charset_map.insert(SmallString::new("mro"), vec![0x16A40]);
274        charset_map.insert(SmallString::new("tangsa"), vec![0x16A70, 0x16AC0]);
275        charset_map.insert(SmallString::new("bassa-vah"), vec![0x16AD0]);
276        charset_map.insert(SmallString::new("pahawh-hmong"), vec![0x16B11]);
277        charset_map.insert(SmallString::new("medefaidrin"), vec![0x16E40]);
278        charset_map.insert(SmallString::new("tangut"), vec![0x17000]);
279        charset_map.insert(SmallString::new("khitan-small-script"), vec![0x18B00]);
280        charset_map.insert(SmallString::new("nushu"), vec![0x1B170]);
281        charset_map.insert(SmallString::new("duployan-shorthand"), vec![0x1BC20]);
282        charset_map.insert(
283            SmallString::new("znamenny-musical-notation"),
284            vec![0x1CF00, 0x1CF42, 0x1CF50],
285        );
286        charset_map.insert(SmallString::new("byzantine-musical-symbol"), vec![0x1D000]);
287        charset_map.insert(SmallString::new("musical-symbol"), vec![0x1D100]);
288        charset_map.insert(
289            SmallString::new("ancient-greek-musical-notation"),
290            vec![0x1D200],
291        );
292        charset_map.insert(SmallString::new("kaktovik-numeral"), vec![0x1D2C0]);
293        charset_map.insert(SmallString::new("tai-xuan-jing-symbol"), vec![0x1D300]);
294        charset_map.insert(SmallString::new("counting-rod-numeral"), vec![0x1D360]);
295        charset_map.insert(SmallString::new("nyiakeng-puachue-hmong"), vec![0x1e100]);
296        charset_map.insert(SmallString::new("toto"), vec![0x1E290, 0x1E295, 0x1E2AD]);
297        charset_map.insert(SmallString::new("wancho"), vec![0x1E2C0, 0x1E2E8, 0x1E2EF]);
298        charset_map.insert(
299            SmallString::new("nag-mundari"),
300            vec![0x1E4D0, 0x1E4EB, 0x1E4F0],
301        );
302        charset_map.insert(SmallString::new("mende-kikakui"), vec![0x1E810, 0x1E8A6]);
303        charset_map.insert(SmallString::new("adlam"), vec![0x1E900, 0x1E943]);
304        charset_map.insert(
305            SmallString::new("indic-siyaq-number"),
306            vec![0x1EC71, 0x1EC9F],
307        );
308        charset_map.insert(
309            SmallString::new("ottoman-siyaq-number"),
310            vec![0x1ED01, 0x1ED27],
311        );
312        charset_map.insert(SmallString::new("mahjong-tile"), vec![0x1F000]);
313        charset_map.insert(SmallString::new("domino-tile"), vec![0x1F030]);
314        charset_map.insert(SmallString::new("emoji"), vec![0x1F300, 0x1F600]);
315        charset_map.insert(SmallString::new("chess-symbol"), vec![0x1FA00, 0x1FA67]);
316
317        charset_map
318    });
319
320#[derive(Clone)]
321pub struct FontSpec {
322    // VALUE must be a string specifying the font family
323    // (e.g. "Monospace").
324    pub family: Option<String>,
325
326    // VALUE must be a string or a symbol specifying the font foundry, e.g. misc.
327    pub foundry: Option<String>,
328
329    pub width: Option<Stretch>,
330
331    // VALUE specifies the weight of the font to use.  It must be one of
332    // the symbols ultra-heavy, heavy (a.k.a. black),
333    // ultra-bold (a.k.a. extra-bold), bold,
334    // semi-bold (a.k.a. demi-bold), medium, normal (a.k.a. regular,
335    // a.k.a. book), semi-light (a.k.a. demi-light),
336    // light, extra-light (a.k.a. ultra-light), or thin.
337    pub weight: Option<Weight>,
338
339    // VALUE specifies the slant of the font to use.  It must be one of the
340    // symbols italic, oblique, normal, reverse-italic, or
341    // reverse-oblique.
342    pub slant: Option<Style>,
343
344    // VALUE must be a string or a symbol specifying the additional
345    // typographic style information of a font, e.g. sans.
346    pub adstyle: Option<String>,
347
348    // VALUE must be a string or a symbol specifying the charset registry and
349    // encoding of a font, e.g. iso8859-1.
350    pub registry: Option<String>,
351
352    // VALUE must be a non-negative integer or a floating point number
353    // specifying the font size.  It specifies the font size in pixels (if
354    // VALUE is an integer), or in points (if VALUE is a float).
355    pub size: Option<i32>,
356
357    // VALUE must be a non-negative number that specifies the resolution
358    // (dot per inch) for which the font is designed.
359    pub dpi: Option<u32>,
360
361    // VALUE specifies the spacing of the font: mono, proportional, charcell,
362    // or dual.  It can be either a number (0 for proportional, 90 for dual,
363    // 100 for mono, 110 for charcell) or a 1-letter symbol: P, D, M,
364    // or C (lower-case variants are also accepted).
365    pub spacing: Option<Spacing>,
366
367    // VALUE must be a non-negative integer specifying the average width of
368    // the font in 1/10 pixel units.
369    pub avgwidth: Option<i32>,
370
371    // VALUE must be a string of XLFD-style or fontconfig-style font name.
372    pub name: Option<String>,
373
374    // VALUE must be a symbol representing a script that the font must
375    // support.  It may be a symbol representing a subgroup of a script
376    // listed in the variable script-representative-chars.
377    pub script: Option<String>,
378
379    // VALUE must be a symbol whose name is a two-letter ISO-639 language
380    // name, e.g. ja.  The value is matched against the "Additional Style"
381    // field of the XLFD spec of a font, if it's non-empty, on X, and
382    // against the codepages supported by the font on w32.
383    pub lang: Option<Language>,
384
385    // VALUE must be a list (SCRIPT-TAG, LANGSYS-TAG, GSUB, GPOS) to specify
386    // required OpenType features.
387    //   script_tag: OpenType script tag symbol (e.g. deva).
388    //   langsys_tag: OpenType language system tag symbol,
389    //      or None for the default language system.
390    //   gsub: List of OpenType GSUB feature tag symbols, or None if none required.
391    //   GPOS: List of OpenType GPOS feature tag symbols, or None if none required.
392
393    // GSUB and GPOS may contain None elements.  In such a case, the font
394    // must not have any of the remaining elements.
395
396    // For instance, if the VALUE is
397    // (thai, None, None, vec![mark]),
398    // the font must
399    // be an OpenType font whose GPOS table of thai script's default
400    // language system must contain mark feature.
401    pub otf: Option<OpentypeSpec>,
402}
403
404// mono, proportional, charcell,
405// or dual.  It can be either a number (0 for proportional, 90 for dual,
406// 100 for mono, 110 for charcell) or a 1-letter symbol: P, D, M,
407// or C (lower-case variants are also accepted).
408#[derive(Clone)]
409pub enum Spacing {
410    Mono = 0,
411    Proportional = 90,
412    Charcell = 100,
413    Dual = 110,
414}
415
416impl Spacing {
417    pub fn from_number(num: i32) -> Option<Self> {
418        match num {
419            0 => Some(Self::Proportional),
420            90 => Some(Self::Dual),
421            100 => Some(Self::Mono),
422            110 => Some(Self::Charcell),
423            _ => None,
424        }
425    }
426
427    pub fn from_symbol(sym: &str) -> Option<Self> {
428        match sym {
429            "P" | "p" => Some(Self::Proportional),
430            "D" | "d" => Some(Self::Dual),
431            "M" | "m" => Some(Self::Mono),
432            "C" | "c" => Some(Self::Charcell),
433            _ => None,
434        }
435    }
436}