JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
clean up my urls
[wfpl.git] / template.php
index 396819d..06d02f5 100644 (file)
@@ -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
@@ -157,12 +157,14 @@ 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);
+               } else return array($value);
        } elseif($value || $value === 0 || $value === '0' || $value === '') {
                # value -- expand sub-template once using only parent values
                return array(array());
@@ -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.<br>\n");
+               if (!function_exists($auto_func)) {
+                       die("ERROR: template auto function '$auto_func' not found.<br>\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,8 +232,12 @@ 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.<br>\n");
+               if (function_exists($func)) {
+                       # NAMESPACIFY $func
+                       $value = $func($value, $key);
+               } else {
+                       die("ERROR: encoder function '$func' not found.<br>\n");
+               }
        }
        return $value;
 }
@@ -300,42 +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 === false
-
 function tem_auto_show(&$value) {
-       if($value === null) $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 === '') $value = null;
+       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) {
@@ -345,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;;
+}
+
 
 
 
@@ -397,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;
        }
@@ -510,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);