Generating the new treeX

This commit is contained in:
Tom Alexander 2020-05-09 22:05:43 -04:00
parent d2904913ad
commit 9a33195c42
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE
2 changed files with 16 additions and 3 deletions

View File

@ -4,7 +4,7 @@ use crate::parser::Template;
use crate::parser::TemplateElement;
use std::collections::HashMap;
struct InlinePartialTreeElement<'a> {
pub struct InlinePartialTreeElement<'a> {
parent: Option<&'a InlinePartialTreeElement<'a>>,
blocks: HashMap<&'a str, &'a Option<Body<'a>>>,
}

View File

@ -8,6 +8,8 @@ use crate::renderer::context_element::ContextElement;
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::parameters_context::ParametersContext;
use crate::renderer::walking::walk_path;
use std::collections::HashMap;
@ -52,6 +54,15 @@ impl<'a> DustRenderer<'a> {
&'a self,
name: &str,
breadcrumbs: &Vec<&'a dyn ContextElement>,
) -> Result<String, RenderError> {
self.render_template(name, breadcrumbs, None)
}
fn render_template(
&'a self,
name: &str,
breadcrumbs: &Vec<&'a dyn ContextElement>,
blocks: Option<&'a InlinePartialTreeElement<'a>>,
) -> Result<String, RenderError> {
let main_template = match self.templates.get(name) {
Some(tmpl) => tmpl,
@ -59,6 +70,8 @@ impl<'a> DustRenderer<'a> {
return Err(RenderError::TemplateNotFound(name.to_owned()));
}
};
let extracted_inline_partials = extract_inline_partials(main_template);
let new_blocks = InlinePartialTreeElement::new(blocks, extracted_inline_partials);
self.render_body(&main_template.contents, breadcrumbs)
}
@ -173,13 +186,13 @@ impl<'a> DustRenderer<'a> {
}
DustTag::DTPartial(partial) => {
if partial.params.is_empty() {
let rendered_content = self.render(&partial.name, breadcrumbs)?;
let rendered_content = self.render_template(&partial.name, breadcrumbs)?;
return Ok(rendered_content);
} else {
let injected_context = ParametersContext::new(breadcrumbs, &partial.params);
let mut new_breadcrumbs = breadcrumbs.clone();
new_breadcrumbs.insert(new_breadcrumbs.len() - 1, &injected_context);
let rendered_content = self.render(&partial.name, &new_breadcrumbs)?;
let rendered_content = self.render_template(&partial.name, &new_breadcrumbs)?;
return Ok(rendered_content);
}
}