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![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 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 pub family: Option<String>,
325
326 pub foundry: Option<String>,
328
329 pub width: Option<Stretch>,
330
331 pub weight: Option<Weight>,
338
339 pub slant: Option<Style>,
343
344 pub adstyle: Option<String>,
347
348 pub registry: Option<String>,
351
352 pub size: Option<i32>,
356
357 pub dpi: Option<u32>,
360
361 pub spacing: Option<Spacing>,
366
367 pub avgwidth: Option<i32>,
370
371 pub name: Option<String>,
373
374 pub script: Option<String>,
378
379 pub lang: Option<Language>,
384
385 pub otf: Option<OpentypeSpec>,
402}
403
404#[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}