char/sorcery

static-files based git repo viewer

git clone https://git.t4t.associates/char/sorcery

Charlotte Somhighlight: better aliases for languages595bcc7

main
23.9 KiB765 linesraw
1pub const VERSION: &str = "2.18.2";
2
3pub fn artifact(language: &str) -> Option<(usize, &'static str)> {
4    match language {
5        "ada" => Some((
6            1180565,
7            "04ddb795cfbc68d549ee897bfa18617f13dbbfaf46829843ea9e35e80bdab8c1",
8        )),
9        "agda" => Some((
10            3022238,
11            "b0b4243734d2c65a6531fa5960831bf3f0ecd03b562479c77eeaf2ea216d328b",
12        )),
13        "asciidoc" => Some((
14            1196286,
15            "e5d0416c6c762f1249c19a26b61244aa9eea3e81c0b43d385deb6dca21d3a32e",
16        )),
17        "asm" => Some((
18            955782,
19            "62efa779c6e4477c509d43a3847d6ef8bd9739923b3d25462d3e711f32ac9d9f",
20        )),
21        "awk" => Some((
22            1423948,
23            "1e9212052ab29b0f162ebaf24476e003c48a71c8b82797b67538ec657bed5c21",
24        )),
25        "bash" => Some((
26            2189951,
27            "9ffeeaaae2246e7f7bea8bdaf22120f93effac4a8f3acc2e2190382647b2e7ca",
28        )),
29        "batch" => Some((
30            1073511,
31            "428fcb7259baa5db3f961f903096c04f06017ef38a01009d7cb882b41897e206",
32        )),
33        "c" => Some((
34            1369239,
35            "113cb4581b76b48da2ba5fbc566fb551dab195ec256ddd540094b3eb29042c4a",
36        )),
37        "c-sharp" => Some((
38            3780203,
39            "6a4066148bc107b962e8ca532230dcd77a555c6893fe035acacd68e2f3daa91e",
40        )),
41        "caddy" => Some((
42            1386228,
43            "0e141a81d9a7855d96c11d8cc9fbd49c6deb1fe2a45f8b4f7d447074bcd84e66",
44        )),
45        "capnp" => Some((
46            993759,
47            "dadd045f06e227309b67ad8f50aeb883c12d9379ab8ac1caaa64832cd5fa023b",
48        )),
49        "cedar" => Some((
50            1012243,
51            "5261c7ae0515751cc438bd05a1eed200de702fcea31b6886f54f7ee515bda23e",
52        )),
53        "cedarschema" => Some((
54            957615,
55            "4852d2dbffe54807d291074c8e519bfa0c35a93406cb6dd446b53979d41550b8",
56        )),
57        "clojure" => Some((
58            1008753,
59            "1a8178f6d4a0d8dff9dfbb55b0fb2e6a347efc6ea993d310a3edfa87f3d68953",
60        )),
61        "cmake" => Some((
62            1014233,
63            "f52cc071c98e30d23dfa62949288f93dd12be381cc904873e21daa3bf6a00a25",
64        )),
65        "cobol" => Some((
66            6298591,
67            "4f2b712e812461daa1e8fa82749cdd25bf51f4b91b09cf4ad6400cdc416feb8b",
68        )),
69        "commonlisp" => Some((
70            1629046,
71            "138cce06c364ccc39f70dd2011b3d4d6a12945506374a26d9b547c84b0f5d65d",
72        )),
73        "cpp" => Some((
74            3526186,
75            "2a535ea41d23257c5cc8a44ad1a51186bd445870d4013147a56b8769cf89503f",
76        )),
77        "css" => Some((
78            1055728,
79            "5a97ef7f682db6ea988d2b614928f0d0349e07ffc3866e250a08f031ee12c2a7",
80        )),
81        "d" => Some((
82            4044353,
83            "6ff8de8b8997eb145820ac2a7fcb04b74b80546340d53821074694615d3aca67",
84        )),
85        "dart" => Some((
86            1620290,
87            "76856586b4eec2af702981f2bf3602e85fe16be78229eff9021b49221f9fe279",
88        )),
89        "devicetree" => Some((
90            1085320,
91            "9f3be12d071bd3110c5a590e27dcb20db6675b248d44f13935c62033b165459d",
92        )),
93        "diff" => Some((
94            949154,
95            "1c9930f2b96cf4143537332b2363ad72672f0b8b37830d00920c99272d3dddbc",
96        )),
97        "dockerfile" => Some((
98            975987,
99            "30209187949681b96ad0c761bf369d0bf6ddba25c2a928869432bf255bc4c60f",
100        )),
101        "dot" => Some((
102            953907,
103            "7819e2e18c716df2f7c1ea4739c4acffc04522da86e716b86285d8501ad9bb41",
104        )),
105        "elisp" => Some((
106            961934,
107            "54372e28e5cb656fff43f2f991e662abac4731c476b73c4f740a939d85c87d38",
108        )),
109        "elixir" => Some((
110            2342431,
111            "3ebdac31c0e06ed056c2cdb68461267c3aa38780bdb8ae472230f4ee75564259",
112        )),
113        "elm" => Some((
114            1101651,
115            "7e940515a771eb9628eeca901198806abc9dd6e3680f8d19a30ae53d73ad4726",
116        )),
117        "erlang" => Some((
118            1215382,
119            "0483b4cb87878c80982dc98ccdda33800a2830ca3c738095c6ddf7ba161f2d34",
120        )),
121        "fish" => Some((
122            993837,
123            "4b91b7f192b262a04cf332537a2880cfd8eb99bce9fb170c662149cbe58ce18c",
124        )),
125        "fsharp" => Some((
126            4149576,
127            "40b457abad845651b1b2a6e2261f4f2b0dcd83a817018ee5a00514905adc4b1b",
128        )),
129        "gitattributes" => Some((
130            948786,
131            "e49f25b0a5c5b5b99a28df2d6bca35965cafeec660d8098949c5878cbad0c99d",
132        )),
133        "gleam" => Some((
134            1329356,
135            "8d6f33add8239f20cd01922265aed58d00edd1c451d6e99aa3f8a4b346357ae9",
136        )),
137        "glsl" => Some((
138            1499154,
139            "556124745763b101d6019b882a1cde0644c0be8dc29e90031dcf7f095ff2f85f",
140        )),
141        "go" => Some((
142            1135258,
143            "463a15deb2edf3b9f3856a6cd677ea4e27d4ed1f427c1e28ef0e5a25c925b613",
144        )),
145        "graphql" => Some((
146            984858,
147            "2485aef46e0e88d6bbc2f75d753a9ace01edd0b87fd07802420d37be9828348f",
148        )),
149        "groovy" => Some((
150            1542109,
151            "0f5e610f2188e56f68b34ddfd5058990bee9cc33be61ee86606350ae0cf4ac07",
152        )),
153        "haskell" => Some((
154            3081220,
155            "09d853c618d6b261bd3ec68b517c325063daf082871d4e2f93cfa3176819df90",
156        )),
157        "hcl" => Some((
158            1019375,
159            "cd7847e24bdbb7b8c6b1c54ec32516d04d476fd6420d3a6588393a94f418c31e",
160        )),
161        "hlsl" => Some((
162            3771606,
163            "c51492ff7aabc15bcb4790d4ba065ad8f27122cca3b31df0fc75eba6359f981b",
164        )),
165        "html" => Some((
166            946396,
167            "26188f4e56215bc02129b31dae091f968e817b5bc383548e18d5428544ecb06f",
168        )),
169        "idris" => Some((
170            2354626,
171            "28cc23922bfad68efdf8d77fc3a7977c56e8d2c041ef567097227b8fd813d78c",
172        )),
173        "ini" => Some((
174            933499,
175            "adbef8297d0838bd48146051e1a3119d6240c4bdbf87f3390ae11fc4d2f3ff81",
176        )),
177        "java" => Some((
178            1208378,
179            "c110f752747013ec2604bab1532a86591f2d2b939aad5d8af61d2bb61d46ed14",
180        )),
181        "javascript" => Some((
182            1262729,
183            "63850e59d4c059edac638f8b9d339ac568944593b2e76b151b7955590f3e74db",
184        )),
185        "jinja2" => Some((
186            941545,
187            "e5fbb8a7eedecbe6345122545d375ec10c8c5bb90af0ee18c201487e356ccfc3",
188        )),
189        "jq" => Some((
190            1023788,
191            "a917ee166b3f0893d2b0b4fc48b12f9ddc75c179f5cac2cef1748af0851fa578",
192        )),
193        "jsdoc" => Some((
194            958427,
195            "743b7b37cd1dbd7241eb1352884450f5a167f529d79c59747865d6f26cbc0095",
196        )),
197        "json" => Some((
198            934592,
199            "3c2172f176687106db77f04dc5ade071e8f6e5c42066e7200b317dd45ff2a375",
200        )),
201        "julia" => Some((
202            2873312,
203            "dd11c813ce733b034678219acf6c997233898b7fbea1cf6ce115d55a14150a61",
204        )),
205        "just" => Some((
206            979125,
207            "7fbbb688db5a05d4dc025837d466c7624f88b244c6ca1d50f941c6ee13de16a9",
208        )),
209        "kconfig" => Some((
210            983005,
211            "02030e846565bfe1687a93034c41901f183d4818b3792138956f163b01b674e6",
212        )),
213        "kdl" => Some((
214            994781,
215            "18601d1ea0b4f96d6f4a360f308e2d731eade43f654aa37bc4c76f535d0de611",
216        )),
217        "kotlin" => Some((
218            4065274,
219            "6beb95f876b947bcad1cf5c01c0b11c15d2c4421bcba04ce2d53387fabf2086c",
220        )),
221        "lean" => Some((
222            15179599,
223            "3ba04ec2626fadc5cc3778ecdfab2054f02f3dd758dd782689f4389ca23c805f",
224        )),
225        "lua" => Some((
226            977747,
227            "4553556759358b5f8ac34cdfed6f82da855f004d1b06e9cb63eaebf3f8d58ac2",
228        )),
229        "make" => Some((
230            1069502,
231            "3cb8479db980596ea229dc7e1a50219e79e5e54517a3688561bdb36ba826f5a2",
232        )),
233        "markdown" => Some((
234            1233242,
235            "952a979343d0144fbdac518d5d0d6404312d0f7ad74e25a197be9cf3bd334ee4",
236        )),
237        "matlab" => Some((
238            1279236,
239            "050f8aa2a4462631ec8dcae2504086270190d32bae741f2b35d91336e18b8702",
240        )),
241        "meson" => Some((
242            1040115,
243            "cf7c7c5c07968a30f84bfd005630b1315a45220b1ed37ea08a4434a5886eed62",
244        )),
245        "nginx" => Some((
246            966328,
247            "7562b504b0213f631d5ac6b9bbf847a7d0938b514e516b336d148374ac2c223a",
248        )),
249        "ninja" => Some((
250            960432,
251            "4a86eafeda4963f73b01f181523170ce334ca50c29782a121a9cd741df9e6500",
252        )),
253        "nix" => Some((
254            1011972,
255            "5e34d178342232c082b492798cec6a94a41f7fea869e96ab6f895aca4879967e",
256        )),
257        "objc" => Some((
258            3179021,
259            "49681944578a9e36f955da6a8648b00c5e7e38dcd065b1ee7318c1fd339d9a7f",
260        )),
261        "ocaml" => Some((
262            2457345,
263            "d7ce429bb88b530f1aa8ddbbe504ec715b23218afb96b69d5f388515d96280a8",
264        )),
265        "odin" => Some((
266            2509054,
267            "4ac682f9b12c0a560b993f36e0015bb207a9ea4ead4df8361815067c80e5fdb4",
268        )),
269        "perl" => Some((
270            2479922,
271            "71354540d41528eabd3e27de750193cee26199de8e93601aac502b6c50ea3dbd",
272        )),
273        "php" => Some((
274            1611597,
275            "6ce9c56401aa8b30f713d897991210ca7d455858c49c8276ff6973fc14ce44aa",
276        )),
277        "postscript" => Some((
278            938523,
279            "99f95c94d88e7fe38e4578dc0bdbd3b2008f2ca4ac28bf4cd623967d9dd28bac",
280        )),
281        "powershell" => Some((
282            1657956,
283            "074574d5791b956b32b0a5073a491a2d0e7cd5cd2d365a3d0e1de679fc889f25",
284        )),
285        "prolog" => Some((
286            944395,
287            "d76316fe4a327032d48587f37b6b459d6cfccc1cb23367ecbaa2a9a2b5524c8c",
288        )),
289        "proto" => Some((
290            1006657,
291            "e5ec2be4a253b10c21f1c631f5733e07c44a6b951da30845b6fdf70d174c6bec",
292        )),
293        "python" => Some((
294            1345718,
295            "a952e9f349fb441fd70f58fae01a1f543d1b07bc85a05f96233e00c0c35f7263",
296        )),
297        "query" => Some((
298            947478,
299            "87e77c33e2f443c1e371aded82d557e20f76ef8506bfc62a266d9408ea26b24c",
300        )),
301        "r" => Some((
302            1375758,
303            "baa5c32963ff40fa0e5e39bbcedba1a2cf928302b61191ca4e3d08559760ad4e",
304        )),
305        "regex" => Some((
306            949532,
307            "266bdc59e69d87f2aff2267d4398546c46a14eff26b964c5eb665ee3d46416e2",
308        )),
309        "rego" => Some((
310            1050559,
311            "5182fa15e18fcc16f65f22ab79f91b75d11c724f0dc5b7d0ac7e2fe4e1cf3a51",
312        )),
313        "rescript" => Some((
314            1614855,
315            "672b2a29aa120c15f71ad3b45832837b13dc33012916650235f1273bec155db6",
316        )),
317        "ron" => Some((
318            953729,
319            "b3636f00a4c28969a1813b789d3729d59944b7c8676a2f8bc6c4fe38ccccf8c4",
320        )),
321        "ruby" => Some((
322            2524595,
323            "a6d2d755dd5538f8398c71e254c0a22578382d69cdeb72026380663ca914fe04",
324        )),
325        "rust" => Some((
326            2174209,
327            "23082cdeeab932eadd084c8df49098dc9142d26da9791b981243f1d511326546",
328        )),
329        "scala" => Some((
330            4115142,
331            "738933c1fc34f4bf0a5cff6b76494104e246144d26a2eda238135e9dfb36618a",
332        )),
333        "scheme" => Some((
334            1033643,
335            "e3b024007ba0f051bf2eefa8bb405a042edfef55abcb6917c1f8be6c5fd8f9e7",
336        )),
337        "scss" => Some((
338            1107833,
339            "39390b75a8f174231891a27bfa0844f7bfd81e048a9479faafcb382200cbc627",
340        )),
341        "solidity" => Some((
342            1180330,
343            "cf844894e2c410b4467454304932edb15cb7c38bff1d51ed3cbbe519436931f6",
344        )),
345        "sparql" => Some((
346            1113026,
347            "d26cb22b6ae7f980cffb32261e554efcc881ebd685a557b41715cd8a967db09d",
348        )),
349        "sql" => Some((
350            5382122,
351            "f85f66a653afe1bd14cff8011f683887945a85847a0cc2bf148374702ca454ee",
352        )),
353        "ssh-config" => Some((
354            1131130,
355            "7827ccc835bb805c4a9b54f98afccb3cf12b27dc126e79fffd4d384156e5b486",
356        )),
357        "starlark" => Some((
358            1024220,
359            "e2178390e3c8e6a17d627ebc8e018399292c553671de05e5f9465fc2e54a4226",
360        )),
361        "styx" => Some((
362            964980,
363            "860e3f83c8874e0955f6ddbf9fafd0204c7265dbc6f59bbdad1879c7c343687b",
364        )),
365        "svelte" => Some((
366            974499,
367            "1a2cefaface9077af8c314f874dedaa15491fd80e69fc84f664eba667bc1d9ce",
368        )),
369        "swift" => Some((
370            2962439,
371            "f212e1a0dc161f7413da9028e1cfcfd4a9ebc74a6146230b229a06c015029cfd",
372        )),
373        "textproto" => Some((
374            945817,
375            "705980ae80cb3e3ae120d53512872908da0ef631dd817429f334a935a0e12537",
376        )),
377        "thrift" => Some((
378            1040206,
379            "50a01390fbb2d1982845140ccc96560b74d398084b603c14ab4654702ec596f5",
380        )),
381        "tlaplus" => Some((
382            3591672,
383            "d1b8eafd60bdd4ec6340cae45630378b09a54ed108f26c87b6c65293c57b1b46",
384        )),
385        "toml" => Some((
386            953185,
387            "e7af1a38febfd572e0ad89644165cef8bc7a996796ab244c2b7b1db09bb933eb",
388        )),
389        "tsx" => Some((
390            1937369,
391            "a5ec1393d88d958606295b7eebee60a945955c3aae643642f93fdf6abdf1a388",
392        )),
393        "typescript" => Some((
394            1904608,
395            "dafcf84529307416d5f743fb1569d08c3e104751c7c26e51ce61b4296cbe7131",
396        )),
397        "typst" => Some((
398            1560168,
399            "2d9a16d564d67e40865c45e61b467bac7032f9269f3744aee7ff340a11b1af05",
400        )),
401        "uiua" => Some((
402            1206592,
403            "5a07f06a7aafee3a4a6e94f8867ab074de0c80a633bc8df8bf3f5d598a458ab8",
404        )),
405        "vb" => Some((
406            2028890,
407            "bb8d688e1fd0f3f5e9e7813e8842393a26c3a2daf232cd0698addc3861ef917f",
408        )),
409        "verilog" => Some((
410            13471327,
411            "1a24834c14cda83b6db374c7d7a6ca2343f424191091c4029fb0cd3927a1dde2",
412        )),
413        "vhdl" => Some((
414            2015933,
415            "508ab1e9a75d7cf5c2c89b938e35ada2357dc456a97039a3625354c963723021",
416        )),
417        "vim" => Some((
418            1969694,
419            "5dc641ae623882695d866f94b61e0d46f5f66b9eaa5e6d74e517f2a818c76458",
420        )),
421        "vue" => Some((
422            958996,
423            "ad5b1f0a427ae6d9510390cd079bcc9113286db1b133a2c12b50a560ec1cda74",
424        )),
425        "wit" => Some((
426            1001355,
427            "a78aecbec43ad2c3f09d38256aedcbca4320e2f999444044052c159e2ca18759",
428        )),
429        "x86asm" => Some((
430            960388,
431            "3f8b3f11fd415f65b9d8f0b5328f100ef533a633869e2f35733b90bc5a453651",
432        )),
433        "xml" => Some((
434            975694,
435            "9bc4f9ddde44b47b082d9df6c1c7ffb5956872f82348fc60df1cc71efbe0ec7e",
436        )),
437        "yaml" => Some((
438            1086189,
439            "de537a8cc986bc4a0b96504498d79e6b745285afc25ddace54a2e32b68712e0b",
440        )),
441        "yuri" => Some((
442            1081656,
443            "f62b5559dfa745bb24b7fdc8d0495c20d745f926a768885f5c3fc62d7e6b827c",
444        )),
445        "zig" => Some((
446            1534700,
447            "07af247f8a06205d0e7c97e46a9854a91e806cce9e6d3d2ba537de523aa3b3cb",
448        )),
449        "zsh" => Some((
450            1031426,
451            "ee4bbc13cf97c2d1468cf0afcb4338c54e7e771e7fd5ceb9b80cafe54c02d8e8",
452        )),
453        _ => None,
454    }
455}
456
457pub fn detect(path: &str) -> Option<&'static str> {
458    let name = path.rsplit(['/', '\\']).next().unwrap_or(path);
459    let extension = name.rsplit('.').next().unwrap_or(name);
460    canonical(name).or_else(|| canonical(extension))
461}
462
463/// Resolves a file name, extension, or code fence identifier to a grammar.
464pub fn canonical(name: &str) -> Option<&'static str> {
465    Some(match name.to_lowercase().as_str() {
466        "ada" => "ada",
467        "adb" => "ada",
468        "adoc" => "asciidoc",
469        "ads" => "ada",
470        "agda" => "agda",
471        "asciidoc" => "asciidoc",
472        "asm" => "asm",
473        "assembly" => "asm",
474        "awk" => "awk",
475        "bash" => "bash",
476        "bash_profile" => "bash",
477        "bashrc" => "bash",
478        "bat" => "batch",
479        "batch" => "batch",
480        "bazel" => "starlark",
481        "bzl" => "starlark",
482        "c" => "c",
483        "c#" => "c-sharp",
484        "c++" => "cpp",
485        "c-sharp" => "c-sharp",
486        "caddy" => "caddy",
487        "caddyfile" => "caddy",
488        "capnp" => "capnp",
489        "cbl" => "cobol",
490        "cc" => "cpp",
491        "cedar" => "cedar",
492        "cedarschema" => "cedarschema",
493        "cfg" => "ini",
494        "cjs" => "javascript",
495        "cl" => "commonlisp",
496        "clj" => "clojure",
497        "cljc" => "clojure",
498        "cljs" => "clojure",
499        "clojure" => "clojure",
500        "cmake" => "cmake",
501        "cmakelists.txt" => "cmake",
502        "cmd" => "batch",
503        "cob" => "cobol",
504        "cobol" => "cobol",
505        "commonlisp" => "commonlisp",
506        "conf" => "ini",
507        "console" => "bash",
508        "containerfile" => "dockerfile",
509        "cpp" => "cpp",
510        "cpy" => "cobol",
511        "cs" => "c-sharp",
512        "csharp" => "c-sharp",
513        "csproj" => "xml",
514        "css" => "css",
515        "cts" => "typescript",
516        "cxx" => "cpp",
517        "d" => "d",
518        "dart" => "dart",
519        "devicetree" => "devicetree",
520        "diff" => "diff",
521        "dlang" => "d",
522        "docker" => "dockerfile",
523        "dockerfile" => "dockerfile",
524        "dot" => "dot",
525        "dts" => "devicetree",
526        "dtsi" => "devicetree",
527        "editorconfig" => "ini",
528        "edn" => "clojure",
529        "el" => "elisp",
530        "elisp" => "elisp",
531        "elixir" => "elixir",
532        "elm" => "elm",
533        "emacs-lisp" => "elisp",
534        "erl" => "erlang",
535        "erlang" => "erlang",
536        "ex" => "elixir",
537        "exs" => "elixir",
538        "f#" => "fsharp",
539        "fish" => "fish",
540        "frag" => "glsl",
541        "fs" => "fsharp",
542        "fsharp" => "fsharp",
543        "fsx" => "fsharp",
544        "gemfile" => "ruby",
545        "gemspec" => "ruby",
546        "gitattributes" => "gitattributes",
547        "gitconfig" => "ini",
548        "gitmodules" => "ini",
549        "gleam" => "gleam",
550        "glsl" => "glsl",
551        "gnumakefile" => "make",
552        "go" => "go",
553        "golang" => "go",
554        "gql" => "graphql",
555        "gradle" => "groovy",
556        "graphql" => "graphql",
557        "graphviz" => "dot",
558        "groovy" => "groovy",
559        "gsh" => "groovy",
560        "gv" => "dot",
561        "gvy" => "groovy",
562        "gy" => "groovy",
563        "h" => "c",
564        "haskell" => "haskell",
565        "hcl" => "hcl",
566        "hh" => "cpp",
567        "hlsl" => "hlsl",
568        "hpp" => "cpp",
569        "hrl" => "erlang",
570        "hs" => "haskell",
571        "htm" => "html",
572        "html" => "html",
573        "hxx" => "cpp",
574        "idr" => "idris",
575        "idris" => "idris",
576        "ini" => "ini",
577        "j2" => "jinja2",
578        "java" => "java",
579        "javascript" => "javascript",
580        "jinja" => "jinja2",
581        "jinja2" => "jinja2",
582        "jl" => "julia",
583        "jq" => "jq",
584        "js" => "javascript",
585        "jsdoc" => "jsdoc",
586        "json" => "json",
587        "json5" => "json",
588        "jsonc" => "json",
589        "jsx" => "javascript",
590        "julia" => "julia",
591        "just" => "just",
592        "justfile" => "just",
593        "kconfig" => "kconfig",
594        "kdl" => "kdl",
595        "kotlin" => "kotlin",
596        "kt" => "kotlin",
597        "kts" => "kotlin",
598        "lean" => "lean",
599        "lisp" => "commonlisp",
600        "lua" => "lua",
601        "m" => "matlab",
602        "make" => "make",
603        "makefile" => "make",
604        "markdown" => "markdown",
605        "matlab" => "matlab",
606        "md" => "markdown",
607        "mdx" => "markdown",
608        "meson" => "meson",
609        "meson.build" => "meson",
610        "mjs" => "javascript",
611        "mk" => "make",
612        "ml" => "ocaml",
613        "mli" => "ocaml",
614        "mm" => "objc",
615        "mts" => "typescript",
616        "mysql" => "sql",
617        "nasm" => "x86asm",
618        "nginx" => "nginx",
619        "nginx.conf" => "nginx",
620        "ninja" => "ninja",
621        "nix" => "nix",
622        "objc" => "objc",
623        "objective-c" => "objc",
624        "objectivec" => "objc",
625        "ocaml" => "ocaml",
626        "odin" => "odin",
627        "opa" => "rego",
628        "patch" => "diff",
629        "pbtxt" => "textproto",
630        "perl" => "perl",
631        "pgsql" => "sql",
632        "php" => "php",
633        "pl" => "perl",
634        "plist" => "xml",
635        "plsql" => "sql",
636        "pm" => "perl",
637        "postgres" => "sql",
638        "postgresql" => "sql",
639        "postscript" => "postscript",
640        "powershell" => "powershell",
641        "pro" => "prolog",
642        "prolog" => "prolog",
643        "proto" => "proto",
644        "protobuf" => "proto",
645        "ps" => "postscript",
646        "ps1" => "powershell",
647        "psm1" => "powershell",
648        "pwsh" => "powershell",
649        "py" => "python",
650        "py3" => "python",
651        "pyi" => "python",
652        "python" => "python",
653        "python3" => "python",
654        "query" => "query",
655        "r" => "r",
656        "racket" => "scheme",
657        "rakefile" => "ruby",
658        "rb" => "ruby",
659        "regex" => "regex",
660        "regexp" => "regex",
661        "rego" => "rego",
662        "res" => "rescript",
663        "rescript" => "rescript",
664        "rkt" => "scheme",
665        "rlang" => "r",
666        "ron" => "ron",
667        "rq" => "sparql",
668        "rs" => "rust",
669        "ruby" => "ruby",
670        "rust" => "rust",
671        "s" => "asm",
672        "sass" => "scss",
673        "sbt" => "scala",
674        "scala" => "scala",
675        "scheme" => "scheme",
676        "scm" => "query",
677        "scss" => "scss",
678        "sh" => "bash",
679        "shell" => "bash",
680        "sol" => "solidity",
681        "solidity" => "solidity",
682        "sparql" => "sparql",
683        "sql" => "sql",
684        "sqlite" => "sql",
685        "ss" => "scheme",
686        "ssh-config" => "ssh-config",
687        "ssh_config" => "ssh-config",
688        "sshd_config" => "ssh-config",
689        "starlark" => "starlark",
690        "styx" => "styx",
691        "sv" => "verilog",
692        "svelte" => "svelte",
693        "svg" => "xml",
694        "swift" => "swift",
695        "systemverilog" => "verilog",
696        "terraform" => "hcl",
697        "textpb" => "textproto",
698        "textproto" => "textproto",
699        "tf" => "hcl",
700        "tfvars" => "hcl",
701        "thrift" => "thrift",
702        "tla" => "tlaplus",
703        "tlaplus" => "tlaplus",
704        "toml" => "toml",
705        "ts" => "typescript",
706        "tsql" => "sql",
707        "tsx" => "tsx",
708        "typ" => "typst",
709        "typescript" => "typescript",
710        "typst" => "typst",
711        "ua" => "uiua",
712        "uiua" => "uiua",
713        "v" => "verilog",
714        "vb" => "vb",
715        "vbnet" => "vb",
716        "verilog" => "verilog",
717        "vert" => "glsl",
718        "vhd" => "vhdl",
719        "vhdl" => "vhdl",
720        "vim" => "vim",
721        "viml" => "vim",
722        "vimrc" => "vim",
723        "vimscript" => "vim",
724        "visualbasic" => "vb",
725        "vue" => "vue",
726        "wasm-interface" => "wit",
727        "wit" => "wit",
728        "x86" => "x86asm",
729        "x86asm" => "x86asm",
730        "xhtml" => "html",
731        "xml" => "xml",
732        "xsd" => "xml",
733        "xsl" => "xml",
734        "xslt" => "xml",
735        "yaml" => "yaml",
736        "yml" => "yaml",
737        "yuri" => "yuri",
738        "zig" => "zig",
739        "zon" => "zig",
740        "zsh" => "zsh",
741        "zshrc" => "zsh",
742        _ => return None,
743    })
744}
745
746#[cfg(test)]
747mod tests {
748    use super::{canonical, detect};
749
750    #[test]
751    fn detects_language_from_path() {
752        assert_eq!(detect("src/main.rs"), Some("rust"));
753        assert_eq!(detect("Dockerfile"), Some("dockerfile"));
754        assert_eq!(detect("src/Makefile"), Some("make"));
755        assert_eq!(detect("CMakeLists.txt"), Some("cmake"));
756        assert_eq!(detect("README"), None);
757    }
758
759    #[test]
760    fn resolves_fence_identifiers() {
761        assert_eq!(canonical("sh"), Some("bash"));
762        assert_eq!(canonical("C++"), Some("cpp"));
763        assert_eq!(canonical(""), None);
764    }
765}