Usage of Template Engine
transition template engine for WackoWiki- push-style (with pull methods for e.g. csrf & i18n) lazy topo-ordered
- incremental building liberated from von neumann style applicative
Guide -> work in progress
What is a Template engine?
- https://en.wikipedia.org/wiki/Template_processor
- Separates visual code (HTML/CSS) from logic code (PHP).
A guide for the new template engine will hopefully follow soon.
- parent file -> associated template
- how do templates work
- concept and internals
-  $tpl->naming
- how to process conditions
- how to use filters
add an example template with all cases and examples into the
community folder- action/example.php
- action/template/example.tpl
classes
- templatest.php[link1]
- templatestescaper.php[link2]
- templatestfilters.php[link3]
- templatestsetter.php[link4]
- templatestuser.php[link5]
folders
-  _cache/template
-  action/template
-  formatter/highlight/template
-  handler/page/template
-  theme/_common
-  theme/default/appearance/template
In other words templates are available for actions, formatters, page handlers and themes.
1. Workflow
2. Base File
example.php$tpl->variable = $value;
2.1. Setting and leaving prefixes
__get/__set helper for generation internal tags:keeping stack of simple context name prefixes
$tpl->enter('menu_');
$tpl->leave();	
2.2. Assign template definition to variable
$variable = $tpl->definitionName();Adapt the
$tpl->myDefinition() name to the corresponding template definition you want to use.
$message = $tpl->definitionName();
$message->mode		= $this->_t('RenamePage');
$message->log_l_message	= $record['value'];
$this->set_message($message, 'success');	
[ == definitionName == ] <strong>[ ' mode ' ]</strong> [ ' log ' ] [ === log === ] <ul> [= l _ = <li>[ ' message ' ]</li> =] </ul>
2.3. Hints
Possible error sources2.3.1. Line endings
	
Use LF not CRLF line endings in WackoWiki templates.
	
	If you don't do this in templates, the templating engine will throw an error:
