From 2988da14bed5f628cf4cd90eca0eec3c11f0c061 Mon Sep 17 00:00:00 2001 From: Melody Horn Date: Thu, 22 Apr 2021 14:04:13 -0600 Subject: add syntax highlighting to files --- src/templates.rs | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) (limited to 'src/templates.rs') diff --git a/src/templates.rs b/src/templates.rs index f15046a..84a0007 100644 --- a/src/templates.rs +++ b/src/templates.rs @@ -21,17 +21,20 @@ pub struct RepoFolder<'a> { #[derive(Template)] #[template(path = "repo_file.html")] pub struct RepoFile<'a> { + pub repo_path: &'a str, pub title: &'a str, pub rel_path: &'a str, pub blob: git2::Blob<'a>, } mod filters { - pub fn from_utf8_lossy(utf8: &[u8]) -> ::askama::Result { + use askama::Result; + + pub fn from_utf8_lossy(utf8: &[u8]) -> Result { Ok(String::from_utf8_lossy(utf8).into_owned()) } - pub fn markdown(s: &str) -> ::askama::Result { + pub fn markdown(s: &str) -> Result { use pulldown_cmark::{Parser, Options, html}; let mut options = Options::empty(); @@ -42,7 +45,29 @@ mod filters { let mut result = String::new(); html::push_html(&mut result, parser); - // TODO mark as safe automatically + Ok(result) + } + + pub fn highlight(s: &str, file_rel_path: &str) -> Result { + use std::path::Path; + use syntect::{parsing::SyntaxSet, highlighting::ThemeSet, html::highlighted_html_for_string}; + + let syntax_set = SyntaxSet::load_defaults_newlines(); + let extension = Path::new(file_rel_path).extension(); + let themes = ThemeSet::load_defaults(); + // TODO something idk + let theme = &themes.themes["base16-ocean.dark"]; + let syntax = extension + .and_then(|extension| extension.to_str()) + .and_then(|extension| syntax_set.find_syntax_by_extension(extension)) + .unwrap_or_else(|| syntax_set.find_syntax_plain_text()); + let result = highlighted_html_for_string( + s, + &syntax_set, + syntax, + theme, + ); + Ok(result) } } -- cgit v1.2.3