JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
merge_templates now merges to any level, new api
[wfpl.git] / 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