JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
metaform: make run.php include (instead of being a symlink)
[wfpl.git] / encode.php
index 835f7cb..f5c1e24 100644 (file)
@@ -28,10 +28,18 @@ function enc_cap($str) {
        return $str;
 }
 
+# quote for placing between single quotes in php
+function enc_phpsq($str) {
+       $str = str_replace("\\", "\\\\", $str);
+       $str = str_replace("'", "\\'", $str);
+       return $str;
+}
+
 function enc_jsdq($str) {
        $str = enc_sql($str);
        $str = str_replace("\n", "\\n", $str);
-       return str_replace("\r", "\\r", $str);
+       $str = str_replace("\r", "\\r", $str);
+       return $str;
 }
 
 # encode for putting within double-quotes in SQL
@@ -61,13 +69,13 @@ function enc_htmlbr($str) {
 }
 
 # Encode for output in html. Preserves newlines and indentation by converting
-# newlines to <br> and spaces at the begining of lines to &nbsp;&nbsp;
+# newlines to <br> and spaces/tabs at the begining of lines to &nbsp;s
 #
 # Example: <p>~foo htmlbrtab~</p>
 function enc_htmlbrtab($str) {
        $str = enc_htmlbr($str);
-       $space_to_nbsp = create_function('$matches', 'return str_repeat(\'&nbsp;\', strlen($matches[0]) * 2);');
-       $str = preg_replace_callback("|^ *|m", $space_to_nbsp, $str);
+       $whitespace_to_nbsp = create_function('$matches', '$count = 0; $chars = str_split($matches[0]); foreach ($chars as $c) { if ($c == " ") { $count += 2; } else if ($c == "\t") { $count += 8; } } return str_repeat("&nbsp;", $count);');
+       $str = preg_replace_callback("|^[ \t]+|m", $whitespace_to_nbsp, $str);
        return $str;
 }
 
@@ -138,24 +146,24 @@ function enc_yesno($str) {
 }
 
 
