tree-sitter/highlight
Max Brunsfeld 1bc6204870 Handle local.definition-value captures in queries
This lets you indicate, when matching a variable definition, that
another later syntax node represents the value of the variable definition,
and so any references to the same variable name within that value node
must be referring to some earlier definition.
2019-10-18 15:56:47 -07:00
..
include/tree_sitter Start reimplementing highlight crate with tree queries 2019-10-14 12:30:22 -07:00
src Handle local.definition-value captures in queries 2019-10-18 15:56:47 -07:00
Cargo.toml Add repo URL to Cargo.toml files 2019-08-19 17:31:35 -07:00
README.md Update tree-sitter-highlight readme 2019-10-14 21:39:56 -07:00

Tree-sitter Highlight

Build Status Build status Crates.io

Usage

Compile some languages into your app, and declare them:

extern "C" tree_sitter_html();
extern "C" tree_sitter_javascript();

Create a highlighter. You only need one of these:

use tree_sitter_highlight::Highlighter;

let highlighter = Highlighter::new(
    [
        "attribute",
        "constant",
        "function.builtin",
        "function",
        "keyword",
        "operator",
        "property",
        "punctuation",
        "punctuation.bracket",
        "punctuation.delimiter",
        "string",
        "string.special",
        "tag",
        "type",
        "type.builtin",
        "variable",
        "variable.builtin",
        "variable.parameter",
    ]
    .iter()
    .cloned()
    .map(String::from)
    .collect()
);

Create a highlight context. You need one of these for each thread that you're using for syntax highlighting:

use tree_sitter_highlight::HighlightContext;

let context = HighlightContext::new();

Load some highlighting queries from the queries directory of some language repositories:

let html_language = unsafe { tree_sitter_html() };
let javascript_language = unsafe { tree_sitter_javascript() };

let html_config = highlighter.load_configuration(
    html_language,
    &fs::read_to_string("./tree-sitter-html/queries/highlights.scm").unwrap(),
    &fs::read_to_string("./tree-sitter-html/queries/injections.scm").unwrap(),
    "",
);

let javascript_config = highlighter.load_configuration(
    javascript_language,
    &fs::read_to_string("./tree-sitter-javascript/queries/highlights.scm").unwrap(),
    &fs::read_to_string("./tree-sitter-javascript/queries/injections.scm").unwrap(),
    &fs::read_to_string("./tree-sitter-javascript/queries/locals.scm").unwrap(),
);

Highlight some code:

use tree_sitter_highlight::HighlightEvent;

let highlights = highlighter.highlight(
    &mut context,
    javascript_config,
    b"const x = new Y();",
    None,
    &|_| None
).unwrap();

for event in highlights {
    match event? {
        HighlightEvent::Source(s) {
            eprintln!("source: {:?}", s);
        },
        HighlightEvent::HighlightStart(s) {
            eprintln!("highlight style started: {:?}", s);
        },
        HighlightEvent::HighlightEnd(s) {
            eprintln!("highlight style 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).