use std::sync::LazyLock;
use syntect::dumps;
pub use syntect::parsing::{SyntaxReference, SyntaxSet};
use crate::{resource::HighlightResource, theme::READ_DUMP_DATA_ERR};
pub fn load_syntax_set(set: Option<&[u8]>) -> SyntaxSet {
let msg = READ_DUMP_DATA_ERR;
match set {
Some(x) => dumps::from_uncompressed_data(x).expect(msg),
#[cfg(feature = "preset-syntax-set")]
_ => {
dumps::from_uncompressed_data(set.unwrap_or(hlight_assets::SUBLIME_SYNTAXES))
.expect(msg)
}
#[cfg(not(feature = "preset-syntax-set"))]
_ => SyntaxSet::default(),
}
}
impl HighlightResource<'_> {
pub fn static_syntax_set() -> &'static SyntaxSet {
static S: LazyLock<SyntaxSet> = LazyLock::new(|| load_syntax_set(None));
&S
}
}
pub fn find_syntax<'a>(
set: &'a SyntaxSet,
syntax_name: &str,
) -> &'a SyntaxReference {
set
.find_syntax_by_extension(syntax_name)
.unwrap_or_else(|| {
set
.find_syntax_by_name(syntax_name)
.unwrap_or_else(|| {
let to_json = || set.find_syntax_by_extension("json");
match syntax_name {
"sexp" | "lexpr" => set
.find_syntax_by_extension("lisp")
.or_else(to_json),
_ => to_json(),
}
.unwrap_or_else(|| set.find_syntax_plain_text())
})
})
}
pub fn find_syntax_name<'a>(set: &'a SyntaxSet, name: &str) -> &'a SyntaxReference {
set
.find_syntax_by_name(name)
.unwrap_or_else(|| {
set
.find_syntax_by_extension(name)
.unwrap_or(set.find_syntax_plain_text())
})
}
#[cfg(test)]
mod tests {
use std::borrow::Cow;
use crate::HighlightResource;
#[test]
#[ignore]
fn iter_static_set() {
let set = HighlightResource::static_syntax_set();
set
.syntaxes()
.iter()
.map(|x| (&x.name, &x.file_extensions))
.for_each(|(name, ext)| {
println!(
"name: {name}\n\
ext:{ext:?}\n---"
)
});
}
#[ignore]
#[test]
fn test_load_custom_syntax_set() {
use std::sync::OnceLock;
use crate::{
HighlightResource,
syntax::{SyntaxSet, load_syntax_set},
};
const SYNTAXES: &[u8] = include_bytes!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/../hlight-assets",
"/assets/set/syntax.packdump"
));
fn static_syntax_set() -> &'static SyntaxSet {
static S: OnceLock<SyntaxSet> = OnceLock::new();
S.get_or_init(|| load_syntax_set(Some(SYNTAXES)))
}
fn show_syntax_set(set: &SyntaxSet) {
for (name, ext) in set
.syntaxes()
.iter()
.map(|x| (&x.name, &x.file_extensions))
{
println!(
"name: {name}\n\
ext: {ext:?}\n---"
)
}
}
let res = HighlightResource::default()
.with_syntax_set(Cow::Borrowed(static_syntax_set()));
show_syntax_set(res.get_syntax_set())
}
}