templatest: no main template found in action_or_handler/template/path.tpl2.3.2. Array building
creates a new array -> EXPLAIN, keep them in order$tpl->a_b_c$tpl->a_bsame array
$tpl->a_b$tpl->a_b_c2.3.3. Assign arrays
PHP<?php $colors = ['blue', 'green', 'red', 'yellow']; foreach ($colors as $color) { $tpl->n_color = $color; }
template
<ul> [= n _ = <li>[ ' color ' ]</li> =] </ul>
3. Template File
template/example.tplsimple example template [ === main === ] [ ' variable ' ]
3.1. Syntax
[ ' nonstatic ' ][ ' commit | void  // alternation hack ' ]3.1.1. Include
.include ../../../_common/_header.tpl.include _files.tpl.include _comments.tpl3.1.2. Definitions
[ === DefinitionTwo === ] [ ' im DefinitionOne ' ] [ ' title ' ] [ === DefinitionOne === ] <img src="[ ' db: theme_url ' ]icon/spacer.png" alt="[ ' title ' ]">
[ === main === ][ == sortsArr == ][ = UserList = ][ ==== // some text === ] commentThe amount of
= equal signs you chose is up to you.3.1.3. Inline definitions
[ = abc def = ... = ]
cut off old
[= ... =] block, and replace it with lone recall line3.1.4. Variables
[ ''' l UserList ''' ][ '' pagination '' ][ ' link ' ][ ' // comment ' ]The amount of
' single quotes you chose is up to you.3.1.5. Pull
[ ' pull: value ' ]
[ ' csrf: login ' ][ ' db: pwd_min_chars ' ][ ' format_t: ForgotLink ' ][ ' href: properties ' ][ ' _t: RealName ' ]3.2. Filters
[ ' variable | filter1 | filter2 | ... ' ]
[ ' comments | check 2 ' ][ ' note | e ' ][ ' username | e attr ' ][ ' page.hits | number 0 , . ' ][ ' a | replace desc uarr asc darr ' ][ ' count | enclose " (" ")" ' ][ ' preview | nl2br ' ][ ' watched | list WatchText UnwatchText | _t ' ][ ' created | time_format ' ]3.3. Examples
-> Available Pulls, Escaper and Filters[link6]3.4. Hints
Possible error sourcesput the
template.tpl in the right folderWarning: Creating default object from empty value in ...
3.5. Filter Chains
Often, multiple filters should be applied to some value in a particular order.[ ' variable | filter1 | filter2 | ... ' ]
Filter Chains provides a simple method by which filters may be chained together.
Filters are run in the order they are added to the filter chain.
4. Write your own templates
4.1. cheat sheet
[ '  ' ]
[ ' _t:  ' ]
[ ' db:  ' ]
[ ' href: ' ]
[ '  | checkbox ' ]
[ '  | check 0 ' ]
[ '  | number 0 , . ' ]
[ '  | number_format ' ]
[ '  | time_format ' ]
[ '  | pre ' ]
[ '  | e ' ]
[ '  | e attr ' ]
[=  _ =
=]
<form action="[ ' href: add_handler ' ]" method="post" name="add_name">
	[ ' csrf: add_name ' ]
<option value="[ ' id ' ]" [ ' sel | list "" 'selected ' ' ]>[ ' mode ' ]</option>
$tpl->enter('prefix_');
$tpl->leave();	
 [= l _ = <li> <a href="[ ' href ' ]" class="tag" rel="tag">[ ' category | e ' ]</a> </li> =] [ '' l link '' ] [ === link === ] <li> <a href="[ ' href ' ]" class="tag" rel="tag">[ ' category | e ' ]</a></li> </li>
-> Theme guide with example templates[link7]
5. open issues
meta templates?
What about?
[ ' integer | int ' ]5.1. next line issue for textarea and pre
-  Templatest strips all \nline breaks from[ ' body ' ]which is in this case undesired. We need all\nline breaks in body for POST or action include.
-  Additional the auto-indent feature may add \t.-  e.g. in form <input type="hidden" name="body" value="multi line body">, one should not serve HTML in PHP file and pass it as $tpl->kludge = HTML;
 
-  e.g. in form 
All data for
<textarea> or <pre> must be passed trough to escape filter as is. This applies to all
textarea fields used in the template engine.-  showhandler (body may have aprefield)
-  _commenthandler (body ->textarea)
-  edithandler (body ->textarea)
-  permissionshandler (list field holding privileges ->textarea)
-  filemetahandler (file caption ->textarea)
-  includeaction (body ->pre)
-  newsaction (body ->pre)
This example from the news action, breaks formatting of
<pre> boxes  
$tpl->include	= $this->action('include', ['page' => '/' . $page['tag'], 'notoc' => 0, 'nomark' => 1], true);	
This example below shows only the
\n issue$tpl->body = $body; // Ut::html($body) echo '<textarea>' . Ut::html($body) . "</textarea>\n";

workaround:
- hotfix, handlers
-  use [ ' data | pre ' ], add NO additional filter, run HTML escapingUt::html($data);prior in the PHP file if you have to
- [link1] https://codeberg.org/WackoWiki/wackowiki/src/branch/master/src/class/templatest.php
- [link2] https://codeberg.org/WackoWiki/wackowiki/src/branch/master/src/class/templatestescaper.php
- [link3] https://codeberg.org/WackoWiki/wackowiki/src/branch/master/src/class/templatestfilters.php
- [link4] https://codeberg.org/WackoWiki/wackowiki/src/branch/master/src/class/templatestsetter.php
- [link5] https://codeberg.org/WackoWiki/wackowiki/src/branch/master/src/class/templatestuser.php
- [link6] https://wackowiki.org/doc/Dev/Projects/Templatest/Filters
- [link7] https://wackowiki.org/doc/Doc/English/ThemeGuide