Commit
Author: Kevin Schoon [me@kevinschoon.com]
Hash: cb6b5b03d6eedbcf0d52107a3a46b2970c39fbda
Timestamp: Mon, 27 May 2024 11:22:37 +0000 (11 months ago)

+144 -112 +/-7 browse
add support for custom tree-sitter highlight queries
add support for custom tree-sitter highlight queries

Adds support for overriding system level highlight queries with custom scm
strings. Additionally bakes the tree-sitter-diff package in the container since
it is fundemental to Ayllu operation but not available in Alpine packages.
1diff --git a/ayllu/src/config.rs b/ayllu/src/config.rs
2index 774288e..a4d6b61 100644
3--- a/ayllu/src/config.rs
4+++ b/ayllu/src/config.rs
5 @@ -134,6 +134,7 @@ pub struct TreeSitter {
6 pub parsers: Option<Vec<TreeSitterParser>>,
7 #[serde(default = "TreeSitter::default_keywords")]
8 pub keywords: Vec<String>,
9+ pub highlights: Option<HashMap<String, String>>
10 }
11
12 impl TreeSitter {
13 diff --git a/ayllu/src/highlight.rs b/ayllu/src/highlight.rs
14index d53c791..50b5537 100644
15--- a/ayllu/src/highlight.rs
16+++ b/ayllu/src/highlight.rs
17 @@ -50,6 +50,8 @@ pub struct Loader {
18 dynamic_ok: bool,
19 extra_queries_path: Option<String>,
20 extra_parsers: Vec<TreeSitterParser>,
21+ // user configured highlight overrides
22+ highlight_overrides: HashMap<String, String>,
23 }
24
25 impl Loader {
26 @@ -60,6 +62,7 @@ impl Loader {
27 dynamic_ok: false,
28 extra_queries_path: None,
29 extra_parsers: Vec::new(),
30+ highlight_overrides: HashMap::new(),
31 }
32 }
33
34 @@ -73,8 +76,15 @@ impl Loader {
35 self
36 }
37
38+ pub fn overrides(mut self, overrides: HashMap<String, String>) -> Self {
39+ for (key, value) in overrides.iter() {
40+ self.highlight_overrides.insert(key.clone(), value.clone());
41+ }
42+ self
43+ }
44+
45 pub fn parsers(mut self, parsers: Vec<TreeSitterParser>) -> Self {
46- self.extra_parsers = parsers.clone();
47+ self.extra_parsers.clone_from(&parsers);
48 self
49 }
50
51 @@ -110,6 +120,13 @@ impl Loader {
52 }
53 }
54 }
55+ };
56+ if let Some(overrides) = self.highlight_overrides.get(&hint.0) {
57+ HIGHLIGHTS
58+ .write()
59+ .unwrap()
60+ .insert(hint.clone(), overrides.clone());
61+ debug!("user supplied their own highlights.scm for {:?}", hint);
62 }
63 Ok(())
64 }
65 diff --git a/ayllu/src/web2/server.rs b/ayllu/src/web2/server.rs
66index 431ebba..3ca2e13 100644
67--- a/ayllu/src/web2/server.rs
68+++ b/ayllu/src/web2/server.rs
69 @@ -53,6 +53,9 @@ pub async fn serve(cfg: &Config) -> Result<(), Box<dyn Error>> {
70 Some(ts_config) => {
71 let mut loader = Loader::new(&ts_config.base_path, &ts_config.queries_path);
72 loader = loader.dynamic(true);
73+ if let Some(overrides) = &ts_config.highlights {
74+ loader = loader.overrides(overrides.clone());
75+ }
76 match &ts_config.queries_extras_path {
77 Some(extras_path) => {
78 loader = loader.extra_queries(extras_path.as_str());
79 diff --git a/ayllu/themes/default/highlight.css b/ayllu/themes/default/highlight.css
80new file mode 100644
81index 0000000..20613df
82--- /dev/null
83+++ b/ayllu/themes/default/highlight.css
84 @@ -0,0 +1,105 @@
85+ @import url("../../colors/nord.css");
86+
87+ @media (prefers-color-scheme: dark) {
88+ table.code {
89+ background-color: var(--nord0);
90+ }
91+
92+ tr .line {
93+ background-color: var(--nord1);
94+ }
95+
96+ tr .line-number {
97+ background-color: var(--nord0);
98+ }
99+ }
100+
101+ /* base syntax highlighting */
102+
103+ span.ts_attribute {
104+ color: var(--nord14);
105+ }
106+
107+ span.ts_comment {
108+ color: var(--nord3);
109+ }
110+
111+ span.ts_constant {
112+ color: var(--nord13);
113+ }
114+
115+ span.ts_function_builtin {
116+ color: var(--nord9);
117+ }
118+
119+ span.ts_function {
120+ color: var(--nord8);
121+ }
122+
123+ span.ts_keyword {
124+ color: var(--nord12);
125+ }
126+
127+ span.ts_operator {
128+ color: var(--nord9);
129+ }
130+
131+ span.ts_property {
132+ color: var(--nord11);
133+ }
134+
135+ span.ts_punctuation {
136+ color: var(--nord5);
137+ }
138+
139+ span.ts_punctuation_bracket {
140+ color: var(--nord9);
141+ }
142+
143+ span.ts_punctuation_delimiter {
144+ color: var(--nord10);
145+ }
146+
147+ span.ts_punctuation_delimiter {
148+ color: var(--nord10);
149+ }
150+
151+ span.ts_string {
152+ color: var(--nord-14);
153+ }
154+
155+ span.ts_string_special {
156+ color: var(--nord12);
157+ }
158+
159+ span.ts_tag {
160+ color: var(--nord7);
161+ }
162+
163+ span.ts_type {
164+ color: var(--nord7);
165+ }
166+
167+ span.ts_type_builtin {
168+ color: var(--nord13);
169+ }
170+
171+ span.ts_variable {
172+ color: var(--nord4);
173+ }
174+
175+ span.ts_variable_builtin {
176+ color: var(--nord8);
177+ }
178+
179+ span.ts_variable_parameter {
180+ color: var(--nord8);
181+ }
182+
183+ span.ts_removal {
184+ color: var(--nord11);
185+ }
186+
187+ span.ts_addition {
188+ color: var(--nord14);
189+ }
190 diff --git a/ayllu/themes/default/theme.css b/ayllu/themes/default/theme.css
191index b567afd..b2b7f2a 100644
192--- a/ayllu/themes/default/theme.css
193+++ b/ayllu/themes/default/theme.css
194 @@ -3,8 +3,7 @@
195 @import url("../../../node_modules/open-props/buttons.min.css");
196
197 @import url("./readme.css");
198-
199- @import url("../../colors/nord.css");
200+ @import url("./highlight.css");
201
202 :root {
203 font-size: 80%;
204 @@ -433,110 +432,3 @@ img.rss-icon-feed {
205 height: 4em;
206 }
207
208- table.code {
209- background-color: white;
210- }
211-
212- tr .line {
213- background-color: white;
214- }
215-
216- tr .line-number {
217- background-color: white;
218- }
219-
220- @media (prefers-color-scheme: dark) {
221- table.code {
222- background-color: var(--nord0);
223- }
224-
225- tr .line {
226- background-color: var(--nord0);
227- }
228-
229- tr .line-number {
230- background-color: var(--nord0);
231- }
232- }
233-
234- /* base syntax highlighting */
235-
236- span.ts_attribute {
237- color: var(--nord14);
238- }
239-
240- span.ts_comment {
241- color: var(--nord3);
242- }
243-
244- span.ts_constant {
245- color: var(--nord4);
246- }
247-
248- span.ts_function_builtin {
249- color: var(--nord9);
250- }
251-
252- span.ts_function {
253- color: var(--nord8);
254- }
255-
256- span.ts_keyword {
257- color: var(--nord12);
258- }
259-
260- span.ts_operator {
261- color: var(--nord9);
262- }
263-
264- span.ts_property {
265- color: var(--nord11);
266- }
267-
268- span.ts_punctuation {
269- color: var(--nord5);
270- }
271-
272- span.ts_punctuation_bracket {
273- color: var(--nord9);
274- }
275-
276- span.ts_punctuation_delimiter {
277- color: var(--nord10);
278- }
279-
280- span.ts_punctuation_delimiter {
281- color: var(--nord10);
282- }
283-
284- span.ts_string {
285- color: var(--nord-14);
286- }
287-
288- span.ts_string_special {
289- color: var(--nord12);
290- }
291-
292- span.ts_tag {
293- color: var(--nord7);
294- }
295-
296- span.ts_type {
297- color: var(--nord7);
298- }
299-
300- span.ts_type_builtin {
301- color: var(--nord13);
302- }
303-
304- span.ts_variable {
305- color: var(--nord4);
306- }
307-
308- span.ts_variable_builtin {
309- color: var(--nord8);
310- }
311-
312- span.ts_variable_parameter {
313- color: var(--nord8);
314- }
315 diff --git a/containers/base/Containerfile b/containers/base/Containerfile
316index fe1b82a..82360a5 100644
317--- a/containers/base/Containerfile
318+++ b/containers/base/Containerfile
319 @@ -1,8 +1,18 @@
320 FROM alpine:3.19.1 AS build
321
322+
323 RUN apk add \
324 cargo rust pkgconf sqlite sassc npm \
325- openssl openssl-dev fontconfig fontconfig-dev
326+ openssl openssl-dev fontconfig fontconfig-dev \
327+ tree-sitter-dev build-base
328+
329+ # TODO: tree-sitter-diff needs APK support but they haven't cut a release yet
330+ WORKDIR /src
331+
332+ RUN \
333+ git clone https://github.com/the-mikedavis/tree-sitter-diff.git \
334+ && cd tree-sitter-diff && abuild-tree-sitter build && abuild-tree-sitter install
335+
336 RUN adduser -D -s /bin/sh -h /home/builder builder
337
338 USER builder
339 @@ -42,6 +52,10 @@ COPY --from=build --chown=0:0 /home/builder/src/target/release/quipu /usr/bin/
340 COPY --from=build --chown=0:0 /home/builder/src/ayllu/themes /usr/lib/ayllu/themes
341 COPY --from=build --chown=0:0 /home/builder/src/ayllu/migrations /usr/lib/ayllu/migrations/ayllu
342
343+ COPY --from=build --chown=0:0 /usr/lib/tree-sitter /usr/lib/
344+ COPY --from=build --chown=0:0 /usr/lib/libtree-sitter* /usr/lib/
345+ COPY --from=build --chown=0:0 /usr/share/tree-sitter /usr/lib/
346+
347 # this container supports running Ayllu as root and non-root depending on the
348 # desired runtime security and required UID/GID mapping.
349 RUN adduser -D -s /bin/sh -h /home/ayllu ayllu
350 diff --git a/containers/multiuser/Containerfile b/containers/multiuser/Containerfile
351index 2ad0efa..1513bea 100644
352--- a/containers/multiuser/Containerfile
353+++ b/containers/multiuser/Containerfile
354 @@ -3,7 +3,7 @@ FROM $BASE_IMAGE
355
356 USER root
357
358- RUN apk add --no-cache acl gawk dropbear runit
359+ RUN apk add --no-cache acl gawk htop dropbear runit tmux
360
361 COPY containers/multiuser/motd.txt /etc/motd
362 COPY containers/multiuser/service /etc/service