diff options
Diffstat (limited to 'lib/smarty/libs/plugins')
47 files changed, 4065 insertions, 0 deletions
diff --git a/lib/smarty/libs/plugins/block.textformat.php b/lib/smarty/libs/plugins/block.textformat.php new file mode 100644 index 000000000..b22b104a5 --- /dev/null +++ b/lib/smarty/libs/plugins/block.textformat.php @@ -0,0 +1,113 @@ +<?php +/** + * Smarty plugin to format text blocks + * + * @package Smarty + * @subpackage PluginsBlock + */ + +/** + * Smarty {textformat}{/textformat} block plugin + * + * Type: block function<br> + * Name: textformat<br> + * Purpose: format text a certain way with preset styles + * or custom wrap/indent settings<br> + * Params: + * <pre> + * - style - string (email) + * - indent - integer (0) + * - wrap - integer (80) + * - wrap_char - string ("\n") + * - indent_char - string (" ") + * - wrap_boundary - boolean (true) + * </pre> + * + * @link http://www.smarty.net/manual/en/language.function.textformat.php {textformat} + * (Smarty online manual) + * @param array $params parameters + * @param string $content contents of the block + * @param Smarty_Internal_Template $template template object + * @param boolean &$repeat repeat flag + * @return string content re-formatted + * @author Monte Ohrt <monte at ohrt dot com> + */ +function smarty_block_textformat($params, $content, $template, &$repeat) +{ + if (is_null($content)) { + return; + } + + $style = null; + $indent = 0; + $indent_first = 0; + $indent_char = ' '; + $wrap = 80; + $wrap_char = "\n"; + $wrap_cut = false; + $assign = null; + + foreach ($params as $_key => $_val) { + switch ($_key) { + case 'style': + case 'indent_char': + case 'wrap_char': + case 'assign': + $$_key = (string)$_val; + break; + + case 'indent': + case 'indent_first': + case 'wrap': + $$_key = (int)$_val; + break; + + case 'wrap_cut': + $$_key = (bool)$_val; + break; + + default: + trigger_error("textformat: unknown attribute '$_key'"); + } + } + + if ($style == 'email') { + $wrap = 72; + } + // split into paragraphs + $_paragraphs = preg_split('![\r\n]{2}!', $content); + $_output = ''; + + + foreach ($_paragraphs as &$_paragraph) { + if (!$_paragraph) { + continue; + } + // convert mult. spaces & special chars to single space + $_paragraph = preg_replace(array('!\s+!' . Smarty::$_UTF8_MODIFIER, '!(^\s+)|(\s+$)!' . Smarty::$_UTF8_MODIFIER), array(' ', ''), $_paragraph); + // indent first line + if ($indent_first > 0) { + $_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph; + } + // wordwrap sentences + if (Smarty::$_MBSTRING) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php'); + $_paragraph = smarty_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); + } else { + $_paragraph = wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); + } + // indent lines + if ($indent > 0) { + $_paragraph = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraph); + } + } + $_output = implode($wrap_char . $wrap_char, $_paragraphs); + + if ($assign) { + $template->assign($assign, $_output); + } else { + return $_output; + } +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/function.counter.php b/lib/smarty/libs/plugins/function.counter.php new file mode 100644 index 000000000..3906badf0 --- /dev/null +++ b/lib/smarty/libs/plugins/function.counter.php @@ -0,0 +1,78 @@ +<?php +/** + * Smarty plugin + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {counter} function plugin + * + * Type: function<br> + * Name: counter<br> + * Purpose: print out a counter value + * + * @author Monte Ohrt <monte at ohrt dot com> + * @link http://www.smarty.net/manual/en/language.function.counter.php {counter} + * (Smarty online manual) + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * @return string|null + */ +function smarty_function_counter($params, $template) +{ + static $counters = array(); + + $name = (isset($params['name'])) ? $params['name'] : 'default'; + if (!isset($counters[$name])) { + $counters[$name] = array( + 'start'=>1, + 'skip'=>1, + 'direction'=>'up', + 'count'=>1 + ); + } + $counter =& $counters[$name]; + + if (isset($params['start'])) { + $counter['start'] = $counter['count'] = (int)$params['start']; + } + + if (!empty($params['assign'])) { + $counter['assign'] = $params['assign']; + } + + if (isset($counter['assign'])) { + $template->assign($counter['assign'], $counter['count']); + } + + if (isset($params['print'])) { + $print = (bool)$params['print']; + } else { + $print = empty($counter['assign']); + } + + if ($print) { + $retval = $counter['count']; + } else { + $retval = null; + } + + if (isset($params['skip'])) { + $counter['skip'] = $params['skip']; + } + + if (isset($params['direction'])) { + $counter['direction'] = $params['direction']; + } + + if ($counter['direction'] == "down") + $counter['count'] -= $counter['skip']; + else + $counter['count'] += $counter['skip']; + + return $retval; + +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/function.cycle.php b/lib/smarty/libs/plugins/function.cycle.php new file mode 100644 index 000000000..1778ffb53 --- /dev/null +++ b/lib/smarty/libs/plugins/function.cycle.php @@ -0,0 +1,106 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {cycle} function plugin + * + * Type: function<br> + * Name: cycle<br> + * Date: May 3, 2002<br> + * Purpose: cycle through given values<br> + * Params: + * <pre> + * - name - name of cycle (optional) + * - values - comma separated list of values to cycle, or an array of values to cycle + * (this can be left out for subsequent calls) + * - reset - boolean - resets given var to true + * - print - boolean - print var or not. default is true + * - advance - boolean - whether or not to advance the cycle + * - delimiter - the value delimiter, default is "," + * - assign - boolean, assigns to template var instead of printed. + * </pre> + * Examples:<br> + * <pre> + * {cycle values="#eeeeee,#d0d0d0d"} + * {cycle name=row values="one,two,three" reset=true} + * {cycle name=row} + * </pre> + * + * @link http://www.smarty.net/manual/en/language.function.cycle.php {cycle} + * (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @author credit to Mark Priatel <mpriatel@rogers.com> + * @author credit to Gerard <gerard@interfold.com> + * @author credit to Jason Sweat <jsweat_php@yahoo.com> + * @version 1.3 + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * @return string|null + */ + +function smarty_function_cycle($params, $template) +{ + static $cycle_vars; + + $name = (empty($params['name'])) ? 'default' : $params['name']; + $print = (isset($params['print'])) ? (bool)$params['print'] : true; + $advance = (isset($params['advance'])) ? (bool)$params['advance'] : true; + $reset = (isset($params['reset'])) ? (bool)$params['reset'] : false; + + if (!isset($params['values'])) { + if(!isset($cycle_vars[$name]['values'])) { + trigger_error("cycle: missing 'values' parameter"); + return; + } + } else { + if(isset($cycle_vars[$name]['values']) + && $cycle_vars[$name]['values'] != $params['values'] ) { + $cycle_vars[$name]['index'] = 0; + } + $cycle_vars[$name]['values'] = $params['values']; + } + + if (isset($params['delimiter'])) { + $cycle_vars[$name]['delimiter'] = $params['delimiter']; + } elseif (!isset($cycle_vars[$name]['delimiter'])) { + $cycle_vars[$name]['delimiter'] = ','; + } + + if(is_array($cycle_vars[$name]['values'])) { + $cycle_array = $cycle_vars[$name]['values']; + } else { + $cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']); + } + + if(!isset($cycle_vars[$name]['index']) || $reset ) { + $cycle_vars[$name]['index'] = 0; + } + + if (isset($params['assign'])) { + $print = false; + $template->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]); + } + + if($print) { + $retval = $cycle_array[$cycle_vars[$name]['index']]; + } else { + $retval = null; + } + + if($advance) { + if ( $cycle_vars[$name]['index'] >= count($cycle_array) -1 ) { + $cycle_vars[$name]['index'] = 0; + } else { + $cycle_vars[$name]['index']++; + } + } + + return $retval; +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/function.fetch.php b/lib/smarty/libs/plugins/function.fetch.php new file mode 100644 index 000000000..eca1182d5 --- /dev/null +++ b/lib/smarty/libs/plugins/function.fetch.php @@ -0,0 +1,214 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {fetch} plugin + * + * Type: function<br> + * Name: fetch<br> + * Purpose: fetch file, web or ftp data and display results + * + * @link http://www.smarty.net/manual/en/language.function.fetch.php {fetch} + * (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * @return string|null if the assign parameter is passed, Smarty assigns the result to a template variable + */ +function smarty_function_fetch($params, $template) +{ + if (empty($params['file'])) { + trigger_error("[plugin] fetch parameter 'file' cannot be empty",E_USER_NOTICE); + return; + } + + // strip file protocol + if (stripos($params['file'], 'file://') === 0) { + $params['file'] = substr($params['file'], 7); + } + + $protocol = strpos($params['file'], '://'); + if ($protocol !== false) { + $protocol = strtolower(substr($params['file'], 0, $protocol)); + } + + if (isset($template->smarty->security_policy)) { + if ($protocol) { + // remote resource (or php stream, …) + if(!$template->smarty->security_policy->isTrustedUri($params['file'])) { + return; + } + } else { + // local file + if(!$template->smarty->security_policy->isTrustedResourceDir($params['file'])) { + return; + } + } + } + + $content = ''; + if ($protocol == 'http') { + // http fetch + if($uri_parts = parse_url($params['file'])) { + // set defaults + $host = $server_name = $uri_parts['host']; + $timeout = 30; + $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; + $agent = "Smarty Template Engine ". Smarty::SMARTY_VERSION; + $referer = ""; + $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/'; + $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : ''; + $_is_proxy = false; + if(empty($uri_parts['port'])) { + $port = 80; + } else { + $port = $uri_parts['port']; + } + if(!empty($uri_parts['user'])) { + $user = $uri_parts['user']; + } + if(!empty($uri_parts['pass'])) { + $pass = $uri_parts['pass']; + } + // loop through parameters, setup headers + foreach($params as $param_key => $param_value) { + switch($param_key) { + case "file": + case "assign": + case "assign_headers": + break; + case "user": + if(!empty($param_value)) { + $user = $param_value; + } + break; + case "pass": + if(!empty($param_value)) { + $pass = $param_value; + } + break; + case "accept": + if(!empty($param_value)) { + $accept = $param_value; + } + break; + case "header": + if(!empty($param_value)) { + if(!preg_match('![\w\d-]+: .+!',$param_value)) { + trigger_error("[plugin] invalid header format '".$param_value."'",E_USER_NOTICE); + return; + } else { + $extra_headers[] = $param_value; + } + } + break; + case "proxy_host": + if(!empty($param_value)) { + $proxy_host = $param_value; + } + break; + case "proxy_port": + if(!preg_match('!\D!', $param_value)) { + $proxy_port = (int) $param_value; + } else { + trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE); + return; + } + break; + case "agent": + if(!empty($param_value)) { + $agent = $param_value; + } + break; + case "referer": + if(!empty($param_value)) { + $referer = $param_value; + } + break; + case "timeout": + if(!preg_match('!\D!', $param_value)) { + $timeout = (int) $param_value; + } else { + trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE); + return; + } + break; + default: + trigger_error("[plugin] unrecognized attribute '".$param_key."'",E_USER_NOTICE); + return; + } + } + if(!empty($proxy_host) && !empty($proxy_port)) { + $_is_proxy = true; + $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout); + } else { + $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout); + } + + if(!$fp) { + trigger_error("[plugin] unable to fetch: $errstr ($errno)",E_USER_NOTICE); + return; + } else { + if($_is_proxy) { + fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n"); + } else { + fputs($fp, "GET $uri HTTP/1.0\r\n"); + } + if(!empty($host)) { + fputs($fp, "Host: $host\r\n"); + } + if(!empty($accept)) { + fputs($fp, "Accept: $accept\r\n"); + } + if(!empty($agent)) { + fputs($fp, "User-Agent: $agent\r\n"); + } + if(!empty($referer)) { + fputs($fp, "Referer: $referer\r\n"); + } + if(isset($extra_headers) && is_array($extra_headers)) { + foreach($extra_headers as $curr_header) { + fputs($fp, $curr_header."\r\n"); + } + } + if(!empty($user) && !empty($pass)) { + fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n"); + } + + fputs($fp, "\r\n"); + while(!feof($fp)) { + $content .= fgets($fp,4096); + } + fclose($fp); + $csplit = preg_split("!\r\n\r\n!",$content,2); + + $content = $csplit[1]; + + if(!empty($params['assign_headers'])) { + $template->assign($params['assign_headers'],preg_split("!\r\n!",$csplit[0])); + } + } + } else { + trigger_error("[plugin fetch] unable to parse URL, check syntax",E_USER_NOTICE); + return; + } + } else { + $content = @file_get_contents($params['file']); + if ($content === false) { + throw new SmartyException("{fetch} cannot read resource '" . $params['file'] ."'"); + } + } + + if (!empty($params['assign'])) { + $template->assign($params['assign'], $content); + } else { + return $content; + } +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/function.html_checkboxes.php b/lib/smarty/libs/plugins/function.html_checkboxes.php new file mode 100644 index 000000000..fb9584bbd --- /dev/null +++ b/lib/smarty/libs/plugins/function.html_checkboxes.php @@ -0,0 +1,216 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {html_checkboxes} function plugin + * + * File: function.html_checkboxes.php<br> + * Type: function<br> + * Name: html_checkboxes<br> + * Date: 24.Feb.2003<br> + * Purpose: Prints out a list of checkbox input types<br> + * Examples: + * <pre> + * {html_checkboxes values=$ids output=$names} + * {html_checkboxes values=$ids name='box' separator='<br>' output=$names} + * {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names} + * </pre> + * Params: + * <pre> + * - name (optional) - string default "checkbox" + * - values (required) - array + * - options (optional) - associative array + * - checked (optional) - array default not set + * - separator (optional) - ie <br> or + * - output (optional) - the output next to each checkbox + * - assign (optional) - assign the output as an array to this variable + * - escape (optional) - escape the content (not value), defaults to true + * </pre> + * + * @link http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} + * (Smarty online manual) + * @author Christopher Kvarme <christopher.kvarme@flashjab.com> + * @author credits to Monte Ohrt <monte at ohrt dot com> + * @version 1.0 + * @param array $params parameters + * @param object $template template object + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_checkboxes($params, $template) +{ + require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); + + $name = 'checkbox'; + $values = null; + $options = null; + $selected = array(); + $separator = ''; + $escape = true; + $labels = true; + $label_ids = false; + $output = null; + + $extra = ''; + + foreach($params as $_key => $_val) { + switch($_key) { + case 'name': + case 'separator': + $$_key = (string) $_val; + break; + + case 'escape': + case 'labels': + case 'label_ids': + $$_key = (bool) $_val; + break; + + case 'options': + $$_key = (array) $_val; + break; + + case 'values': + case 'output': + $$_key = array_values((array) $_val); + break; + + case 'checked': + case 'selected': + if (is_array($_val)) { + $selected = array(); + foreach ($_val as $_sel) { + if (is_object($_sel)) { + if (method_exists($_sel, "__toString")) { + $_sel = smarty_function_escape_special_chars((string) $_sel->__toString()); + } else { + trigger_error("html_checkboxes: selected attribute contains an object of class '". get_class($_sel) ."' without __toString() method", E_USER_NOTICE); + continue; + } + } else { + $_sel = smarty_function_escape_special_chars((string) $_sel); + } + $selected[$_sel] = true; + } + } elseif (is_object($_val)) { + if (method_exists($_val, "__toString")) { + $selected = smarty_function_escape_special_chars((string) $_val->__toString()); + } else { + trigger_error("html_checkboxes: selected attribute is an object of class '". get_class($_val) ."' without __toString() method", E_USER_NOTICE); + } + } else { + $selected = smarty_function_escape_special_chars((string) $_val); + } + break; + + case 'checkboxes': + trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING); + $options = (array) $_val; + break; + + case 'assign': + break; + + default: + if(!is_array($_val)) { + $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; + } else { + trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (!isset($options) && !isset($values)) + return ''; /* raise error here? */ + + $_html_result = array(); + + if (isset($options)) { + foreach ($options as $_key=>$_val) { + $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); + } + } else { + foreach ($values as $_i=>$_key) { + $_val = isset($output[$_i]) ? $output[$_i] : ''; + $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); + } + } + + if(!empty($params['assign'])) { + $template->assign($params['assign'], $_html_result); + } else { + return implode("\n", $_html_result); + } + +} + +function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids, $escape=true) { + $_output = ''; + + if (is_object($value)) { + if (method_exists($value, "__toString")) { + $value = (string) $value->__toString(); + } else { + trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE); + return ''; + } + } else { + $value = (string) $value; + } + + if (is_object($output)) { + if (method_exists($output, "__toString")) { + $output = (string) $output->__toString(); + } else { + trigger_error("html_options: output is an object of class '". get_class($output) ."' without __toString() method", E_USER_NOTICE); + return ''; + } + } else { + $output = (string) $output; + } + + if ($labels) { + if ($label_ids) { + $_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, '_', $name . '_' . $value)); + $_output .= '<label for="' . $_id . '">'; + } else { + $_output .= '<label>'; + } + } + + $name = smarty_function_escape_special_chars($name); + $value = smarty_function_escape_special_chars($value); + if ($escape) { + $output = smarty_function_escape_special_chars($output); + } + + $_output .= '<input type="checkbox" name="' . $name . '[]" value="' . $value . '"'; + + if ($labels && $label_ids) { + $_output .= ' id="' . $_id . '"'; + } + + if (is_array($selected)) { + if (isset($selected[$value])) { + $_output .= ' checked="checked"'; + } + } elseif ($value === $selected) { + $_output .= ' checked="checked"'; + } + + $_output .= $extra . ' />' . $output; + if ($labels) { + $_output .= '</label>'; + } + + $_output .= $separator; + return $_output; +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/function.html_image.php b/lib/smarty/libs/plugins/function.html_image.php new file mode 100644 index 000000000..6521966bb --- /dev/null +++ b/lib/smarty/libs/plugins/function.html_image.php @@ -0,0 +1,159 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {html_image} function plugin + * + * Type: function<br> + * Name: html_image<br> + * Date: Feb 24, 2003<br> + * Purpose: format HTML tags for the image<br> + * Examples: {html_image file="/images/masthead.gif"}<br> + * Output: <img src="/images/masthead.gif" width=400 height=23><br> + * Params: + * <pre> + * - file - (required) - file (and path) of image + * - height - (optional) - image height (default actual height) + * - width - (optional) - image width (default actual width) + * - basedir - (optional) - base directory for absolute paths, default is environment variable DOCUMENT_ROOT + * - path_prefix - prefix for path output (optional, default empty) + * </pre> + * + * @link http://www.smarty.net/manual/en/language.function.html.image.php {html_image} + * (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @author credits to Duda <duda@big.hu> + * @version 1.0 + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_image($params, $template) +{ + require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); + + $alt = ''; + $file = ''; + $height = ''; + $width = ''; + $extra = ''; + $prefix = ''; + $suffix = ''; + $path_prefix = ''; + $basedir = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : ''; + foreach($params as $_key => $_val) { + switch ($_key) { + case 'file': + case 'height': + case 'width': + case 'dpi': + case 'path_prefix': + case 'basedir': + $$_key = $_val; + break; + + case 'alt': + if (!is_array($_val)) { + $$_key = smarty_function_escape_special_chars($_val); + } else { + throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + + case 'link': + case 'href': + $prefix = '<a href="' . $_val . '">'; + $suffix = '</a>'; + break; + + default: + if (!is_array($_val)) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; + } else { + throw new SmartyException ("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (empty($file)) { + trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE); + return; + } + + if ($file[0] == '/') { + $_image_path = $basedir . $file; + } else { + $_image_path = $file; + } + + // strip file protocol + if (stripos($params['file'], 'file://') === 0) { + $params['file'] = substr($params['file'], 7); + } + + $protocol = strpos($params['file'], '://'); + if ($protocol !== false) { + $protocol = strtolower(substr($params['file'], 0, $protocol)); + } + + if (isset($template->smarty->security_policy)) { + if ($protocol) { + // remote resource (or php stream, …) + if(!$template->smarty->security_policy->isTrustedUri($params['file'])) { + return; + } + } else { + // local file + if(!$template->smarty->security_policy->isTrustedResourceDir($params['file'])) { + return; + } + } + } + + if (!isset($params['width']) || !isset($params['height'])) { + // FIXME: (rodneyrehm) getimagesize() loads the complete file off a remote resource, use custom [jpg,png,gif]header reader! + if (!$_image_data = @getimagesize($_image_path)) { + if (!file_exists($_image_path)) { + trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE); + return; + } else if (!is_readable($_image_path)) { + trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE); + return; + } else { + trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE); + return; + } + } + + if (!isset($params['width'])) { + $width = $_image_data[0]; + } + if (!isset($params['height'])) { + $height = $_image_data[1]; + } + } + + if (isset($params['dpi'])) { + if (strstr($_SERVER['HTTP_USER_AGENT'], 'Mac')) { + // FIXME: (rodneyrehm) wrong dpi assumption + // don't know who thought this up… even if it was true in 1998, it's definitely wrong in 2011. + $dpi_default = 72; + } else { + $dpi_default = 96; + } + $_resize = $dpi_default / $params['dpi']; + $width = round($width * $_resize); + $height = round($height * $_resize); + } + + return $prefix . '<img src="' . $path_prefix . $file . '" alt="' . $alt . '" width="' . $width . '" height="' . $height . '"' . $extra . ' />' . $suffix; +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/function.html_options.php b/lib/smarty/libs/plugins/function.html_options.php new file mode 100644 index 000000000..86266e269 --- /dev/null +++ b/lib/smarty/libs/plugins/function.html_options.php @@ -0,0 +1,174 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {html_options} function plugin + * + * Type: function<br> + * Name: html_options<br> + * Purpose: Prints the list of <option> tags generated from + * the passed parameters<br> + * Params: + * <pre> + * - name (optional) - string default "select" + * - values (required) - if no options supplied) - array + * - options (required) - if no values supplied) - associative array + * - selected (optional) - string default not set + * - output (required) - if not options supplied) - array + * - id (optional) - string default not set + * - class (optional) - string default not set + * </pre> + * + * @link http://www.smarty.net/manual/en/language.function.html.options.php {html_image} + * (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @author Ralf Strehle (minor optimization) <ralf dot strehle at yahoo dot de> + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_options($params, $template) +{ + require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); + + $name = null; + $values = null; + $options = null; + $selected = null; + $output = null; + $id = null; + $class = null; + + $extra = ''; + + foreach ($params as $_key => $_val) { + switch ($_key) { + case 'name': + case 'class': + case 'id': + $$_key = (string) $_val; + break; + + case 'options': + $options = (array) $_val; + break; + + case 'values': + case 'output': + $$_key = array_values((array) $_val); + break; + + case 'selected': + if (is_array($_val)) { + $selected = array(); + foreach ($_val as $_sel) { + if (is_object($_sel)) { + if (method_exists($_sel, "__toString")) { + $_sel = smarty_function_escape_special_chars((string) $_sel->__toString()); + } else { + trigger_error("html_options: selected attribute contains an object of class '". get_class($_sel) ."' without __toString() method", E_USER_NOTICE); + continue; + } + } else { + $_sel = smarty_function_escape_special_chars((string) $_sel); + } + $selected[$_sel] = true; + } + } elseif (is_object($_val)) { + if (method_exists($_val, "__toString")) { + $selected = smarty_function_escape_special_chars((string) $_val->__toString()); + } else { + trigger_error("html_options: selected attribute is an object of class '". get_class($_val) ."' without __toString() method", E_USER_NOTICE); + } + } else { + $selected = smarty_function_escape_special_chars((string) $_val); + } + break; + + default: + if (!is_array($_val)) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; + } else { + trigger_error("html_options: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (!isset($options) && !isset($values)) { + /* raise error here? */ + return ''; + } + + $_html_result = ''; + $_idx = 0; + + if (isset($options)) { + foreach ($options as $_key => $_val) { + $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx); + } + } else { + foreach ($values as $_i => $_key) { + $_val = isset($output[$_i]) ? $output[$_i] : ''; + $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected, $id, $class, $_idx); + } + } + + if (!empty($name)) { + $_html_class = !empty($class) ? ' class="'.$class.'"' : ''; + $_html_id = !empty($id) ? ' id="'.$id.'"' : ''; + $_html_result = '<select name="' . $name . '"' . $_html_class . $_html_id . $extra . '>' . "\n" . $_html_result . '</select>' . "\n"; + } + + return $_html_result; +} + +function smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, &$idx) +{ + if (!is_array($value)) { + $_key = smarty_function_escape_special_chars($key); + $_html_result = '<option value="' . $_key . '"'; + if (is_array($selected)) { + if (isset($selected[$_key])) { + $_html_result .= ' selected="selected"'; + } + } elseif ($_key === $selected) { + $_html_result .= ' selected="selected"'; + } + $_html_class = !empty($class) ? ' class="'.$class.' option"' : ''; + $_html_id = !empty($id) ? ' id="'.$id.'-'.$idx.'"' : ''; + if (is_object($value)) { + if (method_exists($value, "__toString")) { + $value = smarty_function_escape_special_chars((string) $value->__toString()); + } else { + trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE); + return ''; + } + } + $_html_result .= $_html_class . $_html_id . '>' . $value . '</option>' . "\n"; + $idx++; + } else { + $_idx = 0; + $_html_result = smarty_function_html_options_optgroup($key, $value, $selected, !empty($id) ? ($id.'-'.$idx) : null, $class, $_idx); + $idx++; + } + return $_html_result; +} + +function smarty_function_html_options_optgroup($key, $values, $selected, $id, $class, &$idx) +{ + $optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n"; + foreach ($values as $key => $value) { + $optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected, $id, $class, $idx); + } + $optgroup_html .= "</optgroup>\n"; + return $optgroup_html; +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/function.html_radios.php b/lib/smarty/libs/plugins/function.html_radios.php new file mode 100644 index 000000000..7c830724a --- /dev/null +++ b/lib/smarty/libs/plugins/function.html_radios.php @@ -0,0 +1,200 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {html_radios} function plugin + * + * File: function.html_radios.php<br> + * Type: function<br> + * Name: html_radios<br> + * Date: 24.Feb.2003<br> + * Purpose: Prints out a list of radio input types<br> + * Params: + * <pre> + * - name (optional) - string default "radio" + * - values (required) - array + * - options (required) - associative array + * - checked (optional) - array default not set + * - separator (optional) - ie <br> or + * - output (optional) - the output next to each radio button + * - assign (optional) - assign the output as an array to this variable + * - escape (optional) - escape the content (not value), defaults to true + * </pre> + * Examples: + * <pre> + * {html_radios values=$ids output=$names} + * {html_radios values=$ids name='box' separator='<br>' output=$names} + * {html_radios values=$ids checked=$checked separator='<br>' output=$names} + * </pre> + * + * @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios} + * (Smarty online manual) + * @author Christopher Kvarme <christopher.kvarme@flashjab.com> + * @author credits to Monte Ohrt <monte at ohrt dot com> + * @version 1.0 + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_radios($params, $template) +{ + require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); + + $name = 'radio'; + $values = null; + $options = null; + $selected = null; + $separator = ''; + $escape = true; + $labels = true; + $label_ids = false; + $output = null; + $extra = ''; + + foreach($params as $_key => $_val) { + switch ($_key) { + case 'name': + case 'separator': + $$_key = (string) $_val; + break; + + case 'checked': + case 'selected': + if (is_array($_val)) { + trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING); + } elseif (is_object($_val)) { + if (method_exists($_val, "__toString")) { + $selected = smarty_function_escape_special_chars((string) $_val->__toString()); + } else { + trigger_error("html_radios: selected attribute is an object of class '". get_class($_val) ."' without __toString() method", E_USER_NOTICE); + } + } else { + $selected = (string) $_val; + } + break; + + case 'escape': + case 'labels': + case 'label_ids': + $$_key = (bool) $_val; + break; + + case 'options': + $$_key = (array) $_val; + break; + + case 'values': + case 'output': + $$_key = array_values((array) $_val); + break; + + case 'radios': + trigger_error('html_radios: the use of the "radios" attribute is deprecated, use "options" instead', E_USER_WARNING); + $options = (array) $_val; + break; + + case 'assign': + break; + + default: + if (!is_array($_val)) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; + } else { + trigger_error("html_radios: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (!isset($options) && !isset($values)) { + /* raise error here? */ + return ''; + } + + $_html_result = array(); + + if (isset($options)) { + foreach ($options as $_key => $_val) { + $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); + } + } else { + foreach ($values as $_i => $_key) { + $_val = isset($output[$_i]) ? $output[$_i] : ''; + $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); + } + } + + if (!empty($params['assign'])) { + $template->assign($params['assign'], $_html_result); + } else { + return implode("\n", $_html_result); + } +} + +function smarty_function_html_radios_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids, $escape) +{ + $_output = ''; + + if (is_object($value)) { + if (method_exists($value, "__toString")) { + $value = (string) $value->__toString(); + } else { + trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE); + return ''; + } + } else { + $value = (string) $value; + } + + if (is_object($output)) { + if (method_exists($output, "__toString")) { + $output = (string) $output->__toString(); + } else { + trigger_error("html_options: output is an object of class '". get_class($output) ."' without __toString() method", E_USER_NOTICE); + return ''; + } + } else { + $output = (string) $output; + } + + if ($labels) { + if ($label_ids) { + $_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, '_', $name . '_' . $value)); + $_output .= '<label for="' . $_id . '">'; + } else { + $_output .= '<label>'; + } + } + + $name = smarty_function_escape_special_chars($name); + $value = smarty_function_escape_special_chars($value); + if ($escape) { + $output = smarty_function_escape_special_chars($output); + } + + $_output .= '<input type="radio" name="' . $name . '" value="' . $value . '"'; + + if ($labels && $label_ids) { + $_output .= ' id="' . $_id . '"'; + } + + if ($value === $selected) { + $_output .= ' checked="checked"'; + } + + $_output .= $extra . ' />' . $output; + if ($labels) { + $_output .= '</label>'; + } + + $_output .= $separator; + return $_output; +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/function.html_select_date.php b/lib/smarty/libs/plugins/function.html_select_date.php new file mode 100644 index 000000000..13c500354 --- /dev/null +++ b/lib/smarty/libs/plugins/function.html_select_date.php @@ -0,0 +1,394 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * @ignore + */ +require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); +/** + * @ignore + */ +require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); + +/** + * Smarty {html_select_date} plugin + * + * Type: function<br> + * Name: html_select_date<br> + * Purpose: Prints the dropdowns for date selection. + * + * ChangeLog: + * <pre> + * - 1.0 initial release + * - 1.1 added support for +/- N syntax for begin + * and end year values. (Monte) + * - 1.2 added support for yyyy-mm-dd syntax for + * time value. (Jan Rosier) + * - 1.3 added support for choosing format for + * month values (Gary Loescher) + * - 1.3.1 added support for choosing format for + * day values (Marcus Bointon) + * - 1.3.2 support negative timestamps, force year + * dropdown to include given date unless explicitly set (Monte) + * - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that + * of 0000-00-00 dates (cybot, boots) + * - 2.0 complete rewrite for performance, + * added attributes month_names, *_id + * </pre> + * + * @link http://www.smarty.net/manual/en/language.function.html.select.date.php {html_select_date} + * (Smarty online manual) + * @version 2.0 + * @author Andrei Zmievski + * @author Monte Ohrt <monte at ohrt dot com> + * @author Rodney Rehm + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * @return string + */ +function smarty_function_html_select_date($params, $template) +{ + // generate timestamps used for month names only + static $_month_timestamps = null; + static $_current_year = null; + if ($_month_timestamps === null) { + $_current_year = date('Y'); + $_month_timestamps = array(); + for ($i = 1; $i <= 12; $i++) { + $_month_timestamps[$i] = mktime(0, 0, 0, $i, 1, 2000); + } + } + + /* Default values. */ + $prefix = "Date_"; + $start_year = null; + $end_year = null; + $display_days = true; + $display_months = true; + $display_years = true; + $month_format = "%B"; + /* Write months as numbers by default GL */ + $month_value_format = "%m"; + $day_format = "%02d"; + /* Write day values using this format MB */ + $day_value_format = "%d"; + $year_as_text = false; + /* Display years in reverse order? Ie. 2000,1999,.... */ + $reverse_years = false; + /* Should the select boxes be part of an array when returned from PHP? + e.g. setting it to "birthday", would create "birthday[Day]", + "birthday[Month]" & "birthday[Year]". Can be combined with prefix */ + $field_array = null; + /* <select size>'s of the different <select> tags. + If not set, uses default dropdown. */ + $day_size = null; + $month_size = null; + $year_size = null; + /* Unparsed attributes common to *ALL* the <select>/<input> tags. + An example might be in the template: all_extra ='class ="foo"'. */ + $all_extra = null; + /* Separate attributes for the tags. */ + $day_extra = null; + $month_extra = null; + $year_extra = null; + /* Order in which to display the fields. + "D" -> day, "M" -> month, "Y" -> year. */ + $field_order = 'MDY'; + /* String printed between the different fields. */ + $field_separator = "\n"; + $option_separator = "\n"; + $time = null; + // $all_empty = null; + // $day_empty = null; + // $month_empty = null; + // $year_empty = null; + $extra_attrs = ''; + $all_id = null; + $day_id = null; + $month_id = null; + $year_id = null; + + foreach ($params as $_key => $_value) { + switch ($_key) { + case 'time': + if (!is_array($_value) && $_value !== null) { + $time = smarty_make_timestamp($_value); + } + break; + + case 'month_names': + if (is_array($_value) && count($_value) == 12) { + $$_key = $_value; + } else { + trigger_error("html_select_date: month_names must be an array of 12 strings", E_USER_NOTICE); + } + break; + + case 'prefix': + case 'field_array': + case 'start_year': + case 'end_year': + case 'day_format': + case 'day_value_format': + case 'month_format': + case 'month_value_format': + case 'day_size': + case 'month_size': + case 'year_size': + case 'all_extra': + case 'day_extra': + case 'month_extra': + case 'year_extra': + case 'field_order': + case 'field_separator': + case 'option_separator': + case 'all_empty': + case 'month_empty': + case 'day_empty': + case 'year_empty': + case 'all_id': + case 'month_id': + case 'day_id': + case 'year_id': + $$_key = (string)$_value; + break; + + case 'display_days': + case 'display_months': + case 'display_years': + case 'year_as_text': + case 'reverse_years': + $$_key = (bool)$_value; + break; + + default: + if (!is_array($_value)) { + $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; + } else { + trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + // Note: date() is faster than strftime() + // Note: explode(date()) is faster than date() date() date() + if (isset($params['time']) && is_array($params['time'])) { + if (isset($params['time'][$prefix . 'Year'])) { + // $_REQUEST[$field_array] given + foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = isset($params['time'][$prefix . $_elementName]) + ? $params['time'][$prefix . $_elementName] + : date($_elementKey); + } + $time = mktime(0, 0, 0, $_month, $_day, $_year); + } elseif (isset($params['time'][$field_array][$prefix . 'Year'])) { + // $_REQUEST given + foreach (array('Y' => 'Year', 'm' => 'Month', 'd' => 'Day') as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = isset($params['time'][$field_array][$prefix . $_elementName]) + ? $params['time'][$field_array][$prefix . $_elementName] + : date($_elementKey); + } + $time = mktime(0, 0, 0, $_month, $_day, $_year); + } else { + // no date found, use NOW + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); + } + } elseif ($time === null) { + if (array_key_exists('time', $params)) { + $_year = $_month = $_day = $time = null; + } else { + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); + } + } else { + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d', $time)); + } + + // make syntax "+N" or "-N" work with $start_year and $end_year + // Note preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match) is slower than trim+substr + foreach (array('start', 'end') as $key) { + $key .= '_year'; + $t = $$key; + if ($t === null) { + $$key = (int)$_current_year; + } else if ($t[0] == '+') { + $$key = (int)($_current_year + trim(substr($t, 1))); + } else if ($t[0] == '-') { + $$key = (int)($_current_year - trim(substr($t, 1))); + } else { + $$key = (int)$$key; + } + } + + // flip for ascending or descending + if (($start_year > $end_year && !$reverse_years) || ($start_year < $end_year && $reverse_years)) { + $t = $end_year; + $end_year = $start_year; + $start_year = $t; + } + + // generate year <select> or <input> + if ($display_years) { + $_html_years = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Year]') : ($prefix . 'Year'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($year_extra) { + $_extra .= ' ' . $year_extra; + } + + if ($year_as_text) { + $_html_years = '<input type="text" name="' . $_name . '" value="' . $_year . '" size="4" maxlength="4"' . $_extra . $extra_attrs . ' />'; + } else { + $_html_years = '<select name="' . $_name . '"'; + if ($year_id !== null || $all_id !== null) { + $_html_years .= ' id="' . smarty_function_escape_special_chars( + $year_id !== null ? ( $year_id ? $year_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) + ) . '"'; + } + if ($year_size) { + $_html_years .= ' size="' . $year_size . '"'; + } + $_html_years .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($year_empty) || isset($all_empty)) { + $_html_years .= '<option value="">' . ( isset($year_empty) ? $year_empty : $all_empty ) . '</option>' . $option_separator; + } + + $op = $start_year > $end_year ? -1 : 1; + for ($i=$start_year; $op > 0 ? $i <= $end_year : $i >= $end_year; $i += $op) { + $_html_years .= '<option value="' . $i . '"' + . ($_year == $i ? ' selected="selected"' : '') + . '>' . $i . '</option>' . $option_separator; + } + + $_html_years .= '</select>'; + } + } + + // generate month <select> or <input> + if ($display_months) { + $_html_month = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Month]') : ($prefix . 'Month'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($month_extra) { + $_extra .= ' ' . $month_extra; + } + + $_html_months = '<select name="' . $_name . '"'; + if ($month_id !== null || $all_id !== null) { + $_html_months .= ' id="' . smarty_function_escape_special_chars( + $month_id !== null ? ( $month_id ? $month_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) + ) . '"'; + } + if ($month_size) { + $_html_months .= ' size="' . $month_size . '"'; + } + $_html_months .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($month_empty) || isset($all_empty)) { + $_html_months .= '<option value="">' . ( isset($month_empty) ? $month_empty : $all_empty ) . '</option>' . $option_separator; + } + + for ($i = 1; $i <= 12; $i++) { + $_val = sprintf('%02d', $i); + $_text = isset($month_names) ? smarty_function_escape_special_chars($month_names[$i]) : ($month_format == "%m" ? $_val : strftime($month_format, $_month_timestamps[$i])); + $_value = $month_value_format == "%m" ? $_val : strftime($month_value_format, $_month_timestamps[$i]); + $_html_months .= '<option value="' . $_value . '"' + . ($_val == $_month ? ' selected="selected"' : '') + . '>' . $_text . '</option>' . $option_separator; + } + + $_html_months .= '</select>'; + } + + // generate day <select> or <input> + if ($display_days) { + $_html_day = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Day]') : ($prefix . 'Day'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($day_extra) { + $_extra .= ' ' . $day_extra; + } + + $_html_days = '<select name="' . $_name . '"'; + if ($day_id !== null || $all_id !== null) { + $_html_days .= ' id="' . smarty_function_escape_special_chars( + $day_id !== null ? ( $day_id ? $day_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) + ) . '"'; + } + if ($day_size) { + $_html_days .= ' size="' . $day_size . '"'; + } + $_html_days .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($day_empty) || isset($all_empty)) { + $_html_days .= '<option value="">' . ( isset($day_empty) ? $day_empty : $all_empty ) . '</option>' . $option_separator; + } + + for ($i = 1; $i <= 31; $i++) { + $_val = sprintf('%02d', $i); + $_text = $day_format == '%02d' ? $_val : sprintf($day_format, $i); + $_value = $day_value_format == '%02d' ? $_val : sprintf($day_value_format, $i); + $_html_days .= '<option value="' . $_value . '"' + . ($_val == $_day ? ' selected="selected"' : '') + . '>' . $_text . '</option>' . $option_separator; + } + + $_html_days .= '</select>'; + } + + // order the fields for output + $_html = ''; + for ($i=0; $i <= 2; $i++) { + switch ($field_order[$i]) { + case 'Y': + case 'y': + if (isset($_html_years)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $_html_years; + } + break; + + case 'm': + case 'M': + if (isset($_html_months)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $_html_months; + } + break; + + case 'd': + case 'D': + if (isset($_html_days)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $_html_days; + } + break; + } + } + return $_html; +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/function.html_select_time.php b/lib/smarty/libs/plugins/function.html_select_time.php new file mode 100644 index 000000000..9fb8038e4 --- /dev/null +++ b/lib/smarty/libs/plugins/function.html_select_time.php @@ -0,0 +1,366 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * @ignore + */ +require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); +/** + * @ignore + */ +require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); + +/** + * Smarty {html_select_time} function plugin + * + * Type: function<br> + * Name: html_select_time<br> + * Purpose: Prints the dropdowns for time selection + * + * @link http://www.smarty.net/manual/en/language.function.html.select.time.php {html_select_time} + * (Smarty online manual) + * @author Roberto Berto <roberto@berto.net> + * @author Monte Ohrt <monte AT ohrt DOT com> + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * @return string + * @uses smarty_make_timestamp() + */ +function smarty_function_html_select_time($params, $template) +{ + $prefix = "Time_"; + $field_array = null; + $field_separator = "\n"; + $option_separator = "\n"; + $time = null; + + $display_hours = true; + $display_minutes = true; + $display_seconds = true; + $display_meridian = true; + + $hour_format = '%02d'; + $hour_value_format = '%02d'; + $minute_format = '%02d'; + $minute_value_format = '%02d'; + $second_format = '%02d'; + $second_value_format = '%02d'; + + $hour_size = null; + $minute_size = null; + $second_size = null; + $meridian_size = null; + + $all_empty = null; + $hour_empty = null; + $minute_empty = null; + $second_empty = null; + $meridian_empty = null; + + $all_id = null; + $hour_id = null; + $minute_id = null; + $second_id = null; + $meridian_id = null; + + $use_24_hours = true; + $minute_interval = 1; + $second_interval = 1; + + $extra_attrs = ''; + $all_extra = null; + $hour_extra = null; + $minute_extra = null; + $second_extra = null; + $meridian_extra = null; + + foreach ($params as $_key => $_value) { + switch ($_key) { + case 'time': + if (!is_array($_value) && $_value !== null) { + $time = smarty_make_timestamp($_value); + } + break; + + case 'prefix': + case 'field_array': + + case 'field_separator': + case 'option_separator': + + case 'all_extra': + case 'hour_extra': + case 'minute_extra': + case 'second_extra': + case 'meridian_extra': + + case 'all_empty': + case 'hour_empty': + case 'minute_empty': + case 'second_empty': + case 'meridian_empty': + + case 'all_id': + case 'hour_id': + case 'minute_id': + case 'second_id': + case 'meridian_id': + + case 'hour_format': + case 'hour_value_format': + case 'minute_format': + case 'minute_value_format': + case 'second_format': + case 'second_value_format': + $$_key = (string)$_value; + break; + + case 'display_hours': + case 'display_minutes': + case 'display_seconds': + case 'display_meridian': + case 'use_24_hours': + $$_key = (bool)$_value; + break; + + case 'minute_interval': + case 'second_interval': + + case 'hour_size': + case 'minute_size': + case 'second_size': + case 'meridian_size': + $$_key = (int)$_value; + break; + + default: + if (!is_array($_value)) { + $extra_attrs .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_value) . '"'; + } else { + trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE); + } + break; + } + } + + if (isset($params['time']) && is_array($params['time'])) { + if (isset($params['time'][$prefix . 'Hour'])) { + // $_REQUEST[$field_array] given + foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = isset($params['time'][$prefix . $_elementName]) + ? $params['time'][$prefix . $_elementName] + : date($_elementKey); + } + $_meridian = isset($params['time'][$prefix . 'Meridian']) + ? (' ' . $params['time'][$prefix . 'Meridian']) + : ''; + $time = strtotime( $_hour . ':' . $_minute . ':' . $_second . $_meridian ); + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); + } elseif (isset($params['time'][$field_array][$prefix . 'Hour'])) { + // $_REQUEST given + foreach (array('H' => 'Hour', 'i' => 'Minute', 's' => 'Second') as $_elementKey => $_elementName) { + $_variableName = '_' . strtolower($_elementName); + $$_variableName = isset($params['time'][$field_array][$prefix . $_elementName]) + ? $params['time'][$field_array][$prefix . $_elementName] + : date($_elementKey); + } + $_meridian = isset($params['time'][$field_array][$prefix . 'Meridian']) + ? (' ' . $params['time'][$field_array][$prefix . 'Meridian']) + : ''; + $time = strtotime( $_hour . ':' . $_minute . ':' . $_second . $_meridian ); + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); + } else { + // no date found, use NOW + list($_year, $_month, $_day) = $time = explode('-', date('Y-m-d')); + } + } elseif ($time === null) { + if (array_key_exists('time', $params)) { + $_hour = $_minute = $_second = $time = null; + } else { + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s')); + } + } else { + list($_hour, $_minute, $_second) = $time = explode('-', date('H-i-s', $time)); + } + + // generate hour <select> + if ($display_hours) { + $_html_hours = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Hour]') : ($prefix . 'Hour'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($hour_extra) { + $_extra .= ' ' . $hour_extra; + } + + $_html_hours = '<select name="' . $_name . '"'; + if ($hour_id !== null || $all_id !== null) { + $_html_hours .= ' id="' . smarty_function_escape_special_chars( + $hour_id !== null ? ( $hour_id ? $hour_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) + ) . '"'; + } + if ($hour_size) { + $_html_hours .= ' size="' . $hour_size . '"'; + } + $_html_hours .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($hour_empty) || isset($all_empty)) { + $_html_hours .= '<option value="">' . ( isset($hour_empty) ? $hour_empty : $all_empty ) . '</option>' . $option_separator; + } + + $start = $use_24_hours ? 0 : 1; + $end = $use_24_hours ? 23 : 12; + for ($i=$start; $i <= $end; $i++) { + $_val = sprintf('%02d', $i); + $_text = $hour_format == '%02d' ? $_val : sprintf($hour_format, $i); + $_value = $hour_value_format == '%02d' ? $_val : sprintf($hour_value_format, $i); + + if (!$use_24_hours) { + $_hour12 = $_hour == 0 + ? 12 + : ($_hour <= 12 ? $_hour : $_hour -12); + } + + $selected = $_hour !== null ? ($use_24_hours ? $_hour == $_val : $_hour12 == $_val) : null; + $_html_hours .= '<option value="' . $_value . '"' + . ($selected ? ' selected="selected"' : '') + . '>' . $_text . '</option>' . $option_separator; + } + + $_html_hours .= '</select>'; + } + + // generate minute <select> + if ($display_minutes) { + $_html_minutes = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Minute]') : ($prefix . 'Minute'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($minute_extra) { + $_extra .= ' ' . $minute_extra; + } + + $_html_minutes = '<select name="' . $_name . '"'; + if ($minute_id !== null || $all_id !== null) { + $_html_minutes .= ' id="' . smarty_function_escape_special_chars( + $minute_id !== null ? ( $minute_id ? $minute_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) + ) . '"'; + } + if ($minute_size) { + $_html_minutes .= ' size="' . $minute_size . '"'; + } + $_html_minutes .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($minute_empty) || isset($all_empty)) { + $_html_minutes .= '<option value="">' . ( isset($minute_empty) ? $minute_empty : $all_empty ) . '</option>' . $option_separator; + } + + $selected = $_minute !== null ? ($_minute - $_minute % $minute_interval) : null; + for ($i=0; $i <= 59; $i += $minute_interval) { + $_val = sprintf('%02d', $i); + $_text = $minute_format == '%02d' ? $_val : sprintf($minute_format, $i); + $_value = $minute_value_format == '%02d' ? $_val : sprintf($minute_value_format, $i); + $_html_minutes .= '<option value="' . $_value . '"' + . ($selected === $i ? ' selected="selected"' : '') + . '>' . $_text . '</option>' . $option_separator; + } + + $_html_minutes .= '</select>'; + } + + // generate second <select> + if ($display_seconds) { + $_html_seconds = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Second]') : ($prefix . 'Second'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($second_extra) { + $_extra .= ' ' . $second_extra; + } + + $_html_seconds = '<select name="' . $_name . '"'; + if ($second_id !== null || $all_id !== null) { + $_html_seconds .= ' id="' . smarty_function_escape_special_chars( + $second_id !== null ? ( $second_id ? $second_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) + ) . '"'; + } + if ($second_size) { + $_html_seconds .= ' size="' . $second_size . '"'; + } + $_html_seconds .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($second_empty) || isset($all_empty)) { + $_html_seconds .= '<option value="">' . ( isset($second_empty) ? $second_empty : $all_empty ) . '</option>' . $option_separator; + } + + $selected = $_second !== null ? ($_second - $_second % $second_interval) : null; + for ($i=0; $i <= 59; $i += $second_interval) { + $_val = sprintf('%02d', $i); + $_text = $second_format == '%02d' ? $_val : sprintf($second_format, $i); + $_value = $second_value_format == '%02d' ? $_val : sprintf($second_value_format, $i); + $_html_seconds .= '<option value="' . $_value . '"' + . ($selected === $i ? ' selected="selected"' : '') + . '>' . $_text . '</option>' . $option_separator; + } + + $_html_seconds .= '</select>'; + } + + // generate meridian <select> + if ($display_meridian && !$use_24_hours) { + $_html_meridian = ''; + $_extra = ''; + $_name = $field_array ? ($field_array . '[' . $prefix . 'Meridian]') : ($prefix . 'Meridian'); + if ($all_extra) { + $_extra .= ' ' . $all_extra; + } + if ($meridian_extra) { + $_extra .= ' ' . $meridian_extra; + } + + $_html_meridian = '<select name="' . $_name . '"'; + if ($meridian_id !== null || $all_id !== null) { + $_html_meridian .= ' id="' . smarty_function_escape_special_chars( + $meridian_id !== null ? ( $meridian_id ? $meridian_id : $_name ) : ( $all_id ? ($all_id . $_name) : $_name ) + ) . '"'; + } + if ($meridian_size) { + $_html_meridian .= ' size="' . $meridian_size . '"'; + } + $_html_meridian .= $_extra . $extra_attrs . '>' . $option_separator; + + if (isset($meridian_empty) || isset($all_empty)) { + $_html_meridian .= '<option value="">' . ( isset($meridian_empty) ? $meridian_empty : $all_empty ) . '</option>' . $option_separator; + } + + $_html_meridian .= '<option value="am"'. ($_hour < 12 ? ' selected="selected"' : '') .'>AM</option>' . $option_separator + . '<option value="pm"'. ($_hour < 12 ? '' : ' selected="selected"') .'>PM</option>' . $option_separator + . '</select>'; + } + + $_html = ''; + foreach (array('_html_hours', '_html_minutes', '_html_seconds', '_html_meridian') as $k) { + if (isset($$k)) { + if ($_html) { + $_html .= $field_separator; + } + $_html .= $$k; + } + } + + return $_html; +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/function.html_table.php b/lib/smarty/libs/plugins/function.html_table.php new file mode 100644 index 000000000..6b9cb9d12 --- /dev/null +++ b/lib/smarty/libs/plugins/function.html_table.php @@ -0,0 +1,177 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {html_table} function plugin + * + * Type: function<br> + * Name: html_table<br> + * Date: Feb 17, 2003<br> + * Purpose: make an html table from an array of data<br> + * Params: + * <pre> + * - loop - array to loop through + * - cols - number of columns, comma separated list of column names + * or array of column names + * - rows - number of rows + * - table_attr - table attributes + * - th_attr - table heading attributes (arrays are cycled) + * - tr_attr - table row attributes (arrays are cycled) + * - td_attr - table cell attributes (arrays are cycled) + * - trailpad - value to pad trailing cells with + * - caption - text for caption element + * - vdir - vertical direction (default: "down", means top-to-bottom) + * - hdir - horizontal direction (default: "right", means left-to-right) + * - inner - inner loop (default "cols": print $loop line by line, + * $loop will be printed column by column otherwise) + * </pre> + * Examples: + * <pre> + * {table loop=$data} + * {table loop=$data cols=4 tr_attr='"bgcolor=red"'} + * {table loop=$data cols="first,second,third" tr_attr=$colors} + * </pre> + * + * @author Monte Ohrt <monte at ohrt dot com> + * @author credit to Messju Mohr <messju at lammfellpuschen dot de> + * @author credit to boots <boots dot smarty at yahoo dot com> + * @version 1.1 + * @link http://www.smarty.net/manual/en/language.function.html.table.php {html_table} + * (Smarty online manual) + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * @return string + */ +function smarty_function_html_table($params, $template) +{ + $table_attr = 'border="1"'; + $tr_attr = ''; + $th_attr = ''; + $td_attr = ''; + $cols = $cols_count = 3; + $rows = 3; + $trailpad = ' '; + $vdir = 'down'; + $hdir = 'right'; + $inner = 'cols'; + $caption = ''; + $loop = null; + + if (!isset($params['loop'])) { + trigger_error("html_table: missing 'loop' parameter",E_USER_WARNING); + return; + } + + foreach ($params as $_key => $_value) { + switch ($_key) { + case 'loop': + $$_key = (array)$_value; + break; + + case 'cols': + if (is_array($_value) && !empty($_value)) { + $cols = $_value; + $cols_count = count($_value); + } elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) { + $cols = explode(',', $_value); + $cols_count = count($cols); + } elseif (!empty($_value)) { + $cols_count = (int)$_value; + } else { + $cols_count = $cols; + } + break; + + case 'rows': + $$_key = (int)$_value; + break; + + case 'table_attr': + case 'trailpad': + case 'hdir': + case 'vdir': + case 'inner': + case 'caption': + $$_key = (string)$_value; + break; + + case 'tr_attr': + case 'td_attr': + case 'th_attr': + $$_key = $_value; + break; + } + } + + $loop_count = count($loop); + if (empty($params['rows'])) { + /* no rows specified */ + $rows = ceil($loop_count / $cols_count); + } elseif (empty($params['cols'])) { + if (!empty($params['rows'])) { + /* no cols specified, but rows */ + $cols_count = ceil($loop_count / $rows); + } + } + + $output = "<table $table_attr>\n"; + + if (!empty($caption)) { + $output .= '<caption>' . $caption . "</caption>\n"; + } + + if (is_array($cols)) { + $cols = ($hdir == 'right') ? $cols : array_reverse($cols); + $output .= "<thead><tr>\n"; + + for ($r = 0; $r < $cols_count; $r++) { + $output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>'; + $output .= $cols[$r]; + $output .= "</th>\n"; + } + $output .= "</tr></thead>\n"; + } + + $output .= "<tbody>\n"; + for ($r = 0; $r < $rows; $r++) { + $output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n"; + $rx = ($vdir == 'down') ? $r * $cols_count : ($rows-1 - $r) * $cols_count; + + for ($c = 0; $c < $cols_count; $c++) { + $x = ($hdir == 'right') ? $rx + $c : $rx + $cols_count-1 - $c; + if ($inner != 'cols') { + /* shuffle x to loop over rows*/ + $x = floor($x / $cols_count) + ($x % $cols_count) * $rows; + } + + if ($x < $loop_count) { + $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[$x] . "</td>\n"; + } else { + $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n"; + } + } + $output .= "</tr>\n"; + } + $output .= "</tbody>\n"; + $output .= "</table>\n"; + + return $output; +} + +function smarty_function_html_table_cycle($name, $var, $no) +{ + if (!is_array($var)) { + $ret = $var; + } else { + $ret = $var[$no % count($var)]; + } + + return ($ret) ? ' ' . $ret : ''; +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/function.mailto.php b/lib/smarty/libs/plugins/function.mailto.php new file mode 100644 index 000000000..55d5c0602 --- /dev/null +++ b/lib/smarty/libs/plugins/function.mailto.php @@ -0,0 +1,152 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {mailto} function plugin + * + * Type: function<br> + * Name: mailto<br> + * Date: May 21, 2002 + * Purpose: automate mailto address link creation, and optionally encode them.<br> + * Params: + * <pre> + * - address - (required) - e-mail address + * - text - (optional) - text to display, default is address + * - encode - (optional) - can be one of: + * * none : no encoding (default) + * * javascript : encode with javascript + * * javascript_charcode : encode with javascript charcode + * * hex : encode with hexidecimal (no javascript) + * - cc - (optional) - address(es) to carbon copy + * - bcc - (optional) - address(es) to blind carbon copy + * - subject - (optional) - e-mail subject + * - newsgroups - (optional) - newsgroup(s) to post to + * - followupto - (optional) - address(es) to follow up to + * - extra - (optional) - extra tags for the href link + * </pre> + * Examples: + * <pre> + * {mailto address="me@domain.com"} + * {mailto address="me@domain.com" encode="javascript"} + * {mailto address="me@domain.com" encode="hex"} + * {mailto address="me@domain.com" subject="Hello to you!"} + * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"} + * {mailto address="me@domain.com" extra='class="mailto"'} + * </pre> + * + * @link http://www.smarty.net/manual/en/language.function.mailto.php {mailto} + * (Smarty online manual) + * @version 1.2 + * @author Monte Ohrt <monte at ohrt dot com> + * @author credits to Jason Sweat (added cc, bcc and subject functionality) + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * @return string + */ +function smarty_function_mailto($params, $template) +{ + static $_allowed_encoding = array('javascript' => true, 'javascript_charcode' => true, 'hex' => true, 'none' => true); + $extra = ''; + + if (empty($params['address'])) { + trigger_error("mailto: missing 'address' parameter",E_USER_WARNING); + return; + } else { + $address = $params['address']; + } + + $text = $address; + // netscape and mozilla do not decode %40 (@) in BCC field (bug?) + // so, don't encode it. + $search = array('%40', '%2C'); + $replace = array('@', ','); + $mail_parms = array(); + foreach ($params as $var => $value) { + switch ($var) { + case 'cc': + case 'bcc': + case 'followupto': + if (!empty($value)) + $mail_parms[] = $var . '=' . str_replace($search, $replace, rawurlencode($value)); + break; + + case 'subject': + case 'newsgroups': + $mail_parms[] = $var . '=' . rawurlencode($value); + break; + + case 'extra': + case 'text': + $$var = $value; + + default: + } + } + + if ($mail_parms) { + $address .= '?' . join('&', $mail_parms); + } + + $encode = (empty($params['encode'])) ? 'none' : $params['encode']; + if (!isset($_allowed_encoding[$encode])) { + trigger_error("mailto: 'encode' parameter must be none, javascript, javascript_charcode or hex", E_USER_WARNING); + return; + } + // FIXME: (rodneyrehm) document.write() excues me what? 1998 has passed! + if ($encode == 'javascript') { + $string = 'document.write(\'<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>\');'; + + $js_encode = ''; + for ($x = 0, $_length = strlen($string); $x < $_length; $x++) { + $js_encode .= '%' . bin2hex($string[$x]); + } + + return '<script type="text/javascript">eval(unescape(\'' . $js_encode . '\'))</script>'; + } elseif ($encode == 'javascript_charcode') { + $string = '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>'; + + for($x = 0, $y = strlen($string); $x < $y; $x++) { + $ord[] = ord($string[$x]); + } + + $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n" + . "{document.write(String.fromCharCode(" + . implode(',', $ord) + . "))" + . "}\n" + . "</script>\n"; + + return $_ret; + } elseif ($encode == 'hex') { + preg_match('!^(.*)(\?.*)$!', $address, $match); + if (!empty($match[2])) { + trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.",E_USER_WARNING); + return; + } + $address_encode = ''; + for ($x = 0, $_length = strlen($address); $x < $_length; $x++) { + if (preg_match('!\w!' . Smarty::$_UTF8_MODIFIER, $address[$x])) { + $address_encode .= '%' . bin2hex($address[$x]); + } else { + $address_encode .= $address[$x]; + } + } + $text_encode = ''; + for ($x = 0, $_length = strlen($text); $x < $_length; $x++) { + $text_encode .= '&#x' . bin2hex($text[$x]) . ';'; + } + + $mailto = "mailto:"; + return '<a href="' . $mailto . $address_encode . '" ' . $extra . '>' . $text_encode . '</a>'; + } else { + // no encoding + return '<a href="mailto:' . $address . '" ' . $extra . '>' . $text . '</a>'; + } +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/function.math.php b/lib/smarty/libs/plugins/function.math.php new file mode 100644 index 000000000..f4d3f05ee --- /dev/null +++ b/lib/smarty/libs/plugins/function.math.php @@ -0,0 +1,87 @@ +<?php +/** + * Smarty plugin + * + * This plugin is only for Smarty2 BC + * @package Smarty + * @subpackage PluginsFunction + */ + +/** + * Smarty {math} function plugin + * + * Type: function<br> + * Name: math<br> + * Purpose: handle math computations in template + * + * @link http://www.smarty.net/manual/en/language.function.math.php {math} + * (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @param array $params parameters + * @param Smarty_Internal_Template $template template object + * @return string|null + */ +function smarty_function_math($params, $template) +{ + static $_allowed_funcs = array( + 'int' => true, 'abs' => true, 'ceil' => true, 'cos' => true, 'exp' => true, 'floor' => true, + 'log' => true, 'log10' => true, 'max' => true, 'min' => true, 'pi' => true, 'pow' => true, + 'rand' => true, 'round' => true, 'sin' => true, 'sqrt' => true, 'srand' => true ,'tan' => true + ); + // be sure equation parameter is present + if (empty($params['equation'])) { + trigger_error("math: missing equation parameter",E_USER_WARNING); + return; + } + + $equation = $params['equation']; + + // make sure parenthesis are balanced + if (substr_count($equation,"(") != substr_count($equation,")")) { + trigger_error("math: unbalanced parenthesis",E_USER_WARNING); + return; + } + + // match all vars in equation, make sure all are passed + preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]*)!",$equation, $match); + + foreach($match[1] as $curr_var) { + if ($curr_var && !isset($params[$curr_var]) && !isset($_allowed_funcs[$curr_var])) { + trigger_error("math: function call $curr_var not allowed",E_USER_WARNING); + return; + } + } + + foreach($params as $key => $val) { + if ($key != "equation" && $key != "format" && $key != "assign") { + // make sure value is not empty + if (strlen($val)==0) { + trigger_error("math: parameter $key is empty",E_USER_WARNING); + return; + } + if (!is_numeric($val)) { + trigger_error("math: parameter $key: is not numeric",E_USER_WARNING); + return; + } + $equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation); + } + } + $smarty_math_result = null; + eval("\$smarty_math_result = ".$equation.";"); + + if (empty($params['format'])) { + if (empty($params['assign'])) { + return $smarty_math_result; + } else { + $template->assign($params['assign'],$smarty_math_result); + } + } else { + if (empty($params['assign'])){ + printf($params['format'],$smarty_math_result); + } else { + $template->assign($params['assign'],sprintf($params['format'],$smarty_math_result)); + } + } +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifier.capitalize.php b/lib/smarty/libs/plugins/modifier.capitalize.php new file mode 100644 index 000000000..a78e3632a --- /dev/null +++ b/lib/smarty/libs/plugins/modifier.capitalize.php @@ -0,0 +1,65 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ + +/** + * Smarty capitalize modifier plugin + * + * Type: modifier<br> + * Name: capitalize<br> + * Purpose: capitalize words in the string + * + * {@internal {$string|capitalize:true:true} is the fastest option for MBString enabled systems }} + * + * @param string $string string to capitalize + * @param boolean $uc_digits also capitalize "x123" to "X123" + * @param boolean $lc_rest capitalize first letters, lowercase all following letters "aAa" to "Aaa" + * @return string capitalized string + * @author Monte Ohrt <monte at ohrt dot com> + * @author Rodney Rehm + */ +function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = false) +{ + if (Smarty::$_MBSTRING) { + if ($lc_rest) { + // uppercase (including hyphenated words) + $upper_string = mb_convert_case( $string, MB_CASE_TITLE, Smarty::$_CHARSET ); + } else { + // uppercase word breaks + $upper_string = preg_replace("!(^|[^\p{L}'])([\p{Ll}])!eS" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').mb_convert_case(stripslashes('\\2'),MB_CASE_UPPER, '" . addslashes(Smarty::$_CHARSET) . "')", $string); + } + // check uc_digits case + if (!$uc_digits) { + if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) { + foreach($matches[1] as $match) { + $upper_string = substr_replace($upper_string, mb_strtolower($match[0], Smarty::$_CHARSET), $match[1], strlen($match[0])); + } + } + } + $upper_string = preg_replace("!((^|\s)['\"])(\w)!e" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').mb_convert_case(stripslashes('\\3'),MB_CASE_UPPER, '" . addslashes(Smarty::$_CHARSET) . "')", $upper_string); + return $upper_string; + } + + // lowercase first + if ($lc_rest) { + $string = strtolower($string); + } + // uppercase (including hyphenated words) + $upper_string = preg_replace("!(^|[^\p{L}'])([\p{Ll}])!eS" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').ucfirst(stripslashes('\\2'))", $string); + // check uc_digits case + if (!$uc_digits) { + if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) { + foreach($matches[1] as $match) { + $upper_string = substr_replace($upper_string, strtolower($match[0]), $match[1], strlen($match[0])); + } + } + } + $upper_string = preg_replace("!((^|\s)['\"])(\w)!e" . Smarty::$_UTF8_MODIFIER, "stripslashes('\\1').strtoupper(stripslashes('\\3'))", $upper_string); + return $upper_string; +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifier.date_format.php b/lib/smarty/libs/plugins/modifier.date_format.php new file mode 100644 index 000000000..3cca7d395 --- /dev/null +++ b/lib/smarty/libs/plugins/modifier.date_format.php @@ -0,0 +1,65 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ + +/** + * Smarty date_format modifier plugin + * + * Type: modifier<br> + * Name: date_format<br> + * Purpose: format datestamps via strftime<br> + * Input:<br> + * - string: input date string + * - format: strftime format for output + * - default_date: default date if $string is empty + * + * @link http://www.smarty.net/manual/en/language.modifier.date.format.php date_format (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @param string $string input date string + * @param string $format strftime format for output + * @param string $default_date default date if $string is empty + * @param string $formatter either 'strftime' or 'auto' + * @return string |void + * @uses smarty_make_timestamp() + */ +function smarty_modifier_date_format($string, $format=null, $default_date='', $formatter='auto') +{ + if ($format === null) { + $format = Smarty::$_DATE_FORMAT; + } + /** + * Include the {@link shared.make_timestamp.php} plugin + */ + require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); + if ($string != '') { + $timestamp = smarty_make_timestamp($string); + } elseif ($default_date != '') { + $timestamp = smarty_make_timestamp($default_date); + } else { + return; + } + if($formatter=='strftime'||($formatter=='auto'&&strpos($format,'%')!==false)) { + if (DS == '\\') { + $_win_from = array('%D', '%h', '%n', '%r', '%R', '%t', '%T'); + $_win_to = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S'); + if (strpos($format, '%e') !== false) { + $_win_from[] = '%e'; + $_win_to[] = sprintf('%\' 2d', date('j', $timestamp)); + } + if (strpos($format, '%l') !== false) { + $_win_from[] = '%l'; + $_win_to[] = sprintf('%\' 2d', date('h', $timestamp)); + } + $format = str_replace($_win_from, $_win_to, $format); + } + return strftime($format, $timestamp); + } else { + return date($format, $timestamp); + } +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifier.debug_print_var.php b/lib/smarty/libs/plugins/modifier.debug_print_var.php new file mode 100644 index 000000000..fa44100e8 --- /dev/null +++ b/lib/smarty/libs/plugins/modifier.debug_print_var.php @@ -0,0 +1,105 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage Debug + */ + +/** + * Smarty debug_print_var modifier plugin + * + * Type: modifier<br> + * Name: debug_print_var<br> + * Purpose: formats variable contents for display in the console + * + * @author Monte Ohrt <monte at ohrt dot com> + * @param array|object $var variable to be formatted + * @param integer $depth maximum recursion depth if $var is an array + * @param integer $length maximum string length if $var is a string + * @return string + */ +function smarty_modifier_debug_print_var ($var, $depth = 0, $length = 40) +{ + $_replace = array("\n" => '<i>\n</i>', + "\r" => '<i>\r</i>', + "\t" => '<i>\t</i>' + ); + + switch (gettype($var)) { + case 'array' : + $results = '<b>Array (' . count($var) . ')</b>'; + foreach ($var as $curr_key => $curr_val) { + $results .= '<br>' . str_repeat(' ', $depth * 2) + . '<b>' . strtr($curr_key, $_replace) . '</b> => ' + . smarty_modifier_debug_print_var($curr_val, ++$depth, $length); + $depth--; + } + break; + + case 'object' : + $object_vars = get_object_vars($var); + $results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>'; + foreach ($object_vars as $curr_key => $curr_val) { + $results .= '<br>' . str_repeat(' ', $depth * 2) + . '<b> ->' . strtr($curr_key, $_replace) . '</b> = ' + . smarty_modifier_debug_print_var($curr_val, ++$depth, $length); + $depth--; + } + break; + + case 'boolean' : + case 'NULL' : + case 'resource' : + if (true === $var) { + $results = 'true'; + } elseif (false === $var) { + $results = 'false'; + } elseif (null === $var) { + $results = 'null'; + } else { + $results = htmlspecialchars((string) $var); + } + $results = '<i>' . $results . '</i>'; + break; + + case 'integer' : + case 'float' : + $results = htmlspecialchars((string) $var); + break; + + case 'string' : + $results = strtr($var, $_replace); + if (Smarty::$_MBSTRING) { + if (mb_strlen($var, Smarty::$_CHARSET) > $length) { + $results = mb_substr($var, 0, $length - 3, Smarty::$_CHARSET) . '...'; + } + } else { + if (isset($var[$length])) { + $results = substr($var, 0, $length - 3) . '...'; + } + } + + $results = htmlspecialchars('"' . $results . '"'); + break; + + case 'unknown type' : + default : + $results = strtr((string) $var, $_replace); + if (Smarty::$_MBSTRING) { + if (mb_strlen($results, Smarty::$_CHARSET) > $length) { + $results = mb_substr($results, 0, $length - 3, Smarty::$_CHARSET) . '...'; + } + } else { + if (strlen($results) > $length) { + $results = substr($results, 0, $length - 3) . '...'; + } + } + + $results = htmlspecialchars($results); + } + + return $results; +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifier.escape.php b/lib/smarty/libs/plugins/modifier.escape.php new file mode 100644 index 000000000..523d0653a --- /dev/null +++ b/lib/smarty/libs/plugins/modifier.escape.php @@ -0,0 +1,143 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ + +/** + * Smarty escape modifier plugin + * + * Type: modifier<br> + * Name: escape<br> + * Purpose: escape string for output + * + * @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @param string $string input string + * @param string $esc_type escape type + * @param string $char_set character set, used for htmlspecialchars() or htmlentities() + * @param boolean $double_encode encode already encoded entitites again, used for htmlspecialchars() or htmlentities() + * @return string escaped input string + */ +function smarty_modifier_escape($string, $esc_type = 'html', $char_set = null, $double_encode = true) +{ + if (!$char_set) { + $char_set = Smarty::$_CHARSET; + } + + switch ($esc_type) { + case 'html': + return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); + + case 'htmlall': + if (Smarty::$_MBSTRING) { + // mb_convert_encoding ignores htmlspecialchars() + $string = htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); + // htmlentities() won't convert everything, so use mb_convert_encoding + return mb_convert_encoding($string, 'HTML-ENTITIES', $char_set); + } + + // no MBString fallback + return htmlentities($string, ENT_QUOTES, $char_set, $double_encode); + + case 'url': + return rawurlencode($string); + + case 'urlpathinfo': + return str_replace('%2F', '/', rawurlencode($string)); + + case 'quotes': + // escape unescaped single quotes + return preg_replace("%(?<!\\\\)'%", "\\'", $string); + + case 'hex': + // escape every byte into hex + // Note that the UTF-8 encoded character ä will be represented as %c3%a4 + $return = ''; + $_length = strlen($string); + for ($x = 0; $x < $_length; $x++) { + $return .= '%' . bin2hex($string[$x]); + } + return $return; + + case 'hexentity': + $return = ''; + if (Smarty::$_MBSTRING) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); + $return = ''; + foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { + $return .= '&#x' . strtoupper(dechex($unicode)) . ';'; + } + return $return; + } + // no MBString fallback + $_length = strlen($string); + for ($x = 0; $x < $_length; $x++) { + $return .= '&#x' . bin2hex($string[$x]) . ';'; + } + return $return; + + case 'decentity': + $return = ''; + if (Smarty::$_MBSTRING) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); + $return = ''; + foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { + $return .= '&#' . $unicode . ';'; + } + return $return; + } + // no MBString fallback + $_length = strlen($string); + for ($x = 0; $x < $_length; $x++) { + $return .= '&#' . ord($string[$x]) . ';'; + } + return $return; + + case 'javascript': + // escape quotes and backslashes, newlines, etc. + return strtr($string, array('\\' => '\\\\', "'" => "\\'", '"' => '\\"', "\r" => '\\r', "\n" => '\\n', '</' => '<\/')); + + case 'mail': + if (Smarty::$_MBSTRING) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); + return smarty_mb_str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string); + } + // no MBString fallback + return str_replace(array('@', '.'), array(' [AT] ', ' [DOT] '), $string); + + case 'nonstd': + // escape non-standard chars, such as ms document quotes + $return = ''; + if (Smarty::$_MBSTRING) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_unicode.php'); + foreach (smarty_mb_to_unicode($string, Smarty::$_CHARSET) as $unicode) { + if ($unicode >= 126) { + $return .= '&#' . $unicode . ';'; + } else { + $return .= chr($unicode); + } + } + return $return; + } + + $_length = strlen($string); + for ($_i = 0; $_i < $_length; $_i++) { + $_ord = ord(substr($string, $_i, 1)); + // non-standard char, escape it + if ($_ord >= 126) { + $return .= '&#' . $_ord . ';'; + } else { + $return .= substr($string, $_i, 1); + } + } + return $return; + + default: + return $string; + } +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifier.regex_replace.php b/lib/smarty/libs/plugins/modifier.regex_replace.php new file mode 100644 index 000000000..f9fd5fa53 --- /dev/null +++ b/lib/smarty/libs/plugins/modifier.regex_replace.php @@ -0,0 +1,55 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ + +/** + * Smarty regex_replace modifier plugin + * + * Type: modifier<br> + * Name: regex_replace<br> + * Purpose: regular expression search/replace + * + * @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php + * regex_replace (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @param string $string input string + * @param string|array $search regular expression(s) to search for + * @param string|array $replace string(s) that should be replaced + * @return string + */ +function smarty_modifier_regex_replace($string, $search, $replace) +{ + if(is_array($search)) { + foreach($search as $idx => $s) { + $search[$idx] = _smarty_regex_replace_check($s); + } + } else { + $search = _smarty_regex_replace_check($search); + } + return preg_replace($search, $replace, $string); +} + +/** + * @param string $search string(s) that should be replaced + * @return string + * @ignore + */ +function _smarty_regex_replace_check($search) +{ + // null-byte injection detection + // anything behind the first null-byte is ignored + if (($pos = strpos($search,"\0")) !== false) { + $search = substr($search,0,$pos); + } + // remove eval-modifier from $search + if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[1], 'e') !== false)) { + $search = substr($search, 0, -strlen($match[1])) . preg_replace('![e\s]+!', '', $match[1]); + } + return $search; +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifier.replace.php b/lib/smarty/libs/plugins/modifier.replace.php new file mode 100644 index 000000000..4d71a6e9b --- /dev/null +++ b/lib/smarty/libs/plugins/modifier.replace.php @@ -0,0 +1,33 @@ +<?php +/** + * Smarty plugin + * @package Smarty + * @subpackage PluginsModifier + */ + +/** + * Smarty replace modifier plugin + * + * Type: modifier<br> + * Name: replace<br> + * Purpose: simple search/replace + * + * @link http://smarty.php.net/manual/en/language.modifier.replace.php replace (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @author Uwe Tews + * @param string $string input string + * @param string $search text to search for + * @param string $replace replacement text + * @return string + */ +function smarty_modifier_replace($string, $search, $replace) +{ + if (Smarty::$_MBSTRING) { + require_once(SMARTY_PLUGINS_DIR . 'shared.mb_str_replace.php'); + return smarty_mb_str_replace($search, $replace, $string); + } + + return str_replace($search, $replace, $string); +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifier.spacify.php b/lib/smarty/libs/plugins/modifier.spacify.php new file mode 100644 index 000000000..a907232ff --- /dev/null +++ b/lib/smarty/libs/plugins/modifier.spacify.php @@ -0,0 +1,27 @@ +<?php +/** + * Smarty plugin + * @package Smarty + * @subpackage PluginsModifier + */ + +/** + * Smarty spacify modifier plugin + * + * Type: modifier<br> + * Name: spacify<br> + * Purpose: add spaces between characters in a string + * + * @link http://smarty.php.net/manual/en/language.modifier.spacify.php spacify (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @param string $string input string + * @param string $spacify_char string to insert between characters. + * @return string + */ +function smarty_modifier_spacify($string, $spacify_char = ' ') +{ + // well… what about charsets besides latin and UTF-8? + return implode($spacify_char, preg_split('//' . Smarty::$_UTF8_MODIFIER, $string, -1, PREG_SPLIT_NO_EMPTY)); +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifier.truncate.php b/lib/smarty/libs/plugins/modifier.truncate.php new file mode 100644 index 000000000..9a803ec99 --- /dev/null +++ b/lib/smarty/libs/plugins/modifier.truncate.php @@ -0,0 +1,59 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsModifier + */ + +/** + * Smarty truncate modifier plugin + * + * Type: modifier<br> + * Name: truncate<br> + * Purpose: Truncate a string to a certain length if necessary, + * optionally splitting in the middle of a word, and + * appending the $etc string or inserting $etc into the middle. + * + * @link http://smarty.php.net/manual/en/language.modifier.truncate.php truncate (Smarty online manual) + * @author Monte Ohrt <monte at ohrt dot com> + * @param string $string input string + * @param integer $length length of truncated text + * @param string $etc end string + * @param boolean $break_words truncate at word boundary + * @param boolean $middle truncate in the middle of text + * @return string truncated string + */ +function smarty_modifier_truncate($string, $length = 80, $etc = '...', $break_words = false, $middle = false) { + if ($length == 0) + return ''; + + if (Smarty::$_MBSTRING) { + if (mb_strlen($string, Smarty::$_CHARSET) > $length) { + $length -= min($length, mb_strlen($etc, Smarty::$_CHARSET)); + if (!$break_words && !$middle) { + $string = preg_replace('/\s+?(\S+)?$/' . Smarty::$_UTF8_MODIFIER, '', mb_substr($string, 0, $length + 1, Smarty::$_CHARSET)); + } + if (!$middle) { + return mb_substr($string, 0, $length, Smarty::$_CHARSET) . $etc; + } + return mb_substr($string, 0, $length / 2, Smarty::$_CHARSET) . $etc . mb_substr($string, - $length / 2, $length, Smarty::$_CHARSET); + } + return $string; + } + + // no MBString fallback + if (isset($string[$length])) { + $length -= min($length, strlen($etc)); + if (!$break_words && !$middle) { + $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length + 1)); + } + if (!$middle) { + return substr($string, 0, $length) . $etc; + } + return substr($string, 0, $length / 2) . $etc . substr($string, - $length / 2); + } + return $string; +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.cat.php b/lib/smarty/libs/plugins/modifiercompiler.cat.php new file mode 100644 index 000000000..1cfe6308a --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.cat.php @@ -0,0 +1,30 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty cat modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: cat<br>
+ * Date: Feb 24, 2003<br>
+ * Purpose: catenate a value to a variable<br>
+ * Input: string to catenate<br>
+ * Example: {$var|cat:"foo"}
+ *
+ * @link http://smarty.php.net/manual/en/language.modifier.cat.php cat
+ * (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_cat($params, $compiler)
+{
+ return '('.implode(').(', $params).')';
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.count_characters.php b/lib/smarty/libs/plugins/modifiercompiler.count_characters.php new file mode 100644 index 000000000..98e8efa0d --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.count_characters.php @@ -0,0 +1,33 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty count_characters modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: count_characteres<br>
+ * Purpose: count the number of characters in a text
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.count.characters.php count_characters (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_count_characters($params, $compiler)
+{
+ if (!isset($params[1]) || $params[1] != 'true') {
+ return 'preg_match_all(\'/[^\s]/' . Smarty::$_UTF8_MODIFIER . '\',' . $params[0] . ', $tmp)';
+ }
+ if (Smarty::$_MBSTRING) {
+ return 'mb_strlen(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')';
+ }
+ // no MBString fallback
+ return 'strlen(' . $params[0] . ')';
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.count_paragraphs.php b/lib/smarty/libs/plugins/modifiercompiler.count_paragraphs.php new file mode 100644 index 000000000..0e1b0af83 --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.count_paragraphs.php @@ -0,0 +1,28 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty count_paragraphs modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: count_paragraphs<br>
+ * Purpose: count the number of paragraphs in a text
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php
+ * count_paragraphs (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_count_paragraphs($params, $compiler)
+{
+ // count \r or \n characters
+ return '(preg_match_all(\'#[\r\n]+#\', ' . $params[0] . ', $tmp)+1)';
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.count_sentences.php b/lib/smarty/libs/plugins/modifiercompiler.count_sentences.php new file mode 100644 index 000000000..2f517be96 --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.count_sentences.php @@ -0,0 +1,28 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty count_sentences modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: count_sentences
+ * Purpose: count the number of sentences in a text
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.count.paragraphs.php
+ * count_sentences (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_count_sentences($params, $compiler)
+{
+ // find periods, question marks, exclamation marks with a word before but not after.
+ return 'preg_match_all("#\w[\.\?\!](\W|$)#S' . Smarty::$_UTF8_MODIFIER . '", ' . $params[0] . ', $tmp)';
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.count_words.php b/lib/smarty/libs/plugins/modifiercompiler.count_words.php new file mode 100644 index 000000000..e05738c01 --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.count_words.php @@ -0,0 +1,32 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty count_words modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: count_words<br>
+ * Purpose: count the number of words in a text
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.count.words.php count_words (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+*/
+function smarty_modifiercompiler_count_words($params, $compiler)
+{
+ if (Smarty::$_MBSTRING) {
+ // return 'preg_match_all(\'#[\w\pL]+#' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)';
+ // expression taken from http://de.php.net/manual/en/function.str-word-count.php#85592
+ return 'preg_match_all(\'/\p{L}[\p{L}\p{Mn}\p{Pd}\\\'\x{2019}]*/' . Smarty::$_UTF8_MODIFIER . '\', ' . $params[0] . ', $tmp)';
+ }
+ // no MBString fallback
+ return 'str_word_count(' . $params[0] . ')';
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.default.php b/lib/smarty/libs/plugins/modifiercompiler.default.php new file mode 100644 index 000000000..4f831a589 --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.default.php @@ -0,0 +1,35 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty default modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: default<br>
+ * Purpose: designate default value for empty variables
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.default.php default (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_default ($params, $compiler)
+{
+ $output = $params[0];
+ if (!isset($params[1])) {
+ $params[1] = "''";
+ }
+
+ array_shift($params);
+ foreach ($params as $param) {
+ $output = '(($tmp = @' . $output . ')===null||$tmp===\'\' ? ' . $param . ' : $tmp)';
+ }
+ return $output;
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.escape.php b/lib/smarty/libs/plugins/modifiercompiler.escape.php new file mode 100644 index 000000000..b4cd3c88c --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.escape.php @@ -0,0 +1,90 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * @ignore
+ */
+require_once( SMARTY_PLUGINS_DIR .'shared.literal_compiler_param.php' );
+
+/**
+ * Smarty escape modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: escape<br>
+ * Purpose: escape string for output
+ *
+ * @link http://www.smarty.net/docsv2/en/language.modifier.escape count_characters (Smarty online manual)
+ * @author Rodney Rehm
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_escape($params, $compiler)
+{
+ try {
+ $esc_type = smarty_literal_compiler_param($params, 1, 'html');
+ $char_set = smarty_literal_compiler_param($params, 2, Smarty::$_CHARSET);
+ $double_encode = smarty_literal_compiler_param($params, 3, true);
+
+ if (!$char_set) {
+ $char_set = Smarty::$_CHARSET;
+ }
+
+ switch ($esc_type) {
+ case 'html':
+ return 'htmlspecialchars('
+ . $params[0] .', ENT_QUOTES, '
+ . var_export($char_set, true) . ', '
+ . var_export($double_encode, true) . ')';
+
+ case 'htmlall':
+ if (Smarty::$_MBSTRING) {
+ return 'mb_convert_encoding(htmlspecialchars('
+ . $params[0] .', ENT_QUOTES, '
+ . var_export($char_set, true) . ', '
+ . var_export($double_encode, true)
+ . '), "HTML-ENTITIES", '
+ . var_export($char_set, true) . ')';
+ }
+
+ // no MBString fallback
+ return 'htmlentities('
+ . $params[0] .', ENT_QUOTES, '
+ . var_export($char_set, true) . ', '
+ . var_export($double_encode, true) . ')';
+
+ case 'url':
+ return 'rawurlencode(' . $params[0] . ')';
+
+ case 'urlpathinfo':
+ return 'str_replace("%2F", "/", rawurlencode(' . $params[0] . '))';
+
+ case 'quotes':
+ // escape unescaped single quotes
+ return 'preg_replace("%(?<!\\\\\\\\)\'%", "\\\'",' . $params[0] . ')';
+
+ case 'javascript':
+ // escape quotes and backslashes, newlines, etc.
+ return 'strtr(' . $params[0] . ', array("\\\\" => "\\\\\\\\", "\'" => "\\\\\'", "\"" => "\\\\\"", "\\r" => "\\\\r", "\\n" => "\\\n", "</" => "<\/" ))';
+
+ }
+ } catch(SmartyException $e) {
+ // pass through to regular plugin fallback
+ }
+
+ // could not optimize |escape call, so fallback to regular plugin
+ if ($compiler->tag_nocache | $compiler->nocache) {
+ $compiler->template->required_plugins['nocache']['escape']['modifier']['file'] = SMARTY_PLUGINS_DIR .'modifier.escape.php';
+ $compiler->template->required_plugins['nocache']['escape']['modifier']['function'] = 'smarty_modifier_escape';
+ } else {
+ $compiler->template->required_plugins['compiled']['escape']['modifier']['file'] = SMARTY_PLUGINS_DIR .'modifier.escape.php';
+ $compiler->template->required_plugins['compiled']['escape']['modifier']['function'] = 'smarty_modifier_escape';
+ }
+ return 'smarty_modifier_escape(' . join( ', ', $params ) . ')';
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.from_charset.php b/lib/smarty/libs/plugins/modifiercompiler.from_charset.php new file mode 100644 index 000000000..93b568a5a --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.from_charset.php @@ -0,0 +1,34 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty from_charset modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: from_charset<br>
+ * Purpose: convert character encoding from $charset to internal encoding
+ *
+ * @author Rodney Rehm
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_from_charset($params, $compiler)
+{
+ if (!Smarty::$_MBSTRING) {
+ // FIXME: (rodneyrehm) shouldn't this throw an error?
+ return $params[0];
+ }
+
+ if (!isset($params[1])) {
+ $params[1] = '"ISO-8859-1"';
+ }
+
+ return 'mb_convert_encoding(' . $params[0] . ', "' . addslashes(Smarty::$_CHARSET) . '", ' . $params[1] . ')';
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.indent.php b/lib/smarty/libs/plugins/modifiercompiler.indent.php new file mode 100644 index 000000000..020c4fdb3 --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.indent.php @@ -0,0 +1,32 @@ +<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty indent modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: indent<br>
+ * Purpose: indent lines of text
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.indent.php indent (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+
+function smarty_modifiercompiler_indent($params, $compiler)
+{
+ if (!isset($params[1])) {
+ $params[1] = 4;
+ }
+ if (!isset($params[2])) {
+ $params[2] = "' '";
+ }
+ return 'preg_replace(\'!^!m\',str_repeat(' . $params[2] . ',' . $params[1] . '),' . $params[0] . ')';
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.lower.php b/lib/smarty/libs/plugins/modifiercompiler.lower.php new file mode 100644 index 000000000..1845cc1d2 --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.lower.php @@ -0,0 +1,31 @@ +<?php
+/**
+ * Smarty plugin
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty lower modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: lower<br>
+ * Purpose: convert string to lowercase
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.lower.php lower (Smarty online manual)
+ * @author Monte Ohrt <monte at ohrt dot com>
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+
+function smarty_modifiercompiler_lower($params, $compiler)
+{
+ if (Smarty::$_MBSTRING) {
+ return 'mb_strtolower(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')' ;
+ }
+ // no MBString fallback
+ return 'strtolower(' . $params[0] . ')';
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.noprint.php b/lib/smarty/libs/plugins/modifiercompiler.noprint.php new file mode 100644 index 000000000..3ca26571a --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.noprint.php @@ -0,0 +1,25 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty noprint modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: noprint<br>
+ * Purpose: return an empty string
+ *
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_noprint($params, $compiler)
+{
+ return "''";
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.string_format.php b/lib/smarty/libs/plugins/modifiercompiler.string_format.php new file mode 100644 index 000000000..83345977b --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.string_format.php @@ -0,0 +1,26 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty string_format modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: string_format<br>
+ * Purpose: format strings via sprintf
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.string.format.php string_format (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_string_format($params, $compiler)
+{
+ return 'sprintf(' . $params[1] . ',' . $params[0] . ')';
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.strip.php b/lib/smarty/libs/plugins/modifiercompiler.strip.php new file mode 100644 index 000000000..f1d5db045 --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.strip.php @@ -0,0 +1,33 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty strip modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: strip<br>
+ * Purpose: Replace all repeated spaces, newlines, tabs
+ * with a single space or supplied replacement string.<br>
+ * Example: {$var|strip} {$var|strip:" "}<br>
+ * Date: September 25th, 2002
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.strip.php strip (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+
+function smarty_modifiercompiler_strip($params, $compiler)
+{
+ if (!isset($params[1])) {
+ $params[1] = "' '";
+ }
+ return "preg_replace('!\s+!" . Smarty::$_UTF8_MODIFIER . "', {$params[1]},{$params[0]})";
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.strip_tags.php b/lib/smarty/libs/plugins/modifiercompiler.strip_tags.php new file mode 100644 index 000000000..296a3a2da --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.strip_tags.php @@ -0,0 +1,33 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty strip_tags modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: strip_tags<br>
+ * Purpose: strip html tags from text
+ *
+ * @link http://www.smarty.net/manual/en/language.modifier.strip.tags.php strip_tags (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_strip_tags($params, $compiler)
+{
+ if (!isset($params[1])) {
+ $params[1] = true;
+ }
+ if ($params[1] === true) {
+ return "preg_replace('!<[^>]*?>!', ' ', {$params[0]})";
+ } else {
+ return 'strip_tags(' . $params[0] . ')';
+ }
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.to_charset.php b/lib/smarty/libs/plugins/modifiercompiler.to_charset.php new file mode 100644 index 000000000..f5cdf455f --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.to_charset.php @@ -0,0 +1,34 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty to_charset modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: to_charset<br>
+ * Purpose: convert character encoding from internal encoding to $charset
+ *
+ * @author Rodney Rehm
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_to_charset($params, $compiler)
+{
+ if (!Smarty::$_MBSTRING) {
+ // FIXME: (rodneyrehm) shouldn't this throw an error?
+ return $params[0];
+ }
+
+ if (!isset($params[1])) {
+ $params[1] = '"ISO-8859-1"';
+ }
+
+ return 'mb_convert_encoding(' . $params[0] . ', ' . $params[1] . ', "' . addslashes(Smarty::$_CHARSET) . '")';
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.unescape.php b/lib/smarty/libs/plugins/modifiercompiler.unescape.php new file mode 100644 index 000000000..4321ff18d --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.unescape.php @@ -0,0 +1,51 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty unescape modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: unescape<br>
+ * Purpose: unescape html entities
+ *
+ * @author Rodney Rehm
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_unescape($params, $compiler)
+{
+ if (!isset($params[1])) {
+ $params[1] = 'html';
+ }
+ if (!isset($params[2])) {
+ $params[2] = '\'' . addslashes(Smarty::$_CHARSET) . '\'';
+ } else {
+ $params[2] = "'" . $params[2] . "'";
+ }
+
+ switch (trim($params[1], '"\'')) {
+ case 'entity':
+ case 'htmlall':
+ if (Smarty::$_MBSTRING) {
+ return 'mb_convert_encoding(' . $params[0] . ', ' . $params[2] . ', \'HTML-ENTITIES\')';
+ }
+
+ return 'html_entity_decode(' . $params[0] . ', ENT_NOQUOTES, ' . $params[2] . ')';
+
+ case 'html':
+ return 'htmlspecialchars_decode(' . $params[0] . ', ENT_QUOTES)';
+
+ case 'url':
+ return 'rawurldecode(' . $params[0] . ')';
+
+ default:
+ return $params[0];
+ }
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.upper.php b/lib/smarty/libs/plugins/modifiercompiler.upper.php new file mode 100644 index 000000000..f368e37dc --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.upper.php @@ -0,0 +1,30 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty upper modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: lower<br>
+ * Purpose: convert string to uppercase
+ *
+ * @link http://smarty.php.net/manual/en/language.modifier.upper.php lower (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_upper($params, $compiler)
+{
+ if (Smarty::$_MBSTRING) {
+ return 'mb_strtoupper(' . $params[0] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')' ;
+ }
+ // no MBString fallback
+ return 'strtoupper(' . $params[0] . ')';
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/modifiercompiler.wordwrap.php b/lib/smarty/libs/plugins/modifiercompiler.wordwrap.php new file mode 100644 index 000000000..f6845ad37 --- /dev/null +++ b/lib/smarty/libs/plugins/modifiercompiler.wordwrap.php @@ -0,0 +1,46 @@ +<?php
+/**
+ * Smarty plugin
+ *
+ * @package Smarty
+ * @subpackage PluginsModifierCompiler
+ */
+
+/**
+ * Smarty wordwrap modifier plugin
+ *
+ * Type: modifier<br>
+ * Name: wordwrap<br>
+ * Purpose: wrap a string of text at a given length
+ *
+ * @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php wordwrap (Smarty online manual)
+ * @author Uwe Tews
+ * @param array $params parameters
+ * @return string with compiled code
+ */
+function smarty_modifiercompiler_wordwrap($params, $compiler)
+{
+ if (!isset($params[1])) {
+ $params[1] = 80;
+ }
+ if (!isset($params[2])) {
+ $params[2] = '"\n"';
+ }
+ if (!isset($params[3])) {
+ $params[3] = 'false';
+ }
+ $function = 'wordwrap';
+ if (Smarty::$_MBSTRING) {
+ if ($compiler->tag_nocache | $compiler->nocache) {
+ $compiler->template->required_plugins['nocache']['wordwrap']['modifier']['file'] = SMARTY_PLUGINS_DIR .'shared.mb_wordwrap.php';
+ $compiler->template->required_plugins['nocache']['wordwrap']['modifier']['function'] = 'smarty_mb_wordwrap';
+ } else {
+ $compiler->template->required_plugins['compiled']['wordwrap']['modifier']['file'] = SMARTY_PLUGINS_DIR .'shared.mb_wordwrap.php';
+ $compiler->template->required_plugins['compiled']['wordwrap']['modifier']['function'] = 'smarty_mb_wordwrap';
+ }
+ $function = 'smarty_mb_wordwrap';
+ }
+ return $function . '(' . $params[0] . ',' . $params[1] . ',' . $params[2] . ',' . $params[3] . ')';
+}
+
+?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/outputfilter.trimwhitespace.php b/lib/smarty/libs/plugins/outputfilter.trimwhitespace.php new file mode 100644 index 000000000..31a75557c --- /dev/null +++ b/lib/smarty/libs/plugins/outputfilter.trimwhitespace.php @@ -0,0 +1,93 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFilter + */ + +/** + * Smarty trimwhitespace outputfilter plugin + * + * Trim unnecessary whitespace from HTML markup. + * + * @author Rodney Rehm + * @param string $source input string + * @param Smarty_Internal_Template $smarty Smarty object + * @return string filtered output + * @todo substr_replace() is not overloaded by mbstring.func_overload - so this function might fail! + */ +function smarty_outputfilter_trimwhitespace($source, Smarty_Internal_Template $smarty) +{ + $store = array(); + $_store = 0; + $_offset = 0; + + // Unify Line-Breaks to \n + $source = preg_replace("/\015\012|\015|\012/", "\n", $source); + + // capture Internet Explorer Conditional Comments + if (preg_match_all('#<!--\[[^\]]+\]>.*?<!\[[^\]]+\]-->#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { + foreach ($matches as $match) { + $store[] = $match[0][0]; + $_length = strlen($match[0][0]); + $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@'; + $source = substr_replace($source, $replace, $match[0][1] - $_offset, $_length); + + $_offset += $_length - strlen($replace); + $_store++; + } + } + + // Strip all HTML-Comments + $source = preg_replace( '#<!--.*?-->#ms', '', $source ); + + // capture html elements not to be messed with + $_offset = 0; + if (preg_match_all('#<(script|pre|textarea)[^>]*>.*?</\\1>#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { + foreach ($matches as $match) { + $store[] = $match[0][0]; + $_length = strlen($match[0][0]); + $replace = '@!@SMARTY:' . $_store . ':SMARTY@!@'; + $source = substr_replace($source, $replace, $match[0][1] - $_offset, $_length); + + $_offset += $_length - strlen($replace); + $_store++; + } + } + + $expressions = array( + // replace multiple spaces between tags by a single space + // can't remove them entirely, becaue that might break poorly implemented CSS display:inline-block elements + '#(:SMARTY@!@|>)\s+(?=@!@SMARTY:|<)#s' => '\1 \2', + // remove spaces between attributes (but not in attribute values!) + '#(([a-z0-9]\s*=\s*(["\'])[^\3]*?\3)|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \4', + // note: for some very weird reason trim() seems to remove spaces inside attributes. + // maybe a \0 byte or something is interfering? + '#^\s+<#Ss' => '<', + '#>\s+$#Ss' => '>', + ); + + $source = preg_replace( array_keys($expressions), array_values($expressions), $source ); + // note: for some very weird reason trim() seems to remove spaces inside attributes. + // maybe a \0 byte or something is interfering? + // $source = trim( $source ); + + // capture html elements not to be messed with + $_offset = 0; + if (preg_match_all('#@!@SMARTY:([0-9]+):SMARTY@!@#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { + foreach ($matches as $match) { + $store[] = $match[0][0]; + $_length = strlen($match[0][0]); + $replace = array_shift($store); + $source = substr_replace($source, $replace, $match[0][1] + $_offset, $_length); + + $_offset += strlen($replace) - $_length; + $_store++; + } + } + + return $source; +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/shared.escape_special_chars.php b/lib/smarty/libs/plugins/shared.escape_special_chars.php new file mode 100644 index 000000000..d2609b674 --- /dev/null +++ b/lib/smarty/libs/plugins/shared.escape_special_chars.php @@ -0,0 +1,51 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ + +if (version_compare(PHP_VERSION, '5.2.3', '>=')) { + /** + * escape_special_chars common function + * + * Function: smarty_function_escape_special_chars<br> + * Purpose: used by other smarty functions to escape + * special chars except for already escaped ones + * + * @author Monte Ohrt <monte at ohrt dot com> + * @param string $string text that should by escaped + * @return string + */ + function smarty_function_escape_special_chars($string) + { + if (!is_array($string)) { + $string = htmlspecialchars($string, ENT_COMPAT, Smarty::$_CHARSET, false); + } + return $string; + } +} else { + /** + * escape_special_chars common function + * + * Function: smarty_function_escape_special_chars<br> + * Purpose: used by other smarty functions to escape + * special chars except for already escaped ones + * + * @author Monte Ohrt <monte at ohrt dot com> + * @param string $string text that should by escaped + * @return string + */ + function smarty_function_escape_special_chars($string) + { + if (!is_array($string)) { + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlspecialchars($string); + $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); + } + return $string; + } +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/shared.literal_compiler_param.php b/lib/smarty/libs/plugins/shared.literal_compiler_param.php new file mode 100644 index 000000000..dbcd9374c --- /dev/null +++ b/lib/smarty/libs/plugins/shared.literal_compiler_param.php @@ -0,0 +1,33 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsShared + */ + +/** + * evaluate compiler parameter + * + * @param array $params parameter array as given to the compiler function + * @param integer $index array index of the parameter to convert + * @param mixed $default value to be returned if the parameter is not present + * @return mixed evaluated value of parameter or $default + * @throws SmartyException if parameter is not a literal (but an expression, variable, …) + * @author Rodney Rehm + */ +function smarty_literal_compiler_param($params, $index, $default=null) +{ + // not set, go default + if (!isset($params[$index])) { + return $default; + } + // test if param is a literal + if (!preg_match('/^([\'"]?)[a-zA-Z0-9]+(\\1)$/', $params[$index])) { + throw new SmartyException('$param[' . $index . '] is not a literal and is thus not evaluatable at compile time'); + } + + $t = null; + eval("\$t = " . $params[$index] . ";"); + return $t; +} diff --git a/lib/smarty/libs/plugins/shared.make_timestamp.php b/lib/smarty/libs/plugins/shared.make_timestamp.php new file mode 100644 index 000000000..5d7c97e91 --- /dev/null +++ b/lib/smarty/libs/plugins/shared.make_timestamp.php @@ -0,0 +1,42 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ + +/** + * Function: smarty_make_timestamp<br> + * Purpose: used by other smarty functions to make a timestamp from a string. + * + * @author Monte Ohrt <monte at ohrt dot com> + * @param DateTime|int|string $string date object, timestamp or string that can be converted using strtotime() + * @return int + */ +function smarty_make_timestamp($string) +{ + if (empty($string)) { + // use "now": + return time(); + } elseif ($string instanceof DateTime) { + return $string->getTimestamp(); + } elseif (strlen($string) == 14 && ctype_digit($string)) { + // it is mysql timestamp format of YYYYMMDDHHMMSS? + return mktime(substr($string, 8, 2),substr($string, 10, 2),substr($string, 12, 2), + substr($string, 4, 2),substr($string, 6, 2),substr($string, 0, 4)); + } elseif (is_numeric($string)) { + // it is a numeric string, we handle it as timestamp + return (int) $string; + } else { + // strtotime should handle it + $time = strtotime($string); + if ($time == -1 || $time === false) { + // strtotime() was not able to parse $string, use "now": + return time(); + } + return $time; + } +} + +?> diff --git a/lib/smarty/libs/plugins/shared.mb_str_replace.php b/lib/smarty/libs/plugins/shared.mb_str_replace.php new file mode 100644 index 000000000..ecafeb74a --- /dev/null +++ b/lib/smarty/libs/plugins/shared.mb_str_replace.php @@ -0,0 +1,55 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ +if (!function_exists('smarty_mb_str_replace')) { + + /** + * Multibyte string replace + * + * @param string $search the string to be searched + * @param string $replace the replacement string + * @param string $subject the source string + * @param int &$count number of matches found + * @return string replaced string + * @author Rodney Rehm + */ + function smarty_mb_str_replace($search, $replace, $subject, &$count=0) + { + if (!is_array($search) && is_array($replace)) { + return false; + } + if (is_array($subject)) { + // call mb_replace for each single string in $subject + foreach ($subject as &$string) { + $string = &smarty_mb_str_replace($search, $replace, $string, $c); + $count += $c; + } + } elseif (is_array($search)) { + if (!is_array($replace)) { + foreach ($search as &$string) { + $subject = smarty_mb_str_replace($string, $replace, $subject, $c); + $count += $c; + } + } else { + $n = max(count($search), count($replace)); + while ($n--) { + $subject = smarty_mb_str_replace(current($search), current($replace), $subject, $c); + $count += $c; + next($search); + next($replace); + } + } + } else { + $parts = mb_split(preg_quote($search), $subject); + $count = count($parts) - 1; + $subject = implode($replace, $parts); + } + return $subject; + } + +} +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/shared.mb_unicode.php b/lib/smarty/libs/plugins/shared.mb_unicode.php new file mode 100644 index 000000000..e7f839ec8 --- /dev/null +++ b/lib/smarty/libs/plugins/shared.mb_unicode.php @@ -0,0 +1,48 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ + +/** + * convert characters to their decimal unicode equivalents + * + * @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration + * @param string $string characters to calculate unicode of + * @param string $encoding encoding of $string, if null mb_internal_encoding() is used + * @return array sequence of unicodes + * @author Rodney Rehm + */ +function smarty_mb_to_unicode($string, $encoding=null) { + if ($encoding) { + $expanded = mb_convert_encoding($string, "UTF-32BE", $encoding); + } else { + $expanded = mb_convert_encoding($string, "UTF-32BE"); + } + return unpack("N*", $expanded); +} + +/** + * convert unicodes to the character of given encoding + * + * @link http://www.ibm.com/developerworks/library/os-php-unicode/index.html#listing3 for inspiration + * @param integer|array $unicode single unicode or list of unicodes to convert + * @param string $encoding encoding of returned string, if null mb_internal_encoding() is used + * @return string unicode as character sequence in given $encoding + * @author Rodney Rehm + */ +function smarty_mb_from_unicode($unicode, $encoding=null) { + $t = ''; + if (!$encoding) { + $encoding = mb_internal_encoding(); + } + foreach((array) $unicode as $utf32be) { + $character = pack("N*", $utf32be); + $t .= mb_convert_encoding($character, $encoding, "UTF-32BE"); + } + return $t; +} + +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/shared.mb_wordwrap.php b/lib/smarty/libs/plugins/shared.mb_wordwrap.php new file mode 100644 index 000000000..ba3498c70 --- /dev/null +++ b/lib/smarty/libs/plugins/shared.mb_wordwrap.php @@ -0,0 +1,83 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ + +if(!function_exists('smarty_mb_wordwrap')) { + + /** + * Wrap a string to a given number of characters + * + * @link http://php.net/manual/en/function.wordwrap.php for similarity + * @param string $str the string to wrap + * @param int $width the width of the output + * @param string $break the character used to break the line + * @param boolean $cut ignored parameter, just for the sake of + * @return string wrapped string + * @author Rodney Rehm + */ + function smarty_mb_wordwrap($str, $width=75, $break="\n", $cut=false) + { + // break words into tokens using white space as a delimiter + $tokens = preg_split('!(\s)!S' . Smarty::$_UTF8_MODIFIER, $str, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE); + $length = 0; + $t = ''; + $_previous = false; + + foreach ($tokens as $_token) { + $token_length = mb_strlen($_token, Smarty::$_CHARSET); + $_tokens = array($_token); + if ($token_length > $width) { + // remove last space + $t = mb_substr($t, 0, -1, Smarty::$_CHARSET); + $_previous = false; + $length = 0; + + if ($cut) { + $_tokens = preg_split('!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER, $_token, -1, PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE); + // broken words go on a new line + $t .= $break; + } + } + + foreach ($_tokens as $token) { + $_space = !!preg_match('!^\s$!S' . Smarty::$_UTF8_MODIFIER, $token); + $token_length = mb_strlen($token, Smarty::$_CHARSET); + $length += $token_length; + + if ($length > $width) { + // remove space before inserted break + if ($_previous && $token_length < $width) { + $t = mb_substr($t, 0, -1, Smarty::$_CHARSET); + } + + // add the break before the token + $t .= $break; + $length = $token_length; + + // skip space after inserting a break + if ($_space) { + $length = 0; + continue; + } + } else if ($token == "\n") { + // hard break must reset counters + $_previous = 0; + $length = 0; + } else { + // remember if we had a space or not + $_previous = $_space; + } + // add the token + $t .= $token; + } + } + + return $t; + } + +} +?>
\ No newline at end of file diff --git a/lib/smarty/libs/plugins/variablefilter.htmlspecialchars.php b/lib/smarty/libs/plugins/variablefilter.htmlspecialchars.php new file mode 100644 index 000000000..aff711e48 --- /dev/null +++ b/lib/smarty/libs/plugins/variablefilter.htmlspecialchars.php @@ -0,0 +1,21 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFilter + */ + +/** + * Smarty htmlspecialchars variablefilter plugin + * + * @param string $source input string + * @param Smarty_Internal_Template $smarty Smarty object + * @return string filtered output + */ +function smarty_variablefilter_htmlspecialchars($source, $smarty) +{ + return htmlspecialchars($source, ENT_QUOTES, Smarty::$_CHARSET); +} + +?>
\ No newline at end of file |