Skip to main content

md_tui/highlight/
mod.rs

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}