X-Git-Url: https://jasonwoof.com/gitweb/?p=wfpl.git;a=blobdiff_plain;f=template.php;h=06d02f551279e8cf142de9a2e81f7754b568ca8e;hp=45857afcecde5532be9c7651ac7a7bbb552bf29a;hb=15459c86d0996ab3037b1738a8be6efd378c1258;hpb=ece89d7b32c6eb58bf3704ea360b9b292c551c7f diff --git a/template.php b/template.php index 45857af..06d02f5 100644 --- a/template.php +++ b/template.php @@ -37,9 +37,9 @@ # tem_auto_* function to munge the data, automating certain common use # cases. See the comments on the tem_auto functions for more details. -require_once('code/wfpl/encode.php'); -require_once('code/wfpl/file.php'); -require_once('code/wfpl/misc.php'); +require_once(__DIR__.'/'.'encode.php'); +require_once(__DIR__.'/'.'file.php'); +require_once(__DIR__.'/'.'misc.php'); # Top-Level Functions @@ -53,7 +53,7 @@ function template_file($filename, $data) { return fill_template(parse_template_file($filename), $data); } -function parse_template_file($filename) { +function &parse_template_file($filename) { return parse_template(file_get_contents($filename)); } @@ -61,7 +61,7 @@ function parse_template_file($filename) { # A template is a hash with a name string, a pieces array, and possibly # an args array. -function parse_template($string) { +function &parse_template($string) { $tem =& tem_push(); $tem['pieces'] = array(); $matches = preg_split('/()/', preg_replace('//', '$1', $string), -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); @@ -157,13 +157,15 @@ function &tem_push(&$stack = NULL) { # The middle form will be converted to the last form as we use it. -function tem_data_as_rows($value) { +function tem_data_as_rows($value, $key) { if(is_array($value)) { - # numeric keys, is already array of arrays -- expand sub-template for each. - if(array_key_exists(0, $value)) return $value; + # numeric keys + if(array_key_exists(0, $value)) { + if(is_array($value[0])) return $value; # already array of hashes. + else return columnize($value, $key); # key/value pairs -- expand sub-template once. - else return array($value); - } elseif($value) { + } else return array($value); + } elseif($value || $value === 0 || $value === '0' || $value === '') { # value -- expand sub-template once using only parent values return array(array()); } else { @@ -207,13 +209,17 @@ function &tem_row_data($tem, $context) if(count($tem['args'])) { $auto_func = "tem_auto_" . $tem['args'][0]; - function_exists($auto_func) - or die("ERROR: template auto function '$auto_func' not found.
\n"); + if (!function_exists($auto_func)) { + die("ERROR: template auto function '$auto_func' not found.
\n"); + } + # NAMESPACIFY $auto_func + } + if ($auto_func) { + $value = $auto_func($scope['data'][$key], $key, $scope, $tem['args']); } - if($auto_func) $value = $auto_func($scope['data'][$key], $key, $scope); else $value = $scope['data'][$key]; - $rows = tem_data_as_rows($value); + $rows = tem_data_as_rows($value, $key); if(is_array($value)) $scope['data'][$key] = $rows; return $rows; @@ -226,17 +232,25 @@ function tem_encoded_data($tag, $context) $value = tem_get_data($key, $context); foreach($tag['args'] as $encoding) { $func = "enc_$encoding"; - if(function_exists($func)) $value = $func($value, $key); - else die("ERROR: encoder function '$func' not found.
\n"); + if (function_exists($func)) { + # NAMESPACIFY $func + $value = $func($value, $key); + } else { + die("ERROR: encoder function '$func' not found.
\n"); + } } return $value; } -function is_sub_template($piece) { +function is_sub_template(&$piece) { return is_array($piece) and $piece['pieces']; } +function is_value_slot(&$piece) { + return is_array($piece) and !$piece['pieces']; +} + # Return a hash containing the top-level sub-templates of tem. function top_sub_templates($tem, $is_sub = 'is_sub_template') { function_exists($is_sub) or die("no such function '$is_sub'."); @@ -249,22 +263,33 @@ function top_sub_templates($tem, $is_sub = 'is_sub_template') { return $subs; } -# Replace top-level values in $main with top-level templates from $tem. -function merge_templates($main, $tem) { - $out = array('name' => $main['name'], 'pieces' => array()); - - $subs = top_sub_templates($tem); - - foreach($main['pieces'] as $piece) { - $sub = $subs[$piece['name']]; - if(is_array($piece) and !$piece['pieces'] and $sub and $sub['args'][0] != 'hide') { - $piece = $subs[$piece['name']]; +# merge $subs (sub_templates) into variables in $main (template) +function merge_sub_templates(&$main, &$subs) { + foreach($main['pieces'] as &$piece) { + if(is_array($piece)) { # not just text + if($piece['pieces']) { + # a sub-template in main + merge_sub_templates($piece, $subs); + } else { + # a value-slot in main + $sub = $subs[$piece['name']]; + if($sub and $sub['args'][0] != 'hide') { + $piece = $subs[$piece['name']]; + $piece['parent'] =& $main; + } + } } - $out['pieces'][] = $piece; } return $out; } +# Replace values in $main with top-level templates from $tem. +function merge_templates(&$main, &$tem) { + $subs = top_sub_templates($tem); + + merge_sub_templates($main, $subs); +} + # tem_auto functions @@ -285,34 +310,56 @@ function merge_templates($main, $tem) { function tem_auto_sep(&$value, $key, $context) { $rows =& $context['parent']['parent']; if($rows['cur'] != count($rows['rows'])-1) # last row? - return $value = true; # show once + return true; # show once } # auto-show once, only when this is the first row of the parent function tem_auto_last(&$value, $key, $context) { $rows =& $context['parent']['parent']; if($rows['cur'] == count($rows['rows'])-1) # last row? - return $value = true; # show once + return true; # show once } # auto-show once, only when this is the last row of the parent function tem_auto_first(&$value, $key, $context) { $rows =& $context['parent']['parent']; if($rows['cur'] == 0) # first row? - return $value = true; # show once + return true; # show once } -# 'show' sections will be shown unless the corresponding data value -# is false (only false, not 0 or '' or array()). - +# 'show' sections will be shown unless the corresponding data +# value === false function tem_auto_show(&$value) { - if($value !== false) $value = array(array()); + if($value === null) return true; return $value; } +# 'empty' sections will be shown only if the corresponding data value is the +# empty string +function tem_auto_empty(&$value) { + if($value === '') return true; + return null; +} + +# 'nonempty' sections will not be shown if the corresponding data +# value is the empty string +function tem_auto_nonempty(&$value) { + if($value === '') return null; + return $value; +} + +# 'unset' sections will not be shown if the corresponding data +# value is not set (opposite of default) +function tem_auto_unset(&$value) { + if($value === null) { + return ''; + } else { + return null; + } +} + # 'evenodd' sections are given an 'evenodd' attribute whose value # alternates between 'even' and 'odd'. - function tem_auto_evenodd(&$values) { $even = true; if($values) foreach($values as &$value) { @@ -322,6 +369,27 @@ function tem_auto_evenodd(&$values) { return $values; } +# 'once' sections are shown exactly once if the value is set (and not at all +# otherwise.) This is useful when an array value would otherwise cause the +# section to be displayed multiple times. +function tem_auto_once(&$value) { + if($value === null) return null; + return true; +} + +function tem_auto_once_if(&$value) { + if($value) return true; + return null; +} + +# 'once' sections are shown exactly once if php evaluates the value to false +# (and not at all otherwise.) This is useful when an array value would +# otherwise cause the section to be displayed multiple times. +function tem_auto_once_else(&$value) { + if($value) return null; + return true;; +} + @@ -374,10 +442,16 @@ class tem { $this->data = array(); } - function set($key, $value) { + function set($key, $value = true) { $this->data[$key] = $value; } + function sets($hash) { + foreach($hash as $key => $value) { + $this->set($key, $value); + } + } + function append($key, $value) { $this->data[$key] .= $value; } @@ -409,11 +483,11 @@ class tem { } function load_str($str) { - $this->template = parse_template($str); + $this->template =& parse_template($str); } function load($filename) { - $this->template = parse_template_file($filename); + $this->template =& parse_template_file($filename); } function run($tem = false) { @@ -442,7 +516,14 @@ class tem { # merge the data arrays and template trees (new style) $this->data = array_merge($this->data, $tem->data); - $this->template = merge_templates($this->template, $tem->template); + merge_templates($this->template, $tem->template); + } + + # see merge() above + function merge_file($filename) { + $other_tem = new tem(); + $other_tem->load($filename); + $this->merge($other_tem); } function top_sub_names($is_sub = 'is_sub_template') { @@ -480,11 +561,16 @@ function tem_prepend($key, $value) { $GLOBALS['wfpl_template']->prepend($key, $value); } -function tem_set($key, $value) { +function tem_set($key, $value = true) { tem_init(); $GLOBALS['wfpl_template']->set($key, $value); } +function tem_sets($hash) { + tem_init(); + $GLOBALS['wfpl_template']->sets($hash); +} + function tem_get($key) { tem_init(); return $GLOBALS['wfpl_template']->get($key); @@ -510,6 +596,16 @@ function tem_load($filename) { $GLOBALS['wfpl_template']->load($filename); } +function tem_merge($tem) { + tem_init(); + $GLOBALS['wfpl_template']->merge($tem); +} + +function tem_merge_file($filename) { + tem_init(); + $GLOBALS['wfpl_template']->merge_file($filename); +} + function tem_output($filename = false) { tem_init(); $GLOBALS['wfpl_template']->output($filename);