JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
merge_templates now merges to any level, new api
authorJason Woofenden <jason@jasonwoof.com>
Fri, 6 Nov 2009 13:06:04 +0000 (08:06 -0500)
committerJason Woofenden <jason@jasonwoof.com>
Fri, 20 Nov 2009 00:02:49 +0000 (19:02 -0500)
New api: first argument is edited, so it contains references to 2nd. (ie it's
fast, but you can't use what you pass as the 2nd argument anymore.

This could be fixed by careful copying and reference updating as sub-templates
are copied to the first argument.

template.php

index af66590..3845c7c 100644 (file)
@@ -233,10 +233,14 @@ function tem_encoded_data($tag, $context)
 }
 
 
-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 +253,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
@@ -442,7 +457,7 @@ 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