Implemented plugin architecture.

This commit is contained in:
andrey
2002-01-31 20:49:40 +00:00
parent 70b076bf0b
commit e6fc0e5291
69 changed files with 3561 additions and 1706 deletions

View File

@@ -6,4 +6,5 @@ Monte Ohrt <monte@ispi.net>
Andrei Zmievski <andrei@php.net>
- rewrote parser from scratch
- maintains code base
- plugin architecture
- wrote Config_File class

View File

@@ -3,7 +3,8 @@ Monte Ohrt <monte@ispi.net>:
concept" implementation, and maintains documentation & code base.
Andrei Zmievski <andrei@php.net>:
Rewrote parser from scratch and maintains code base.
Rewrote parser from scratch, developed plugin architecture, and maintains
code base.
Anne Holz <anne@ispi.net>:
Provided creative input with respect to web design.
@@ -18,5 +19,5 @@ A special thanks goes to the members of the php-template mailing list and the
smarty mailing list, too numerous to list, who are sharing and bringing many
ideas to the table and contributing source code.
Rasmus Lerdorf <rasmus@php.net>: For starting what eventually became
the coolest programming language ever.
Rasmus Lerdorf <rasmus@php.net>: For starting what eventually became the
coolest programming language ever.

View File

@@ -9,7 +9,7 @@ require_once "PEAR.php";
* @author Andrei Zmievski <andrei@php.net>
* @access public
*
* Copyright: 2001 ispi of Lincoln, Inc.
* Copyright: 2001,2002 ispi of Lincoln, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public

2
README
View File

@@ -64,6 +64,6 @@ DESCRIPTION:
* arbitrary template sources (flat files, databases, etc.)
COPYRIGHT:
Copyright (c) 2001 ispi of Lincoln, Inc. All rights reserved.
Copyright (c) 2001,2002 ispi of Lincoln, Inc. All rights reserved.
This software is released under the GNU Lesser General Public License.
Please read the disclaimer at the top of the Smarty.class.php file.

View File

