The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
overview: |
  Partial tags are used to expand an external template into the current
  template.

  The tag's content MUST be a non-whitespace character sequence NOT containing
  the current closing delimiter.

  This tag's content names the partial to inject.  Set Delimiter tags MUST NOT
  affect the parsing of a partial.  The partial MUST be rendered against the
  context stack local to the tag.  If the named partial cannot be found, the
  empty string SHOULD be used instead, as in interpolations.

  Partial tags SHOULD be treated as standalone when appropriate.  If this tag
  is used standalone, any whitespace preceding the tag should treated as
  indentation, and prepended to each line of the partial before rendering.
tests:
  - name: Basic Behavior
    desc: The greater-than operator should expand to the named partial.
    data: { }
    template: '"{{>text}}"'
    partials: { text: 'from partial' }
    expected: '"from partial"'

  - name: Failed Lookup
    desc: The empty string should be used when the named partial is not found.
    data: { }
    template: '"{{>text}}"'
    partials: { }
    expected: '""'

  - name: Context
    desc: The greater-than operator should operate within the current context.
    data: { text: 'content' }
    template: '"{{>partial}}"'
    partials: { partial: '*{{text}}*' }
    expected: '"*content*"'

  - name: Recursion
    desc: The greater-than operator should properly recurse.
    data: { content: "X", nodes: [ { content: "Y", nodes: [] } ] }
    template: '{{>node}}'
    partials: { node: '{{content}}<{{#nodes}}{{>node}}{{/nodes}}>' }
    expected: 'X<Y<>>'

  # Whitespace Sensitivity

  - name: Surrounding Whitespace
    desc: The greater-than operator should not alter surrounding whitespace.
    data: { }
    template: '| {{>partial}} |'
    partials: { partial: "\t|\t" }
    expected: "| \t|\t |"

  - name: Inline Indentation
    desc: Whitespace should be left untouched.
    data: { data: '|' }
    template: "  {{data}}  {{> partial}}\n"
    partials: { partial: ">\n>" }
    expected: "  |  >\n>\n"

  - name: Standalone Line Endings
    desc: '"\r\n" should be considered a newline for standalone tags.'
    data: { }
    template: "|\r\n{{>partial}}\r\n|"
    partials: { partial: ">" }
    expected: "|\r\n>|"

  - name: Standalone Without Previous Line
    desc: Standalone tags should not require a newline to precede them.
    data: { }
    template: "  {{>partial}}\n>"
    partials: { partial: ">\n>"}
    expected: "  >\n  >>"

  - name: Standalone Without Newline
    desc: Standalone tags should not require a newline to follow them.
    data: { }
    template: ">\n  {{>partial}}"
    partials: { partial: ">\n>" }
    expected: ">\n  >\n  >"

  - name: Standalone Indentation
    desc: Each line of the partial should be indented before rendering.
    data: { content: "<\n->" }
    template: |
      \
       {{>partial}}
      /
    partials:
      partial: |
        |
        {{{content}}}
        |
    expected: |
      \
       |
       <
      ->
       |
      /

  # Whitespace Insensitivity

  - name: Padding Whitespace
    desc: Superfluous in-tag whitespace should be ignored.
    data: { boolean: true }
    template: "|{{> partial }}|"
    partials: { partial: "[]" }
    expected: '|[]|'