zola/components/config/src/highlighting.rs

56 lines
1.9 KiB
Rust
Raw Normal View History

2019-12-21 21:52:39 +00:00
use lazy_static::lazy_static;
2018-10-09 12:33:43 +00:00
use syntect::dumps::from_binary;
use syntect::easy::HighlightLines;
2018-10-31 07:18:57 +00:00
use syntect::highlighting::ThemeSet;
use syntect::parsing::SyntaxSet;
2018-10-09 12:33:43 +00:00
2019-12-21 21:52:39 +00:00
use crate::config::Config;
2018-10-09 12:33:43 +00:00
lazy_static! {
pub static ref SYNTAX_SET: SyntaxSet = {
2018-10-31 07:18:57 +00:00
let ss: SyntaxSet =
2020-04-29 20:35:28 +00:00
from_binary(include_bytes!("../../../sublime/syntaxes/newlines.packdump"));
2018-10-09 12:33:43 +00:00
ss
};
2018-10-31 07:18:57 +00:00
pub static ref THEME_SET: ThemeSet =
2020-04-29 20:35:28 +00:00
from_binary(include_bytes!("../../../sublime/themes/all.themedump"));
2018-10-09 12:33:43 +00:00
}
pub enum HighlightSource {
Theme,
Extra,
Plain,
NotFound,
}
2018-10-09 12:33:43 +00:00
/// Returns the highlighter and whether it was found in the extra or not
2021-02-02 19:49:57 +00:00
pub fn get_highlighter(
language: Option<&str>,
config: &Config,
) -> (HighlightLines<'static>, HighlightSource) {
2021-01-07 10:34:23 +00:00
let theme = &THEME_SET.themes[config.highlight_theme()];
2018-10-09 12:33:43 +00:00
if let Some(ref lang) = language {
if let Some(ref extra_syntaxes) = config.markdown.extra_syntax_set {
if let Some(syntax) = extra_syntaxes.find_syntax_by_token(lang) {
return (HighlightLines::new(syntax, theme), HighlightSource::Extra);
}
}
// The JS syntax hangs a lot... the TS syntax is probably better anyway.
// https://github.com/getzola/zola/issues/1241
// https://github.com/getzola/zola/issues/1211
// https://github.com/getzola/zola/issues/1174
let hacked_lang = if *lang == "js" || *lang == "javascript" { "ts" } else { lang };
if let Some(syntax) = SYNTAX_SET.find_syntax_by_token(hacked_lang) {
(HighlightLines::new(syntax, theme), HighlightSource::Theme)
} else {
2021-02-02 19:49:57 +00:00
(
HighlightLines::new(SYNTAX_SET.find_syntax_plain_text(), theme),
HighlightSource::NotFound,
)
2021-01-02 08:29:28 +00:00
}
2018-10-09 12:33:43 +00:00
} else {
(HighlightLines::new(SYNTAX_SET.find_syntax_plain_text(), theme), HighlightSource::Plain)
2018-10-09 12:33:43 +00:00
}
}