plotnik_langs/
builtin.rs

1use std::sync::{Arc, LazyLock};
2
3use crate::{Lang, LangInner};
4
5/// Language metadata for listing.
6#[derive(Debug, Clone)]
7pub struct LangInfo {
8    /// Canonical name (first in names list).
9    pub name: &'static str,
10    /// All name aliases (includes canonical name).
11    pub aliases: &'static [&'static str],
12    /// File extensions.
13    pub extensions: &'static [&'static str],
14}
15
16macro_rules! define_langs {
17    (
18        $(
19            $fn_name:ident => {
20                feature: $feature:literal,
21                name: $name:literal,
22                ts_lang: $ts_lang:expr,
23                lang_key: $lang_key:literal,
24                names: [$($alias:literal),* $(,)?],
25                extensions: [$($ext:literal),* $(,)?] $(,)?
26            }
27        ),* $(,)?
28    ) => {
29        // Generate static Lang definitions with LazyLock
30        $(
31            #[cfg(feature = $feature)]
32            pub fn $fn_name() -> Lang {
33                paste::paste! {
34                    static LANG: LazyLock<Lang> = LazyLock::new(|| {
35                        static NODE_TYPES_BYTES: &[u8] = include_bytes!(env!(
36                            concat!("PLOTNIK_NODE_TYPES_", $lang_key)
37                        ));
38                        static GRAMMAR_BYTES: &[u8] = include_bytes!(env!(
39                            concat!("PLOTNIK_GRAMMAR_", $lang_key)
40                        ));
41
42                        let raw_nodes: Vec<plotnik_core::RawNode> =
43                            postcard::from_bytes(NODE_TYPES_BYTES)
44                                .expect("invalid embedded node types");
45
46                        let grammar = plotnik_core::grammar::Grammar::from_binary(GRAMMAR_BYTES)
47                            .expect("invalid embedded grammar");
48
49                        Arc::new(LangInner::new(
50                            $name,
51                            $ts_lang.into(),
52                            raw_nodes,
53                            grammar,
54                        ))
55                    });
56                }
57                Arc::clone(&LANG)
58            }
59        )*
60
61        pub fn from_name(s: &str) -> Option<Lang> {
62            match s.to_ascii_lowercase().as_str() {
63                $(
64                    #[cfg(feature = $feature)]
65                    $($alias)|* => Some($fn_name()),
66                )*
67                _ => None,
68            }
69        }
70
71        #[allow(unreachable_patterns)]
72        pub fn from_ext(ext: &str) -> Option<Lang> {
73            match ext.to_ascii_lowercase().as_str() {
74                $(
75                    #[cfg(feature = $feature)]
76                    $($ext)|* => Some($fn_name()),
77                )*
78                _ => None,
79            }
80        }
81
82        pub fn all() -> Vec<Lang> {
83            vec![
84                $(
85                    #[cfg(feature = $feature)]
86                    $fn_name(),
87                )*
88            ]
89        }
90
91        /// Get metadata for all available languages.
92        pub fn all_info() -> Vec<LangInfo> {
93            vec![
94                $(
95                    #[cfg(feature = $feature)]
96                    LangInfo {
97                        name: $name,
98                        aliases: &[$($alias),*],
99                        extensions: &[$($ext),*],
100                    },
101                )*
102            ]
103        }
104    };
105}
106
107define_langs! {
108    ada => {
109        feature: "lang-ada",
110        name: "ada",
111        ts_lang: arborium_ada::language(),
112        lang_key: "ADA",
113        names: ["ada"],
114        extensions: ["ada", "adb", "ads"],
115    },
116    agda => {
117        feature: "lang-agda",
118        name: "agda",
119        ts_lang: arborium_agda::language(),
120        lang_key: "AGDA",
121        names: ["agda"],
122        extensions: ["agda"],
123    },
124    asciidoc => {
125        feature: "lang-asciidoc",
126        name: "asciidoc",
127        ts_lang: arborium_asciidoc::language(),
128        lang_key: "ASCIIDOC",
129        names: ["asciidoc", "adoc"],
130        extensions: ["adoc", "asciidoc", "asc"],
131    },
132    asm => {
133        feature: "lang-asm",
134        name: "asm",
135        ts_lang: arborium_asm::language(),
136        lang_key: "ASM",
137        names: ["asm", "assembly"],
138        extensions: ["asm", "s"],
139    },
140    awk => {
141        feature: "lang-awk",
142        name: "awk",
143        ts_lang: arborium_awk::language(),
144        lang_key: "AWK",
145        names: ["awk", "gawk", "mawk", "nawk"],
146        extensions: ["awk"],
147    },
148    bash => {
149        feature: "lang-bash",
150        name: "bash",
151        ts_lang: arborium_bash::language(),
152        lang_key: "BASH",
153        names: ["bash", "sh", "shell"],
154        extensions: ["sh", "bash"],
155    },
156    batch => {
157        feature: "lang-batch",
158        name: "batch",
159        ts_lang: arborium_batch::language(),
160        lang_key: "BATCH",
161        names: ["batch", "bat", "cmd"],
162        extensions: ["bat", "cmd"],
163    },
164    c => {
165        feature: "lang-c",
166        name: "c",
167        ts_lang: arborium_c::language(),
168        lang_key: "C",
169        names: ["c"],
170        extensions: ["c", "h"],
171    },
172    caddy => {
173        feature: "lang-caddy",
174        name: "caddy",
175        ts_lang: arborium_caddy::language(),
176        lang_key: "CADDY",
177        names: ["caddy", "caddyfile"],
178        extensions: ["caddyfile"],
179    },
180    capnp => {
181        feature: "lang-capnp",
182        name: "capnp",
183        ts_lang: arborium_capnp::language(),
184        lang_key: "CAPNP",
185        names: ["capnp", "capnproto"],
186        extensions: ["capnp"],
187    },
188    cedar => {
189        feature: "lang-cedar",
190        name: "cedar",
191        ts_lang: arborium_cedar::language(),
192        lang_key: "CEDAR",
193        names: ["cedar"],
194        extensions: ["cedar"],
195    },
196    cedarschema => {
197        feature: "lang-cedarschema",
198        name: "cedarschema",
199        ts_lang: arborium_cedarschema::language(),
200        lang_key: "CEDARSCHEMA",
201        names: ["cedarschema"],
202        extensions: ["cedarschema"],
203    },
204    clojure => {
205        feature: "lang-clojure",
206        name: "clojure",
207        ts_lang: arborium_clojure::language(),
208        lang_key: "CLOJURE",
209        names: ["clojure", "clj"],
210        extensions: ["clj", "cljs", "cljc", "edn"],
211    },
212    cmake => {
213        feature: "lang-cmake",
214        name: "cmake",
215        ts_lang: arborium_cmake::language(),
216        lang_key: "CMAKE",
217        names: ["cmake"],
218        extensions: ["cmake"],
219    },
220    cobol => {
221        feature: "lang-cobol",
222        name: "cobol",
223        ts_lang: arborium_cobol::language(),
224        lang_key: "COBOL",
225        names: ["cobol", "cob"],
226        extensions: ["cob", "cbl", "cpy"],
227    },
228    commonlisp => {
229        feature: "lang-commonlisp",
230        name: "commonlisp",
231        ts_lang: arborium_commonlisp::language(),
232        lang_key: "COMMONLISP",
233        names: ["commonlisp", "common-lisp", "lisp", "cl"],
234        extensions: ["lisp", "lsp", "cl"],
235    },
236    cpp => {
237        feature: "lang-cpp",
238        name: "cpp",
239        ts_lang: arborium_cpp::language(),
240        lang_key: "CPP",
241        names: ["cpp", "c++", "cxx", "cc"],
242        extensions: ["cpp", "cc", "cxx", "hpp", "hh", "hxx", "h++", "c++"],
243    },
244    csharp => {
245        feature: "lang-c-sharp",
246        name: "c_sharp",
247        ts_lang: arborium_c_sharp::language(),
248        lang_key: "C_SHARP",
249        names: ["csharp", "c#", "cs", "c_sharp"],
250        extensions: ["cs"],
251    },
252    css => {
253        feature: "lang-css",
254        name: "css",
255        ts_lang: arborium_css::language(),
256        lang_key: "CSS",
257        names: ["css"],
258        extensions: ["css"],
259    },
260    d => {
261        feature: "lang-d",
262        name: "d",
263        ts_lang: arborium_d::language(),
264        lang_key: "D",
265        names: ["d", "dlang"],
266        extensions: ["d"],
267    },
268    dart => {
269        feature: "lang-dart",
270        name: "dart",
271        ts_lang: arborium_dart::language(),
272        lang_key: "DART",
273        names: ["dart"],
274        extensions: ["dart"],
275    },
276    devicetree => {
277        feature: "lang-devicetree",
278        name: "devicetree",
279        ts_lang: arborium_devicetree::language(),
280        lang_key: "DEVICETREE",
281        names: ["devicetree", "dts"],
282        extensions: ["dts", "dtsi"],
283    },
284    diff => {
285        feature: "lang-diff",
286        name: "diff",
287        ts_lang: arborium_diff::language(),
288        lang_key: "DIFF",
289        names: ["diff", "patch"],
290        extensions: ["diff", "patch"],
291    },
292    dockerfile => {
293        feature: "lang-dockerfile",
294        name: "dockerfile",
295        ts_lang: arborium_dockerfile::language(),
296        lang_key: "DOCKERFILE",
297        names: ["dockerfile", "docker"],
298        extensions: ["dockerfile"],
299    },
300    dot => {
301        feature: "lang-dot",
302        name: "dot",
303        ts_lang: arborium_dot::language(),
304        lang_key: "DOT",
305        names: ["dot", "graphviz"],
306        extensions: ["dot", "gv"],
307    },
308    elisp => {
309        feature: "lang-elisp",
310        name: "elisp",
311        ts_lang: arborium_elisp::language(),
312        lang_key: "ELISP",
313        names: ["elisp", "emacs-lisp"],
314        extensions: ["el"],
315    },
316    elixir => {
317        feature: "lang-elixir",
318        name: "elixir",
319        ts_lang: arborium_elixir::language(),
320        lang_key: "ELIXIR",
321        names: ["elixir", "ex"],
322        extensions: ["ex", "exs"],
323    },
324    elm => {
325        feature: "lang-elm",
326        name: "elm",
327        ts_lang: arborium_elm::language(),
328        lang_key: "ELM",
329        names: ["elm"],
330        extensions: ["elm"],
331    },
332    erlang => {
333        feature: "lang-erlang",
334        name: "erlang",
335        ts_lang: arborium_erlang::language(),
336        lang_key: "ERLANG",
337        names: ["erlang", "erl"],
338        extensions: ["erl", "hrl"],
339    },
340    fish => {
341        feature: "lang-fish",
342        name: "fish",
343        ts_lang: arborium_fish::language(),
344        lang_key: "FISH",
345        names: ["fish"],
346        extensions: ["fish"],
347    },
348    fsharp => {
349        feature: "lang-fsharp",
350        name: "fsharp",
351        ts_lang: arborium_fsharp::language(),
352        lang_key: "FSHARP",
353        names: ["fsharp", "f#", "fs"],
354        extensions: ["fs", "fsi", "fsx"],
355    },
356    gleam => {
357        feature: "lang-gleam",
358        name: "gleam",
359        ts_lang: arborium_gleam::language(),
360        lang_key: "GLEAM",
361        names: ["gleam"],
362        extensions: ["gleam"],
363    },
364    glsl => {
365        feature: "lang-glsl",
366        name: "glsl",
367        ts_lang: arborium_glsl::language(),
368        lang_key: "GLSL",
369        names: ["glsl"],
370        extensions: ["glsl", "vert", "frag", "geom", "tesc", "tese", "comp"],
371    },
372    go => {
373        feature: "lang-go",
374        name: "go",
375        ts_lang: arborium_go::language(),
376        lang_key: "GO",
377        names: ["go", "golang"],
378        extensions: ["go"],
379    },
380    graphql => {
381        feature: "lang-graphql",
382        name: "graphql",
383        ts_lang: arborium_graphql::language(),
384        lang_key: "GRAPHQL",
385        names: ["graphql", "gql"],
386        extensions: ["graphql", "gql"],
387    },
388    groovy => {
389        feature: "lang-groovy",
390        name: "groovy",
391        ts_lang: arborium_groovy::language(),
392        lang_key: "GROOVY",
393        names: ["groovy", "gradle"],
394        extensions: ["groovy", "gradle", "gvy", "gy", "gsh"],
395    },
396    haskell => {
397        feature: "lang-haskell",
398        name: "haskell",
399        ts_lang: arborium_haskell::language(),
400        lang_key: "HASKELL",
401        names: ["haskell", "hs"],
402        extensions: ["hs", "lhs"],
403    },
404    hcl => {
405        feature: "lang-hcl",
406        name: "hcl",
407        ts_lang: arborium_hcl::language(),
408        lang_key: "HCL",
409        names: ["hcl", "terraform", "tf"],
410        extensions: ["hcl", "tf", "tfvars"],
411    },
412    hlsl => {
413        feature: "lang-hlsl",
414        name: "hlsl",
415        ts_lang: arborium_hlsl::language(),
416        lang_key: "HLSL",
417        names: ["hlsl"],
418        extensions: ["hlsl", "hlsli", "fx"],
419    },
420    html => {
421        feature: "lang-html",
422        name: "html",
423        ts_lang: arborium_html::language(),
424        lang_key: "HTML",
425        names: ["html", "htm"],
426        extensions: ["html", "htm"],
427    },
428    idris => {
429        feature: "lang-idris",
430        name: "idris",
431        ts_lang: arborium_idris::language(),
432        lang_key: "IDRIS",
433        names: ["idris"],
434        extensions: ["idr"],
435    },
436    ini => {
437        feature: "lang-ini",
438        name: "ini",
439        ts_lang: arborium_ini::language(),
440        lang_key: "INI",
441        names: ["ini"],
442        extensions: ["ini", "cfg", "conf"],
443    },
444    java => {
445        feature: "lang-java",
446        name: "java",
447        ts_lang: arborium_java::language(),
448        lang_key: "JAVA",
449        names: ["java"],
450        extensions: ["java"],
451    },
452    javascript => {
453        feature: "lang-javascript",
454        name: "javascript",
455        ts_lang: arborium_javascript::language(),
456        lang_key: "JAVASCRIPT",
457        names: ["javascript", "js", "jsx", "ecmascript", "es"],
458        extensions: ["js", "mjs", "cjs", "jsx"],
459    },
460    jinja2 => {
461        feature: "lang-jinja2",
462        name: "jinja2",
463        ts_lang: arborium_jinja2::language(),
464        lang_key: "JINJA2",
465        names: ["jinja2", "jinja"],
466        extensions: ["j2", "jinja", "jinja2"],
467    },
468    jq => {
469        feature: "lang-jq",
470        name: "jq",
471        ts_lang: arborium_jq::language(),
472        lang_key: "JQ",
473        names: ["jq"],
474        extensions: ["jq"],
475    },
476    json => {
477        feature: "lang-json",
478        name: "json",
479        ts_lang: arborium_json::language(),
480        lang_key: "JSON",
481        names: ["json"],
482        extensions: ["json"],
483    },
484    julia => {
485        feature: "lang-julia",
486        name: "julia",
487        ts_lang: arborium_julia::language(),
488        lang_key: "JULIA",
489        names: ["julia", "jl"],
490        extensions: ["jl"],
491    },
492    kotlin => {
493        feature: "lang-kotlin",
494        name: "kotlin",
495        ts_lang: arborium_kotlin::language(),
496        lang_key: "KOTLIN",
497        names: ["kotlin", "kt"],
498        extensions: ["kt", "kts"],
499    },
500    lean => {
501        feature: "lang-lean",
502        name: "lean",
503        ts_lang: arborium_lean::language(),
504        lang_key: "LEAN",
505        names: ["lean", "lean4"],
506        extensions: ["lean"],
507    },
508    lua => {
509        feature: "lang-lua",
510        name: "lua",
511        ts_lang: arborium_lua::language(),
512        lang_key: "LUA",
513        names: ["lua"],
514        extensions: ["lua"],
515    },
516    markdown => {
517        feature: "lang-markdown",
518        name: "markdown",
519        ts_lang: arborium_markdown::language(),
520        lang_key: "MARKDOWN",
521        names: ["markdown", "md"],
522        extensions: ["md", "markdown"],
523    },
524    matlab => {
525        feature: "lang-matlab",
526        name: "matlab",
527        ts_lang: arborium_matlab::language(),
528        lang_key: "MATLAB",
529        names: ["matlab", "octave"],
530        extensions: ["m"],
531    },
532    meson => {
533        feature: "lang-meson",
534        name: "meson",
535        ts_lang: arborium_meson::language(),
536        lang_key: "MESON",
537        names: ["meson"],
538        extensions: ["meson"],
539    },
540    nginx => {
541        feature: "lang-nginx",
542        name: "nginx",
543        ts_lang: arborium_nginx::language(),
544        lang_key: "NGINX",
545        names: ["nginx"],
546        extensions: ["nginx"],
547    },
548    ninja => {
549        feature: "lang-ninja",
550        name: "ninja",
551        ts_lang: arborium_ninja::language(),
552        lang_key: "NINJA",
553        names: ["ninja"],
554        extensions: ["ninja"],
555    },
556    nix => {
557        feature: "lang-nix",
558        name: "nix",
559        ts_lang: arborium_nix::language(),
560        lang_key: "NIX",
561        names: ["nix"],
562        extensions: ["nix"],
563    },
564    objc => {
565        feature: "lang-objc",
566        name: "objc",
567        ts_lang: arborium_objc::language(),
568        lang_key: "OBJC",
569        names: ["objc", "objective-c", "objectivec"],
570        extensions: ["m", "mm"],
571    },
572    ocaml => {
573        feature: "lang-ocaml",
574        name: "ocaml",
575        ts_lang: arborium_ocaml::language(),
576        lang_key: "OCAML",
577        names: ["ocaml", "ml"],
578        extensions: ["ml", "mli"],
579    },
580    perl => {
581        feature: "lang-perl",
582        name: "perl",
583        ts_lang: arborium_perl::language(),
584        lang_key: "PERL",
585        names: ["perl", "pl"],
586        extensions: ["pl", "pm"],
587    },
588    php => {
589        feature: "lang-php",
590        name: "php",
591        ts_lang: arborium_php::language(),
592        lang_key: "PHP",
593        names: ["php"],
594        extensions: ["php"],
595    },
596    postscript => {
597        feature: "lang-postscript",
598        name: "postscript",
599        ts_lang: arborium_postscript::language(),
600        lang_key: "POSTSCRIPT",
601        names: ["postscript", "ps"],
602        extensions: ["ps", "eps"],
603    },
604    powershell => {
605        feature: "lang-powershell",
606        name: "powershell",
607        ts_lang: arborium_powershell::language(),
608        lang_key: "POWERSHELL",
609        names: ["powershell", "pwsh", "ps1"],
610        extensions: ["ps1", "psm1", "psd1"],
611    },
612    prolog => {
613        feature: "lang-prolog",
614        name: "prolog",
615        ts_lang: arborium_prolog::language(),
616        lang_key: "PROLOG",
617        names: ["prolog"],
618        extensions: ["pl", "pro"],
619    },
620    python => {
621        feature: "lang-python",
622        name: "python",
623        ts_lang: arborium_python::language(),
624        lang_key: "PYTHON",
625        names: ["python", "py"],
626        extensions: ["py", "pyi", "pyw"],
627    },
628    query => {
629        feature: "lang-query",
630        name: "query",
631        ts_lang: arborium_query::language(),
632        lang_key: "QUERY",
633        names: ["query", "scm"],
634        extensions: ["scm"],
635    },
636    r => {
637        feature: "lang-r",
638        name: "r",
639        ts_lang: arborium_r::language(),
640        lang_key: "R",
641        names: ["r", "rlang"],
642        extensions: ["r", "R"],
643    },
644    rescript => {
645        feature: "lang-rescript",
646        name: "rescript",
647        ts_lang: arborium_rescript::language(),
648        lang_key: "RESCRIPT",
649        names: ["rescript", "res"],
650        extensions: ["res", "resi"],
651    },
652    ron => {
653        feature: "lang-ron",
654        name: "ron",
655        ts_lang: arborium_ron::language(),
656        lang_key: "RON",
657        names: ["ron"],
658        extensions: ["ron"],
659    },
660    ruby => {
661        feature: "lang-ruby",
662        name: "ruby",
663        ts_lang: arborium_ruby::language(),
664        lang_key: "RUBY",
665        names: ["ruby", "rb"],
666        extensions: ["rb", "rake", "gemspec"],
667    },
668    rust => {
669        feature: "lang-rust",
670        name: "rust",
671        ts_lang: arborium_rust::language(),
672        lang_key: "RUST",
673        names: ["rust", "rs"],
674        extensions: ["rs"],
675    },
676    scala => {
677        feature: "lang-scala",
678        name: "scala",
679        ts_lang: arborium_scala::language(),
680        lang_key: "SCALA",
681        names: ["scala"],
682        extensions: ["scala", "sc"],
683    },
684    scheme => {
685        feature: "lang-scheme",
686        name: "scheme",
687        ts_lang: arborium_scheme::language(),
688        lang_key: "SCHEME",
689        names: ["scheme", "racket"],
690        extensions: ["scm", "ss", "rkt"],
691    },
692    scss => {
693        feature: "lang-scss",
694        name: "scss",
695        ts_lang: arborium_scss::language(),
696        lang_key: "SCSS",
697        names: ["scss", "sass"],
698        extensions: ["scss", "sass"],
699    },
700    solidity => {
701        feature: "lang-solidity",
702        name: "solidity",
703        ts_lang: arborium_solidity::language(),
704        lang_key: "SOLIDITY",
705        names: ["solidity", "sol"],
706        extensions: ["sol"],
707    },
708    sparql => {
709        feature: "lang-sparql",
710        name: "sparql",
711        ts_lang: arborium_sparql::language(),
712        lang_key: "SPARQL",
713        names: ["sparql"],
714        extensions: ["sparql", "rq"],
715    },
716    sql => {
717        feature: "lang-sql",
718        name: "sql",
719        ts_lang: arborium_sql::language(),
720        lang_key: "SQL",
721        names: ["sql"],
722        extensions: ["sql"],
723    },
724    ssh_config => {
725        feature: "lang-ssh-config",
726        name: "ssh_config",
727        ts_lang: arborium_ssh_config::language(),
728        lang_key: "SSH_CONFIG",
729        names: ["ssh-config", "ssh_config", "sshconfig"],
730        extensions: ["ssh_config"],
731    },
732    starlark => {
733        feature: "lang-starlark",
734        name: "starlark",
735        ts_lang: arborium_starlark::language(),
736        lang_key: "STARLARK",
737        names: ["starlark", "bazel", "bzl"],
738        extensions: ["bzl", "bazel"],
739    },
740    svelte => {
741        feature: "lang-svelte",
742        name: "svelte",
743        ts_lang: arborium_svelte::language(),
744        lang_key: "SVELTE",
745        names: ["svelte"],
746        extensions: ["svelte"],
747    },
748    swift => {
749        feature: "lang-swift",
750        name: "swift",
751        ts_lang: arborium_swift::language(),
752        lang_key: "SWIFT",
753        names: ["swift"],
754        extensions: ["swift"],
755    },
756    textproto => {
757        feature: "lang-textproto",
758        name: "textproto",
759        ts_lang: arborium_textproto::language(),
760        lang_key: "TEXTPROTO",
761        names: ["textproto", "pbtxt"],
762        extensions: ["textproto", "pbtxt"],
763    },
764    thrift => {
765        feature: "lang-thrift",
766        name: "thrift",
767        ts_lang: arborium_thrift::language(),
768        lang_key: "THRIFT",
769        names: ["thrift"],
770        extensions: ["thrift"],
771    },
772    tlaplus => {
773        feature: "lang-tlaplus",
774        name: "tlaplus",
775        ts_lang: arborium_tlaplus::language(),
776        lang_key: "TLAPLUS",
777        names: ["tlaplus", "tla+", "tla"],
778        extensions: ["tla"],
779    },
780    toml => {
781        feature: "lang-toml",
782        name: "toml",
783        ts_lang: arborium_toml::language(),
784        lang_key: "TOML",
785        names: ["toml"],
786        extensions: ["toml"],
787    },
788    tsx => {
789        feature: "lang-tsx",
790        name: "tsx",
791        ts_lang: arborium_tsx::language(),
792        lang_key: "TSX",
793        names: ["tsx"],
794        extensions: ["tsx"],
795    },
796    typescript => {
797        feature: "lang-typescript",
798        name: "typescript",
799        ts_lang: arborium_typescript::language(),
800        lang_key: "TYPESCRIPT",
801        names: ["typescript", "ts"],
802        extensions: ["ts", "mts", "cts"],
803    },
804    typst => {
805        feature: "lang-typst",
806        name: "typst",
807        ts_lang: arborium_typst::language(),
808        lang_key: "TYPST",
809        names: ["typst"],
810        extensions: ["typ"],
811    },
812    uiua => {
813        feature: "lang-uiua",
814        name: "uiua",
815        ts_lang: arborium_uiua::language(),
816        lang_key: "UIUA",
817        names: ["uiua"],
818        extensions: ["ua"],
819    },
820    vb => {
821        feature: "lang-vb",
822        name: "vb",
823        ts_lang: arborium_vb::language(),
824        lang_key: "VB",
825        names: ["vb", "vbnet", "visualbasic"],
826        extensions: ["vb"],
827    },
828    verilog => {
829        feature: "lang-verilog",
830        name: "verilog",
831        ts_lang: arborium_verilog::language(),
832        lang_key: "VERILOG",
833        names: ["verilog", "v"],
834        extensions: ["v", "sv"],
835    },
836    vhdl => {
837        feature: "lang-vhdl",
838        name: "vhdl",
839        ts_lang: arborium_vhdl::language(),
840        lang_key: "VHDL",
841        names: ["vhdl"],
842        extensions: ["vhd", "vhdl"],
843    },
844    vim => {
845        feature: "lang-vim",
846        name: "vim",
847        ts_lang: arborium_vim::language(),
848        lang_key: "VIM",
849        names: ["vim", "vimscript"],
850        extensions: ["vim"],
851    },
852    vue => {
853        feature: "lang-vue",
854        name: "vue",
855        ts_lang: arborium_vue::language(),
856        lang_key: "VUE",
857        names: ["vue"],
858        extensions: ["vue"],
859    },
860    wit => {
861        feature: "lang-wit",
862        name: "wit",
863        ts_lang: arborium_wit::language(),
864        lang_key: "WIT",
865        names: ["wit"],
866        extensions: ["wit"],
867    },
868    x86asm => {
869        feature: "lang-x86asm",
870        name: "x86asm",
871        ts_lang: arborium_x86asm::language(),
872        lang_key: "X86ASM",
873        names: ["x86asm", "x86"],
874        extensions: ["asm"],
875    },
876    xml => {
877        feature: "lang-xml",
878        name: "xml",
879        ts_lang: arborium_xml::language(),
880        lang_key: "XML",
881        names: ["xml"],
882        extensions: ["xml", "xsl", "xslt", "xsd", "svg"],
883    },
884    yaml => {
885        feature: "lang-yaml",
886        name: "yaml",
887        ts_lang: arborium_yaml::language(),
888        lang_key: "YAML",
889        names: ["yaml", "yml"],
890        extensions: ["yaml", "yml"],
891    },
892    yuri => {
893        feature: "lang-yuri",
894        name: "yuri",
895        ts_lang: arborium_yuri::language(),
896        lang_key: "YURI",
897        names: ["yuri"],
898        extensions: ["yuri"],
899    },
900    zig => {
901        feature: "lang-zig",
902        name: "zig",
903        ts_lang: arborium_zig::language(),
904        lang_key: "ZIG",
905        names: ["zig"],
906        extensions: ["zig"],
907    },
908    zsh => {
909        feature: "lang-zsh",
910        name: "zsh",
911        ts_lang: arborium_zsh::language(),
912        lang_key: "ZSH",
913        names: ["zsh"],
914        extensions: ["zsh"],
915    },
916}