TemplateMarkup

Any content of a Fox template will become part of the new page entry. PmWiki page variables and page text variables are allowed and not rendered/evaluated, but posted unaltered.
Special replacement variables are used to mark where content from input fields are placed, and for rendering/evaluation of page variables and page text variables, and markup expressions:

{$$name}
is replaced by the value of the form input field named name
{$$name[]}
is replaced by the array values of the form input fields named name[]
{=$PageVar}, {PageName=$PageVar}
is replaced with the value of page variable named PageVar (from page PageName). Note that PageName can be a replacement variable.
{=$:ptvname}, {PageName=$:ptvname}
is replaced with the value of page text variable (PTV) named ptvname (from page PageName). Note that PageName can be a replacement variable.
{$$(timestamp)}
is replaced with the Unix timestamp of the time of form submission.
{$$(expr ... )}
Markup expressions with this syntax (two $ dollar signs after the initial curly bracket ) are evaluated when the template gets processed. Such template markup expressions can be nested (with use of round brackets, not curly brackets) and can contain replacement variables.
{$$(ftime 'format' 'when')}
is replaced with a formatted date or time string, using MarkupExpressions#ftime (this utilises the PHP strftime function). The {$$(strftime:format)} markup is deprecated. Example for a timestamp: {$$(ftime "%A %d %B %Y %H:%M:%S")}
{$$(date:format)}
is replaced with a formatted date or time string, according to the PHP date function. Example: {$$(date:d.m.Y - H:i)}
\n
is converted into a new line.
{$$foxgrouptitle}
this is created early and takes the value from a foxgroup field or parameter. It is for use where special characters and spaces may want to be preserved, as {$$foxgroup} will be replaced by a sanitised WikiWord valid for full pagenames. Use for instance to create a target group link: [[{$foxgroup}/| {$$foxgrouptitle}]]

To post replacement variables without them being replaced by a value, in order for instance to post a fox form defined as a template, use {$$$name} instead of {$$name} etc. To post replacement variables for page variables and PTVs, without them being evaluated, use {PageName=$$var} or {PageName=$$:ptv} instead of {PageName=$var} or {PageName=$:ptv} etc., i.e. add a $ symbol, which gets stripped on form submission.

delete links and buttons template markup

Install Attach:Wiki/FoxDelete/foxdelete.php and use the following template markup to generate delete links and buttons for deleting single lines or ranges.

{[foxdelline]}
is replaced by a delete link which can be used to delete the line it is part of.
{[foxdelline button]}
is replaced by a delete button for deleting a single line, as the link above.
{[foxdelrange]}
is replaced by a delete link which can be used to delete a range of lines, marked with special #foxbegin# and #foxend# markers. Any lines between these invisible markers, including a range delete link or button, will be deleted by clicking the link or button
{[foxdelrange button]}
is replaced by a delete button for deleting a range of lines, as the link above.
Delete link label and tooltip
a custom delete label for link or button can be specified inside the markup like for instance:
{[foxdelrange 'Delete Post']} : Delete Post will be the label for new delete links.
{[foxdelrange label='Delete Post' tooltip='delete section: abc']}: delete link with added tooltip.

Notes to function FoxTemplateEngine

Variable substitutions of contents of a Fox template file.

 Takes:
   $pagename    - the current pagename (for inserting in links)
   $template    - a string holding the template to interpret
   $fx          - an array of fields to use to interpret the template
   $tg        - an array of parameters associated to the target page  
   $linekeyseed - optional seed for the random key used to identify
                  parts of the output for later delete actions.
   $caller      - name of function which calls

 Returns:
   Returns a string containing the expanded template.

 Processing:
   Special template markup is searched for in the template string,
   and replaced, in order, as follows. Note that processing continues
   until no replacements are made, or a global iteration count is
   exceeded.

   (:.....:) and {(....)}
     if $EnablePostDirectives isn't set, then directives and markup 
     expressions are escaped so that they appear as-is in the given 
     text, without being executed or evalued. 
     FoxDefuseMarkup is called to do this work.

   {$$field}
     When the value of the field 'field' is a single string, it is
     substituted in place. When the field is an array of values, then
     the value substituted is the same as if the replaced string had
     been {$$field[{$$foxtindex}]}. The value of {$$foxtindex} is the
     index of the current template being expanded, in the array of
     templates, starting with zero.

   {$$field[num]}
     When the value of the field 'field' is an array, and 'num' is a
     number, then the element with index 'num' in the array is
     substituted. If the field is not an array, or if there is no
     such element, then the markup is simply removed. Note that when
     'num' is non-numeric, the markup is left unsubstituted, but do
     not rely on that, as further extensions may make use of
     non-numeric array indexes.

   {$$(function args...)}
     is replaced by the results of evaluating 'function' as if it
     were an ordinary Markup Expression (ie, as if it were the string
     '{(function args...)}' on a normal page). In order to provide
     backward compatibility, Fox.php adds a 'date' function to the
     list of valid markup extensions.

   {$$field[]}
     The existence of one or more special markups of this form cause
     a special processing mode to be entered. For each element in the
     longest array named by this form in the template, a duplicate of
     the template is produced. The first duplicate contains all
     values of the 0th element of the named arrays, the second
     duplicate contains the 1st elements and so on. Missing elements
     are treated as null strings. All of the duplicates are written
     to the target, in order. The template can be broken into
     multiple sections with {[foxsection]} markers, each such section
     being treated independantly in this manner.

   {$$$
     A final pass is made in which '{$$$' is replaced by '{$$'. No
     further expansion is done, even if this results in new valid
     field names. This provides a mechanism to add special template
     markup to a page, in order to create another template.