diff --git a/Cargo.lock b/Cargo.lock
index f0b1daa..d7caff6 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2566,8 +2566,10 @@ dependencies = [
"tree-sitter-cmake",
"tree-sitter-containerfile",
"tree-sitter-cpp",
+ "tree-sitter-css",
"tree-sitter-cuda",
"tree-sitter-go",
+ "tree-sitter-html",
"tree-sitter-javascript",
"tree-sitter-json",
"tree-sitter-lua",
@@ -3794,6 +3796,16 @@ dependencies = [
"tree-sitter-language",
]
+[[package]]
+name = "tree-sitter-css"
+version = "0.25.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5cbc5e18f29a2c6d6435891f42569525cf95435a3e01c2f1947abcde178686f"
+dependencies = [
+ "cc",
+ "tree-sitter-language",
+]
+
[[package]]
name = "tree-sitter-cuda"
version = "0.21.1"
@@ -3814,6 +3826,16 @@ dependencies = [
"tree-sitter-language",
]
+[[package]]
+name = "tree-sitter-html"
+version = "0.23.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "261b708e5d92061ede329babaaa427b819329a9d427a1d710abb0f67bbef63ee"
+dependencies = [
+ "cc",
+ "tree-sitter-language",
+]
+
[[package]]
name = "tree-sitter-javascript"
version = "0.25.0"
diff --git a/Cargo.toml b/Cargo.toml
index e49da58..589ccaf 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -233,6 +233,14 @@ tree-sitter-md = "0.5"
# uses the in-repo overlay `builtin/queries/latex/highlights.scm` (the first
# such overlay; `include_str!`'d in `crate::syntax::BUILTIN_LANGUAGES`).
codebook-tree-sitter-latex = "0.6"
+# Web grammars: HTML + CSS (`.html`/`.htm`/`.xhtml`, `.css`). The official
+# tree-sitter-org grammars; both export `LANGUAGE` + query constants over
+# `tree-sitter-language 0.1` (shared ABI crate, `tree-sitter` dev-only), so no
+# overlay is needed. HTML's `INJECTIONS_QUERY` lights up ` — `let` (JS keyword) at col 8.
+ let src = b"\n\n";
+ let mut buf = Buffer::new(BufferId::next(), "page.html");
+ buf.apply_edit(EditOp::Insert { pos: 0, bytes: src })
+ .unwrap();
+ let view = ParseView::new(&buf, language, "html".to_owned());
+ let handle = view.handle();
+ let _vid = buf.attach_view(Box::new(view));
+ let mut req = handle.make_request();
+ req.injection_aliases = reg.injection_alias_snapshot();
+ let bundle = crate::syntax::run_parse(req).expect("html parse");
+ handle.install(reg.resolve_layer_queries(&bundle));
+
+ let mut hv = SyntaxHighlightView::new(handle, reg.theme());
+ let (rows, cols) = (2usize, 60usize);
+ let mut backing: Vec| = vec![Cell::default(); rows * cols];
+ let mut grid = CellGrid {
+ cells: &mut backing,
+ stride: cols as u32,
+ size: CellSize::new(rows as u32, cols as u32),
+ };
+ let viewport = Viewport {
+ buffer_start: 0,
+ buffer_end: u64::MAX,
+ cell_origin: CellCoord::new(0, 0),
+ cell_size: CellSize::new(rows as u32, cols as u32),
+ gutter_w: 0,
+ };
+ let registry = buf;
+ hv.render(®istry, viewport, &mut grid);
+
+ // Inside |