tree-sitter/highlight
2019-10-29 13:49:07 -07:00
..
include/tree_sitter Add missing error codes to C highlight API 2019-10-23 10:57:11 -07:00
src highlight: Skip injection codepath if there are no ranges found 2019-10-29 13:49:07 -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).