diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.rs | 1 | ||||
| -rw-r--r-- | src/templates.rs | 31 | 
2 files changed, 29 insertions, 3 deletions
| diff --git a/src/main.rs b/src/main.rs index f4e26d9..d85a1d3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -115,6 +115,7 @@ async fn view_tree_path(state: &Arc<Mutex<State>>, repo_rel_path: &str, tree_rel          Ok(template.into())      } else if let Some(selected_blob) = selected_object.as_blob() {          let template = templates::RepoFile { +            repo_path: repo_rel_path,              title: repo_rel_path,              rel_path: &tree_rel_path,              blob: selected_blob.clone(), 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<String> { +    use askama::Result; + +    pub fn from_utf8_lossy(utf8: &[u8]) -> Result<String> {          Ok(String::from_utf8_lossy(utf8).into_owned())      } -    pub fn markdown(s: &str) -> ::askama::Result<String> { +    pub fn markdown(s: &str) -> Result<String> {          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<String> { +        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)      }  } |