overview: | Like partials, Parent tags are used to expand an external template into the current template. Unlike partials, Parent tags may contain optional arguments delimited by Block tags. For this reason, Parent tags may also be referred to as Parametric Partials. The Parent tags' content MUST be a non-whitespace character sequence NOT containing the current closing delimiter; each Parent tag MUST be followed by an End Section tag with the same content within the matching Parent tag. This tag's content names the Parent template to inject. Set Delimiter tags Preceding a Parent tag MUST NOT affect the parsing of the injected external template. The Parent MUST be rendered against the context stack local to the tag. If the named Parent cannot be found, the empty string SHOULD be used instead, as in interpolations. Parent tags SHOULD be treated as standalone when appropriate. If this tag is used standalone, any whitespace preceding the tag should be treated as indentation, and prepended to each line of the Parent before rendering. The Block tags' content MUST be a non-whitespace character sequence NOT containing the current closing delimiter. Each Block tag MUST be followed by an End Section tag with the same content within the matching Block tag. This tag's content determines the parameter or argument name. Block tags may appear both inside and outside of Parent tags. In both cases, they specify a position within the template that can be overridden; it is a parameter of the containing template. The template text between the Block tag and its matching End Section tag defines the default content to render when the parameter is not overridden from outside. In addition, when used inside of a Parent tag, the template text between a Block tag and its matching End Section tag defines content that replaces the default defined in the Parent template. This content is the argument passed to the Parent template. The practice of injecting an external template using a Parent tag is referred to as inheritance. If the Parent tag includes a Block tag that overrides a parameter of the Parent template, this may also be referred to as substitution. Parent templates are taken from the same namespace as regular Partial templates and in fact, injecting a regular Partial is exactly equivalent to injecting a Parent without making any substitutions. Parameter and arguments names live in a namespace that is distinct from both Partials and the context. tests: - name: Default desc: Default content should be rendered if the block isn't overridden data: { } template: | {{$title}}Default title{{/title}} expected: | Default title - name: Variable desc: Default content renders variables data: { bar: 'baz' } template: | {{$foo}}default {{bar}} content{{/foo}} expected: | default baz content - name: Triple Mustache desc: Default content renders triple mustache variables data: { bar: '' } template: | {{$foo}}default {{{bar}}} content{{/foo}} expected: | default content - name: Sections desc: Default content renders sections data: { bar: {baz: 'qux'} } template: | {{$foo}}default {{#bar}}{{baz}}{{/bar}} content{{/foo}} expected: | default qux content - name: Negative Sections desc: Default content renders negative sections data: { baz: 'three' } template: | {{$foo}}default {{^bar}}{{baz}}{{/bar}} content{{/foo}} expected: | default three content - name: Mustache Injection desc: Mustache injection in default content data: {bar: {baz: '{{qux}}'} } template: | {{$foo}}default {{#bar}}{{baz}}{{/bar}} content{{/foo}} expected: | default {{qux}} content - name: Inherit desc: Default content rendered inside inherited templates data: { } template: | {{parent}}|{{