better header/footer template, add syntax highlighting

This commit is contained in:
Trevor Bentley
2023-01-11 02:39:24 +01:00
parent 4e436a268d
commit d5428f97b7
15 changed files with 438 additions and 51 deletions
Generated
+246 -1
View File
@@ -2,6 +2,12 @@
# It is not intended for manual editing.
version = 3
[[package]]
name = "adler"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "aho-corasick"
version = "0.7.20"
@@ -26,6 +32,36 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "base64"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
[[package]]
name = "bincode"
version = "1.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
dependencies = [
"serde",
]
[[package]]
name = "bit-set"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
dependencies = [
"bit-vec",
]
[[package]]
name = "bit-vec"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
[[package]]
name = "bitflags"
version = "1.3.2"
@@ -82,7 +118,7 @@ dependencies = [
"js-sys",
"num-integer",
"num-traits",
"time",
"time 0.1.45",
"wasm-bindgen",
"winapi",
]
@@ -171,6 +207,15 @@ dependencies = [
"libc",
]
[[package]]
name = "crc32fast"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d"
dependencies = [
"cfg-if",
]
[[package]]
name = "crypto-common"
version = "0.1.6"
@@ -262,6 +307,26 @@ dependencies = [
"libc",
]
[[package]]
name = "fancy-regex"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d6b8560a05112eb52f04b00e5d3790c0dd75d9d980eb8a122fb23b92a623ccf"
dependencies = [
"bit-set",
"regex",
]
[[package]]
name = "flate2"
version = "1.0.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841"
dependencies = [
"crc32fast",
"miniz_oxide",
]
[[package]]
name = "fnv"
version = "1.0.7"
@@ -287,6 +352,15 @@ dependencies = [
"version_check",
]
[[package]]
name = "getopts"
version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5"
dependencies = [
"unicode-width",
]
[[package]]
name = "getrandom"
version = "0.2.8"
@@ -337,6 +411,12 @@ dependencies = [
"walkdir",
]
[[package]]
name = "hashbrown"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]]
name = "heck"
version = "0.4.0"
@@ -409,6 +489,16 @@ dependencies = [
"winapi-util",
]
[[package]]
name = "indexmap"
version = "1.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
dependencies = [
"autocfg",
"hashbrown",
]
[[package]]
name = "io-lifetimes"
version = "1.0.3"
@@ -444,7 +534,9 @@ dependencies = [
"chrono",
"clap",
"git2",
"pulldown-cmark",
"serde",
"syntect",
"tera",
"toml",
]
@@ -519,6 +611,15 @@ dependencies = [
"vcpkg",
]
[[package]]
name = "line-wrap"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9"
dependencies = [
"safemem",
]
[[package]]
name = "link-cplusplus"
version = "1.0.8"
@@ -528,6 +629,12 @@ dependencies = [
"cc",
]
[[package]]
name = "linked-hash-map"
version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
[[package]]
name = "linux-raw-sys"
version = "0.1.4"
@@ -549,6 +656,15 @@ version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "miniz_oxide"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa"
dependencies = [
"adler",
]
[[package]]
name = "num-integer"
version = "0.1.45"
@@ -574,6 +690,28 @@ version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66"
[[package]]
name = "onig"
version = "6.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c4b31c8722ad9171c6d77d3557db078cab2bd50afcc9d09c8b315c59df8ca4f"
dependencies = [
"bitflags",
"libc",
"once_cell",
"onig_sys",
]
[[package]]
name = "onig_sys"
version = "69.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b829e3d7e9cc74c7e315ee8edb185bf4190da5acde74afd7fc59c35b1f086e7"
dependencies = [
"cc",
"pkg-config",
]
[[package]]
name = "openssl-probe"
version = "0.1.5"
@@ -703,6 +841,20 @@ version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
[[package]]
name = "plist"
version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd39bc6cdc9355ad1dc5eeedefee696bb35c34caf21768741e81826c0bbd7225"
dependencies = [
"base64",
"indexmap",
"line-wrap",
"serde",
"time 0.3.17",
"xml-rs",
]
[[package]]
name = "ppv-lite86"
version = "0.2.17"
@@ -742,6 +894,18 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "pulldown-cmark"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d9cc634bc78768157b5cbfe988ffcd1dcba95cd2b2f03a88316c08c6d00ed63"
dependencies = [
"bitflags",
"getopts",
"memchr",
"unicase",
]
[[package]]
name = "quote"
version = "1.0.23"
@@ -818,6 +982,12 @@ version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde"
[[package]]
name = "safemem"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
[[package]]
name = "same-file"
version = "1.0.6"
@@ -907,6 +1077,30 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "syntect"
version = "5.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c6c454c27d9d7d9a84c7803aaa3c50cd088d2906fe3c6e42da3209aa623576a8"
dependencies = [
"bincode",
"bitflags",
"fancy-regex",
"flate2",
"fnv",
"lazy_static",
"once_cell",
"onig",
"plist",
"regex-syntax",
"serde",
"serde_derive",
"serde_json",
"thiserror",
"walkdir",
"yaml-rust",
]
[[package]]
name = "tera"
version = "1.17.1"
@@ -978,6 +1172,33 @@ dependencies = [
"winapi",
]
[[package]]
name = "time"
version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376"
dependencies = [
"itoa",
"serde",
"time-core",
"time-macros",
]
[[package]]
name = "time-core"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd"
[[package]]
name = "time-macros"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2"
dependencies = [
"time-core",
]
[[package]]
name = "tinyvec"
version = "1.6.0"
@@ -1073,6 +1294,15 @@ dependencies = [
"unic-common",
]
[[package]]
name = "unicase"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
dependencies = [
"version_check",
]
[[package]]
name = "unicode-bidi"
version = "0.3.8"
@@ -1287,3 +1517,18 @@ name = "windows_x86_64_msvc"
version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
[[package]]
name = "xml-rs"
version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
[[package]]
name = "yaml-rust"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
dependencies = [
"linked-hash-map",
]
+7
View File
@@ -11,11 +11,18 @@ repository = "https://github.com/mrmekon/itsy-gitsy"
readme = "README.md"
license = "GPL-3.0-or-later"
[features]
default = ["markdown", "highlight"]
markdown = ["dep:pulldown-cmark"]
highlight_fast = ["syntect/default-onig"]
highlight = ["syntect/default-fancy"]
[dependencies]
chrono = { version = "0.4.23", features=["clock"] }
clap = { version="4.0.32", features=["derive"] }
git2 = "0.15.0"
pulldown-cmark = { version = "0.9.2", optional = true }
serde = { version = "1.0.152", features = ["derive"] }
syntect = { version = "5.0.0", default-features = false, option = true }
tera = "1.17.1"
toml = "0.5.10"
+12 -2
View File
@@ -2,10 +2,20 @@ site_name = "Trevor's Repos"
site_url = "https://git.trevorbentley.com"
site_description = "A bunch of git repos in a stupid format."
render_markdown = true
syntax_highlight = true
syntax_highlight_theme = "base16-ocean.light"
output_dir = "gen/"
recursive_repo_dirs = ["repos/"]
# TODO: specify limits
# TODO: specify output directories/filenames
# TODO: extra metadata for recursive repo listings
# TODO: per-site and per-repo resources (just copied to output dir)
# TODO: enable/disable markdown/highlighting
# TODO: highlighting theme, extensions
[gitsy_templates]
path = "templates/"
repo_list = "repos.html"
@@ -15,8 +25,6 @@ branch = "branch.html"
tag = "tag.html"
file = "file.html"
dir = "dir.html"
header = "header.html"
footer = "footer.html"
error = "404.html"
[gitsy_extra]
@@ -28,3 +36,5 @@ or_bools = true
path = "more_repos/circadian"
website = "https://circadian.trevorbentley.com"
attributes = {some_extra_thing = "user defined", visible = false, number_of_bananas = 3}
render_markdown = false
syntax_highlighting = false
+105 -36
View File
@@ -12,6 +12,17 @@ use std::io::Write;
use std::path::{Path, PathBuf};
use tera::{Context, Filter, Function, Tera, Value, to_value, try_get_value};
#[cfg(feature = "markdown")]
use pulldown_cmark::{html, Options, Parser as MdParser};
#[cfg(any(feature = "highlight", feature = "highlight_fast"))]
use syntect::{
html::{ClassedHTMLGenerator, ClassStyle, css_for_theme_with_class_style},
parsing::SyntaxSet,
highlighting::ThemeSet,
util::LinesWithEndings,
};
fn ts_to_date(ts: i64, offset: Option<i64>, format: Option<String>) -> String {
let offset = offset.unwrap_or(0);
let dt = NaiveDateTime::from_timestamp_opt(ts + offset, 0).expect("Invalid timestamp");
@@ -97,6 +108,8 @@ struct GitFile {
is_binary: bool,
size: usize,
contents: Option<String>,
contents_safe: bool,
contents_preformatted: bool,
}
#[derive(Serialize, Default)]
@@ -164,6 +177,8 @@ fn walk_file_tree(repo: &git2::Repository, rev: &str, files: &mut Vec<GitFile>,
is_binary,
size,
contents: None,
contents_safe: false,
contents_preformatted: true,
});
if recurse && entry.kind() == Some(git2::ObjectType::Tree) {
let prefix = name + "/";
@@ -455,12 +470,61 @@ fn parse_commit(repo: &Repository, refr: &str) -> Result<GitObject, Error> {
Ok(summary)
}
fn fill_file_contents(repo: &Repository, file: &GitFile) -> Result<GitFile, Error> {
#[cfg(feature = "markdown")]
fn parse_markdown(contents: &str) -> String {
let mut options = Options::empty();
options.insert(Options::ENABLE_STRIKETHROUGH);
options.insert(Options::ENABLE_TABLES);
let parser = MdParser::new_ext(contents, options);
let mut html_output: String = String::with_capacity(contents.len() * 3 / 2);
html::push_html(&mut html_output, parser);
html_output
}
#[cfg(any(feature = "highlight", feature = "highlight_fast"))]
fn syntax_highlight(contents: &str, extension: &str) -> String {
let syntax_set = SyntaxSet::load_defaults_newlines();
let syntax = match syntax_set.find_syntax_by_extension(extension) {
Some(s) => s,
_ => { return contents.to_string(); },
};
let mut html_generator = ClassedHTMLGenerator::new_with_class_style(syntax, &syntax_set, ClassStyle::Spaced);
for line in LinesWithEndings::from(contents) {
match html_generator.parse_html_for_line_which_includes_newline(line) {
Ok(_) => {},
Err(_) => {
println!("Warning: failed to apply syntax highlighting.");
return contents.to_string();
},
}
}
html_generator.finalize()
}
fn fill_file_contents(repo: &Repository, file: &GitFile, settings: &GitsySettingsRepo) -> Result<GitFile, Error> {
let mut file = file.clone();
if file.kind == "file" {
let blob = repo.find_blob(git2::Oid::from_str(&file.id)?)?;
file.contents = match blob.is_binary() {
false => Some(String::from_utf8_lossy(blob.content()).to_string()),
false => {
let path = Path::new(&file.path);
let cstr = String::from_utf8_lossy(blob.content()).to_string();
let (content, rendered, pre) = match path.extension() {
#[cfg(feature = "markdown")]
Some(x) if settings.render_markdown.unwrap_or(false) && x == "md" => {
let (cstr, rendered, pre) = (parse_markdown(&cstr), true, false);
(cstr, rendered, pre)
},
#[cfg(any(feature = "highlight", feature = "highlight_fast"))]
Some(x) if settings.syntax_highlight.unwrap_or(false) => {
(syntax_highlight(&cstr, x.to_string_lossy().to_string().as_str()), true, true)
},
_ => (cstr, false, true),
};
file.contents_safe = rendered;
file.contents_preformatted = pre;
Some(content)
},
true => Some(format!("[Binary data ({} bytes)]", blob.content().len())),
};
}
@@ -570,6 +634,9 @@ struct GitsySettings {
site_description: Option<String>,
#[serde(rename(deserialize = "gitsy_templates"))]
templates: GitsySettingsTemplates,
render_markdown: Option<bool>,
syntax_highlight: Option<bool>,
syntax_highlight_theme: Option<String>,
#[serde(rename(deserialize = "gitsy_extra"))]
extra: Option<BTreeMap<String, toml::Value>>,
}
@@ -577,8 +644,6 @@ struct GitsySettings {
#[derive(Deserialize)]
struct GitsySettingsTemplates {
path: PathBuf,
header: Option<String>,
footer: Option<String>,
repo_list: Option<String>,
repo_summary: Option<String>,
commit: Option<String>,
@@ -595,6 +660,9 @@ struct GitsySettingsRepo {
name: Option<String>,
description: Option<String>,
website: Option<String>,
render_markdown: Option<bool>,
syntax_highlight: Option<bool>,
syntax_highlight_theme: Option<String>,
attributes: BTreeMap<String, toml::Value>,
}
@@ -611,14 +679,8 @@ impl PartialEq for GitsySettingsRepo {
}
impl Eq for GitsySettingsRepo {}
fn write_rendered(file: &mut File, rendered: &str, header: Option<&str>, footer: Option<&str>) {
if let Some(header) = header {
file.write(header.as_bytes()).expect("failed to save rendered html");
}
fn write_rendered(file: &mut File, rendered: &str) {
file.write(rendered.as_bytes()).expect("failed to save rendered html");
if let Some(footer) = footer {
file.write(footer.as_bytes()).expect("failed to save rendered html");
}
}
fn main() {
@@ -667,6 +729,9 @@ fn main() {
let dir = dir.expect("Repo contains invalid entries");
repo_descriptions.insert(GitsySettingsRepo {
path: dir.path().clone(),
render_markdown: settings.render_markdown.clone(),
syntax_highlight: settings.syntax_highlight.clone(),
syntax_highlight_theme: settings.syntax_highlight_theme.clone(),
..Default::default()
});
}
@@ -729,14 +794,6 @@ fn main() {
}
local_ctx.insert("site_generated_ts", &generated_dt.timestamp());
local_ctx.insert("site_generated_offset", &generated_dt.offset().local_minus_utc());
let header: Option<String> = match &settings.templates.header {
Some(header) => Some(tera.render(header, &local_ctx).expect("Unable to templatize header file")),
_ => None,
};
let footer: Option<String> = match &settings.templates.footer {
Some(footer) => Some(tera.render(footer, &local_ctx).expect("Unable to templatize footer file")),
_ => None,
};
match tera.render(&settings.templates.repo_summary.as_deref().unwrap_or("summary.html"), &local_ctx) {
Ok(rendered) => {
@@ -745,7 +802,7 @@ fn main() {
let _ = std::fs::create_dir(output_path.to_str().expect("Output path not set!"));
output_path.push("summary.html");
let mut file = std::fs::File::create(output_path.to_str().expect("Output path not set!")).unwrap();
write_rendered(&mut file, &rendered, header.as_deref(), footer.as_deref());
write_rendered(&mut file, &rendered);
},
Err(x) => match x.kind {
tera::ErrorKind::TemplateNotFound(_) if settings.templates.repo_summary.is_none() => {},
@@ -763,7 +820,7 @@ fn main() {
let _ = std::fs::create_dir(output_path.to_str().expect("Output path not set!"));
output_path.push(format!("{}.html", branch.full_hash));
let mut file = std::fs::File::create(output_path.to_str().expect("Output path not set!")).unwrap();
write_rendered(&mut file, &rendered, header.as_deref(), footer.as_deref());
write_rendered(&mut file, &rendered);
},
Err(x) => match x.kind {
tera::ErrorKind::TemplateNotFound(_) if settings.templates.branch.is_none() => {},
@@ -786,7 +843,7 @@ fn main() {
let _ = std::fs::create_dir(output_path.to_str().expect("Output path not set!"));
output_path.push(format!("{}.html", tag.full_hash));
let mut file = std::fs::File::create(output_path.to_str().expect("Output path not set!")).unwrap();
write_rendered(&mut file, &rendered, header.as_deref(), footer.as_deref());
write_rendered(&mut file, &rendered);
},
Err(x) => match x.kind {
tera::ErrorKind::TemplateNotFound(_) if settings.templates.tag.is_none() => {},
@@ -807,7 +864,7 @@ fn main() {
let _ = std::fs::create_dir(output_path.to_str().expect("Output path not set!"));
output_path.push(format!("{}.html", commit.full_hash));
let mut file = std::fs::File::create(output_path.to_str().expect("Output path not set!")).unwrap();
write_rendered(&mut file, &rendered, header.as_deref(), footer.as_deref());
write_rendered(&mut file, &rendered);
},
Err(x) => match x.kind {
tera::ErrorKind::TemplateNotFound(_) if settings.templates.commit.is_none() => {},
@@ -817,8 +874,28 @@ fn main() {
local_ctx.remove("commit");
}
// TODO: most of these generation blocks can be done in
// parallel. This one is particularly costly, especially with
// markdown+highlighting, and would probably benefit from it.
// A potential drawback is that each parallel run needs a
// clone of the Tera context.
#[cfg(any(feature = "highlight", feature = "highlight_fast"))]
{
let ts = ThemeSet::load_defaults();
let theme = ts.themes.get(repo_desc.syntax_highlight_theme.as_deref()
.unwrap_or("base16-ocean.light")).expect("Invalid syntax highlighting theme specified.");
let css: String = css_for_theme_with_class_style(theme, syntect::html::ClassStyle::Spaced)
.expect("Invalid syntax highlighting theme specified.");
let mut output_path = settings.output_dir.clone();
output_path.push(&summary.name);
output_path.push("file");
output_path.push("syntax.css");
let mut file = std::fs::File::create(output_path.to_str().expect("CSS filename invalid!")).expect("CSS path not writeable!");
file.write(css.as_bytes()).expect("Failed to write CSS file!");
}
for file in summary.all_files.iter().filter(|x| x.kind == "file") {
let file = fill_file_contents(&repo, &file).expect("Failed to parse file.");
let file = fill_file_contents(&repo, &file, &repo_desc).expect("Failed to parse file.");
local_ctx.try_insert("file", &file).expect("Failed to add file to template engine.");
match tera.render(&settings.templates.file.as_deref().unwrap_or("file.html"), &local_ctx) {
Ok(rendered) => {
@@ -828,7 +905,7 @@ fn main() {
let _ = std::fs::create_dir(output_path.to_str().expect("Output path not set!"));
output_path.push(format!("{}.html", file.id));
let mut file = std::fs::File::create(output_path.to_str().expect("Output path not set!")).unwrap();
write_rendered(&mut file, &rendered, header.as_deref(), footer.as_deref());
write_rendered(&mut file, &rendered);
},
Err(x) => match x.kind {
tera::ErrorKind::TemplateNotFound(_) if settings.templates.file.is_none() => {},
@@ -849,7 +926,7 @@ fn main() {
let _ = std::fs::create_dir(output_path.to_str().expect("Output path not set!"));
output_path.push(format!("{}.html", dir.id));
let mut file = std::fs::File::create(output_path.to_str().expect("Output path not set!")).unwrap();
write_rendered(&mut file, &rendered, header.as_deref(), footer.as_deref());
write_rendered(&mut file, &rendered);
},
Err(x) => match x.kind {
tera::ErrorKind::TemplateNotFound(_) if settings.templates.dir.is_none() => {},
@@ -878,21 +955,13 @@ fn main() {
}
global_ctx.insert("site_generated_ts", &generated_dt.timestamp());
global_ctx.insert("site_generated_offset", &generated_dt.offset().local_minus_utc());
let header: Option<String> = match &settings.templates.header {
Some(header) => Some(tera.render(header, &global_ctx).expect("Unable to templatize header file")),
_ => None,
};
let footer: Option<String> = match &settings.templates.footer {
Some(footer) => Some(tera.render(footer, &global_ctx).expect("Unable to templatize footer file")),
_ => None,
};
match tera.render(&settings.templates.repo_list.as_deref().unwrap_or("repos.html"), &global_ctx) {
Ok(rendered) => {
let mut output_path = settings.output_dir.clone();
output_path.push("repos.html");
let mut file = std::fs::File::create(output_path.to_str().expect("Output path not set!")).unwrap();
write_rendered(&mut file, &rendered, header.as_deref(), footer.as_deref());
write_rendered(&mut file, &rendered);
},
Err(x) => match x.kind {
tera::ErrorKind::TemplateNotFound(_) if settings.templates.repo_list.is_none() => {},
@@ -905,7 +974,7 @@ fn main() {
let mut output_path = settings.output_dir.clone();
output_path.push("404.html");
let mut file = std::fs::File::create(output_path.to_str().expect("Output path not set!")).unwrap();
write_rendered(&mut file, &rendered, header.as_deref(), footer.as_deref());
write_rendered(&mut file, &rendered);
},
Err(x) => match x.kind {
tera::ErrorKind::TemplateNotFound(_) if settings.templates.error.is_none() => {},
+4
View File
@@ -1 +1,5 @@
{% extends "base.html" %}
{% block content %}
The page you are seeking does not exist.
{% endblock content %}
+17
View File
@@ -0,0 +1,17 @@
<html>
<head>
{% block html_head -%}
<title>{{site_name}}</title>
{% block html_head_extra -%}
{% endblock html_head_extra -%}
{% endblock html_head -%}
</head>
<body style="font-family: monospace;">
{% block header -%}{% include "header.html" -%}{% endblock header -%}
{% block content %}{% endblock content %}
{% block footer -%}{% include "footer.html" -%}{% endblock footer -%}
</body>
</html>
+4
View File
@@ -1,3 +1,6 @@
{% extends "base.html" %}
{% block content %}
branch: {{branch.ref_name}}<br/>
hash: {{branch.full_hash}} ({{branch.short_hash}})<br/>
author: {{branch.author.name}}<br/>
@@ -5,3 +8,4 @@ committer: {{branch.committer.name}}<br/>
date: {{ts_to_date(ts=branch.ts_utc, tz=branch.ts_offset)}}<br/>
summary: {{branch.summary}}<br/>
<pre>{{branch.message}}</pre>
{% endblock content %}
+4
View File
@@ -1,3 +1,6 @@
{% extends "base.html" %}
{% block content %}
<strong>
commit: {{commit.full_hash}}<br/>
author: {{commit.author.name}}<br/>
@@ -25,3 +28,4 @@
</pre>
{% endfor -%}
{% endfor -%}
{% endblock content %}
+4
View File
@@ -1,3 +1,6 @@
{% extends "base.html" %}
{% block content %}
<table class="files">
<tr>
<th>File</th>
@@ -15,3 +18,4 @@
<td class="file-size">{{file.size}}</td>
</tr>
{% endfor -%}
{% endblock content %}
+18 -1
View File
@@ -1,3 +1,20 @@
{% extends "base.html" %}
{% block html_head_extra %}
<link rel="stylesheet" type="text/css" href="syntax.css" />
{% endblock html_head_extra %}
{% block content %}
{{file.path}} ({{file.name}}) [{{file.id}}]<br/>
-------
-------<br/>
{% if file.contents_safe -%}
{% if file.contents_preformatted -%}
<pre>{{file.contents | safe }}</pre>
{%- else -%}
{{file.contents | safe }}
{%- endif -%}
{%- else -%}
<pre style="margin: 0">{{file.contents}}</pre>
{%- endif -%}
{% endblock content %}
+2 -2
View File
@@ -1,2 +1,2 @@
</body>
</html>
<hr/>
Generated by Itsy-Gitsy on {{ts_to_git_timestamp(ts=site_generated_ts, tz=site_generated_offset)}}<br/>
-6
View File
@@ -1,9 +1,3 @@
<html>
<head>
<title>{{site_name}}</title>
</head>
<body style="font-family: monospace;">
Site: {{site_name}}<br/>
Generated: {{ts_to_git_timestamp(ts=site_generated_ts, tz=site_generated_offset)}}<br/>
Extra settings: {{extra.global_user_defined_vars}}<br/>
<hr/>
+4
View File
@@ -1,3 +1,7 @@
{% extends "base.html" %}
{% block content %}
{% for repo in repos | sort(attribute="name") -%}
<a href="{{repo.name}}/summary.html">{{ repo.name }}</a> ({{repo.metadata.website}}) [{{repo.metadata.attributes | get(key="some_extra_thing", default="")}}] ({{ts_to_date(ts=repo.history[0].ts_utc, tz=repo.history[0].ts_offset)}})<br/>
{% endfor -%}
{% endblock content %}
+4
View File
@@ -1,3 +1,6 @@
{% extends "base.html" %}
{% block content %}
<table class="commits">
<tr>
<th>Commit ID</th>
@@ -77,3 +80,4 @@
</tr>
{% endfor -%}
</table>
{% endblock content %}
+4
View File
@@ -1,3 +1,6 @@
{% extends "base.html" %}
{% block content %}
branch: {{tag.ref_name}}<br/>
hash: {{tag.full_hash}} ({{tag.short_hash}})<br/>
author: {{tag.author.name}}<br/>
@@ -9,3 +12,4 @@ summary: {{tag.summary}}<br/>
commit: {%- if commit -%}<a href="../commit/{{commit.full_hash}}.html">{{commit.full_hash}}</a>
<pre>{{commit.message}}</pre>
{%-else-%}{{tag.tagged_id}}{%-endif-%}<br/>
{% endblock content %}