wow this does a lot more now huh nwn
This commit is contained in:
parent
a22536fadc
commit
d8bd4aa1f0
|
@ -6,5 +6,7 @@ edition = "2021"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
once_cell = "1.19.0"
|
||||||
|
regex = "1.10.3"
|
||||||
roxy_core = { git = "https://fem.mint.lgbt/kitsunecafe/roxy-core.git" }
|
roxy_core = { git = "https://fem.mint.lgbt/kitsunecafe/roxy-core.git" }
|
||||||
tera = "1.19.1"
|
tera = "1.19.1"
|
||||||
|
|
64
src/lib.rs
64
src/lib.rs
|
@ -1,14 +1,61 @@
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use once_cell::sync::Lazy;
|
||||||
|
use regex::Regex;
|
||||||
use roxy_core::roxy::Parse;
|
use roxy_core::roxy::Parse;
|
||||||
|
|
||||||
|
const DEFAULT_CONTEXT: Lazy<tera::Context> = Lazy::new(|| tera::Context::default());
|
||||||
|
const EXPANSION_RE: Lazy<Regex> =
|
||||||
|
Lazy::new(|| Regex::new("\\{% extends \"?(.+?)\"? %\\}").expect("couldn't load regex"));
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct TeraParserOptions {
|
||||||
|
auto_load_layouts: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for TeraParserOptions {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
auto_load_layouts: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct TeraParser<'a> {
|
pub struct TeraParser<'a> {
|
||||||
pub tera: &'a mut tera::Tera,
|
pub tera: &'a mut tera::Tera,
|
||||||
context: &'a tera::Context,
|
context: Option<&'a tera::Context>,
|
||||||
|
options: TeraParserOptions,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> TeraParser<'a> {
|
impl<'a> TeraParser<'a> {
|
||||||
pub fn new(tera: &'a mut tera::Tera, context: &'a tera::Context) -> Self {
|
pub fn new(tera: &'a mut tera::Tera, options: TeraParserOptions) -> Self {
|
||||||
Self { tera, context }
|
Self {
|
||||||
|
tera,
|
||||||
|
context: None,
|
||||||
|
options,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_context(&mut self, context: &'a tera::Context) {
|
||||||
|
self.context = Some(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn load_template(&mut self, path: &str, src: &[u8]) -> Result<(), tera::Error> {
|
||||||
|
let str = String::from_utf8_lossy(src).to_string();
|
||||||
|
if let Some(captures) = EXPANSION_RE.captures(&str.as_str()) {
|
||||||
|
if let Some(layout_path) = captures.get(1) {
|
||||||
|
let layout_path = layout_path.as_str();
|
||||||
|
let path = PathBuf::from(path).parent().map(|p| p.join(layout_path)).unwrap();
|
||||||
|
|
||||||
|
self.tera.add_template_file(
|
||||||
|
&path.canonicalize().unwrap(),
|
||||||
|
Some(layout_path)
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,19 +67,24 @@ impl<'a> Parse for TeraParser<'a> {
|
||||||
std::io::Error::new(std::io::ErrorKind::InvalidData, e.to_string())
|
std::io::Error::new(std::io::ErrorKind::InvalidData, e.to_string())
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if self.options.auto_load_layouts {
|
||||||
|
self.load_template(path, src).map_err(err)?;
|
||||||
|
}
|
||||||
|
|
||||||
let template = String::from_utf8_lossy(src).to_string();
|
let template = String::from_utf8_lossy(src).to_string();
|
||||||
|
|
||||||
self.tera
|
self.tera
|
||||||
.add_raw_template(path, template.as_str())
|
.add_raw_template(path, template.as_str())
|
||||||
.map_err(err)?;
|
.map_err(err)?;
|
||||||
|
|
||||||
self.tera.render_to(path, self.context, dst).map_err(err)
|
self.tera
|
||||||
|
.render_to(path, self.context.unwrap_or(&DEFAULT_CONTEXT), dst)
|
||||||
|
.map_err(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn it_works() {
|
fn it_works() {}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue