|
|
|
@ -1,8 +1,10 @@
|
|
|
|
|
use crate::parser::template;
|
|
|
|
|
use crate::parser::Body;
|
|
|
|
|
use crate::parser::DustTag;
|
|
|
|
|
use crate::parser::Filter;
|
|
|
|
|
use crate::parser::PartialNameElement;
|
|
|
|
|
use crate::parser::Path;
|
|
|
|
|
use crate::parser::Special;
|
|
|
|
|
use crate::parser::Template;
|
|
|
|
|
use crate::parser::TemplateElement;
|
|
|
|
|
use crate::renderer::breadcrumb_tree::BreadcrumbTree;
|
|
|
|
@ -11,6 +13,7 @@ use crate::renderer::context_element::ContextElement;
|
|
|
|
|
use crate::renderer::context_element::IntoContextElement;
|
|
|
|
|
use crate::renderer::errors::CompileError;
|
|
|
|
|
use crate::renderer::errors::RenderError;
|
|
|
|
|
use crate::renderer::errors::WalkError;
|
|
|
|
|
use crate::renderer::inline_partial_tree::extract_inline_partials;
|
|
|
|
|
use crate::renderer::inline_partial_tree::InlinePartialTreeElement;
|
|
|
|
|
use crate::renderer::tree_walking::walk_path;
|
|
|
|
@ -132,6 +135,32 @@ impl<'a> DustRenderer<'a> {
|
|
|
|
|
blocks: &'a BlockContext<'a>,
|
|
|
|
|
) -> Result<String, RenderError> {
|
|
|
|
|
match tag {
|
|
|
|
|
DustTag::DTComment(_comment) => (),
|
|
|
|
|
DustTag::DTSpecial(special) => {
|
|
|
|
|
return Ok(match special {
|
|
|
|
|
Special::Space => " ",
|
|
|
|
|
Special::NewLine => "\n",
|
|
|
|
|
Special::CarriageReturn => "\r",
|
|
|
|
|
Special::LeftCurlyBrace => "{",
|
|
|
|
|
Special::RightCurlyBrace => "}",
|
|
|
|
|
}
|
|
|
|
|
.to_owned())
|
|
|
|
|
}
|
|
|
|
|
DustTag::DTLiteralStringBlock(literal) => return Ok((*literal).to_owned()),
|
|
|
|
|
DustTag::DTReference(reference) => {
|
|
|
|
|
let val = walk_path(breadcrumbs, &reference.path.keys)
|
|
|
|
|
.map(|ice| ice.into_context_element(self, breadcrumbs));
|
|
|
|
|
match val {
|
|
|
|
|
Err(WalkError::CantWalk) => return Ok("".to_owned()),
|
|
|
|
|
Ok(final_val) => {
|
|
|
|
|
return if final_val.is_truthy() {
|
|
|
|
|
final_val.render(&Self::preprocess_filters(&reference.filters))
|
|
|
|
|
} else {
|
|
|
|
|
Ok("".to_owned())
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
_ => panic!("Unsupported tag"),
|
|
|
|
|
}
|
|
|
|
|
Ok("".to_owned())
|
|
|
|
@ -281,6 +310,21 @@ impl<'a> DustRenderer<'a> {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn preprocess_filters(filters: &Vec<Filter>) -> Vec<Filter> {
|
|
|
|
|
let mut final_filters: Vec<Filter> = filters
|
|
|
|
|
.into_iter()
|
|
|
|
|
.filter(|f| f != &&Filter::DisableHtmlEncode)
|
|
|
|
|
.map(|f| f.clone())
|
|
|
|
|
.collect();
|
|
|
|
|
|
|
|
|
|
// If the user has not specified any escaping filter (|s or
|
|
|
|
|
// |h), automatically add an html escape filter
|
|
|
|
|
if !filters.iter().any(|f| f == &Filter::DisableHtmlEncode) {
|
|
|
|
|
final_filters.push(Filter::HtmlEncode);
|
|
|
|
|
}
|
|
|
|
|
final_filters
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct BlockContext<'a> {
|
|
|
|
|