index : livejrnl-rs.git

ascending towards madness

use std::collections::HashMap;
use std::path::Path;
use std::path::PathBuf;
use std::str::FromStr;
use walkdir::WalkDir;
use minijinja::{Environment, context};

use crate::data::formats;
use crate::util::journal;

use super::filters;
use super::functions;

pub fn get_templates(template: String) -> HashMap<String, String> {
	let template_path: PathBuf = PathBuf::from_str(&template).unwrap();
	let mut templates: HashMap<String, String> = HashMap::new();
	for path in WalkDir::new(template_path).into_iter().filter_map(|e| e.ok()) {
		if path.metadata().unwrap().is_file() {
			let relative_path: PathBuf = PathBuf::from(path.path());
			let relative_path: &Path = relative_path.strip_prefix(&template).unwrap();
			let full_path: String = path.path().display().to_string();
			if let Ok(file) = std::fs::read_to_string(&full_path) {
				templates.insert(relative_path.to_str().unwrap_or_default().to_string(), file);
			}
		}
	}
	templates
}

pub fn render_html(config: formats::RenderConfig, journal: journal::Journal, templates: &HashMap<String, String>) -> String {
	let env: &mut Environment<'_> = &mut Environment::new();

	for (name, source) in templates {
		let _ = env.add_template(&name, &source).unwrap();
	}

	filters::register_filters(env);
	functions::register_functions(env);

	let tmpl: minijinja::Template<'_, '_> = env.get_template(&config.template_index).unwrap();
	tmpl.render(context!(config => config, journal => journal)).unwrap_or_default()
}