diff --git a/js/test_cases/helpers_sep/main.dust b/js/test_cases/helpers_sep/main.dust index d1d9415..492d43e 100644 --- a/js/test_cases/helpers_sep/main.dust +++ b/js/test_cases/helpers_sep/main.dust @@ -1,13 +1,29 @@ +Tags inside a sep{~n} +================={~n} {#people} {name}{@sep petname="fluffy"},{pet}{petname}{/sep} {/people}{~n} +sep inside a scalar{~n} +==================={~n} {#scalar} {name}{@sep petname="fluffy"},{pet}{petname}{/sep} {/scalar}{~n} +Nested sep inside another non-array section{~n} +==========================================={~n} {#people} {#toys} {name}'s pet {pet} plays with a {.}{@sep}, {/sep} {/toys} {/people}{~n} + +Else block inside a sep{~n} +======================={~n} +{#people} + {name}{@sep},{pet}{petname}{:else}elseblock{/sep} +{/people}{~n} + +Sep outside any section{~n} +======================={~n} +{@sep}sep is printed outside any section{/sep} diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index dd0699b..61f7904 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -2,6 +2,7 @@ use crate::parser::template; use crate::parser::Body; use crate::parser::DustTag; use crate::parser::Filter; +use crate::parser::OwnedLiteral; use crate::parser::PartialNameElement; use crate::parser::Path; use crate::parser::Special; @@ -645,7 +646,54 @@ impl<'a> DustRenderer<'a> { } } } - DustTag::DTHelperSep(parameterized_block) => {} + DustTag::DTHelperSep(parameterized_block) => { + let new_breadcrumbs = self.new_breadcrumbs_partial( + breadcrumbs, + breadcrumbs, + None, + ¶meterized_block.explicit_context, + ); + + let index = self.get(breadcrumbs, &vec!["$idx"]); + let len = self.get(breadcrumbs, &vec!["$len"]); + match (index, len) { + (Err(_), _) | (_, Err(_)) => { + return self.render_maybe_body( + ¶meterized_block.contents, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + ) + } + (Ok(index_resolved), Ok(len_resolved)) => { + // Iteration contexts use OwnedLiteral::LPositiveinteger + let index_cast = index_resolved + .get_context_element_reference() + .to_any() + .downcast_ref::(); + let len_cast = len_resolved + .get_context_element_reference() + .to_any() + .downcast_ref::(); + match (index_cast, len_cast) { + ( + Some(OwnedLiteral::LPositiveInteger(index_number)), + Some(OwnedLiteral::LPositiveInteger(len_number)), + ) => { + if *index_number == len_number - 1 { + return Ok("".to_owned()); + } else { + return self.render_maybe_body( + ¶meterized_block.contents, + new_breadcrumbs.as_ref().unwrap_or(breadcrumbs), + blocks, + ); + } + } + _ => return Ok("".to_owned()), + } + } + } + } DustTag::DTHelperFirst(parameterized_block) => {} DustTag::DTHelperLast(parameterized_block) => {} }