When there are embedded documents, multiple scopes can start or end at the same position. Previously, there was no guarantee that the ScopeEnd events would always occur in the reverse order of the ScopeStart events. The easiest way to avoid exposing inconsistency is to not surface the scopes being ended. |
||
|---|---|---|
| .. | ||
| src | ||
| Cargo.toml | ||
| README.md | ||
Tree-sitter Highlighting
Usage
Compile some languages into your app, and declare them:
extern "C" tree_sitter_html();
extern "C" tree_sitter_javascript();
Load some property sheets:
use tree_sitter_highlight::load_property_sheet;
let javascript_property_sheet = load_property_sheet(
fs::read_to_string("./tree-sitter-javascript/src/highlights.json").unwrap()
).unwrap();
let html_property_sheet = load_property_sheet(
fs::read_to_string("./tree-sitter-html/src/highlights.json").unwrap()
).unwrap();
Highlight some code:
use tree_sitter_highlight::{highlight, HighlightEvent};
let highlights = highlight(
b"const x = new Y();",
unsafe { tree_sitter_javascript() },
&javascript_property_sheet,
&|_| None
).unwrap();
for event in highlights {
match event {
HighlightEvent::Source(s) {
eprintln!("source: {:?}", s);
},
HighlightEvent::ScopeStart(s) {
eprintln!("scope started: {:?}", s);
},
HighlightEvent::ScopeEnd(s) {
eprintln!("scope ended: {:?}", s);
},
}
}
The last parameter to highlight is a language injection callback. This allows other languages to be retrieved when Tree-sitter detects an embedded document (for example, a piece of JavaScript code inside of a script tag within HTML).