diff options
author | Melody Horn <melody@boringcactus.com> | 2021-04-22 14:04:13 -0600 |
---|---|---|
committer | Melody Horn <melody@boringcactus.com> | 2021-04-22 14:04:13 -0600 |
commit | 2988da14bed5f628cf4cd90eca0eec3c11f0c061 (patch) | |
tree | 1f8b9f6e18b659f778715829c8259e8c2868cda7 /src | |
parent | 5c13375f554103c5a9cc78f902020744d35c24f2 (diff) | |
download | gityeet-2988da14bed5f628cf4cd90eca0eec3c11f0c061.tar.gz gityeet-2988da14bed5f628cf4cd90eca0eec3c11f0c061.zip |
add syntax highlighting to files
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) } } |