X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=template.php;h=6aba82b4b6d1139f0f1757d1f3ed9d1a16ba1518;hb=317dd86de6d8576196cf865109d621219fa2f187;hp=bbee573a28226abdc7dd438b3a1dfa17d7596f72;hpb=7060d3dd14bb0ad4bfb52aaf61d0567940d18bdc;p=wfpl.git diff --git a/template.php b/template.php index bbee573..6aba82b 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; @@ -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)); } @@ -398,13 +413,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); }