f04e84dc31
I think the problem is, the index context needs to be a higher priority than the new context element, but when referencing data with `{.}` the new context element needs to take priority. I could either combine entries in the context tree so that variables like $idx and $len live side-by-side with real context elements, or try to implement a way to skip over index context elements when walking up the tree.
376 lines
9.6 KiB
Plaintext
376 lines
9.6 KiB
Plaintext
{! First we do it without explicit context setting which results in being able to read some_global but not pet !}
|
|
Section Regular{~n}
|
|
==============={~n}
|
|
{#loop}
|
|
{#person}
|
|
{$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{/person}
|
|
{/loop}
|
|
|
|
{! Then we do it with explicit context setting which should result in being able ot read pet but not some_global !}
|
|
Section Explicit{~n}
|
|
================{~n}
|
|
{#loop}
|
|
{#person:explicit}
|
|
{$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{/person}
|
|
{/loop}
|
|
|
|
{! What happens if we try to use an explicit context with an exists block instead of a section !}
|
|
Exists Regular{~n}
|
|
=============={~n}
|
|
{#loop}
|
|
{?person}
|
|
{$idx}: {person.name} has a pet {pet} but not a {some_global}{~n}
|
|
{/person}
|
|
{/loop}
|
|
|
|
Exists Explicit{~n}
|
|
==============={~n}
|
|
{#loop}
|
|
{?person:explicit}
|
|
{$idx}: {person.name} has a pet {pet} but not a {some_global}{~n}
|
|
{/person}
|
|
{/loop}
|
|
|
|
{! Can you explicitly set the context for a partial? !}
|
|
Partial Regular{~n}
|
|
==============={~n}
|
|
{#loop}
|
|
{>other/}
|
|
{/loop}
|
|
|
|
Partial Explicit{~n}
|
|
================{~n}
|
|
{#loop}
|
|
{>other:explicit/}
|
|
{/loop}
|
|
|
|
Quoted Partial Explicit{~n}
|
|
======================={~n}
|
|
{#loop}
|
|
{>"other":explicit/}
|
|
{/loop}
|
|
|
|
Partial Regular with parameters{~n}
|
|
==============================={~n}
|
|
{#loop}
|
|
{>other pet="rabbit"/}
|
|
{/loop}
|
|
|
|
Partial Explicit with parameters{~n}
|
|
================================{~n}
|
|
{#loop}
|
|
{>other:explicit pet="rabbit"/}
|
|
{/loop}
|
|
|
|
{! Can you explicitly set the context for a helper? !}
|
|
Helper Regular{~n}
|
|
=============={~n}
|
|
{#loop}
|
|
{@eq key="foo" value="foo"}
|
|
{$idx}: {person.name} has a pet {pet} but not a {some_global}{~n}
|
|
{/eq}
|
|
{/loop}
|
|
|
|
Helper Explicit{~n}
|
|
==============={~n}
|
|
{#loop}
|
|
{@eq:explicit key="foo" value="foo"}
|
|
{$idx}: {person.name} has a pet {pet} but not a {some_global}{~n}
|
|
{/eq}
|
|
{/loop}
|
|
|
|
{! Can you explicitly set the context for inline partials or blocks? !}
|
|
Block Regular{~n}
|
|
============={~n}
|
|
{#loop}
|
|
{>default/}
|
|
{/loop}
|
|
|
|
Inline Partial Regular{~n}
|
|
======================{~n}
|
|
{#loop}
|
|
{>override/}
|
|
{/loop}
|
|
|
|
Block Explicit{~n}
|
|
=============={~n}
|
|
{#loop}
|
|
{>default_explicit/}
|
|
{/loop}
|
|
|
|
Inline Partial Explicit{~n}
|
|
======================={~n}
|
|
{#loop}
|
|
{>override_explicit/}
|
|
{/loop}
|
|
|
|
Inline Partial and Block Explicit{~n}
|
|
================================={~n}
|
|
{#loop}
|
|
{>override_double_explicit/}
|
|
{/loop}
|
|
|
|
{! Can you explicitly set the context for references? !}
|
|
{! Commented out until I add support for rendering invalid dust verbatim
|
|
Reference Regular{~n}
|
|
================={~n}
|
|
{.}{~n}
|
|
|
|
Reference Explicit{~n}
|
|
=================={~n}
|
|
{.:some_global}{~n}
|
|
!}
|
|
|
|
{! Can you explicitly set the context with a path? !}
|
|
Path Regular{~n}
|
|
============{~n}
|
|
{#loop}
|
|
{#person}
|
|
{$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{/person}
|
|
{/loop}
|
|
|
|
Path Explicit{~n}
|
|
============={~n}
|
|
{#loop}
|
|
{#person:deep_explicit.explicit}
|
|
{$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{/person}
|
|
{/loop}
|
|
|
|
{! Can you explicitly set the context to a variable? !}
|
|
Variable Regular{~n}
|
|
================{~n}
|
|
{#loop}
|
|
{#person}
|
|
{$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{/person}
|
|
{/loop}
|
|
|
|
Variable Explicit{~n}
|
|
================={~n}
|
|
{#loop}
|
|
{#person:$idx}
|
|
{$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{/person}
|
|
{/loop}
|
|
|
|
{! What context is set on else blocks? !}
|
|
Else Block Regular{~n}
|
|
=================={~n}
|
|
{#loop}
|
|
{#empty_array}
|
|
MAIN {$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{:else}
|
|
ELSE {$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{/empty_array}
|
|
{/loop}
|
|
|
|
Else Block Explicit{~n}
|
|
==================={~n}
|
|
{#loop}
|
|
{#empty_array:explicit}
|
|
MAIN {$idx}: {person.name} has a pet {pet} but not a {some_global}{~n}
|
|
{:else}
|
|
ELSE {$idx}: {person.name} has a pet {pet} but not a {some_global}{~n}
|
|
{/empty_array}
|
|
{/loop}
|
|
|
|
{! What context is set when the explicit context path does not exist? !}
|
|
Failed Explicit Regular{~n}
|
|
======================={~n}
|
|
{#loop}
|
|
{#person}
|
|
{$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{/person}
|
|
{/loop}
|
|
|
|
Failed Explicit Explicit{~n}
|
|
========================{~n}
|
|
{#loop}
|
|
{#person:foobar}
|
|
{$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{/person}
|
|
{/loop}
|
|
|
|
{! What context is set when the regular path and explicit context path does not exist? !}
|
|
Failed Everything Regular{~n}
|
|
========================={~n}
|
|
BEFORE {.|js}{~n}
|
|
{#foo}
|
|
MAIN {.|js}{~n}
|
|
{:else}
|
|
ELSE {.|js}{~n}
|
|
{/foo}
|
|
|
|
Failed Everything Explicit{~n}
|
|
=========================={~n}
|
|
{#foo:bar}
|
|
MAIN {.|js}{~n}
|
|
{:else}
|
|
ELSE {.|js}{~n}
|
|
{/foo}
|
|
|
|
{! What context is set when the regular context path does not exist? !}
|
|
Failed Regular Path Regular{~n}
|
|
==========================={~n}
|
|
{#loop}
|
|
{#foo}
|
|
MAIN {$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{:else}
|
|
ELSE {$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{/foo}
|
|
{/loop}
|
|
|
|
Failed Regular Path Explicit{~n}
|
|
============================{~n}
|
|
{#loop}
|
|
{#foo:explicit}
|
|
MAIN {$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{:else}
|
|
ELSE {$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{/foo}
|
|
{/loop}
|
|
|
|
{! What context is set when the explicit path is falsey? !}
|
|
Falsey Explicit Path Regular{~n}
|
|
============================{~n}
|
|
{#loop}
|
|
{#foo}
|
|
MAIN {$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{:else}
|
|
ELSE {$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{/foo}
|
|
{/loop}
|
|
|
|
Falsey Explicit Path Explicit{~n}
|
|
============================={~n}
|
|
{#loop}
|
|
{#foo:empty_array}
|
|
MAIN {$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{:else}
|
|
ELSE {$idx}: {name} has a pet {pet} but not a {some_global}{~n}
|
|
{.|js}{~n}
|
|
{/foo}
|
|
{/loop}
|
|
|
|
{! Since partial parameters are normally injected 1 level above the current context, and explicit contexts are below the partial parameters, is the order parameters->current_context->explicit or current_context->parameters->explicit when both are being used? !}
|
|
Partial Overloaded Regular with parameters{~n}
|
|
=========================================={~n}
|
|
{#loop}
|
|
{>other_friend friend="Dave" pet="rabbit"/}
|
|
{/loop}
|
|
|
|
Partial Overloaded Explicit with parameters{~n}
|
|
==========================================={~n}
|
|
{#loop}
|
|
{>other_friend:explicit friend="Dave" pet="rabbit"/}
|
|
{/loop}
|
|
|
|
{! Is an explicit context on an inline partial evaluated in the context of the block or the context of the inline partial? !}
|
|
Explicit Evaluation Time Global{~n}
|
|
==============================={~n}
|
|
{>explicit_evaluation_time/}
|
|
|
|
Explicit Evaluation Time Partial Context{~n}
|
|
========================================{~n}
|
|
{#partial_context}
|
|
{>explicit_evaluation_time/}
|
|
{/partial_context}
|
|
|
|
{! The previous test discovered that the inline partial's explicit context is evaluated based on the context when invoking the full-blown partial, HOWEVER, it shared the same partial context for both the block and the inline partial. To conclusively prove if the explicit context is evaluated on the inline partial and not the block, we need a different partial context for each one. !}
|
|
Explicit Evaluation Time Split Partial Context Default{~n}
|
|
======================================================{~n}
|
|
{#partial_context}
|
|
{#block.message}
|
|
{>explicit_evaluation_time_split_default/}
|
|
{/block.message}
|
|
{/partial_context}
|
|
|
|
Explicit Evaluation Time Split Partial Context OVerride{~n}
|
|
======================================================={~n}
|
|
{#partial_context}
|
|
{#inline_partial}
|
|
{>explicit_evaluation_time_split_override/}
|
|
{/inline_partial}
|
|
{/partial_context}
|
|
|
|
{! What happens with sections with explicit context and parameters !}
|
|
Section set $idx as a parameter{~n}
|
|
==============================={~n}
|
|
{#explicit $idx="7"}
|
|
$idx is {$idx}{~n}
|
|
$len is {$len}{~n}
|
|
{/explicit}
|
|
|
|
Section set $idx as a parameter and new context{~n}
|
|
==============================================={~n}
|
|
{#has_idx $idx="7"}
|
|
$idx is {$idx}{~n}
|
|
$len is {$len}{~n}
|
|
{/has_idx}
|
|
|
|
Section set $idx as a parameter, new context, and explicit context{~n}
|
|
=================================================================={~n}
|
|
{#has_idx:another_idx $idx="7" $len="8"}
|
|
$idx is {$idx}{~n}
|
|
$len is {$len}{~n}
|
|
other is {other}{~n}
|
|
{/has_idx}
|
|
|
|
Section vs Partial priority{~n}
|
|
==========================={~n}
|
|
{#some_global:explicit pet="snake"}
|
|
{pet}{~n}
|
|
{/some_global}
|
|
{>priority:explicit pet="snake"/}
|
|
|
|
Section vs Exists priority{~n}
|
|
=========================={~n}
|
|
{?some_global:explicit pet="snake"}
|
|
{pet}{~n}
|
|
{/some_global}
|
|
{>priority:explicit pet="snake"/}
|
|
|
|
Section vs NotExists priority{~n}
|
|
=========================={~n}
|
|
{^some_global:explicit pet="snake"}
|
|
MAIN {pet}{~n}
|
|
{:else}
|
|
ELSE {pet}{~n}
|
|
{/some_global}
|
|
{>priority:explicit pet="snake"/}
|
|
|
|
Section vs Partial priority Failed Walk{~n}
|
|
======================================={~n}
|
|
{#doesnotexist:explicit pet="snake"}
|
|
MAIN {pet}{~n}
|
|
{:else}
|
|
ELSE {pet}{~n}
|
|
{/doesnotexist}
|
|
{>priority:explicit pet="snake"/}
|
|
|
|
Section Loop set $idx as a parameter{~n}
|
|
===================================={~n}
|
|
{#loop $idx="7"}
|
|
$idx is {$idx}{~n}
|
|
$len is {$len}{~n}
|
|
{/loop}
|
|
|
|
Section Loop set $idx in explicit context{~n}
|
|
========================================={~n}
|
|
{#loop:has_idx}
|
|
$idx is {$idx}{~n}
|
|
$len is {$len}{~n}
|
|
{/loop}
|
|
|
|
Section Loop set $idx in explicit context and parameter{~n}
|
|
======================================================={~n}
|
|
{#loop:has_idx $idx="7"}
|
|
$idx is {$idx}{~n}
|
|
$len is {$len}{~n}
|
|
{/loop}
|
|
|