diff options
Diffstat (limited to 'lib/smarty3/plugins')
47 files changed, 4287 insertions, 0 deletions
diff --git a/lib/smarty3/plugins/block.textformat.php b/lib/smarty3/plugins/block.textformat.php new file mode 100644 index 0000000..e9f5fe2 --- /dev/null +++ b/lib/smarty3/plugins/block.textformat.php @@ -0,0 +1,112 @@ +<?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); + + 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; + } +} diff --git a/lib/smarty3/plugins/function.counter.php b/lib/smarty3/plugins/function.counter.php new file mode 100644 index 0000000..bcc8f49 --- /dev/null +++ b/lib/smarty3/plugins/function.counter.php @@ -0,0 +1,73 @@ +<?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; +} diff --git a/lib/smarty3/plugins/function.cycle.php b/lib/smarty3/plugins/function.cycle.php new file mode 100644 index 0000000..a76d49a --- /dev/null +++ b/lib/smarty3/plugins/function.cycle.php @@ -0,0 +1,105 @@ +<?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; +} diff --git a/lib/smarty3/plugins/function.fetch.php b/lib/smarty3/plugins/function.fetch.php new file mode 100644 index 0000000..cb60dd9 --- /dev/null +++ b/lib/smarty3/plugins/function.fetch.php @@ -0,0 +1,221 @@ +<?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 + * + * @throws SmartyException + * @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; + } +} diff --git a/lib/smarty3/plugins/function.html_checkboxes.php b/lib/smarty3/plugins/function.html_checkboxes.php new file mode 100644 index 0000000..33f2efe --- /dev/null +++ b/lib/smarty3/plugins/function.html_checkboxes.php @@ -0,0 +1,249 @@ +<?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; + + case 'strict': + break; + + case 'disabled': + case 'readonly': + if (!empty($params[ 'strict' ])) { + if (!is_scalar($_val)) { + trigger_error("html_options: $_key attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", + E_USER_NOTICE); + } + + if ($_val === true || $_val === $_key) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"'; + } + + break; + } + // omit break; to fall through! + + 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; +} diff --git a/lib/smarty3/plugins/function.html_image.php b/lib/smarty3/plugins/function.html_image.php new file mode 100644 index 0000000..854af61 --- /dev/null +++ b/lib/smarty3/plugins/function.html_image.php @@ -0,0 +1,164 @@ +<?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 + * + * @throws SmartyException + * @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($_image_path)) { + 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; + } elseif (!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; +} diff --git a/lib/smarty3/plugins/function.html_options.php b/lib/smarty3/plugins/function.html_options.php new file mode 100644 index 0000000..20e6677 --- /dev/null +++ b/lib/smarty3/plugins/function.html_options.php @@ -0,0 +1,204 @@ +<?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 + * + * @return string + * @uses smarty_function_escape_special_chars() + */ +function smarty_function_html_options($params) +{ + 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; + + case 'strict': + break; + + case 'disabled': + case 'readonly': + if (!empty($params[ 'strict' ])) { + if (!is_scalar($_val)) { + trigger_error("html_options: $_key attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", + E_USER_NOTICE); + } + + if ($_val === true || $_val === $_key) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"'; + } + + break; + } + // omit break; to fall through! + + 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 ''; + } + } else { + $value = smarty_function_escape_special_chars((string) $value); + } + $_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; +} diff --git a/lib/smarty3/plugins/function.html_radios.php b/lib/smarty3/plugins/function.html_radios.php new file mode 100644 index 0000000..53b342d --- /dev/null +++ b/lib/smarty3/plugins/function.html_radios.php @@ -0,0 +1,232 @@ +<?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; + + case 'strict': + break; + + case 'disabled': + case 'readonly': + if (!empty($params[ 'strict' ])) { + if (!is_scalar($_val)) { + trigger_error("html_options: $_key attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", + E_USER_NOTICE); + } + + if ($_val === true || $_val === $_key) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"'; + } + + break; + } + // omit break; to fall through! + + 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; +} diff --git a/lib/smarty3/plugins/function.html_select_date.php b/lib/smarty3/plugins/function.html_select_date.php new file mode 100644 index 0000000..8191700 --- /dev/null +++ b/lib/smarty3/plugins/function.html_select_date.php @@ -0,0 +1,391 @@ +<?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 + * + * @return string + */ +function smarty_function_html_select_date($params) +{ + // 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); + } + } 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); + } + } 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; + } elseif ($t[ 0 ] == '+') { + $$key = (int) ($_current_year + (int) trim(substr($t, 1))); + } elseif ($t[ 0 ] == '-') { + $$key = (int) ($_current_year - (int) 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) { + $_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) { + $_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) { + $_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; +} diff --git a/lib/smarty3/plugins/function.html_select_time.php b/lib/smarty3/plugins/function.html_select_time.php new file mode 100644 index 0000000..4a3639b --- /dev/null +++ b/lib/smarty3/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 + * + * @return string + * @uses smarty_make_timestamp() + */ +function smarty_function_html_select_time($params) +{ + $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 > 0 && $_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; +} diff --git a/lib/smarty3/plugins/function.html_table.php b/lib/smarty3/plugins/function.html_table.php new file mode 100644 index 0000000..42e23e7 --- /dev/null +++ b/lib/smarty3/plugins/function.html_table.php @@ -0,0 +1,176 @@ +<?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 + * + * @return string + */ +function smarty_function_html_table($params) +{ + $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 : ''; +} diff --git a/lib/smarty3/plugins/function.mailto.php b/lib/smarty3/plugins/function.mailto.php new file mode 100644 index 0000000..9d2a5d2 --- /dev/null +++ b/lib/smarty3/plugins/function.mailto.php @@ -0,0 +1,153 @@ +<?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 + * + * @return string + */ +function smarty_function_mailto($params) +{ + 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>'; + } +} diff --git a/lib/smarty3/plugins/function.math.php b/lib/smarty3/plugins/function.math.php new file mode 100644 index 0000000..655fe72 --- /dev/null +++ b/lib/smarty3/plugins/function.math.php @@ -0,0 +1,104 @@ +<?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; + } + + // disallow backticks + if (strpos($equation, '`') !== false) { + trigger_error("math: backtick character not allowed in equation", E_USER_WARNING); + + return; + } + + // also disallow dollar signs + if (strpos($equation, '$') !== false) { + trigger_error("math: dollar signs not allowed in equation", 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_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)!', $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)); + } + } +} diff --git a/lib/smarty3/plugins/modifier.capitalize.php b/lib/smarty3/plugins/modifier.capitalize.php new file mode 100644 index 0000000..6513a04 --- /dev/null +++ b/lib/smarty3/plugins/modifier.capitalize.php @@ -0,0 +1,101 @@ +<?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_callback("!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER, + 'smarty_mod_cap_mbconvert_cb', $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_callback("!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_mbconvert2_cb', + $upper_string); + return $upper_string; + } + + // lowercase first + if ($lc_rest) { + $string = strtolower($string); + } + // uppercase (including hyphenated words) + $upper_string = + preg_replace_callback("!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_ucfirst_cb', + $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_callback("!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_ucfirst2_cb', + $upper_string); + return $upper_string; +} + +/* + * + * Bug: create_function() use exhausts memory when used in long loops + * Fix: use declared functions for callbacks instead of using create_function() + * Note: This can be fixed using anonymous functions instead, but that requires PHP >= 5.3 + * + * @author Kyle Renfrow + */ +function smarty_mod_cap_mbconvert_cb($matches) +{ + return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 2 ]), MB_CASE_UPPER, Smarty::$_CHARSET); +} + +function smarty_mod_cap_mbconvert2_cb($matches) +{ + return stripslashes($matches[ 1 ]) . mb_convert_case(stripslashes($matches[ 3 ]), MB_CASE_UPPER, Smarty::$_CHARSET); +} + +function smarty_mod_cap_ucfirst_cb($matches) +{ + return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 2 ])); +} + +function smarty_mod_cap_ucfirst2_cb($matches) +{ + return stripslashes($matches[ 1 ]) . ucfirst(stripslashes($matches[ 3 ])); +} diff --git a/lib/smarty3/plugins/modifier.date_format.php b/lib/smarty3/plugins/modifier.date_format.php new file mode 100644 index 0000000..28d6ff0 --- /dev/null +++ b/lib/smarty3/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; + } + /** + * require_once the {@link shared.make_timestamp.php} plugin + */ + require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); + if ($string != '' && $string != '0000-00-00' && $string != '0000-00-00 00:00:00') { + $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); + } +} diff --git a/lib/smarty3/plugins/modifier.debug_print_var.php b/lib/smarty3/plugins/modifier.debug_print_var.php new file mode 100644 index 0000000..34f85dc --- /dev/null +++ b/lib/smarty3/plugins/modifier.debug_print_var.php @@ -0,0 +1,112 @@ +<?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 int $max maximum recursion depth if $var is an array or object + * @param int $length maximum string length if $var is a string + * @param int $depth actual recursion depth + * @param array $objects processed objects in actual depth to prevent recursive object processing + * + * @return string + */ +function smarty_modifier_debug_print_var($var, $max = 10, $length = 40, $depth = 0, $objects = array()) +{ + $_replace = array("\n" => '\n', "\r" => '\r', "\t" => '\t'); + switch (gettype($var)) { + case 'array' : + $results = '<b>Array (' . count($var) . ')</b>'; + if ($depth == $max) { + break; + } + 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, $max, $length, ++ $depth, $objects); + $depth --; + } + break; + + case 'object' : + $object_vars = get_object_vars($var); + $results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>'; + if (in_array($var, $objects)) { + $results .= ' called recursive'; + break; + } + if ($depth == $max) { + break; + } + $objects[] = $var; + 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, $max, $length, ++ $depth, $objects); + $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 . '"', ENT_QUOTES, Smarty::$_CHARSET); + 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, ENT_QUOTES, Smarty::$_CHARSET); + } + + return $results; +} diff --git a/lib/smarty3/plugins/modifier.escape.php b/lib/smarty3/plugins/modifier.escape.php new file mode 100644 index 0000000..b9842aa --- /dev/null +++ b/lib/smarty3/plugins/modifier.escape.php @@ -0,0 +1,200 @@ +<?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/docs/en/language.modifier.escape + * @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) +{ + static $_double_encode = null; + if ($_double_encode === null) { + $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>='); + } + + if (!$char_set) { + $char_set = Smarty::$_CHARSET; + } + + switch ($esc_type) { + case 'html': + if ($_double_encode) { + // php >=5.3.2 - go native + return htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); + } else { + if ($double_encode) { + // php <5.2.3 - only handle double encoding + return htmlspecialchars($string, ENT_QUOTES, $char_set); + } else { + // php <5.2.3 - prevent double encoding + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlspecialchars($string, ENT_QUOTES, $char_set); + $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); + + return $string; + } + } + + case 'htmlall': + if (Smarty::$_MBSTRING) { + // mb_convert_encoding ignores htmlspecialchars() + if ($_double_encode) { + // php >=5.3.2 - go native + $string = htmlspecialchars($string, ENT_QUOTES, $char_set, $double_encode); + } else { + if ($double_encode) { + // php <5.2.3 - only handle double encoding + $string = htmlspecialchars($string, ENT_QUOTES, $char_set); + } else { + // php <5.2.3 - prevent double encoding + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlspecialchars($string, ENT_QUOTES, $char_set); + $string = + str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); + + return $string; + } + } + + // htmlentities() won't convert everything, so use mb_convert_encoding + return mb_convert_encoding($string, 'HTML-ENTITIES', $char_set); + } + + // no MBString fallback + if ($_double_encode) { + return htmlentities($string, ENT_QUOTES, $char_set, $double_encode); + } else { + if ($double_encode) { + return htmlentities($string, ENT_QUOTES, $char_set); + } else { + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\\1%%%SMARTY_END%%%', $string); + $string = htmlentities($string, ENT_QUOTES, $char_set); + $string = str_replace(array('%%%SMARTY_START%%%', '%%%SMARTY_END%%%'), array('&', ';'), $string); + + return $string; + } + } + + 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; + } +} diff --git a/lib/smarty3/plugins/modifier.regex_replace.php b/lib/smarty3/plugins/modifier.regex_replace.php new file mode 100644 index 0000000..85f41fd --- /dev/null +++ b/lib/smarty3/plugins/modifier.regex_replace.php @@ -0,0 +1,58 @@ +<?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 + * @param int $limit the maximum number of replacements + * + * @return string + */ +function smarty_modifier_regex_replace($string, $search, $replace, $limit = - 1) +{ + 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, $limit); +} + +/** + * @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; +} diff --git a/lib/smarty3/plugins/modifier.replace.php b/lib/smarty3/plugins/modifier.replace.php new file mode 100644 index 0000000..aa5e857 --- /dev/null +++ b/lib/smarty3/plugins/modifier.replace.php @@ -0,0 +1,34 @@ +<?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); +} diff --git a/lib/smarty3/plugins/modifier.spacify.php b/lib/smarty3/plugins/modifier.spacify.php new file mode 100644 index 0000000..e5c41ad --- /dev/null +++ b/lib/smarty3/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)); +} diff --git a/lib/smarty3/plugins/modifier.truncate.php b/lib/smarty3/plugins/modifier.truncate.php new file mode 100644 index 0000000..6fe8442 --- /dev/null +++ b/lib/smarty3/plugins/modifier.truncate.php @@ -0,0 +1,66 @@ +<?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; +} diff --git a/lib/smarty3/plugins/modifiercompiler.cat.php b/lib/smarty3/plugins/modifiercompiler.cat.php new file mode 100644 index 0000000..db9d81f --- /dev/null +++ b/lib/smarty3/plugins/modifiercompiler.cat.php @@ -0,0 +1,29 @@ +<?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) +{ + return '(' . implode(').(', $params) . ')'; +} diff --git a/lib/smarty3/plugins/modifiercompiler.count_characters.php b/lib/smarty3/plugins/modifiercompiler.count_characters.php new file mode 100644 index 0000000..0a3ce25 --- /dev/null +++ b/lib/smarty3/plugins/modifiercompiler.count_characters.php @@ -0,0 +1,32 @@ +<?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) +{ + 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 ] . ')'; +} diff --git a/lib/smarty3/plugins/modifiercompiler.count_paragraphs.php b/lib/smarty3/plugins/modifiercompiler.count_paragraphs.php new file mode 100644 index 0000000..f7f4477 --- /dev/null +++ b/lib/smarty3/plugins/modifiercompiler.count_paragraphs.php @@ -0,0 +1,27 @@ +<?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) +{ + // count \r or \n characters + return '(preg_match_all(\'#[\r\n]+#\', ' . $params[ 0 ] . ', $tmp)+1)'; +} diff --git a/lib/smarty3/plugins/modifiercompiler.count_sentences.php b/lib/smarty3/plugins/modifiercompiler.count_sentences.php new file mode 100644 index 0000000..2003292 --- /dev/null +++ b/lib/smarty3/plugins/modifiercompiler.count_sentences.php @@ -0,0 +1,27 @@ +<?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) +{ + // 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)'; +} diff --git a/lib/smarty3/plugins/modifiercompiler.count_words.php b/lib/smarty3/plugins/modifiercompiler.count_words.php new file mode 100644 index 0000000..f20a197 --- /dev/null +++ b/lib/smarty3/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) +{ + 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 ] . ')'; +} diff --git a/lib/smarty3/plugins/modifiercompiler.default.php b/lib/smarty3/plugins/modifiercompiler.default.php new file mode 100644 index 0000000..2c4c00a --- /dev/null +++ b/lib/smarty3/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) +{ + $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; +} diff --git a/lib/smarty3/plugins/modifiercompiler.escape.php b/lib/smarty3/plugins/modifiercompiler.escape.php new file mode 100644 index 0000000..4816106 --- /dev/null +++ b/lib/smarty3/plugins/modifiercompiler.escape.php @@ -0,0 +1,117 @@ +<?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 + * @param $compiler + * + * @return string with compiled code + */ +function smarty_modifiercompiler_escape($params, $compiler) +{ + static $_double_encode = null; + if ($_double_encode === null) { + $_double_encode = version_compare(PHP_VERSION, '5.2.3', '>='); + } + + 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': + if ($_double_encode) { + return 'htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ', ' . + var_export($double_encode, true) . ')'; + } elseif ($double_encode) { + return 'htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ')'; + } else { + // fall back to modifier.escape.php + } + + case 'htmlall': + if (Smarty::$_MBSTRING) { + if ($_double_encode) { + // php >=5.2.3 - go native + 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) . ')'; + } elseif ($double_encode) { + // php <5.2.3 - only handle double encoding + return 'mb_convert_encoding(htmlspecialchars(' . $params[ 0 ] . ', ENT_QUOTES, ' . + var_export($char_set, true) . '), "HTML-ENTITIES", ' . var_export($char_set, true) . ')'; + } else { + // fall back to modifier.escape.php + } + } + + // no MBString fallback + if ($_double_encode) { + // php >=5.2.3 - go native + return 'htmlentities(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ', ' . + var_export($double_encode, true) . ')'; + } elseif ($double_encode) { + // php <5.2.3 - only handle double encoding + return 'htmlentities(' . $params[ 0 ] . ', ENT_QUOTES, ' . var_export($char_set, true) . ')'; + } else { + // fall back to modifier.escape.php + } + + 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->template->caching && ($compiler->tag_nocache | $compiler->nocache)) { + $compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'file' ] = + SMARTY_PLUGINS_DIR . 'modifier.escape.php'; + $compiler->parent_compiler->template->compiled->required_plugins[ 'nocache' ][ 'escape' ][ 'modifier' ][ 'function' ] = + 'smarty_modifier_escape'; + } else { + $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'file' ] = + SMARTY_PLUGINS_DIR . 'modifier.escape.php'; + $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'escape' ][ 'modifier' ][ 'function' ] = + 'smarty_modifier_escape'; + } + + return 'smarty_modifier_escape(' . join(', ', $params) . ')'; +} diff --git a/lib/smarty3/plugins/modifiercompiler.from_charset.php b/lib/smarty3/plugins/modifiercompiler.from_charset.php new file mode 100644 index 0000000..e25a957 --- /dev/null +++ b/lib/smarty3/plugins/modifiercompiler.from_charset.php @@ -0,0 +1,33 @@ +<?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) +{ + 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 ] . ')'; +} diff --git a/lib/smarty3/plugins/modifiercompiler.indent.php b/lib/smarty3/plugins/modifiercompiler.indent.php new file mode 100644 index 0000000..851f184 --- /dev/null +++ b/lib/smarty3/plugins/modifiercompiler.indent.php @@ -0,0 +1,33 @@ +<?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) +{ + 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 ] . ')'; +} diff --git a/lib/smarty3/plugins/modifiercompiler.lower.php b/lib/smarty3/plugins/modifiercompiler.lower.php new file mode 100644 index 0000000..a335eff --- /dev/null +++ b/lib/smarty3/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) +{ + if (Smarty::$_MBSTRING) { + return 'mb_strtolower(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')'; + } + // no MBString fallback + return 'strtolower(' . $params[ 0 ] . ')'; +} diff --git a/lib/smarty3/plugins/modifiercompiler.noprint.php b/lib/smarty3/plugins/modifiercompiler.noprint.php new file mode 100644 index 0000000..4906908 --- /dev/null +++ b/lib/smarty3/plugins/modifiercompiler.noprint.php @@ -0,0 +1,21 @@ +<?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 + * @return string with compiled code + */ +function smarty_modifiercompiler_noprint() +{ + return "''"; +} diff --git a/lib/smarty3/plugins/modifiercompiler.string_format.php b/lib/smarty3/plugins/modifiercompiler.string_format.php new file mode 100644 index 0000000..bcf9883 --- /dev/null +++ b/lib/smarty3/plugins/modifiercompiler.string_format.php @@ -0,0 +1,25 @@ +<?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) +{ + return 'sprintf(' . $params[ 1 ] . ',' . $params[ 0 ] . ')'; +} diff --git a/lib/smarty3/plugins/modifiercompiler.strip.php b/lib/smarty3/plugins/modifiercompiler.strip.php new file mode 100644 index 0000000..8173eed --- /dev/null +++ b/lib/smarty3/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) +{ + if (!isset($params[ 1 ])) { + $params[ 1 ] = "' '"; + } + + return "preg_replace('!\s+!" . Smarty::$_UTF8_MODIFIER . "', {$params[1]},{$params[0]})"; +} diff --git a/lib/smarty3/plugins/modifiercompiler.strip_tags.php b/lib/smarty3/plugins/modifiercompiler.strip_tags.php new file mode 100644 index 0000000..e56bf93 --- /dev/null +++ b/lib/smarty3/plugins/modifiercompiler.strip_tags.php @@ -0,0 +1,29 @@ +<?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/docs/en/language.modifier.strip.tags.tpl strip_tags (Smarty online manual) + * @author Uwe Tews + * + * @param array $params parameters + * + * @return string with compiled code + */ +function smarty_modifiercompiler_strip_tags($params) +{ + if (!isset($params[ 1 ]) || $params[ 1 ] === true || trim($params[ 1 ], '"') == 'true') { + return "preg_replace('!<[^>]*?>!', ' ', {$params[0]})"; + } else { + return 'strip_tags(' . $params[ 0 ] . ')'; + } +} diff --git a/lib/smarty3/plugins/modifiercompiler.to_charset.php b/lib/smarty3/plugins/modifiercompiler.to_charset.php new file mode 100644 index 0000000..fea8d82 --- /dev/null +++ b/lib/smarty3/plugins/modifiercompiler.to_charset.php @@ -0,0 +1,33 @@ +<?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) +{ + 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) . '")'; +} diff --git a/lib/smarty3/plugins/modifiercompiler.unescape.php b/lib/smarty3/plugins/modifiercompiler.unescape.php new file mode 100644 index 0000000..a3409bc --- /dev/null +++ b/lib/smarty3/plugins/modifiercompiler.unescape.php @@ -0,0 +1,50 @@ +<?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) +{ + 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 ]; + } +} diff --git a/lib/smarty3/plugins/modifiercompiler.upper.php b/lib/smarty3/plugins/modifiercompiler.upper.php new file mode 100644 index 0000000..a083c4f --- /dev/null +++ b/lib/smarty3/plugins/modifiercompiler.upper.php @@ -0,0 +1,29 @@ +<?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) +{ + if (Smarty::$_MBSTRING) { + return 'mb_strtoupper(' . $params[ 0 ] . ', \'' . addslashes(Smarty::$_CHARSET) . '\')'; + } + // no MBString fallback + return 'strtoupper(' . $params[ 0 ] . ')'; +} diff --git a/lib/smarty3/plugins/modifiercompiler.wordwrap.php b/lib/smarty3/plugins/modifiercompiler.wordwrap.php new file mode 100644 index 0000000..9184973 --- /dev/null +++ b/lib/smarty3/plugins/modifiercompiler.wordwrap.php @@ -0,0 +1,51 @@ +<?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 + * @param $compiler + * + * @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->template->caching && ($compiler->tag_nocache | $compiler->nocache)) { + $compiler->parent_compiler->template->compiled->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->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'wordwrap' ][ 'modifier' ][ 'file' ] = + SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php'; + $compiler->parent_compiler->template->compiled->required_plugins[ 'compiled' ][ 'wordwrap' ][ 'modifier' ][ 'function' ] = + 'smarty_mb_wordwrap'; + } + $function = 'smarty_mb_wordwrap'; + } + + return $function . '(' . $params[ 0 ] . ',' . $params[ 1 ] . ',' . $params[ 2 ] . ',' . $params[ 3 ] . ')'; +} diff --git a/lib/smarty3/plugins/outputfilter.trimwhitespace.php b/lib/smarty3/plugins/outputfilter.trimwhitespace.php new file mode 100644 index 0000000..1a67123 --- /dev/null +++ b/lib/smarty3/plugins/outputfilter.trimwhitespace.php @@ -0,0 +1,89 @@ +<?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 + * + * @return string filtered output + * @todo substr_replace() is not overloaded by mbstring.func_overload - so this function might fail! + */ +function smarty_outputfilter_trimwhitespace($source) +{ + $store = array(); + $_store = 0; + $_offset = 0; + + // Unify Line-Breaks to \n + $source = preg_replace("/\015\012|\015|\012/", "\n", $source); + + // capture Internet Explorer and KnockoutJS Conditional Comments + if (preg_match_all('#<!--((\[[^\]]+\]>.*?<!\[[^\]]+\])|(\s*/?ko\s+.+))-->#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 + // yes, even the ones in <script> - see http://stackoverflow.com/a/808850/515124 + $source = preg_replace('#<!--.*?-->#ms', '', $source); + + // capture html elements not to be messed with + $_offset = 0; + if (preg_match_all('#(<script[^>]*>.*?</script[^>]*>)|(<textarea[^>]*>.*?</textarea[^>]*>)|(<pre[^>]*>.*?</pre[^>]*>)#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*("[^"]*?")|(\'[^\']*?\'))|<[a-z0-9_]+)\s+([a-z/>])#is' => '\1 \5', + // 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 ); + + $_offset = 0; + if (preg_match_all('#@!@SMARTY:([0-9]+):SMARTY@!@#is', $source, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) { + foreach ($matches as $match) { + $_length = strlen($match[ 0 ][ 0 ]); + $replace = $store[ $match[ 1 ][ 0 ] ]; + $source = substr_replace($source, $replace, $match[ 0 ][ 1 ] + $_offset, $_length); + + $_offset += strlen($replace) - $_length; + $_store ++; + } + } + + return $source; +} diff --git a/lib/smarty3/plugins/shared.escape_special_chars.php b/lib/smarty3/plugins/shared.escape_special_chars.php new file mode 100644 index 0000000..b68fe4b --- /dev/null +++ b/lib/smarty3/plugins/shared.escape_special_chars.php @@ -0,0 +1,34 @@ +<?php +/** + * Smarty shared plugin + * + * @package Smarty + * @subpackage PluginsShared + */ + +/** + * 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)) { + if (version_compare(PHP_VERSION, '5.2.3', '>=')) { + $string = htmlspecialchars($string, ENT_COMPAT, Smarty::$_CHARSET, false); + } else { + $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; +} diff --git a/lib/smarty3/plugins/shared.literal_compiler_param.php b/lib/smarty3/plugins/shared.literal_compiler_param.php new file mode 100644 index 0000000..8a3711d --- /dev/null +++ b/lib/smarty3/plugins/shared.literal_compiler_param.php @@ -0,0 +1,36 @@ +<?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/smarty3/plugins/shared.make_timestamp.php b/lib/smarty3/plugins/shared.make_timestamp.php new file mode 100644 index 0000000..67f8624 --- /dev/null +++ b/lib/smarty3/plugins/shared.make_timestamp.php @@ -0,0 +1,45 @@ +<?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 || + (interface_exists('DateTimeInterface', false) && $string instanceof DateTimeInterface) + ) { + return (int) $string->format('U'); // PHP 5.2 BC + } 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/smarty3/plugins/shared.mb_str_replace.php b/lib/smarty3/plugins/shared.mb_str_replace.php new file mode 100644 index 0000000..0c3ffe2 --- /dev/null +++ b/lib/smarty3/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; + } +} diff --git a/lib/smarty3/plugins/shared.mb_unicode.php b/lib/smarty3/plugins/shared.mb_unicode.php new file mode 100644 index 0000000..0f790b5 --- /dev/null +++ b/lib/smarty3/plugins/shared.mb_unicode.php @@ -0,0 +1,54 @@ +<?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; +} diff --git a/lib/smarty3/plugins/shared.mb_wordwrap.php b/lib/smarty3/plugins/shared.mb_wordwrap.php new file mode 100644 index 0000000..21632a1 --- /dev/null +++ b/lib/smarty3/plugins/shared.mb_wordwrap.php @@ -0,0 +1,75 @@ +<?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; + $_space = false; + + foreach ($tokens as $_token) { + $token_length = mb_strlen($_token, Smarty::$_CHARSET); + $_tokens = array($_token); + if ($token_length > $width) { + if ($cut) { + $_tokens = preg_split('!(.{' . $width . '})!S' . Smarty::$_UTF8_MODIFIER, $_token, - 1, + PREG_SPLIT_NO_EMPTY + PREG_SPLIT_DELIM_CAPTURE); + } + } + + 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) { + $t = mb_substr($t, 0, - 1, Smarty::$_CHARSET); + } + + if (!$_space) { + // add the break before the token + if (!empty($t)) { + $t .= $break; + } + $length = $token_length; + } + } elseif ($token == "\n") { + // hard break must reset counters + $_previous = 0; + $length = 0; + } + $_previous = $_space; + // add the token + $t .= $token; + } + } + + return $t; + } +} diff --git a/lib/smarty3/plugins/variablefilter.htmlspecialchars.php b/lib/smarty3/plugins/variablefilter.htmlspecialchars.php new file mode 100644 index 0000000..aecd1e7 --- /dev/null +++ b/lib/smarty3/plugins/variablefilter.htmlspecialchars.php @@ -0,0 +1,19 @@ +<?php +/** + * Smarty plugin + * + * @package Smarty + * @subpackage PluginsFilter + */ + +/** + * Smarty htmlspecialchars variablefilter plugin + * + * @param string $source input string + * + * @return string filtered output + */ +function smarty_variablefilter_htmlspecialchars($source) +{ + return htmlspecialchars($source, ENT_QUOTES, Smarty::$_CHARSET); +} |