# note: for some reason this captures '<!--' but not '-->'.
$matches = preg_split("/(<!--)?(~[^~]*~)(?(1)-->)/", $string, -1, PREG_SPLIT_DELIM_CAPTURE);
foreach($matches as $match) {
- if(substr($match,0,1) == '~') {
+ if($match == '~~') $match = '~';
+ if(substr($match,0,1) == '~' and strlen($match) > 2) {
$args = explode(' ', substr($match,1,-1));
if(count($args) == 1 and $args[0] == '}') $name = '';
else $name = array_shift($args);
if(last($args) == '{') { # open block
- array_pop($args);
- # create a new sub-template
- # and add it to the parent.
- $tem =& tem_push($tem);
- $tem['parent']['pieces'][] =& $tem;
+ array_pop($args); # drop '{'
+ if(!is_string(last($tem['pieces']))) $tem['pieces'][] = '';
+ $tem =& tem_push($tem); # create a new sub-template
+ $tem['parent']['pieces'][] =& $tem; # as a piece of the parent
$tem['name'] = $name;
$tem['pieces'] = array();
$tem['args'] = $args;
} elseif(last($args) == '}') { # close block
- array_pop($args);
+ array_pop($args); # drop '}'
$cur = $tem['name'];
if($name && $name != $cur) {
die("Invalid template: tried to close '$name', but '$cur' is current.");
foreach($template['pieces'] as $tem) {
if(is_string($tem)) $output .= $tem;
elseif($tem['pieces']) { # sub-template
- $rows =& tem_get_rows($tem, $context);
+ $rows =& tem_row_data($tem, $context);
foreach($rows as $key => &$row) {
$context =& tem_push($context);
$context['data'] =& $row;
}
} else { # variable
- $output .= tem_get_enc($tem, $context);
+ $output .= tem_encoded_data($tem, $context);
}
}
return $output;
# To look up a key, we check each namespace (starting with the
# innermost one) until a value is found.
-function tem_find_scope($key, $context) {
+function tem_data_scope($key, $context) {
$scope = $context;
do{
if(array_key_exists($key, $scope['data'])) {
return array('parent' => $context);
}
-function tem_find_value($key, $context) {
- $scope = tem_find_scope($key, $context);
+function tem_get_data($key, $context) {
+ $scope = tem_data_scope($key, $context);
if($scope) return $scope['data'][$key];
}
# Return the value for a tag as a set of rows to fill a sub-template.
# If $tag has an arg, call the tem_auto function to munge the data.
-function &tem_get_rows($tag, $context)
+function &tem_row_data($tag, $context)
{
$key = $tag['name'];
if(count($tag['args'])) {
function_exists($func)
or die("ERROR: template auto function '$func' not found.<br>\n");
}
- $scope = tem_find_scope($key, $context);
+ $scope = tem_data_scope($key, $context);
if($func) $value = $func($key, $scope);
else $value = $scope['data'][$key];
}
# Return the value for a tag as an encoded string.
-function tem_get_enc($tag, $context)
+function tem_encoded_data($tag, $context)
{
$key = $tag['name'];
- $value = tem_find_value($key, $context);
+ $value = tem_get_data($key, $context);
foreach($tag['args'] as $encoding) {
$func = "enc_$encoding";
if(function_exists($func)) $value = $func($value, $key);