forks/sorcery

git clone https://git.gae.moe/forks/sorcery

Charlotte Somunify language selection between serverside and clientside0c80b85

typst_support
17.0 KiB518 linesraw
1use std::collections::HashMap;
2use std::sync::LazyLock;
3
4use serde::Deserialize;
5
6pub const VERSION: &str = "2.18.2";
7
8pub fn artifact(language: &str) -> Option<(usize, &'static str)> {
9    match language {
10        "ada" => Some((
11            1180565,
12            "04ddb795cfbc68d549ee897bfa18617f13dbbfaf46829843ea9e35e80bdab8c1",
13        )),
14        "agda" => Some((
15            3022238,
16            "b0b4243734d2c65a6531fa5960831bf3f0ecd03b562479c77eeaf2ea216d328b",
17        )),
18        "asciidoc" => Some((
19            1196286,
20            "e5d0416c6c762f1249c19a26b61244aa9eea3e81c0b43d385deb6dca21d3a32e",
21        )),
22        "asm" => Some((
23            955782,
24            "62efa779c6e4477c509d43a3847d6ef8bd9739923b3d25462d3e711f32ac9d9f",
25        )),
26        "awk" => Some((
27            1423948,
28            "1e9212052ab29b0f162ebaf24476e003c48a71c8b82797b67538ec657bed5c21",
29        )),
30        "bash" => Some((
31            2189951,
32            "9ffeeaaae2246e7f7bea8bdaf22120f93effac4a8f3acc2e2190382647b2e7ca",
33        )),
34        "batch" => Some((
35            1073511,
36            "428fcb7259baa5db3f961f903096c04f06017ef38a01009d7cb882b41897e206",
37        )),
38        "c" => Some((
39            1369239,
40            "113cb4581b76b48da2ba5fbc566fb551dab195ec256ddd540094b3eb29042c4a",
41        )),
42        "c-sharp" => Some((
43            3780203,
44            "6a4066148bc107b962e8ca532230dcd77a555c6893fe035acacd68e2f3daa91e",
45        )),
46        "caddy" => Some((
47            1386228,
48            "0e141a81d9a7855d96c11d8cc9fbd49c6deb1fe2a45f8b4f7d447074bcd84e66",
49        )),
50        "capnp" => Some((
51            993759,
52            "dadd045f06e227309b67ad8f50aeb883c12d9379ab8ac1caaa64832cd5fa023b",
53        )),
54        "cedar" => Some((
55            1012243,
56            "5261c7ae0515751cc438bd05a1eed200de702fcea31b6886f54f7ee515bda23e",
57        )),
58        "cedarschema" => Some((
59            957615,
60            "4852d2dbffe54807d291074c8e519bfa0c35a93406cb6dd446b53979d41550b8",
61        )),
62        "clojure" => Some((
63            1008753,
64            "1a8178f6d4a0d8dff9dfbb55b0fb2e6a347efc6ea993d310a3edfa87f3d68953",
65        )),
66        "cmake" => Some((
67            1014233,
68            "f52cc071c98e30d23dfa62949288f93dd12be381cc904873e21daa3bf6a00a25",
69        )),
70        "cobol" => Some((
71            6298591,
72            "4f2b712e812461daa1e8fa82749cdd25bf51f4b91b09cf4ad6400cdc416feb8b",
73        )),
74        "commonlisp" => Some((
75            1629046,
76            "138cce06c364ccc39f70dd2011b3d4d6a12945506374a26d9b547c84b0f5d65d",
77        )),
78        "cpp" => Some((
79            3526186,
80            "2a535ea41d23257c5cc8a44ad1a51186bd445870d4013147a56b8769cf89503f",
81        )),
82        "css" => Some((
83            1055728,
84            "5a97ef7f682db6ea988d2b614928f0d0349e07ffc3866e250a08f031ee12c2a7",
85        )),
86        "d" => Some((
87            4044353,
88            "6ff8de8b8997eb145820ac2a7fcb04b74b80546340d53821074694615d3aca67",
89        )),
90        "dart" => Some((
91            1620290,
92            "76856586b4eec2af702981f2bf3602e85fe16be78229eff9021b49221f9fe279",
93        )),
94        "devicetree" => Some((
95            1085320,
96            "9f3be12d071bd3110c5a590e27dcb20db6675b248d44f13935c62033b165459d",
97        )),
98        "diff" => Some((
99            949154,
100            "1c9930f2b96cf4143537332b2363ad72672f0b8b37830d00920c99272d3dddbc",
101        )),
102        "dockerfile" => Some((
103            975987,
104            "30209187949681b96ad0c761bf369d0bf6ddba25c2a928869432bf255bc4c60f",
105        )),
106        "dot" => Some((
107            953907,
108            "7819e2e18c716df2f7c1ea4739c4acffc04522da86e716b86285d8501ad9bb41",
109        )),
110        "elisp" => Some((
111            961934,
112            "54372e28e5cb656fff43f2f991e662abac4731c476b73c4f740a939d85c87d38",
113        )),
114        "elixir" => Some((
115            2342431,
116            "3ebdac31c0e06ed056c2cdb68461267c3aa38780bdb8ae472230f4ee75564259",
117        )),
118        "elm" => Some((
119            1101651,
120            "7e940515a771eb9628eeca901198806abc9dd6e3680f8d19a30ae53d73ad4726",
121        )),
122        "erlang" => Some((
123            1215382,
124            "0483b4cb87878c80982dc98ccdda33800a2830ca3c738095c6ddf7ba161f2d34",
125        )),
126        "fish" => Some((
127            993837,
128            "4b91b7f192b262a04cf332537a2880cfd8eb99bce9fb170c662149cbe58ce18c",
129        )),
130        "fsharp" => Some((
131            4149576,
132            "40b457abad845651b1b2a6e2261f4f2b0dcd83a817018ee5a00514905adc4b1b",
133        )),
134        "gitattributes" => Some((
135            948786,
136            "e49f25b0a5c5b5b99a28df2d6bca35965cafeec660d8098949c5878cbad0c99d",
137        )),
138        "gleam" => Some((
139            1329356,
140            "8d6f33add8239f20cd01922265aed58d00edd1c451d6e99aa3f8a4b346357ae9",
141        )),
142        "glsl" => Some((
143            1499154,
144            "556124745763b101d6019b882a1cde0644c0be8dc29e90031dcf7f095ff2f85f",
145        )),
146        "go" => Some((
147            1135258,
148            "463a15deb2edf3b9f3856a6cd677ea4e27d4ed1f427c1e28ef0e5a25c925b613",
149        )),
150        "graphql" => Some((
151            984858,
152            "2485aef46e0e88d6bbc2f75d753a9ace01edd0b87fd07802420d37be9828348f",
153        )),
154        "groovy" => Some((
155            1542109,
156            "0f5e610f2188e56f68b34ddfd5058990bee9cc33be61ee86606350ae0cf4ac07",
157        )),
158        "haskell" => Some((
159            3081220,
160            "09d853c618d6b261bd3ec68b517c325063daf082871d4e2f93cfa3176819df90",
161        )),
162        "hcl" => Some((
163            1019375,
164            "cd7847e24bdbb7b8c6b1c54ec32516d04d476fd6420d3a6588393a94f418c31e",
165        )),
166        "hlsl" => Some((
167            3771606,
168            "c51492ff7aabc15bcb4790d4ba065ad8f27122cca3b31df0fc75eba6359f981b",
169        )),
170        "html" => Some((
171            946396,
172            "26188f4e56215bc02129b31dae091f968e817b5bc383548e18d5428544ecb06f",
173        )),
174        "idris" => Some((
175            2354626,
176            "28cc23922bfad68efdf8d77fc3a7977c56e8d2c041ef567097227b8fd813d78c",
177        )),
178        "ini" => Some((
179            933499,
180            "adbef8297d0838bd48146051e1a3119d6240c4bdbf87f3390ae11fc4d2f3ff81",
181        )),
182        "java" => Some((
183            1208378,
184            "c110f752747013ec2604bab1532a86591f2d2b939aad5d8af61d2bb61d46ed14",
185        )),
186        "javascript" => Some((
187            1262729,
188            "63850e59d4c059edac638f8b9d339ac568944593b2e76b151b7955590f3e74db",
189        )),
190        "jinja2" => Some((
191            941545,
192            "e5fbb8a7eedecbe6345122545d375ec10c8c5bb90af0ee18c201487e356ccfc3",
193        )),
194        "jq" => Some((
195            1023788,
196            "a917ee166b3f0893d2b0b4fc48b12f9ddc75c179f5cac2cef1748af0851fa578",
197        )),
198        "jsdoc" => Some((
199            958427,
200            "743b7b37cd1dbd7241eb1352884450f5a167f529d79c59747865d6f26cbc0095",
201        )),
202        "json" => Some((
203            934592,
204            "3c2172f176687106db77f04dc5ade071e8f6e5c42066e7200b317dd45ff2a375",
205        )),
206        "julia" => Some((
207            2873312,
208            "dd11c813ce733b034678219acf6c997233898b7fbea1cf6ce115d55a14150a61",
209        )),
210        "just" => Some((
211            979125,
212            "7fbbb688db5a05d4dc025837d466c7624f88b244c6ca1d50f941c6ee13de16a9",
213        )),
214        "kconfig" => Some((
215            983005,
216            "02030e846565bfe1687a93034c41901f183d4818b3792138956f163b01b674e6",
217        )),
218        "kdl" => Some((
219            994781,
220            "18601d1ea0b4f96d6f4a360f308e2d731eade43f654aa37bc4c76f535d0de611",
221        )),
222        "kotlin" => Some((
223            4065274,
224            "6beb95f876b947bcad1cf5c01c0b11c15d2c4421bcba04ce2d53387fabf2086c",
225        )),
226        "lean" => Some((
227            15179599,
228            "3ba04ec2626fadc5cc3778ecdfab2054f02f3dd758dd782689f4389ca23c805f",
229        )),
230        "lua" => Some((
231            977747,
232            "4553556759358b5f8ac34cdfed6f82da855f004d1b06e9cb63eaebf3f8d58ac2",
233        )),
234        "make" => Some((
235            1069502,
236            "3cb8479db980596ea229dc7e1a50219e79e5e54517a3688561bdb36ba826f5a2",
237        )),
238        "markdown" => Some((
239            1233242,
240            "952a979343d0144fbdac518d5d0d6404312d0f7ad74e25a197be9cf3bd334ee4",
241        )),
242        "matlab" => Some((
243            1279236,
244            "050f8aa2a4462631ec8dcae2504086270190d32bae741f2b35d91336e18b8702",
245        )),
246        "meson" => Some((
247            1040115,
248            "cf7c7c5c07968a30f84bfd005630b1315a45220b1ed37ea08a4434a5886eed62",
249        )),
250        "nginx" => Some((
251            966328,
252            "7562b504b0213f631d5ac6b9bbf847a7d0938b514e516b336d148374ac2c223a",
253        )),
254        "ninja" => Some((
255            960432,
256            "4a86eafeda4963f73b01f181523170ce334ca50c29782a121a9cd741df9e6500",
257        )),
258        "nix" => Some((
259            1011972,
260            "5e34d178342232c082b492798cec6a94a41f7fea869e96ab6f895aca4879967e",
261        )),
262        "objc" => Some((
263            3179021,
264            "49681944578a9e36f955da6a8648b00c5e7e38dcd065b1ee7318c1fd339d9a7f",
265        )),
266        "ocaml" => Some((
267            2457345,
268            "d7ce429bb88b530f1aa8ddbbe504ec715b23218afb96b69d5f388515d96280a8",
269        )),
270        "odin" => Some((
271            2509054,
272            "4ac682f9b12c0a560b993f36e0015bb207a9ea4ead4df8361815067c80e5fdb4",
273        )),
274        "perl" => Some((
275            2479922,
276            "71354540d41528eabd3e27de750193cee26199de8e93601aac502b6c50ea3dbd",
277        )),
278        "php" => Some((
279            1611597,
280            "6ce9c56401aa8b30f713d897991210ca7d455858c49c8276ff6973fc14ce44aa",
281        )),
282        "postscript" => Some((
283            938523,
284            "99f95c94d88e7fe38e4578dc0bdbd3b2008f2ca4ac28bf4cd623967d9dd28bac",
285        )),
286        "powershell" => Some((
287            1657956,
288            "074574d5791b956b32b0a5073a491a2d0e7cd5cd2d365a3d0e1de679fc889f25",
289        )),
290        "prolog" => Some((
291            944395,
292            "d76316fe4a327032d48587f37b6b459d6cfccc1cb23367ecbaa2a9a2b5524c8c",
293        )),
294        "proto" => Some((
295            1006657,
296            "e5ec2be4a253b10c21f1c631f5733e07c44a6b951da30845b6fdf70d174c6bec",
297        )),
298        "python" => Some((
299            1345718,
300            "a952e9f349fb441fd70f58fae01a1f543d1b07bc85a05f96233e00c0c35f7263",
301        )),
302        "query" => Some((
303            947478,
304            "87e77c33e2f443c1e371aded82d557e20f76ef8506bfc62a266d9408ea26b24c",
305        )),
306        "r" => Some((
307            1375758,
308            "baa5c32963ff40fa0e5e39bbcedba1a2cf928302b61191ca4e3d08559760ad4e",
309        )),
310        "regex" => Some((
311            949532,
312            "266bdc59e69d87f2aff2267d4398546c46a14eff26b964c5eb665ee3d46416e2",
313        )),
314        "rego" => Some((
315            1050559,
316            "5182fa15e18fcc16f65f22ab79f91b75d11c724f0dc5b7d0ac7e2fe4e1cf3a51",
317        )),
318        "rescript" => Some((
319            1614855,
320            "672b2a29aa120c15f71ad3b45832837b13dc33012916650235f1273bec155db6",
321        )),
322        "ron" => Some((
323            953729,
324            "b3636f00a4c28969a1813b789d3729d59944b7c8676a2f8bc6c4fe38ccccf8c4",
325        )),
326        "ruby" => Some((
327            2524595,
328            "a6d2d755dd5538f8398c71e254c0a22578382d69cdeb72026380663ca914fe04",
329        )),
330        "rust" => Some((
331            2174209,
332            "23082cdeeab932eadd084c8df49098dc9142d26da9791b981243f1d511326546",
333        )),
334        "scala" => Some((
335            4115142,
336            "738933c1fc34f4bf0a5cff6b76494104e246144d26a2eda238135e9dfb36618a",
337        )),
338        "scheme" => Some((
339            1033643,
340            "e3b024007ba0f051bf2eefa8bb405a042edfef55abcb6917c1f8be6c5fd8f9e7",
341        )),
342        "scss" => Some((
343            1107833,
344            "39390b75a8f174231891a27bfa0844f7bfd81e048a9479faafcb382200cbc627",
345        )),
346        "solidity" => Some((
347            1180330,
348            "cf844894e2c410b4467454304932edb15cb7c38bff1d51ed3cbbe519436931f6",
349        )),
350        "sparql" => Some((
351            1113026,
352            "d26cb22b6ae7f980cffb32261e554efcc881ebd685a557b41715cd8a967db09d",
353        )),
354        "sql" => Some((
355            5382122,
356            "f85f66a653afe1bd14cff8011f683887945a85847a0cc2bf148374702ca454ee",
357        )),
358        "ssh-config" => Some((
359            1131130,
360            "7827ccc835bb805c4a9b54f98afccb3cf12b27dc126e79fffd4d384156e5b486",
361        )),
362        "starlark" => Some((
363            1024220,
364            "e2178390e3c8e6a17d627ebc8e018399292c553671de05e5f9465fc2e54a4226",
365        )),
366        "styx" => Some((
367            964980,
368            "860e3f83c8874e0955f6ddbf9fafd0204c7265dbc6f59bbdad1879c7c343687b",
369        )),
370        "svelte" => Some((
371            974499,
372            "1a2cefaface9077af8c314f874dedaa15491fd80e69fc84f664eba667bc1d9ce",
373        )),
374        "swift" => Some((
375            2962439,
376            "f212e1a0dc161f7413da9028e1cfcfd4a9ebc74a6146230b229a06c015029cfd",
377        )),
378        "textproto" => Some((
379            945817,
380            "705980ae80cb3e3ae120d53512872908da0ef631dd817429f334a935a0e12537",
381        )),
382        "thrift" => Some((
383            1040206,
384            "50a01390fbb2d1982845140ccc96560b74d398084b603c14ab4654702ec596f5",
385        )),
386        "tlaplus" => Some((
387            3591672,
388            "d1b8eafd60bdd4ec6340cae45630378b09a54ed108f26c87b6c65293c57b1b46",
389        )),
390        "toml" => Some((
391            953185,
392            "e7af1a38febfd572e0ad89644165cef8bc7a996796ab244c2b7b1db09bb933eb",
393        )),
394        "tsx" => Some((
395            1937369,
396            "a5ec1393d88d958606295b7eebee60a945955c3aae643642f93fdf6abdf1a388",
397        )),
398        "typescript" => Some((
399            1904608,
400            "dafcf84529307416d5f743fb1569d08c3e104751c7c26e51ce61b4296cbe7131",
401        )),
402        "typst" => Some((
403            1560168,
404            "2d9a16d564d67e40865c45e61b467bac7032f9269f3744aee7ff340a11b1af05",
405        )),
406        "uiua" => Some((
407            1206592,
408            "5a07f06a7aafee3a4a6e94f8867ab074de0c80a633bc8df8bf3f5d598a458ab8",
409        )),
410        "vb" => Some((
411            2028890,
412            "bb8d688e1fd0f3f5e9e7813e8842393a26c3a2daf232cd0698addc3861ef917f",
413        )),
414        "verilog" => Some((
415            13471327,
416            "1a24834c14cda83b6db374c7d7a6ca2343f424191091c4029fb0cd3927a1dde2",
417        )),
418        "vhdl" => Some((
419            2015933,
420            "508ab1e9a75d7cf5c2c89b938e35ada2357dc456a97039a3625354c963723021",
421        )),
422        "vim" => Some((
423            1969694,
424            "5dc641ae623882695d866f94b61e0d46f5f66b9eaa5e6d74e517f2a818c76458",
425        )),
426        "vue" => Some((
427            958996,
428            "ad5b1f0a427ae6d9510390cd079bcc9113286db1b133a2c12b50a560ec1cda74",
429        )),
430        "wit" => Some((
431            1001355,
432            "a78aecbec43ad2c3f09d38256aedcbca4320e2f999444044052c159e2ca18759",
433        )),
434        "x86asm" => Some((
435            960388,
436            "3f8b3f11fd415f65b9d8f0b5328f100ef533a633869e2f35733b90bc5a453651",
437        )),
438        "xml" => Some((
439            975694,
440            "9bc4f9ddde44b47b082d9df6c1c7ffb5956872f82348fc60df1cc71efbe0ec7e",
441        )),
442        "yaml" => Some((
443            1086189,
444            "de537a8cc986bc4a0b96504498d79e6b745285afc25ddace54a2e32b68712e0b",
445        )),
446        "yuri" => Some((
447            1081656,
448            "f62b5559dfa745bb24b7fdc8d0495c20d745f926a768885f5c3fc62d7e6b827c",
449        )),
450        "zig" => Some((
451            1534700,
452            "07af247f8a06205d0e7c97e46a9854a91e806cce9e6d3d2ba537de523aa3b3cb",
453        )),
454        "zsh" => Some((
455            1031426,
456            "ee4bbc13cf97c2d1468cf0afcb4338c54e7e771e7fd5ceb9b80cafe54c02d8e8",
457        )),
458        _ => None,
459    }
460}
461
462#[derive(Deserialize)]
463struct Languages {
464    filenames: HashMap<String, String>,
465    aliases: HashMap<String, String>,
466}
467
468static LANGUAGES: LazyLock<Languages> = LazyLock::new(|| {
469    serde_json::from_str(include_str!("../web/languages.json"))
470        .expect("invalid language classification data")
471});
472
473pub fn detect(path: &str) -> Option<&'static str> {
474    let name = path
475        .rsplit(['/', '\\'])
476        .next()
477        .unwrap_or(path)
478        .to_lowercase();
479    let extension = name.rsplit('.').next().unwrap_or(&name);
480    LANGUAGES
481        .filenames
482        .get(&name)
483        .or_else(|| LANGUAGES.aliases.get(&name))
484        .or_else(|| LANGUAGES.aliases.get(extension))
485        .map(String::as_str)
486}
487
488/// Resolves a file name, extension, or code fence identifier to a grammar.
489pub fn canonical(name: &str) -> Option<&'static str> {
490    LANGUAGES
491        .aliases
492        .get(&name.to_lowercase())
493        .map(String::as_str)
494}
495
496#[cfg(test)]
497mod tests {
498    use super::{LANGUAGES, artifact, canonical, detect};
499
500    #[test]
501    fn resolves_fence_identifiers() {
502        assert_eq!(canonical("sh"), Some("bash"));
503        assert_eq!(canonical("C++"), Some("cpp"));
504        assert_eq!(canonical("Cargo.lock"), None);
505        assert_eq!(canonical(""), None);
506    }
507
508    #[test]
509    fn all_classified_languages_have_grammars() {
510        for language in LANGUAGES
511            .filenames
512            .values()
513            .chain(LANGUAGES.aliases.values())
514        {
515            assert!(artifact(language).is_some(), "missing grammar: {language}");
516        }
517    }
518}