-# add a tab at the begining of each non-empty line
+# add a tab at the begining of each line
 function enc_tab($str) {
-       $lines = explode("\n", $str);
-       $out = '';
-       foreach($lines as $line) {
-               if($line) {
-                       $out .= "\t$line";
-               }
-               $out .= "\n";
+       if('' . $str === '') {
+               return '';
        }
-
-       # remove the extra newline added above
-       return substr($out, 0, -1);
+       return "\t" . implode("\n\t", explode("\n", $str));
 }
 
-function enc_upper($str) {
+function enc_uppercase($str) {
        return strtoupper($str);
 }
+function enc_upper($str) { # depricated
+       return enc_uppercase($str);
+}
+
+function enc_lowercase($str) {
+       return strtolower($str);
+}
 
 # pass date in the form 2008-05-23
 # ercodes date as 05/23/2008
@@ -174,11 +182,16 @@ function enc_mdy($str) {
        return enc_mmddyyyy($str);
 }
 
-function enc_mmddyyyyhhmm($seconds) {
-       return date('m/d/Y g:ia', (int)$seconds);
+# pass unix timestamp or "2012-12-20 22:23:34"
+function enc_mmddyyyyhhmm($str) {
+       if(is_numeric($str)) {
+               return date('m/d/Y g:ia', (int)$str);
+       } else {
+               return enc_mmddyyyy(substr($str, 0, 10)) . substr($str, 10, 6);
+       }
 }
 
-# takes decimal
+# takes decimal number of hours
 # returns hh:mm
 function enc_hhmm($str) {
        if(strlen($str) == 0) {
@@ -190,7 +203,7 @@ function enc_hhmm($str) {
        return $str;
 }
 
-# takes decimal
+# takes decimal number of hours
 # returns hh:mm followed by "am" or "pm" with no space
 function enc_12hr($str) {
        if(strlen($str) == 0) {
@@ -212,32 +225,8 @@ function enc_12hr($str) {
 
 
 
-
-define('PULLDOWN_ARRAY', 0); define('PULLDOWN_HASH', 1); define('PULLDOWN_2D', 2);
-
-function pulldown_options_to_2d($options, $keys_from) {
-       # convert other types of input to value=>display hash
-       switch($keys_from) {
-               case PULLDOWN_HASH:
-                       $new_options = array();
-                       foreach($options as $value => $display) {
-                               $new_options[] = array($value, $display);
-                       }
-                       return $new_options;
-               case PULLDOWN_ARRAY:
-                       $new_options = array();
-                       foreach($options as $opt) {
-                               $new_options[] = array($opt, $opt);
-                       }
-                       return $new_options;
-               break;
-               case PULLDOWN_2D:
-                       return $options;
-               break;
-               default:
-                       die('pulldown_options_to_2d(): unknown value: "' . print_r($keys_from) . '" passed in $keys_from parameter');
-       }
-}
+# These are depricated! All but PULLDOWN_HASH still work, but you should update your code.
+define('PULLDOWN_AUTO', 0); define('PULLDOWN_ARRAY', 1); define('PULLDOWN_HASH', 2); define('PULLDOWN_2D', 3);
 
 
 # call this function before you run() the template so enc_options() knows what
@@ -247,22 +236,33 @@ function pulldown_options_to_2d($options, $keys_from) {
 #
 #   name: the name of the html control
 #
-#   options: an array of options to display in the pulldown/selectbox
-#
-#   keys_from: Set to one of:
-#        PULLDOWN_ARRAY: (default) values of $options are displayd and posted
-#        PULLDOWN_HASH: values of $options are display, keys are posted
-#        PULLDOWN_2D: $options is a 2 dimensional array.
-#                     $options[0][1] is displayed, $options[0][0] is posted.
-#                     $options[1][1] is displayed, $options[1][0] is posted.
+#   options: an array of options to display in the pulldown/selectbox. Each
+#   element can be either a string, or an array with two elements (first the
+#   value to post, and second the value to display in the pulldown)
 #
 #   multiple: UNTESTED set to true for multiple-select boxes. 
 
-function pulldown($name, $options, $keys_from = PULLDOWN_ARRAY, $multiple = false) {
-       $options = pulldown_options_to_2d($options, $keys_from);
-       $GLOBALS[$name . '_options'] = array();
-       $GLOBALS[$name . '_options']['options'] = $options;
-       $GLOBALS[$name . '_options']['multiple'] = $multiple;
+function pulldown($name, $in_options, $multiple = false) {
+       if($multiple === PULLDOWN_HASH) {
+               die('Webmaster error: PULLDOWN_HASH is depricated. Pass array(a,b) not a=>b');
+       }
+       if($multiple !== true) {
+               # Probably due to API change (removing 3rd argument) but don't bother
+               # emitting a warning, because the above warning handles the only
+               # important case.
+               $multiple = false;
+       }
+       $options = array();
+       foreach($in_options as $option) {
+               if(is_array($option)) {
+                       $options[] = $option;
+               } else {
+                       $options[] = array($option, $option);
+               }
+       }
+       $GLOBALS[$name . '_options'] = array(
+               'options' => $options,
+               'multiple' => $multiple);
 }
 
 # output a bunch of <option> tags
@@ -276,6 +276,21 @@ function enc_options($values, $name) {
        return encode_options($values, $GLOBALS[$name . '_options']['options'], PULLDOWN_2D);
 }
 
+# for radios and pulldowns:
+# pass posted value
+# returns what the user sees in the pulldown or on the radio button caption
+function enc_pulled($str, $name) {
+       if(!isset($GLOBALS[$name . '_options'])) {
+               die("pulldown('$name') must be called before this template can be run. See code/wfpl/encode.php");
+       }
+       foreach($GLOBALS[$name . '_options']['options'] as &$kv) {
+               if($kv[0] == $str) {
+                       return $kv[1];
+               }
+       }
+       return $str;
+}
+
 function enc_radio_n($str, $name, $n) {
        if(!isset($GLOBALS[$name . '_options'])) {
                die("pulldown('$name') must be called before this template can be run. See code/wfpl/encode.php");
@@ -341,12 +356,14 @@ function encode_options($selected, $options, $keys_from) {
        }
 
        $out = '';
-       foreach($options as $valdisp) {
-               list($value, $display) = $valdisp;
+       foreach($options as $option) {
+               list($value, $display, $arg3) = $option;
                $out .= '<option';
 
-               if(in_array($value, $selected)) {
-                       $out .= ' selected="selected"';
+               if($arg3 == 'disabled') {
+                       $out .= ' disabled';
+               } elseif(in_array($value, $selected)) {
+                       $out .= ' selected';
                }
 
                if($value !== $display || strpos($value, ' ') !== false) {
@@ -435,3 +452,30 @@ function enc_s($str) {
 
        return 's';
 }
+
+# turn http/ftp (s) urls into html links (and encode everything for html)
+# does not encode without protocol (eg "www.foo.com")
+# does not linkify email addresses
+function enc_linkify($str) {
+       $ret = '';
+       $even = true;
+       $pieces = preg_split("/((?:ht|f)tps?:\/\/[^ \,\"\n\r\t<]+)/is", $str, null, PREG_SPLIT_DELIM_CAPTURE);
+       foreach($pieces as $piece) {
+               if($even) {
+                       $ret .= enc_html($piece);
+               } else {
+                       $ret .= '<a href="' . enc_attr($piece) . '">' . enc_html($piece) . '</a>';
+               }
+               $even = !$even;
+       }
+       return $ret;
+}
+
+# turns a filename into the unix timestamp of that files modification date
+function enc_mtime($dummy, $filename) {
+       $stat = stat($filename);
+       if ($stat === false) {
+               return '';
+       }
+       return '' . $stat['mtime'];
+}