JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
clean up my urls
[wfpl.git] / encode.php
index b81a4fc..9a9bdbc 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
@@ -51,27 +59,27 @@ function enc_html($str) {
        return $str;
 }
 
-# Encode for output in html. Convert newlines to <br />
+# Encode for output in html. Convert newlines to <br>
 #
 # Example: <p>~foo htmlbr~</p>
 function enc_htmlbr($str) {
        $str = enc_html($str);
-       $str = str_replace("\n", "<br />\n", $str);
+       $str = str_replace("\n", "<br>\n", $str);
        return $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;
 }
 
-# Encode for output in html. Spaces converted to &nbsp; and \n to <br />
+# Encode for output in html. Spaces converted to &nbsp; and \n to <br>
 #
 # Example: <option value="12">~foo htmlbrnbsp~</option>
 function enc_htmlbrnbsp($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,58 +236,130 @@ 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
 function enc_options($values, $name) {
        if(!isset($GLOBALS[$name . '_options'])) {
-               die('pulldown() must be called before this template can be run. See code/wfpl/encode.php');
+               die("pulldown('$name') must be called before this template can be run. See wfpl/encode.php");
        }
        if($GLOBALS[$name . '_options']['multiple']) { # FIXME test this
                $values = explode(', ', $values);
        }
-       return encode_options($values, $GLOBALS[$name . '_options']['options'], PULLDOWN_2D);
+       return encode_options($values, $GLOBALS[$name . '_options']['options']);
 }
 
+# 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 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 wfpl/encode.php");
+       }
+
+       if(!isset($GLOBALS[$name . '_options']['options'][$n])) {
+               die("Template error: pulldown('$name') does not have element # $n");
+       }
+
+       $value = enc_attr($GLOBALS[$name . '_options']['options'][$n][0]);
+
+       if($str === $value) {
+               $value .= '" checked="checked';
+       }
+
+       return $value;
+}
+function enc_radio_0($str, $name) { return enc_radio_n($str, $name, 0); }
+function enc_radio_1($str, $name) { return enc_radio_n($str, $name, 1); }
+function enc_radio_2($str, $name) { return enc_radio_n($str, $name, 2); }
+function enc_radio_3($str, $name) { return enc_radio_n($str, $name, 3); }
+function enc_radio_4($str, $name) { return enc_radio_n($str, $name, 4); }
+function enc_radio_5($str, $name) { return enc_radio_n($str, $name, 5); }
+function enc_radio_6($str, $name) { return enc_radio_n($str, $name, 6); }
+function enc_radio_7($str, $name) { return enc_radio_n($str, $name, 7); }
+
+
+function enc_radio_caption_n($str, $name, $n) {
+       if(!isset($GLOBALS[$name . '_options'])) {
+               die("pulldown('$name') must be called before this template can be run. See wfpl/encode.php");
+       }
+
+       if(!isset($GLOBALS[$name . '_options']['options'][$n])) {
+               die("Template error: pulldown('$name') does not have element #$n");
+       }
+
+       return $GLOBALS[$name . '_options']['options'][$n][1];
+}
+function enc_radio_caption_0($str, $name) { return enc_radio_caption_n($str, $name, 0); }
+function enc_radio_caption_1($str, $name) { return enc_radio_caption_n($str, $name, 1); }
+function enc_radio_caption_2($str, $name) { return enc_radio_caption_n($str, $name, 2); }
+function enc_radio_caption_3($str, $name) { return enc_radio_caption_n($str, $name, 3); }
+function enc_radio_caption_4($str, $name) { return enc_radio_caption_n($str, $name, 4); }
+function enc_radio_caption_5($str, $name) { return enc_radio_caption_n($str, $name, 5); }
+function enc_radio_caption_6($str, $name) { return enc_radio_caption_n($str, $name, 6); }
+function enc_radio_caption_7($str, $name) { return enc_radio_caption_n($str, $name, 7); }
+
+
 # use this function along with a special template to generate the html for pulldowns and multiple select boxes.
 #
 # Parameters:
 #
 #    selected: can be a string or (for multiple-selects) an array
 #
