1#[cfg(feature = "tree-sitter-bash")]
2mod bash;
3#[cfg(feature = "tree-sitter-c")]
4mod c;
5#[cfg(feature = "tree-sitter-cpp")]
6mod cpp;
7#[cfg(feature = "tree-sitter-css")]
8mod css;
9#[cfg(feature = "tree-sitter-diff")]
10mod diff;
11#[cfg(feature = "tree-sitter-elixir")]
12mod elixir;
13#[cfg(feature = "tree-sitter-go")]
14mod go;
15#[cfg(feature = "tree-sitter-html")]
16mod html;
17#[cfg(feature = "tree-sitter-java")]
18mod java;
19#[cfg(feature = "tree-sitter-javascript")]
20mod javascript;
21#[cfg(feature = "tree-sitter-json")]
22mod json;
23#[cfg(feature = "tree-sitter-lua")]
24mod lua;
25#[cfg(feature = "tree-sitter-ocaml")]
26mod ocaml;
27#[cfg(feature = "tree-sitter-php")]
28mod php;
29#[cfg(feature = "tree-sitter-python")]
30mod python;
31#[cfg(feature = "tree-sitter-rust")]
32mod rust;
33#[cfg(feature = "tree-sitter-scala")]
34mod scala;
35#[cfg(feature = "tree-sitter-typescript")]
36mod tsx;
37#[cfg(feature = "tree-sitter-typescript")]
38mod typescript;
39#[cfg(feature = "tree-sitter-yaml")]
40mod yaml;
41
42use tree_sitter_highlight::HighlightEvent;
43
44use ratatui::style::Color;
45
46#[allow(dead_code)]
47static HIGHLIGHT_NAMES: [&str; 18] = [
48 "attribute",
49 "constant",
50 "function.builtin",
51 "function",
52 "keyword",
53 "operator",
54 "property",
55 "punctuation",
56 "punctuation.bracket",
57 "punctuation.delimiter",
58 "string",
59 "string.special",
60 "tag",
61 "type",
62 "type.builtin",
63 "variable",
64 "variable.builtin",
65 "variable.parameter",
66];
67
68pub static COLOR_MAP: [Color; 18] = [
69 Color::Yellow,
70 Color::Yellow,
71 Color::Green,
72 Color::Green,
73 Color::Red,
74 Color::Red,
75 Color::Blue,
76 Color::Blue,
77 Color::Blue,
78 Color::Blue,
79 Color::Magenta,
80 Color::Magenta,
81 Color::Cyan,
82 Color::Cyan,
83 Color::Cyan,
84 Color::Reset,
85 Color::Reset,
86 Color::Reset,
87];
88
89pub enum HighlightInfo {
90 Highlighted(Vec<HighlightEvent>),
91 Unhighlighted,
92}
93
94#[allow(unused_variables)]
95#[must_use]
96pub fn highlight_code(language: &str, lines: &[u8]) -> HighlightInfo {
97 match language {
98 #[cfg(feature = "tree-sitter-bash")]
99 "bash" | "sh" => HighlightInfo::Highlighted(bash::highlight_bash(lines).unwrap()),
100
101 #[cfg(feature = "tree-sitter-c")]
102 "c" => HighlightInfo::Highlighted(c::highlight_c(lines).unwrap()),
103
104 #[cfg(feature = "tree-sitter-cpp")]
105 "cpp" => HighlightInfo::Highlighted(cpp::highlight_cpp(lines).unwrap()),
106
107 #[cfg(feature = "tree-sitter-css")]
108 "css" => HighlightInfo::Highlighted(css::highlight_css(lines).unwrap()),
109
110 #[cfg(feature = "tree-sitter-elixir")]
111 "elixir" => HighlightInfo::Highlighted(elixir::highlight_elixir(lines).unwrap()),
112
113 #[cfg(feature = "tree-sitter-go")]
114 "go" => HighlightInfo::Highlighted(go::highlight_go(lines).unwrap()),
115
116 #[cfg(feature = "tree-sitter-html")]
117 "html" => HighlightInfo::Highlighted(html::highlight_html(lines).unwrap()),
118
119 #[cfg(feature = "tree-sitter-java")]
120 "java" => HighlightInfo::Highlighted(java::highlight_java(lines).unwrap()),
121
122 #[cfg(feature = "tree-sitter-javascript")]
123 "javascript" | "js" => {
124 HighlightInfo::Highlighted(javascript::highlight_javascript(lines).unwrap())
125 }
126
127 #[cfg(feature = "tree-sitter-json")]
128 "json" => HighlightInfo::Highlighted(json::highlight_json(lines).unwrap()),
129
130 #[cfg(feature = "tree-sitter-lua")]
131 "lua" => HighlightInfo::Highlighted(lua::highlight_lua(lines).unwrap()),
132
133 #[cfg(feature = "tree-sitter-ocaml")]
134 "ocaml" => HighlightInfo::Highlighted(ocaml::highlight_ocaml(lines).unwrap()),
135
136 #[cfg(feature = "tree-sitter-php")]
137 "php" => HighlightInfo::Highlighted(php::highlight_php(lines).unwrap()),
138
139 #[cfg(feature = "tree-sitter-python")]
140 "python" => HighlightInfo::Highlighted(python::highlight_python(lines).unwrap()),
141
142 #[cfg(feature = "tree-sitter-rust")]
143 "rust" => HighlightInfo::Highlighted(rust::highlight_rust(lines).unwrap()),
144
145 #[cfg(feature = "tree-sitter-scala")]
146 "scala" => HighlightInfo::Highlighted(scala::highlight_scala(lines).unwrap()),
147
148 #[cfg(feature = "tree-sitter-typescript")]
149 "tsx" => HighlightInfo::Highlighted(tsx::highlight_tsx(lines).unwrap()),
150
151 #[cfg(feature = "tree-sitter-typescript")]
152 "typescript" | "ts" => {
153 HighlightInfo::Highlighted(typescript::highlight_typescript(lines).unwrap())
154 }
155
156 #[cfg(feature = "tree-sitter-yaml")]
157 "yaml" | "yml" => HighlightInfo::Highlighted(yaml::highlight_yaml(lines).unwrap()),
158
159 #[cfg(feature = "tree-sitter-diff")]
160 "diff" | "patch" => HighlightInfo::Highlighted(diff::highlight_diff(lines).unwrap()),
161
162 _ => HighlightInfo::Unhighlighted,
163 }
164}
165
166#[cfg(test)]
167#[test]
168fn test_equal_length() {
169 assert_eq!(HIGHLIGHT_NAMES.len(), COLOR_MAP.len());
170}