X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=template.php;h=b6025731b62a13d1d0a474bcdcba52b9501ca25a;hb=812c501d8bc3d69ac9a8766ade468ccc2d14263a;hp=bbee573a28226abdc7dd438b3a1dfa17d7596f72;hpb=7060d3dd14bb0ad4bfb52aaf61d0567940d18bdc;p=wfpl.git diff --git a/template.php b/template.php index bbee573..b602573 100644 --- a/template.php +++ b/template.php @@ -234,12 +234,16 @@ function tem_encoded_data($tag, $context) } +function is_sub_template($piece) { + return is_array($piece) and $piece['pieces']; +} # Return a hash containing the top-level sub-templates of tem. -function top_sub_templates($tem) { +function top_sub_templates($tem, $is_sub = 'is_sub_template') { + function_exists($is_sub) or die("no such function '$is_sub'."); $subs = array(); foreach($tem['pieces'] as $piece) { - if(is_array($piece) and $piece['pieces']) { + if($is_sub($piece)) { $subs[$piece['name']] = $piece; } } @@ -253,7 +257,8 @@ function merge_templates($main, $tem) { $subs = top_sub_templates($tem); foreach($main['pieces'] as $piece) { - if(is_array($piece) and !$piece['pieces'] and $subs[$piece['name']]) { + $sub = $subs[$piece['name']]; + if(is_array($piece) and !$piece['pieces'] and $sub and $sub['args'][0] != 'hide') { $piece = $subs[$piece['name']]; } $out['pieces'][] = $piece; @@ -274,7 +279,7 @@ function merge_templates($main, $tem) { # # # row content... -#
+#
# # # @@ -285,7 +290,7 @@ function tem_auto_sep(&$value, $key, $context) { } # 'show' sections will be shown unless the corresponding data value -# is false. We check only for false; 0 or '' will not work. +# is false (only false, not 0 or '' or array()). function tem_auto_show(&$value) { if($value !== false) $value = array(array()); @@ -296,7 +301,7 @@ function tem_auto_show(&$value) { # alternates between 'even' and 'odd'. function tem_auto_evenodd(&$values) { - $even = false; + $even = true; foreach($values as &$value) { $value['evenodd'] = $even ? 'even' : 'odd'; $even = !$even; @@ -311,6 +316,14 @@ function tem_auto_evenodd(&$values) { # Backward Compatibility # ---------------------- +function is_shown($piece) { + return $piece['args'][0] == 'hide'; +} + +function is_shown_sub_template($piece) { + return is_sub_template($piece) and is_shown($piece); +} + # Old-style templates don't show unless explicitly requested. function tem_auto_hide(&$value, $key, $context) { unset($context['data'][$key]); @@ -321,10 +334,12 @@ function tem_auto_hide(&$value, $key, $context) { # so hide it and insert a value slot for its expansion(s). function &tem_is_old_sub($name, &$template) { foreach($template['pieces'] as $key => &$piece) { - if(is_array($piece) and $piece['pieces']) { + if(is_sub_template($piece)) { if($piece['name'] == $name) { - if($piece['args'][0] != 'hide') { # if we haven't already + if(!is_shown($piece)) { + # hide template unless explicitly show()n. $piece['args'] = array('hide'); + # insert a value slot with the same name (for the expansion). $var = array('name' => $name, 'args' => array()); array_splice($template['pieces'], $key, 0, array($var)); } @@ -334,6 +349,7 @@ function &tem_is_old_sub($name, &$template) { if($tem) return $tem; } } + return false; } class tem { @@ -341,7 +357,7 @@ class tem { var $data; function tem() { - $this->template = array(); + $this->template = array('pieces' => array()); $this->data = array(); } @@ -367,7 +383,9 @@ class tem { function show($name) { $tem = tem_is_old_sub($name, $this->template); - $this->data[$name] .= fill_template($tem, $this->data); + if($tem) { + $this->data[$name] .= fill_template($tem, $this->data); + } } function show_separated($name) { @@ -398,13 +416,29 @@ class tem { print($this->run($tem)); } - function top_sub_names() { - return array_keys(top_sub_templates($this->template)); + # merge top-level sub-templates of $tem (object) into $this, + # supporting both new and old semantics. + function merge($tem) { + # append expansions to $this->data (old style) + + $subs = $tem->top_subs('is_shown_sub_template'); + if($subs) foreach($subs as $name => $val) { + $this->append($name, $val); + unset($tem->data[$name]); # so array_merge() won't overwrite things + } + + # 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); + } + + function top_sub_names($is_sub = 'is_sub_template') { + return array_keys(top_sub_templates($this->template, $is_sub)); } - function top_subs() { + function top_subs($is_sub = 'is_sub_template') { $ret = array(); - $names = $this->top_sub_names(); + $names = $this->top_sub_names($is_sub); foreach($names as $name) { $ret[$name] = $this->get($name); }