/** * hiweb_tpl {math} function plugin * Type: function<br> * Name: math<br> * Purpose: handle math computations in template * * @link http://www.smurty.net/manual/en/language.function.math.php {math} * (hiweb_tpl online manual) * @author Monte Ohrt <monte at ohrt dot com> * * @param array $params parameters * @param Smurty_Internal_Template $template template object * * @return string|null */ function smurty_function_math($params, $template) { static $_allowed_funcs = array('int' => true, 'abs' => true, 'ceil' => true, 'cos' => true, 'exp' => true, 'floor' => true, 'log' => true, 'log10' => true, 'max' => true, 'min' => true, 'pi' => true, 'pow' => true, 'rand' => true, 'round' => true, 'sin' => true, 'sqrt' => true, 'srand' => true, 'tan' => true); // be sure equation parameter is present if (empty($params['equation'])) { trigger_error("math: missing equation parameter", E_USER_WARNING); return; } $equation = $params['equation']; // make sure parenthesis are balanced if (substr_count($equation, "(") != substr_count($equation, ")")) { trigger_error("math: unbalanced parenthesis", E_USER_WARNING); return; } // match all vars in equation, make sure all are passed preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]*)!", $equation, $match); foreach ($match[1] as $curr_var) { if ($curr_var && !isset($params[$curr_var]) && !isset($_allowed_funcs[$curr_var])) { trigger_error("math: function call {$curr_var} not allowed", E_USER_WARNING); return; } } foreach ($params as $key => $val) { if ($key != "equation" && $key != "format" && $key != "assign") { // make sure value is not empty if (strlen($val) == 0) { trigger_error("math: parameter {$key} is empty", E_USER_WARNING); return; } if (!is_numeric($val)) { trigger_error("math: parameter {$key}: is not numeric", E_USER_WARNING); return; } $equation = preg_replace("/\\b{$key}\\b/", " \$params['{$key}'] ", $equation); } } $smurty_math_result = null; eval("\$smurty_math_result = " . $equation . ";"); if (empty($params['format'])) { if (empty($params['assign'])) { return $smurty_math_result; } else { $template->assign($params['assign'], $smurty_math_result); } } else { if (empty($params['assign'])) { printf($params['format'], $smurty_math_result); } else { $template->assign($params['assign'], sprintf($params['format'], $smurty_math_result)); } } }
/** * hiweb_tpl {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.smurty.net/manual/en/language.function.cycle.php {cycle} * (hiweb_tpl online manual) * @author Monte Ohrt <monte at ohrt dot com> * @author credit to Mark Priatel <*****@*****.**> * @author credit to Gerard <*****@*****.**> * @author credit to Jason Sweat <*****@*****.**> * @version 1.3 * * @param array $params parameters * @param Smurty_Internal_Template $template template object * * @return string|null */ function smurty_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; }
/** * hiweb_tpl {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.smurty.net/manual/en/language.function.counter.php {counter} * (hiweb_tpl online manual) * * @param array $params parameters * @param Smurty_Internal_Template $template template object * * @return string|null */ function smurty_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; }
/** * hiweb_tpl {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://smurty.php.net/manual/en/language.function.html.radios.php {html_radios} * (hiweb_tpl online manual) * @author Christopher Kvarme <*****@*****.**> * @author credits to Monte Ohrt <monte at ohrt dot com> * @version 1.0 * * @param array $params parameters * @param Smurty_Internal_Template $template template object * * @return string * @uses smurty_function_escape_special_chars() */ function smurty_function_html_radios($params, $template) { require_once HIWEB_TPL_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 = smurty_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 . '="' . smurty_function_escape_special_chars($_key) . '"'; } break; } // omit break; to fall through! // omit break; to fall through! default: if (!is_array($_val)) { $extra .= ' ' . $_key . '="' . smurty_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[] = smurty_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[] = smurty_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); } }
/** * hiweb_tpl {fetch} plugin * Type: function<br> * Name: fetch<br> * Purpose: fetch file, web or ftp data and display results * * @link http://www.smurty.net/manual/en/language.function.fetch.php {fetch} * (hiweb_tpl online manual) * @author Monte Ohrt <monte at ohrt dot com> * * @param array $params parameters * @param Smurty_Internal_Template $template template object * * @throws SmurtyException * @return string|null if the assign parameter is passed, hiweb_tpl assigns the result to a template variable */ function smurty_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->smurty->security_policy)) { if ($protocol) { // remote resource (or php stream, …) if (!$template->smurty->security_policy->isTrustedUri($params['file'])) { return; } } else { // local file if (!$template->smurty->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 = "hiweb_tpl Template Engine " . hiweb_tpl::HIWEB_TPL_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 SmurtyException("{fetch} cannot read resource '" . $params['file'] . "'"); } } if (!empty($params['assign'])) { $template->assign($params['assign'], $content); } else { return $content; } }
/** * hiweb_tpl {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.smurty.net/manual/en/language.function.textformat.php {textformat} * (hiweb_tpl online manual) * * @param array $params parameters * @param string $content contents of the block * @param Smurty_Internal_Template $template template object * @param boolean &$repeat repeat flag * * @return string content re-formatted * @author Monte Ohrt <monte at ohrt dot com> */ function smurty_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+!' . hiweb_tpl::$_UTF8_MODIFIER, '!(^\\s+)|(\\s+$)!' . hiweb_tpl::$_UTF8_MODIFIER), array(' ', ''), $_paragraph); // indent first line if ($indent_first > 0) { $_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph; } // wordwrap sentences if (hiweb_tpl::$_MBSTRING) { require_once HIWEB_TPL_PLUGINS_DIR . 'shared.mb_wordwrap.php'; $_paragraph = smurty_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; } }
/** * Opens a window for the hiweb_tpl Debugging Consol and display the data * * @param Smurty_Internal_Template|hiweb_tpl $obj object to debug */ public static function display_debug($obj) { // prepare information of assigned variables $ptr = self::get_debug_vars($obj); if ($obj instanceof hiweb_tpl) { $smurty = clone $obj; } else { $smurty = clone $obj->smurty; } $_assigned_vars = $ptr->tpl_vars; ksort($_assigned_vars); $_config_vars = $ptr->config_vars; ksort($_config_vars); $smurty->registered_filters = array(); $smurty->autoload_filters = array(); $smurty->default_modifiers = array(); $smurty->force_compile = false; $smurty->left_delimiter = '{'; $smurty->right_delimiter = '}'; $smurty->debugging = false; $smurty->debugging_ctrl = 'NONE'; $smurty->force_compile = false; $_template = new Smurty_Internal_Template($smurty->debug_tpl, $smurty); $_template->caching = false; $_template->disableSecurity(); $_template->cache_id = null; $_template->compile_id = null; if ($obj instanceof Smurty_Internal_Template) { $_template->assign('template_name', $obj->source->type . ':' . $obj->source->name); } if ($obj instanceof hiweb_tpl) { $_template->assign('template_data', self::$template_data); } else { $_template->assign('template_data', null); } $_template->assign('assigned_vars', $_assigned_vars); $_template->assign('config_vars', $_config_vars); $_template->assign('execution_time', microtime(true) - $smurty->start_time); echo $_template->fetch(); }