Skip to content

Placeholder Definition

Peter Johnson edited this page Feb 16, 2023 · 22 revisions

Placeholder Definition

⚠️⚠️ THIS WIKI IS BEING USED TO JOT DOWN IDEAS AT PRESENT. DON'T ASSUME ANYTHING IS FIXED. ⚠️⚠️

Description

A Treacle place holder has the following forms:

{{ source < arg1,arg2,argN > filter1 < arg1,arg2,argN > filterN < arg1,argN }}
{{ var := source < arg1,arg2,argN > filter1 < arg1,arg2,argN > filterN < arg1,argN }}
{{ var := source < arg1,arg2,argN > filter1 < arg1,arg2,argN > filterN < arg1,argN ; }}
{{ source < arg1,arg2,argN > $iterator < init-value < ( %elem > filter < %accum ) }}

Arguments (argX) are optional. If they are omitted then the preceding < must also be omitted. There is no limit to the number of arguments. Only @ command sources and filters take arguments. The number and type of arguments depends on the command or filter they are being used with. An argument is either given a literal value or it can take its value from a placeholder or a named variable.

There can be zero or more filters chained together. If there are no filters then the > must be omitted. Filters transform the value piped in and the transformed value is piped out.

:= is used to assign the value of the placeholder to var. The order of execution is that source is piped through any filters then the result is assigned to var. The placeholder value is returned as normal unless a ; is placed immediately before the closing }}, which causes the placeholder to return Null. Hence ; is really only of use when assigning a variable.

🗒️ Note that | can be used in place of > and : can be used instead of < to make placeholders look more like Liquid.

Syntax Definition

Here's the syntax definition in a BNF-like language.

<placeholder>           ::= "{{" [ <assignment> ] <source> [ <modifier-chain> ] [ ";" ] "}}"
<assignment>            ::= <variable> ":="
<source>                ::= <variable> | <command> | <literal-value> | <placeholder>
<command>               ::= <command-name> [ <args-group> ]
<command-name>          ::= "@" <token>
<args-group>            ::= <args-pipe> <args>
<args>                  ::= <arg> [ "," <args> ]
<arg>                   ::= <literal-value> | <placeholder> | <variable>
<modifier-chain>        ::= <modifier-pipe> <modifier> [ <modifier-chain> ]
<modifier>              ::= <filter> | <iterator>
<filter>                ::= <filter-name> [ <args-group> ]
<filter-name>           ::= <token>
<iterator>              ::= <iterator-name> [ <args-pipe> <accumulator-init> ] 
                              <args-pipe> <callback>
<accumulator-init>      ::= <arg>
<callback>              ::= "(" <cb-source> [ <cb-modifier-chain> ] ")"
<cb-source>             ::= <magic-variable> | <source>
<cb-modifier-chain>     ::= <modifier-pipe> <cb-modifier> [ <cb-modifier-chain> ]
<cb-modifier>           ::= <cb-filter> | <iterator>
<cb-filter>             ::= <filter-name> [ <cb-args-group> ]
<cb-args-group>         ::= <args-pipe> <cb-args>
<cb-args>               ::= <cb-arg> [ "," <cb-args> ]
<cb-arg>                ::= <arg> | <magic-variable>
<variable>              ::= <token> [ "[" <array-indices>  "]" ]
<magic-variable>        ::= "%" <variable>
<array-indices>         ::= <array-index> [ "," <array-indices> ]
<array-index>           ::= <integer> | <variable> | <placeholder>
<token>                 ::= <letter> [ <token-body> ]
<token-body>            ::= (<letter> | <digit> | "_" | "-") [ <token-body> ]
<literal-value>         ::= <quoted-string> | <integer> | <float> | <array-literal>
<array-literal>         ::= "[" [ <array-elements> ] "]"
<array-elements>        ::= <literal-value> [ "," <array-elements> ]
<integer>               ::= [ <number-sign> ] <digits>
<float>                 ::= <integer> "." <digits> [ <exponent> ]
<exponent>              ::= ( "e" | "E" ) <integer>
<number-sign>           ::= "+" | "-"
<digits>                ::= <digit> [ <digits> ]
<quoted-string>         ::= <single-quoted-string> | <double-quoted-string>
<single-quoted-string>  ::= <single-quote> [ <escaped-text> ] <single-quote>
<double-quoted-string>  ::= <double-quote> [ <escaped-text> ] <double-quote>
<modifier-pipe>         ::= ">" | "|"
<args-pipe>             ::= "<" | ":"
<escaped-text>          ::= (<non-escaping-char> | <escape-sequence>) [ <escaped-text> ]
<escape-sequence>       ::= "\" <escaping-char>
<escaping-char>         ::= "\" | <single-quote> | <double-quote>  | "n" | "r" | "t"
<non-escaping-char>     ::= Any Unicode character except an <escaping-char> or a
                            control character
<digit>                 ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<single-quote>          ::= U+0027
<double-quote>          ::= U+0022
Clone this wiki locally