use askama::Template; use crate::state::State; #[derive(Template)] #[template(path = "index.html")] pub struct Index<'a> { pub state: &'a State, } #[derive(Template)] #[template(path = "repo_folder.html")] pub struct RepoFolder<'a> { pub repo: &'a git2::Repository, pub repo_path: &'a str, pub title: &'a str, pub rel_path: &'a str, pub tree: git2::Tree<'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 { use askama::Result; pub fn from_utf8_lossy(utf8: &[u8]) -> Result { Ok(String::from_utf8_lossy(utf8).into_owned()) } pub fn markdown(s: &str) -> Result { use pulldown_cmark::{Parser, Options, html}; let mut options = Options::empty(); options.insert(Options::ENABLE_STRIKETHROUGH); options.insert(Options::ENABLE_SMART_PUNCTUATION); let parser = Parser::new_ext(s, options); let mut result = String::new(); html::push_html(&mut result, parser); 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) } }