-#    options, keys_from: see documentation for pulldown() above
-function encode_options($selected, $options, $keys_from) {
+#    options: see documentation for pulldown() above
+function encode_options($selected, $options) {
        if(!is_array($selected)) {
                $selected = array($selected);
        }
 
-       if($keys_from != PULLDOWN_2D) {
-               $options = pulldown_options_to_2d($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) {
@@ -317,22 +378,22 @@ function encode_options($selected, $options, $keys_from) {
        return $out;
 }
 
-$GLOBALS['wfpl_states_assoc'] = array("AL" => "Alabama", "AK" => "Alaska", "AZ" => "Arizona", "AR" => "Arkansas", "CA" => "California", "CO" => "Colorado", "CT" => "Connecticut", "DE" => "Delaware", "FL" => "Florida", "GA" => "Georgia", "HI" => "Hawaii", "ID" => "Idaho", "IL" => "Illinois", "IN" => "Indiana", "IA" => "Iowa", "KS" => "Kansas", "KY" => "Kentucky", "LA" => "Louisiana", "ME" => "Maine", "MD" => "Maryland", "MA" => "Massachusetts", "MI" => "Michigan", "MN" => "Minnesota", "MS" => "Mississippi", "MO" => "Missouri", "MT" => "Montana", "NE" => "Nebraska", "NV" => "Nevada", "NH" => "New Hampshire", "NJ" => "New Jersey", "NM" => "New Mexico", "NY" => "New York", "NC" => "North Carolina", "ND" => "North Dakota", "OH" => "Ohio", "OK" => "Oklahoma", "OR" => "Oregon", "PA" => "Pennsylvania", "RI" => "Rhode Island", "SC" => "South Carolina", "SD" => "South Dakota", "TN" => "Tennessee", "TX" => "Texas", "UT" => "Utah", "VT" => "Vermont", "VA" => "Virginia", "WA" => "Washington", "DC" => "Washington, DC", "WV" => "West Virginia", "WI" => "Wisconsin", "WY" => "Wyoming");
+$GLOBALS['wfpl_states_assoc'] = array(array("AL", "Alabama"), array("AK", "Alaska"), array("AZ", "Arizona"), array("AR", "Arkansas"), array("CA", "California"), array("CO", "Colorado"), array("CT", "Connecticut"), array("DE", "Delaware"), array("FL", "Florida"), array("GA", "Georgia"), array("HI", "Hawaii"), array("ID", "Idaho"), array("IL", "Illinois"), array("IN", "Indiana"), array("IA", "Iowa"), array("KS", "Kansas"), array("KY", "Kentucky"), array("LA", "Louisiana"), array("ME", "Maine"), array("MD", "Maryland"), array("MA", "Massachusetts"), array("MI", "Michigan"), array("MN", "Minnesota"), array("MS", "Mississippi"), array("MO", "Missouri"), array("MT", "Montana"), array("NE", "Nebraska"), array("NV", "Nevada"), array("NH", "New Hampshire"), array("NJ", "New Jersey"), array("NM", "New Mexico"), array("NY", "New York"), array("NC", "North Carolina"), array("ND", "North Dakota"), array("OH", "Ohio"), array("OK", "Oklahoma"), array("OR", "Oregon"), array("PA", "Pennsylvania"), array("RI", "Rhode Island"), array("SC", "South Carolina"), array("SD", "South Dakota"), array("TN", "Tennessee"), array("TX", "Texas"), array("UT", "Utah"), array("VT", "Vermont"), array("VA", "Virginia"), array("WA", "Washington"), array("DC", "Washington, DC"), array("WV", "West Virginia"), array("WI", "Wisconsin"), array("WY", "Wyoming"));
 
 # display <option>s
 function enc_states($str) {
        $ret = '';
 
-       return encode_options($str, $GLOBALS['wfpl_states_assoc'], PULLDOWN_HASH);
+       return encode_options($str, $GLOBALS['wfpl_states_assoc']);
 }
 
-$GLOBALS['wfpl_provinces_assoc'] = array("AB" => "Alberta", "BC" => "British Columbia", "MB" => "Manitoba", "NF" => "Newfoundland", "NB" => "New Brunswick", "NS" => "Nova Scotia", "NT" => "Northwest Territories", "NU" => "Nunavut", "ON" => "Ontario", "PE" => "Prince Edward Island", "QC" => "Quebec", "SK" => "Saskatchewan", "YT" => "Yukon Territory");
+$GLOBALS['wfpl_provinces_assoc'] = array(array("AB", "Alberta"), array("BC", "British Columbia"), array("MB", "Manitoba"), array("NF", "Newfoundland"), array("NB", "New Brunswick"), array("NS", "Nova Scotia"), array("NT", "Northwest Territories"), array("NU", "Nunavut"), array("ON", "Ontario"), array("PE", "Prince Edward Island"), array("QC", "Quebec"), array("SK", "Saskatchewan"), array("YT", "Yukon Territory"));
 
 # display <option>s
 function enc_provinces($str) {
        $ret = '';
 
-       return encode_options($str, $GLOBALS['wfpl_provinces_assoc'], PULLDOWN_HASH);
+       return encode_options($str, $GLOBALS['wfpl_provinces_assoc']);
 }
 
 # returns "odd", then "even", then "odd" etc.
@@ -387,3 +448,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'];
+}