aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs1
-rw-r--r--src/templates.rs31
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)
}
}