@@ -1,891 +0,0 @@
<?php
/*
* Project: Smarty: the PHP compiled template engine
* File: Smarty.addons.php
* Author: Monte Ohrt <monte@ispi.net>
* Andrei Zmievski <andrei@php.net>
* Version: 1.5.2
* Copyright: 2001 ispi of Lincoln, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* You may contact the authors of Smarty by e-mail at:
* monte@ispi.net
* andrei@php.net
*
* Or, write to:
* Monte Ohrt
* Directory of Technology, ispi
* 237 S. 70th suite 220
* Lincoln, NE 68510
*
* The latest version of Smarty can be obtained from:
* http://www.phpinsider.com
*
*/
/*============================================*\
Modifiers
\*============================================*/
/*======================================================================*\
Function: smarty_mod_escape
Purpose: Escape the string according to escapement type
\*======================================================================*/
function smarty_mod_escape($string, $esc_type = 'html')
{
switch ($esc_type) {
case 'html':
return htmlspecialchars($string, ENT_QUOTES);
case 'url':
return urlencode($string);
case 'quotes':
// escape unescaped single quotes
return preg_replace("%(?<!\\\\)'%", "\\'", $string);
default:
return $string;
}
}
/*======================================================================*\
Function: smarty_mod_truncate
Purpose: Truncate a string to a certain length if necessary,
optionally splitting in the middle of a word, and
appending the $etc string.
\*======================================================================*/
function smarty_mod_truncate($string, $length = 80, $etc = '...', $break_words = false)
{
if ($length == 0)
return '';
if (strlen($string) > $length) {
$length -= strlen($etc);
$fragment = substr($string, 0, $length+1);
if ($break_words)
$fragment = substr($fragment, 0, -1);
else
$fragment = preg_replace('/\s+(\S+)?$/', '', $fragment);
return $fragment.$etc;
} else
return $string;
}
/*======================================================================*\
Function: smarty_mod_spacify
Purpose: add spaces between characters in a string
\*======================================================================*/
function smarty_mod_spacify($string, $spacify_char = ' ')
{
return implode($spacify_char, preg_split('//', $string, -1, PREG_SPLIT_NO_EMPTY));
}
/*======================================================================*\
Function: smarty_mod_date_format
Purpose: format datestamps via strftime
\*======================================================================*/
function smarty_mod_date_format($string, $format="%b %e, %Y")
{
return strftime($format, smarty_make_timestamp($string));
}
/*======================================================================*\
Function: smarty_make_timestamp
Purpose: used by other smarty functions to make a timestamp
from a string of characters.
\*======================================================================*/
function smarty_make_timestamp($string)
{
if(empty($string)) {
$string = "now";
}
$time = strtotime($string);
if (is_numeric($time) && $time != -1)
return $time;
// is mysql timestamp format of YYYYMMDDHHMMSS?
if (is_numeric($string) && strlen($string) == 14) {
$time = 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));
return $time;
}
// can't decipher, just return it
return $string;
}
/*======================================================================*\
Function: smarty_mod_string_format
Purpose: format strings via sprintf
\*======================================================================*/
function smarty_mod_string_format($string, $format)
{
return sprintf($format, $string);
}
/*======================================================================*\
Function: smarty_mod_replace
Purpose: simple search/replace
\*======================================================================*/
function smarty_mod_replace($string, $search, $replace)
{
return str_replace($search, $replace, $string);
}
/*======================================================================*\
Function: smarty_mod_regex_replace
Purpose: regular epxression search/replace
\*======================================================================*/
function smarty_mod_regex_replace($string, $search, $replace)
{
return preg_replace($search, $replace, $string);
}
/*======================================================================*\
Function: smarty_mod_strip_tags
Purpose: strip html tags from text
\*======================================================================*/
function smarty_mod_strip_tags($string, $replace_with_space = true)
{
if ($replace_with_space)
return preg_replace('!<[^>]*?>!', ' ', $string);
else
return strip_tags($string);
}
/*======================================================================*\
Function: smarty_mod_default
Purpose: designate default text for empty variables
\*======================================================================*/
function smarty_mod_default($string, $default="")
{
if (empty($string))
return $default;
else
return $string;
}
/*======================================================================*\
Function: smarty_func_assign
Purpose: assign a value to a template variable
\*======================================================================*/
function smarty_func_assign($args, &$smarty_obj)
{
extract($args);
if (empty($var)) {
$smarty_obj->_trigger_error_msg("assign: missing 'var' parameter");
return;
}
if (!in_array('value', array_keys($args))) {
$smarty_obj->_trigger_error_msg("assign: missing 'value' parameter");
return;
}
$smarty_obj->assign($var, $value);
return true;
}
/*============================================*\
Custom tag functions
\*============================================*/
/*======================================================================*\
Function: smarty_func_html_options
Purpose: Prints the list of <option> tags generated from
the passed parameters
\*======================================================================*/
function smarty_func_html_options()
{
$print_result = true;
extract(func_get_arg(0));
$html_result = "";
settype($selected, 'array');
if (isset($options)) {
settype($options, 'array');
foreach ($options as $key => $value) {
$html_result .= "<option value=\"$key\"";
if (in_array($key, $selected))
$html_result .= " selected=\"selected\"";
$html_result .= ">$value</option>\n";
}
} else {
settype($output, 'array');
settype($values, 'array');
for ($i = 0; $i < count($output); $i++) {
/* By default, check value against $selected */
$sel_check = $values[$i];
$html_result .= "<option";
if ($i < count($values))
$html_result .= " value=\"".$values[$i]."\"";
else
$sel_check = $output[$i]; /* if more outputs than values, then
check output against $selected */
if (in_array($sel_check, $selected))
$html_result .= " selected";
$html_result .= ">".$output[$i]."</option>\n";
}
}
if ($print_result)
print $html_result;
else
return $html_result;
}
/*======================================================================*\
Function: smarty_func_html_select_date
Purpose: Prints the dropdowns for date selection.
\*======================================================================*/
function smarty_func_html_select_date()
{
/* Default values. */
$prefix = "Date_";
$time = time();
$start_year = strftime("%Y");
$end_year = $start_year;
$display_days = true;
$display_months = true;
$display_years = true;
$month_format = "%B";
$day_format = "%02d";
$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";
extract(func_get_arg(0));
$time = smarty_make_timestamp($time);
$field_order = strtoupper($field_order);
$html_result = $month_result = $day_result = $year_result = "";
if ($display_months) {
$month_names = array();
for ($i = 1; $i <= 12; $i++)
$month_names[] = strftime($month_format, mktime(0, 0, 0, $i, 1, 2000));
$month_result .= '<select name=';
if (null !== $field_array){
$month_result .= '"' . $field_array . '[' . $prefix . 'Month]"';
} else {
$month_result .= '"' . $prefix . 'Month"';
}
if (null !== $month_size){
$month_result .= ' size="' . $month_size . '"';
}
if (null !== $month_extra){
$month_result .= ' ' . $month_extra;
}
if (null !== $all_extra){
$month_result .= ' ' . $all_extra;
}
$month_result .= '>'."\n";
$month_result .= smarty_func_html_options(array('output' => $month_names,
'values' => range(1, 12),
'selected' => strftime("%m", $time),
'print_result' => false));
$month_result .= '</select>';
}
if ($display_days) {
$days = range(1, 31);
for ($i = 0; $i < count($days); $i++)
$days[$i] = sprintf($day_format, $days[$i]);
$day_result .= '<select name=';
if (null !== $field_array){
$day_result .= '"' . $field_array . '[' . $prefix . 'Day]"';
} else {
$day_result .= '"' . $prefix . 'Day"';
}
if (null !== $day_size){
$day_result .= ' size="' . $day_size . '"';
}
if (null !== $all_extra){
$day_result .= ' ' . $all_extra;
}
if (null !== $day_extra){
$day_result .= ' ' . $day_extra;
}
$day_result .= '>'."\n";
$day_result .= smarty_func_html_options(array('output' => $days,
'values' => range(1, 31),
'selected' => strftime("%d", $time),
'print_result' => false));
$day_result .= '</select>';
}
if ($display_years) {
if (null !== $field_array){
$year_name = $field_array . '[' . $prefix . 'Year]';
} else {
$year_name = $prefix . 'Year';
}
if ($year_as_text) {
$year_result .= '<input type="text" name="' . $year_name . '" value="'.strftime('%Y', $time).'" size="4" maxlength="4"';
if (null !== $all_extra){
$year_result .= ' ' . $all_extra;
}
if (null !== $year_extra){
$year_result .= ' ' . $year_extra;
}
$year_result .= '>';
} else {
$years = range((int)$start_year, (int)$end_year);
if ($reverse_years) {
rsort($years, SORT_NUMERIC);
}
$year_result .= '<select name="' . $year_name . '"';
if (null !== $year_size){
$year_result .= ' size="' . $year_size . '"';
}
if (null !== $all_extra){
$year_result .= ' ' . $all_extra;
}
if (null !== $year_extra){
$year_result .= ' ' . $year_extra;
}
$year_result .= '>'."\n";
$year_result .= smarty_func_html_options(array('output' => $years,
'values' => $years,
'selected' => strftime("%Y", $time),
'print_result' => false));
$year_result .= '</select>';
}
}
// Loop thru the field_order field
for ($i = 0; $i <= 2; $i++){
$c = substr($field_order, $i, 1);
switch ($c){
case 'D':
$html_result .= $day_result;
break;
case 'M':
$html_result .= $month_result;
break;
case 'Y':
$html_result .= $year_result;
break;
}
// Add the field seperator
$html_result .= $field_separator;
}
print $html_result;
}
/*======================================================================*\
Function: smarty_func_html_select_time
Purpose: Prints the dropdowns for time selection
\*======================================================================*/
function smarty_func_html_select_time()
{
/* Default values. */
$prefix = "Time_";
$time = time();
$display_hours = true;
$display_minutes = true;
$display_seconds = true;
$display_meridian = true;
$use_24_hours = true;
$minute_interval = 1;
$second_interval = 1;
/* Should the select boxes be part of an array when returned from PHP?
e.g. setting it to "birthday", would create "birthday[Hour]",
"birthday[Minute]", "birthday[Seconds]" & "birthday[Meridian]".
Can be combined with prefix. */
$field_array = null;
extract(func_get_arg(0));
$time = smarty_make_timestamp($time);
$html_result = '';
if ($display_hours) {
$hours = $use_24_hours ? range(0, 23) : range(1, 12);
$hour_fmt = $use_24_hours ? '%H' : '%I';
for ($i = 0; $i < count($hours); $i++)
$hours[$i] = sprintf('%02d', $hours[$i]);
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Hour]">'."\n";
} else {
$html_result .= '"' . $prefix . 'Hour">'."\n";
}
$html_result .= smarty_func_html_options(array('output' => $hours,
'values' => $hours,
'selected' => strftime($hour_fmt, $time),
'print_result' => false));
$html_result .= "</select>\n";
}
if ($display_minutes) {
$all_minutes = range(0, 59);
for ($i = 0; $i < count($all_minutes); $i+= $minute_interval)
$minutes[] = sprintf('%02d', $all_minutes[$i]);
$selected = intval(floor(strftime('%M', $time) / $minute_interval) * $minute_interval);
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Minute]">'."\n";
} else {
$html_result .= '"' . $prefix . 'Minute">'."\n";
}
$html_result .= smarty_func_html_options(array('output' => $minutes,
'values' => $minutes,
'selected' => $selected,
'print_result' => false));
$html_result .= "</select>\n";
}
if ($display_seconds) {
$all_seconds = range(0, 59);
for ($i = 0; $i < count($all_seconds); $i+= $second_interval)
$seconds[] = sprintf('%02d', $all_seconds[$i]);
$selected = intval(floor(strftime('%S', $time) / $second_interval) * $second_interval);
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Second]">'."\n";
} else {
$html_result .= '"' . $prefix . 'Second">'."\n";
}
$html_result .= smarty_func_html_options(array('output' => $seconds,
'values' => $seconds,
'selected' => $selected,
'print_result' => false));
$html_result .= "</select>\n";
}
if ($display_meridian && !$use_24_hours) {
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Meridian]">'."\n";
} else {
$html_result .= '"' . $prefix . 'Meridian">'."\n";
}
$html_result .= smarty_func_html_options(array('output' => array('AM', 'PM'),
'values' => array('am', 'pm'),
'selected' => strtolower(strftime('%p', $time)),
'print_result' => false));
$html_result .= "</select>\n";
}
print $html_result;
}
/*======================================================================*\
Function: smarty_func_math
Purpose: allow math computations in template
\*======================================================================*/
function smarty_func_math($args, &$smarty_obj) {
// be sure equation parameter is present
if (empty($args["equation"])) {
$smarty_obj->_trigger_error_msg("math: missing equation parameter");
return;
}
$equation = $args["equation"];
// make sure parenthesis are balanced
if (substr_count($equation,"(") != substr_count($equation,")")) {
$smarty_obj->_trigger_error_msg("math: unbalanced parenthesis");
return;
}
// match all vars in equation, make sure all are passed
preg_match_all("![a-zA-Z][a-zA-Z0-9]*!",$equation, $match);
$allowed_funcs = array('int','abs','ceil','cos','exp','floor','log','log10',
'max','min','pi','pow','rand','round','sin','sqrt','srand','tan');
foreach($match[0] as $curr_var) {
if (!in_array($curr_var,array_keys($args)) && !in_array($curr_var, $allowed_funcs)) {
$smarty_obj->_trigger_error_msg("math: parameter $curr_var not passed as argument");
return;
}
}
foreach($args as $key => $val) {
if ($key != "equation" && $key != "format" && $key != "assign") {
// make sure value is not empty
if (strlen($val)==0) {
$smarty_obj->_trigger_error_msg("math: parameter $key is empty");
return;
}
if (!is_numeric($val)) {
$smarty_obj->_trigger_error_msg("math: parameter $key: is not numeric");
return;
}
$equation = preg_replace("/\b$key\b/",$val, $equation);
}
}
eval("\$smarty_math_result = ".$equation.";");
if (empty($args["format"])) {
if (empty($args["assign"])) {
echo $smarty_math_result;
} else {
$smarty_obj->assign($args["assign"],$smarty_math_result);
}
} else {
if (empty($args["assign"])){
printf($args["format"],$smarty_math_result);
} else {
$smarty_obj->assign($assign,sprintf($args["format"],$smarty_math_result));
}
}
}
/*======================================================================*\
Function: smarty_func_fetch
Purpose: fetch file, web or ftp data and display results
\*======================================================================*/
function smarty_func_fetch($args, &$smarty_obj) {
extract($args);
if (empty($file)) {
$smarty_obj->_trigger_error_msg("parameter 'file' cannot be empty");
return;
}
if ($smarty_obj->security && !preg_match('!^(http|ftp)://!', $file)) {
// make sure fetched file comes from secure directory
foreach ($smarty_obj->secure_dir as $curr_dir) {
if (substr(realpath($file), 0, strlen(realpath($curr_dir))) == realpath($curr_dir)) {
$resource_is_secure = true;
break;
}
}
if (!$resource_is_secure) {
$smarty_obj->_trigger_error_msg("(secure mode) fetch '$file' is not allowed");
return;
}
if (!@is_readable($file)) {
$smarty_obj->_trigger_error_msg("fetch cannot read file '$file'");
return;
}
}
if (!empty($assign)) {
ob_start();
readfile($file);
$smarty_obj->assign($assign,ob_get_contents());
ob_end_clean();
} else {
readfile($file);
}
}
/*======================================================================*\
Function: smarty_mod_count_characters
Purpose: count the number of characters in a text
\*======================================================================*/
function smarty_mod_count_characters($string, $include_spaces=false) {
if ($include_spaces)
return(strlen($string));
return preg_match_all("/[^\s]/",$string, $match);
}
/*======================================================================*\
Function: smarty_mod_count_words
Purpose: count the number of words in a text
\*======================================================================*/
function smarty_mod_count_words($string) {
// split text by ' ',\r,\n,\f,\t
$split_array = preg_split("/\s+/",$string);
// count matches that contain alphanumerics
$word_count = preg_grep("/[a-zA-Z0-9]/",$split_array);
return count($word_count);
}
/*======================================================================*\
Function: smarty_mod_count_sentences
Purpose: count the number of sentences in a text
\*======================================================================*/
function smarty_mod_count_sentences($string, $include_spaces=false) {
// find periods with a word before but not after.
return preg_match_all("/[^\s]\.(?!\w)/",$string, $match);
}
/*======================================================================*\
Function: smarty_mod_count_paragraphs
Purpose: count the number of sentences in a text
\*======================================================================*/
function smarty_mod_count_paragraphs($string, $include_spaces=false) {
// count \r or \n characters
return count( preg_split("/[\r\n]+/",$string) );
}
/*======================================================================*\
Function: smarty_func_counter
Purpose: print out a counter value
\*======================================================================*/
function smarty_func_counter($args, &$smarty_obj) {
static $count = array();
static $skipval = array();
static $dir = array();
static $id = "default";
static $printval = array();
static $assign = "";
extract($args);
if (!isset($id))
$id = "default";
if (isset($start))
$count[$id] = $start;
else if (!isset($count[$id]))
$count[$id]=1;
if (!isset($print))
$printval[$id]=true;
else
$printval[$id]=$print;
if (!empty($assign)) {
$printval[$id] = false;
$smarty_obj->assign($assign, $count[$id]);
}
if ($printval[$id])
echo $count[$id];
if (isset($skip))
$skipval[$id] = $skip;
else if (empty($skipval[$id]))
$skipval[$id] = 1;
if (isset($direction))
$dir[$id] = $direction;
else if (!isset($dir[$id]))
$dir[$id] = "up";
if ($dir[$id] == "down")
$count[$id] -= $skipval[$id];
else
$count[$id] += $skipval[$id];
return true;
}
/*======================================================================*\
Function: smarty_func_assign_debug_info
Purpose: assign debug info to the template
\*======================================================================*/
function smarty_func_assign_debug_info($args, &$smarty_obj) {
$assigned_vars = $smarty_obj->_tpl_vars;
ksort($assigned_vars);
if (is_array($smarty_obj->_config[0])) {
$config_vars = $smarty_obj->_config[0];
ksort($config_vars);
$smarty_obj->assign("_debug_config_keys", array_keys($config_vars));
$smarty_obj->assign("_debug_config_vals", array_values($config_vars));
}
$included_templates = $smarty_obj->_smarty_debug_info;
$smarty_obj->assign("_debug_keys", array_keys($assigned_vars));
$smarty_obj->assign("_debug_vals", array_values($assigned_vars));
$smarty_obj->assign("_debug_tpls", $included_templates);
return true;
}
/*======================================================================*\
Function: smarty_func_debug_print_var
Purpose: prints variable (or array) contents to the console
\*======================================================================*/
function smarty_mod_debug_print_var($var, $depth=0, $length=40) {
if (is_array($var)) {
$results = "<b>Array (".count($var).")</b>";
foreach ($var as $curr_key => $curr_val) {
$return = smarty_mod_debug_print_var($curr_val, $depth+1);
$results .= '<br>\r'.str_repeat('&nbsp;', $depth*2)."<b>$curr_key</b> =&gt; $return";
}
return $results;
} else {
if (empty($var)) {
return '<i>empty</i>';
}
if (strlen($var) > $length ) {
$results = substr($var, 0, $length-3).'...';
} else {
$results = $var;
}
$results = preg_replace("![\r\t\n]!", " ", $results);
$results = htmlspecialchars(htmlspecialchars($results));
return $results;
}
}
/*======================================================================*\
Function: smarty_func_overlib_init
Purpose: initialize use of overlib
\*======================================================================*/
function smarty_func_overlib_init($args, &$smarty_obj) {
// be sure to place overlib.js where Smarty can locate it.
// overlib.js came with the distribution of Smarty.
echo '<DIV ID="overDiv" STYLE="position:absolute; visibility:hidden; z-index:1000;"></DIV>'."\n".'<SCRIPT LANGUAGE=javascript>'."\n".'<!--'."\n";
readfile(SMARTY_DIR."overlib.js",1);
echo '// -->'."\n".'</SCRIPT>'."\n";
return;
}
/*======================================================================*\
Function: smarty_func_overlib
Purpose: make text pop up in windows via overlib
\*======================================================================*/
function smarty_func_overlib($args, &$smarty_obj) {
extract($args);
if (empty($text) && !isset($inarray) && empty($function)) {
$smarty_obj->_trigger_error_msg("overlib: attribute 'text' or 'inarray' or 'function' required");
return false;
}
if (empty($trigger)) { $trigger = "onMouseOver"; }
echo $trigger.'="return overlib(\''.str_replace("'","\'",$text).'\'';
if ($sticky) { echo ",STICKY"; }
if (!empty($caption)) { echo ",CAPTION,'".str_replace("'","\'",$caption)."'"; }
if (!empty($fgcolor)) { echo ",FGCOLOR,'$fgcolor'"; }
if (!empty($bgcolor)) { echo ",BGCOLOR,'$bgcolor'"; }
if (!empty($textcolor)) { echo ",TEXTCOLOR,'$textcolor'"; }
if (!empty($capcolor)) { echo ",CAPCOLOR,'$capcolor'"; }
if (!empty($closecolor)) { echo ",CLOSECOLOR,'$closecolor'"; }
if (!empty($textfont)) { echo ",TEXTFONT,'$textfont'"; }
if (!empty($captionfont)) { echo ",CAPTIONFONT,'$captionfont'"; }
if (!empty($closefont)) { echo ",CLOSEFONT,'$closefont'"; }
if (!empty($textsize)) { echo ",TEXTSIZE,$textsize"; }
if (!empty($captionsize)) { echo ",CAPTIONSIZE,$captionsize"; }
if (!empty($closesize)) { echo ",CLOSESIZE,$closesize"; }
if (!empty($width)) { echo ",WIDTH,$width"; }
if (!empty($height)) { echo ",HEIGHT,$height"; }
if (!empty($left)) { echo ",LEFT"; }
if (!empty($right)) { echo ",RIGHT"; }
if (!empty($center)) { echo ",CENTER"; }
if (!empty($above)) { echo ",ABOVE"; }
if (!empty($below)) { echo ",BELOW"; }
if (isset($border)) { echo ",BORDER,$border"; }
if (isset($offsetx)) { echo ",OFFSETX,$offsetx"; }
if (isset($offsety)) { echo ",OFFSETY,$offsety"; }
if (!empty($fgbackground)) { echo ",FGBACKGROUND,'$fgbackground'"; }
if (!empty($bgbackground)) { echo ",BGBACKGROUND,'$bgbackground'"; }
if (!empty($closetext)) { echo ",CLOSETEXT,'".str_replace("'","\'",$closetext)."'"; }
if (!empty($noclose)) { echo ",NOCLOSE"; }
if (!empty($status)) { echo ",STATUS,'".str_replace("'","\'",$status)."'"; }
if (!empty($autostatus)) { echo ",AUTOSTATUS"; }
if (!empty($autostatuscap)) { echo ",AUTOSTATUSCAP"; }
if (isset($inarray)) { echo ",INARRAY,'$inarray'"; }
if (isset($caparray)) { echo ",CAPARRAY,'$caparray'"; }
if (!empty($capicon)) { echo ",CAPICON,'$capicon'"; }
if (!empty($snapx)) { echo ",SNAPX,$snapx"; }
if (!empty($snapy)) { echo ",SNAPY,$snapy"; }
if (isset($fixx)) { echo ",FIXX,$fixx"; }
if (isset($fixy)) { echo ",FIXY,$fixy"; }
if (!empty($background)) { echo ",BACKGROUND,'$background'"; }
if (!empty($padx)) { echo ",PADX,$padx"; }
if (!empty($pady)) { echo ",PADY,$pady"; }
if (!empty($fullhtml)) { echo ",FULLHTML"; }
if (!empty($frame)) { echo ",FRAME,'$frame'"; }
if (isset($timeout)) { echo ",TIMEOUT,$timeout"; }
if (!empty($function)) { echo ",FUNCTION,'$function'"; }
if (isset($delay)) { echo ",DELAY,$delay"; }
if (!empty($hauto)) { echo ",HAUTO"; }
if (!empty($vauto)) { echo ",VAUTO"; }
echo ');" onMouseOut="nd();"';
return;
}
/*======================================================================*\
Function: smarty_mod_wordwrap
Purpose: wrap words to a specific column width
Input: $string - string of text to wrap
$width - column width to wrap to
$cut - whether or not to cut a word on the boundary
\*======================================================================*/
function smarty_mod_wordwrap($string, $width=80, $break="\n",$cut=false) {
return wordwrap($string,$width,$break,$cut);
}
/*======================================================================*\
Function: smarty_mod_indent
Purpose: indent each line a specific number of characters
Input: $string - string of text to indent
$width - number of chars to indent
$indent_char - character to indent with (can be a tab \t)
\*======================================================================*/
function smarty_mod_indent($string, $width=4, $indent_char=' ') {
return preg_replace("/(^|\n)/","\\1".str_repeat($indent_char,$width),$string);
}
/* vim: set expandtab: */
?>

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@
* Andrei Zmievski <andrei@php.net>
*
* Version: 1.5.2
* Copyright: 2001 ispi of Lincoln, Inc.
* Copyright: 2001,2002 ispi of Lincoln, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -48,6 +48,8 @@ class Smarty_Compiler extends Smarty {
var $_current_file = null; // the current template being compiled
var $_current_line_no = 1; // line number for error messages
var $_capture_stack = array(); // keeps track of nested capture buffers
var $_plugin_info = array(); // keeps track of plugins to load
var $_filters_loaded = false;
/*======================================================================*\
@@ -64,13 +66,19 @@ class Smarty_Compiler extends Smarty {
}
}
if (!$this->_filters_loaded) {
$this->_load_filters();
$this->_filters_loaded = true;
}
// run template source through prefilter functions
if (is_array($this->prefilter_funcs) && count($this->prefilter_funcs) > 0) {
foreach ($this->prefilter_funcs as $prefilter) {
if (function_exists($prefilter)) {
$template_source = $prefilter($template_source, $this);
if (count($this->_plugins['prefilter']) > 0) {
foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) {
if ($prefilter[3] || function_exists($prefilter[0])) {
$template_source = $prefilter[0]($template_source, $this);
$this->_plugins['prefilter'][$filter_name][3] = true;
} else {
$this->_trigger_error_msg("prefilter function $prefilter does not exist.");
$this->_trigger_plugin_error("Smarty plugin error: prefilter '$filter_name' is not implemented");
}
}
}
@@ -170,16 +178,30 @@ class Smarty_Compiler extends Smarty {
}
// run compiled template through postfilter functions
if (is_array($this->postfilter_funcs) && count($this->postfilter_funcs) > 0) {
foreach ($this->postfilter_funcs as $postfilter) {
if (function_exists($postfilter)) {
$template_compiled = $postfilter($template_compiled, $this);
if (count($this->_plugins['postfilter']) > 0) {
foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) {
if ($postfilter[3] || function_exists($postfilter[0])) {
$template_compiled = $postfilter[0]($template_compiled, $this);
$this->_plugins['postfilter'][$filter_name][3] = true;
} else {
$this->_trigger_error_msg("postfilter function $postfilter does not exist.");
$this->_trigger_plugin_error("Smarty plugin error: postfilter '$filter_name' is not implemented");
}
}
}
/* Emit code to load needed plugins. */
if (count($this->_plugin_info)) {
$plugins_code = '<?php $this->_load_plugins(array(';
foreach ($this->_plugin_info as $plugin_type => $plugins) {
foreach ($plugins as $plugin_name => $plugin_info) {
$plugins_code .= "\narray('$plugin_type', '$plugin_name', '$plugin_info[0]', $plugin_info[1]),";
}
}
$plugins_code .= ")); ?>";
$template_compiled = $plugins_code . $template_compiled;
$this->_plugin_info = array();
}
return true;
}
@@ -300,13 +322,10 @@ class Smarty_Compiler extends Smarty {
return $this->_compile_insert_tag($tag_args);
default:
if (isset($this->compiler_funcs[$tag_command])) {
return $this->_compile_compiler_tag($tag_command, $tag_args);
} else if (isset($this->custom_funcs[$tag_command])) {
return $this->_compile_custom_tag($tag_command, $tag_args);
if ($this->_compile_compiler_tag($tag_command, $tag_args, $output)) {
return $output;
} else {
$this->_syntax_error("unknown tag - '$tag_command'", E_USER_WARNING);
return;
return $this->_compile_custom_tag($tag_command, $tag_args);
}
}
}
@@ -316,16 +335,62 @@ class Smarty_Compiler extends Smarty {
Function: _compile_compiler_tag
Purpose: compile the custom compiler tag
\*======================================================================*/
function _compile_compiler_tag($tag_command, $tag_args)
function _compile_compiler_tag($tag_command, $tag_args, &$output)
{
$function = $this->compiler_funcs[$tag_command];
$found = false;
$have_function = true;
if (!function_exists($function)) {
$this->_syntax_error("compiler function '$tag_command' is not implemented", E_USER_WARNING);
return;
$plugin_file = $this->plugins_dir .
'/compiler.' .
$tag_command .
'.php';
/*
* First we check if the compiler function has already been registered
* or loaded from a plugin file.
*/
if (isset($this->_plugins['compiler'][$tag_command])) {
$found = true;
$plugin_func = $this->_plugins['compiler'][$tag_command][0];
if (!function_exists($plugin_func)) {
$message = "compiler function '$tag_command' is not implemented";
$have_function = false;
}
}
/*
* Otherwise we need to load plugin file and look for the function
* inside it.
*/
else if (file_exists($plugin_file) && is_readable($plugin_file)) {
$found = true;
include_once $plugin_file;
$plugin_func = 'smarty_compiler_' . $tag_command;
if (!function_exists($plugin_func)) {
$message = "plugin function $plugin_func() not found in $plugin_file\n";
$have_function = false;
} else {
$this->_plugins['compiler'][$tag_command] = array($plugin_func, null, null);
}
}
return '<?php ' . $function($tag_args, $this) . ' ?>';
/*
* True return value means that we either found a plugin or a
* dynamically registered function. False means that we didn't and the
* compiler should now emit code to load custom function plugin for this
* tag.
*/
if ($found) {
if ($have_function) {
$output = '<?php ' . $plugin_func($tag_args, $this) . ' ?>';
} else {
$this->_syntax_error($message, E_USER_WARNING);
}
return true;
} else {
return false;
}
}
@@ -335,12 +400,10 @@ class Smarty_Compiler extends Smarty {
\*======================================================================*/
function _compile_custom_tag($tag_command, $tag_args)
{
$function = $this->custom_funcs[$tag_command];
if (!function_exists($function)) {
$this->_syntax_error("custom function '$tag_command' is not implemented", E_USER_WARNING);
return;
}
$this->_add_plugin('function',
$tag_command,
$this->_current_file,
$this->_current_line_no);
$arg_list = array();
$attrs = $this->_parse_attrs($tag_args);
@@ -350,7 +413,7 @@ class Smarty_Compiler extends Smarty {
$arg_list[] = "'$arg_name' => $arg_value";
}
return "<?php $function(array(".implode(',', (array)$arg_list)."), \$this); if(\$this->_extract) { extract(\$this->_tpl_vars); \$this->_extract=false; } ?>";
return "<?php \$this->_plugins['function']['$tag_command'][0](array(".implode(',', (array)$arg_list)."), \$this); if(\$this->_extract) { extract(\$this->_tpl_vars); \$this->_extract=false; } ?>";
}
@@ -361,7 +424,7 @@ class Smarty_Compiler extends Smarty {
function _compile_insert_tag($tag_args)
{
$attrs = $this->_parse_attrs($tag_args);
$name = substr($attrs['name'], 1, -1);
$name = $this->_dequote($attrs['name']);
if (empty($name)) {
$this->_syntax_error("missing insert name");
@@ -373,6 +436,8 @@ class Smarty_Compiler extends Smarty {
$arg_list[] = "'$arg_name' => $arg_value";
}
$this->_add_plugin('insert', $name);
return "<?php echo \$this->_run_insert_handler(array(".implode(', ', (array)$arg_list).")); ?>\n";
}
@@ -471,28 +536,25 @@ class Smarty_Compiler extends Smarty {
if (empty($attrs['file'])) {
$this->_syntax_error("missing 'file' attribute in include_php tag");
return false;
}
$this->_parse_file_path($this->trusted_dir, $this->_dequote($attrs['file']), $resource_type, $resource_name);
if ($this->security) {
if( $resource_type != 'file' || !@is_file($resource_name)) {
$this->_syntax_error("include_php: $resource_type: $resource_name is not readable");
return false;
}
if (!$this->_is_trusted($resource_type, $resource_name)) {
$this->_syntax_error("include_php: $resource_type: $resource_name is not trusted");
return false;
}
}
$this->_get_php_resource($this->_dequote($attrs['file']),
$resource_type, $php_resource);
if (!empty($attrs['assign'])) {
$output = "<?php ob_start();\n";
$output .= 'include("' . $resource_name . '");'."\n";
$output .= "\$this->assign(" . $this->_dequote($attrs['assign']).", ob_get_contents()); ob_end_clean();\n?>";
if ($resource_type == 'file') {
$output .= 'include("' . $php_resource . '");'."\n";
} else {
$output .= $php_resource;
}
$output .= "\$this->assign(" . $attrs['assign'] . ", ob_get_contents()); ob_end_clean();\n?>";
} else {
$output = '<?php include("' . $resource_name . '"); ?>';
if ($resource_type == 'file') {
$output = '<?php include("' . $php_resource . '"); ?>';
} else {
$output = '<?php ' . $php_resource . ' ?>';
}
}
return $output;
@@ -1083,32 +1145,11 @@ class Smarty_Compiler extends Smarty {
if ($modifier_name{0} == '@') {
$map_array = 'false';
$modifier_name = substr($modifier_name, 1);
} else
} else {
$map_array = 'true';
/*
* First we lookup the modifier function name in the registered
* modifiers table.
*/
@$mod_func_name = $this->custom_mods[$modifier_name];
/*
* If we don't find that modifier there, we assume it's just a PHP
* function name.
*/
if (!isset($mod_func_name)) {
if ($this->security && !in_array($modifier_name, $this->security_settings['MODIFIER_FUNCS'])) {
$this->_syntax_error("(secure mode) modifier '$modifier_name' is not allowed", E_USER_WARNING);
continue;
} else {
$mod_func_name = $modifier_name;
}
}
if (!function_exists($mod_func_name)) {
$this->_syntax_error("modifier '$modifier_name' is not implemented", E_USER_WARNING);
continue;
}
$this->_add_plugin('modifier', $modifier_name);
$this->_parse_vars_props($modifier_args);
@@ -1117,11 +1158,27 @@ class Smarty_Compiler extends Smarty {
else
$modifier_args = '';
$output = "\$this->_run_mod_handler('$mod_func_name', $map_array, $output$modifier_args)";
$output = "\$this->_run_mod_handler('$modifier_name', $map_array, $output$modifier_args)";
}
}
/*======================================================================*\
Function: _add_plugin
Purpose:
\*======================================================================*/
function _add_plugin($type, $name)
{
if (!isset($this->_plugin_info[$type])) {
$this->_plugin_info[$type] = array();
}
if (!isset($this->_plugin_info[$type][$name])) {
$this->_plugin_info[$type][$name] = array($this->_current_file,
$this->_current_line_no);
}
}
/*======================================================================*\
Function: _compile_smarty_ref
Purpose: Compiles references of type $smarty.foo
@@ -1172,6 +1229,38 @@ class Smarty_Compiler extends Smarty {
return $compiled_ref;
}
/*======================================================================*\
Function: _load_filters
Purpose: load pre- and post-filters
\*======================================================================*/
function _load_filters()
{
$plugins_dir = $this->plugins_dir;
$handle = opendir($plugins_dir);
while ($entry = readdir($handle)) {
$parts = explode('.', $entry, 3);
if ($entry == '.' ||
$entry == '..' ||
count($parts) < 3 ||
$parts[2] != 'php' ||
($parts[0] != 'prefilter' &&
$parts[0] != 'postfilter') ||
isset($this->_plugins[$parts[0]][$parts[1]]))
continue;
$plugin_file = $plugins_dir . '/' . $entry;
include_once $plugin_file;
$plugin_func = 'smarty_' . $parts[0] . '_' . $parts[1];
if (!function_exists($plugin_func)) {
$this->_trigger_plugin_error("Smarty plugin error: plugin function $plugin_func() not found in $plugin_file");
} else {
$this->_plugins[$parts[0]][$parts[1]] = array($plugin_func, null, null, true);
}
}
closedir($handle);
}
/*======================================================================*\
Function: _syntax_error
Purpose: display Smarty syntax error

6
TODO
View File

@@ -1,6 +1,4 @@
* Ability to load multiple sections in one {config_load ...}
* do away with Smarty.addons.php and make drop-in plugin directory for
functions and modifiers
* handle asp style tags in $php_handler
* correctly capture nested php tag syntax in templates:
<?php echo "<?php exit(); ?>"; ?>
@@ -8,8 +6,10 @@
default=$foo}, then using $bar in included template, instead of $foo.bar
* support implementations of prefiltes, mods, and others as class methods.
* possibly implement default modifiers that apply to variables upon display
* possibly implement undefined template tags custom handling
* think about possibility of supporting something like {$data[foo].$key[bar]}
* allow {custom} .. {/custom} style of custom functions
* ability to concatenate values/strings together
* fix all E_NOTICE warnings
* make simple math easier
* 'eval' modifier
* caching all but parts of the template

View File

@@ -1,5 +1,5 @@
{config_load file=test.conf section="setup"}
{include file=header.tpl title=foo}
{include file="header.tpl" title=foo}
<PRE>

View File

@@ -9,7 +9,7 @@ require_once "PEAR.php";
* @author Andrei Zmievski <andrei@php.net>
* @access public
*
* Copyright: 2001 ispi of Lincoln, Inc.
* Copyright: 2001,2002 ispi of Lincoln, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@
* Andrei Zmievski <andrei@php.net>
*
* Version: 1.5.2
* Copyright: 2001 ispi of Lincoln, Inc.
* Copyright: 2001,2002 ispi of Lincoln, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -48,6 +48,8 @@ class Smarty_Compiler extends Smarty {
var $_current_file = null; // the current template being compiled
var $_current_line_no = 1; // line number for error messages
var $_capture_stack = array(); // keeps track of nested capture buffers
var $_plugin_info = array(); // keeps track of plugins to load
var $_filters_loaded = false;
/*======================================================================*\
@@ -64,13 +66,19 @@ class Smarty_Compiler extends Smarty {
}
}
if (!$this->_filters_loaded) {
$this->_load_filters();
$this->_filters_loaded = true;
}
// run template source through prefilter functions
if (is_array($this->prefilter_funcs) && count($this->prefilter_funcs) > 0) {
foreach ($this->prefilter_funcs as $prefilter) {
if (function_exists($prefilter)) {
$template_source = $prefilter($template_source, $this);
if (count($this->_plugins['prefilter']) > 0) {
foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) {
if ($prefilter[3] || function_exists($prefilter[0])) {
$template_source = $prefilter[0]($template_source, $this);
$this->_plugins['prefilter'][$filter_name][3] = true;
} else {
$this->_trigger_error_msg("prefilter function $prefilter does not exist.");
$this->_trigger_plugin_error("Smarty plugin error: prefilter '$filter_name' is not implemented");
}
}
}
@@ -170,16 +178,30 @@ class Smarty_Compiler extends Smarty {
}
// run compiled template through postfilter functions
if (is_array($this->postfilter_funcs) && count($this->postfilter_funcs) > 0) {
foreach ($this->postfilter_funcs as $postfilter) {
if (function_exists($postfilter)) {
$template_compiled = $postfilter($template_compiled, $this);
if (count($this->_plugins['postfilter']) > 0) {
foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) {
if ($postfilter[3] || function_exists($postfilter[0])) {
$template_compiled = $postfilter[0]($template_compiled, $this);
$this->_plugins['postfilter'][$filter_name][3] = true;
} else {
$this->_trigger_error_msg("postfilter function $postfilter does not exist.");
$this->_trigger_plugin_error("Smarty plugin error: postfilter '$filter_name' is not implemented");
}
}
}
/* Emit code to load needed plugins. */
if (count($this->_plugin_info)) {
$plugins_code = '<?php $this->_load_plugins(array(';
foreach ($this->_plugin_info as $plugin_type => $plugins) {
foreach ($plugins as $plugin_name => $plugin_info) {
$plugins_code .= "\narray('$plugin_type', '$plugin_name', '$plugin_info[0]', $plugin_info[1]),";
}
}
$plugins_code .= ")); ?>";
$template_compiled = $plugins_code . $template_compiled;
$this->_plugin_info = array();
}
return true;
}
@@ -300,13 +322,10 @@ class Smarty_Compiler extends Smarty {
return $this->_compile_insert_tag($tag_args);
default:
if (isset($this->compiler_funcs[$tag_command])) {
return $this->_compile_compiler_tag($tag_command, $tag_args);
} else if (isset($this->custom_funcs[$tag_command])) {
return $this->_compile_custom_tag($tag_command, $tag_args);
if ($this->_compile_compiler_tag($tag_command, $tag_args, $output)) {
return $output;
} else {
$this->_syntax_error("unknown tag - '$tag_command'", E_USER_WARNING);
return;
return $this->_compile_custom_tag($tag_command, $tag_args);
}
}
}
@@ -316,16 +335,62 @@ class Smarty_Compiler extends Smarty {
Function: _compile_compiler_tag
Purpose: compile the custom compiler tag
\*======================================================================*/
function _compile_compiler_tag($tag_command, $tag_args)
function _compile_compiler_tag($tag_command, $tag_args, &$output)
{
$function = $this->compiler_funcs[$tag_command];
$found = false;
$have_function = true;
if (!function_exists($function)) {
$this->_syntax_error("compiler function '$tag_command' is not implemented", E_USER_WARNING);
return;
$plugin_file = $this->plugins_dir .
'/compiler.' .
$tag_command .
'.php';
/*
* First we check if the compiler function has already been registered
* or loaded from a plugin file.
*/
if (isset($this->_plugins['compiler'][$tag_command])) {
$found = true;
$plugin_func = $this->_plugins['compiler'][$tag_command][0];
if (!function_exists($plugin_func)) {
$message = "compiler function '$tag_command' is not implemented";
$have_function = false;
}
}
/*
* Otherwise we need to load plugin file and look for the function
* inside it.
*/
else if (file_exists($plugin_file) && is_readable($plugin_file)) {
$found = true;
include_once $plugin_file;
$plugin_func = 'smarty_compiler_' . $tag_command;
if (!function_exists($plugin_func)) {
$message = "plugin function $plugin_func() not found in $plugin_file\n";
$have_function = false;
} else {
$this->_plugins['compiler'][$tag_command] = array($plugin_func, null, null);
}
}
return '<?php ' . $function($tag_args, $this) . ' ?>';
/*
* True return value means that we either found a plugin or a
* dynamically registered function. False means that we didn't and the
* compiler should now emit code to load custom function plugin for this
* tag.
*/
if ($found) {
if ($have_function) {
$output = '<?php ' . $plugin_func($tag_args, $this) . ' ?>';
} else {
$this->_syntax_error($message, E_USER_WARNING);
}
return true;
} else {
return false;
}
}
@@ -335,12 +400,10 @@ class Smarty_Compiler extends Smarty {
\*======================================================================*/
function _compile_custom_tag($tag_command, $tag_args)
{
$function = $this->custom_funcs[$tag_command];
if (!function_exists($function)) {
$this->_syntax_error("custom function '$tag_command' is not implemented", E_USER_WARNING);
return;
}
$this->_add_plugin('function',
$tag_command,
$this->_current_file,
$this->_current_line_no);
$arg_list = array();
$attrs = $this->_parse_attrs($tag_args);
@@ -350,7 +413,7 @@ class Smarty_Compiler extends Smarty {
$arg_list[] = "'$arg_name' => $arg_value";
}
return "<?php $function(array(".implode(',', (array)$arg_list)."), \$this); if(\$this->_extract) { extract(\$this->_tpl_vars); \$this->_extract=false; } ?>";
return "<?php \$this->_plugins['function']['$tag_command'][0](array(".implode(',', (array)$arg_list)."), \$this); if(\$this->_extract) { extract(\$this->_tpl_vars); \$this->_extract=false; } ?>";
}
@@ -361,7 +424,7 @@ class Smarty_Compiler extends Smarty {
function _compile_insert_tag($tag_args)
{
$attrs = $this->_parse_attrs($tag_args);
$name = substr($attrs['name'], 1, -1);
$name = $this->_dequote($attrs['name']);
if (empty($name)) {
$this->_syntax_error("missing insert name");
@@ -373,6 +436,8 @@ class Smarty_Compiler extends Smarty {
$arg_list[] = "'$arg_name' => $arg_value";
}
$this->_add_plugin('insert', $name);
return "<?php echo \$this->_run_insert_handler(array(".implode(', ', (array)$arg_list).")); ?>\n";
}
@@ -471,28 +536,25 @@ class Smarty_Compiler extends Smarty {
if (empty($attrs['file'])) {
$this->_syntax_error("missing 'file' attribute in include_php tag");
return false;
}
$this->_parse_file_path($this->trusted_dir, $this->_dequote($attrs['file']), $resource_type, $resource_name);
if ($this->security) {
if( $resource_type != 'file' || !@is_file($resource_name)) {
$this->_syntax_error("include_php: $resource_type: $resource_name is not readable");
return false;
}
if (!$this->_is_trusted($resource_type, $resource_name)) {
$this->_syntax_error("include_php: $resource_type: $resource_name is not trusted");
return false;
}
}
$this->_get_php_resource($this->_dequote($attrs['file']),
$resource_type, $php_resource);
if (!empty($attrs['assign'])) {
$output = "<?php ob_start();\n";
$output .= 'include("' . $resource_name . '");'."\n";
$output .= "\$this->assign(" . $this->_dequote($attrs['assign']).", ob_get_contents()); ob_end_clean();\n?>";
if ($resource_type == 'file') {
$output .= 'include("' . $php_resource . '");'."\n";
} else {
$output .= $php_resource;
}
$output .= "\$this->assign(" . $attrs['assign'] . ", ob_get_contents()); ob_end_clean();\n?>";
} else {
$output = '<?php include("' . $resource_name . '"); ?>';
if ($resource_type == 'file') {
$output = '<?php include("' . $php_resource . '"); ?>';
} else {
$output = '<?php ' . $php_resource . ' ?>';
}
}
return $output;
@@ -1083,32 +1145,11 @@ class Smarty_Compiler extends Smarty {
if ($modifier_name{0} == '@') {
$map_array = 'false';
$modifier_name = substr($modifier_name, 1);
} else
} else {
$map_array = 'true';
/*
* First we lookup the modifier function name in the registered
* modifiers table.
*/
@$mod_func_name = $this->custom_mods[$modifier_name];
/*
* If we don't find that modifier there, we assume it's just a PHP
* function name.
*/
if (!isset($mod_func_name)) {
if ($this->security && !in_array($modifier_name, $this->security_settings['MODIFIER_FUNCS'])) {
$this->_syntax_error("(secure mode) modifier '$modifier_name' is not allowed", E_USER_WARNING);
continue;
} else {
$mod_func_name = $modifier_name;
}
}
if (!function_exists($mod_func_name)) {
$this->_syntax_error("modifier '$modifier_name' is not implemented", E_USER_WARNING);
continue;
}
$this->_add_plugin('modifier', $modifier_name);
$this->_parse_vars_props($modifier_args);
@@ -1117,11 +1158,27 @@ class Smarty_Compiler extends Smarty {
else
$modifier_args = '';
$output = "\$this->_run_mod_handler('$mod_func_name', $map_array, $output$modifier_args)";
$output = "\$this->_run_mod_handler('$modifier_name', $map_array, $output$modifier_args)";
}
}
/*======================================================================*\
Function: _add_plugin
Purpose:
\*======================================================================*/
function _add_plugin($type, $name)
{
if (!isset($this->_plugin_info[$type])) {
$this->_plugin_info[$type] = array();
}
if (!isset($this->_plugin_info[$type][$name])) {
$this->_plugin_info[$type][$name] = array($this->_current_file,
$this->_current_line_no);
}
}
/*======================================================================*\
Function: _compile_smarty_ref
Purpose: Compiles references of type $smarty.foo
@@ -1172,6 +1229,38 @@ class Smarty_Compiler extends Smarty {
return $compiled_ref;
}
/*======================================================================*\
Function: _load_filters
Purpose: load pre- and post-filters
\*======================================================================*/
function _load_filters()
{
$plugins_dir = $this->plugins_dir;
$handle = opendir($plugins_dir);
while ($entry = readdir($handle)) {
$parts = explode('.', $entry, 3);
if ($entry == '.' ||
$entry == '..' ||
count($parts) < 3 ||
$parts[2] != 'php' ||
($parts[0] != 'prefilter' &&
$parts[0] != 'postfilter') ||
isset($this->_plugins[$parts[0]][$parts[1]]))
continue;
$plugin_file = $plugins_dir . '/' . $entry;
include_once $plugin_file;
$plugin_func = 'smarty_' . $parts[0] . '_' . $parts[1];
if (!function_exists($plugin_func)) {
$this->_trigger_plugin_error("Smarty plugin error: plugin function $plugin_func() not found in $plugin_file");
} else {
$this->_plugins[$parts[0]][$parts[1]] = array($plugin_func, null, null, true);
}
}
closedir($handle);
}
/*======================================================================*\
Function: _syntax_error
Purpose: display Smarty syntax error

View File

@@ -0,0 +1,31 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: assign
* Purpose: assign a value to a template variable
* -------------------------------------------------------------
*/
function smarty_function_assign($args, &$smarty_obj)
{
extract($args);
if (empty($var)) {
$smarty_obj->_trigger_error_msg("assign: missing 'var' parameter");
return;
}
if (!in_array('value', array_keys($args))) {
$smarty_obj->_trigger_error_msg("assign: missing 'value' parameter");
return;
}
$smarty_obj->assign($var, $value);
return true;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,32 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: assign_debug_info
* Purpose: assign debug info to the template
* -------------------------------------------------------------
*/
function smarty_function_assign_debug_info($args, &$smarty_obj)
{
$assigned_vars = $smarty_obj->_tpl_vars;
ksort($assigned_vars);
if (is_array($smarty_obj->_config[0])) {
$config_vars = $smarty_obj->_config[0];
ksort($config_vars);
$smarty_obj->assign("_debug_config_keys", array_keys($config_vars));
$smarty_obj->assign("_debug_config_vals", array_values($config_vars));
}
$included_templates = $smarty_obj->_smarty_debug_info;
$smarty_obj->assign("_debug_keys", array_keys($assigned_vars));
$smarty_obj->assign("_debug_vals", array_values($assigned_vars));
$smarty_obj->assign("_debug_tpls", $included_templates);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,63 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: counter
* Purpose: print out a counter value
* -------------------------------------------------------------
*/
function smarty_function_counter($args, &$smarty_obj)
{
static $count = array();
static $skipval = array();
static $dir = array();
static $id = "default";
static $printval = array();
static $assign = "";
extract($args);
if (!isset($id))
$id = "default";
if (isset($start))
$count[$id] = $start;
else if (!isset($count[$id]))
$count[$id]=1;
if (!isset($print))
$printval[$id]=true;
else
$printval[$id]=$print;
if (!empty($assign)) {
$printval[$id] = false;
$smarty_obj->assign($assign, $count[$id]);
}
if ($printval[$id])
echo $count[$id];
if (isset($skip))
$skipval[$id] = $skip;
else if (empty($skipval[$id]))
$skipval[$id] = 1;
if (isset($direction))
$dir[$id] = $direction;
else if (!isset($dir[$id]))
$dir[$id] = "up";
if ($dir[$id] == "down")
$count[$id] -= $skipval[$id];
else
$count[$id] += $skipval[$id];
return true;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,51 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: fetch
* Purpose: fetch file, web or ftp data and display results
* -------------------------------------------------------------
*/
function smarty_function_fetch($args, &$smarty_obj)
{
extract($args);
if (empty($file)) {
$smarty_obj->_trigger_error_msg("parameter 'file' cannot be empty");
return;
}
if ($smarty_obj->security && !preg_match('!^(http|ftp)://!', $file)) {
// make sure fetched file comes from secure directory
foreach ($smarty_obj->secure_dir as $curr_dir) {
if (substr(realpath($file), 0, strlen(realpath($curr_dir))) == realpath($curr_dir)) {
$resource_is_secure = true;
break;
}
}
if (!$resource_is_secure) {
$smarty_obj->_trigger_error_msg("(secure mode) fetch '$file' is not allowed");
return;
}
if (!@is_readable($file)) {
$smarty_obj->_trigger_error_msg("fetch cannot read file '$file'");
return;
}
}
if (!empty($assign)) {
ob_start();
readfile($file);
$smarty_obj->assign($assign,ob_get_contents());
ob_end_clean();
} else {
readfile($file);
}
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,55 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: html_options
* Purpose: Prints the list of <option> tags generated from
* the passed parameters
* -------------------------------------------------------------
*/
function smarty_function_html_options($params, &$smarty)
{
$print_result = true;
extract($params);
$html_result = '';
settype($selected, 'array');
if (isset($options)) {
settype($options, 'array');
foreach ($options as $key => $value) {
$html_result .= "<option value=\"$key\"";
if (in_array($key, $selected))
$html_result .= " selected=\"selected\"";
$html_result .= ">$value</option>\n";
}
} else {
settype($output, 'array');
settype($values, 'array');
for ($i = 0; $i < count($output); $i++) {
/* By default, check value against $selected */
$sel_check = $values[$i];
$html_result .= "<option";
if ($i < count($values))
$html_result .= " value=\"".$values[$i]."\"";
else
$sel_check = $output[$i]; /* if more outputs than values, then
check output against $selected */
if (in_array($sel_check, $selected))
$html_result .= " selected";
$html_result .= ">".$output[$i]."</option>\n";
}
}
if ($print_result)
print $html_result;
else
return $html_result;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,182 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: html_select_date
* Purpose: Prints the dropdowns for date selection.
* -------------------------------------------------------------
*/
include_once dirname(__FILE__) . '/.make_timestamp.php';
include_once dirname(__FILE__) . '/function.html_options.php';
function smarty_function_html_select_date($params, &$smarty)
{
/* Default values. */
$prefix = "Date_";
$time = time();
$start_year = strftime("%Y");
$end_year = $start_year;
$display_days = true;
$display_months = true;
$display_years = true;
$month_format = "%B";
$day_format = "%02d";
$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";
extract($params);
$time = smarty_make_timestamp($time);
$field_order = strtoupper($field_order);
$html_result = $month_result = $day_result = $year_result = "";
if ($display_months) {
$month_names = array();
for ($i = 1; $i <= 12; $i++)
$month_names[] = strftime($month_format, mktime(0, 0, 0, $i, 1, 2000));
$month_result .= '<select name=';
if (null !== $field_array){
$month_result .= '"' . $field_array . '[' . $prefix . 'Month]"';
} else {
$month_result .= '"' . $prefix . 'Month"';
}
if (null !== $month_size){
$month_result .= ' size="' . $month_size . '"';
}
if (null !== $month_extra){
$month_result .= ' ' . $month_extra;
}
if (null !== $all_extra){
$month_result .= ' ' . $all_extra;
}
$month_result .= '>'."\n";
$month_result .= smarty_function_html_options(array('output' => $month_names,
'values' => range(1, 12),
'selected' => strftime("%m", $time),
'print_result' => false),
$smarty);
$month_result .= '</select>';
}
if ($display_days) {
$days = range(1, 31);
for ($i = 0; $i < count($days); $i++)
$days[$i] = sprintf($day_format, $days[$i]);
$day_result .= '<select name=';
if (null !== $field_array){
$day_result .= '"' . $field_array . '[' . $prefix . 'Day]"';
} else {
$day_result .= '"' . $prefix . 'Day"';
}
if (null !== $day_size){
$day_result .= ' size="' . $day_size . '"';
}
if (null !== $all_extra){
$day_result .= ' ' . $all_extra;
}
if (null !== $day_extra){
$day_result .= ' ' . $day_extra;
}
$day_result .= '>'."\n";
$day_result .= smarty_function_html_options(array('output' => $days,
'values' => range(1, 31),
'selected' => strftime("%d", $time),
'print_result' => false),
$smarty);
$day_result .= '</select>';
}
if ($display_years) {
if (null !== $field_array){
$year_name = $field_array . '[' . $prefix . 'Year]';
} else {
$year_name = $prefix . 'Year';
}
if ($year_as_text) {
$year_result .= '<input type="text" name="' . $year_name . '" value="'.strftime('%Y', $time).'" size="4" maxlength="4"';
if (null !== $all_extra){
$year_result .= ' ' . $all_extra;
}
if (null !== $year_extra){
$year_result .= ' ' . $year_extra;
}
$year_result .= '>';
} else {
$years = range((int)$start_year, (int)$end_year);
if ($reverse_years) {
rsort($years, SORT_NUMERIC);
}
$year_result .= '<select name="' . $year_name . '"';
if (null !== $year_size){
$year_result .= ' size="' . $year_size . '"';
}
if (null !== $all_extra){
$year_result .= ' ' . $all_extra;
}
if (null !== $year_extra){
$year_result .= ' ' . $year_extra;
}
$year_result .= '>'."\n";
$year_result .= smarty_function_html_options(array('output' => $years,
'values' => $years,
'selected' => strftime("%Y", $time),
'print_result' => false),
$smarty);
$year_result .= '</select>';
}
}
// Loop thru the field_order field
for ($i = 0; $i <= 2; $i++){
$c = substr($field_order, $i, 1);
switch ($c){
case 'D':
$html_result .= $day_result;
break;
case 'M':
$html_result .= $month_result;
break;
case 'Y':
$html_result .= $year_result;
break;
}
// Add the field seperator
$html_result .= $field_separator;
}
print $html_result;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,114 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: html_select_time
* Purpose: Prints the dropdowns for time selection
* -------------------------------------------------------------
*/
include_once dirname(__FILE__) . '/.make_timestamp.php';
include_once dirname(__FILE__) . '/function.html_options.php';
function smarty_function_html_select_time($params, &$smarty)
{
/* Default values. */
$prefix = "Time_";
$time = time();
$display_hours = true;
$display_minutes = true;
$display_seconds = true;
$display_meridian = true;
$use_24_hours = true;
$minute_interval = 1;
$second_interval = 1;
/* Should the select boxes be part of an array when returned from PHP?
e.g. setting it to "birthday", would create "birthday[Hour]",
"birthday[Minute]", "birthday[Seconds]" & "birthday[Meridian]".
Can be combined with prefix. */
$field_array = null;
extract($params);
$time = smarty_make_timestamp($time);
$html_result = '';
if ($display_hours) {
$hours = $use_24_hours ? range(0, 23) : range(1, 12);
$hour_fmt = $use_24_hours ? '%H' : '%I';
for ($i = 0; $i < count($hours); $i++)
$hours[$i] = sprintf('%02d', $hours[$i]);
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Hour]">'."\n";
} else {
$html_result .= '"' . $prefix . 'Hour">'."\n";
}
$html_result .= smarty_function_html_options(array('output' => $hours,
'values' => $hours,
'selected' => strftime($hour_fmt, $time),
'print_result' => false),
$smarty);
$html_result .= "</select>\n";
}
if ($display_minutes) {
$all_minutes = range(0, 59);
for ($i = 0; $i < count($all_minutes); $i+= $minute_interval)
$minutes[] = sprintf('%02d', $all_minutes[$i]);
$selected = intval(floor(strftime('%M', $time) / $minute_interval) * $minute_interval);
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Minute]">'."\n";
} else {
$html_result .= '"' . $prefix . 'Minute">'."\n";
}
$html_result .= smarty_function_html_options(array('output' => $minutes,
'values' => $minutes,
'selected' => $selected,
'print_result' => false),
$smarty);
$html_result .= "</select>\n";
}
if ($display_seconds) {
$all_seconds = range(0, 59);
for ($i = 0; $i < count($all_seconds); $i+= $second_interval)
$seconds[] = sprintf('%02d', $all_seconds[$i]);
$selected = intval(floor(strftime('%S', $time) / $second_interval) * $second_interval);
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Second]">'."\n";
} else {
$html_result .= '"' . $prefix . 'Second">'."\n";
}
$html_result .= smarty_function_html_options(array('output' => $seconds,
'values' => $seconds,
'selected' => $selected,
'print_result' => false),
$smarty);
$html_result .= "</select>\n";
}
if ($display_meridian && !$use_24_hours) {
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Meridian]">'."\n";
} else {
$html_result .= '"' . $prefix . 'Meridian">'."\n";
}
$html_result .= smarty_function_html_options(array('output' => array('AM', 'PM'),
'values' => array('am', 'pm'),
'selected' => strtolower(strftime('%p', $time)),
'print_result' => false),
$smarty);
$html_result .= "</select>\n";
}
print $html_result;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,73 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: math
* Purpose: handle math computations in template
* -------------------------------------------------------------
*/
function smarty_function_math($args, &$smarty_obj)
{
// be sure equation parameter is present
if (empty($args["equation"])) {
$smarty_obj->_trigger_error_msg("math: missing equation parameter");
return;
}
$equation = $args["equation"];
// make sure parenthesis are balanced
if (substr_count($equation,"(") != substr_count($equation,")")) {
$smarty_obj->_trigger_error_msg("math: unbalanced parenthesis");
return;
}
// match all vars in equation, make sure all are passed
preg_match_all("![a-zA-Z][a-zA-Z0-9]*!",$equation, $match);
$allowed_funcs = array('int','abs','ceil','cos','exp','floor','log','log10',
'max','min','pi','pow','rand','round','sin','sqrt','srand','tan');
foreach($match[0] as $curr_var) {
if (!in_array($curr_var,array_keys($args)) && !in_array($curr_var, $allowed_funcs)) {
$smarty_obj->_trigger_error_msg("math: parameter $curr_var not passed as argument");
return;
}
}
foreach($args as $key => $val) {
if ($key != "equation" && $key != "format" && $key != "assign") {
// make sure value is not empty
if (strlen($val)==0) {
$smarty_obj->_trigger_error_msg("math: parameter $key is empty");
return;
}
if (!is_numeric($val)) {
$smarty_obj->_trigger_error_msg("math: parameter $key: is not numeric");
return;
}
$equation = preg_replace("/\b$key\b/",$val, $equation);
}
}
eval("\$smarty_math_result = ".$equation.";");
if (empty($args["format"])) {
if (empty($args["assign"])) {
echo $smarty_math_result;
} else {
$smarty_obj->assign($args["assign"],$smarty_math_result);
}
} else {
if (empty($args["assign"])){
printf($args["format"],$smarty_math_result);
} else {
$smarty_obj->assign($assign,sprintf($args["format"],$smarty_math_result));
}
}
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,76 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: popup
* Purpose: make text pop up in windows via overlib
* -------------------------------------------------------------
*/
function smarty_function_popup($args, &$smarty_obj)
{
extract($args);
if (empty($text) && !isset($inarray) && empty($function)) {
$smarty_obj->_trigger_error_msg("overlib: attribute 'text' or 'inarray' or 'function' required");
return false;
}
if (empty($trigger)) { $trigger = "onMouseOver"; }
echo $trigger.'="return overlib(\''.str_replace("'","\'",$text).'\'';
if ($sticky) { echo ",STICKY"; }
if (!empty($caption)) { echo ",CAPTION,'".str_replace("'","\'",$caption)."'"; }
if (!empty($fgcolor)) { echo ",FGCOLOR,'$fgcolor'"; }
if (!empty($bgcolor)) { echo ",BGCOLOR,'$bgcolor'"; }
if (!empty($textcolor)) { echo ",TEXTCOLOR,'$textcolor'"; }
if (!empty($capcolor)) { echo ",CAPCOLOR,'$capcolor'"; }
if (!empty($closecolor)) { echo ",CLOSECOLOR,'$closecolor'"; }
if (!empty($textfont)) { echo ",TEXTFONT,'$textfont'"; }
if (!empty($captionfont)) { echo ",CAPTIONFONT,'$captionfont'"; }
if (!empty($closefont)) { echo ",CLOSEFONT,'$closefont'"; }
if (!empty($textsize)) { echo ",TEXTSIZE,$textsize"; }
if (!empty($captionsize)) { echo ",CAPTIONSIZE,$captionsize"; }
if (!empty($closesize)) { echo ",CLOSESIZE,$closesize"; }
if (!empty($width)) { echo ",WIDTH,$width"; }
if (!empty($height)) { echo ",HEIGHT,$height"; }
if (!empty($left)) { echo ",LEFT"; }
if (!empty($right)) { echo ",RIGHT"; }
if (!empty($center)) { echo ",CENTER"; }
if (!empty($above)) { echo ",ABOVE"; }
if (!empty($below)) { echo ",BELOW"; }
if (isset($border)) { echo ",BORDER,$border"; }
if (isset($offsetx)) { echo ",OFFSETX,$offsetx"; }
if (isset($offsety)) { echo ",OFFSETY,$offsety"; }
if (!empty($fgbackground)) { echo ",FGBACKGROUND,'$fgbackground'"; }
if (!empty($bgbackground)) { echo ",BGBACKGROUND,'$bgbackground'"; }
if (!empty($closetext)) { echo ",CLOSETEXT,'".str_replace("'","\'",$closetext)."'"; }
if (!empty($noclose)) { echo ",NOCLOSE"; }
if (!empty($status)) { echo ",STATUS,'".str_replace("'","\'",$status)."'"; }
if (!empty($autostatus)) { echo ",AUTOSTATUS"; }
if (!empty($autostatuscap)) { echo ",AUTOSTATUSCAP"; }
if (isset($inarray)) { echo ",INARRAY,'$inarray'"; }
if (isset($caparray)) { echo ",CAPARRAY,'$caparray'"; }
if (!empty($capicon)) { echo ",CAPICON,'$capicon'"; }
if (!empty($snapx)) { echo ",SNAPX,$snapx"; }
if (!empty($snapy)) { echo ",SNAPY,$snapy"; }
if (isset($fixx)) { echo ",FIXX,$fixx"; }
if (isset($fixy)) { echo ",FIXY,$fixy"; }
if (!empty($background)) { echo ",BACKGROUND,'$background'"; }
if (!empty($padx)) { echo ",PADX,$padx"; }
if (!empty($pady)) { echo ",PADY,$pady"; }
if (!empty($fullhtml)) { echo ",FULLHTML"; }
if (!empty($frame)) { echo ",FRAME,'$frame'"; }
if (isset($timeout)) { echo ",TIMEOUT,$timeout"; }
if (!empty($function)) { echo ",FUNCTION,'$function'"; }
if (isset($delay)) { echo ",DELAY,$delay"; }
if (!empty($hauto)) { echo ",HAUTO"; }
if (!empty($vauto)) { echo ",VAUTO"; }
echo ');" onMouseOut="nd();"';
return;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,23 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: popup_init
* Purpose: initialize overlib
* -------------------------------------------------------------
*/
function smarty_function_popup_init($args, &$smarty_obj)
{
// be sure to place overlib.js where Smarty can locate it.
// overlib.js came with the distribution of Smarty.
echo '<DIV ID="overDiv" STYLE="position:absolute; visibility:hidden; z-index:1000;"></DIV>'."\n".'<SCRIPT LANGUAGE=javascript>'."\n".'<!--'."\n";
readfile(SMARTY_DIR."overlib.js",1);
echo '// -->'."\n".'</SCRIPT>'."\n";
return;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,16 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: capitalize
* Purpose: capitalize words in the string
* -------------------------------------------------------------
*/
function smarty_modifier_capitalize($string)
{
return ucwords($string);
}
?>

View File

@@ -0,0 +1,21 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: count_characteres
* Purpose: count the number of characters in a text
* -------------------------------------------------------------
*/
function smarty_modifier_count_characters($string, $include_spaces = false)
{
if ($include_spaces)
return(strlen($string));
return preg_match_all("/[^\s]/",$string, $match);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,19 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: count_paragraphs
* Purpose: count the number of paragraphs in a text
* -------------------------------------------------------------
*/
function smarty_modifier_count_paragraphs($string)
{
// count \r or \n characters
return count(preg_split('/[\r\n]+/', $string));
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,19 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: count_sentences
* Purpose: count the number of sentences in a text
* -------------------------------------------------------------
*/
function smarty_modifier_count_sentences($string)
{
// find periods with a word before but not after.
return preg_match_all('/[^\s]\.(?!\w)/', $string, $match);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,23 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: count_words
* Purpose: count the number of words in a text
* -------------------------------------------------------------
*/
function smarty_modifier_count_words($string)
{
// split text by ' ',\r,\n,\f,\t
$split_array = preg_split('/\s+/',$string);
// count matches that contain alphanumerics
$word_count = preg_grep('/[a-zA-Z0-9]/', $split_array);
return count($word_count);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,18 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: date_format
* Purpose: format datestamps via strftime
* -------------------------------------------------------------
*/
function smarty_modifier_date_format($string, $format="%b %e, %Y")
{
return strftime($format, smarty_make_timestamp($string));
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,37 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: debug_print_var
* Purpose: formats variable contents for display in the console
* -------------------------------------------------------------
*/
function smarty_modifier_debug_print_var($var, $depth = 0, $length = 40)
{
if (is_array($var)) {
$results = "<b>Array (".count($var).")</b>";
foreach ($var as $curr_key => $curr_val) {
$return = smarty_modifier_debug_print_var($curr_val, $depth+1);
$results .= '<br>\r'.str_repeat('&nbsp;', $depth*2)."<b>$curr_key</b> =&gt; $return";
}
return $results;
} else {
if (empty($var)) {
return '<i>empty</i>';
}
if (strlen($var) > $length ) {
$results = substr($var, 0, $length-3).'...';
} else {
$results = $var;
}
$results = preg_replace("![\r\t\n]!", " ", $results);
$results = htmlspecialchars(htmlspecialchars($results));
return $results;
}
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,21 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: default
* Purpose: designate default value for empty variables
* -------------------------------------------------------------
*/
function smarty_modifier_default($string, $default = '')
{
if (empty($string))
return $default;
else
return $string;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,31 @@
<?php
/*
* Smarty plugin
* ------------------------------------------------------------
* Type: modifier
* Name: escape
* Purpose: Escape the string according to escapement type
* ------------------------------------------------------------
*/
function smarty_modifier_escape($string, $esc_type = 'html')
{
switch ($esc_type) {
case 'html':
return htmlspecialchars($string, ENT_QUOTES);
case 'url':
return urlencode($string);
case 'quotes':
// escape unescaped single quotes
return preg_replace("%(?<!\\\\)'%", "\\'", $string);
default:
return $string;
}
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,16 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: lower
* Purpose: convert string to lowercase
* -------------------------------------------------------------
*/
function smarty_modifier_lower($string)
{
return strtolower($string);
}
?>

View File

@@ -0,0 +1,18 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: regex_replace
* Purpose: regular epxression search/replace
* -------------------------------------------------------------
*/
function smarty_modifier_regex_replace($string, $search, $replace)
{
return preg_replace($search, $replace, $string);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,18 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: replace
* Purpose: simple search/replace
* -------------------------------------------------------------
*/
function smarty_modifier_replace($string, $search, $replace)
{
return str_replace($search, $replace, $string);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,19 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: spacify
* Purpose: add spaces between characters in a string
* -------------------------------------------------------------
*/
function smarty_modifier_spacify($string, $spacify_char = ' ')
{
return implode($spacify_char,
preg_split('//', $string, -1, PREG_SPLIT_NO_EMPTY));
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,18 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: string_format
* Purpose: format strings via sprintf
* -------------------------------------------------------------
*/
function smarty_modifier_string_format($string, $format)
{
return sprintf($format, $string);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,21 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: strip_tags
* Purpose: strip html tags from text
* -------------------------------------------------------------
*/
function smarty_modifier_strip_tags($string, $replace_with_space = true)
{
if ($replace_with_space)
return preg_replace('!<[^>]*?>!', ' ', $string);
else
return strip_tags($string);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,33 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: truncate
* Purpose: Truncate a string to a certain length if necessary,
* optionally splitting in the middle of a word, and
* appending the $etc string.
* -------------------------------------------------------------
*/
function smarty_modifier_truncate($string, $length = 80, $etc = '...',
$break_words = false)
{
if ($length == 0)
return '';
if (strlen($string) > $length) {
$length -= strlen($etc);
$fragment = substr($string, 0, $length+1);
if ($break_words)
$fragment = substr($fragment, 0, -1);
else
$fragment = preg_replace('/\s+(\S+)?$/', '', $fragment);
return $fragment.$etc;
} else
return $string;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,16 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: upper
* Purpose: convert string to uppercase
* -------------------------------------------------------------
*/
function smarty_modifier_upper($string)
{
return strtoupper($string);
}
?>

View File

@@ -0,0 +1,31 @@
<?php
/*======================================================================*\
Function: smarty_make_timestamp
Purpose: used by other smarty functions to make a timestamp
from a string.
\*======================================================================*/
function smarty_make_timestamp($string)
{
if(empty($string)) {
$string = "now";
}
$time = strtotime($string);
if (is_numeric($time) && $time != -1)
return $time;
// is mysql timestamp format of YYYYMMDDHHMMSS?
if (is_numeric($string) && strlen($string) == 14) {
$time = 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));
return $time;
}
// can't decipher, just return it
return $string;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,31 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: assign
* Purpose: assign a value to a template variable
* -------------------------------------------------------------
*/
function smarty_function_assign($args, &$smarty_obj)
{
extract($args);
if (empty($var)) {
$smarty_obj->_trigger_error_msg("assign: missing 'var' parameter");
return;
}
if (!in_array('value', array_keys($args))) {
$smarty_obj->_trigger_error_msg("assign: missing 'value' parameter");
return;
}
$smarty_obj->assign($var, $value);
return true;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,32 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: assign_debug_info
* Purpose: assign debug info to the template
* -------------------------------------------------------------
*/
function smarty_function_assign_debug_info($args, &$smarty_obj)
{
$assigned_vars = $smarty_obj->_tpl_vars;
ksort($assigned_vars);
if (is_array($smarty_obj->_config[0])) {
$config_vars = $smarty_obj->_config[0];
ksort($config_vars);
$smarty_obj->assign("_debug_config_keys", array_keys($config_vars));
$smarty_obj->assign("_debug_config_vals", array_values($config_vars));
}
$included_templates = $smarty_obj->_smarty_debug_info;
$smarty_obj->assign("_debug_keys", array_keys($assigned_vars));
$smarty_obj->assign("_debug_vals", array_values($assigned_vars));
$smarty_obj->assign("_debug_tpls", $included_templates);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,63 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: counter
* Purpose: print out a counter value
* -------------------------------------------------------------
*/
function smarty_function_counter($args, &$smarty_obj)
{
static $count = array();
static $skipval = array();
static $dir = array();
static $id = "default";
static $printval = array();
static $assign = "";
extract($args);
if (!isset($id))
$id = "default";
if (isset($start))
$count[$id] = $start;
else if (!isset($count[$id]))
$count[$id]=1;
if (!isset($print))
$printval[$id]=true;
else
$printval[$id]=$print;
if (!empty($assign)) {
$printval[$id] = false;
$smarty_obj->assign($assign, $count[$id]);
}
if ($printval[$id])
echo $count[$id];
if (isset($skip))
$skipval[$id] = $skip;
else if (empty($skipval[$id]))
$skipval[$id] = 1;
if (isset($direction))
$dir[$id] = $direction;
else if (!isset($dir[$id]))
$dir[$id] = "up";
if ($dir[$id] == "down")
$count[$id] -= $skipval[$id];
else
$count[$id] += $skipval[$id];
return true;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,51 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: fetch
* Purpose: fetch file, web or ftp data and display results
* -------------------------------------------------------------
*/
function smarty_function_fetch($args, &$smarty_obj)
{
extract($args);
if (empty($file)) {
$smarty_obj->_trigger_error_msg("parameter 'file' cannot be empty");
return;
}
if ($smarty_obj->security && !preg_match('!^(http|ftp)://!', $file)) {
// make sure fetched file comes from secure directory
foreach ($smarty_obj->secure_dir as $curr_dir) {
if (substr(realpath($file), 0, strlen(realpath($curr_dir))) == realpath($curr_dir)) {
$resource_is_secure = true;
break;
}
}
if (!$resource_is_secure) {
$smarty_obj->_trigger_error_msg("(secure mode) fetch '$file' is not allowed");
return;
}
if (!@is_readable($file)) {
$smarty_obj->_trigger_error_msg("fetch cannot read file '$file'");
return;
}
}
if (!empty($assign)) {
ob_start();
readfile($file);
$smarty_obj->assign($assign,ob_get_contents());
ob_end_clean();
} else {
readfile($file);
}
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,55 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: html_options
* Purpose: Prints the list of <option> tags generated from
* the passed parameters
* -------------------------------------------------------------
*/
function smarty_function_html_options($params, &$smarty)
{
$print_result = true;
extract($params);
$html_result = '';
settype($selected, 'array');
if (isset($options)) {
settype($options, 'array');
foreach ($options as $key => $value) {
$html_result .= "<option value=\"$key\"";
if (in_array($key, $selected))
$html_result .= " selected=\"selected\"";
$html_result .= ">$value</option>\n";
}
} else {
settype($output, 'array');
settype($values, 'array');
for ($i = 0; $i < count($output); $i++) {
/* By default, check value against $selected */
$sel_check = $values[$i];
$html_result .= "<option";
if ($i < count($values))
$html_result .= " value=\"".$values[$i]."\"";
else
$sel_check = $output[$i]; /* if more outputs than values, then
check output against $selected */
if (in_array($sel_check, $selected))
$html_result .= " selected";
$html_result .= ">".$output[$i]."</option>\n";
}
}
if ($print_result)
print $html_result;
else
return $html_result;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,182 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: html_select_date
* Purpose: Prints the dropdowns for date selection.
* -------------------------------------------------------------
*/
include_once dirname(__FILE__) . '/.make_timestamp.php';
include_once dirname(__FILE__) . '/function.html_options.php';
function smarty_function_html_select_date($params, &$smarty)
{
/* Default values. */
$prefix = "Date_";
$time = time();
$start_year = strftime("%Y");
$end_year = $start_year;
$display_days = true;
$display_months = true;
$display_years = true;
$month_format = "%B";
$day_format = "%02d";
$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";
extract($params);
$time = smarty_make_timestamp($time);
$field_order = strtoupper($field_order);
$html_result = $month_result = $day_result = $year_result = "";
if ($display_months) {
$month_names = array();
for ($i = 1; $i <= 12; $i++)
$month_names[] = strftime($month_format, mktime(0, 0, 0, $i, 1, 2000));
$month_result .= '<select name=';
if (null !== $field_array){
$month_result .= '"' . $field_array . '[' . $prefix . 'Month]"';
} else {
$month_result .= '"' . $prefix . 'Month"';
}
if (null !== $month_size){
$month_result .= ' size="' . $month_size . '"';
}
if (null !== $month_extra){
$month_result .= ' ' . $month_extra;
}
if (null !== $all_extra){
$month_result .= ' ' . $all_extra;
}
$month_result .= '>'."\n";
$month_result .= smarty_function_html_options(array('output' => $month_names,
'values' => range(1, 12),
'selected' => strftime("%m", $time),
'print_result' => false),
$smarty);
$month_result .= '</select>';
}
if ($display_days) {
$days = range(1, 31);
for ($i = 0; $i < count($days); $i++)
$days[$i] = sprintf($day_format, $days[$i]);
$day_result .= '<select name=';
if (null !== $field_array){
$day_result .= '"' . $field_array . '[' . $prefix . 'Day]"';
} else {
$day_result .= '"' . $prefix . 'Day"';
}
if (null !== $day_size){
$day_result .= ' size="' . $day_size . '"';
}
if (null !== $all_extra){
$day_result .= ' ' . $all_extra;
}
if (null !== $day_extra){
$day_result .= ' ' . $day_extra;
}
$day_result .= '>'."\n";
$day_result .= smarty_function_html_options(array('output' => $days,
'values' => range(1, 31),
'selected' => strftime("%d", $time),
'print_result' => false),
$smarty);
$day_result .= '</select>';
}
if ($display_years) {
if (null !== $field_array){
$year_name = $field_array . '[' . $prefix . 'Year]';
} else {
$year_name = $prefix . 'Year';
}
if ($year_as_text) {
$year_result .= '<input type="text" name="' . $year_name . '" value="'.strftime('%Y', $time).'" size="4" maxlength="4"';
if (null !== $all_extra){
$year_result .= ' ' . $all_extra;
}
if (null !== $year_extra){
$year_result .= ' ' . $year_extra;
}
$year_result .= '>';
} else {
$years = range((int)$start_year, (int)$end_year);
if ($reverse_years) {
rsort($years, SORT_NUMERIC);
}
$year_result .= '<select name="' . $year_name . '"';
if (null !== $year_size){
$year_result .= ' size="' . $year_size . '"';
}
if (null !== $all_extra){
$year_result .= ' ' . $all_extra;
}
if (null !== $year_extra){
$year_result .= ' ' . $year_extra;
}
$year_result .= '>'."\n";
$year_result .= smarty_function_html_options(array('output' => $years,
'values' => $years,
'selected' => strftime("%Y", $time),
'print_result' => false),
$smarty);
$year_result .= '</select>';
}
}
// Loop thru the field_order field
for ($i = 0; $i <= 2; $i++){
$c = substr($field_order, $i, 1);
switch ($c){
case 'D':
$html_result .= $day_result;
break;
case 'M':
$html_result .= $month_result;
break;
case 'Y':
$html_result .= $year_result;
break;
}
// Add the field seperator
$html_result .= $field_separator;
}
print $html_result;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,114 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: html_select_time
* Purpose: Prints the dropdowns for time selection
* -------------------------------------------------------------
*/
include_once dirname(__FILE__) . '/.make_timestamp.php';
include_once dirname(__FILE__) . '/function.html_options.php';
function smarty_function_html_select_time($params, &$smarty)
{
/* Default values. */
$prefix = "Time_";
$time = time();
$display_hours = true;
$display_minutes = true;
$display_seconds = true;
$display_meridian = true;
$use_24_hours = true;
$minute_interval = 1;
$second_interval = 1;
/* Should the select boxes be part of an array when returned from PHP?
e.g. setting it to "birthday", would create "birthday[Hour]",
"birthday[Minute]", "birthday[Seconds]" & "birthday[Meridian]".
Can be combined with prefix. */
$field_array = null;
extract($params);
$time = smarty_make_timestamp($time);
$html_result = '';
if ($display_hours) {
$hours = $use_24_hours ? range(0, 23) : range(1, 12);
$hour_fmt = $use_24_hours ? '%H' : '%I';
for ($i = 0; $i < count($hours); $i++)
$hours[$i] = sprintf('%02d', $hours[$i]);
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Hour]">'."\n";
} else {
$html_result .= '"' . $prefix . 'Hour">'."\n";
}
$html_result .= smarty_function_html_options(array('output' => $hours,
'values' => $hours,
'selected' => strftime($hour_fmt, $time),
'print_result' => false),
$smarty);
$html_result .= "</select>\n";
}
if ($display_minutes) {
$all_minutes = range(0, 59);
for ($i = 0; $i < count($all_minutes); $i+= $minute_interval)
$minutes[] = sprintf('%02d', $all_minutes[$i]);
$selected = intval(floor(strftime('%M', $time) / $minute_interval) * $minute_interval);
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Minute]">'."\n";
} else {
$html_result .= '"' . $prefix . 'Minute">'."\n";
}
$html_result .= smarty_function_html_options(array('output' => $minutes,
'values' => $minutes,
'selected' => $selected,
'print_result' => false),
$smarty);
$html_result .= "</select>\n";
}
if ($display_seconds) {
$all_seconds = range(0, 59);
for ($i = 0; $i < count($all_seconds); $i+= $second_interval)
$seconds[] = sprintf('%02d', $all_seconds[$i]);
$selected = intval(floor(strftime('%S', $time) / $second_interval) * $second_interval);
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Second]">'."\n";
} else {
$html_result .= '"' . $prefix . 'Second">'."\n";
}
$html_result .= smarty_function_html_options(array('output' => $seconds,
'values' => $seconds,
'selected' => $selected,
'print_result' => false),
$smarty);
$html_result .= "</select>\n";
}
if ($display_meridian && !$use_24_hours) {
$html_result .= '<select name=';
if (null !== $field_array) {
$html_result .= '"' . $field_array . '[' . $prefix . 'Meridian]">'."\n";
} else {
$html_result .= '"' . $prefix . 'Meridian">'."\n";
}
$html_result .= smarty_function_html_options(array('output' => array('AM', 'PM'),
'values' => array('am', 'pm'),
'selected' => strtolower(strftime('%p', $time)),
'print_result' => false),
$smarty);
$html_result .= "</select>\n";
}
print $html_result;
}
/* vim: set expandtab: */
?>

73
plugins/function.math.php Normal file
View File

@@ -0,0 +1,73 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: math
* Purpose: handle math computations in template
* -------------------------------------------------------------
*/
function smarty_function_math($args, &$smarty_obj)
{
// be sure equation parameter is present
if (empty($args["equation"])) {
$smarty_obj->_trigger_error_msg("math: missing equation parameter");
return;
}
$equation = $args["equation"];
// make sure parenthesis are balanced
if (substr_count($equation,"(") != substr_count($equation,")")) {
$smarty_obj->_trigger_error_msg("math: unbalanced parenthesis");
return;
}
// match all vars in equation, make sure all are passed
preg_match_all("![a-zA-Z][a-zA-Z0-9]*!",$equation, $match);
$allowed_funcs = array('int','abs','ceil','cos','exp','floor','log','log10',
'max','min','pi','pow','rand','round','sin','sqrt','srand','tan');
foreach($match[0] as $curr_var) {
if (!in_array($curr_var,array_keys($args)) && !in_array($curr_var, $allowed_funcs)) {
$smarty_obj->_trigger_error_msg("math: parameter $curr_var not passed as argument");
return;
}
}
foreach($args as $key => $val) {
if ($key != "equation" && $key != "format" && $key != "assign") {
// make sure value is not empty
if (strlen($val)==0) {
$smarty_obj->_trigger_error_msg("math: parameter $key is empty");
return;
}
if (!is_numeric($val)) {
$smarty_obj->_trigger_error_msg("math: parameter $key: is not numeric");
return;
}
$equation = preg_replace("/\b$key\b/",$val, $equation);
}
}
eval("\$smarty_math_result = ".$equation.";");
if (empty($args["format"])) {
if (empty($args["assign"])) {
echo $smarty_math_result;
} else {
$smarty_obj->assign($args["assign"],$smarty_math_result);
}
} else {
if (empty($args["assign"])){
printf($args["format"],$smarty_math_result);
} else {
$smarty_obj->assign($assign,sprintf($args["format"],$smarty_math_result));
}
}
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,76 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: popup
* Purpose: make text pop up in windows via overlib
* -------------------------------------------------------------
*/
function smarty_function_popup($args, &$smarty_obj)
{
extract($args);
if (empty($text) && !isset($inarray) && empty($function)) {
$smarty_obj->_trigger_error_msg("overlib: attribute 'text' or 'inarray' or 'function' required");
return false;
}
if (empty($trigger)) { $trigger = "onMouseOver"; }
echo $trigger.'="return overlib(\''.str_replace("'","\'",$text).'\'';
if ($sticky) { echo ",STICKY"; }
if (!empty($caption)) { echo ",CAPTION,'".str_replace("'","\'",$caption)."'"; }
if (!empty($fgcolor)) { echo ",FGCOLOR,'$fgcolor'"; }
if (!empty($bgcolor)) { echo ",BGCOLOR,'$bgcolor'"; }
if (!empty($textcolor)) { echo ",TEXTCOLOR,'$textcolor'"; }
if (!empty($capcolor)) { echo ",CAPCOLOR,'$capcolor'"; }
if (!empty($closecolor)) { echo ",CLOSECOLOR,'$closecolor'"; }
if (!empty($textfont)) { echo ",TEXTFONT,'$textfont'"; }
if (!empty($captionfont)) { echo ",CAPTIONFONT,'$captionfont'"; }
if (!empty($closefont)) { echo ",CLOSEFONT,'$closefont'"; }
if (!empty($textsize)) { echo ",TEXTSIZE,$textsize"; }
if (!empty($captionsize)) { echo ",CAPTIONSIZE,$captionsize"; }
if (!empty($closesize)) { echo ",CLOSESIZE,$closesize"; }
if (!empty($width)) { echo ",WIDTH,$width"; }
if (!empty($height)) { echo ",HEIGHT,$height"; }
if (!empty($left)) { echo ",LEFT"; }
if (!empty($right)) { echo ",RIGHT"; }
if (!empty($center)) { echo ",CENTER"; }
if (!empty($above)) { echo ",ABOVE"; }
if (!empty($below)) { echo ",BELOW"; }
if (isset($border)) { echo ",BORDER,$border"; }
if (isset($offsetx)) { echo ",OFFSETX,$offsetx"; }
if (isset($offsety)) { echo ",OFFSETY,$offsety"; }
if (!empty($fgbackground)) { echo ",FGBACKGROUND,'$fgbackground'"; }
if (!empty($bgbackground)) { echo ",BGBACKGROUND,'$bgbackground'"; }
if (!empty($closetext)) { echo ",CLOSETEXT,'".str_replace("'","\'",$closetext)."'"; }
if (!empty($noclose)) { echo ",NOCLOSE"; }
if (!empty($status)) { echo ",STATUS,'".str_replace("'","\'",$status)."'"; }
if (!empty($autostatus)) { echo ",AUTOSTATUS"; }
if (!empty($autostatuscap)) { echo ",AUTOSTATUSCAP"; }
if (isset($inarray)) { echo ",INARRAY,'$inarray'"; }
if (isset($caparray)) { echo ",CAPARRAY,'$caparray'"; }
if (!empty($capicon)) { echo ",CAPICON,'$capicon'"; }
if (!empty($snapx)) { echo ",SNAPX,$snapx"; }
if (!empty($snapy)) { echo ",SNAPY,$snapy"; }
if (isset($fixx)) { echo ",FIXX,$fixx"; }
if (isset($fixy)) { echo ",FIXY,$fixy"; }
if (!empty($background)) { echo ",BACKGROUND,'$background'"; }
if (!empty($padx)) { echo ",PADX,$padx"; }
if (!empty($pady)) { echo ",PADY,$pady"; }
if (!empty($fullhtml)) { echo ",FULLHTML"; }
if (!empty($frame)) { echo ",FRAME,'$frame'"; }
if (isset($timeout)) { echo ",TIMEOUT,$timeout"; }
if (!empty($function)) { echo ",FUNCTION,'$function'"; }
if (isset($delay)) { echo ",DELAY,$delay"; }
if (!empty($hauto)) { echo ",HAUTO"; }
if (!empty($vauto)) { echo ",VAUTO"; }
echo ');" onMouseOut="nd();"';
return;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,23 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: function
* Name: popup_init
* Purpose: initialize overlib
* -------------------------------------------------------------
*/
function smarty_function_popup_init($args, &$smarty_obj)
{
// be sure to place overlib.js where Smarty can locate it.
// overlib.js came with the distribution of Smarty.
echo '<DIV ID="overDiv" STYLE="position:absolute; visibility:hidden; z-index:1000;"></DIV>'."\n".'<SCRIPT LANGUAGE=javascript>'."\n".'<!--'."\n";
readfile(SMARTY_DIR."overlib.js",1);
echo '// -->'."\n".'</SCRIPT>'."\n";
return;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,16 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: capitalize
* Purpose: capitalize words in the string
* -------------------------------------------------------------
*/
function smarty_modifier_capitalize($string)
{
return ucwords($string);
}
?>

View File

@@ -0,0 +1,21 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: count_characteres
* Purpose: count the number of characters in a text
* -------------------------------------------------------------
*/
function smarty_modifier_count_characters($string, $include_spaces = false)
{
if ($include_spaces)
return(strlen($string));
return preg_match_all("/[^\s]/",$string, $match);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,19 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: count_paragraphs
* Purpose: count the number of paragraphs in a text
* -------------------------------------------------------------
*/
function smarty_modifier_count_paragraphs($string)
{
// count \r or \n characters
return count(preg_split('/[\r\n]+/', $string));
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,19 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: count_sentences
* Purpose: count the number of sentences in a text
* -------------------------------------------------------------
*/
function smarty_modifier_count_sentences($string)
{
// find periods with a word before but not after.
return preg_match_all('/[^\s]\.(?!\w)/', $string, $match);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,23 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: count_words
* Purpose: count the number of words in a text
* -------------------------------------------------------------
*/
function smarty_modifier_count_words($string)
{
// split text by ' ',\r,\n,\f,\t
$split_array = preg_split('/\s+/',$string);
// count matches that contain alphanumerics
$word_count = preg_grep('/[a-zA-Z0-9]/', $split_array);
return count($word_count);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,18 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: date_format
* Purpose: format datestamps via strftime
* -------------------------------------------------------------
*/
function smarty_modifier_date_format($string, $format="%b %e, %Y")
{
return strftime($format, smarty_make_timestamp($string));
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,37 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: debug_print_var
* Purpose: formats variable contents for display in the console
* -------------------------------------------------------------
*/
function smarty_modifier_debug_print_var($var, $depth = 0, $length = 40)
{
if (is_array($var)) {
$results = "<b>Array (".count($var).")</b>";
foreach ($var as $curr_key => $curr_val) {
$return = smarty_modifier_debug_print_var($curr_val, $depth+1);
$results .= '<br>\r'.str_repeat('&nbsp;', $depth*2)."<b>$curr_key</b> =&gt; $return";
}
return $results;
} else {
if (empty($var)) {
return '<i>empty</i>';
}
if (strlen($var) > $length ) {
$results = substr($var, 0, $length-3).'...';
} else {
$results = $var;
}
$results = preg_replace("![\r\t\n]!", " ", $results);
$results = htmlspecialchars(htmlspecialchars($results));
return $results;
}
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,21 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: default
* Purpose: designate default value for empty variables
* -------------------------------------------------------------
*/
function smarty_modifier_default($string, $default = '')
{
if (empty($string))
return $default;
else
return $string;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,31 @@
<?php
/*
* Smarty plugin
* ------------------------------------------------------------
* Type: modifier
* Name: escape
* Purpose: Escape the string according to escapement type
* ------------------------------------------------------------
*/
function smarty_modifier_escape($string, $esc_type = 'html')
{
switch ($esc_type) {
case 'html':
return htmlspecialchars($string, ENT_QUOTES);
case 'url':
return urlencode($string);
case 'quotes':
// escape unescaped single quotes
return preg_replace("%(?<!\\\\)'%", "\\'", $string);
default:
return $string;
}
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,16 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: lower
* Purpose: convert string to lowercase
* -------------------------------------------------------------
*/
function smarty_modifier_lower($string)
{
return strtolower($string);
}
?>

View File

@@ -0,0 +1,18 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: regex_replace
* Purpose: regular epxression search/replace
* -------------------------------------------------------------
*/
function smarty_modifier_regex_replace($string, $search, $replace)
{
return preg_replace($search, $replace, $string);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,18 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: replace
* Purpose: simple search/replace
* -------------------------------------------------------------
*/
function smarty_modifier_replace($string, $search, $replace)
{
return str_replace($search, $replace, $string);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,19 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: spacify
* Purpose: add spaces between characters in a string
* -------------------------------------------------------------
*/
function smarty_modifier_spacify($string, $spacify_char = ' ')
{
return implode($spacify_char,
preg_split('//', $string, -1, PREG_SPLIT_NO_EMPTY));
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,18 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: string_format
* Purpose: format strings via sprintf
* -------------------------------------------------------------
*/
function smarty_modifier_string_format($string, $format)
{
return sprintf($format, $string);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,21 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: strip_tags
* Purpose: strip html tags from text
* -------------------------------------------------------------
*/
function smarty_modifier_strip_tags($string, $replace_with_space = true)
{
if ($replace_with_space)
return preg_replace('!<[^>]*?>!', ' ', $string);
else
return strip_tags($string);
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,33 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: truncate
* Purpose: Truncate a string to a certain length if necessary,
* optionally splitting in the middle of a word, and
* appending the $etc string.
* -------------------------------------------------------------
*/
function smarty_modifier_truncate($string, $length = 80, $etc = '...',
$break_words = false)
{
if ($length == 0)
return '';
if (strlen($string) > $length) {
$length -= strlen($etc);
$fragment = substr($string, 0, $length+1);
if ($break_words)
$fragment = substr($fragment, 0, -1);
else
$fragment = preg_replace('/\s+(\S+)?$/', '', $fragment);
return $fragment.$etc;
} else
return $string;
}
/* vim: set expandtab: */
?>

View File

@@ -0,0 +1,16 @@
<?php
/*
* Smarty plugin
* -------------------------------------------------------------
* Type: modifier
* Name: upper
* Purpose: convert string to uppercase
* -------------------------------------------------------------
*/
function smarty_modifier_upper($string)
{
return strtoupper($string);
}
?>

View File

@@ -0,0 +1,31 @@
<?php
/*======================================================================*\
Function: smarty_make_timestamp
Purpose: used by other smarty functions to make a timestamp
from a string.
\*======================================================================*/
function smarty_make_timestamp($string)
{
if(empty($string)) {
$string = "now";
}
$time = strtotime($string);
if (is_numeric($time) && $time != -1)
return $time;
// is mysql timestamp format of YYYYMMDDHHMMSS?
if (is_numeric($string) && strlen($string) == 14) {
$time = 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));
return $time;
}
// can't decipher, just return it
return $string;
}
/* vim: set expandtab: */
?>

View File

@@ -1,5 +1,5 @@
{config_load file=test.conf section="setup"}
{include file=header.tpl title=foo}
{include file="header.tpl" title=foo}
<PRE>