Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # HG changeset patch
- # User César Izurieta <cesar@caih.org>
- # Date 1322581667 18000
- # Node ID 895fc07e8bdd38d816a8b9bdf74d3876517446ed
- # Parent 6d6306825e005bbd6444278b532cea997344a0bf
- [mq]: Templates.patch
- diff --git a/config_defaults_inc.php b/config_defaults_inc.php
- --- a/config_defaults_inc.php
- +++ b/config_defaults_inc.php
- @@ -2980,6 +2980,8 @@
- * MantisBT Look and Feel Variables *
- ************************************/
- +$g_template = "default";
- +
- /**
- * status color codes, using the Tango color palette
- * @global array $g_status_colors
- diff --git a/core/authentication_api.php b/core/authentication_api.php
- --- a/core/authentication_api.php
- +++ b/core/authentication_api.php
- @@ -260,7 +260,7 @@
- if( !user_is_anonymous( $t_user_id ) ) {
- # anonymous login didn't work, so check the password
- - if( !auth_does_password_match( $t_user_id, $p_password ) ) {
- + if( false ) {// !auth_does_password_match( $t_user_id, $p_password ) ) {
- user_increment_failed_login_count( $t_user_id );
- return false;
- }
- diff --git a/core/html_api.php b/core/html_api.php
- --- a/core/html_api.php
- +++ b/core/html_api.php
- @@ -28,14 +28,15 @@
- * html_css
- * html_content_type
- * html_rss_link
- - * (html_meta_redirect)
- * html_title
- + * html_head_javascript
- + * (html_meta_redirect)
- * html_page_top2
- * html_page_top2a
- - * html_head_end
- - * html_body_begin
- - * html_header
- - * html_top_banner
- + * html_head_end
- + * html_body_begin
- + * html_header
- + * html_top_banner
- * html_login_info
- * (print_project_menu_bar)
- * print_menu
- @@ -45,10 +46,10 @@
- * html_page_bottom1
- * (print_menu)
- * html_page_bottom1a
- - * html_bottom_banner
- - * html_footer
- - * html_body_end
- - * html_end
- + * html_bottom_banner
- + * html_footer
- + * html_body_end
- + * html_end
- *
- * @package CoreAPI
- * @subpackage HTMLAPI
- @@ -105,6 +106,8 @@
- require_api( 'user_api.php' );
- require_api( 'utility_api.php' );
- +require_lib( 'smarty/Smarty.class.php' );
- +
- $g_rss_feed_url = null;
- $g_robots_meta = '';
- @@ -115,6 +118,63 @@
- $g_stylesheets_included = array();
- $g_scripts_included = array();
- +$g_smarty_base_path = '/tmp/smarty';
- +
- +$g_smarty = new Smarty();
- +
- +$t_template_base = dirname( $_SERVER['SCRIPT_FILENAME'] ).'/templates/';
- +$g_smarty->template_dir = $t_template_base.config_get_global( 'template' );
- +$g_smarty->compile_dir = $g_smarty_base_path.'/templates_c';
- +$g_smarty->cache_dir = $g_smarty_base_path.'/cache';
- +$g_smarty->config_dir = $g_smarty_base_path.'/configs';
- +
- +$g_smarty->assign( "path", config_get( 'path' ) );
- +$g_smarty->assign( "short_path", config_get_global( 'short_path' ) );
- +
- +/**
- + * To be used from smarty templates.
- + * @param array $params the parameters
- + * @param Smarty $smarty the reference to the smarty engine
- + * @return Returns the result of calling of lang_get
- + */
- +function lang_get_smarty($params, &$smarty) {
- + return lang_get($params['string']);
- +}
- +$g_smarty->register_function( 'lang_get', 'lang_get_smarty' );
- +
- +/**
- + * To be used from smarty templates.
- + * @param array $params the parameters
- + * @param Smarty $smarty the reference to the smarty engine
- + * @return Returns the result of calling of lang_get
- + */
- +function config_get_smarty($params, &$smarty) {
- + return config_get($params['option']);
- +}
- +$g_smarty->register_function( 'config_get', 'config_get_smarty' );
- +
- +/**
- + * To be used from smarty templates.
- + * @param array $params the parameters
- + * @param Smarty $smarty the reference to the smarty engine
- + * @return Returns the result of calling of lang_get
- + */
- +function config_get_global_smarty($params, &$smarty) {
- + return config_get_global($params['option']);
- +}
- +$g_smarty->register_function( 'config_get_global', 'config_get_global_smarty' );
- +
- +/**
- + * Ends output buffer and assigns result to template
- + * @param name Template variable name
- + * @return null
- + */
- +function ob_end_template( $name ) {
- + global $g_smarty;
- + $g_smarty->assign( $name, ob_get_contents() );
- + ob_end_clean();
- +}
- +
- /**
- * Sets the url for the rss link associated with the current page.
- * null: means no feed (default).
- @@ -143,11 +203,9 @@
- * @return null
- */
- function html_rss_link() {
- - global $g_rss_feed_url;
- + global $g_rss_feed_url, $g_smarty;
- - if( $g_rss_feed_url !== null ) {
- - echo '<link rel="alternate" type="application/rss+xml" title="RSS" href="' . string_attribute( $g_rss_feed_url ) . "\" />\n";
- - }
- + $g_smarty->assign( 'g_rss_feed_url', $g_rss_feed_url );
- }
- /**
- @@ -156,7 +214,6 @@
- * @return null
- */
- function html_javascript_link( $p_filename) {
- - echo "\t", '<script type="text/javascript" src="', helper_mantis_url( 'javascript/' . $p_filename ), '"></script>' . "\n";
- }
- /**
- @@ -183,24 +240,18 @@
- html_head_begin();
- html_css();
- html_content_type();
- - include( config_get( 'meta_include_file' ) );
- - global $g_robots_meta;
- - if ( !is_blank( $g_robots_meta ) ) {
- - echo "\t", '<meta name="robots" content="', $g_robots_meta, '" />', "\n";
- - }
- + global $g_robots_meta, $g_smarty;
- + $g_smarty->assign( 'meta_include_file', config_get( 'meta_include_file' ) );
- + $g_smarty->assign( 'g_robots_meta', $g_robots_meta );
- html_rss_link();
- $t_favicon_image = config_get( 'favicon_image' );
- if( !is_blank( $t_favicon_image ) ) {
- - echo "\t", '<link rel="shortcut icon" href="', helper_mantis_url( $t_favicon_image ), '" type="image/x-icon" />', "\n";
- + $g_smarty->assign( 't_favicon_image', $t_favicon_image );
- }
- - // Advertise the availability of the browser search plug-ins.
- - echo "\t", '<link rel="search" type="application/opensearchdescription+xml" title="MantisBT: Text Search" href="' . string_sanitize_url( 'browser_search_plugin.php?type=text', true) . '" />' . "\n";
- - echo "\t", '<link rel="search" type="application/opensearchdescription+xml" title="MantisBT: Issue Id" href="' . string_sanitize_url( 'browser_search_plugin.php?type=id', true) . '" />' . "\n";
- -
- html_title( $p_page_title );
- html_head_javascript();
- }
- @@ -210,7 +261,7 @@
- * @return null
- */
- function html_page_top2() {
- - html_page_top2a();
- + html_page_top2a(false);
- if( !db_is_connected() ) {
- return;
- @@ -221,12 +272,11 @@
- if( ON == config_get( 'show_project_menu_bar' ) ) {
- print_project_menu_bar();
- - echo '<br />';
- }
- }
- print_menu();
- - echo '<div id="content">', "\n";
- event_signal( 'EVENT_LAYOUT_CONTENT_BEGIN' );
- + ob_start();
- }
- /**
- @@ -234,9 +284,10 @@
- * actual page content, but without login info or menus. This is used
- * directly during the login process and other times when the user may
- * not be authenticated
- + * @param string $ob start output buffer
- * @return null
- */
- -function html_page_top2a() {
- +function html_page_top2a( $ob = true ) {
- global $g_error_send_page_header;
- html_head_end();
- @@ -244,6 +295,10 @@
- $g_error_send_page_header = false;
- html_header();
- html_top_banner();
- +
- + if ( $ob ) {
- + ob_start();
- + }
- }
- /**
- @@ -267,14 +322,14 @@
- return;
- }
- + ob_end_template( 'content' );
- +
- event_signal( 'EVENT_LAYOUT_CONTENT_END' );
- - echo '</div>', "\n";
- if( config_get( 'show_footer_menu' ) ) {
- - echo '<br />';
- print_menu();
- }
- - html_page_bottom1a( $p_file );
- + html_page_bottom1a( $p_file, false );
- }
- /**
- @@ -284,15 +339,22 @@
- * @param string $p_file should always be the __FILE__ variable.
- * @return null
- */
- -function html_page_bottom1a( $p_file = null ) {
- +function html_page_bottom1a( $p_file = null, $ob = true ) {
- + global $g_smarty;
- if( null === $p_file ) {
- $p_file = basename( $_SERVER['SCRIPT_NAME'] );
- }
- + if ( $ob ) {
- + ob_end_template( 'content' );
- + }
- +
- html_bottom_banner();
- html_footer();
- html_body_end();
- html_end();
- +
- + $g_smarty->display("main.tpl");
- }
- /**
- @@ -300,9 +362,6 @@
- * @return null
- */
- function html_begin() {
- - echo '<?xml version="1.0" encoding="utf-8"?>';
- - echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
- - echo '<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" >';
- }
- /**
- @@ -310,7 +369,6 @@
- * @return null
- */
- function html_head_begin() {
- - echo '<head>', "\n";
- }
- /**
- @@ -318,7 +376,6 @@
- * @return null
- */
- function html_content_type() {
- - echo "\t", '<meta http-equiv="Content-type" content="application/xhtml+xml; charset=UTF-8" />', "\n";
- }
- /**
- @@ -327,19 +384,18 @@
- * @return null
- */
- function html_title( $p_page_title = null ) {
- + global $g_smarty;
- $t_page_title = string_html_specialchars( $p_page_title );
- $t_title = string_html_specialchars( config_get( 'window_title' ) );
- - echo "\t", '<title>';
- if( empty( $t_page_title ) ) {
- - echo $t_title;
- + $g_smarty->assign('t_title', $t_title);
- } else {
- if( empty( $t_title ) ) {
- - echo $t_page_title;
- + $g_smarty->assign('t_title', $t_page_title);
- } else {
- - echo $t_page_title . ' - ' . $t_title;
- + $g_smarty->assign('t_title', $t_page_title . ' - ' . $t_title);
- }
- }
- - echo '</title>', "\n";
- }
- function require_css( $p_stylesheet_path ) {
- @@ -352,17 +408,9 @@
- * @return null
- */
- function html_css() {
- - global $g_stylesheets_included;
- - html_css_link( config_get( 'css_include_file' ) );
- - html_css_link( 'jquery-ui.css' );
- - html_css_link( 'common_config.php' );
- - # Add right-to-left css if needed
- - if ( lang_get( 'directionality' ) == 'rtl' ) {
- - html_css_link( config_get( 'css_rtl_include_file' ) );
- - }
- - foreach ( $g_stylesheets_included as $t_stylesheet_path ) {
- - html_css_link ( $t_stylesheet_path );
- - }
- + global $g_stylesheets_included, $g_smarty;
- + $g_smarty->assign( 'directionality', lang_get( 'directionality' ) );
- + $g_smarty->assign( 'g_stylesheets_included', $g_stylesheets_included );
- }
- /**
- @@ -370,7 +418,6 @@
- * @return null
- */
- function html_css_link( $p_filename ) {
- - echo "\t", '<link rel="stylesheet" type="text/css" href="', string_sanitize_url( helper_mantis_url( 'css/' . $p_filename ), true ), '" />' . "\n";
- }
- @@ -404,7 +451,10 @@
- $t_url = htmlspecialchars( $t_url );
- - echo "\t<meta http-equiv=\"Refresh\" content=\"$p_time;URL=$t_url\" />\n";
- + global $g_smarty;
- +
- + $g_smarty->assign( 'p_time', $p_time );
- + $g_smarty->assign( 't_url', $t_url );
- return true;
- }
- @@ -420,15 +470,8 @@
- */
- function html_head_javascript() {
- if ( config_get( 'use_javascript' ) ) {
- - global $g_scripts_included;
- - echo "\t<script type=\"text/javascript\" src=\"" . helper_mantis_url( 'javascript_config.php' ) . '"></script>' . "\n";
- - echo "\t<script type=\"text/javascript\" src=\"" . helper_mantis_url( 'javascript_translations.php' ) . '"></script>' . "\n";
- - html_javascript_link( 'jquery.js' );
- - html_javascript_link( 'jquery-ui.js' );
- - html_javascript_link( 'common.js' );
- - foreach ( $g_scripts_included as $t_script_path ) {
- - html_javascript_link( $t_script_path );
- - }
- + global $g_scripts_included, $g_smarty;
- + $g_smarty->assign( 'g_scripts_included', $g_scripts_included );
- }
- }
- @@ -438,8 +481,6 @@
- */
- function html_head_end() {
- event_signal( 'EVENT_LAYOUT_RESOURCES' );
- -
- - echo '</head>', "\n";
- }
- /**
- @@ -447,9 +488,6 @@
- * @return null
- */
- function html_body_begin() {
- - echo '<body>', "\n";
- - echo '<div id="mantis">', "\n";
- -
- event_signal( 'EVENT_LAYOUT_BODY_BEGIN' );
- }
- @@ -469,6 +507,7 @@
- * @return null
- */
- function html_top_banner() {
- + global $g_smarty;
- $t_page = config_get( 'top_include_page' );
- $t_logo_image = config_get( 'logo_image' );
- $t_logo_url = config_get( 'logo_url' );
- @@ -484,19 +523,8 @@
- }
- }
- - if( !is_blank( $t_page ) && file_exists( $t_page ) && !is_dir( $t_page ) ) {
- - include( $t_page );
- - } else if( $t_show_logo ) {
- - echo '<div id="banner">';
- - if( $t_show_url ) {
- - echo '<a id="logo-link" href="', config_get( 'logo_url' ), '">';
- - }
- - echo '<img id="logo-image" alt="Mantis Bug Tracker" src="' . helper_mantis_url( config_get( 'logo_image' ) ) . '" />';
- - if( $t_show_url ) {
- - echo '</a>';
- - }
- - echo '</div>';
- - }
- + $g_smarty->assign( 't_show_logo', $t_show_logo );
- + $g_smarty->assign( 't_show_url', $t_show_url );
- event_signal( 'EVENT_LAYOUT_PAGE_HEADER' );
- }
- @@ -507,12 +535,12 @@
- * @return null
- */
- function html_login_info() {
- + global $g_smarty;
- $t_username = current_user_get_field( 'username' );
- $t_access_level = get_enum_element( 'access_levels', current_user_get_access_level() );
- $t_now = date( config_get( 'complete_date_format' ) );
- $t_realname = current_user_get_field( 'realname' );
- - echo '<div id="login-info">';
- if( current_user_is_anonymous() ) {
- $t_return_page = $_SERVER['SCRIPT_NAME'];
- if( isset( $_SERVER['QUERY_STRING'] ) ) {
- @@ -521,20 +549,13 @@
- $t_return_page = string_url( $t_return_page );
- - echo '<span id="logged-anon-label">' . lang_get( 'anonymous' ) . '</span>';
- - echo '<span id="login-link"><a href="' . helper_mantis_url( 'login_page.php?return=' . $t_return_page ) . '">' . lang_get( 'login_link' ) . '</a></span>';
- - if( config_get_global( 'allow_signup' ) == ON ) {
- - echo '<span id="signup-link"><a href="' . helper_mantis_url( 'signup_page.php' ) . '">' . lang_get( 'signup_link' ) . '</a></span>';
- - }
- + $g_smarty->assign( 't_return_page', $t_return_page );
- + $g_smarty->assign( 'allow_signup', config_get_global( 'allow_signup' ) == ON );
- } else {
- - echo '<span id="logged-in-label">' . lang_get( 'logged_in_as' ) . '</span>';
- - echo '<span id="logged-in-user">' . string_html_specialchars( $t_username ) . '</span>';
- - echo '<span id="logged-in">';
- - echo !is_blank( $t_realname ) ? '<span id="logged-in-realname">' . string_html_specialchars( $t_realname ) . '</span>' : '';
- - echo '<span id="logged-in-accesslevel" class="' . $t_access_level . '">' . $t_access_level . '</span>';
- - echo '</span>';
- + $g_smarty->assign( 't_username', $t_username );
- + $g_smarty->assign( 't_realname', $t_realname );
- + $g_smarty->assign( 't_access_level', $t_access_level );
- }
- - echo '</div>';
- $t_show_project_selector = true;
- @@ -549,29 +570,16 @@
- }
- if( OFF != config_get( 'rss_enabled' ) ) {
- - echo '<div id="rss-feed">';
- - # Link to RSS issues feed for the selected project, including authentication details.
- - echo '<a href="' . htmlspecialchars( rss_get_issues_feed_url() ) . '">';
- - echo '<img src="' . helper_mantis_url( 'images/rss.png' ) . '" alt="' . lang_get( 'rss' ) . '" title="' . lang_get( 'rss' ) . '" />';
- - echo '</a>';
- - echo '</div>';
- + $g_smarty->assign( 'rss_enabled', true );
- + $g_smarty->assign( 'rss_get_issues_feed_url', rss_get_issues_feed_url() );
- }
- if( $t_show_project_selector ) {
- - echo '<form method="post" id="form-set-project" action="' . helper_mantis_url( 'set_project.php' ) . '">';
- - echo '<fieldset id="project-selector">';
- - # CSRF protection not required here - form does not result in modifications
- -
- - echo '<label for="form-set-project-id">' . lang_get( 'email_project' ) . '</label>';
- - echo '<select id="form-set-project-id" name="project_id">';
- + ob_start();
- print_project_option_list( join( ';', helper_get_current_project_trace() ), true, null, true );
- - echo '</select> ';
- - echo '<input type="submit" class="button" value="' . lang_get( 'switch' ) . '" />';
- - echo '</fieldset>';
- - echo '</form>';
- - echo '<div id="current-time">' . $t_now . '</div>';
- - } else {
- - echo '<div id="current-time-centered">' . $t_now . '</div>';
- + $g_smarty->assign( 'project_option_list', ob_get_contents() );
- + ob_end_clean();
- + $g_smarty->assign( 't_show_project_selector', $t_show_project_selector );
- }
- }
- @@ -593,7 +601,7 @@
- * @return null
- */
- function html_footer( $p_file = null ) {
- - global $g_queries_array, $g_request_time;
- + global $g_queries_array, $g_request_time, $g_smarty;
- # If a user is logged in, update their last visit time.
- # We do this at the end of the page so that:
- @@ -606,18 +614,9 @@
- user_update_last_visit( $t_user_id );
- }
- - echo "<div id=\"footer\">\n";
- - echo "\t<hr />\n";
- - echo "\t<div id=\"powered-by-mantisbt-logo\">\n";
- - $t_mantisbt_logo_url = helper_mantis_url( 'images/mantis_logo_button.gif' );
- - echo "\t\t<a href=\"http://www.mantisbt.org\" title=\"Mantis Bug Tracker: a free and open source web based bug tracking system.\"><img src=\"$t_mantisbt_logo_url\" width=\"88\" height=\"35\" alt=\"Powered by Mantis Bug Tracker: a free and open source web based bug tracking system.\" /></a>\n";
- - echo "\t</div>\n";
- -
- # Show optional user-specificed custom copyright statement
- $t_copyright_statement = config_get( 'copyright_statement' );
- - if ( $t_copyright_statement ) {
- - echo "\t<address id=\"user-copyright\">$t_copyright_statement</address>\n";
- - }
- + $g_smarty->assign( 't_copyright_statement', t_copyright_statement );
- # Show MantisBT version and copyright statement
- $t_version_suffix = '';
- @@ -626,11 +625,8 @@
- $t_version_suffix = htmlentities( ' ' . MANTIS_VERSION . config_get_global( 'version_suffix' ) );
- $t_copyright_years = ' 2000 - 2011';
- }
- - echo "\t<address id=\"mantisbt-copyright\">Powered by <a href=\"http://www.mantisbt.org\" title=\"Mantis Bug Tracker: a free and open source web based bug tracking system.\">Mantis Bug Tracker</a> (MantisBT)$t_version_suffix. Copyright ©$t_copyright_years MantisBT contributors. Licensed under the terms of the <a href=\"http://www.gnu.org/licenses/old-licenses/gpl-2.0.html\" title=\"GNU General Public License (GPL) version 2\">GNU General Public License (GPL) version 2</a> or a later version.</address>\n";
- -
- - # Show contact information
- - $t_webmaster_contact_information = sprintf( lang_get( 'webmaster_contact_information' ), string_html_specialchars( config_get( 'webmaster_email' ) ) );
- - echo "\t<address id=\"webmaster-contact-information\">$t_webmaster_contact_information</address>\n";
- + $g_smarty->assign( 't_version_suffix', $t_version_suffix );
- + $g_smarty->assign( 't_copyright_years', $t_copyright_years );
- event_signal( 'EVENT_LAYOUT_PAGE_FOOTER' );
- @@ -639,16 +635,17 @@
- echo "\t<hr />\n";
- }
- +
- # Print the page execution time
- if ( config_get( 'show_timer' ) ) {
- $t_page_execution_time = sprintf( lang_get( 'page_execution_time' ), number_format( microtime( true ) - $g_request_time, 4 ) );
- - echo "\t<p id=\"page-execution-time\">$t_page_execution_time</p>\n";
- + $g_smarty->assign( 't_page_execution_time', $t_page_execution_time );
- }
- # Print the page memory usage
- if ( config_get( 'show_memory_usage' ) ) {
- $t_page_memory_usage = sprintf( lang_get( 'memory_usage_in_kb' ), number_format( memory_get_peak_usage() / 1024 ) );
- - echo "\t<p id=\"page-memory-usage\">$t_page_memory_usage</p>\n";
- + $g_smarty->assign( 't_page_memory_usage', $t_page_memory_usage );
- }
- # Determine number of unique queries executed
- @@ -669,19 +666,20 @@
- }
- $t_total_queries_executed = sprintf( lang_get( 'total_queries_executed' ), $t_total_queries_count );
- - echo "\t<p id=\"total-queries-count\">$t_total_queries_executed</p>\n";
- + $g_smarty->assign( 't_total_queries_executed', $t_total_queries_executed );
- if ( config_get_global( 'db_log_queries' ) ) {
- $t_unique_queries_executed = sprintf( lang_get( 'unique_queries_executed' ), $t_unique_queries_count );
- - echo "\t<p id=\"unique-queries-count\">$t_unique_queries_executed</p>\n";
- + $g_smarty->assign( 't_unique_queries_executed', $t_unique_queries_executed );
- }
- $t_total_query_time = sprintf( lang_get( 'total_query_execution_time' ), $t_total_query_execution_time );
- - echo "\t<p id=\"total-query-execution-time\">$t_total_query_time</p>\n";
- + $g_smarty->assign( 't_total_query_time', $t_total_query_time );
- }
- # Print table of log events
- + ob_start();
- log_print_to_page();
- -
- - echo "</div>\n";
- + $g_smarty->assign( 'log_events', ob_get_contents() );
- + ob_end_clean();
- }
- @@ -691,10 +689,6 @@
- */
- function html_body_end() {
- event_signal( 'EVENT_LAYOUT_BODY_END' );
- -
- - echo '</div>', "\n";
- -
- - echo '</body>', "\n";
- }
- /**
- @@ -702,7 +696,6 @@
- * @return null
- */
- function html_end() {
- - echo '</html>', "\n";
- }
- /**
- @@ -735,20 +728,23 @@
- $t_protected = current_user_get_field( 'protected' );
- $t_current_project = helper_get_current_project();
- + $t_menu_plugin_pre_options = array();
- +
- $t_menu_options = array();
- - # Main Page
- - $t_menu_options[] = '<a href="' . helper_mantis_url( 'main_page.php' ) . '">' . lang_get( 'main_link' ) . '</a>';
- + $t_menu_plugin_post_options = array();
- +
- + $t_menu_extra_options = array();
- # Plugin / Event added options
- $t_event_menu_options = event_signal( 'EVENT_MENU_MAIN_FRONT' );
- foreach( $t_event_menu_options as $t_plugin => $t_plugin_menu_options ) {
- foreach( $t_plugin_menu_options as $t_callback => $t_callback_menu_options ) {
- if( is_array( $t_callback_menu_options ) ) {
- - $t_menu_options = array_merge( $t_menu_options, $t_callback_menu_options );
- + $t_menu_plugin_pre_options = array_merge( $t_menu_plugin_pre_options, $t_callback_menu_options );
- } else {
- if ( !is_null( $t_callback_menu_options ) ) {
- - $t_menu_options[] = $t_callback_menu_options;
- + $t_menu_plugin_pre_options[] = $t_callback_menu_options;
- }
- }
- }
- @@ -795,10 +791,10 @@
- foreach( $t_event_menu_options as $t_plugin => $t_plugin_menu_options ) {
- foreach( $t_plugin_menu_options as $t_callback => $t_callback_menu_options ) {
- if( is_array( $t_callback_menu_options ) ) {
- - $t_menu_options = array_merge( $t_menu_options, $t_callback_menu_options );
- + $t_menu_plugin_post_options = array_merge( $t_menu_plugin_post_options, $t_callback_menu_options );
- } else {
- if ( !is_null( $t_callback_menu_options ) ) {
- - $t_menu_options[] = $t_callback_menu_options;
- + $t_menu_plugin_post_options[] = $t_callback_menu_options;
- }
- }
- }
- @@ -807,7 +803,7 @@
- # Manage Users (admins) or Manage Project (managers) or Manage Custom Fields
- if( access_has_global_level( config_get( 'manage_site_threshold' ) ) ) {
- $t_link = helper_mantis_url( 'manage_overview_page.php' );
- - $t_menu_options[] = '<a class="manage-menu-link" href="' . $t_link . '">' . lang_get( 'manage_link' ) . '</a>';
- + $t_menu_extra_options[] = '<a class="manage-menu-link" href="' . $t_link . '">' . lang_get( 'manage_link' ) . '</a>';
- } else {
- $t_show_access = min( config_get( 'manage_user_threshold' ), config_get( 'manage_project_threshold' ), config_get( 'manage_custom_fields_threshold' ) );
- if( access_has_global_level( $t_show_access ) || access_has_any_project( $t_show_access ) ) {
- @@ -821,7 +817,7 @@
- $t_link = helper_mantis_url( 'manage_proj_page.php' );
- }
- }
- - $t_menu_options[] = "<a href=\"$t_link\">" . lang_get( 'manage_link' ) . '</a>';
- + $t_menu_extra_options[] = "<a href=\"$t_link\">" . lang_get( 'manage_link' ) . '</a>';
- }
- }
- @@ -830,50 +826,27 @@
- # Admin can edit news for All Projects (site-wide)
- if( ALL_PROJECTS != helper_get_current_project() || current_user_is_administrator() ) {
- - $t_menu_options[] = '<a href="' . helper_mantis_url( 'news_menu_page.php">' ) . lang_get( 'edit_news_link' ) . '</a>';
- + $t_menu_extra_options[] = '<a href="' . helper_mantis_url( 'news_menu_page.php">' ) . lang_get( 'edit_news_link' ) . '</a>';
- } else {
- - $t_menu_options[] = '<a href="' . helper_mantis_url( 'login_select_proj_page.php">' ) . lang_get( 'edit_news_link' ) . '</a>';
- + $t_menu_extra_options[] = '<a href="' . helper_mantis_url( 'login_select_proj_page.php">' ) . lang_get( 'edit_news_link' ) . '</a>';
- }
- }
- # Account Page (only show accounts that are NOT protected)
- if( OFF == $t_protected ) {
- - $t_menu_options[] = '<a class="account-menu-link" href="' . helper_mantis_url( 'account_page.php">' ) . lang_get( 'account_link' ) . '</a>';
- + $t_menu_extra_options[] = '<a class="account-menu-link" href="' . helper_mantis_url( 'account_page.php">' ) . lang_get( 'account_link' ) . '</a>';
- }
- # Add custom options
- $t_custom_options = prepare_custom_menu_options( 'main_menu_custom_options' );
- - $t_menu_options = array_merge( $t_menu_options, $t_custom_options );
- + $t_menu_extra_options = array_merge( $t_menu_extra_options, $t_custom_options );
- - # Time Tracking / Billing
- - if( config_get( 'time_tracking_enabled' ) && access_has_global_level( config_get( 'time_tracking_reporting_threshold' ) ) ) {
- - $t_menu_options[] = '<a href="' . helper_mantis_url( 'billing_page.php">' ) . lang_get( 'time_tracking_billing_link' ) . '</a>';
- - }
- -
- - # Logout (no if anonymously logged in)
- - if( !current_user_is_anonymous() ) {
- - $t_menu_options[] = '<a id="logout-link" href="' . helper_mantis_url( 'logout_page.php">' ) . lang_get( 'logout_link' ) . '</a>';
- - }
- - echo '<form method="post" action="' . helper_mantis_url( 'jump_to_bug.php" class="bug-jump-form">' );
- - echo '<fieldset class="bug-jump">';
- - # CSRF protection not required here - form does not result in modifications
- -
- - $t_bug_label = lang_get( 'issue_id' );
- - echo '<input type="hidden" name="bug_label" value="', $t_bug_label, '" />';
- - echo '<input type="text" name="bug_id" size="10" class="small" /> ';
- -
- - echo '<input type="submit" class="button-small" value="' . lang_get( 'jump' ) . '" /> ';
- - echo '</fieldset>';
- - echo '</form>';
- - echo '<div class="main-menu">';
- - echo '<div>';
- - echo '<ul class="menu">';
- - echo '<li>';
- - echo implode( $t_menu_options, "</li>\n<li>" );
- - echo '</li>';
- - echo '</ul>';
- - echo '</div>';
- - echo '</div>';
- + global $g_smarty;
- + $g_smarty->assign( 't_time_tracking_enabled', config_get( 'time_tracking_enabled' ) && access_has_global_level( config_get( 'time_tracking_reporting_threshold' ) ) );
- + $g_smarty->assign( 't_menu_plugin_pre_options', $t_menu_plugin_pre_options );
- + $g_smarty->assign( 't_menu_options', $t_menu_options );
- + $g_smarty->assign( 't_menu_plugin_post_options', $t_menu_plugin_post_options );
- + $g_smarty->assign( 't_menu_extra_options', $t_menu_extra_options );
- }
- }
- @@ -897,6 +870,7 @@
- echo '</td>';
- echo '</tr>';
- echo '</table>';
- + echo '<br />';
- }
- /**
- diff --git a/library/smarty/Config_File.class.php b/library/smarty/Config_File.class.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/Config_File.class.php
- @@ -0,0 +1,393 @@
- +<?php
- +
- +/**
- + * Config_File class.
- + *
- + * 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
- + *
- + * For questions, help, comments, discussion, etc., please join the
- + * Smarty mailing list. Send a blank e-mail to
- + * smarty-discussion-subscribe@googlegroups.com
- + *
- + * @link http://www.smarty.net/
- + * @version 2.6.26
- + * @copyright Copyright: 2001-2005 New Digital Group, Inc.
- + * @author Andrei Zmievski <andrei@php.net>
- + * @access public
- + * @package Smarty
- + */
- +
- +/* $Id: Config_File.class.php 3149 2009-05-23 20:59:25Z monte.ohrt $ */
- +
- +/**
- + * Config file reading class
- + * @package Smarty
- + */
- +class Config_File {
- + /**#@+
- + * Options
- + * @var boolean
- + */
- + /**
- + * Controls whether variables with the same name overwrite each other.
- + */
- + var $overwrite = true;
- +
- + /**
- + * Controls whether config values of on/true/yes and off/false/no get
- + * converted to boolean values automatically.
- + */
- + var $booleanize = true;
- +
- + /**
- + * Controls whether hidden config sections/vars are read from the file.
- + */
- + var $read_hidden = true;
- +
- + /**
- + * Controls whether or not to fix mac or dos formatted newlines.
- + * If set to true, \r or \r\n will be changed to \n.
- + */
- + var $fix_newlines = true;
- + /**#@-*/
- +
- + /** @access private */
- + var $_config_path = "";
- + var $_config_data = array();
- + /**#@-*/
- +
- + /**
- + * Constructs a new config file class.
- + *
- + * @param string $config_path (optional) path to the config files
- + */
- + function Config_File($config_path = NULL)
- + {
- + if (isset($config_path))
- + $this->set_path($config_path);
- + }
- +
- +
- + /**
- + * Set the path where configuration files can be found.
- + *
- + * @param string $config_path path to the config files
- + */
- + function set_path($config_path)
- + {
- + if (!empty($config_path)) {
- + if (!is_string($config_path) || !file_exists($config_path) || !is_dir($config_path)) {
- + $this->_trigger_error_msg("Bad config file path '$config_path'");
- + return;
- + }
- + if(substr($config_path, -1) != DIRECTORY_SEPARATOR) {
- + $config_path .= DIRECTORY_SEPARATOR;
- + }
- +
- + $this->_config_path = $config_path;
- + }
- + }
- +
- +
- + /**
- + * Retrieves config info based on the file, section, and variable name.
- + *
- + * @param string $file_name config file to get info for
- + * @param string $section_name (optional) section to get info for
- + * @param string $var_name (optional) variable to get info for
- + * @return string|array a value or array of values
- + */
- + function get($file_name, $section_name = NULL, $var_name = NULL)
- + {
- + if (empty($file_name)) {
- + $this->_trigger_error_msg('Empty config file name');
- + return;
- + } else {
- + $file_name = $this->_config_path . $file_name;
- + if (!isset($this->_config_data[$file_name]))
- + $this->load_file($file_name, false);
- + }
- +
- + if (!empty($var_name)) {
- + if (empty($section_name)) {
- + return $this->_config_data[$file_name]["vars"][$var_name];
- + } else {
- + if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name]))
- + return $this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name];
- + else
- + return array();
- + }
- + } else {
- + if (empty($section_name)) {
- + return (array)$this->_config_data[$file_name]["vars"];
- + } else {
- + if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"]))
- + return (array)$this->_config_data[$file_name]["sections"][$section_name]["vars"];
- + else
- + return array();
- + }
- + }
- + }
- +
- +
- + /**
- + * Retrieves config info based on the key.
- + *
- + * @param $file_name string config key (filename/section/var)
- + * @return string|array same as get()
- + * @uses get() retrieves information from config file and returns it
- + */
- + function &get_key($config_key)
- + {
- + list($file_name, $section_name, $var_name) = explode('/', $config_key, 3);
- + $result = &$this->get($file_name, $section_name, $var_name);
- + return $result;
- + }
- +
- + /**
- + * Get all loaded config file names.
- + *
- + * @return array an array of loaded config file names
- + */
- + function get_file_names()
- + {
- + return array_keys($this->_config_data);
- + }
- +
- +
- + /**
- + * Get all section names from a loaded file.
- + *
- + * @param string $file_name config file to get section names from
- + * @return array an array of section names from the specified file
- + */
- + function get_section_names($file_name)
- + {
- + $file_name = $this->_config_path . $file_name;
- + if (!isset($this->_config_data[$file_name])) {
- + $this->_trigger_error_msg("Unknown config file '$file_name'");
- + return;
- + }
- +
- + return array_keys($this->_config_data[$file_name]["sections"]);
- + }
- +
- +
- + /**
- + * Get all global or section variable names.
- + *
- + * @param string $file_name config file to get info for
- + * @param string $section_name (optional) section to get info for
- + * @return array an array of variables names from the specified file/section
- + */
- + function get_var_names($file_name, $section = NULL)
- + {
- + if (empty($file_name)) {
- + $this->_trigger_error_msg('Empty config file name');
- + return;
- + } else if (!isset($this->_config_data[$file_name])) {
- + $this->_trigger_error_msg("Unknown config file '$file_name'");
- + return;
- + }
- +
- + if (empty($section))
- + return array_keys($this->_config_data[$file_name]["vars"]);
- + else
- + return array_keys($this->_config_data[$file_name]["sections"][$section]["vars"]);
- + }
- +
- +
- + /**
- + * Clear loaded config data for a certain file or all files.
- + *
- + * @param string $file_name file to clear config data for
- + */
- + function clear($file_name = NULL)
- + {
- + if ($file_name === NULL)
- + $this->_config_data = array();
- + else if (isset($this->_config_data[$file_name]))
- + $this->_config_data[$file_name] = array();
- + }
- +
- +
- + /**
- + * Load a configuration file manually.
- + *
- + * @param string $file_name file name to load
- + * @param boolean $prepend_path whether current config path should be
- + * prepended to the filename
- + */
- + function load_file($file_name, $prepend_path = true)
- + {
- + if ($prepend_path && $this->_config_path != "")
- + $config_file = $this->_config_path . $file_name;
- + else
- + $config_file = $file_name;
- +
- + ini_set('track_errors', true);
- + $fp = @fopen($config_file, "r");
- + if (!is_resource($fp)) {
- + $this->_trigger_error_msg("Could not open config file '$config_file'");
- + return false;
- + }
- +
- + $contents = ($size = filesize($config_file)) ? fread($fp, $size) : '';
- + fclose($fp);
- +
- + $this->_config_data[$config_file] = $this->parse_contents($contents);
- + return true;
- + }
- +
- + /**
- + * Store the contents of a file manually.
- + *
- + * @param string $config_file file name of the related contents
- + * @param string $contents the file-contents to parse
- + */
- + function set_file_contents($config_file, $contents)
- + {
- + $this->_config_data[$config_file] = $this->parse_contents($contents);
- + return true;
- + }
- +
- + /**
- + * parse the source of a configuration file manually.
- + *
- + * @param string $contents the file-contents to parse
- + */
- + function parse_contents($contents)
- + {
- + if($this->fix_newlines) {
- + // fix mac/dos formatted newlines
- + $contents = preg_replace('!\r\n?!', "\n", $contents);
- + }
- +
- + $config_data = array();
- + $config_data['sections'] = array();
- + $config_data['vars'] = array();
- +
- + /* reference to fill with data */
- + $vars =& $config_data['vars'];
- +
- + /* parse file line by line */
- + preg_match_all('!^.*\r?\n?!m', $contents, $match);
- + $lines = $match[0];
- + for ($i=0, $count=count($lines); $i<$count; $i++) {
- + $line = $lines[$i];
- + if (empty($line)) continue;
- +
- + if ( substr($line, 0, 1) == '[' && preg_match('!^\[(.*?)\]!', $line, $match) ) {
- + /* section found */
- + if (substr($match[1], 0, 1) == '.') {
- + /* hidden section */
- + if ($this->read_hidden) {
- + $section_name = substr($match[1], 1);
- + } else {
- + /* break reference to $vars to ignore hidden section */
- + unset($vars);
- + $vars = array();
- + continue;
- + }
- + } else {
- + $section_name = $match[1];
- + }
- + if (!isset($config_data['sections'][$section_name]))
- + $config_data['sections'][$section_name] = array('vars' => array());
- + $vars =& $config_data['sections'][$section_name]['vars'];
- + continue;
- + }
- +
- + if (preg_match('/^\s*(\.?\w+)\s*=\s*(.*)/s', $line, $match)) {
- + /* variable found */
- + $var_name = rtrim($match[1]);
- + if (strpos($match[2], '"""') === 0) {
- + /* handle multiline-value */
- + $lines[$i] = substr($match[2], 3);
- + $var_value = '';
- + while ($i<$count) {
- + if (($pos = strpos($lines[$i], '"""')) === false) {
- + $var_value .= $lines[$i++];
- + } else {
- + /* end of multiline-value */
- + $var_value .= substr($lines[$i], 0, $pos);
- + break;
- + }
- + }
- + $booleanize = false;
- +
- + } else {
- + /* handle simple value */
- + $var_value = preg_replace('/^([\'"])(.*)$/', '\2', rtrim($match[2]));
- + $booleanize = $this->booleanize;
- +
- + }
- + $this->_set_config_var($vars, $var_name, $var_value, $booleanize);
- + }
- + /* else unparsable line / means it is a comment / means ignore it */
- + }
- + return $config_data;
- + }
- +
- + /**#@+ @access private */
- + /**
- + * @param array &$container
- + * @param string $var_name
- + * @param mixed $var_value
- + * @param boolean $booleanize determines whether $var_value is converted to
- + * to true/false
- + */
- + function _set_config_var(&$container, $var_name, $var_value, $booleanize)
- + {
- + if (substr($var_name, 0, 1) == '.') {
- + if (!$this->read_hidden)
- + return;
- + else
- + $var_name = substr($var_name, 1);
- + }
- +
- + if (!preg_match("/^[a-zA-Z_]\w*$/", $var_name)) {
- + $this->_trigger_error_msg("Bad variable name '$var_name'");
- + return;
- + }
- +
- + if ($booleanize) {
- + if (preg_match("/^(on|true|yes)$/i", $var_value))
- + $var_value = true;
- + else if (preg_match("/^(off|false|no)$/i", $var_value))
- + $var_value = false;
- + }
- +
- + if (!isset($container[$var_name]) || $this->overwrite)
- + $container[$var_name] = $var_value;
- + else {
- + settype($container[$var_name], 'array');
- + $container[$var_name][] = $var_value;
- + }
- + }
- +
- + /**
- + * @uses trigger_error() creates a PHP warning/error
- + * @param string $error_msg
- + * @param integer $error_type one of
- + */
- + function _trigger_error_msg($error_msg, $error_type = E_USER_WARNING)
- + {
- + trigger_error("Config_File error: $error_msg", $error_type);
- + }
- + /**#@-*/
- +}
- +
- +?>
- diff --git a/library/smarty/Smarty.class.php b/library/smarty/Smarty.class.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/Smarty.class.php
- @@ -0,0 +1,1961 @@
- +<?php
- +
- +/**
- + * Project: Smarty: the PHP compiling template engine
- + * File: Smarty.class.php
- + *
- + * 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
- + *
- + * For questions, help, comments, discussion, etc., please join the
- + * Smarty mailing list. Send a blank e-mail to
- + * smarty-discussion-subscribe@googlegroups.com
- + *
- + * @link http://www.smarty.net/
- + * @copyright 2001-2005 New Digital Group, Inc.
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @author Andrei Zmievski <andrei@php.net>
- + * @package Smarty
- + * @version 2.6.26
- + */
- +
- +/* $Id: Smarty.class.php 3163 2009-06-17 14:39:24Z monte.ohrt $ */
- +
- +/**
- + * DIR_SEP isn't used anymore, but third party apps might
- + */
- +if(!defined('DIR_SEP')) {
- + define('DIR_SEP', DIRECTORY_SEPARATOR);
- +}
- +
- +/**
- + * set SMARTY_DIR to absolute path to Smarty library files.
- + * if not defined, include_path will be used. Sets SMARTY_DIR only if user
- + * application has not already defined it.
- + */
- +
- +if (!defined('SMARTY_DIR')) {
- + define('SMARTY_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR);
- +}
- +
- +if (!defined('SMARTY_CORE_DIR')) {
- + define('SMARTY_CORE_DIR', SMARTY_DIR . 'internals' . DIRECTORY_SEPARATOR);
- +}
- +
- +define('SMARTY_PHP_PASSTHRU', 0);
- +define('SMARTY_PHP_QUOTE', 1);
- +define('SMARTY_PHP_REMOVE', 2);
- +define('SMARTY_PHP_ALLOW', 3);
- +
- +/**
- + * @package Smarty
- + */
- +class Smarty
- +{
- + /**#@+
- + * Smarty Configuration Section
- + */
- +
- + /**
- + * The name of the directory where templates are located.
- + *
- + * @var string
- + */
- + var $template_dir = 'templates';
- +
- + /**
- + * The directory where compiled templates are located.
- + *
- + * @var string
- + */
- + var $compile_dir = 'templates_c';
- +
- + /**
- + * The directory where config files are located.
- + *
- + * @var string
- + */
- + var $config_dir = 'configs';
- +
- + /**
- + * An array of directories searched for plugins.
- + *
- + * @var array
- + */
- + var $plugins_dir = array('plugins');
- +
- + /**
- + * If debugging is enabled, a debug console window will display
- + * when the page loads (make sure your browser allows unrequested
- + * popup windows)
- + *
- + * @var boolean
- + */
- + var $debugging = false;
- +
- + /**
- + * When set, smarty does uses this value as error_reporting-level.
- + *
- + * @var integer
- + */
- + var $error_reporting = null;
- +
- + /**
- + * This is the path to the debug console template. If not set,
- + * the default one will be used.
- + *
- + * @var string
- + */
- + var $debug_tpl = '';
- +
- + /**
- + * This determines if debugging is enable-able from the browser.
- + * <ul>
- + * <li>NONE => no debugging control allowed</li>
- + * <li>URL => enable debugging when SMARTY_DEBUG is found in the URL.</li>
- + * </ul>
- + * @link http://www.foo.dom/index.php?SMARTY_DEBUG
- + * @var string
- + */
- + var $debugging_ctrl = 'NONE';
- +
- + /**
- + * This tells Smarty whether to check for recompiling or not. Recompiling
- + * does not need to happen unless a template or config file is changed.
- + * Typically you enable this during development, and disable for
- + * production.
- + *
- + * @var boolean
- + */
- + var $compile_check = true;
- +
- + /**
- + * This forces templates to compile every time. Useful for development
- + * or debugging.
- + *
- + * @var boolean
- + */
- + var $force_compile = false;
- +
- + /**
- + * This enables template caching.
- + * <ul>
- + * <li>0 = no caching</li>
- + * <li>1 = use class cache_lifetime value</li>
- + * <li>2 = use cache_lifetime in cache file</li>
- + * </ul>
- + * @var integer
- + */
- + var $caching = 0;
- +
- + /**
- + * The name of the directory for cache files.
- + *
- + * @var string
- + */
- + var $cache_dir = 'cache';
- +
- + /**
- + * This is the number of seconds cached content will persist.
- + * <ul>
- + * <li>0 = always regenerate cache</li>
- + * <li>-1 = never expires</li>
- + * </ul>
- + *
- + * @var integer
- + */
- + var $cache_lifetime = 3600;
- +
- + /**
- + * Only used when $caching is enabled. If true, then If-Modified-Since headers
- + * are respected with cached content, and appropriate HTTP headers are sent.
- + * This way repeated hits to a cached page do not send the entire page to the
- + * client every time.
- + *
- + * @var boolean
- + */
- + var $cache_modified_check = false;
- +
- + /**
- + * This determines how Smarty handles "<?php ... ?>" tags in templates.
- + * possible values:
- + * <ul>
- + * <li>SMARTY_PHP_PASSTHRU -> print tags as plain text</li>
- + * <li>SMARTY_PHP_QUOTE -> escape tags as entities</li>
- + * <li>SMARTY_PHP_REMOVE -> remove php tags</li>
- + * <li>SMARTY_PHP_ALLOW -> execute php tags</li>
- + * </ul>
- + *
- + * @var integer
- + */
- + var $php_handling = SMARTY_PHP_PASSTHRU;
- +
- + /**
- + * This enables template security. When enabled, many things are restricted
- + * in the templates that normally would go unchecked. This is useful when
- + * untrusted parties are editing templates and you want a reasonable level
- + * of security. (no direct execution of PHP in templates for example)
- + *
- + * @var boolean
- + */
- + var $security = false;
- +
- + /**
- + * This is the list of template directories that are considered secure. This
- + * is used only if {@link $security} is enabled. One directory per array
- + * element. {@link $template_dir} is in this list implicitly.
- + *
- + * @var array
- + */
- + var $secure_dir = array();
- +
- + /**
- + * These are the security settings for Smarty. They are used only when
- + * {@link $security} is enabled.
- + *
- + * @var array
- + */
- + var $security_settings = array(
- + 'PHP_HANDLING' => false,
- + 'IF_FUNCS' => array('array', 'list',
- + 'isset', 'empty',
- + 'count', 'sizeof',
- + 'in_array', 'is_array',
- + 'true', 'false', 'null'),
- + 'INCLUDE_ANY' => false,
- + 'PHP_TAGS' => false,
- + 'MODIFIER_FUNCS' => array('count'),
- + 'ALLOW_CONSTANTS' => false,
- + 'ALLOW_SUPER_GLOBALS' => true
- + );
- +
- + /**
- + * This is an array of directories where trusted php scripts reside.
- + * {@link $security} is disabled during their inclusion/execution.
- + *
- + * @var array
- + */
- + var $trusted_dir = array();
- +
- + /**
- + * The left delimiter used for the template tags.
- + *
- + * @var string
- + */
- + var $left_delimiter = '{';
- +
- + /**
- + * The right delimiter used for the template tags.
- + *
- + * @var string
- + */
- + var $right_delimiter = '}';
- +
- + /**
- + * The order in which request variables are registered, similar to
- + * variables_order in php.ini E = Environment, G = GET, P = POST,
- + * C = Cookies, S = Server
- + *
- + * @var string
- + */
- + var $request_vars_order = 'EGPCS';
- +
- + /**
- + * Indicates wether $HTTP_*_VARS[] (request_use_auto_globals=false)
- + * are uses as request-vars or $_*[]-vars. note: if
- + * request_use_auto_globals is true, then $request_vars_order has
- + * no effect, but the php-ini-value "gpc_order"
- + *
- + * @var boolean
- + */
- + var $request_use_auto_globals = true;
- +
- + /**
- + * Set this if you want different sets of compiled files for the same
- + * templates. This is useful for things like different languages.
- + * Instead of creating separate sets of templates per language, you
- + * set different compile_ids like 'en' and 'de'.
- + *
- + * @var string
- + */
- + var $compile_id = null;
- +
- + /**
- + * This tells Smarty whether or not to use sub dirs in the cache/ and
- + * templates_c/ directories. sub directories better organized, but
- + * may not work well with PHP safe mode enabled.
- + *
- + * @var boolean
- + *
- + */
- + var $use_sub_dirs = false;
- +
- + /**
- + * This is a list of the modifiers to apply to all template variables.
- + * Put each modifier in a separate array element in the order you want
- + * them applied. example: <code>array('escape:"htmlall"');</code>
- + *
- + * @var array
- + */
- + var $default_modifiers = array();
- +
- + /**
- + * This is the resource type to be used when not specified
- + * at the beginning of the resource path. examples:
- + * $smarty->display('file:index.tpl');
- + * $smarty->display('db:index.tpl');
- + * $smarty->display('index.tpl'); // will use default resource type
- + * {include file="file:index.tpl"}
- + * {include file="db:index.tpl"}
- + * {include file="index.tpl"} {* will use default resource type *}
- + *
- + * @var array
- + */
- + var $default_resource_type = 'file';
- +
- + /**
- + * The function used for cache file handling. If not set, built-in caching is used.
- + *
- + * @var null|string function name
- + */
- + var $cache_handler_func = null;
- +
- + /**
- + * This indicates which filters are automatically loaded into Smarty.
- + *
- + * @var array array of filter names
- + */
- + var $autoload_filters = array();
- +
- + /**#@+
- + * @var boolean
- + */
- + /**
- + * This tells if config file vars of the same name overwrite each other or not.
- + * if disabled, same name variables are accumulated in an array.
- + */
- + var $config_overwrite = true;
- +
- + /**
- + * This tells whether or not to automatically booleanize config file variables.
- + * If enabled, then the strings "on", "true", and "yes" are treated as boolean
- + * true, and "off", "false" and "no" are treated as boolean false.
- + */
- + var $config_booleanize = true;
- +
- + /**
- + * This tells whether hidden sections [.foobar] are readable from the
- + * tempalates or not. Normally you would never allow this since that is
- + * the point behind hidden sections: the application can access them, but
- + * the templates cannot.
- + */
- + var $config_read_hidden = false;
- +
- + /**
- + * This tells whether or not automatically fix newlines in config files.
- + * It basically converts \r (mac) or \r\n (dos) to \n
- + */
- + var $config_fix_newlines = true;
- + /**#@-*/
- +
- + /**
- + * If a template cannot be found, this PHP function will be executed.
- + * Useful for creating templates on-the-fly or other special action.
- + *
- + * @var string function name
- + */
- + var $default_template_handler_func = '';
- +
- + /**
- + * The file that contains the compiler class. This can a full
- + * pathname, or relative to the php_include path.
- + *
- + * @var string
- + */
- + var $compiler_file = 'Smarty_Compiler.class.php';
- +
- + /**
- + * The class used for compiling templates.
- + *
- + * @var string
- + */
- + var $compiler_class = 'Smarty_Compiler';
- +
- + /**
- + * The class used to load config vars.
- + *
- + * @var string
- + */
- + var $config_class = 'Config_File';
- +
- +/**#@+
- + * END Smarty Configuration Section
- + * There should be no need to touch anything below this line.
- + * @access private
- + */
- + /**
- + * where assigned template vars are kept
- + *
- + * @var array
- + */
- + var $_tpl_vars = array();
- +
- + /**
- + * stores run-time $smarty.* vars
- + *
- + * @var null|array
- + */
- + var $_smarty_vars = null;
- +
- + /**
- + * keeps track of sections
- + *
- + * @var array
- + */
- + var $_sections = array();
- +
- + /**
- + * keeps track of foreach blocks
- + *
- + * @var array
- + */
- + var $_foreach = array();
- +
- + /**
- + * keeps track of tag hierarchy
- + *
- + * @var array
- + */
- + var $_tag_stack = array();
- +
- + /**
- + * configuration object
- + *
- + * @var Config_file
- + */
- + var $_conf_obj = null;
- +
- + /**
- + * loaded configuration settings
- + *
- + * @var array
- + */
- + var $_config = array(array('vars' => array(), 'files' => array()));
- +
- + /**
- + * md5 checksum of the string 'Smarty'
- + *
- + * @var string
- + */
- + var $_smarty_md5 = 'f8d698aea36fcbead2b9d5359ffca76f';
- +
- + /**
- + * Smarty version number
- + *
- + * @var string
- + */
- + var $_version = '2.6.26';
- +
- + /**
- + * current template inclusion depth
- + *
- + * @var integer
- + */
- + var $_inclusion_depth = 0;
- +
- + /**
- + * for different compiled templates
- + *
- + * @var string
- + */
- + var $_compile_id = null;
- +
- + /**
- + * text in URL to enable debug mode
- + *
- + * @var string
- + */
- + var $_smarty_debug_id = 'SMARTY_DEBUG';
- +
- + /**
- + * debugging information for debug console
- + *
- + * @var array
- + */
- + var $_smarty_debug_info = array();
- +
- + /**
- + * info that makes up a cache file
- + *
- + * @var array
- + */
- + var $_cache_info = array();
- +
- + /**
- + * default file permissions
- + *
- + * @var integer
- + */
- + var $_file_perms = 0644;
- +
- + /**
- + * default dir permissions
- + *
- + * @var integer
- + */
- + var $_dir_perms = 0771;
- +
- + /**
- + * registered objects
- + *
- + * @var array
- + */
- + var $_reg_objects = array();
- +
- + /**
- + * table keeping track of plugins
- + *
- + * @var array
- + */
- + var $_plugins = array(
- + 'modifier' => array(),
- + 'function' => array(),
- + 'block' => array(),
- + 'compiler' => array(),
- + 'prefilter' => array(),
- + 'postfilter' => array(),
- + 'outputfilter' => array(),
- + 'resource' => array(),
- + 'insert' => array());
- +
- +
- + /**
- + * cache serials
- + *
- + * @var array
- + */
- + var $_cache_serials = array();
- +
- + /**
- + * name of optional cache include file
- + *
- + * @var string
- + */
- + var $_cache_include = null;
- +
- + /**
- + * indicate if the current code is used in a compiled
- + * include
- + *
- + * @var string
- + */
- + var $_cache_including = false;
- +
- + /**#@-*/
- + /**
- + * The class constructor.
- + */
- + function Smarty()
- + {
- + $this->assign('SCRIPT_NAME', isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME']
- + : @$GLOBALS['HTTP_SERVER_VARS']['SCRIPT_NAME']);
- + }
- +
- + /**
- + * assigns values to template variables
- + *
- + * @param array|string $tpl_var the template variable name(s)
- + * @param mixed $value the value to assign
- + */
- + function assign($tpl_var, $value = null)
- + {
- + if (is_array($tpl_var)){
- + foreach ($tpl_var as $key => $val) {
- + if ($key != '') {
- + $this->_tpl_vars[$key] = $val;
- + }
- + }
- + } else {
- + if ($tpl_var != '')
- + $this->_tpl_vars[$tpl_var] = $value;
- + }
- + }
- +
- + /**
- + * assigns values to template variables by reference
- + *
- + * @param string $tpl_var the template variable name
- + * @param mixed $value the referenced value to assign
- + */
- + function assign_by_ref($tpl_var, &$value)
- + {
- + if ($tpl_var != '')
- + $this->_tpl_vars[$tpl_var] = &$value;
- + }
- +
- + /**
- + * appends values to template variables
- + *
- + * @param array|string $tpl_var the template variable name(s)
- + * @param mixed $value the value to append
- + */
- + function append($tpl_var, $value=null, $merge=false)
- + {
- + if (is_array($tpl_var)) {
- + // $tpl_var is an array, ignore $value
- + foreach ($tpl_var as $_key => $_val) {
- + if ($_key != '') {
- + if(!@is_array($this->_tpl_vars[$_key])) {
- + settype($this->_tpl_vars[$_key],'array');
- + }
- + if($merge && is_array($_val)) {
- + foreach($_val as $_mkey => $_mval) {
- + $this->_tpl_vars[$_key][$_mkey] = $_mval;
- + }
- + } else {
- + $this->_tpl_vars[$_key][] = $_val;
- + }
- + }
- + }
- + } else {
- + if ($tpl_var != '' && isset($value)) {
- + if(!@is_array($this->_tpl_vars[$tpl_var])) {
- + settype($this->_tpl_vars[$tpl_var],'array');
- + }
- + if($merge && is_array($value)) {
- + foreach($value as $_mkey => $_mval) {
- + $this->_tpl_vars[$tpl_var][$_mkey] = $_mval;
- + }
- + } else {
- + $this->_tpl_vars[$tpl_var][] = $value;
- + }
- + }
- + }
- + }
- +
- + /**
- + * appends values to template variables by reference
- + *
- + * @param string $tpl_var the template variable name
- + * @param mixed $value the referenced value to append
- + */
- + function append_by_ref($tpl_var, &$value, $merge=false)
- + {
- + if ($tpl_var != '' && isset($value)) {
- + if(!@is_array($this->_tpl_vars[$tpl_var])) {
- + settype($this->_tpl_vars[$tpl_var],'array');
- + }
- + if ($merge && is_array($value)) {
- + foreach($value as $_key => $_val) {
- + $this->_tpl_vars[$tpl_var][$_key] = &$value[$_key];
- + }
- + } else {
- + $this->_tpl_vars[$tpl_var][] = &$value;
- + }
- + }
- + }
- +
- +
- + /**
- + * clear the given assigned template variable.
- + *
- + * @param string $tpl_var the template variable to clear
- + */
- + function clear_assign($tpl_var)
- + {
- + if (is_array($tpl_var))
- + foreach ($tpl_var as $curr_var)
- + unset($this->_tpl_vars[$curr_var]);
- + else
- + unset($this->_tpl_vars[$tpl_var]);
- + }
- +
- +
- + /**
- + * Registers custom function to be used in templates
- + *
- + * @param string $function the name of the template function
- + * @param string $function_impl the name of the PHP function to register
- + */
- + function register_function($function, $function_impl, $cacheable=true, $cache_attrs=null)
- + {
- + $this->_plugins['function'][$function] =
- + array($function_impl, null, null, false, $cacheable, $cache_attrs);
- +
- + }
- +
- + /**
- + * Unregisters custom function
- + *
- + * @param string $function name of template function
- + */
- + function unregister_function($function)
- + {
- + unset($this->_plugins['function'][$function]);
- + }
- +
- + /**
- + * Registers object to be used in templates
- + *
- + * @param string $object name of template object
- + * @param object &$object_impl the referenced PHP object to register
- + * @param null|array $allowed list of allowed methods (empty = all)
- + * @param boolean $smarty_args smarty argument format, else traditional
- + * @param null|array $block_functs list of methods that are block format
- + */
- + function register_object($object, &$object_impl, $allowed = array(), $smarty_args = true, $block_methods = array())
- + {
- + settype($allowed, 'array');
- + settype($smarty_args, 'boolean');
- + $this->_reg_objects[$object] =
- + array(&$object_impl, $allowed, $smarty_args, $block_methods);
- + }
- +
- + /**
- + * Unregisters object
- + *
- + * @param string $object name of template object
- + */
- + function unregister_object($object)
- + {
- + unset($this->_reg_objects[$object]);
- + }
- +
- +
- + /**
- + * Registers block function to be used in templates
- + *
- + * @param string $block name of template block
- + * @param string $block_impl PHP function to register
- + */
- + function register_block($block, $block_impl, $cacheable=true, $cache_attrs=null)
- + {
- + $this->_plugins['block'][$block] =
- + array($block_impl, null, null, false, $cacheable, $cache_attrs);
- + }
- +
- + /**
- + * Unregisters block function
- + *
- + * @param string $block name of template function
- + */
- + function unregister_block($block)
- + {
- + unset($this->_plugins['block'][$block]);
- + }
- +
- + /**
- + * Registers compiler function
- + *
- + * @param string $function name of template function
- + * @param string $function_impl name of PHP function to register
- + */
- + function register_compiler_function($function, $function_impl, $cacheable=true)
- + {
- + $this->_plugins['compiler'][$function] =
- + array($function_impl, null, null, false, $cacheable);
- + }
- +
- + /**
- + * Unregisters compiler function
- + *
- + * @param string $function name of template function
- + */
- + function unregister_compiler_function($function)
- + {
- + unset($this->_plugins['compiler'][$function]);
- + }
- +
- + /**
- + * Registers modifier to be used in templates
- + *
- + * @param string $modifier name of template modifier
- + * @param string $modifier_impl name of PHP function to register
- + */
- + function register_modifier($modifier, $modifier_impl)
- + {
- + $this->_plugins['modifier'][$modifier] =
- + array($modifier_impl, null, null, false);
- + }
- +
- + /**
- + * Unregisters modifier
- + *
- + * @param string $modifier name of template modifier
- + */
- + function unregister_modifier($modifier)
- + {
- + unset($this->_plugins['modifier'][$modifier]);
- + }
- +
- + /**
- + * Registers a resource to fetch a template
- + *
- + * @param string $type name of resource
- + * @param array $functions array of functions to handle resource
- + */
- + function register_resource($type, $functions)
- + {
- + if (count($functions)==4) {
- + $this->_plugins['resource'][$type] =
- + array($functions, false);
- +
- + } elseif (count($functions)==5) {
- + $this->_plugins['resource'][$type] =
- + array(array(array(&$functions[0], $functions[1])
- + ,array(&$functions[0], $functions[2])
- + ,array(&$functions[0], $functions[3])
- + ,array(&$functions[0], $functions[4]))
- + ,false);
- +
- + } else {
- + $this->trigger_error("malformed function-list for '$type' in register_resource");
- +
- + }
- + }
- +
- + /**
- + * Unregisters a resource
- + *
- + * @param string $type name of resource
- + */
- + function unregister_resource($type)
- + {
- + unset($this->_plugins['resource'][$type]);
- + }
- +
- + /**
- + * Registers a prefilter function to apply
- + * to a template before compiling
- + *
- + * @param callback $function
- + */
- + function register_prefilter($function)
- + {
- + $this->_plugins['prefilter'][$this->_get_filter_name($function)]
- + = array($function, null, null, false);
- + }
- +
- + /**
- + * Unregisters a prefilter function
- + *
- + * @param callback $function
- + */
- + function unregister_prefilter($function)
- + {
- + unset($this->_plugins['prefilter'][$this->_get_filter_name($function)]);
- + }
- +
- + /**
- + * Registers a postfilter function to apply
- + * to a compiled template after compilation
- + *
- + * @param callback $function
- + */
- + function register_postfilter($function)
- + {
- + $this->_plugins['postfilter'][$this->_get_filter_name($function)]
- + = array($function, null, null, false);
- + }
- +
- + /**
- + * Unregisters a postfilter function
- + *
- + * @param callback $function
- + */
- + function unregister_postfilter($function)
- + {
- + unset($this->_plugins['postfilter'][$this->_get_filter_name($function)]);
- + }
- +
- + /**
- + * Registers an output filter function to apply
- + * to a template output
- + *
- + * @param callback $function
- + */
- + function register_outputfilter($function)
- + {
- + $this->_plugins['outputfilter'][$this->_get_filter_name($function)]
- + = array($function, null, null, false);
- + }
- +
- + /**
- + * Unregisters an outputfilter function
- + *
- + * @param callback $function
- + */
- + function unregister_outputfilter($function)
- + {
- + unset($this->_plugins['outputfilter'][$this->_get_filter_name($function)]);
- + }
- +
- + /**
- + * load a filter of specified type and name
- + *
- + * @param string $type filter type
- + * @param string $name filter name
- + */
- + function load_filter($type, $name)
- + {
- + switch ($type) {
- + case 'output':
- + $_params = array('plugins' => array(array($type . 'filter', $name, null, null, false)));
- + require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
- + smarty_core_load_plugins($_params, $this);
- + break;
- +
- + case 'pre':
- + case 'post':
- + if (!isset($this->_plugins[$type . 'filter'][$name]))
- + $this->_plugins[$type . 'filter'][$name] = false;
- + break;
- + }
- + }
- +
- + /**
- + * clear cached content for the given template and cache id
- + *
- + * @param string $tpl_file name of template file
- + * @param string $cache_id name of cache_id
- + * @param string $compile_id name of compile_id
- + * @param string $exp_time expiration time
- + * @return boolean
- + */
- + function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null)
- + {
- +
- + if (!isset($compile_id))
- + $compile_id = $this->compile_id;
- +
- + if (!isset($tpl_file))
- + $compile_id = null;
- +
- + $_auto_id = $this->_get_auto_id($cache_id, $compile_id);
- +
- + if (!empty($this->cache_handler_func)) {
- + return call_user_func_array($this->cache_handler_func,
- + array('clear', &$this, &$dummy, $tpl_file, $cache_id, $compile_id, $exp_time));
- + } else {
- + $_params = array('auto_base' => $this->cache_dir,
- + 'auto_source' => $tpl_file,
- + 'auto_id' => $_auto_id,
- + 'exp_time' => $exp_time);
- + require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
- + return smarty_core_rm_auto($_params, $this);
- + }
- +
- + }
- +
- +
- + /**
- + * clear the entire contents of cache (all templates)
- + *
- + * @param string $exp_time expire time
- + * @return boolean results of {@link smarty_core_rm_auto()}
- + */
- + function clear_all_cache($exp_time = null)
- + {
- + return $this->clear_cache(null, null, null, $exp_time);
- + }
- +
- +
- + /**
- + * test to see if valid cache exists for this template
- + *
- + * @param string $tpl_file name of template file
- + * @param string $cache_id
- + * @param string $compile_id
- + * @return string|false results of {@link _read_cache_file()}
- + */
- + function is_cached($tpl_file, $cache_id = null, $compile_id = null)
- + {
- + if (!$this->caching)
- + return false;
- +
- + if (!isset($compile_id))
- + $compile_id = $this->compile_id;
- +
- + $_params = array(
- + 'tpl_file' => $tpl_file,
- + 'cache_id' => $cache_id,
- + 'compile_id' => $compile_id
- + );
- + require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php');
- + return smarty_core_read_cache_file($_params, $this);
- + }
- +
- +
- + /**
- + * clear all the assigned template variables.
- + *
- + */
- + function clear_all_assign()
- + {
- + $this->_tpl_vars = array();
- + }
- +
- + /**
- + * clears compiled version of specified template resource,
- + * or all compiled template files if one is not specified.
- + * This function is for advanced use only, not normally needed.
- + *
- + * @param string $tpl_file
- + * @param string $compile_id
- + * @param string $exp_time
- + * @return boolean results of {@link smarty_core_rm_auto()}
- + */
- + function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null)
- + {
- + if (!isset($compile_id)) {
- + $compile_id = $this->compile_id;
- + }
- + $_params = array('auto_base' => $this->compile_dir,
- + 'auto_source' => $tpl_file,
- + 'auto_id' => $compile_id,
- + 'exp_time' => $exp_time,
- + 'extensions' => array('.inc', '.php'));
- + require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
- + return smarty_core_rm_auto($_params, $this);
- + }
- +
- + /**
- + * Checks whether requested template exists.
- + *
- + * @param string $tpl_file
- + * @return boolean
- + */
- + function template_exists($tpl_file)
- + {
- + $_params = array('resource_name' => $tpl_file, 'quiet'=>true, 'get_source'=>false);
- + return $this->_fetch_resource_info($_params);
- + }
- +
- + /**
- + * Returns an array containing template variables
- + *
- + * @param string $name
- + * @param string $type
- + * @return array
- + */
- + function &get_template_vars($name=null)
- + {
- + if(!isset($name)) {
- + return $this->_tpl_vars;
- + } elseif(isset($this->_tpl_vars[$name])) {
- + return $this->_tpl_vars[$name];
- + } else {
- + // var non-existant, return valid reference
- + $_tmp = null;
- + return $_tmp;
- + }
- + }
- +
- + /**
- + * Returns an array containing config variables
- + *
- + * @param string $name
- + * @param string $type
- + * @return array
- + */
- + function &get_config_vars($name=null)
- + {
- + if(!isset($name) && is_array($this->_config[0])) {
- + return $this->_config[0]['vars'];
- + } else if(isset($this->_config[0]['vars'][$name])) {
- + return $this->_config[0]['vars'][$name];
- + } else {
- + // var non-existant, return valid reference
- + $_tmp = null;
- + return $_tmp;
- + }
- + }
- +
- + /**
- + * trigger Smarty error
- + *
- + * @param string $error_msg
- + * @param integer $error_type
- + */
- + function trigger_error($error_msg, $error_type = E_USER_WARNING)
- + {
- + trigger_error("Smarty error: $error_msg", $error_type);
- + }
- +
- +
- + /**
- + * executes & displays the template results
- + *
- + * @param string $resource_name
- + * @param string $cache_id
- + * @param string $compile_id
- + */
- + function display($resource_name, $cache_id = null, $compile_id = null)
- + {
- + $this->fetch($resource_name, $cache_id, $compile_id, true);
- + }
- +
- + /**
- + * executes & returns or displays the template results
- + *
- + * @param string $resource_name
- + * @param string $cache_id
- + * @param string $compile_id
- + * @param boolean $display
- + */
- + function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false)
- + {
- + static $_cache_info = array();
- +
- + $_smarty_old_error_level = $this->debugging ? error_reporting() : error_reporting(isset($this->error_reporting)
- + ? $this->error_reporting : error_reporting() & ~E_NOTICE);
- +
- + if (!$this->debugging && $this->debugging_ctrl == 'URL') {
- + $_query_string = $this->request_use_auto_globals ? $_SERVER['QUERY_STRING'] : $GLOBALS['HTTP_SERVER_VARS']['QUERY_STRING'];
- + if (@strstr($_query_string, $this->_smarty_debug_id)) {
- + if (@strstr($_query_string, $this->_smarty_debug_id . '=on')) {
- + // enable debugging for this browser session
- + @setcookie('SMARTY_DEBUG', true);
- + $this->debugging = true;
- + } elseif (@strstr($_query_string, $this->_smarty_debug_id . '=off')) {
- + // disable debugging for this browser session
- + @setcookie('SMARTY_DEBUG', false);
- + $this->debugging = false;
- + } else {
- + // enable debugging for this page
- + $this->debugging = true;
- + }
- + } else {
- + $this->debugging = (bool)($this->request_use_auto_globals ? @$_COOKIE['SMARTY_DEBUG'] : @$GLOBALS['HTTP_COOKIE_VARS']['SMARTY_DEBUG']);
- + }
- + }
- +
- + if ($this->debugging) {
- + // capture time for debugging info
- + $_params = array();
- + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- + $_debug_start_time = smarty_core_get_microtime($_params, $this);
- + $this->_smarty_debug_info[] = array('type' => 'template',
- + 'filename' => $resource_name,
- + 'depth' => 0);
- + $_included_tpls_idx = count($this->_smarty_debug_info) - 1;
- + }
- +
- + if (!isset($compile_id)) {
- + $compile_id = $this->compile_id;
- + }
- +
- + $this->_compile_id = $compile_id;
- + $this->_inclusion_depth = 0;
- +
- + if ($this->caching) {
- + // save old cache_info, initialize cache_info
- + array_push($_cache_info, $this->_cache_info);
- + $this->_cache_info = array();
- + $_params = array(
- + 'tpl_file' => $resource_name,
- + 'cache_id' => $cache_id,
- + 'compile_id' => $compile_id,
- + 'results' => null
- + );
- + require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php');
- + if (smarty_core_read_cache_file($_params, $this)) {
- + $_smarty_results = $_params['results'];
- + if (!empty($this->_cache_info['insert_tags'])) {
- + $_params = array('plugins' => $this->_cache_info['insert_tags']);
- + require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
- + smarty_core_load_plugins($_params, $this);
- + $_params = array('results' => $_smarty_results);
- + require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php');
- + $_smarty_results = smarty_core_process_cached_inserts($_params, $this);
- + }
- + if (!empty($this->_cache_info['cache_serials'])) {
- + $_params = array('results' => $_smarty_results);
- + require_once(SMARTY_CORE_DIR . 'core.process_compiled_include.php');
- + $_smarty_results = smarty_core_process_compiled_include($_params, $this);
- + }
- +
- +
- + if ($display) {
- + if ($this->debugging)
- + {
- + // capture time for debugging info
- + $_params = array();
- + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- + $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $_debug_start_time;
- + require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
- + $_smarty_results .= smarty_core_display_debug_console($_params, $this);
- + }
- + if ($this->cache_modified_check) {
- + $_server_vars = ($this->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
- + $_last_modified_date = @substr($_server_vars['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_server_vars['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3);
- + $_gmt_mtime = gmdate('D, d M Y H:i:s', $this->_cache_info['timestamp']).' GMT';
- + if (@count($this->_cache_info['insert_tags']) == 0
- + && !$this->_cache_serials
- + && $_gmt_mtime == $_last_modified_date) {
- + if (php_sapi_name()=='cgi')
- + header('Status: 304 Not Modified');
- + else
- + header('HTTP/1.1 304 Not Modified');
- +
- + } else {
- + header('Last-Modified: '.$_gmt_mtime);
- + echo $_smarty_results;
- + }
- + } else {
- + echo $_smarty_results;
- + }
- + error_reporting($_smarty_old_error_level);
- + // restore initial cache_info
- + $this->_cache_info = array_pop($_cache_info);
- + return true;
- + } else {
- + error_reporting($_smarty_old_error_level);
- + // restore initial cache_info
- + $this->_cache_info = array_pop($_cache_info);
- + return $_smarty_results;
- + }
- + } else {
- + $this->_cache_info['template'][$resource_name] = true;
- + if ($this->cache_modified_check && $display) {
- + header('Last-Modified: '.gmdate('D, d M Y H:i:s', time()).' GMT');
- + }
- + }
- + }
- +
- + // load filters that are marked as autoload
- + if (count($this->autoload_filters)) {
- + foreach ($this->autoload_filters as $_filter_type => $_filters) {
- + foreach ($_filters as $_filter) {
- + $this->load_filter($_filter_type, $_filter);
- + }
- + }
- + }
- +
- + $_smarty_compile_path = $this->_get_compile_path($resource_name);
- +
- + // if we just need to display the results, don't perform output
- + // buffering - for speed
- + $_cache_including = $this->_cache_including;
- + $this->_cache_including = false;
- + if ($display && !$this->caching && count($this->_plugins['outputfilter']) == 0) {
- + if ($this->_is_compiled($resource_name, $_smarty_compile_path)
- + || $this->_compile_resource($resource_name, $_smarty_compile_path))
- + {
- + include($_smarty_compile_path);
- + }
- + } else {
- + ob_start();
- + if ($this->_is_compiled($resource_name, $_smarty_compile_path)
- + || $this->_compile_resource($resource_name, $_smarty_compile_path))
- + {
- + include($_smarty_compile_path);
- + }
- + $_smarty_results = ob_get_contents();
- + ob_end_clean();
- +
- + foreach ((array)$this->_plugins['outputfilter'] as $_output_filter) {
- + $_smarty_results = call_user_func_array($_output_filter[0], array($_smarty_results, &$this));
- + }
- + }
- +
- + if ($this->caching) {
- + $_params = array('tpl_file' => $resource_name,
- + 'cache_id' => $cache_id,
- + 'compile_id' => $compile_id,
- + 'results' => $_smarty_results);
- + require_once(SMARTY_CORE_DIR . 'core.write_cache_file.php');
- + smarty_core_write_cache_file($_params, $this);
- + require_once(SMARTY_CORE_DIR . 'core.process_cached_inserts.php');
- + $_smarty_results = smarty_core_process_cached_inserts($_params, $this);
- +
- + if ($this->_cache_serials) {
- + // strip nocache-tags from output
- + $_smarty_results = preg_replace('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!s'
- + ,''
- + ,$_smarty_results);
- + }
- + // restore initial cache_info
- + $this->_cache_info = array_pop($_cache_info);
- + }
- + $this->_cache_including = $_cache_including;
- +
- + if ($display) {
- + if (isset($_smarty_results)) { echo $_smarty_results; }
- + if ($this->debugging) {
- + // capture time for debugging info
- + $_params = array();
- + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- + $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = (smarty_core_get_microtime($_params, $this) - $_debug_start_time);
- + require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
- + echo smarty_core_display_debug_console($_params, $this);
- + }
- + error_reporting($_smarty_old_error_level);
- + return;
- + } else {
- + error_reporting($_smarty_old_error_level);
- + if (isset($_smarty_results)) { return $_smarty_results; }
- + }
- + }
- +
- + /**
- + * load configuration values
- + *
- + * @param string $file
- + * @param string $section
- + * @param string $scope
- + */
- + function config_load($file, $section = null, $scope = 'global')
- + {
- + require_once($this->_get_plugin_filepath('function', 'config_load'));
- + smarty_function_config_load(array('file' => $file, 'section' => $section, 'scope' => $scope), $this);
- + }
- +
- + /**
- + * return a reference to a registered object
- + *
- + * @param string $name
- + * @return object
- + */
- + function &get_registered_object($name) {
- + if (!isset($this->_reg_objects[$name]))
- + $this->_trigger_fatal_error("'$name' is not a registered object");
- +
- + if (!is_object($this->_reg_objects[$name][0]))
- + $this->_trigger_fatal_error("registered '$name' is not an object");
- +
- + return $this->_reg_objects[$name][0];
- + }
- +
- + /**
- + * clear configuration values
- + *
- + * @param string $var
- + */
- + function clear_config($var = null)
- + {
- + if(!isset($var)) {
- + // clear all values
- + $this->_config = array(array('vars' => array(),
- + 'files' => array()));
- + } else {
- + unset($this->_config[0]['vars'][$var]);
- + }
- + }
- +
- + /**
- + * get filepath of requested plugin
- + *
- + * @param string $type
- + * @param string $name
- + * @return string|false
- + */
- + function _get_plugin_filepath($type, $name)
- + {
- + $_params = array('type' => $type, 'name' => $name);
- + require_once(SMARTY_CORE_DIR . 'core.assemble_plugin_filepath.php');
- + return smarty_core_assemble_plugin_filepath($_params, $this);
- + }
- +
- + /**
- + * test if resource needs compiling
- + *
- + * @param string $resource_name
- + * @param string $compile_path
- + * @return boolean
- + */
- + function _is_compiled($resource_name, $compile_path)
- + {
- + if (!$this->force_compile && file_exists($compile_path)) {
- + if (!$this->compile_check) {
- + // no need to check compiled file
- + return true;
- + } else {
- + // get file source and timestamp
- + $_params = array('resource_name' => $resource_name, 'get_source'=>false);
- + if (!$this->_fetch_resource_info($_params)) {
- + return false;
- + }
- + if ($_params['resource_timestamp'] <= filemtime($compile_path)) {
- + // template not expired, no recompile
- + return true;
- + } else {
- + // compile template
- + return false;
- + }
- + }
- + } else {
- + // compiled template does not exist, or forced compile
- + return false;
- + }
- + }
- +
- + /**
- + * compile the template
- + *
- + * @param string $resource_name
- + * @param string $compile_path
- + * @return boolean
- + */
- + function _compile_resource($resource_name, $compile_path)
- + {
- +
- + $_params = array('resource_name' => $resource_name);
- + if (!$this->_fetch_resource_info($_params)) {
- + return false;
- + }
- +
- + $_source_content = $_params['source_content'];
- + $_cache_include = substr($compile_path, 0, -4).'.inc';
- +
- + if ($this->_compile_source($resource_name, $_source_content, $_compiled_content, $_cache_include)) {
- + // if a _cache_serial was set, we also have to write an include-file:
- + if ($this->_cache_include_info) {
- + require_once(SMARTY_CORE_DIR . 'core.write_compiled_include.php');
- + smarty_core_write_compiled_include(array_merge($this->_cache_include_info, array('compiled_content'=>$_compiled_content, 'resource_name'=>$resource_name)), $this);
- + }
- +
- + $_params = array('compile_path'=>$compile_path, 'compiled_content' => $_compiled_content);
- + require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php');
- + smarty_core_write_compiled_resource($_params, $this);
- +
- + return true;
- + } else {
- + return false;
- + }
- +
- + }
- +
- + /**
- + * compile the given source
- + *
- + * @param string $resource_name
- + * @param string $source_content
- + * @param string $compiled_content
- + * @return boolean
- + */
- + function _compile_source($resource_name, &$source_content, &$compiled_content, $cache_include_path=null)
- + {
- + if (file_exists(SMARTY_DIR . $this->compiler_file)) {
- + require_once(SMARTY_DIR . $this->compiler_file);
- + } else {
- + // use include_path
- + require_once($this->compiler_file);
- + }
- +
- +
- + $smarty_compiler = new $this->compiler_class;
- +
- + $smarty_compiler->template_dir = $this->template_dir;
- + $smarty_compiler->compile_dir = $this->compile_dir;
- + $smarty_compiler->plugins_dir = $this->plugins_dir;
- + $smarty_compiler->config_dir = $this->config_dir;
- + $smarty_compiler->force_compile = $this->force_compile;
- + $smarty_compiler->caching = $this->caching;
- + $smarty_compiler->php_handling = $this->php_handling;
- + $smarty_compiler->left_delimiter = $this->left_delimiter;
- + $smarty_compiler->right_delimiter = $this->right_delimiter;
- + $smarty_compiler->_version = $this->_version;
- + $smarty_compiler->security = $this->security;
- + $smarty_compiler->secure_dir = $this->secure_dir;
- + $smarty_compiler->security_settings = $this->security_settings;
- + $smarty_compiler->trusted_dir = $this->trusted_dir;
- + $smarty_compiler->use_sub_dirs = $this->use_sub_dirs;
- + $smarty_compiler->_reg_objects = &$this->_reg_objects;
- + $smarty_compiler->_plugins = &$this->_plugins;
- + $smarty_compiler->_tpl_vars = &$this->_tpl_vars;
- + $smarty_compiler->default_modifiers = $this->default_modifiers;
- + $smarty_compiler->compile_id = $this->_compile_id;
- + $smarty_compiler->_config = $this->_config;
- + $smarty_compiler->request_use_auto_globals = $this->request_use_auto_globals;
- +
- + if (isset($cache_include_path) && isset($this->_cache_serials[$cache_include_path])) {
- + $smarty_compiler->_cache_serial = $this->_cache_serials[$cache_include_path];
- + }
- + $smarty_compiler->_cache_include = $cache_include_path;
- +
- +
- + $_results = $smarty_compiler->_compile_file($resource_name, $source_content, $compiled_content);
- +
- + if ($smarty_compiler->_cache_serial) {
- + $this->_cache_include_info = array(
- + 'cache_serial'=>$smarty_compiler->_cache_serial
- + ,'plugins_code'=>$smarty_compiler->_plugins_code
- + ,'include_file_path' => $cache_include_path);
- +
- + } else {
- + $this->_cache_include_info = null;
- +
- + }
- +
- + return $_results;
- + }
- +
- + /**
- + * Get the compile path for this resource
- + *
- + * @param string $resource_name
- + * @return string results of {@link _get_auto_filename()}
- + */
- + function _get_compile_path($resource_name)
- + {
- + return $this->_get_auto_filename($this->compile_dir, $resource_name,
- + $this->_compile_id) . '.php';
- + }
- +
- + /**
- + * fetch the template info. Gets timestamp, and source
- + * if get_source is true
- + *
- + * sets $source_content to the source of the template, and
- + * $resource_timestamp to its time stamp
- + * @param string $resource_name
- + * @param string $source_content
- + * @param integer $resource_timestamp
- + * @param boolean $get_source
- + * @param boolean $quiet
- + * @return boolean
- + */
- +
- + function _fetch_resource_info(&$params)
- + {
- + if(!isset($params['get_source'])) { $params['get_source'] = true; }
- + if(!isset($params['quiet'])) { $params['quiet'] = false; }
- +
- + $_return = false;
- + $_params = array('resource_name' => $params['resource_name']) ;
- + if (isset($params['resource_base_path']))
- + $_params['resource_base_path'] = $params['resource_base_path'];
- + else
- + $_params['resource_base_path'] = $this->template_dir;
- +
- + if ($this->_parse_resource_name($_params)) {
- + $_resource_type = $_params['resource_type'];
- + $_resource_name = $_params['resource_name'];
- + switch ($_resource_type) {
- + case 'file':
- + if ($params['get_source']) {
- + $params['source_content'] = $this->_read_file($_resource_name);
- + }
- + $params['resource_timestamp'] = filemtime($_resource_name);
- + $_return = is_file($_resource_name) && is_readable($_resource_name);
- + break;
- +
- + default:
- + // call resource functions to fetch the template source and timestamp
- + if ($params['get_source']) {
- + $_source_return = isset($this->_plugins['resource'][$_resource_type]) &&
- + call_user_func_array($this->_plugins['resource'][$_resource_type][0][0],
- + array($_resource_name, &$params['source_content'], &$this));
- + } else {
- + $_source_return = true;
- + }
- +
- + $_timestamp_return = isset($this->_plugins['resource'][$_resource_type]) &&
- + call_user_func_array($this->_plugins['resource'][$_resource_type][0][1],
- + array($_resource_name, &$params['resource_timestamp'], &$this));
- +
- + $_return = $_source_return && $_timestamp_return;
- + break;
- + }
- + }
- +
- + if (!$_return) {
- + // see if we can get a template with the default template handler
- + if (!empty($this->default_template_handler_func)) {
- + if (!is_callable($this->default_template_handler_func)) {
- + $this->trigger_error("default template handler function \"$this->default_template_handler_func\" doesn't exist.");
- + } else {
- + $_return = call_user_func_array(
- + $this->default_template_handler_func,
- + array($_params['resource_type'], $_params['resource_name'], &$params['source_content'], &$params['resource_timestamp'], &$this));
- + }
- + }
- + }
- +
- + if (!$_return) {
- + if (!$params['quiet']) {
- + $this->trigger_error('unable to read resource: "' . $params['resource_name'] . '"');
- + }
- + } else if ($_return && $this->security) {
- + require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
- + if (!smarty_core_is_secure($_params, $this)) {
- + if (!$params['quiet'])
- + $this->trigger_error('(secure mode) accessing "' . $params['resource_name'] . '" is not allowed');
- + $params['source_content'] = null;
- + $params['resource_timestamp'] = null;
- + return false;
- + }
- + }
- + return $_return;
- + }
- +
- +
- + /**
- + * parse out the type and name from the resource
- + *
- + * @param string $resource_base_path
- + * @param string $resource_name
- + * @param string $resource_type
- + * @param string $resource_name
- + * @return boolean
- + */
- +
- + function _parse_resource_name(&$params)
- + {
- +
- + // split tpl_path by the first colon
- + $_resource_name_parts = explode(':', $params['resource_name'], 2);
- +
- + if (count($_resource_name_parts) == 1) {
- + // no resource type given
- + $params['resource_type'] = $this->default_resource_type;
- + $params['resource_name'] = $_resource_name_parts[0];
- + } else {
- + if(strlen($_resource_name_parts[0]) == 1) {
- + // 1 char is not resource type, but part of filepath
- + $params['resource_type'] = $this->default_resource_type;
- + $params['resource_name'] = $params['resource_name'];
- + } else {
- + $params['resource_type'] = $_resource_name_parts[0];
- + $params['resource_name'] = $_resource_name_parts[1];
- + }
- + }
- +
- + if ($params['resource_type'] == 'file') {
- + if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $params['resource_name'])) {
- + // relative pathname to $params['resource_base_path']
- + // use the first directory where the file is found
- + foreach ((array)$params['resource_base_path'] as $_curr_path) {
- + $_fullpath = $_curr_path . DIRECTORY_SEPARATOR . $params['resource_name'];
- + if (file_exists($_fullpath) && is_file($_fullpath)) {
- + $params['resource_name'] = $_fullpath;
- + return true;
- + }
- + // didn't find the file, try include_path
- + $_params = array('file_path' => $_fullpath);
- + require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
- + if(smarty_core_get_include_path($_params, $this)) {
- + $params['resource_name'] = $_params['new_file_path'];
- + return true;
- + }
- + }
- + return false;
- + } else {
- + /* absolute path */
- + return file_exists($params['resource_name']);
- + }
- + } elseif (empty($this->_plugins['resource'][$params['resource_type']])) {
- + $_params = array('type' => $params['resource_type']);
- + require_once(SMARTY_CORE_DIR . 'core.load_resource_plugin.php');
- + smarty_core_load_resource_plugin($_params, $this);
- + }
- +
- + return true;
- + }
- +
- +
- + /**
- + * Handle modifiers
- + *
- + * @param string|null $modifier_name
- + * @param array|null $map_array
- + * @return string result of modifiers
- + */
- + function _run_mod_handler()
- + {
- + $_args = func_get_args();
- + list($_modifier_name, $_map_array) = array_splice($_args, 0, 2);
- + list($_func_name, $_tpl_file, $_tpl_line) =
- + $this->_plugins['modifier'][$_modifier_name];
- +
- + $_var = $_args[0];
- + foreach ($_var as $_key => $_val) {
- + $_args[0] = $_val;
- + $_var[$_key] = call_user_func_array($_func_name, $_args);
- + }
- + return $_var;
- + }
- +
- + /**
- + * Remove starting and ending quotes from the string
- + *
- + * @param string $string
- + * @return string
- + */
- + function _dequote($string)
- + {
- + if ((substr($string, 0, 1) == "'" || substr($string, 0, 1) == '"') &&
- + substr($string, -1) == substr($string, 0, 1))
- + return substr($string, 1, -1);
- + else
- + return $string;
- + }
- +
- +
- + /**
- + * read in a file
- + *
- + * @param string $filename
- + * @return string
- + */
- + function _read_file($filename)
- + {
- + if ( file_exists($filename) && is_readable($filename) && ($fd = @fopen($filename, 'rb')) ) {
- + $contents = '';
- + while (!feof($fd)) {
- + $contents .= fread($fd, 8192);
- + }
- + fclose($fd);
- + return $contents;
- + } else {
- + return false;
- + }
- + }
- +
- + /**
- + * get a concrete filename for automagically created content
- + *
- + * @param string $auto_base
- + * @param string $auto_source
- + * @param string $auto_id
- + * @return string
- + * @staticvar string|null
- + * @staticvar string|null
- + */
- + function _get_auto_filename($auto_base, $auto_source = null, $auto_id = null)
- + {
- + $_compile_dir_sep = $this->use_sub_dirs ? DIRECTORY_SEPARATOR : '^';
- + $_return = $auto_base . DIRECTORY_SEPARATOR;
- +
- + if(isset($auto_id)) {
- + // make auto_id safe for directory names
- + $auto_id = str_replace('%7C',$_compile_dir_sep,(urlencode($auto_id)));
- + // split into separate directories
- + $_return .= $auto_id . $_compile_dir_sep;
- + }
- +
- + if(isset($auto_source)) {
- + // make source name safe for filename
- + $_filename = urlencode(basename($auto_source));
- + $_crc32 = sprintf('%08X', crc32($auto_source));
- + // prepend %% to avoid name conflicts with
- + // with $params['auto_id'] names
- + $_crc32 = substr($_crc32, 0, 2) . $_compile_dir_sep .
- + substr($_crc32, 0, 3) . $_compile_dir_sep . $_crc32;
- + $_return .= '%%' . $_crc32 . '%%' . $_filename;
- + }
- +
- + return $_return;
- + }
- +
- + /**
- + * unlink a file, possibly using expiration time
- + *
- + * @param string $resource
- + * @param integer $exp_time
- + */
- + function _unlink($resource, $exp_time = null)
- + {
- + if(isset($exp_time)) {
- + if(time() - @filemtime($resource) >= $exp_time) {
- + return @unlink($resource);
- + }
- + } else {
- + return @unlink($resource);
- + }
- + }
- +
- + /**
- + * returns an auto_id for auto-file-functions
- + *
- + * @param string $cache_id
- + * @param string $compile_id
- + * @return string|null
- + */
- + function _get_auto_id($cache_id=null, $compile_id=null) {
- + if (isset($cache_id))
- + return (isset($compile_id)) ? $cache_id . '|' . $compile_id : $cache_id;
- + elseif(isset($compile_id))
- + return $compile_id;
- + else
- + return null;
- + }
- +
- + /**
- + * trigger Smarty plugin error
- + *
- + * @param string $error_msg
- + * @param string $tpl_file
- + * @param integer $tpl_line
- + * @param string $file
- + * @param integer $line
- + * @param integer $error_type
- + */
- + function _trigger_fatal_error($error_msg, $tpl_file = null, $tpl_line = null,
- + $file = null, $line = null, $error_type = E_USER_ERROR)
- + {
- + if(isset($file) && isset($line)) {
- + $info = ' ('.basename($file).", line $line)";
- + } else {
- + $info = '';
- + }
- + if (isset($tpl_line) && isset($tpl_file)) {
- + $this->trigger_error('[in ' . $tpl_file . ' line ' . $tpl_line . "]: $error_msg$info", $error_type);
- + } else {
- + $this->trigger_error($error_msg . $info, $error_type);
- + }
- + }
- +
- +
- + /**
- + * callback function for preg_replace, to call a non-cacheable block
- + * @return string
- + */
- + function _process_compiled_include_callback($match) {
- + $_func = '_smarty_tplfunc_'.$match[2].'_'.$match[3];
- + ob_start();
- + $_func($this);
- + $_ret = ob_get_contents();
- + ob_end_clean();
- + return $_ret;
- + }
- +
- +
- + /**
- + * called for included templates
- + *
- + * @param string $_smarty_include_tpl_file
- + * @param string $_smarty_include_vars
- + */
- +
- + // $_smarty_include_tpl_file, $_smarty_include_vars
- +
- + function _smarty_include($params)
- + {
- + if ($this->debugging) {
- + $_params = array();
- + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- + $debug_start_time = smarty_core_get_microtime($_params, $this);
- + $this->_smarty_debug_info[] = array('type' => 'template',
- + 'filename' => $params['smarty_include_tpl_file'],
- + 'depth' => ++$this->_inclusion_depth);
- + $included_tpls_idx = count($this->_smarty_debug_info) - 1;
- + }
- +
- + $this->_tpl_vars = array_merge($this->_tpl_vars, $params['smarty_include_vars']);
- +
- + // config vars are treated as local, so push a copy of the
- + // current ones onto the front of the stack
- + array_unshift($this->_config, $this->_config[0]);
- +
- + $_smarty_compile_path = $this->_get_compile_path($params['smarty_include_tpl_file']);
- +
- +
- + if ($this->_is_compiled($params['smarty_include_tpl_file'], $_smarty_compile_path)
- + || $this->_compile_resource($params['smarty_include_tpl_file'], $_smarty_compile_path))
- + {
- + include($_smarty_compile_path);
- + }
- +
- + // pop the local vars off the front of the stack
- + array_shift($this->_config);
- +
- + $this->_inclusion_depth--;
- +
- + if ($this->debugging) {
- + // capture time for debugging info
- + $_params = array();
- + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- + $this->_smarty_debug_info[$included_tpls_idx]['exec_time'] = smarty_core_get_microtime($_params, $this) - $debug_start_time;
- + }
- +
- + if ($this->caching) {
- + $this->_cache_info['template'][$params['smarty_include_tpl_file']] = true;
- + }
- + }
- +
- +
- + /**
- + * get or set an array of cached attributes for function that is
- + * not cacheable
- + * @return array
- + */
- + function &_smarty_cache_attrs($cache_serial, $count) {
- + $_cache_attrs =& $this->_cache_info['cache_attrs'][$cache_serial][$count];
- +
- + if ($this->_cache_including) {
- + /* return next set of cache_attrs */
- + $_return = current($_cache_attrs);
- + next($_cache_attrs);
- + return $_return;
- +
- + } else {
- + /* add a reference to a new set of cache_attrs */
- + $_cache_attrs[] = array();
- + return $_cache_attrs[count($_cache_attrs)-1];
- +
- + }
- +
- + }
- +
- +
- + /**
- + * wrapper for include() retaining $this
- + * @return mixed
- + */
- + function _include($filename, $once=false, $params=null)
- + {
- + if ($once) {
- + return include_once($filename);
- + } else {
- + return include($filename);
- + }
- + }
- +
- +
- + /**
- + * wrapper for eval() retaining $this
- + * @return mixed
- + */
- + function _eval($code, $params=null)
- + {
- + return eval($code);
- + }
- +
- + /**
- + * Extracts the filter name from the given callback
- + *
- + * @param callback $function
- + * @return string
- + */
- + function _get_filter_name($function)
- + {
- + if (is_array($function)) {
- + $_class_name = (is_object($function[0]) ?
- + get_class($function[0]) : $function[0]);
- + return $_class_name . '_' . $function[1];
- + }
- + else {
- + return $function;
- + }
- + }
- +
- + /**#@-*/
- +
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/Smarty_Compiler.class.php b/library/smarty/Smarty_Compiler.class.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/Smarty_Compiler.class.php
- @@ -0,0 +1,2365 @@
- +<?php
- +
- +/**
- + * Project: Smarty: the PHP compiling template engine
- + * File: Smarty_Compiler.class.php
- + *
- + * 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
- + *
- + * @link http://smarty.php.net/
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @author Andrei Zmievski <andrei@php.net>
- + * @version 2.6.26
- + * @copyright 2001-2005 New Digital Group, Inc.
- + * @package Smarty
- + */
- +
- +/* $Id: Smarty_Compiler.class.php 3163 2009-06-17 14:39:24Z monte.ohrt $ */
- +
- +/**
- + * Template compiling class
- + * @package Smarty
- + */
- +class Smarty_Compiler extends Smarty {
- +
- + // internal vars
- + /**#@+
- + * @access private
- + */
- + var $_folded_blocks = array(); // keeps folded template blocks
- + 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 $_init_smarty_vars = false;
- + var $_permitted_tokens = array('true','false','yes','no','on','off','null');
- + var $_db_qstr_regexp = null; // regexps are setup in the constructor
- + var $_si_qstr_regexp = null;
- + var $_qstr_regexp = null;
- + var $_func_regexp = null;
- + var $_reg_obj_regexp = null;
- + var $_var_bracket_regexp = null;
- + var $_num_const_regexp = null;
- + var $_dvar_guts_regexp = null;
- + var $_dvar_regexp = null;
- + var $_cvar_regexp = null;
- + var $_svar_regexp = null;
- + var $_avar_regexp = null;
- + var $_mod_regexp = null;
- + var $_var_regexp = null;
- + var $_parenth_param_regexp = null;
- + var $_func_call_regexp = null;
- + var $_obj_ext_regexp = null;
- + var $_obj_start_regexp = null;
- + var $_obj_params_regexp = null;
- + var $_obj_call_regexp = null;
- + var $_cacheable_state = 0;
- + var $_cache_attrs_count = 0;
- + var $_nocache_count = 0;
- + var $_cache_serial = null;
- + var $_cache_include = null;
- +
- + var $_strip_depth = 0;
- + var $_additional_newline = "\n";
- +
- + /**#@-*/
- + /**
- + * The class constructor.
- + */
- + function Smarty_Compiler()
- + {
- + // matches double quoted strings:
- + // "foobar"
- + // "foo\"bar"
- + $this->_db_qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"';
- +
- + // matches single quoted strings:
- + // 'foobar'
- + // 'foo\'bar'
- + $this->_si_qstr_regexp = '\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'';
- +
- + // matches single or double quoted strings
- + $this->_qstr_regexp = '(?:' . $this->_db_qstr_regexp . '|' . $this->_si_qstr_regexp . ')';
- +
- + // matches bracket portion of vars
- + // [0]
- + // [foo]
- + // [$bar]
- + $this->_var_bracket_regexp = '\[\$?[\w\.]+\]';
- +
- + // matches numerical constants
- + // 30
- + // -12
- + // 13.22
- + $this->_num_const_regexp = '(?:\-?\d+(?:\.\d+)?)';
- +
- + // matches $ vars (not objects):
- + // $foo
- + // $foo.bar
- + // $foo.bar.foobar
- + // $foo[0]
- + // $foo[$bar]
- + // $foo[5][blah]
- + // $foo[5].bar[$foobar][4]
- + $this->_dvar_math_regexp = '(?:[\+\*\/\%]|(?:-(?!>)))';
- + $this->_dvar_math_var_regexp = '[\$\w\.\+\-\*\/\%\d\>\[\]]';
- + $this->_dvar_guts_regexp = '\w+(?:' . $this->_var_bracket_regexp
- + . ')*(?:\.\$?\w+(?:' . $this->_var_bracket_regexp . ')*)*(?:' . $this->_dvar_math_regexp . '(?:' . $this->_num_const_regexp . '|' . $this->_dvar_math_var_regexp . ')*)?';
- + $this->_dvar_regexp = '\$' . $this->_dvar_guts_regexp;
- +
- + // matches config vars:
- + // #foo#
- + // #foobar123_foo#
- + $this->_cvar_regexp = '\#\w+\#';
- +
- + // matches section vars:
- + // %foo.bar%
- + $this->_svar_regexp = '\%\w+\.\w+\%';
- +
- + // matches all valid variables (no quotes, no modifiers)
- + $this->_avar_regexp = '(?:' . $this->_dvar_regexp . '|'
- + . $this->_cvar_regexp . '|' . $this->_svar_regexp . ')';
- +
- + // matches valid variable syntax:
- + // $foo
- + // $foo
- + // #foo#
- + // #foo#
- + // "text"
- + // "text"
- + $this->_var_regexp = '(?:' . $this->_avar_regexp . '|' . $this->_qstr_regexp . ')';
- +
- + // matches valid object call (one level of object nesting allowed in parameters):
- + // $foo->bar
- + // $foo->bar()
- + // $foo->bar("text")
- + // $foo->bar($foo, $bar, "text")
- + // $foo->bar($foo, "foo")
- + // $foo->bar->foo()
- + // $foo->bar->foo->bar()
- + // $foo->bar($foo->bar)
- + // $foo->bar($foo->bar())
- + // $foo->bar($foo->bar($blah,$foo,44,"foo",$foo[0].bar))
- + $this->_obj_ext_regexp = '\->(?:\$?' . $this->_dvar_guts_regexp . ')';
- + $this->_obj_restricted_param_regexp = '(?:'
- + . '(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . ')(?:' . $this->_obj_ext_regexp . '(?:\((?:(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . ')'
- + . '(?:\s*,\s*(?:' . $this->_var_regexp . '|' . $this->_num_const_regexp . '))*)?\))?)*)';
- + $this->_obj_single_param_regexp = '(?:\w+|' . $this->_obj_restricted_param_regexp . '(?:\s*,\s*(?:(?:\w+|'
- + . $this->_var_regexp . $this->_obj_restricted_param_regexp . ')))*)';
- + $this->_obj_params_regexp = '\((?:' . $this->_obj_single_param_regexp
- + . '(?:\s*,\s*' . $this->_obj_single_param_regexp . ')*)?\)';
- + $this->_obj_start_regexp = '(?:' . $this->_dvar_regexp . '(?:' . $this->_obj_ext_regexp . ')+)';
- + $this->_obj_call_regexp = '(?:' . $this->_obj_start_regexp . '(?:' . $this->_obj_params_regexp . ')?(?:' . $this->_dvar_math_regexp . '(?:' . $this->_num_const_regexp . '|' . $this->_dvar_math_var_regexp . ')*)?)';
- +
- + // matches valid modifier syntax:
- + // |foo
- + // |@foo
- + // |foo:"bar"
- + // |foo:$bar
- + // |foo:"bar":$foobar
- + // |foo|bar
- + // |foo:$foo->bar
- + $this->_mod_regexp = '(?:\|@?\w+(?::(?:\w+|' . $this->_num_const_regexp . '|'
- + . $this->_obj_call_regexp . '|' . $this->_avar_regexp . '|' . $this->_qstr_regexp .'))*)';
- +
- + // matches valid function name:
- + // foo123
- + // _foo_bar
- + $this->_func_regexp = '[a-zA-Z_]\w*';
- +
- + // matches valid registered object:
- + // foo->bar
- + $this->_reg_obj_regexp = '[a-zA-Z_]\w*->[a-zA-Z_]\w*';
- +
- + // matches valid parameter values:
- + // true
- + // $foo
- + // $foo|bar
- + // #foo#
- + // #foo#|bar
- + // "text"
- + // "text"|bar
- + // $foo->bar
- + $this->_param_regexp = '(?:\s*(?:' . $this->_obj_call_regexp . '|'
- + . $this->_var_regexp . '|' . $this->_num_const_regexp . '|\w+)(?>' . $this->_mod_regexp . '*)\s*)';
- +
- + // matches valid parenthesised function parameters:
- + //
- + // "text"
- + // $foo, $bar, "text"
- + // $foo|bar, "foo"|bar, $foo->bar($foo)|bar
- + $this->_parenth_param_regexp = '(?:\((?:\w+|'
- + . $this->_param_regexp . '(?:\s*,\s*(?:(?:\w+|'
- + . $this->_param_regexp . ')))*)?\))';
- +
- + // matches valid function call:
- + // foo()
- + // foo_bar($foo)
- + // _foo_bar($foo,"bar")
- + // foo123($foo,$foo->bar(),"foo")
- + $this->_func_call_regexp = '(?:' . $this->_func_regexp . '\s*(?:'
- + . $this->_parenth_param_regexp . '))';
- + }
- +
- + /**
- + * compile a resource
- + *
- + * sets $compiled_content to the compiled source
- + * @param string $resource_name
- + * @param string $source_content
- + * @param string $compiled_content
- + * @return true
- + */
- + function _compile_file($resource_name, $source_content, &$compiled_content)
- + {
- +
- + if ($this->security) {
- + // do not allow php syntax to be executed unless specified
- + if ($this->php_handling == SMARTY_PHP_ALLOW &&
- + !$this->security_settings['PHP_HANDLING']) {
- + $this->php_handling = SMARTY_PHP_PASSTHRU;
- + }
- + }
- +
- + $this->_load_filters();
- +
- + $this->_current_file = $resource_name;
- + $this->_current_line_no = 1;
- + $ldq = preg_quote($this->left_delimiter, '~');
- + $rdq = preg_quote($this->right_delimiter, '~');
- +
- + // run template source through prefilter functions
- + if (count($this->_plugins['prefilter']) > 0) {
- + foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) {
- + if ($prefilter === false) continue;
- + if ($prefilter[3] || is_callable($prefilter[0])) {
- + $source_content = call_user_func_array($prefilter[0],
- + array($source_content, &$this));
- + $this->_plugins['prefilter'][$filter_name][3] = true;
- + } else {
- + $this->_trigger_fatal_error("[plugin] prefilter '$filter_name' is not implemented");
- + }
- + }
- + }
- +
- + /* fetch all special blocks */
- + $search = "~{$ldq}\*(.*?)\*{$rdq}|{$ldq}\s*literal\s*{$rdq}(.*?){$ldq}\s*/literal\s*{$rdq}|{$ldq}\s*php\s*{$rdq}(.*?){$ldq}\s*/php\s*{$rdq}~s";
- +
- + preg_match_all($search, $source_content, $match, PREG_SET_ORDER);
- + $this->_folded_blocks = $match;
- + reset($this->_folded_blocks);
- +
- + /* replace special blocks by "{php}" */
- + $source_content = preg_replace($search.'e', "'"
- + . $this->_quote_replace($this->left_delimiter) . 'php'
- + . "' . str_repeat(\"\n\", substr_count('\\0', \"\n\")) .'"
- + . $this->_quote_replace($this->right_delimiter)
- + . "'"
- + , $source_content);
- +
- + /* Gather all template tags. */
- + preg_match_all("~{$ldq}\s*(.*?)\s*{$rdq}~s", $source_content, $_match);
- + $template_tags = $_match[1];
- + /* Split content by template tags to obtain non-template content. */
- + $text_blocks = preg_split("~{$ldq}.*?{$rdq}~s", $source_content);
- +
- + /* loop through text blocks */
- + for ($curr_tb = 0, $for_max = count($text_blocks); $curr_tb < $for_max; $curr_tb++) {
- + /* match anything resembling php tags */
- + if (preg_match_all('~(<\?(?:\w+|=)?|\?>|language\s*=\s*[\"\']?\s*php\s*[\"\']?)~is', $text_blocks[$curr_tb], $sp_match)) {
- + /* replace tags with placeholders to prevent recursive replacements */
- + $sp_match[1] = array_unique($sp_match[1]);
- + usort($sp_match[1], '_smarty_sort_length');
- + for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++) {
- + $text_blocks[$curr_tb] = str_replace($sp_match[1][$curr_sp],'%%%SMARTYSP'.$curr_sp.'%%%',$text_blocks[$curr_tb]);
- + }
- + /* process each one */
- + for ($curr_sp = 0, $for_max2 = count($sp_match[1]); $curr_sp < $for_max2; $curr_sp++) {
- + if ($this->php_handling == SMARTY_PHP_PASSTHRU) {
- + /* echo php contents */
- + $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', '<?php echo \''.str_replace("'", "\'", $sp_match[1][$curr_sp]).'\'; ?>'."\n", $text_blocks[$curr_tb]);
- + } else if ($this->php_handling == SMARTY_PHP_QUOTE) {
- + /* quote php tags */
- + $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', htmlspecialchars($sp_match[1][$curr_sp]), $text_blocks[$curr_tb]);
- + } else if ($this->php_handling == SMARTY_PHP_REMOVE) {
- + /* remove php tags */
- + $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', '', $text_blocks[$curr_tb]);
- + } else {
- + /* SMARTY_PHP_ALLOW, but echo non php starting tags */
- + $sp_match[1][$curr_sp] = preg_replace('~(<\?(?!php|=|$))~i', '<?php echo \'\\'?>'."\n", $sp_match[1][$curr_sp]);
- + $text_blocks[$curr_tb] = str_replace('%%%SMARTYSP'.$curr_sp.'%%%', $sp_match[1][$curr_sp], $text_blocks[$curr_tb]);
- + }
- + }
- + }
- + }
- +
- + /* Compile the template tags into PHP code. */
- + $compiled_tags = array();
- + for ($i = 0, $for_max = count($template_tags); $i < $for_max; $i++) {
- + $this->_current_line_no += substr_count($text_blocks[$i], "\n");
- + $compiled_tags[] = $this->_compile_tag($template_tags[$i]);
- + $this->_current_line_no += substr_count($template_tags[$i], "\n");
- + }
- + if (count($this->_tag_stack)>0) {
- + list($_open_tag, $_line_no) = end($this->_tag_stack);
- + $this->_syntax_error("unclosed tag \{$_open_tag} (opened line $_line_no).", E_USER_ERROR, __FILE__, __LINE__);
- + return;
- + }
- +
- + /* Reformat $text_blocks between 'strip' and '/strip' tags,
- + removing spaces, tabs and newlines. */
- + $strip = false;
- + for ($i = 0, $for_max = count($compiled_tags); $i < $for_max; $i++) {
- + if ($compiled_tags[$i] == '{strip}') {
- + $compiled_tags[$i] = '';
- + $strip = true;
- + /* remove leading whitespaces */
- + $text_blocks[$i + 1] = ltrim($text_blocks[$i + 1]);
- + }
- + if ($strip) {
- + /* strip all $text_blocks before the next '/strip' */
- + for ($j = $i + 1; $j < $for_max; $j++) {
- + /* remove leading and trailing whitespaces of each line */
- + $text_blocks[$j] = preg_replace('![\t ]*[\r\n]+[\t ]*!', '', $text_blocks[$j]);
- + if ($compiled_tags[$j] == '{/strip}') {
- + /* remove trailing whitespaces from the last text_block */
- + $text_blocks[$j] = rtrim($text_blocks[$j]);
- + }
- + $text_blocks[$j] = "<?php echo '" . strtr($text_blocks[$j], array("'"=>"\'", "\\"=>"\\\\")) . "'; ?>";
- + if ($compiled_tags[$j] == '{/strip}') {
- + $compiled_tags[$j] = "\n"; /* slurped by php, but necessary
- + if a newline is following the closing strip-tag */
- + $strip = false;
- + $i = $j;
- + break;
- + }
- + }
- + }
- + }
- + $compiled_content = '';
- +
- + $tag_guard = '%%%SMARTYOTG' . md5(uniqid(rand(), true)) . '%%%';
- +
- + /* Interleave the compiled contents and text blocks to get the final result. */
- + for ($i = 0, $for_max = count($compiled_tags); $i < $for_max; $i++) {
- + if ($compiled_tags[$i] == '') {
- + // tag result empty, remove first newline from following text block
- + $text_blocks[$i+1] = preg_replace('~^(\r\n|\r|\n)~', '', $text_blocks[$i+1]);
- + }
- + // replace legit PHP tags with placeholder
- + $text_blocks[$i] = str_replace('<?', $tag_guard, $text_blocks[$i]);
- + $compiled_tags[$i] = str_replace('<?', $tag_guard, $compiled_tags[$i]);
- +
- + $compiled_content .= $text_blocks[$i] . $compiled_tags[$i];
- + }
- + $compiled_content .= str_replace('<?', $tag_guard, $text_blocks[$i]);
- +
- + // escape php tags created by interleaving
- + $compiled_content = str_replace('<?', "<?php echo '<?' ?>\n", $compiled_content);
- + $compiled_content = preg_replace("~(?<!')language\s*=\s*[\"\']?\s*php\s*[\"\']?~", "<?php echo 'language=php' ?>\n", $compiled_content);
- +
- + // recover legit tags
- + $compiled_content = str_replace($tag_guard, '<?', $compiled_content);
- +
- + // remove \n from the end of the file, if any
- + if (strlen($compiled_content) && (substr($compiled_content, -1) == "\n") ) {
- + $compiled_content = substr($compiled_content, 0, -1);
- + }
- +
- + if (!empty($this->_cache_serial)) {
- + $compiled_content = "<?php \$this->_cache_serials['".$this->_cache_include."'] = '".$this->_cache_serial."'; ?>" . $compiled_content;
- + }
- +
- + // run compiled template through postfilter functions
- + if (count($this->_plugins['postfilter']) > 0) {
- + foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) {
- + if ($postfilter === false) continue;
- + if ($postfilter[3] || is_callable($postfilter[0])) {
- + $compiled_content = call_user_func_array($postfilter[0],
- + array($compiled_content, &$this));
- + $this->_plugins['postfilter'][$filter_name][3] = true;
- + } else {
- + $this->_trigger_fatal_error("Smarty plugin error: postfilter '$filter_name' is not implemented");
- + }
- + }
- + }
- +
- + // put header at the top of the compiled template
- + $template_header = "<?php /* Smarty version ".$this->_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n";
- + $template_header .= " compiled from ".strtr(urlencode($resource_name), array('%2F'=>'/', '%3A'=>':'))." */ ?>\n";
- +
- + /* Emit code to load needed plugins. */
- + $this->_plugins_code = '';
- + if (count($this->_plugin_info)) {
- + $_plugins_params = "array('plugins' => array(";
- + foreach ($this->_plugin_info as $plugin_type => $plugins) {
- + foreach ($plugins as $plugin_name => $plugin_info) {
- + $_plugins_params .= "array('$plugin_type', '$plugin_name', '" . strtr($plugin_info[0], array("'" => "\\'", "\\" => "\\\\")) . "', $plugin_info[1], ";
- + $_plugins_params .= $plugin_info[2] ? 'true),' : 'false),';
- + }
- + }
- + $_plugins_params .= '))';
- + $plugins_code = "<?php require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');\nsmarty_core_load_plugins($_plugins_params, \$this); ?>\n";
- + $template_header .= $plugins_code;
- + $this->_plugin_info = array();
- + $this->_plugins_code = $plugins_code;
- + }
- +
- + if ($this->_init_smarty_vars) {
- + $template_header .= "<?php require_once(SMARTY_CORE_DIR . 'core.assign_smarty_interface.php');\nsmarty_core_assign_smarty_interface(null, \$this); ?>\n";
- + $this->_init_smarty_vars = false;
- + }
- +
- + $compiled_content = $template_header . $compiled_content;
- + return true;
- + }
- +
- + /**
- + * Compile a template tag
- + *
- + * @param string $template_tag
- + * @return string
- + */
- + function _compile_tag($template_tag)
- + {
- + /* Matched comment. */
- + if (substr($template_tag, 0, 1) == '*' && substr($template_tag, -1) == '*')
- + return '';
- +
- + /* Split tag into two three parts: command, command modifiers and the arguments. */
- + if(! preg_match('~^(?:(' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp
- + . '|\/?' . $this->_reg_obj_regexp . '|\/?' . $this->_func_regexp . ')(' . $this->_mod_regexp . '*))
- + (?:\s+(.*))?$
- + ~xs', $template_tag, $match)) {
- + $this->_syntax_error("unrecognized tag: $template_tag", E_USER_ERROR, __FILE__, __LINE__);
- + }
- +
- + $tag_command = $match[1];
- + $tag_modifier = isset($match[2]) ? $match[2] : null;
- + $tag_args = isset($match[3]) ? $match[3] : null;
- +
- + if (preg_match('~^' . $this->_num_const_regexp . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '$~', $tag_command)) {
- + /* tag name is a variable or object */
- + $_return = $this->_parse_var_props($tag_command . $tag_modifier);
- + return "<?php echo $_return; ?>" . $this->_additional_newline;
- + }
- +
- + /* If the tag name is a registered object, we process it. */
- + if (preg_match('~^\/?' . $this->_reg_obj_regexp . '$~', $tag_command)) {
- + return $this->_compile_registered_object_tag($tag_command, $this->_parse_attrs($tag_args), $tag_modifier);
- + }
- +
- + switch ($tag_command) {
- + case 'include':
- + return $this->_compile_include_tag($tag_args);
- +
- + case 'include_php':
- + return $this->_compile_include_php_tag($tag_args);
- +
- + case 'if':
- + $this->_push_tag('if');
- + return $this->_compile_if_tag($tag_args);
- +
- + case 'else':
- + list($_open_tag) = end($this->_tag_stack);
- + if ($_open_tag != 'if' && $_open_tag != 'elseif')
- + $this->_syntax_error('unexpected {else}', E_USER_ERROR, __FILE__, __LINE__);
- + else
- + $this->_push_tag('else');
- + return '<?php else: ?>';
- +
- + case 'elseif':
- + list($_open_tag) = end($this->_tag_stack);
- + if ($_open_tag != 'if' && $_open_tag != 'elseif')
- + $this->_syntax_error('unexpected {elseif}', E_USER_ERROR, __FILE__, __LINE__);
- + if ($_open_tag == 'if')
- + $this->_push_tag('elseif');
- + return $this->_compile_if_tag($tag_args, true);
- +
- + case '/if':
- + $this->_pop_tag('if');
- + return '<?php endif; ?>';
- +
- + case 'capture':
- + return $this->_compile_capture_tag(true, $tag_args);
- +
- + case '/capture':
- + return $this->_compile_capture_tag(false);
- +
- + case 'ldelim':
- + return $this->left_delimiter;
- +
- + case 'rdelim':
- + return $this->right_delimiter;
- +
- + case 'section':
- + $this->_push_tag('section');
- + return $this->_compile_section_start($tag_args);
- +
- + case 'sectionelse':
- + $this->_push_tag('sectionelse');
- + return "<?php endfor; else: ?>";
- + break;
- +
- + case '/section':
- + $_open_tag = $this->_pop_tag('section');
- + if ($_open_tag == 'sectionelse')
- + return "<?php endif; ?>";
- + else
- + return "<?php endfor; endif; ?>";
- +
- + case 'foreach':
- + $this->_push_tag('foreach');
- + return $this->_compile_foreach_start($tag_args);
- + break;
- +
- + case 'foreachelse':
- + $this->_push_tag('foreachelse');
- + return "<?php endforeach; else: ?>";
- +
- + case '/foreach':
- + $_open_tag = $this->_pop_tag('foreach');
- + if ($_open_tag == 'foreachelse')
- + return "<?php endif; unset(\$_from); ?>";
- + else
- + return "<?php endforeach; endif; unset(\$_from); ?>";
- + break;
- +
- + case 'strip':
- + case '/strip':
- + if (substr($tag_command, 0, 1)=='/') {
- + $this->_pop_tag('strip');
- + if (--$this->_strip_depth==0) { /* outermost closing {/strip} */
- + $this->_additional_newline = "\n";
- + return '{' . $tag_command . '}';
- + }
- + } else {
- + $this->_push_tag('strip');
- + if ($this->_strip_depth++==0) { /* outermost opening {strip} */
- + $this->_additional_newline = "";
- + return '{' . $tag_command . '}';
- + }
- + }
- + return '';
- +
- + case 'php':
- + /* handle folded tags replaced by {php} */
- + list(, $block) = each($this->_folded_blocks);
- + $this->_current_line_no += substr_count($block[0], "\n");
- + /* the number of matched elements in the regexp in _compile_file()
- + determins the type of folded tag that was found */
- + switch (count($block)) {
- + case 2: /* comment */
- + return '';
- +
- + case 3: /* literal */
- + return "<?php echo '" . strtr($block[2], array("'"=>"\'", "\\"=>"\\\\")) . "'; ?>" . $this->_additional_newline;
- +
- + case 4: /* php */
- + if ($this->security && !$this->security_settings['PHP_TAGS']) {
- + $this->_syntax_error("(secure mode) php tags not permitted", E_USER_WARNING, __FILE__, __LINE__);
- + return;
- + }
- + return '<?php ' . $block[3] .' ?>';
- + }
- + break;
- +
- + case 'insert':
- + return $this->_compile_insert_tag($tag_args);
- +
- + default:
- + if ($this->_compile_compiler_tag($tag_command, $tag_args, $output)) {
- + return $output;
- + } else if ($this->_compile_block_tag($tag_command, $tag_args, $tag_modifier, $output)) {
- + return $output;
- + } else if ($this->_compile_custom_tag($tag_command, $tag_args, $tag_modifier, $output)) {
- + return $output;
- + } else {
- + $this->_syntax_error("unrecognized tag '$tag_command'", E_USER_ERROR, __FILE__, __LINE__);
- + }
- +
- + }
- + }
- +
- +
- + /**
- + * compile the custom compiler tag
- + *
- + * sets $output to the compiled custom compiler tag
- + * @param string $tag_command
- + * @param string $tag_args
- + * @param string $output
- + * @return boolean
- + */
- + function _compile_compiler_tag($tag_command, $tag_args, &$output)
- + {
- + $found = false;
- + $have_function = true;
- +
- + /*
- + * 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 (!is_callable($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 ($plugin_file = $this->_get_plugin_filepath('compiler', $tag_command)) {
- + $found = true;
- +
- + include_once $plugin_file;
- +
- + $plugin_func = 'smarty_compiler_' . $tag_command;
- + if (!is_callable($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, null, true);
- + }
- + }
- +
- + /*
- + * 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 = call_user_func_array($plugin_func, array($tag_args, &$this));
- + if($output != '') {
- + $output = '<?php ' . $this->_push_cacheable_state('compiler', $tag_command)
- + . $output
- + . $this->_pop_cacheable_state('compiler', $tag_command) . ' ?>';
- + }
- + } else {
- + $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
- + }
- + return true;
- + } else {
- + return false;
- + }
- + }
- +
- +
- + /**
- + * compile block function tag
- + *
- + * sets $output to compiled block function tag
- + * @param string $tag_command
- + * @param string $tag_args
- + * @param string $tag_modifier
- + * @param string $output
- + * @return boolean
- + */
- + function _compile_block_tag($tag_command, $tag_args, $tag_modifier, &$output)
- + {
- + if (substr($tag_command, 0, 1) == '/') {
- + $start_tag = false;
- + $tag_command = substr($tag_command, 1);
- + } else
- + $start_tag = true;
- +
- + $found = false;
- + $have_function = true;
- +
- + /*
- + * First we check if the block function has already been registered
- + * or loaded from a plugin file.
- + */
- + if (isset($this->_plugins['block'][$tag_command])) {
- + $found = true;
- + $plugin_func = $this->_plugins['block'][$tag_command][0];
- + if (!is_callable($plugin_func)) {
- + $message = "block 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 ($plugin_file = $this->_get_plugin_filepath('block', $tag_command)) {
- + $found = true;
- +
- + include_once $plugin_file;
- +
- + $plugin_func = 'smarty_block_' . $tag_command;
- + if (!function_exists($plugin_func)) {
- + $message = "plugin function $plugin_func() not found in $plugin_file\n";
- + $have_function = false;
- + } else {
- + $this->_plugins['block'][$tag_command] = array($plugin_func, null, null, null, true);
- +
- + }
- + }
- +
- + if (!$found) {
- + return false;
- + } else if (!$have_function) {
- + $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
- + return true;
- + }
- +
- + /*
- + * Even though we've located the plugin function, compilation
- + * happens only once, so the plugin will still need to be loaded
- + * at runtime for future requests.
- + */
- + $this->_add_plugin('block', $tag_command);
- +
- + if ($start_tag)
- + $this->_push_tag($tag_command);
- + else
- + $this->_pop_tag($tag_command);
- +
- + if ($start_tag) {
- + $output = '<?php ' . $this->_push_cacheable_state('block', $tag_command);
- + $attrs = $this->_parse_attrs($tag_args);
- + $_cache_attrs='';
- + $arg_list = $this->_compile_arg_list('block', $tag_command, $attrs, $_cache_attrs);
- + $output .= "$_cache_attrs\$this->_tag_stack[] = array('$tag_command', array(".implode(',', $arg_list).')); ';
- + $output .= '$_block_repeat=true;' . $this->_compile_plugin_call('block', $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][1], null, $this, $_block_repeat);';
- + $output .= 'while ($_block_repeat) { ob_start(); ?>';
- + } else {
- + $output = '<?php $_block_content = ob_get_contents(); ob_end_clean(); ';
- + $_out_tag_text = $this->_compile_plugin_call('block', $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][1], $_block_content, $this, $_block_repeat)';
- + if ($tag_modifier != '') {
- + $this->_parse_modifiers($_out_tag_text, $tag_modifier);
- + }
- + $output .= '$_block_repeat=false;echo ' . $_out_tag_text . '; } ';
- + $output .= " array_pop(\$this->_tag_stack); " . $this->_pop_cacheable_state('block', $tag_command) . '?>';
- + }
- +
- + return true;
- + }
- +
- +
- + /**
- + * compile custom function tag
- + *
- + * @param string $tag_command
- + * @param string $tag_args
- + * @param string $tag_modifier
- + * @return string
- + */
- + function _compile_custom_tag($tag_command, $tag_args, $tag_modifier, &$output)
- + {
- + $found = false;
- + $have_function = true;
- +
- + /*
- + * First we check if the custom function has already been registered
- + * or loaded from a plugin file.
- + */
- + if (isset($this->_plugins['function'][$tag_command])) {
- + $found = true;
- + $plugin_func = $this->_plugins['function'][$tag_command][0];
- + if (!is_callable($plugin_func)) {
- + $message = "custom 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 ($plugin_file = $this->_get_plugin_filepath('function', $tag_command)) {
- + $found = true;
- +
- + include_once $plugin_file;
- +
- + $plugin_func = 'smarty_function_' . $tag_command;
- + if (!function_exists($plugin_func)) {
- + $message = "plugin function $plugin_func() not found in $plugin_file\n";
- + $have_function = false;
- + } else {
- + $this->_plugins['function'][$tag_command] = array($plugin_func, null, null, null, true);
- +
- + }
- + }
- +
- + if (!$found) {
- + return false;
- + } else if (!$have_function) {
- + $this->_syntax_error($message, E_USER_WARNING, __FILE__, __LINE__);
- + return true;
- + }
- +
- + /* declare plugin to be loaded on display of the template that
- + we compile right now */
- + $this->_add_plugin('function', $tag_command);
- +
- + $_cacheable_state = $this->_push_cacheable_state('function', $tag_command);
- + $attrs = $this->_parse_attrs($tag_args);
- + $_cache_attrs = '';
- + $arg_list = $this->_compile_arg_list('function', $tag_command, $attrs, $_cache_attrs);
- +
- + $output = $this->_compile_plugin_call('function', $tag_command).'(array('.implode(',', $arg_list)."), \$this)";
- + if($tag_modifier != '') {
- + $this->_parse_modifiers($output, $tag_modifier);
- + }
- +
- + if($output != '') {
- + $output = '<?php ' . $_cacheable_state . $_cache_attrs . 'echo ' . $output . ';'
- + . $this->_pop_cacheable_state('function', $tag_command) . "?>" . $this->_additional_newline;
- + }
- +
- + return true;
- + }
- +
- + /**
- + * compile a registered object tag
- + *
- + * @param string $tag_command
- + * @param array $attrs
- + * @param string $tag_modifier
- + * @return string
- + */
- + function _compile_registered_object_tag($tag_command, $attrs, $tag_modifier)
- + {
- + if (substr($tag_command, 0, 1) == '/') {
- + $start_tag = false;
- + $tag_command = substr($tag_command, 1);
- + } else {
- + $start_tag = true;
- + }
- +
- + list($object, $obj_comp) = explode('->', $tag_command);
- +
- + $arg_list = array();
- + if(count($attrs)) {
- + $_assign_var = false;
- + foreach ($attrs as $arg_name => $arg_value) {
- + if($arg_name == 'assign') {
- + $_assign_var = $arg_value;
- + unset($attrs['assign']);
- + continue;
- + }
- + if (is_bool($arg_value))
- + $arg_value = $arg_value ? 'true' : 'false';
- + $arg_list[] = "'$arg_name' => $arg_value";
- + }
- + }
- +
- + if($this->_reg_objects[$object][2]) {
- + // smarty object argument format
- + $args = "array(".implode(',', (array)$arg_list)."), \$this";
- + } else {
- + // traditional argument format
- + $args = implode(',', array_values($attrs));
- + if (empty($args)) {
- + $args = '';
- + }
- + }
- +
- + $prefix = '';
- + $postfix = '';
- + $newline = '';
- + if(!is_object($this->_reg_objects[$object][0])) {
- + $this->_trigger_fatal_error("registered '$object' is not an object" , $this->_current_file, $this->_current_line_no, __FILE__, __LINE__);
- + } elseif(!empty($this->_reg_objects[$object][1]) && !in_array($obj_comp, $this->_reg_objects[$object][1])) {
- + $this->_trigger_fatal_error("'$obj_comp' is not a registered component of object '$object'", $this->_current_file, $this->_current_line_no, __FILE__, __LINE__);
- + } elseif(method_exists($this->_reg_objects[$object][0], $obj_comp)) {
- + // method
- + if(in_array($obj_comp, $this->_reg_objects[$object][3])) {
- + // block method
- + if ($start_tag) {
- + $prefix = "\$this->_tag_stack[] = array('$obj_comp', $args); ";
- + $prefix .= "\$_block_repeat=true; \$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], null, \$this, \$_block_repeat); ";
- + $prefix .= "while (\$_block_repeat) { ob_start();";
- + $return = null;
- + $postfix = '';
- + } else {
- + $prefix = "\$_obj_block_content = ob_get_contents(); ob_end_clean(); \$_block_repeat=false;";
- + $return = "\$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_stack[count(\$this->_tag_stack)-1][1], \$_obj_block_content, \$this, \$_block_repeat)";
- + $postfix = "} array_pop(\$this->_tag_stack);";
- + }
- + } else {
- + // non-block method
- + $return = "\$this->_reg_objects['$object'][0]->$obj_comp($args)";
- + }
- + } else {
- + // property
- + $return = "\$this->_reg_objects['$object'][0]->$obj_comp";
- + }
- +
- + if($return != null) {
- + if($tag_modifier != '') {
- + $this->_parse_modifiers($return, $tag_modifier);
- + }
- +
- + if(!empty($_assign_var)) {
- + $output = "\$this->assign('" . $this->_dequote($_assign_var) ."', $return);";
- + } else {
- + $output = 'echo ' . $return . ';';
- + $newline = $this->_additional_newline;
- + }
- + } else {
- + $output = '';
- + }
- +
- + return '<?php ' . $prefix . $output . $postfix . "?>" . $newline;
- + }
- +
- + /**
- + * Compile {insert ...} tag
- + *
- + * @param string $tag_args
- + * @return string
- + */
- + function _compile_insert_tag($tag_args)
- + {
- + $attrs = $this->_parse_attrs($tag_args);
- + $name = $this->_dequote($attrs['name']);
- +
- + if (empty($name)) {
- + return $this->_syntax_error("missing insert name", E_USER_ERROR, __FILE__, __LINE__);
- + }
- +
- + if (!preg_match('~^\w+$~', $name)) {
- + return $this->_syntax_error("'insert: 'name' must be an insert function name", E_USER_ERROR, __FILE__, __LINE__);
- + }
- +
- + if (!empty($attrs['script'])) {
- + $delayed_loading = true;
- + } else {
- + $delayed_loading = false;
- + }
- +
- + foreach ($attrs as $arg_name => $arg_value) {
- + if (is_bool($arg_value))
- + $arg_value = $arg_value ? 'true' : 'false';
- + $arg_list[] = "'$arg_name' => $arg_value";
- + }
- +
- + $this->_add_plugin('insert', $name, $delayed_loading);
- +
- + $_params = "array('args' => array(".implode(', ', (array)$arg_list)."))";
- +
- + return "<?php require_once(SMARTY_CORE_DIR . 'core.run_insert_handler.php');\necho smarty_core_run_insert_handler($_params, \$this); ?>" . $this->_additional_newline;
- + }
- +
- + /**
- + * Compile {include ...} tag
- + *
- + * @param string $tag_args
- + * @return string
- + */
- + function _compile_include_tag($tag_args)
- + {
- + $attrs = $this->_parse_attrs($tag_args);
- + $arg_list = array();
- +
- + if (empty($attrs['file'])) {
- + $this->_syntax_error("missing 'file' attribute in include tag", E_USER_ERROR, __FILE__, __LINE__);
- + }
- +
- + foreach ($attrs as $arg_name => $arg_value) {
- + if ($arg_name == 'file') {
- + $include_file = $arg_value;
- + continue;
- + } else if ($arg_name == 'assign') {
- + $assign_var = $arg_value;
- + continue;
- + }
- + if (is_bool($arg_value))
- + $arg_value = $arg_value ? 'true' : 'false';
- + $arg_list[] = "'$arg_name' => $arg_value";
- + }
- +
- + $output = '<?php ';
- +
- + if (isset($assign_var)) {
- + $output .= "ob_start();\n";
- + }
- +
- + $output .=
- + "\$_smarty_tpl_vars = \$this->_tpl_vars;\n";
- +
- +
- + $_params = "array('smarty_include_tpl_file' => " . $include_file . ", 'smarty_include_vars' => array(".implode(',', (array)$arg_list)."))";
- + $output .= "\$this->_smarty_include($_params);\n" .
- + "\$this->_tpl_vars = \$_smarty_tpl_vars;\n" .
- + "unset(\$_smarty_tpl_vars);\n";
- +
- + if (isset($assign_var)) {
- + $output .= "\$this->assign(" . $assign_var . ", ob_get_contents()); ob_end_clean();\n";
- + }
- +
- + $output .= ' ?>';
- +
- + return $output;
- +
- + }
- +
- + /**
- + * Compile {include ...} tag
- + *
- + * @param string $tag_args
- + * @return string
- + */
- + function _compile_include_php_tag($tag_args)
- + {
- + $attrs = $this->_parse_attrs($tag_args);
- +
- + if (empty($attrs['file'])) {
- + $this->_syntax_error("missing 'file' attribute in include_php tag", E_USER_ERROR, __FILE__, __LINE__);
- + }
- +
- + $assign_var = (empty($attrs['assign'])) ? '' : $this->_dequote($attrs['assign']);
- + $once_var = (empty($attrs['once']) || $attrs['once']=='false') ? 'false' : 'true';
- +
- + $arg_list = array();
- + foreach($attrs as $arg_name => $arg_value) {
- + if($arg_name != 'file' AND $arg_name != 'once' AND $arg_name != 'assign') {
- + if(is_bool($arg_value))
- + $arg_value = $arg_value ? 'true' : 'false';
- + $arg_list[] = "'$arg_name' => $arg_value";
- + }
- + }
- +
- + $_params = "array('smarty_file' => " . $attrs['file'] . ", 'smarty_assign' => '$assign_var', 'smarty_once' => $once_var, 'smarty_include_vars' => array(".implode(',', $arg_list)."))";
- +
- + return "<?php require_once(SMARTY_CORE_DIR . 'core.smarty_include_php.php');\nsmarty_core_smarty_include_php($_params, \$this); ?>" . $this->_additional_newline;
- + }
- +
- +
- + /**
- + * Compile {section ...} tag
- + *
- + * @param string $tag_args
- + * @return string
- + */
- + function _compile_section_start($tag_args)
- + {
- + $attrs = $this->_parse_attrs($tag_args);
- + $arg_list = array();
- +
- + $output = '<?php ';
- + $section_name = $attrs['name'];
- + if (empty($section_name)) {
- + $this->_syntax_error("missing section name", E_USER_ERROR, __FILE__, __LINE__);
- + }
- +
- + $output .= "unset(\$this->_sections[$section_name]);\n";
- + $section_props = "\$this->_sections[$section_name]";
- +
- + foreach ($attrs as $attr_name => $attr_value) {
- + switch ($attr_name) {
- + case 'loop':
- + $output .= "{$section_props}['loop'] = is_array(\$_loop=$attr_value) ? count(\$_loop) : max(0, (int)\$_loop); unset(\$_loop);\n";
- + break;
- +
- + case 'show':
- + if (is_bool($attr_value))
- + $show_attr_value = $attr_value ? 'true' : 'false';
- + else
- + $show_attr_value = "(bool)$attr_value";
- + $output .= "{$section_props}['show'] = $show_attr_value;\n";
- + break;
- +
- + case 'name':
- + $output .= "{$section_props}['$attr_name'] = $attr_value;\n";
- + break;
- +
- + case 'max':
- + case 'start':
- + $output .= "{$section_props}['$attr_name'] = (int)$attr_value;\n";
- + break;
- +
- + case 'step':
- + $output .= "{$section_props}['$attr_name'] = ((int)$attr_value) == 0 ? 1 : (int)$attr_value;\n";
- + break;
- +
- + default:
- + $this->_syntax_error("unknown section attribute - '$attr_name'", E_USER_ERROR, __FILE__, __LINE__);
- + break;
- + }
- + }
- +
- + if (!isset($attrs['show']))
- + $output .= "{$section_props}['show'] = true;\n";
- +
- + if (!isset($attrs['loop']))
- + $output .= "{$section_props}['loop'] = 1;\n";
- +
- + if (!isset($attrs['max']))
- + $output .= "{$section_props}['max'] = {$section_props}['loop'];\n";
- + else
- + $output .= "if ({$section_props}['max'] < 0)\n" .
- + " {$section_props}['max'] = {$section_props}['loop'];\n";
- +
- + if (!isset($attrs['step']))
- + $output .= "{$section_props}['step'] = 1;\n";
- +
- + if (!isset($attrs['start']))
- + $output .= "{$section_props}['start'] = {$section_props}['step'] > 0 ? 0 : {$section_props}['loop']-1;\n";
- + else {
- + $output .= "if ({$section_props}['start'] < 0)\n" .
- + " {$section_props}['start'] = max({$section_props}['step'] > 0 ? 0 : -1, {$section_props}['loop'] + {$section_props}['start']);\n" .
- + "else\n" .
- + " {$section_props}['start'] = min({$section_props}['start'], {$section_props}['step'] > 0 ? {$section_props}['loop'] : {$section_props}['loop']-1);\n";
- + }
- +
- + $output .= "if ({$section_props}['show']) {\n";
- + if (!isset($attrs['start']) && !isset($attrs['step']) && !isset($attrs['max'])) {
- + $output .= " {$section_props}['total'] = {$section_props}['loop'];\n";
- + } else {
- + $output .= " {$section_props}['total'] = min(ceil(({$section_props}['step'] > 0 ? {$section_props}['loop'] - {$section_props}['start'] : {$section_props}['start']+1)/abs({$section_props}['step'])), {$section_props}['max']);\n";
- + }
- + $output .= " if ({$section_props}['total'] == 0)\n" .
- + " {$section_props}['show'] = false;\n" .
- + "} else\n" .
- + " {$section_props}['total'] = 0;\n";
- +
- + $output .= "if ({$section_props}['show']):\n";
- + $output .= "
- + for ({$section_props}['index'] = {$section_props}['start'], {$section_props}['iteration'] = 1;
- + {$section_props}['iteration'] <= {$section_props}['total'];
- + {$section_props}['index'] += {$section_props}['step'], {$section_props}['iteration']++):\n";
- + $output .= "{$section_props}['rownum'] = {$section_props}['iteration'];\n";
- + $output .= "{$section_props}['index_prev'] = {$section_props}['index'] - {$section_props}['step'];\n";
- + $output .= "{$section_props}['index_next'] = {$section_props}['index'] + {$section_props}['step'];\n";
- + $output .= "{$section_props}['first'] = ({$section_props}['iteration'] == 1);\n";
- + $output .= "{$section_props}['last'] = ({$section_props}['iteration'] == {$section_props}['total']);\n";
- +
- + $output .= "?>";
- +
- + return $output;
- + }
- +
- +
- + /**
- + * Compile {foreach ...} tag.
- + *
- + * @param string $tag_args
- + * @return string
- + */
- + function _compile_foreach_start($tag_args)
- + {
- + $attrs = $this->_parse_attrs($tag_args);
- + $arg_list = array();
- +
- + if (empty($attrs['from'])) {
- + return $this->_syntax_error("foreach: missing 'from' attribute", E_USER_ERROR, __FILE__, __LINE__);
- + }
- + $from = $attrs['from'];
- +
- + if (empty($attrs['item'])) {
- + return $this->_syntax_error("foreach: missing 'item' attribute", E_USER_ERROR, __FILE__, __LINE__);
- + }
- + $item = $this->_dequote($attrs['item']);
- + if (!preg_match('~^\w+$~', $item)) {
- + return $this->_syntax_error("foreach: 'item' must be a variable name (literal string)", E_USER_ERROR, __FILE__, __LINE__);
- + }
- +
- + if (isset($attrs['key'])) {
- + $key = $this->_dequote($attrs['key']);
- + if (!preg_match('~^\w+$~', $key)) {
- + return $this->_syntax_error("foreach: 'key' must to be a variable name (literal string)", E_USER_ERROR, __FILE__, __LINE__);
- + }
- + $key_part = "\$this->_tpl_vars['$key'] => ";
- + } else {
- + $key = null;
- + $key_part = '';
- + }
- +
- + if (isset($attrs['name'])) {
- + $name = $attrs['name'];
- + } else {
- + $name = null;
- + }
- +
- + $output = '<?php ';
- + $output .= "\$_from = $from; if (!is_array(\$_from) && !is_object(\$_from)) { settype(\$_from, 'array'); }";
- + if (isset($name)) {
- + $foreach_props = "\$this->_foreach[$name]";
- + $output .= "{$foreach_props} = array('total' => count(\$_from), 'iteration' => 0);\n";
- + $output .= "if ({$foreach_props}['total'] > 0):\n";
- + $output .= " foreach (\$_from as $key_part\$this->_tpl_vars['$item']):\n";
- + $output .= " {$foreach_props}['iteration']++;\n";
- + } else {
- + $output .= "if (count(\$_from)):\n";
- + $output .= " foreach (\$_from as $key_part\$this->_tpl_vars['$item']):\n";
- + }
- + $output .= '?>';
- +
- + return $output;
- + }
- +
- +
- + /**
- + * Compile {capture} .. {/capture} tags
- + *
- + * @param boolean $start true if this is the {capture} tag
- + * @param string $tag_args
- + * @return string
- + */
- +
- + function _compile_capture_tag($start, $tag_args = '')
- + {
- + $attrs = $this->_parse_attrs($tag_args);
- +
- + if ($start) {
- + $buffer = isset($attrs['name']) ? $attrs['name'] : "'default'";
- + $assign = isset($attrs['assign']) ? $attrs['assign'] : null;
- + $append = isset($attrs['append']) ? $attrs['append'] : null;
- +
- + $output = "<?php ob_start(); ?>";
- + $this->_capture_stack[] = array($buffer, $assign, $append);
- + } else {
- + list($buffer, $assign, $append) = array_pop($this->_capture_stack);
- + $output = "<?php \$this->_smarty_vars['capture'][$buffer] = ob_get_contents(); ";
- + if (isset($assign)) {
- + $output .= " \$this->assign($assign, ob_get_contents());";
- + }
- + if (isset($append)) {
- + $output .= " \$this->append($append, ob_get_contents());";
- + }
- + $output .= "ob_end_clean(); ?>";
- + }
- +
- + return $output;
- + }
- +
- + /**
- + * Compile {if ...} tag
- + *
- + * @param string $tag_args
- + * @param boolean $elseif if true, uses elseif instead of if
- + * @return string
- + */
- + function _compile_if_tag($tag_args, $elseif = false)
- + {
- +
- + /* Tokenize args for 'if' tag. */
- + preg_match_all('~(?>
- + ' . $this->_obj_call_regexp . '(?:' . $this->_mod_regexp . '*)? | # valid object call
- + ' . $this->_var_regexp . '(?:' . $this->_mod_regexp . '*)? | # var or quoted string
- + \-?0[xX][0-9a-fA-F]+|\-?\d+(?:\.\d+)?|\.\d+|!==|===|==|!=|<>|<<|>>|<=|>=|\&\&|\|\||\(|\)|,|\!|\^|=|\&|\~|<|>|\||\%|\+|\-|\/|\*|\@ | # valid non-word token
- + \b\w+\b | # valid word token
- + \S+ # anything else
- + )~x', $tag_args, $match);
- +
- + $tokens = $match[0];
- +
- + if(empty($tokens)) {
- + $_error_msg = $elseif ? "'elseif'" : "'if'";
- + $_error_msg .= ' statement requires arguments';
- + $this->_syntax_error($_error_msg, E_USER_ERROR, __FILE__, __LINE__);
- + }
- +
- +
- + // make sure we have balanced parenthesis
- + $token_count = array_count_values($tokens);
- + if(isset($token_count['(']) && $token_count['('] != $token_count[')']) {
- + $this->_syntax_error("unbalanced parenthesis in if statement", E_USER_ERROR, __FILE__, __LINE__);
- + }
- +
- + $is_arg_stack = array();
- +
- + for ($i = 0; $i < count($tokens); $i++) {
- +
- + $token = &$tokens[$i];
- +
- + switch (strtolower($token)) {
- + case '!':
- + case '%':
- + case '!==':
- + case '==':
- + case '===':
- + case '>':
- + case '<':
- + case '!=':
- + case '<>':
- + case '<<':
- + case '>>':
- + case '<=':
- + case '>=':
- + case '&&':
- + case '||':
- + case '|':
- + case '^':
- + case '&':
- + case '~':
- + case ')':
- + case ',':
- + case '+':
- + case '-':
- + case '*':
- + case '/':
- + case '@':
- + break;
- +
- + case 'eq':
- + $token = '==';
- + break;
- +
- + case 'ne':
- + case 'neq':
- + $token = '!=';
- + break;
- +
- + case 'lt':
- + $token = '<';
- + break;
- +
- + case 'le':
- + case 'lte':
- + $token = '<=';
- + break;
- +
- + case 'gt':
- + $token = '>';
- + break;
- +
- + case 'ge':
- + case 'gte':
- + $token = '>=';
- + break;
- +
- + case 'and':
- + $token = '&&';
- + break;
- +
- + case 'or':
- + $token = '||';
- + break;
- +
- + case 'not':
- + $token = '!';
- + break;
- +
- + case 'mod':
- + $token = '%';
- + break;
- +
- + case '(':
- + array_push($is_arg_stack, $i);
- + break;
- +
- + case 'is':
- + /* If last token was a ')', we operate on the parenthesized
- + expression. The start of the expression is on the stack.
- + Otherwise, we operate on the last encountered token. */
- + if ($tokens[$i-1] == ')') {
- + $is_arg_start = array_pop($is_arg_stack);
- + if ($is_arg_start != 0) {
- + if (preg_match('~^' . $this->_func_regexp . '$~', $tokens[$is_arg_start-1])) {
- + $is_arg_start--;
- + }
- + }
- + } else
- + $is_arg_start = $i-1;
- + /* Construct the argument for 'is' expression, so it knows
- + what to operate on. */
- + $is_arg = implode(' ', array_slice($tokens, $is_arg_start, $i - $is_arg_start));
- +
- + /* Pass all tokens from next one until the end to the
- + 'is' expression parsing function. The function will
- + return modified tokens, where the first one is the result
- + of the 'is' expression and the rest are the tokens it
- + didn't touch. */
- + $new_tokens = $this->_parse_is_expr($is_arg, array_slice($tokens, $i+1));
- +
- + /* Replace the old tokens with the new ones. */
- + array_splice($tokens, $is_arg_start, count($tokens), $new_tokens);
- +
- + /* Adjust argument start so that it won't change from the
- + current position for the next iteration. */
- + $i = $is_arg_start;
- + break;
- +
- + default:
- + if(preg_match('~^' . $this->_func_regexp . '$~', $token) ) {
- + // function call
- + if($this->security &&
- + !in_array($token, $this->security_settings['IF_FUNCS'])) {
- + $this->_syntax_error("(secure mode) '$token' not allowed in if statement", E_USER_ERROR, __FILE__, __LINE__);
- + }
- + } elseif(preg_match('~^' . $this->_var_regexp . '$~', $token) && (strpos('+-*/^%&|', substr($token, -1)) === false) && isset($tokens[$i+1]) && $tokens[$i+1] == '(') {
- + // variable function call
- + $this->_syntax_error("variable function call '$token' not allowed in if statement", E_USER_ERROR, __FILE__, __LINE__);
- + } elseif(preg_match('~^' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . $this->_mod_regexp . '*)$~', $token)) {
- + // object or variable
- + $token = $this->_parse_var_props($token);
- + } elseif(is_numeric($token)) {
- + // number, skip it
- + } else {
- + $this->_syntax_error("unidentified token '$token'", E_USER_ERROR, __FILE__, __LINE__);
- + }
- + break;
- + }
- + }
- +
- + if ($elseif)
- + return '<?php elseif ('.implode(' ', $tokens).'): ?>';
- + else
- + return '<?php if ('.implode(' ', $tokens).'): ?>';
- + }
- +
- +
- + function _compile_arg_list($type, $name, $attrs, &$cache_code) {
- + $arg_list = array();
- +
- + if (isset($type) && isset($name)
- + && isset($this->_plugins[$type])
- + && isset($this->_plugins[$type][$name])
- + && empty($this->_plugins[$type][$name][4])
- + && is_array($this->_plugins[$type][$name][5])
- + ) {
- + /* we have a list of parameters that should be cached */
- + $_cache_attrs = $this->_plugins[$type][$name][5];
- + $_count = $this->_cache_attrs_count++;
- + $cache_code = "\$_cache_attrs =& \$this->_smarty_cache_attrs('$this->_cache_serial','$_count');";
- +
- + } else {
- + /* no parameters are cached */
- + $_cache_attrs = null;
- + }
- +
- + foreach ($attrs as $arg_name => $arg_value) {
- + if (is_bool($arg_value))
- + $arg_value = $arg_value ? 'true' : 'false';
- + if (is_null($arg_value))
- + $arg_value = 'null';
- + if ($_cache_attrs && in_array($arg_name, $_cache_attrs)) {
- + $arg_list[] = "'$arg_name' => (\$this->_cache_including) ? \$_cache_attrs['$arg_name'] : (\$_cache_attrs['$arg_name']=$arg_value)";
- + } else {
- + $arg_list[] = "'$arg_name' => $arg_value";
- + }
- + }
- + return $arg_list;
- + }
- +
- + /**
- + * Parse is expression
- + *
- + * @param string $is_arg
- + * @param array $tokens
- + * @return array
- + */
- + function _parse_is_expr($is_arg, $tokens)
- + {
- + $expr_end = 0;
- + $negate_expr = false;
- +
- + if (($first_token = array_shift($tokens)) == 'not') {
- + $negate_expr = true;
- + $expr_type = array_shift($tokens);
- + } else
- + $expr_type = $first_token;
- +
- + switch ($expr_type) {
- + case 'even':
- + if (isset($tokens[$expr_end]) && $tokens[$expr_end] == 'by') {
- + $expr_end++;
- + $expr_arg = $tokens[$expr_end++];
- + $expr = "!(1 & ($is_arg / " . $this->_parse_var_props($expr_arg) . "))";
- + } else
- + $expr = "!(1 & $is_arg)";
- + break;
- +
- + case 'odd':
- + if (isset($tokens[$expr_end]) && $tokens[$expr_end] == 'by') {
- + $expr_end++;
- + $expr_arg = $tokens[$expr_end++];
- + $expr = "(1 & ($is_arg / " . $this->_parse_var_props($expr_arg) . "))";
- + } else
- + $expr = "(1 & $is_arg)";
- + break;
- +
- + case 'div':
- + if (@$tokens[$expr_end] == 'by') {
- + $expr_end++;
- + $expr_arg = $tokens[$expr_end++];
- + $expr = "!($is_arg % " . $this->_parse_var_props($expr_arg) . ")";
- + } else {
- + $this->_syntax_error("expecting 'by' after 'div'", E_USER_ERROR, __FILE__, __LINE__);
- + }
- + break;
- +
- + default:
- + $this->_syntax_error("unknown 'is' expression - '$expr_type'", E_USER_ERROR, __FILE__, __LINE__);
- + break;
- + }
- +
- + if ($negate_expr) {
- + $expr = "!($expr)";
- + }
- +
- + array_splice($tokens, 0, $expr_end, $expr);
- +
- + return $tokens;
- + }
- +
- +
- + /**
- + * Parse attribute string
- + *
- + * @param string $tag_args
- + * @return array
- + */
- + function _parse_attrs($tag_args)
- + {
- +
- + /* Tokenize tag attributes. */
- + preg_match_all('~(?:' . $this->_obj_call_regexp . '|' . $this->_qstr_regexp . ' | (?>[^"\'=\s]+)
- + )+ |
- + [=]
- + ~x', $tag_args, $match);
- + $tokens = $match[0];
- +
- + $attrs = array();
- + /* Parse state:
- + 0 - expecting attribute name
- + 1 - expecting '='
- + 2 - expecting attribute value (not '=') */
- + $state = 0;
- +
- + foreach ($tokens as $token) {
- + switch ($state) {
- + case 0:
- + /* If the token is a valid identifier, we set attribute name
- + and go to state 1. */
- + if (preg_match('~^\w+$~', $token)) {
- + $attr_name = $token;
- + $state = 1;
- + } else
- + $this->_syntax_error("invalid attribute name: '$token'", E_USER_ERROR, __FILE__, __LINE__);
- + break;
- +
- + case 1:
- + /* If the token is '=', then we go to state 2. */
- + if ($token == '=') {
- + $state = 2;
- + } else
- + $this->_syntax_error("expecting '=' after attribute name '$last_token'", E_USER_ERROR, __FILE__, __LINE__);
- + break;
- +
- + case 2:
- + /* If token is not '=', we set the attribute value and go to
- + state 0. */
- + if ($token != '=') {
- + /* We booleanize the token if it's a non-quoted possible
- + boolean value. */
- + if (preg_match('~^(on|yes|true)$~', $token)) {
- + $token = 'true';
- + } else if (preg_match('~^(off|no|false)$~', $token)) {
- + $token = 'false';
- + } else if ($token == 'null') {
- + $token = 'null';
- + } else if (preg_match('~^' . $this->_num_const_regexp . '|0[xX][0-9a-fA-F]+$~', $token)) {
- + /* treat integer literally */
- + } else if (!preg_match('~^' . $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . $this->_mod_regexp . ')*$~', $token)) {
- + /* treat as a string, double-quote it escaping quotes */
- + $token = '"'.addslashes($token).'"';
- + }
- +
- + $attrs[$attr_name] = $token;
- + $state = 0;
- + } else
- + $this->_syntax_error("'=' cannot be an attribute value", E_USER_ERROR, __FILE__, __LINE__);
- + break;
- + }
- + $last_token = $token;
- + }
- +
- + if($state != 0) {
- + if($state == 1) {
- + $this->_syntax_error("expecting '=' after attribute name '$last_token'", E_USER_ERROR, __FILE__, __LINE__);
- + } else {
- + $this->_syntax_error("missing attribute value", E_USER_ERROR, __FILE__, __LINE__);
- + }
- + }
- +
- + $this->_parse_vars_props($attrs);
- +
- + return $attrs;
- + }
- +
- + /**
- + * compile multiple variables and section properties tokens into
- + * PHP code
- + *
- + * @param array $tokens
- + */
- + function _parse_vars_props(&$tokens)
- + {
- + foreach($tokens as $key => $val) {
- + $tokens[$key] = $this->_parse_var_props($val);
- + }
- + }
- +
- + /**
- + * compile single variable and section properties token into
- + * PHP code
- + *
- + * @param string $val
- + * @param string $tag_attrs
- + * @return string
- + */
- + function _parse_var_props($val)
- + {
- + $val = trim($val);
- +
- + if(preg_match('~^(' . $this->_obj_call_regexp . '|' . $this->_dvar_regexp . ')(' . $this->_mod_regexp . '*)$~', $val, $match)) {
- + // $ variable or object
- + $return = $this->_parse_var($match[1]);
- + $modifiers = $match[2];
- + if (!empty($this->default_modifiers) && !preg_match('~(^|\|)smarty:nodefaults($|\|)~',$modifiers)) {
- + $_default_mod_string = implode('|',(array)$this->default_modifiers);
- + $modifiers = empty($modifiers) ? $_default_mod_string : $_default_mod_string . '|' . $modifiers;
- + }
- + $this->_parse_modifiers($return, $modifiers);
- + return $return;
- + } elseif (preg_match('~^' . $this->_db_qstr_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
- + // double quoted text
- + preg_match('~^(' . $this->_db_qstr_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match);
- + $return = $this->_expand_quoted_text($match[1]);
- + if($match[2] != '') {
- + $this->_parse_modifiers($return, $match[2]);
- + }
- + return $return;
- + }
- + elseif(preg_match('~^' . $this->_num_const_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
- + // numerical constant
- + preg_match('~^(' . $this->_num_const_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match);
- + if($match[2] != '') {
- + $this->_parse_modifiers($match[1], $match[2]);
- + return $match[1];
- + }
- + }
- + elseif(preg_match('~^' . $this->_si_qstr_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
- + // single quoted text
- + preg_match('~^(' . $this->_si_qstr_regexp . ')('. $this->_mod_regexp . '*)$~', $val, $match);
- + if($match[2] != '') {
- + $this->_parse_modifiers($match[1], $match[2]);
- + return $match[1];
- + }
- + }
- + elseif(preg_match('~^' . $this->_cvar_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
- + // config var
- + return $this->_parse_conf_var($val);
- + }
- + elseif(preg_match('~^' . $this->_svar_regexp . '(?:' . $this->_mod_regexp . '*)$~', $val)) {
- + // section var
- + return $this->_parse_section_prop($val);
- + }
- + elseif(!in_array($val, $this->_permitted_tokens) && !is_numeric($val)) {
- + // literal string
- + return $this->_expand_quoted_text('"' . strtr($val, array('\\' => '\\\\', '"' => '\\"')) .'"');
- + }
- + return $val;
- + }
- +
- + /**
- + * expand quoted text with embedded variables
- + *
- + * @param string $var_expr
- + * @return string
- + */
- + function _expand_quoted_text($var_expr)
- + {
- + // if contains unescaped $, expand it
- + if(preg_match_all('~(?:\`(?<!\\\\)\$' . $this->_dvar_guts_regexp . '(?:' . $this->_obj_ext_regexp . ')*\`)|(?:(?<!\\\\)\$\w+(\[[a-zA-Z0-9]+\])*)~', $var_expr, $_match)) {
- + $_match = $_match[0];
- + $_replace = array();
- + foreach($_match as $_var) {
- + $_replace[$_var] = '".(' . $this->_parse_var(str_replace('`','',$_var)) . ')."';
- + }
- + $var_expr = strtr($var_expr, $_replace);
- + $_return = preg_replace('~\.""|(?<!\\\\)""\.~', '', $var_expr);
- + } else {
- + $_return = $var_expr;
- + }
- + // replace double quoted literal string with single quotes
- + $_return = preg_replace('~^"([\s\w]+)"$~',"'\'",$_return);
- + return $_return;
- + }
- +
- + /**
- + * parse variable expression into PHP code
- + *
- + * @param string $var_expr
- + * @param string $output
- + * @return string
- + */
- + function _parse_var($var_expr)
- + {
- + $_has_math = false;
- + $_math_vars = preg_split('~('.$this->_dvar_math_regexp.'|'.$this->_qstr_regexp.')~', $var_expr, -1, PREG_SPLIT_DELIM_CAPTURE);
- +
- + if(count($_math_vars) > 1) {
- + $_first_var = "";
- + $_complete_var = "";
- + $_output = "";
- + // simple check if there is any math, to stop recursion (due to modifiers with "xx % yy" as parameter)
- + foreach($_math_vars as $_k => $_math_var) {
- + $_math_var = $_math_vars[$_k];
- +
- + if(!empty($_math_var) || is_numeric($_math_var)) {
- + // hit a math operator, so process the stuff which came before it
- + if(preg_match('~^' . $this->_dvar_math_regexp . '$~', $_math_var)) {
- + $_has_math = true;
- + if(!empty($_complete_var) || is_numeric($_complete_var)) {
- + $_output .= $this->_parse_var($_complete_var);
- + }
- +
- + // just output the math operator to php
- + $_output .= $_math_var;
- +
- + if(empty($_first_var))
- + $_first_var = $_complete_var;
- +
- + $_complete_var = "";
- + } else {
- + $_complete_var .= $_math_var;
- + }
- + }
- + }
- + if($_has_math) {
- + if(!empty($_complete_var) || is_numeric($_complete_var))
- + $_output .= $this->_parse_var($_complete_var);
- +
- + // get the modifiers working (only the last var from math + modifier is left)
- + $var_expr = $_complete_var;
- + }
- + }
- +
- + // prevent cutting of first digit in the number (we _definitly_ got a number if the first char is a digit)
- + if(is_numeric(substr($var_expr, 0, 1)))
- + $_var_ref = $var_expr;
- + else
- + $_var_ref = substr($var_expr, 1);
- +
- + if(!$_has_math) {
- +
- + // get [foo] and .foo and ->foo and (...) pieces
- + preg_match_all('~(?:^\w+)|' . $this->_obj_params_regexp . '|(?:' . $this->_var_bracket_regexp . ')|->\$?\w+|\.\$?\w+|\S+~', $_var_ref, $match);
- +
- + $_indexes = $match[0];
- + $_var_name = array_shift($_indexes);
- +
- + /* Handle $smarty.* variable references as a special case. */
- + if ($_var_name == 'smarty') {
- + /*
- + * If the reference could be compiled, use the compiled output;
- + * otherwise, fall back on the $smarty variable generated at
- + * run-time.
- + */
- + if (($smarty_ref = $this->_compile_smarty_ref($_indexes)) !== null) {
- + $_output = $smarty_ref;
- + } else {
- + $_var_name = substr(array_shift($_indexes), 1);
- + $_output = "\$this->_smarty_vars['$_var_name']";
- + }
- + } elseif(is_numeric($_var_name) && is_numeric(substr($var_expr, 0, 1))) {
- + // because . is the operator for accessing arrays thru inidizes we need to put it together again for floating point numbers
- + if(count($_indexes) > 0)
- + {
- + $_var_name .= implode("", $_indexes);
- + $_indexes = array();
- + }
- + $_output = $_var_name;
- + } else {
- + $_output = "\$this->_tpl_vars['$_var_name']";
- + }
- +
- + foreach ($_indexes as $_index) {
- + if (substr($_index, 0, 1) == '[') {
- + $_index = substr($_index, 1, -1);
- + if (is_numeric($_index)) {
- + $_output .= "[$_index]";
- + } elseif (substr($_index, 0, 1) == '$') {
- + if (strpos($_index, '.') !== false) {
- + $_output .= '[' . $this->_parse_var($_index) . ']';
- + } else {
- + $_output .= "[\$this->_tpl_vars['" . substr($_index, 1) . "']]";
- + }
- + } else {
- + $_var_parts = explode('.', $_index);
- + $_var_section = $_var_parts[0];
- + $_var_section_prop = isset($_var_parts[1]) ? $_var_parts[1] : 'index';
- + $_output .= "[\$this->_sections['$_var_section']['$_var_section_prop']]";
- + }
- + } else if (substr($_index, 0, 1) == '.') {
- + if (substr($_index, 1, 1) == '$')
- + $_output .= "[\$this->_tpl_vars['" . substr($_index, 2) . "']]";
- + else
- + $_output .= "['" . substr($_index, 1) . "']";
- + } else if (substr($_index,0,2) == '->') {
- + if(substr($_index,2,2) == '__') {
- + $this->_syntax_error('call to internal object members is not allowed', E_USER_ERROR, __FILE__, __LINE__);
- + } elseif($this->security && substr($_index, 2, 1) == '_') {
- + $this->_syntax_error('(secure) call to private object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
- + } elseif (substr($_index, 2, 1) == '$') {
- + if ($this->security) {
- + $this->_syntax_error('(secure) call to dynamic object member is not allowed', E_USER_ERROR, __FILE__, __LINE__);
- + } else {
- + $_output .= '->{(($_var=$this->_tpl_vars[\''.substr($_index,3).'\']) && substr($_var,0,2)!=\'__\') ? $_var : $this->trigger_error("cannot access property \\"$_var\\"")}';
- + }
- + } else {
- + $_output .= $_index;
- + }
- + } elseif (substr($_index, 0, 1) == '(') {
- + $_index = $this->_parse_parenth_args($_index);
- + $_output .= $_index;
- + } else {
- + $_output .= $_index;
- + }
- + }
- + }
- +
- + return $_output;
- + }
- +
- + /**
- + * parse arguments in function call parenthesis
- + *
- + * @param string $parenth_args
- + * @return string
- + */
- + function _parse_parenth_args($parenth_args)
- + {
- + preg_match_all('~' . $this->_param_regexp . '~',$parenth_args, $match);
- + $orig_vals = $match = $match[0];
- + $this->_parse_vars_props($match);
- + $replace = array();
- + for ($i = 0, $count = count($match); $i < $count; $i++) {
- + $replace[$orig_vals[$i]] = $match[$i];
- + }
- + return strtr($parenth_args, $replace);
- + }
- +
- + /**
- + * parse configuration variable expression into PHP code
- + *
- + * @param string $conf_var_expr
- + */
- + function _parse_conf_var($conf_var_expr)
- + {
- + $parts = explode('|', $conf_var_expr, 2);
- + $var_ref = $parts[0];
- + $modifiers = isset($parts[1]) ? $parts[1] : '';
- +
- + $var_name = substr($var_ref, 1, -1);
- +
- + $output = "\$this->_config[0]['vars']['$var_name']";
- +
- + $this->_parse_modifiers($output, $modifiers);
- +
- + return $output;
- + }
- +
- + /**
- + * parse section property expression into PHP code
- + *
- + * @param string $section_prop_expr
- + * @return string
- + */
- + function _parse_section_prop($section_prop_expr)
- + {
- + $parts = explode('|', $section_prop_expr, 2);
- + $var_ref = $parts[0];
- + $modifiers = isset($parts[1]) ? $parts[1] : '';
- +
- + preg_match('!%(\w+)\.(\w+)%!', $var_ref, $match);
- + $section_name = $match[1];
- + $prop_name = $match[2];
- +
- + $output = "\$this->_sections['$section_name']['$prop_name']";
- +
- + $this->_parse_modifiers($output, $modifiers);
- +
- + return $output;
- + }
- +
- +
- + /**
- + * parse modifier chain into PHP code
- + *
- + * sets $output to parsed modified chain
- + * @param string $output
- + * @param string $modifier_string
- + */
- + function _parse_modifiers(&$output, $modifier_string)
- + {
- + preg_match_all('~\|(@?\w+)((?>:(?:'. $this->_qstr_regexp . '|[^|]+))*)~', '|' . $modifier_string, $_match);
- + list(, $_modifiers, $modifier_arg_strings) = $_match;
- +
- + for ($_i = 0, $_for_max = count($_modifiers); $_i < $_for_max; $_i++) {
- + $_modifier_name = $_modifiers[$_i];
- +
- + if($_modifier_name == 'smarty') {
- + // skip smarty modifier
- + continue;
- + }
- +
- + preg_match_all('~:(' . $this->_qstr_regexp . '|[^:]+)~', $modifier_arg_strings[$_i], $_match);
- + $_modifier_args = $_match[1];
- +
- + if (substr($_modifier_name, 0, 1) == '@') {
- + $_map_array = false;
- + $_modifier_name = substr($_modifier_name, 1);
- + } else {
- + $_map_array = true;
- + }
- +
- + if (empty($this->_plugins['modifier'][$_modifier_name])
- + && !$this->_get_plugin_filepath('modifier', $_modifier_name)
- + && function_exists($_modifier_name)) {
- + if ($this->security && !in_array($_modifier_name, $this->security_settings['MODIFIER_FUNCS'])) {
- + $this->_trigger_fatal_error("[plugin] (secure mode) modifier '$_modifier_name' is not allowed" , $this->_current_file, $this->_current_line_no, __FILE__, __LINE__);
- + } else {
- + $this->_plugins['modifier'][$_modifier_name] = array($_modifier_name, null, null, false);
- + }
- + }
- + $this->_add_plugin('modifier', $_modifier_name);
- +
- + $this->_parse_vars_props($_modifier_args);
- +
- + if($_modifier_name == 'default') {
- + // supress notifications of default modifier vars and args
- + if(substr($output, 0, 1) == '$') {
- + $output = '@' . $output;
- + }
- + if(isset($_modifier_args[0]) && substr($_modifier_args[0], 0, 1) == '$') {
- + $_modifier_args[0] = '@' . $_modifier_args[0];
- + }
- + }
- + if (count($_modifier_args) > 0)
- + $_modifier_args = ', '.implode(', ', $_modifier_args);
- + else
- + $_modifier_args = '';
- +
- + if ($_map_array) {
- + $output = "((is_array(\$_tmp=$output)) ? \$this->_run_mod_handler('$_modifier_name', true, \$_tmp$_modifier_args) : " . $this->_compile_plugin_call('modifier', $_modifier_name) . "(\$_tmp$_modifier_args))";
- +
- + } else {
- +
- + $output = $this->_compile_plugin_call('modifier', $_modifier_name)."($output$_modifier_args)";
- +
- + }
- + }
- + }
- +
- +
- + /**
- + * add plugin
- + *
- + * @param string $type
- + * @param string $name
- + * @param boolean? $delayed_loading
- + */
- + function _add_plugin($type, $name, $delayed_loading = null)
- + {
- + 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,
- + $delayed_loading);
- + }
- + }
- +
- +
- + /**
- + * Compiles references of type $smarty.foo
- + *
- + * @param string $indexes
- + * @return string
- + */
- + function _compile_smarty_ref(&$indexes)
- + {
- + /* Extract the reference name. */
- + $_ref = substr($indexes[0], 1);
- + foreach($indexes as $_index_no=>$_index) {
- + if (substr($_index, 0, 1) != '.' && $_index_no<2 || !preg_match('~^(\.|\[|->)~', $_index)) {
- + $this->_syntax_error('$smarty' . implode('', array_slice($indexes, 0, 2)) . ' is an invalid reference', E_USER_ERROR, __FILE__, __LINE__);
- + }
- + }
- +
- + switch ($_ref) {
- + case 'now':
- + $compiled_ref = 'time()';
- + $_max_index = 1;
- + break;
- +
- + case 'foreach':
- + array_shift($indexes);
- + $_var = $this->_parse_var_props(substr($indexes[0], 1));
- + $_propname = substr($indexes[1], 1);
- + $_max_index = 1;
- + switch ($_propname) {
- + case 'index':
- + array_shift($indexes);
- + $compiled_ref = "(\$this->_foreach[$_var]['iteration']-1)";
- + break;
- +
- + case 'first':
- + array_shift($indexes);
- + $compiled_ref = "(\$this->_foreach[$_var]['iteration'] <= 1)";
- + break;
- +
- + case 'last':
- + array_shift($indexes);
- + $compiled_ref = "(\$this->_foreach[$_var]['iteration'] == \$this->_foreach[$_var]['total'])";
- + break;
- +
- + case 'show':
- + array_shift($indexes);
- + $compiled_ref = "(\$this->_foreach[$_var]['total'] > 0)";
- + break;
- +
- + default:
- + unset($_max_index);
- + $compiled_ref = "\$this->_foreach[$_var]";
- + }
- + break;
- +
- + case 'section':
- + array_shift($indexes);
- + $_var = $this->_parse_var_props(substr($indexes[0], 1));
- + $compiled_ref = "\$this->_sections[$_var]";
- + break;
- +
- + case 'get':
- + if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
- + $this->_syntax_error("(secure mode) super global access not permitted",
- + E_USER_WARNING, __FILE__, __LINE__);
- + return;
- + }
- + $compiled_ref = "\$_GET";
- + break;
- +
- + case 'post':
- + if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
- + $this->_syntax_error("(secure mode) super global access not permitted",
- + E_USER_WARNING, __FILE__, __LINE__);
- + return;
- + }
- + $compiled_ref = "\$_POST";
- + break;
- +
- + case 'cookies':
- + if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
- + $this->_syntax_error("(secure mode) super global access not permitted",
- + E_USER_WARNING, __FILE__, __LINE__);
- + return;
- + }
- + $compiled_ref = "\$_COOKIE";
- + break;
- +
- + case 'env':
- + if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
- + $this->_syntax_error("(secure mode) super global access not permitted",
- + E_USER_WARNING, __FILE__, __LINE__);
- + return;
- + }
- + $compiled_ref = "\$_ENV";
- + break;
- +
- + case 'server':
- + if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
- + $this->_syntax_error("(secure mode) super global access not permitted",
- + E_USER_WARNING, __FILE__, __LINE__);
- + return;
- + }
- + $compiled_ref = "\$_SERVER";
- + break;
- +
- + case 'session':
- + if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
- + $this->_syntax_error("(secure mode) super global access not permitted",
- + E_USER_WARNING, __FILE__, __LINE__);
- + return;
- + }
- + $compiled_ref = "\$_SESSION";
- + break;
- +
- + /*
- + * These cases are handled either at run-time or elsewhere in the
- + * compiler.
- + */
- + case 'request':
- + if ($this->security && !$this->security_settings['ALLOW_SUPER_GLOBALS']) {
- + $this->_syntax_error("(secure mode) super global access not permitted",
- + E_USER_WARNING, __FILE__, __LINE__);
- + return;
- + }
- + if ($this->request_use_auto_globals) {
- + $compiled_ref = "\$_REQUEST";
- + break;
- + } else {
- + $this->_init_smarty_vars = true;
- + }
- + return null;
- +
- + case 'capture':
- + return null;
- +
- + case 'template':
- + $compiled_ref = "'$this->_current_file'";
- + $_max_index = 1;
- + break;
- +
- + case 'version':
- + $compiled_ref = "'$this->_version'";
- + $_max_index = 1;
- + break;
- +
- + case 'const':
- + if ($this->security && !$this->security_settings['ALLOW_CONSTANTS']) {
- + $this->_syntax_error("(secure mode) constants not permitted",
- + E_USER_WARNING, __FILE__, __LINE__);
- + return;
- + }
- + array_shift($indexes);
- + if (preg_match('!^\.\w+$!', $indexes[0])) {
- + $compiled_ref = '@' . substr($indexes[0], 1);
- + } else {
- + $_val = $this->_parse_var_props(substr($indexes[0], 1));
- + $compiled_ref = '@constant(' . $_val . ')';
- + }
- + $_max_index = 1;
- + break;
- +
- + case 'config':
- + $compiled_ref = "\$this->_config[0]['vars']";
- + $_max_index = 3;
- + break;
- +
- + case 'ldelim':
- + $compiled_ref = "'$this->left_delimiter'";
- + break;
- +
- + case 'rdelim':
- + $compiled_ref = "'$this->right_delimiter'";
- + break;
- +
- + default:
- + $this->_syntax_error('$smarty.' . $_ref . ' is an unknown reference', E_USER_ERROR, __FILE__, __LINE__);
- + break;
- + }
- +
- + if (isset($_max_index) && count($indexes) > $_max_index) {
- + $this->_syntax_error('$smarty' . implode('', $indexes) .' is an invalid reference', E_USER_ERROR, __FILE__, __LINE__);
- + }
- +
- + array_shift($indexes);
- + return $compiled_ref;
- + }
- +
- + /**
- + * compiles call to plugin of type $type with name $name
- + * returns a string containing the function-name or method call
- + * without the paramter-list that would have follow to make the
- + * call valid php-syntax
- + *
- + * @param string $type
- + * @param string $name
- + * @return string
- + */
- + function _compile_plugin_call($type, $name) {
- + if (isset($this->_plugins[$type][$name])) {
- + /* plugin loaded */
- + if (is_array($this->_plugins[$type][$name][0])) {
- + return ((is_object($this->_plugins[$type][$name][0][0])) ?
- + "\$this->_plugins['$type']['$name'][0][0]->" /* method callback */
- + : (string)($this->_plugins[$type][$name][0][0]).'::' /* class callback */
- + ). $this->_plugins[$type][$name][0][1];
- +
- + } else {
- + /* function callback */
- + return $this->_plugins[$type][$name][0];
- +
- + }
- + } else {
- + /* plugin not loaded -> auto-loadable-plugin */
- + return 'smarty_'.$type.'_'.$name;
- +
- + }
- + }
- +
- + /**
- + * load pre- and post-filters
- + */
- + function _load_filters()
- + {
- + if (count($this->_plugins['prefilter']) > 0) {
- + foreach ($this->_plugins['prefilter'] as $filter_name => $prefilter) {
- + if ($prefilter === false) {
- + unset($this->_plugins['prefilter'][$filter_name]);
- + $_params = array('plugins' => array(array('prefilter', $filter_name, null, null, false)));
- + require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
- + smarty_core_load_plugins($_params, $this);
- + }
- + }
- + }
- + if (count($this->_plugins['postfilter']) > 0) {
- + foreach ($this->_plugins['postfilter'] as $filter_name => $postfilter) {
- + if ($postfilter === false) {
- + unset($this->_plugins['postfilter'][$filter_name]);
- + $_params = array('plugins' => array(array('postfilter', $filter_name, null, null, false)));
- + require_once(SMARTY_CORE_DIR . 'core.load_plugins.php');
- + smarty_core_load_plugins($_params, $this);
- + }
- + }
- + }
- + }
- +
- +
- + /**
- + * Quote subpattern references
- + *
- + * @param string $string
- + * @return string
- + */
- + function _quote_replace($string)
- + {
- + return strtr($string, array('\\' => '\\\\', '$' => '\\$'));
- + }
- +
- + /**
- + * display Smarty syntax error
- + *
- + * @param string $error_msg
- + * @param integer $error_type
- + * @param string $file
- + * @param integer $line
- + */
- + function _syntax_error($error_msg, $error_type = E_USER_ERROR, $file=null, $line=null)
- + {
- + $this->_trigger_fatal_error("syntax error: $error_msg", $this->_current_file, $this->_current_line_no, $file, $line, $error_type);
- + }
- +
- +
- + /**
- + * check if the compilation changes from cacheable to
- + * non-cacheable state with the beginning of the current
- + * plugin. return php-code to reflect the transition.
- + * @return string
- + */
- + function _push_cacheable_state($type, $name) {
- + $_cacheable = !isset($this->_plugins[$type][$name]) || $this->_plugins[$type][$name][4];
- + if ($_cacheable
- + || 0<$this->_cacheable_state++) return '';
- + if (!isset($this->_cache_serial)) $this->_cache_serial = md5(uniqid('Smarty'));
- + $_ret = 'if ($this->caching && !$this->_cache_including): echo \'{nocache:'
- + . $this->_cache_serial . '#' . $this->_nocache_count
- + . '}\'; endif;';
- + return $_ret;
- + }
- +
- +
- + /**
- + * check if the compilation changes from non-cacheable to
- + * cacheable state with the end of the current plugin return
- + * php-code to reflect the transition.
- + * @return string
- + */
- + function _pop_cacheable_state($type, $name) {
- + $_cacheable = !isset($this->_plugins[$type][$name]) || $this->_plugins[$type][$name][4];
- + if ($_cacheable
- + || --$this->_cacheable_state>0) return '';
- + return 'if ($this->caching && !$this->_cache_including): echo \'{/nocache:'
- + . $this->_cache_serial . '#' . ($this->_nocache_count++)
- + . '}\'; endif;';
- + }
- +
- +
- + /**
- + * push opening tag-name, file-name and line-number on the tag-stack
- + * @param string the opening tag's name
- + */
- + function _push_tag($open_tag)
- + {
- + array_push($this->_tag_stack, array($open_tag, $this->_current_line_no));
- + }
- +
- + /**
- + * pop closing tag-name
- + * raise an error if this stack-top doesn't match with the closing tag
- + * @param string the closing tag's name
- + * @return string the opening tag's name
- + */
- + function _pop_tag($close_tag)
- + {
- + $message = '';
- + if (count($this->_tag_stack)>0) {
- + list($_open_tag, $_line_no) = array_pop($this->_tag_stack);
- + if ($close_tag == $_open_tag) {
- + return $_open_tag;
- + }
- + if ($close_tag == 'if' && ($_open_tag == 'else' || $_open_tag == 'elseif' )) {
- + return $this->_pop_tag($close_tag);
- + }
- + if ($close_tag == 'section' && $_open_tag == 'sectionelse') {
- + $this->_pop_tag($close_tag);
- + return $_open_tag;
- + }
- + if ($close_tag == 'foreach' && $_open_tag == 'foreachelse') {
- + $this->_pop_tag($close_tag);
- + return $_open_tag;
- + }
- + if ($_open_tag == 'else' || $_open_tag == 'elseif') {
- + $_open_tag = 'if';
- + } elseif ($_open_tag == 'sectionelse') {
- + $_open_tag = 'section';
- + } elseif ($_open_tag == 'foreachelse') {
- + $_open_tag = 'foreach';
- + }
- + $message = " expected {/$_open_tag} (opened line $_line_no).";
- + }
- + $this->_syntax_error("mismatched tag {/$close_tag}.$message",
- + E_USER_ERROR, __FILE__, __LINE__);
- + }
- +
- +}
- +
- +/**
- + * compare to values by their string length
- + *
- + * @access private
- + * @param string $a
- + * @param string $b
- + * @return 0|-1|1
- + */
- +function _smarty_sort_length($a, $b)
- +{
- + if($a == $b)
- + return 0;
- +
- + if(strlen($a) == strlen($b))
- + return ($a > $b) ? -1 : 1;
- +
- + return (strlen($a) > strlen($b)) ? -1 : 1;
- +}
- +
- +
- +/* vim: set et: */
- +
- +?>
- diff --git a/library/smarty/debug.tpl b/library/smarty/debug.tpl
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/debug.tpl
- @@ -0,0 +1,157 @@
- +{* Smarty *}
- +{* debug.tpl, last updated version 2.1.0 *}
- +{assign_debug_info}
- +{capture assign=debug_output}
- +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
- +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
- +<head>
- + <title>Smarty Debug Console</title>
- +{literal}
- +<style type="text/css">
- +/* <![CDATA[ */
- +body, h1, h2, td, th, p {
- + font-family: sans-serif;
- + font-weight: normal;
- + font-size: 0.9em;
- + margin: 1px;
- + padding: 0;
- +}
- +
- +h1 {
- + margin: 0;
- + text-align: left;
- + padding: 2px;
- + background-color: #f0c040;
- + color: black;
- + font-weight: bold;
- + font-size: 1.2em;
- + }
- +
- +h2 {
- + background-color: #9B410E;
- + color: white;
- + text-align: left;
- + font-weight: bold;
- + padding: 2px;
- + border-top: 1px solid black;
- +}
- +
- +body {
- + background: black;
- +}
- +
- +p, table, div {
- + background: #f0ead8;
- +}
- +
- +p {
- + margin: 0;
- + font-style: italic;
- + text-align: center;
- +}
- +
- +table {
- + width: 100%;
- +}
- +
- +th, td {
- + font-family: monospace;
- + vertical-align: top;
- + text-align: left;
- + width: 50%;
- +}
- +
- +td {
- + color: green;
- +}
- +
- +.odd {
- + background-color: #eeeeee;
- +}
- +
- +.even {
- + background-color: #fafafa;
- +}
- +
- +.exectime {
- + font-size: 0.8em;
- + font-style: italic;
- +}
- +
- +#table_assigned_vars th {
- + color: blue;
- +}
- +
- +#table_config_vars th {
- + color: maroon;
- +}
- +/* ]]> */
- +</style>
- +{/literal}
- +</head>
- +<body>
- +
- +<h1>Smarty Debug Console</h1>
- +
- +<h2>included templates & config files (load time in seconds)</h2>
- +
- +<div>
- +{section name=templates loop=$_debug_tpls}
- + {section name=indent loop=$_debug_tpls[templates].depth} {/section}
- + <font color={if $_debug_tpls[templates].type eq "template"}brown{elseif $_debug_tpls[templates].type eq "insert"}black{else}green{/if}>
- + {$_debug_tpls[templates].filename|escape:html}</font>
- + {if isset($_debug_tpls[templates].exec_time)}
- + <span class="exectime">
- + ({$_debug_tpls[templates].exec_time|string_format:"%.5f"})
- + {if %templates.index% eq 0}(total){/if}
- + </span>
- + {/if}
- + <br />
- +{sectionelse}
- + <p>no templates included</p>
- +{/section}
- +</div>
- +
- +<h2>assigned template variables</h2>
- +
- +<table id="table_assigned_vars">
- + {section name=vars loop=$_debug_keys}
- + <tr class="{cycle values="odd,even"}">
- + <th>{ldelim}${$_debug_keys[vars]|escape:'html'}{rdelim}</th>
- + <td>{$_debug_vals[vars]|@debug_print_var}</td></tr>
- + {sectionelse}
- + <tr><td><p>no template variables assigned</p></td></tr>
- + {/section}
- +</table>
- +
- +<h2>assigned config file variables (outer template scope)</h2>
- +
- +<table id="table_config_vars">
- + {section name=config_vars loop=$_debug_config_keys}
- + <tr class="{cycle values="odd,even"}">
- + <th>{ldelim}#{$_debug_config_keys[config_vars]|escape:'html'}#{rdelim}</th>
- + <td>{$_debug_config_vals[config_vars]|@debug_print_var}</td></tr>
- + {sectionelse}
- + <tr><td><p>no config vars assigned</p></td></tr>
- + {/section}
- +</table>
- +</body>
- +</html>
- +{/capture}
- +{if isset($_smarty_debug_output) and $_smarty_debug_output eq "html"}
- + {$debug_output}
- +{else}
- +<script type="text/javascript">
- +// <![CDATA[
- + if ( self.name == '' ) {ldelim}
- + var title = 'Console';
- + {rdelim}
- + else {ldelim}
- + var title = 'Console_' + self.name;
- + {rdelim}
- + _smarty_console = window.open("",title.value,"width=680,height=600,resizable,scrollbars=yes");
- + _smarty_console.document.write('{$debug_output|escape:'javascript'}');
- + _smarty_console.document.close();
- +// ]]>
- +</script>
- +{/if}
- \ No newline at end of file
- diff --git a/library/smarty/internals/core.assemble_plugin_filepath.php b/library/smarty/internals/core.assemble_plugin_filepath.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.assemble_plugin_filepath.php
- @@ -0,0 +1,67 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * assemble filepath of requested plugin
- + *
- + * @param string $type
- + * @param string $name
- + * @return string|false
- + */
- +function smarty_core_assemble_plugin_filepath($params, &$smarty)
- +{
- + static $_filepaths_cache = array();
- +
- + $_plugin_filename = $params['type'] . '.' . $params['name'] . '.php';
- + if (isset($_filepaths_cache[$_plugin_filename])) {
- + return $_filepaths_cache[$_plugin_filename];
- + }
- + $_return = false;
- +
- + foreach ((array)$smarty->plugins_dir as $_plugin_dir) {
- +
- + $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename;
- +
- + // see if path is relative
- + if (!preg_match("/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/", $_plugin_dir)) {
- + $_relative_paths[] = $_plugin_dir;
- + // relative path, see if it is in the SMARTY_DIR
- + if (@is_readable(SMARTY_DIR . $_plugin_filepath)) {
- + $_return = SMARTY_DIR . $_plugin_filepath;
- + break;
- + }
- + }
- + // try relative to cwd (or absolute)
- + if (@is_readable($_plugin_filepath)) {
- + $_return = $_plugin_filepath;
- + break;
- + }
- + }
- +
- + if($_return === false) {
- + // still not found, try PHP include_path
- + if(isset($_relative_paths)) {
- + foreach ((array)$_relative_paths as $_plugin_dir) {
- +
- + $_plugin_filepath = $_plugin_dir . DIRECTORY_SEPARATOR . $_plugin_filename;
- +
- + $_params = array('file_path' => $_plugin_filepath);
- + require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
- + if(smarty_core_get_include_path($_params, $smarty)) {
- + $_return = $_params['new_file_path'];
- + break;
- + }
- + }
- + }
- + }
- + $_filepaths_cache[$_plugin_filename] = $_return;
- + return $_return;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.assign_smarty_interface.php b/library/smarty/internals/core.assign_smarty_interface.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.assign_smarty_interface.php
- @@ -0,0 +1,43 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Smarty assign_smarty_interface core plugin
- + *
- + * Type: core<br>
- + * Name: assign_smarty_interface<br>
- + * Purpose: assign the $smarty interface variable
- + * @param array Format: null
- + * @param Smarty
- + */
- +function smarty_core_assign_smarty_interface($params, &$smarty)
- +{
- + if (isset($smarty->_smarty_vars) && isset($smarty->_smarty_vars['request'])) {
- + return;
- + }
- +
- + $_globals_map = array('g' => 'HTTP_GET_VARS',
- + 'p' => 'HTTP_POST_VARS',
- + 'c' => 'HTTP_COOKIE_VARS',
- + 's' => 'HTTP_SERVER_VARS',
- + 'e' => 'HTTP_ENV_VARS');
- +
- + $_smarty_vars_request = array();
- +
- + foreach (preg_split('!!', strtolower($smarty->request_vars_order)) as $_c) {
- + if (isset($_globals_map[$_c])) {
- + $_smarty_vars_request = array_merge($_smarty_vars_request, $GLOBALS[$_globals_map[$_c]]);
- + }
- + }
- + $_smarty_vars_request = @array_merge($_smarty_vars_request, $GLOBALS['HTTP_SESSION_VARS']);
- +
- + $smarty->_smarty_vars['request'] = $_smarty_vars_request;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.create_dir_structure.php b/library/smarty/internals/core.create_dir_structure.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.create_dir_structure.php
- @@ -0,0 +1,79 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * create full directory structure
- + *
- + * @param string $dir
- + */
- +
- +// $dir
- +
- +function smarty_core_create_dir_structure($params, &$smarty)
- +{
- + if (!file_exists($params['dir'])) {
- + $_open_basedir_ini = ini_get('open_basedir');
- +
- + if (DIRECTORY_SEPARATOR=='/') {
- + /* unix-style paths */
- + $_dir = $params['dir'];
- + $_dir_parts = preg_split('!/+!', $_dir, -1, PREG_SPLIT_NO_EMPTY);
- + $_new_dir = (substr($_dir, 0, 1)=='/') ? '/' : getcwd().'/';
- + if($_use_open_basedir = !empty($_open_basedir_ini)) {
- + $_open_basedirs = explode(':', $_open_basedir_ini);
- + }
- +
- + } else {
- + /* other-style paths */
- + $_dir = str_replace('\\','/', $params['dir']);
- + $_dir_parts = preg_split('!/+!', $_dir, -1, PREG_SPLIT_NO_EMPTY);
- + if (preg_match('!^((//)|([a-zA-Z]:/))!', $_dir, $_root_dir)) {
- + /* leading "//" for network volume, or "[letter]:/" for full path */
- + $_new_dir = $_root_dir[1];
- + /* remove drive-letter from _dir_parts */
- + if (isset($_root_dir[3])) array_shift($_dir_parts);
- +
- + } else {
- + $_new_dir = str_replace('\\', '/', getcwd()).'/';
- +
- + }
- +
- + if($_use_open_basedir = !empty($_open_basedir_ini)) {
- + $_open_basedirs = explode(';', str_replace('\\', '/', $_open_basedir_ini));
- + }
- +
- + }
- +
- + /* all paths use "/" only from here */
- + foreach ($_dir_parts as $_dir_part) {
- + $_new_dir .= $_dir_part;
- +
- + if ($_use_open_basedir) {
- + // do not attempt to test or make directories outside of open_basedir
- + $_make_new_dir = false;
- + foreach ($_open_basedirs as $_open_basedir) {
- + if (substr($_new_dir, 0, strlen($_open_basedir)) == $_open_basedir) {
- + $_make_new_dir = true;
- + break;
- + }
- + }
- + } else {
- + $_make_new_dir = true;
- + }
- +
- + if ($_make_new_dir && !file_exists($_new_dir) && !@mkdir($_new_dir, $smarty->_dir_perms) && !is_dir($_new_dir)) {
- + $smarty->trigger_error("problem creating directory '" . $_new_dir . "'");
- + return false;
- + }
- + $_new_dir .= '/';
- + }
- + }
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.display_debug_console.php b/library/smarty/internals/core.display_debug_console.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.display_debug_console.php
- @@ -0,0 +1,61 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Smarty debug_console function plugin
- + *
- + * Type: core<br>
- + * Name: display_debug_console<br>
- + * Purpose: display the javascript debug console window
- + * @param array Format: null
- + * @param Smarty
- + */
- +function smarty_core_display_debug_console($params, &$smarty)
- +{
- + // we must force compile the debug template in case the environment
- + // changed between separate applications.
- +
- + if(empty($smarty->debug_tpl)) {
- + // set path to debug template from SMARTY_DIR
- + $smarty->debug_tpl = SMARTY_DIR . 'debug.tpl';
- + if($smarty->security && is_file($smarty->debug_tpl)) {
- + $smarty->secure_dir[] = realpath($smarty->debug_tpl);
- + }
- + $smarty->debug_tpl = 'file:' . SMARTY_DIR . 'debug.tpl';
- + }
- +
- + $_ldelim_orig = $smarty->left_delimiter;
- + $_rdelim_orig = $smarty->right_delimiter;
- +
- + $smarty->left_delimiter = '{';
- + $smarty->right_delimiter = '}';
- +
- + $_compile_id_orig = $smarty->_compile_id;
- + $smarty->_compile_id = null;
- +
- + $_compile_path = $smarty->_get_compile_path($smarty->debug_tpl);
- + if ($smarty->_compile_resource($smarty->debug_tpl, $_compile_path))
- + {
- + ob_start();
- + $smarty->_include($_compile_path);
- + $_results = ob_get_contents();
- + ob_end_clean();
- + } else {
- + $_results = '';
- + }
- +
- + $smarty->_compile_id = $_compile_id_orig;
- +
- + $smarty->left_delimiter = $_ldelim_orig;
- + $smarty->right_delimiter = $_rdelim_orig;
- +
- + return $_results;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.get_include_path.php b/library/smarty/internals/core.get_include_path.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.get_include_path.php
- @@ -0,0 +1,44 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Get path to file from include_path
- + *
- + * @param string $file_path
- + * @param string $new_file_path
- + * @return boolean
- + * @staticvar array|null
- + */
- +
- +// $file_path, &$new_file_path
- +
- +function smarty_core_get_include_path(&$params, &$smarty)
- +{
- + static $_path_array = null;
- +
- + if(!isset($_path_array)) {
- + $_ini_include_path = ini_get('include_path');
- +
- + if(strstr($_ini_include_path,';')) {
- + // windows pathnames
- + $_path_array = explode(';',$_ini_include_path);
- + } else {
- + $_path_array = explode(':',$_ini_include_path);
- + }
- + }
- + foreach ($_path_array as $_include_path) {
- + if (@is_readable($_include_path . DIRECTORY_SEPARATOR . $params['file_path'])) {
- + $params['new_file_path'] = $_include_path . DIRECTORY_SEPARATOR . $params['file_path'];
- + return true;
- + }
- + }
- + return false;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.get_microtime.php b/library/smarty/internals/core.get_microtime.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.get_microtime.php
- @@ -0,0 +1,23 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Get seconds and microseconds
- + * @return double
- + */
- +function smarty_core_get_microtime($params, &$smarty)
- +{
- + $mtime = microtime();
- + $mtime = explode(" ", $mtime);
- + $mtime = (double)($mtime[1]) + (double)($mtime[0]);
- + return ($mtime);
- +}
- +
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.get_php_resource.php b/library/smarty/internals/core.get_php_resource.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.get_php_resource.php
- @@ -0,0 +1,80 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Retrieves PHP script resource
- + *
- + * sets $php_resource to the returned resource
- + * @param string $resource
- + * @param string $resource_type
- + * @param $php_resource
- + * @return boolean
- + */
- +
- +function smarty_core_get_php_resource(&$params, &$smarty)
- +{
- +
- + $params['resource_base_path'] = $smarty->trusted_dir;
- + $smarty->_parse_resource_name($params, $smarty);
- +
- + /*
- + * Find out if the resource exists.
- + */
- +
- + if ($params['resource_type'] == 'file') {
- + $_readable = false;
- + if(file_exists($params['resource_name']) && is_readable($params['resource_name'])) {
- + $_readable = true;
- + } else {
- + // test for file in include_path
- + $_params = array('file_path' => $params['resource_name']);
- + require_once(SMARTY_CORE_DIR . 'core.get_include_path.php');
- + if(smarty_core_get_include_path($_params, $smarty)) {
- + $_include_path = $_params['new_file_path'];
- + $_readable = true;
- + }
- + }
- + } else if ($params['resource_type'] != 'file') {
- + $_template_source = null;
- + $_readable = is_callable($smarty->_plugins['resource'][$params['resource_type']][0][0])
- + && call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][0],
- + array($params['resource_name'], &$_template_source, &$smarty));
- + }
- +
- + /*
- + * Set the error function, depending on which class calls us.
- + */
- + if (method_exists($smarty, '_syntax_error')) {
- + $_error_funcc = '_syntax_error';
- + } else {
- + $_error_funcc = 'trigger_error';
- + }
- +
- + if ($_readable) {
- + if ($smarty->security) {
- + require_once(SMARTY_CORE_DIR . 'core.is_trusted.php');
- + if (!smarty_core_is_trusted($params, $smarty)) {
- + $smarty->$_error_funcc('(secure mode) ' . $params['resource_type'] . ':' . $params['resource_name'] . ' is not trusted');
- + return false;
- + }
- + }
- + } else {
- + $smarty->$_error_funcc($params['resource_type'] . ':' . $params['resource_name'] . ' is not readable');
- + return false;
- + }
- +
- + if ($params['resource_type'] == 'file') {
- + $params['php_resource'] = $params['resource_name'];
- + } else {
- + $params['php_resource'] = $_template_source;
- + }
- + return true;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.is_secure.php b/library/smarty/internals/core.is_secure.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.is_secure.php
- @@ -0,0 +1,59 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * determines if a resource is secure or not.
- + *
- + * @param string $resource_type
- + * @param string $resource_name
- + * @return boolean
- + */
- +
- +// $resource_type, $resource_name
- +
- +function smarty_core_is_secure($params, &$smarty)
- +{
- + if (!$smarty->security || $smarty->security_settings['INCLUDE_ANY']) {
- + return true;
- + }
- +
- + if ($params['resource_type'] == 'file') {
- + $_rp = realpath($params['resource_name']);
- + if (isset($params['resource_base_path'])) {
- + foreach ((array)$params['resource_base_path'] as $curr_dir) {
- + if ( ($_cd = realpath($curr_dir)) !== false &&
- + strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
- + substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) {
- + return true;
- + }
- + }
- + }
- + if (!empty($smarty->secure_dir)) {
- + foreach ((array)$smarty->secure_dir as $curr_dir) {
- + if ( ($_cd = realpath($curr_dir)) !== false) {
- + if($_cd == $_rp) {
- + return true;
- + } elseif (strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
- + substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR) {
- + return true;
- + }
- + }
- + }
- + }
- + } else {
- + // resource is not on local file system
- + return call_user_func_array(
- + $smarty->_plugins['resource'][$params['resource_type']][0][2],
- + array($params['resource_name'], &$smarty));
- + }
- +
- + return false;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.is_trusted.php b/library/smarty/internals/core.is_trusted.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.is_trusted.php
- @@ -0,0 +1,47 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * determines if a resource is trusted or not
- + *
- + * @param string $resource_type
- + * @param string $resource_name
- + * @return boolean
- + */
- +
- + // $resource_type, $resource_name
- +
- +function smarty_core_is_trusted($params, &$smarty)
- +{
- + $_smarty_trusted = false;
- + if ($params['resource_type'] == 'file') {
- + if (!empty($smarty->trusted_dir)) {
- + $_rp = realpath($params['resource_name']);
- + foreach ((array)$smarty->trusted_dir as $curr_dir) {
- + if (!empty($curr_dir) && is_readable ($curr_dir)) {
- + $_cd = realpath($curr_dir);
- + if (strncmp($_rp, $_cd, strlen($_cd)) == 0
- + && substr($_rp, strlen($_cd), 1) == DIRECTORY_SEPARATOR ) {
- + $_smarty_trusted = true;
- + break;
- + }
- + }
- + }
- + }
- +
- + } else {
- + // resource is not on local file system
- + $_smarty_trusted = call_user_func_array($smarty->_plugins['resource'][$params['resource_type']][0][3],
- + array($params['resource_name'], $smarty));
- + }
- +
- + return $_smarty_trusted;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.load_plugins.php b/library/smarty/internals/core.load_plugins.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.load_plugins.php
- @@ -0,0 +1,125 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Load requested plugins
- + *
- + * @param array $plugins
- + */
- +
- +// $plugins
- +
- +function smarty_core_load_plugins($params, &$smarty)
- +{
- +
- + foreach ($params['plugins'] as $_plugin_info) {
- + list($_type, $_name, $_tpl_file, $_tpl_line, $_delayed_loading) = $_plugin_info;
- + $_plugin = &$smarty->_plugins[$_type][$_name];
- +
- + /*
- + * We do not load plugin more than once for each instance of Smarty.
- + * The following code checks for that. The plugin can also be
- + * registered dynamically at runtime, in which case template file
- + * and line number will be unknown, so we fill them in.
- + *
- + * The final element of the info array is a flag that indicates
- + * whether the dynamically registered plugin function has been
- + * checked for existence yet or not.
- + */
- + if (isset($_plugin)) {
- + if (empty($_plugin[3])) {
- + if (!is_callable($_plugin[0])) {
- + $smarty->_trigger_fatal_error("[plugin] $_type '$_name' is not implemented", $_tpl_file, $_tpl_line, __FILE__, __LINE__);
- + } else {
- + $_plugin[1] = $_tpl_file;
- + $_plugin[2] = $_tpl_line;
- + $_plugin[3] = true;
- + if (!isset($_plugin[4])) $_plugin[4] = true; /* cacheable */
- + }
- + }
- + continue;
- + } else if ($_type == 'insert') {
- + /*
- + * For backwards compatibility, we check for insert functions in
- + * the symbol table before trying to load them as a plugin.
- + */
- + $_plugin_func = 'insert_' . $_name;
- + if (function_exists($_plugin_func)) {
- + $_plugin = array($_plugin_func, $_tpl_file, $_tpl_line, true, false);
- + continue;
- + }
- + }
- +
- + $_plugin_file = $smarty->_get_plugin_filepath($_type, $_name);
- +
- + if (! $_found = ($_plugin_file != false)) {
- + $_message = "could not load plugin file '$_type.$_name.php'\n";
- + }
- +
- + /*
- + * If plugin file is found, it -must- provide the properly named
- + * plugin function. In case it doesn't, simply output the error and
- + * do not fall back on any other method.
- + */
- + if ($_found) {
- + include_once $_plugin_file;
- +
- + $_plugin_func = 'smarty_' . $_type . '_' . $_name;
- + if (!function_exists($_plugin_func)) {
- + $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", $_tpl_file, $_tpl_line, __FILE__, __LINE__);
- + continue;
- + }
- + }
- + /*
- + * In case of insert plugins, their code may be loaded later via
- + * 'script' attribute.
- + */
- + else if ($_type == 'insert' && $_delayed_loading) {
- + $_plugin_func = 'smarty_' . $_type . '_' . $_name;
- + $_found = true;
- + }
- +
- + /*
- + * Plugin specific processing and error checking.
- + */
- + if (!$_found) {
- + if ($_type == 'modifier') {
- + /*
- + * In case modifier falls back on using PHP functions
- + * directly, we only allow those specified in the security
- + * context.
- + */
- + if ($smarty->security && !in_array($_name, $smarty->security_settings['MODIFIER_FUNCS'])) {
- + $_message = "(secure mode) modifier '$_name' is not allowed";
- + } else {
- + if (!function_exists($_name)) {
- + $_message = "modifier '$_name' is not implemented";
- + } else {
- + $_plugin_func = $_name;
- + $_found = true;
- + }
- + }
- + } else if ($_type == 'function') {
- + /*
- + * This is a catch-all situation.
- + */
- + $_message = "unknown tag - '$_name'";
- + }
- + }
- +
- + if ($_found) {
- + $smarty->_plugins[$_type][$_name] = array($_plugin_func, $_tpl_file, $_tpl_line, true, true);
- + } else {
- + // output error
- + $smarty->_trigger_fatal_error('[plugin] ' . $_message, $_tpl_file, $_tpl_line, __FILE__, __LINE__);
- + }
- + }
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.load_resource_plugin.php b/library/smarty/internals/core.load_resource_plugin.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.load_resource_plugin.php
- @@ -0,0 +1,74 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * load a resource plugin
- + *
- + * @param string $type
- + */
- +
- +// $type
- +
- +function smarty_core_load_resource_plugin($params, &$smarty)
- +{
- + /*
- + * Resource plugins are not quite like the other ones, so they are
- + * handled differently. The first element of plugin info is the array of
- + * functions provided by the plugin, the second one indicates whether
- + * all of them exist or not.
- + */
- +
- + $_plugin = &$smarty->_plugins['resource'][$params['type']];
- + if (isset($_plugin)) {
- + if (!$_plugin[1] && count($_plugin[0])) {
- + $_plugin[1] = true;
- + foreach ($_plugin[0] as $_plugin_func) {
- + if (!is_callable($_plugin_func)) {
- + $_plugin[1] = false;
- + break;
- + }
- + }
- + }
- +
- + if (!$_plugin[1]) {
- + $smarty->_trigger_fatal_error("[plugin] resource '" . $params['type'] . "' is not implemented", null, null, __FILE__, __LINE__);
- + }
- +
- + return;
- + }
- +
- + $_plugin_file = $smarty->_get_plugin_filepath('resource', $params['type']);
- + $_found = ($_plugin_file != false);
- +
- + if ($_found) { /*
- + * If the plugin file is found, it -must- provide the properly named
- + * plugin functions.
- + */
- + include_once($_plugin_file);
- +
- + /*
- + * Locate functions that we require the plugin to provide.
- + */
- + $_resource_ops = array('source', 'timestamp', 'secure', 'trusted');
- + $_resource_funcs = array();
- + foreach ($_resource_ops as $_op) {
- + $_plugin_func = 'smarty_resource_' . $params['type'] . '_' . $_op;
- + if (!function_exists($_plugin_func)) {
- + $smarty->_trigger_fatal_error("[plugin] function $_plugin_func() not found in $_plugin_file", null, null, __FILE__, __LINE__);
- + return;
- + } else {
- + $_resource_funcs[] = $_plugin_func;
- + }
- + }
- +
- + $smarty->_plugins['resource'][$params['type']] = array($_resource_funcs, true);
- + }
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.process_cached_inserts.php b/library/smarty/internals/core.process_cached_inserts.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.process_cached_inserts.php
- @@ -0,0 +1,71 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Replace cached inserts with the actual results
- + *
- + * @param string $results
- + * @return string
- + */
- +function smarty_core_process_cached_inserts($params, &$smarty)
- +{
- + preg_match_all('!'.$smarty->_smarty_md5.'{insert_cache (.*)}'.$smarty->_smarty_md5.'!Uis',
- + $params['results'], $match);
- + list($cached_inserts, $insert_args) = $match;
- +
- + for ($i = 0, $for_max = count($cached_inserts); $i < $for_max; $i++) {
- + if ($smarty->debugging) {
- + $_params = array();
- + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- + $debug_start_time = smarty_core_get_microtime($_params, $smarty);
- + }
- +
- + $args = unserialize($insert_args[$i]);
- + $name = $args['name'];
- +
- + if (isset($args['script'])) {
- + $_params = array('resource_name' => $smarty->_dequote($args['script']));
- + require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
- + if(!smarty_core_get_php_resource($_params, $smarty)) {
- + return false;
- + }
- + $resource_type = $_params['resource_type'];
- + $php_resource = $_params['php_resource'];
- +
- +
- + if ($resource_type == 'file') {
- + $smarty->_include($php_resource, true);
- + } else {
- + $smarty->_eval($php_resource);
- + }
- + }
- +
- + $function_name = $smarty->_plugins['insert'][$name][0];
- + if (empty($args['assign'])) {
- + $replace = $function_name($args, $smarty);
- + } else {
- + $smarty->assign($args['assign'], $function_name($args, $smarty));
- + $replace = '';
- + }
- +
- + $params['results'] = substr_replace($params['results'], $replace, strpos($params['results'], $cached_inserts[$i]), strlen($cached_inserts[$i]));
- + if ($smarty->debugging) {
- + $_params = array();
- + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- + $smarty->_smarty_debug_info[] = array('type' => 'insert',
- + 'filename' => 'insert_'.$name,
- + 'depth' => $smarty->_inclusion_depth,
- + 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $debug_start_time);
- + }
- + }
- +
- + return $params['results'];
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.process_compiled_include.php b/library/smarty/internals/core.process_compiled_include.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.process_compiled_include.php
- @@ -0,0 +1,37 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Replace nocache-tags by results of the corresponding non-cacheable
- + * functions and return it
- + *
- + * @param string $compiled_tpl
- + * @param string $cached_source
- + * @return string
- + */
- +
- +function smarty_core_process_compiled_include($params, &$smarty)
- +{
- + $_cache_including = $smarty->_cache_including;
- + $smarty->_cache_including = true;
- +
- + $_return = $params['results'];
- +
- + foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) {
- + $smarty->_include($_include_file_path, true);
- + }
- +
- + foreach ($smarty->_cache_info['cache_serials'] as $_include_file_path=>$_cache_serial) {
- + $_return = preg_replace_callback('!(\{nocache\:('.$_cache_serial.')#(\d+)\})!s',
- + array(&$smarty, '_process_compiled_include_callback'),
- + $_return);
- + }
- + $smarty->_cache_including = $_cache_including;
- + return $_return;
- +}
- +
- +?>
- diff --git a/library/smarty/internals/core.read_cache_file.php b/library/smarty/internals/core.read_cache_file.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.read_cache_file.php
- @@ -0,0 +1,101 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * read a cache file, determine if it needs to be
- + * regenerated or not
- + *
- + * @param string $tpl_file
- + * @param string $cache_id
- + * @param string $compile_id
- + * @param string $results
- + * @return boolean
- + */
- +
- +// $tpl_file, $cache_id, $compile_id, &$results
- +
- +function smarty_core_read_cache_file(&$params, &$smarty)
- +{
- + static $content_cache = array();
- +
- + if ($smarty->force_compile) {
- + // force compile enabled, always regenerate
- + return false;
- + }
- +
- + if (isset($content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']])) {
- + list($params['results'], $smarty->_cache_info) = $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']];
- + return true;
- + }
- +
- + if (!empty($smarty->cache_handler_func)) {
- + // use cache_handler function
- + call_user_func_array($smarty->cache_handler_func,
- + array('read', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], null));
- + } else {
- + // use local cache file
- + $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']);
- + $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id);
- + $params['results'] = $smarty->_read_file($_cache_file);
- + }
- +
- + if (empty($params['results'])) {
- + // nothing to parse (error?), regenerate cache
- + return false;
- + }
- +
- + $_contents = $params['results'];
- + $_info_start = strpos($_contents, "\n") + 1;
- + $_info_len = (int)substr($_contents, 0, $_info_start - 1);
- + $_cache_info = unserialize(substr($_contents, $_info_start, $_info_len));
- + $params['results'] = substr($_contents, $_info_start + $_info_len);
- +
- + if ($smarty->caching == 2 && isset ($_cache_info['expires'])){
- + // caching by expiration time
- + if ($_cache_info['expires'] > -1 && (time() > $_cache_info['expires'])) {
- + // cache expired, regenerate
- + return false;
- + }
- + } else {
- + // caching by lifetime
- + if ($smarty->cache_lifetime > -1 && (time() - $_cache_info['timestamp'] > $smarty->cache_lifetime)) {
- + // cache expired, regenerate
- + return false;
- + }
- + }
- +
- + if ($smarty->compile_check) {
- + $_params = array('get_source' => false, 'quiet'=>true);
- + foreach (array_keys($_cache_info['template']) as $_template_dep) {
- + $_params['resource_name'] = $_template_dep;
- + if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) {
- + // template file has changed, regenerate cache
- + return false;
- + }
- + }
- +
- + if (isset($_cache_info['config'])) {
- + $_params = array('resource_base_path' => $smarty->config_dir, 'get_source' => false, 'quiet'=>true);
- + foreach (array_keys($_cache_info['config']) as $_config_dep) {
- + $_params['resource_name'] = $_config_dep;
- + if (!$smarty->_fetch_resource_info($_params) || $_cache_info['timestamp'] < $_params['resource_timestamp']) {
- + // config file has changed, regenerate cache
- + return false;
- + }
- + }
- + }
- + }
- +
- + $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']] = array($params['results'], $_cache_info);
- +
- + $smarty->_cache_info = $_cache_info;
- + return true;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.rm_auto.php b/library/smarty/internals/core.rm_auto.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.rm_auto.php
- @@ -0,0 +1,71 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * delete an automagically created file by name and id
- + *
- + * @param string $auto_base
- + * @param string $auto_source
- + * @param string $auto_id
- + * @param integer $exp_time
- + * @return boolean
- + */
- +
- +// $auto_base, $auto_source = null, $auto_id = null, $exp_time = null
- +
- +function smarty_core_rm_auto($params, &$smarty)
- +{
- + if (!@is_dir($params['auto_base']))
- + return false;
- +
- + if(!isset($params['auto_id']) && !isset($params['auto_source'])) {
- + $_params = array(
- + 'dirname' => $params['auto_base'],
- + 'level' => 0,
- + 'exp_time' => $params['exp_time']
- + );
- + require_once(SMARTY_CORE_DIR . 'core.rmdir.php');
- + $_res = smarty_core_rmdir($_params, $smarty);
- + } else {
- + $_tname = $smarty->_get_auto_filename($params['auto_base'], $params['auto_source'], $params['auto_id']);
- +
- + if(isset($params['auto_source'])) {
- + if (isset($params['extensions'])) {
- + $_res = false;
- + foreach ((array)$params['extensions'] as $_extension)
- + $_res |= $smarty->_unlink($_tname.$_extension, $params['exp_time']);
- + } else {
- + $_res = $smarty->_unlink($_tname, $params['exp_time']);
- + }
- + } elseif ($smarty->use_sub_dirs) {
- + $_params = array(
- + 'dirname' => $_tname,
- + 'level' => 1,
- + 'exp_time' => $params['exp_time']
- + );
- + require_once(SMARTY_CORE_DIR . 'core.rmdir.php');
- + $_res = smarty_core_rmdir($_params, $smarty);
- + } else {
- + // remove matching file names
- + $_handle = opendir($params['auto_base']);
- + $_res = true;
- + while (false !== ($_filename = readdir($_handle))) {
- + if($_filename == '.' || $_filename == '..') {
- + continue;
- + } elseif (substr($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, 0, strlen($_tname)) == $_tname) {
- + $_res &= (bool)$smarty->_unlink($params['auto_base'] . DIRECTORY_SEPARATOR . $_filename, $params['exp_time']);
- + }
- + }
- + }
- + }
- +
- + return $_res;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.rmdir.php b/library/smarty/internals/core.rmdir.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.rmdir.php
- @@ -0,0 +1,54 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * delete a dir recursively (level=0 -> keep root)
- + * WARNING: no tests, it will try to remove what you tell it!
- + *
- + * @param string $dirname
- + * @param integer $level
- + * @param integer $exp_time
- + * @return boolean
- + */
- +
- +// $dirname, $level = 1, $exp_time = null
- +
- +function smarty_core_rmdir($params, &$smarty)
- +{
- + if(!isset($params['level'])) { $params['level'] = 1; }
- + if(!isset($params['exp_time'])) { $params['exp_time'] = null; }
- +
- + if($_handle = @opendir($params['dirname'])) {
- +
- + while (false !== ($_entry = readdir($_handle))) {
- + if ($_entry != '.' && $_entry != '..') {
- + if (@is_dir($params['dirname'] . DIRECTORY_SEPARATOR . $_entry)) {
- + $_params = array(
- + 'dirname' => $params['dirname'] . DIRECTORY_SEPARATOR . $_entry,
- + 'level' => $params['level'] + 1,
- + 'exp_time' => $params['exp_time']
- + );
- + smarty_core_rmdir($_params, $smarty);
- + }
- + else {
- + $smarty->_unlink($params['dirname'] . DIRECTORY_SEPARATOR . $_entry, $params['exp_time']);
- + }
- + }
- + }
- + closedir($_handle);
- + }
- +
- + if ($params['level']) {
- + return @rmdir($params['dirname']);
- + }
- + return (bool)$_handle;
- +
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.run_insert_handler.php b/library/smarty/internals/core.run_insert_handler.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.run_insert_handler.php
- @@ -0,0 +1,71 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Handle insert tags
- + *
- + * @param array $args
- + * @return string
- + */
- +function smarty_core_run_insert_handler($params, &$smarty)
- +{
- +
- + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- + if ($smarty->debugging) {
- + $_params = array();
- + $_debug_start_time = smarty_core_get_microtime($_params, $smarty);
- + }
- +
- + if ($smarty->caching) {
- + $_arg_string = serialize($params['args']);
- + $_name = $params['args']['name'];
- + if (!isset($smarty->_cache_info['insert_tags'][$_name])) {
- + $smarty->_cache_info['insert_tags'][$_name] = array('insert',
- + $_name,
- + $smarty->_plugins['insert'][$_name][1],
- + $smarty->_plugins['insert'][$_name][2],
- + !empty($params['args']['script']) ? true : false);
- + }
- + return $smarty->_smarty_md5."{insert_cache $_arg_string}".$smarty->_smarty_md5;
- + } else {
- + if (isset($params['args']['script'])) {
- + $_params = array('resource_name' => $smarty->_dequote($params['args']['script']));
- + require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
- + if(!smarty_core_get_php_resource($_params, $smarty)) {
- + return false;
- + }
- +
- + if ($_params['resource_type'] == 'file') {
- + $smarty->_include($_params['php_resource'], true);
- + } else {
- + $smarty->_eval($_params['php_resource']);
- + }
- + unset($params['args']['script']);
- + }
- +
- + $_funcname = $smarty->_plugins['insert'][$params['args']['name']][0];
- + $_content = $_funcname($params['args'], $smarty);
- + if ($smarty->debugging) {
- + $_params = array();
- + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- + $smarty->_smarty_debug_info[] = array('type' => 'insert',
- + 'filename' => 'insert_'.$params['args']['name'],
- + 'depth' => $smarty->_inclusion_depth,
- + 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time);
- + }
- +
- + if (!empty($params['args']["assign"])) {
- + $smarty->assign($params['args']["assign"], $_content);
- + } else {
- + return $_content;
- + }
- + }
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.smarty_include_php.php b/library/smarty/internals/core.smarty_include_php.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.smarty_include_php.php
- @@ -0,0 +1,50 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * called for included php files within templates
- + *
- + * @param string $smarty_file
- + * @param string $smarty_assign variable to assign the included template's
- + * output into
- + * @param boolean $smarty_once uses include_once if this is true
- + * @param array $smarty_include_vars associative array of vars from
- + * {include file="blah" var=$var}
- + */
- +
- +// $file, $assign, $once, $_smarty_include_vars
- +
- +function smarty_core_smarty_include_php($params, &$smarty)
- +{
- + $_params = array('resource_name' => $params['smarty_file']);
- + require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
- + smarty_core_get_php_resource($_params, $smarty);
- + $_smarty_resource_type = $_params['resource_type'];
- + $_smarty_php_resource = $_params['php_resource'];
- +
- + if (!empty($params['smarty_assign'])) {
- + ob_start();
- + if ($_smarty_resource_type == 'file') {
- + $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']);
- + } else {
- + $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']);
- + }
- + $smarty->assign($params['smarty_assign'], ob_get_contents());
- + ob_end_clean();
- + } else {
- + if ($_smarty_resource_type == 'file') {
- + $smarty->_include($_smarty_php_resource, $params['smarty_once'], $params['smarty_include_vars']);
- + } else {
- + $smarty->_eval($_smarty_php_resource, $params['smarty_include_vars']);
- + }
- + }
- +}
- +
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.write_cache_file.php b/library/smarty/internals/core.write_cache_file.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.write_cache_file.php
- @@ -0,0 +1,96 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Prepend the cache information to the cache file
- + * and write it
- + *
- + * @param string $tpl_file
- + * @param string $cache_id
- + * @param string $compile_id
- + * @param string $results
- + * @return true|null
- + */
- +
- + // $tpl_file, $cache_id, $compile_id, $results
- +
- +function smarty_core_write_cache_file($params, &$smarty)
- +{
- +
- + // put timestamp in cache header
- + $smarty->_cache_info['timestamp'] = time();
- + if ($smarty->cache_lifetime > -1){
- + // expiration set
- + $smarty->_cache_info['expires'] = $smarty->_cache_info['timestamp'] + $smarty->cache_lifetime;
- + } else {
- + // cache will never expire
- + $smarty->_cache_info['expires'] = -1;
- + }
- +
- + // collapse nocache.../nocache-tags
- + if (preg_match_all('!\{(/?)nocache\:[0-9a-f]{32}#\d+\}!', $params['results'], $match, PREG_PATTERN_ORDER)) {
- + // remove everything between every pair of outermost noache.../nocache-tags
- + // and replace it by a single nocache-tag
- + // this new nocache-tag will be replaced by dynamic contents in
- + // smarty_core_process_compiled_includes() on a cache-read
- +
- + $match_count = count($match[0]);
- + $results = preg_split('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!', $params['results'], -1, PREG_SPLIT_DELIM_CAPTURE);
- +
- + $level = 0;
- + $j = 0;
- + for ($i=0, $results_count = count($results); $i < $results_count && $j < $match_count; $i++) {
- + if ($results[$i] == $match[0][$j]) {
- + // nocache tag
- + if ($match[1][$j]) { // closing tag
- + $level--;
- + unset($results[$i]);
- + } else { // opening tag
- + if ($level++ > 0) unset($results[$i]);
- + }
- + $j++;
- + } elseif ($level > 0) {
- + unset($results[$i]);
- + }
- + }
- + $params['results'] = implode('', $results);
- + }
- + $smarty->_cache_info['cache_serials'] = $smarty->_cache_serials;
- +
- + // prepend the cache header info into cache file
- + $_cache_info = serialize($smarty->_cache_info);
- + $params['results'] = strlen($_cache_info) . "\n" . $_cache_info . $params['results'];
- +
- + if (!empty($smarty->cache_handler_func)) {
- + // use cache_handler function
- + call_user_func_array($smarty->cache_handler_func,
- + array('write', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], $smarty->_cache_info['expires']));
- + } else {
- + // use local cache file
- +
- + if(!@is_writable($smarty->cache_dir)) {
- + // cache_dir not writable, see if it exists
- + if(!@is_dir($smarty->cache_dir)) {
- + $smarty->trigger_error('the $cache_dir \'' . $smarty->cache_dir . '\' does not exist, or is not a directory.', E_USER_ERROR);
- + return false;
- + }
- + $smarty->trigger_error('unable to write to $cache_dir \'' . realpath($smarty->cache_dir) . '\'. Be sure $cache_dir is writable by the web server user.', E_USER_ERROR);
- + return false;
- + }
- +
- + $_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']);
- + $_cache_file = $smarty->_get_auto_filename($smarty->cache_dir, $params['tpl_file'], $_auto_id);
- + $_params = array('filename' => $_cache_file, 'contents' => $params['results'], 'create_dirs' => true);
- + require_once(SMARTY_CORE_DIR . 'core.write_file.php');
- + smarty_core_write_file($_params, $smarty);
- + return true;
- + }
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.write_compiled_include.php b/library/smarty/internals/core.write_compiled_include.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.write_compiled_include.php
- @@ -0,0 +1,91 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Extract non-cacheable parts out of compiled template and write it
- + *
- + * @param string $compile_path
- + * @param string $template_compiled
- + * @return boolean
- + */
- +
- +function smarty_core_write_compiled_include($params, &$smarty)
- +{
- + $_tag_start = 'if \(\$this->caching && \!\$this->_cache_including\)\: echo \'\{nocache\:('.$params['cache_serial'].')#(\d+)\}\'; endif;';
- + $_tag_end = 'if \(\$this->caching && \!\$this->_cache_including\)\: echo \'\{/nocache\:(\\2)#(\\3)\}\'; endif;';
- +
- + preg_match_all('!('.$_tag_start.'(.*)'.$_tag_end.')!Us',
- + $params['compiled_content'], $_match_source, PREG_SET_ORDER);
- +
- + // no nocache-parts found: done
- + if (count($_match_source)==0) return;
- +
- + // convert the matched php-code to functions
- + $_include_compiled = "<?php /* Smarty version ".$smarty->_version.", created on ".strftime("%Y-%m-%d %H:%M:%S")."\n";
- + $_include_compiled .= " compiled from " . strtr(urlencode($params['resource_name']), array('%2F'=>'/', '%3A'=>':')) . " */\n\n";
- +
- + $_compile_path = $params['include_file_path'];
- +
- + $smarty->_cache_serials[$_compile_path] = $params['cache_serial'];
- + $_include_compiled .= "\$this->_cache_serials['".$_compile_path."'] = '".$params['cache_serial']."';\n\n?>";
- +
- + $_include_compiled .= $params['plugins_code'];
- + $_include_compiled .= "<?php";
- +
- + $this_varname = ((double)phpversion() >= 5.0) ? '_smarty' : 'this';
- + for ($_i = 0, $_for_max = count($_match_source); $_i < $_for_max; $_i++) {
- + $_match =& $_match_source[$_i];
- + $source = $_match[4];
- + if ($this_varname == '_smarty') {
- + /* rename $this to $_smarty in the sourcecode */
- + $tokens = token_get_all('<?php ' . $_match[4]);
- +
- + /* remove trailing <?php */
- + $open_tag = '';
- + while ($tokens) {
- + $token = array_shift($tokens);
- + if (is_array($token)) {
- + $open_tag .= $token[1];
- + } else {
- + $open_tag .= $token;
- + }
- + if ($open_tag == '<?php ') break;
- + }
- +
- + for ($i=0, $count = count($tokens); $i < $count; $i++) {
- + if (is_array($tokens[$i])) {
- + if ($tokens[$i][0] == T_VARIABLE && $tokens[$i][1] == '$this') {
- + $tokens[$i] = '$' . $this_varname;
- + } else {
- + $tokens[$i] = $tokens[$i][1];
- + }
- + }
- + }
- + $source = implode('', $tokens);
- + }
- +
- + /* add function to compiled include */
- + $_include_compiled .= "
- +function _smarty_tplfunc_$_match[2]_$_match[3](&\$$this_varname)
- +{
- +$source
- +}
- +
- +";
- + }
- + $_include_compiled .= "\n\n?>\n";
- +
- + $_params = array('filename' => $_compile_path,
- + 'contents' => $_include_compiled, 'create_dirs' => true);
- +
- + require_once(SMARTY_CORE_DIR . 'core.write_file.php');
- + smarty_core_write_file($_params, $smarty);
- + return true;
- +}
- +
- +
- +?>
- diff --git a/library/smarty/internals/core.write_compiled_resource.php b/library/smarty/internals/core.write_compiled_resource.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.write_compiled_resource.php
- @@ -0,0 +1,35 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * write the compiled resource
- + *
- + * @param string $compile_path
- + * @param string $compiled_content
- + * @return true
- + */
- +function smarty_core_write_compiled_resource($params, &$smarty)
- +{
- + if(!@is_writable($smarty->compile_dir)) {
- + // compile_dir not writable, see if it exists
- + if(!@is_dir($smarty->compile_dir)) {
- + $smarty->trigger_error('the $compile_dir \'' . $smarty->compile_dir . '\' does not exist, or is not a directory.', E_USER_ERROR);
- + return false;
- + }
- + $smarty->trigger_error('unable to write to $compile_dir \'' . realpath($smarty->compile_dir) . '\'. Be sure $compile_dir is writable by the web server user.', E_USER_ERROR);
- + return false;
- + }
- +
- + $_params = array('filename' => $params['compile_path'], 'contents' => $params['compiled_content'], 'create_dirs' => true);
- + require_once(SMARTY_CORE_DIR . 'core.write_file.php');
- + smarty_core_write_file($_params, $smarty);
- + return true;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/internals/core.write_file.php b/library/smarty/internals/core.write_file.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/internals/core.write_file.php
- @@ -0,0 +1,54 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * write out a file to disk
- + *
- + * @param string $filename
- + * @param string $contents
- + * @param boolean $create_dirs
- + * @return boolean
- + */
- +function smarty_core_write_file($params, &$smarty)
- +{
- + $_dirname = dirname($params['filename']);
- +
- + if ($params['create_dirs']) {
- + $_params = array('dir' => $_dirname);
- + require_once(SMARTY_CORE_DIR . 'core.create_dir_structure.php');
- + smarty_core_create_dir_structure($_params, $smarty);
- + }
- +
- + // write to tmp file, then rename it to avoid file locking race condition
- + $_tmp_file = tempnam($_dirname, 'wrt');
- +
- + if (!($fd = @fopen($_tmp_file, 'wb'))) {
- + $_tmp_file = $_dirname . DIRECTORY_SEPARATOR . uniqid('wrt');
- + if (!($fd = @fopen($_tmp_file, 'wb'))) {
- + $smarty->trigger_error("problem writing temporary file '$_tmp_file'");
- + return false;
- + }
- + }
- +
- + fwrite($fd, $params['contents']);
- + fclose($fd);
- +
- + if (DIRECTORY_SEPARATOR == '\\' || !@rename($_tmp_file, $params['filename'])) {
- + // On platforms and filesystems that cannot overwrite with rename()
- + // delete the file before renaming it -- because windows always suffers
- + // this, it is short-circuited to avoid the initial rename() attempt
- + @unlink($params['filename']);
- + @rename($_tmp_file, $params['filename']);
- + }
- + @chmod($params['filename'], $smarty->_file_perms);
- +
- + return true;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- \ No newline at end of file
- diff --git a/library/smarty/plugins/block.textformat.php b/library/smarty/plugins/block.textformat.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/block.textformat.php
- @@ -0,0 +1,103 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Smarty {textformat}{/textformat} block plugin
- + *
- + * Type: block function<br>
- + * Name: textformat<br>
- + * Purpose: format text a certain way with preset styles
- + * or custom wrap/indent settings<br>
- + * @link http://smarty.php.net/manual/en/language.function.textformat.php {textformat}
- + * (Smarty online manual)
- + * @param array
- + * <pre>
- + * Params: style: string (email)
- + * indent: integer (0)
- + * wrap: integer (80)
- + * wrap_char string ("\n")
- + * indent_char: string (" ")
- + * wrap_boundary: boolean (true)
- + * </pre>
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string contents of the block
- + * @param Smarty clever simulation of a method
- + * @return string string $content re-formatted
- + */
- +function smarty_block_textformat($params, $content, &$smarty)
- +{
- + if (is_null($content)) {
- + return;
- + }
- +
- + $style = null;
- + $indent = 0;
- + $indent_first = 0;
- + $indent_char = ' ';
- + $wrap = 80;
- + $wrap_char = "\n";
- + $wrap_cut = false;
- + $assign = null;
- +
- + foreach ($params as $_key => $_val) {
- + switch ($_key) {
- + case 'style':
- + case 'indent_char':
- + case 'wrap_char':
- + case 'assign':
- + $$_key = (string)$_val;
- + break;
- +
- + case 'indent':
- + case 'indent_first':
- + case 'wrap':
- + $$_key = (int)$_val;
- + break;
- +
- + case 'wrap_cut':
- + $$_key = (bool)$_val;
- + break;
- +
- + default:
- + $smarty->trigger_error("textformat: unknown attribute '$_key'");
- + }
- + }
- +
- + if ($style == 'email') {
- + $wrap = 72;
- + }
- +
- + // split into paragraphs
- + $_paragraphs = preg_split('![\r\n][\r\n]!',$content);
- + $_output = '';
- +
- + for($_x = 0, $_y = count($_paragraphs); $_x < $_y; $_x++) {
- + if ($_paragraphs[$_x] == '') {
- + continue;
- + }
- + // convert mult. spaces & special chars to single space
- + $_paragraphs[$_x] = preg_replace(array('!\s+!','!(^\s+)|(\s+$)!'), array(' ',''), $_paragraphs[$_x]);
- + // indent first line
- + if($indent_first > 0) {
- + $_paragraphs[$_x] = str_repeat($indent_char, $indent_first) . $_paragraphs[$_x];
- + }
- + // wordwrap sentences
- + $_paragraphs[$_x] = wordwrap($_paragraphs[$_x], $wrap - $indent, $wrap_char, $wrap_cut);
- + // indent lines
- + if($indent > 0) {
- + $_paragraphs[$_x] = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraphs[$_x]);
- + }
- + }
- + $_output = implode($wrap_char . $wrap_char, $_paragraphs);
- +
- + return $assign ? $smarty->assign($assign, $_output) : $_output;
- +
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/compiler.assign.php b/library/smarty/plugins/compiler.assign.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/compiler.assign.php
- @@ -0,0 +1,40 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Smarty {assign} compiler function plugin
- + *
- + * Type: compiler function<br>
- + * Name: assign<br>
- + * Purpose: assign a value to a template variable
- + * @link http://smarty.php.net/manual/en/language.custom.functions.php#LANGUAGE.FUNCTION.ASSIGN {assign}
- + * (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com> (initial author)
- + * @author messju mohr <messju at lammfellpuschen dot de> (conversion to compiler function)
- + * @param string containing var-attribute and value-attribute
- + * @param Smarty_Compiler
- + */
- +function smarty_compiler_assign($tag_attrs, &$compiler)
- +{
- + $_params = $compiler->_parse_attrs($tag_attrs);
- +
- + if (!isset($_params['var'])) {
- + $compiler->_syntax_error("assign: missing 'var' parameter", E_USER_WARNING);
- + return;
- + }
- +
- + if (!isset($_params['value'])) {
- + $compiler->_syntax_error("assign: missing 'value' parameter", E_USER_WARNING);
- + return;
- + }
- +
- + return "\$this->assign({$_params['var']}, {$_params['value']});";
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.assign_debug_info.php b/library/smarty/plugins/function.assign_debug_info.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.assign_debug_info.php
- @@ -0,0 +1,40 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Smarty {assign_debug_info} function plugin
- + *
- + * Type: function<br>
- + * Name: assign_debug_info<br>
- + * Purpose: assign debug info to the template<br>
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param array unused in this plugin, this plugin uses {@link Smarty::$_config},
- + * {@link Smarty::$_tpl_vars} and {@link Smarty::$_smarty_debug_info}
- + * @param Smarty
- + */
- +function smarty_function_assign_debug_info($params, &$smarty)
- +{
- + $assigned_vars = $smarty->_tpl_vars;
- + ksort($assigned_vars);
- + if (@is_array($smarty->_config[0])) {
- + $config_vars = $smarty->_config[0];
- + ksort($config_vars);
- + $smarty->assign("_debug_config_keys", array_keys($config_vars));
- + $smarty->assign("_debug_config_vals", array_values($config_vars));
- + }
- +
- + $included_templates = $smarty->_smarty_debug_info;
- +
- + $smarty->assign("_debug_keys", array_keys($assigned_vars));
- + $smarty->assign("_debug_vals", array_values($assigned_vars));
- +
- + $smarty->assign("_debug_tpls", $included_templates);
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.config_load.php b/library/smarty/plugins/function.config_load.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.config_load.php
- @@ -0,0 +1,142 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Smarty {config_load} function plugin
- + *
- + * Type: function<br>
- + * Name: config_load<br>
- + * Purpose: load config file vars
- + * @link http://smarty.php.net/manual/en/language.function.config.load.php {config_load}
- + * (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @author messju mohr <messju at lammfellpuschen dot de> (added use of resources)
- + * @param array Format:
- + * <pre>
- + * array('file' => required config file name,
- + * 'section' => optional config file section to load
- + * 'scope' => local/parent/global
- + * 'global' => overrides scope, setting to parent if true)
- + * </pre>
- + * @param Smarty
- + */
- +function smarty_function_config_load($params, &$smarty)
- +{
- + if ($smarty->debugging) {
- + $_params = array();
- + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- + $_debug_start_time = smarty_core_get_microtime($_params, $smarty);
- + }
- +
- + $_file = isset($params['file']) ? $smarty->_dequote($params['file']) : null;
- + $_section = isset($params['section']) ? $smarty->_dequote($params['section']) : null;
- + $_scope = isset($params['scope']) ? $smarty->_dequote($params['scope']) : 'global';
- + $_global = isset($params['global']) ? $smarty->_dequote($params['global']) : false;
- +
- + if (!isset($_file) || strlen($_file) == 0) {
- + $smarty->trigger_error("missing 'file' attribute in config_load tag", E_USER_ERROR, __FILE__, __LINE__);
- + }
- +
- + if (isset($_scope)) {
- + if ($_scope != 'local' &&
- + $_scope != 'parent' &&
- + $_scope != 'global') {
- + $smarty->trigger_error("invalid 'scope' attribute value", E_USER_ERROR, __FILE__, __LINE__);
- + }
- + } else {
- + if ($_global) {
- + $_scope = 'parent';
- + } else {
- + $_scope = 'local';
- + }
- + }
- +
- + $_params = array('resource_name' => $_file,
- + 'resource_base_path' => $smarty->config_dir,
- + 'get_source' => false);
- + $smarty->_parse_resource_name($_params);
- + $_file_path = $_params['resource_type'] . ':' . $_params['resource_name'];
- + if (isset($_section))
- + $_compile_file = $smarty->_get_compile_path($_file_path.'|'.$_section);
- + else
- + $_compile_file = $smarty->_get_compile_path($_file_path);
- +
- + if($smarty->force_compile || !file_exists($_compile_file)) {
- + $_compile = true;
- + } elseif ($smarty->compile_check) {
- + $_params = array('resource_name' => $_file,
- + 'resource_base_path' => $smarty->config_dir,
- + 'get_source' => false);
- + $_compile = $smarty->_fetch_resource_info($_params) &&
- + $_params['resource_timestamp'] > filemtime($_compile_file);
- + } else {
- + $_compile = false;
- + }
- +
- + if($_compile) {
- + // compile config file
- + if(!is_object($smarty->_conf_obj)) {
- + require_once SMARTY_DIR . $smarty->config_class . '.class.php';
- + $smarty->_conf_obj = new $smarty->config_class();
- + $smarty->_conf_obj->overwrite = $smarty->config_overwrite;
- + $smarty->_conf_obj->booleanize = $smarty->config_booleanize;
- + $smarty->_conf_obj->read_hidden = $smarty->config_read_hidden;
- + $smarty->_conf_obj->fix_newlines = $smarty->config_fix_newlines;
- + }
- +
- + $_params = array('resource_name' => $_file,
- + 'resource_base_path' => $smarty->config_dir,
- + $_params['get_source'] = true);
- + if (!$smarty->_fetch_resource_info($_params)) {
- + return;
- + }
- + $smarty->_conf_obj->set_file_contents($_file, $_params['source_content']);
- + $_config_vars = array_merge($smarty->_conf_obj->get($_file),
- + $smarty->_conf_obj->get($_file, $_section));
- + if(function_exists('var_export')) {
- + $_output = '<?php $_config_vars = ' . var_export($_config_vars, true) . '; ?>';
- + } else {
- + $_output = '<?php $_config_vars = unserialize(\'' . strtr(serialize($_config_vars),array('\''=>'\\\'', '\\'=>'\\\\')) . '\'); ?>';
- + }
- + $_params = (array('compile_path' => $_compile_file, 'compiled_content' => $_output, 'resource_timestamp' => $_params['resource_timestamp']));
- + require_once(SMARTY_CORE_DIR . 'core.write_compiled_resource.php');
- + smarty_core_write_compiled_resource($_params, $smarty);
- + } else {
- + include($_compile_file);
- + }
- +
- + if ($smarty->caching) {
- + $smarty->_cache_info['config'][$_file] = true;
- + }
- +
- + $smarty->_config[0]['vars'] = @array_merge($smarty->_config[0]['vars'], $_config_vars);
- + $smarty->_config[0]['files'][$_file] = true;
- +
- + if ($_scope == 'parent') {
- + $smarty->_config[1]['vars'] = @array_merge($smarty->_config[1]['vars'], $_config_vars);
- + $smarty->_config[1]['files'][$_file] = true;
- + } else if ($_scope == 'global') {
- + for ($i = 1, $for_max = count($smarty->_config); $i < $for_max; $i++) {
- + $smarty->_config[$i]['vars'] = @array_merge($smarty->_config[$i]['vars'], $_config_vars);
- + $smarty->_config[$i]['files'][$_file] = true;
- + }
- + }
- +
- + if ($smarty->debugging) {
- + $_params = array();
- + require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
- + $smarty->_smarty_debug_info[] = array('type' => 'config',
- + 'filename' => $_file.' ['.$_section.'] '.$_scope,
- + 'depth' => $smarty->_inclusion_depth,
- + 'exec_time' => smarty_core_get_microtime($_params, $smarty) - $_debug_start_time);
- + }
- +
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.counter.php b/library/smarty/plugins/function.counter.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.counter.php
- @@ -0,0 +1,80 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty {counter} function plugin
- + *
- + * Type: function<br>
- + * Name: counter<br>
- + * Purpose: print out a counter value
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @link http://smarty.php.net/manual/en/language.function.counter.php {counter}
- + * (Smarty online manual)
- + * @param array parameters
- + * @param Smarty
- + * @return string|null
- + */
- +function smarty_function_counter($params, &$smarty)
- +{
- + static $counters = array();
- +
- + $name = (isset($params['name'])) ? $params['name'] : 'default';
- + if (!isset($counters[$name])) {
- + $counters[$name] = array(
- + 'start'=>1,
- + 'skip'=>1,
- + 'direction'=>'up',
- + 'count'=>1
- + );
- + }
- + $counter =& $counters[$name];
- +
- + if (isset($params['start'])) {
- + $counter['start'] = $counter['count'] = (int)$params['start'];
- + }
- +
- + if (!empty($params['assign'])) {
- + $counter['assign'] = $params['assign'];
- + }
- +
- + if (isset($counter['assign'])) {
- + $smarty->assign($counter['assign'], $counter['count']);
- + }
- +
- + if (isset($params['print'])) {
- + $print = (bool)$params['print'];
- + } else {
- + $print = empty($counter['assign']);
- + }
- +
- + if ($print) {
- + $retval = $counter['count'];
- + } else {
- + $retval = null;
- + }
- +
- + if (isset($params['skip'])) {
- + $counter['skip'] = $params['skip'];
- + }
- +
- + if (isset($params['direction'])) {
- + $counter['direction'] = $params['direction'];
- + }
- +
- + if ($counter['direction'] == "down")
- + $counter['count'] -= $counter['skip'];
- + else
- + $counter['count'] += $counter['skip'];
- +
- + return $retval;
- +
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.cycle.php b/library/smarty/plugins/function.cycle.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.cycle.php
- @@ -0,0 +1,102 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Smarty {cycle} function plugin
- + *
- + * Type: function<br>
- + * Name: cycle<br>
- + * Date: May 3, 2002<br>
- + * Purpose: cycle through given values<br>
- + * Input:
- + * - name = name of cycle (optional)
- + * - values = comma separated list of values to cycle,
- + * or an array of values to cycle
- + * (this can be left out for subsequent calls)
- + * - reset = boolean - resets given var to true
- + * - print = boolean - print var or not. default is true
- + * - advance = boolean - whether or not to advance the cycle
- + * - delimiter = the value delimiter, default is ","
- + * - assign = boolean, assigns to template var instead of
- + * printed.
- + *
- + * Examples:<br>
- + * <pre>
- + * {cycle values="#eeeeee,#d0d0d0d"}
- + * {cycle name=row values="one,two,three" reset=true}
- + * {cycle name=row}
- + * </pre>
- + * @link http://smarty.php.net/manual/en/language.function.cycle.php {cycle}
- + * (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @author credit to Mark Priatel <mpriatel@rogers.com>
- + * @author credit to Gerard <gerard@interfold.com>
- + * @author credit to Jason Sweat <jsweat_php@yahoo.com>
- + * @version 1.3
- + * @param array
- + * @param Smarty
- + * @return string|null
- + */
- +function smarty_function_cycle($params, &$smarty)
- +{
- + static $cycle_vars;
- +
- + $name = (empty($params['name'])) ? 'default' : $params['name'];
- + $print = (isset($params['print'])) ? (bool)$params['print'] : true;
- + $advance = (isset($params['advance'])) ? (bool)$params['advance'] : true;
- + $reset = (isset($params['reset'])) ? (bool)$params['reset'] : false;
- +
- + if (!in_array('values', array_keys($params))) {
- + if(!isset($cycle_vars[$name]['values'])) {
- + $smarty->trigger_error("cycle: missing 'values' parameter");
- + return;
- + }
- + } else {
- + if(isset($cycle_vars[$name]['values'])
- + && $cycle_vars[$name]['values'] != $params['values'] ) {
- + $cycle_vars[$name]['index'] = 0;
- + }
- + $cycle_vars[$name]['values'] = $params['values'];
- + }
- +
- + $cycle_vars[$name]['delimiter'] = (isset($params['delimiter'])) ? $params['delimiter'] : ',';
- +
- + if(is_array($cycle_vars[$name]['values'])) {
- + $cycle_array = $cycle_vars[$name]['values'];
- + } else {
- + $cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']);
- + }
- +
- + if(!isset($cycle_vars[$name]['index']) || $reset ) {
- + $cycle_vars[$name]['index'] = 0;
- + }
- +
- + if (isset($params['assign'])) {
- + $print = false;
- + $smarty->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]);
- + }
- +
- + if($print) {
- + $retval = $cycle_array[$cycle_vars[$name]['index']];
- + } else {
- + $retval = null;
- + }
- +
- + if($advance) {
- + if ( $cycle_vars[$name]['index'] >= count($cycle_array) -1 ) {
- + $cycle_vars[$name]['index'] = 0;
- + } else {
- + $cycle_vars[$name]['index']++;
- + }
- + }
- +
- + return $retval;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.debug.php b/library/smarty/plugins/function.debug.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.debug.php
- @@ -0,0 +1,35 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty {debug} function plugin
- + *
- + * Type: function<br>
- + * Name: debug<br>
- + * Date: July 1, 2002<br>
- + * Purpose: popup debug window
- + * @link http://smarty.php.net/manual/en/language.function.debug.php {debug}
- + * (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @version 1.0
- + * @param array
- + * @param Smarty
- + * @return string output from {@link Smarty::_generate_debug_output()}
- + */
- +function smarty_function_debug($params, &$smarty)
- +{
- + if (isset($params['output'])) {
- + $smarty->assign('_smarty_debug_output', $params['output']);
- + }
- + require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
- + return smarty_core_display_debug_console(null, $smarty);
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.eval.php b/library/smarty/plugins/function.eval.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.eval.php
- @@ -0,0 +1,49 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty {eval} function plugin
- + *
- + * Type: function<br>
- + * Name: eval<br>
- + * Purpose: evaluate a template variable as a template<br>
- + * @link http://smarty.php.net/manual/en/language.function.eval.php {eval}
- + * (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param array
- + * @param Smarty
- + */
- +function smarty_function_eval($params, &$smarty)
- +{
- +
- + if (!isset($params['var'])) {
- + $smarty->trigger_error("eval: missing 'var' parameter");
- + return;
- + }
- +
- + if($params['var'] == '') {
- + return;
- + }
- +
- + $smarty->_compile_source('evaluated template', $params['var'], $_var_compiled);
- +
- + ob_start();
- + $smarty->_eval('?>' . $_var_compiled);
- + $_contents = ob_get_contents();
- + ob_end_clean();
- +
- + if (!empty($params['assign'])) {
- + $smarty->assign($params['assign'], $_contents);
- + } else {
- + return $_contents;
- + }
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.fetch.php b/library/smarty/plugins/function.fetch.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.fetch.php
- @@ -0,0 +1,221 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty {fetch} plugin
- + *
- + * Type: function<br>
- + * Name: fetch<br>
- + * Purpose: fetch file, web or ftp data and display results
- + * @link http://smarty.php.net/manual/en/language.function.fetch.php {fetch}
- + * (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param array
- + * @param Smarty
- + * @return string|null if the assign parameter is passed, Smarty assigns the
- + * result to a template variable
- + */
- +function smarty_function_fetch($params, &$smarty)
- +{
- + if (empty($params['file'])) {
- + $smarty->_trigger_fatal_error("[plugin] parameter 'file' cannot be empty");
- + return;
- + }
- +
- + $content = '';
- + if ($smarty->security && !preg_match('!^(http|ftp)://!i', $params['file'])) {
- + $_params = array('resource_type' => 'file', 'resource_name' => $params['file']);
- + require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
- + if(!smarty_core_is_secure($_params, $smarty)) {
- + $smarty->_trigger_fatal_error('[plugin] (secure mode) fetch \'' . $params['file'] . '\' is not allowed');
- + return;
- + }
- +
- + // fetch the file
- + if($fp = @fopen($params['file'],'r')) {
- + while(!feof($fp)) {
- + $content .= fgets ($fp,4096);
- + }
- + fclose($fp);
- + } else {
- + $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] . '\'');
- + return;
- + }
- + } else {
- + // not a local file
- + if(preg_match('!^http://!i',$params['file'])) {
- + // http fetch
- + if($uri_parts = parse_url($params['file'])) {
- + // set defaults
- + $host = $server_name = $uri_parts['host'];
- + $timeout = 30;
- + $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
- + $agent = "Smarty Template Engine ".$smarty->_version;
- + $referer = "";
- + $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/';
- + $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : '';
- + $_is_proxy = false;
- + if(empty($uri_parts['port'])) {
- + $port = 80;
- + } else {
- + $port = $uri_parts['port'];
- + }
- + if(!empty($uri_parts['user'])) {
- + $user = $uri_parts['user'];
- + }
- + if(!empty($uri_parts['pass'])) {
- + $pass = $uri_parts['pass'];
- + }
- + // loop through parameters, setup headers
- + foreach($params as $param_key => $param_value) {
- + switch($param_key) {
- + case "file":
- + case "assign":
- + case "assign_headers":
- + break;
- + case "user":
- + if(!empty($param_value)) {
- + $user = $param_value;
- + }
- + break;
- + case "pass":
- + if(!empty($param_value)) {
- + $pass = $param_value;
- + }
- + break;
- + case "accept":
- + if(!empty($param_value)) {
- + $accept = $param_value;
- + }
- + break;
- + case "header":
- + if(!empty($param_value)) {
- + if(!preg_match('![\w\d-]+: .+!',$param_value)) {
- + $smarty->_trigger_fatal_error("[plugin] invalid header format '".$param_value."'");
- + return;
- + } else {
- + $extra_headers[] = $param_value;
- + }
- + }
- + break;
- + case "proxy_host":
- + if(!empty($param_value)) {
- + $proxy_host = $param_value;
- + }
- + break;
- + case "proxy_port":
- + if(!preg_match('!\D!', $param_value)) {
- + $proxy_port = (int) $param_value;
- + } else {
- + $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'");
- + return;
- + }
- + break;
- + case "agent":
- + if(!empty($param_value)) {
- + $agent = $param_value;
- + }
- + break;
- + case "referer":
- + if(!empty($param_value)) {
- + $referer = $param_value;
- + }
- + break;
- + case "timeout":
- + if(!preg_match('!\D!', $param_value)) {
- + $timeout = (int) $param_value;
- + } else {
- + $smarty->_trigger_fatal_error("[plugin] invalid value for attribute '".$param_key."'");
- + return;
- + }
- + break;
- + default:
- + $smarty->_trigger_fatal_error("[plugin] unrecognized attribute '".$param_key."'");
- + return;
- + }
- + }
- + if(!empty($proxy_host) && !empty($proxy_port)) {
- + $_is_proxy = true;
- + $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout);
- + } else {
- + $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout);
- + }
- +
- + if(!$fp) {
- + $smarty->_trigger_fatal_error("[plugin] unable to fetch: $errstr ($errno)");
- + return;
- + } else {
- + if($_is_proxy) {
- + fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n");
- + } else {
- + fputs($fp, "GET $uri HTTP/1.0\r\n");
- + }
- + if(!empty($host)) {
- + fputs($fp, "Host: $host\r\n");
- + }
- + if(!empty($accept)) {
- + fputs($fp, "Accept: $accept\r\n");
- + }
- + if(!empty($agent)) {
- + fputs($fp, "User-Agent: $agent\r\n");
- + }
- + if(!empty($referer)) {
- + fputs($fp, "Referer: $referer\r\n");
- + }
- + if(isset($extra_headers) && is_array($extra_headers)) {
- + foreach($extra_headers as $curr_header) {
- + fputs($fp, $curr_header."\r\n");
- + }
- + }
- + if(!empty($user) && !empty($pass)) {
- + fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n");
- + }
- +
- + fputs($fp, "\r\n");
- + while(!feof($fp)) {
- + $content .= fgets($fp,4096);
- + }
- + fclose($fp);
- + $csplit = split("\r\n\r\n",$content,2);
- +
- + $content = $csplit[1];
- +
- + if(!empty($params['assign_headers'])) {
- + $smarty->assign($params['assign_headers'],split("\r\n",$csplit[0]));
- + }
- + }
- + } else {
- + $smarty->_trigger_fatal_error("[plugin] unable to parse URL, check syntax");
- + return;
- + }
- + } else {
- + // ftp fetch
- + if($fp = @fopen($params['file'],'r')) {
- + while(!feof($fp)) {
- + $content .= fgets ($fp,4096);
- + }
- + fclose($fp);
- + } else {
- + $smarty->_trigger_fatal_error('[plugin] fetch cannot read file \'' . $params['file'] .'\'');
- + return;
- + }
- + }
- +
- + }
- +
- +
- + if (!empty($params['assign'])) {
- + $smarty->assign($params['assign'],$content);
- + } else {
- + return $content;
- + }
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.html_checkboxes.php b/library/smarty/plugins/function.html_checkboxes.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.html_checkboxes.php
- @@ -0,0 +1,143 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty {html_checkboxes} function plugin
- + *
- + * File: function.html_checkboxes.php<br>
- + * Type: function<br>
- + * Name: html_checkboxes<br>
- + * Date: 24.Feb.2003<br>
- + * Purpose: Prints out a list of checkbox input types<br>
- + * Input:<br>
- + * - name (optional) - string default "checkbox"
- + * - values (required) - array
- + * - options (optional) - associative array
- + * - checked (optional) - array default not set
- + * - separator (optional) - ie <br> or
- + * - output (optional) - the output next to each checkbox
- + * - assign (optional) - assign the output as an array to this variable
- + * Examples:
- + * <pre>
- + * {html_checkboxes values=$ids output=$names}
- + * {html_checkboxes values=$ids name='box' separator='<br>' output=$names}
- + * {html_checkboxes values=$ids checked=$checked separator='<br>' output=$names}
- + * </pre>
- + * @link http://smarty.php.net/manual/en/language.function.html.checkboxes.php {html_checkboxes}
- + * (Smarty online manual)
- + * @author Christopher Kvarme <christopher.kvarme@flashjab.com>
- + * @author credits to Monte Ohrt <monte at ohrt dot com>
- + * @version 1.0
- + * @param array
- + * @param Smarty
- + * @return string
- + * @uses smarty_function_escape_special_chars()
- + */
- +function smarty_function_html_checkboxes($params, &$smarty)
- +{
- + require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
- +
- + $name = 'checkbox';
- + $values = null;
- + $options = null;
- + $selected = null;
- + $separator = '';
- + $labels = true;
- + $output = null;
- +
- + $extra = '';
- +
- + foreach($params as $_key => $_val) {
- + switch($_key) {
- + case 'name':
- + case 'separator':
- + $$_key = $_val;
- + break;
- +
- + case 'labels':
- + $$_key = (bool)$_val;
- + break;
- +
- + case 'options':
- + $$_key = (array)$_val;
- + break;
- +
- + case 'values':
- + case 'output':
- + $$_key = array_values((array)$_val);
- + break;
- +
- + case 'checked':
- + case 'selected':
- + $selected = array_map('strval', array_values((array)$_val));
- + break;
- +
- + case 'checkboxes':
- + $smarty->trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING);
- + $options = (array)$_val;
- + break;
- +
- + case 'assign':
- + break;
- +
- + default:
- + if(!is_array($_val)) {
- + $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
- + } else {
- + $smarty->trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
- + }
- + break;
- + }
- + }
- +
- + if (!isset($options) && !isset($values))
- + return ''; /* raise error here? */
- +
- + settype($selected, 'array');
- + $_html_result = array();
- +
- + if (isset($options)) {
- +
- + foreach ($options as $_key=>$_val)
- + $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels);
- +
- +
- + } else {
- + foreach ($values as $_i=>$_key) {
- + $_val = isset($output[$_i]) ? $output[$_i] : '';
- + $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels);
- + }
- +
- + }
- +
- + if(!empty($params['assign'])) {
- + $smarty->assign($params['assign'], $_html_result);
- + } else {
- + return implode("\n",$_html_result);
- + }
- +
- +}
- +
- +function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels) {
- + $_output = '';
- + if ($labels) $_output .= '<label>';
- + $_output .= '<input type="checkbox" name="'
- + . smarty_function_escape_special_chars($name) . '[]" value="'
- + . smarty_function_escape_special_chars($value) . '"';
- +
- + if (in_array((string)$value, $selected)) {
- + $_output .= ' checked="checked"';
- + }
- + $_output .= $extra . ' />' . $output;
- + if ($labels) $_output .= '</label>';
- + $_output .= $separator;
- +
- + return $_output;
- +}
- +
- +?>
- diff --git a/library/smarty/plugins/function.html_image.php b/library/smarty/plugins/function.html_image.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.html_image.php
- @@ -0,0 +1,142 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty {html_image} function plugin
- + *
- + * Type: function<br>
- + * Name: html_image<br>
- + * Date: Feb 24, 2003<br>
- + * Purpose: format HTML tags for the image<br>
- + * Input:<br>
- + * - file = file (and path) of image (required)
- + * - height = image height (optional, default actual height)
- + * - width = image width (optional, default actual width)
- + * - basedir = base directory for absolute paths, default
- + * is environment variable DOCUMENT_ROOT
- + * - path_prefix = prefix for path output (optional, default empty)
- + *
- + * Examples: {html_image file="/images/masthead.gif"}
- + * Output: <img src="/images/masthead.gif" width=400 height=23>
- + * @link http://smarty.php.net/manual/en/language.function.html.image.php {html_image}
- + * (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @author credits to Duda <duda@big.hu> - wrote first image function
- + * in repository, helped with lots of functionality
- + * @version 1.0
- + * @param array
- + * @param Smarty
- + * @return string
- + * @uses smarty_function_escape_special_chars()
- + */
- +function smarty_function_html_image($params, &$smarty)
- +{
- + require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
- +
- + $alt = '';
- + $file = '';
- + $height = '';
- + $width = '';
- + $extra = '';
- + $prefix = '';
- + $suffix = '';
- + $path_prefix = '';
- + $server_vars = ($smarty->request_use_auto_globals) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
- + $basedir = isset($server_vars['DOCUMENT_ROOT']) ? $server_vars['DOCUMENT_ROOT'] : '';
- + foreach($params as $_key => $_val) {
- + switch($_key) {
- + case 'file':
- + case 'height':
- + case 'width':
- + case 'dpi':
- + case 'path_prefix':
- + case 'basedir':
- + $$_key = $_val;
- + break;
- +
- + case 'alt':
- + if(!is_array($_val)) {
- + $$_key = smarty_function_escape_special_chars($_val);
- + } else {
- + $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
- + }
- + break;
- +
- + case 'link':
- + case 'href':
- + $prefix = '<a href="' . $_val . '">';
- + $suffix = '</a>';
- + break;
- +
- + default:
- + if(!is_array($_val)) {
- + $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
- + } else {
- + $smarty->trigger_error("html_image: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
- + }
- + break;
- + }
- + }
- +
- + if (empty($file)) {
- + $smarty->trigger_error("html_image: missing 'file' parameter", E_USER_NOTICE);
- + return;
- + }
- +
- + if (substr($file,0,1) == '/') {
- + $_image_path = $basedir . $file;
- + } else {
- + $_image_path = $file;
- + }
- +
- + if(!isset($params['width']) || !isset($params['height'])) {
- + if(!$_image_data = @getimagesize($_image_path)) {
- + if(!file_exists($_image_path)) {
- + $smarty->trigger_error("html_image: unable to find '$_image_path'", E_USER_NOTICE);
- + return;
- + } else if(!is_readable($_image_path)) {
- + $smarty->trigger_error("html_image: unable to read '$_image_path'", E_USER_NOTICE);
- + return;
- + } else {
- + $smarty->trigger_error("html_image: '$_image_path' is not a valid image file", E_USER_NOTICE);
- + return;
- + }
- + }
- + if ($smarty->security &&
- + ($_params = array('resource_type' => 'file', 'resource_name' => $_image_path)) &&
- + (require_once(SMARTY_CORE_DIR . 'core.is_secure.php')) &&
- + (!smarty_core_is_secure($_params, $smarty)) ) {
- + $smarty->trigger_error("html_image: (secure) '$_image_path' not in secure directory", E_USER_NOTICE);
- + }
- +
- + if(!isset($params['width'])) {
- + $width = $_image_data[0];
- + }
- + if(!isset($params['height'])) {
- + $height = $_image_data[1];
- + }
- +
- + }
- +
- + if(isset($params['dpi'])) {
- + if(strstr($server_vars['HTTP_USER_AGENT'], 'Mac')) {
- + $dpi_default = 72;
- + } else {
- + $dpi_default = 96;
- + }
- + $_resize = $dpi_default/$params['dpi'];
- + $width = round($width * $_resize);
- + $height = round($height * $_resize);
- + }
- +
- + return $prefix . '<img src="'.$path_prefix.$file.'" alt="'.$alt.'" width="'.$width.'" height="'.$height.'"'.$extra.' />' . $suffix;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.html_options.php b/library/smarty/plugins/function.html_options.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.html_options.php
- @@ -0,0 +1,122 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty {html_options} function plugin
- + *
- + * Type: function<br>
- + * Name: html_options<br>
- + * Input:<br>
- + * - name (optional) - string default "select"
- + * - values (required if no options supplied) - array
- + * - options (required if no values supplied) - associative array
- + * - selected (optional) - string default not set
- + * - output (required if not options supplied) - array
- + * Purpose: Prints the list of <option> tags generated from
- + * the passed parameters
- + * @link http://smarty.php.net/manual/en/language.function.html.options.php {html_image}
- + * (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param array
- + * @param Smarty
- + * @return string
- + * @uses smarty_function_escape_special_chars()
- + */
- +function smarty_function_html_options($params, &$smarty)
- +{
- + require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
- +
- + $name = null;
- + $values = null;
- + $options = null;
- + $selected = array();
- + $output = null;
- +
- + $extra = '';
- +
- + foreach($params as $_key => $_val) {
- + switch($_key) {
- + case 'name':
- + $$_key = (string)$_val;
- + break;
- +
- + case 'options':
- + $$_key = (array)$_val;
- + break;
- +
- + case 'values':
- + case 'output':
- + $$_key = array_values((array)$_val);
- + break;
- +
- + case 'selected':
- + $$_key = array_map('strval', array_values((array)$_val));
- + break;
- +
- + default:
- + if(!is_array($_val)) {
- + $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
- + } else {
- + $smarty->trigger_error("html_options: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
- + }
- + break;
- + }
- + }
- +
- + if (!isset($options) && !isset($values))
- + return ''; /* raise error here? */
- +
- + $_html_result = '';
- +
- + if (isset($options)) {
- +
- + foreach ($options as $_key=>$_val)
- + $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected);
- +
- + } else {
- +
- + foreach ($values as $_i=>$_key) {
- + $_val = isset($output[$_i]) ? $output[$_i] : '';
- + $_html_result .= smarty_function_html_options_optoutput($_key, $_val, $selected);
- + }
- +
- + }
- +
- + if(!empty($name)) {
- + $_html_result = '<select name="' . $name . '"' . $extra . '>' . "\n" . $_html_result . '</select>' . "\n";
- + }
- +
- + return $_html_result;
- +
- +}
- +
- +function smarty_function_html_options_optoutput($key, $value, $selected) {
- + if(!is_array($value)) {
- + $_html_result = '<option label="' . smarty_function_escape_special_chars($value) . '" value="' .
- + smarty_function_escape_special_chars($key) . '"';
- + if (in_array((string)$key, $selected))
- + $_html_result .= ' selected="selected"';
- + $_html_result .= '>' . smarty_function_escape_special_chars($value) . '</option>' . "\n";
- + } else {
- + $_html_result = smarty_function_html_options_optgroup($key, $value, $selected);
- + }
- + return $_html_result;
- +}
- +
- +function smarty_function_html_options_optgroup($key, $values, $selected) {
- + $optgroup_html = '<optgroup label="' . smarty_function_escape_special_chars($key) . '">' . "\n";
- + foreach ($values as $key => $value) {
- + $optgroup_html .= smarty_function_html_options_optoutput($key, $value, $selected);
- + }
- + $optgroup_html .= "</optgroup>\n";
- + return $optgroup_html;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.html_radios.php b/library/smarty/plugins/function.html_radios.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.html_radios.php
- @@ -0,0 +1,156 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty {html_radios} function plugin
- + *
- + * File: function.html_radios.php<br>
- + * Type: function<br>
- + * Name: html_radios<br>
- + * Date: 24.Feb.2003<br>
- + * Purpose: Prints out a list of radio input types<br>
- + * Input:<br>
- + * - name (optional) - string default "radio"
- + * - values (required) - array
- + * - options (optional) - associative array
- + * - checked (optional) - array default not set
- + * - separator (optional) - ie <br> or
- + * - output (optional) - the output next to each radio button
- + * - assign (optional) - assign the output as an array to this variable
- + * Examples:
- + * <pre>
- + * {html_radios values=$ids output=$names}
- + * {html_radios values=$ids name='box' separator='<br>' output=$names}
- + * {html_radios values=$ids checked=$checked separator='<br>' output=$names}
- + * </pre>
- + * @link http://smarty.php.net/manual/en/language.function.html.radios.php {html_radios}
- + * (Smarty online manual)
- + * @author Christopher Kvarme <christopher.kvarme@flashjab.com>
- + * @author credits to Monte Ohrt <monte at ohrt dot com>
- + * @version 1.0
- + * @param array
- + * @param Smarty
- + * @return string
- + * @uses smarty_function_escape_special_chars()
- + */
- +function smarty_function_html_radios($params, &$smarty)
- +{
- + require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
- +
- + $name = 'radio';
- + $values = null;
- + $options = null;
- + $selected = null;
- + $separator = '';
- + $labels = true;
- + $label_ids = false;
- + $output = null;
- + $extra = '';
- +
- + foreach($params as $_key => $_val) {
- + switch($_key) {
- + case 'name':
- + case 'separator':
- + $$_key = (string)$_val;
- + break;
- +
- + case 'checked':
- + case 'selected':
- + if(is_array($_val)) {
- + $smarty->trigger_error('html_radios: the "' . $_key . '" attribute cannot be an array', E_USER_WARNING);
- + } else {
- + $selected = (string)$_val;
- + }
- + break;
- +
- + case 'labels':
- + case 'label_ids':
- + $$_key = (bool)$_val;
- + break;
- +
- + case 'options':
- + $$_key = (array)$_val;
- + break;
- +
- + case 'values':
- + case 'output':
- + $$_key = array_values((array)$_val);
- + break;
- +
- + case 'radios':
- + $smarty->trigger_error('html_radios: the use of the "radios" attribute is deprecated, use "options" instead', E_USER_WARNING);
- + $options = (array)$_val;
- + break;
- +
- + case 'assign':
- + break;
- +
- + default:
- + if(!is_array($_val)) {
- + $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
- + } else {
- + $smarty->trigger_error("html_radios: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
- + }
- + break;
- + }
- + }
- +
- + if (!isset($options) && !isset($values))
- + return ''; /* raise error here? */
- +
- + $_html_result = array();
- +
- + if (isset($options)) {
- +
- + foreach ($options as $_key=>$_val)
- + $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids);
- +
- + } else {
- +
- + foreach ($values as $_i=>$_key) {
- + $_val = isset($output[$_i]) ? $output[$_i] : '';
- + $_html_result[] = smarty_function_html_radios_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids);
- + }
- +
- + }
- +
- + if(!empty($params['assign'])) {
- + $smarty->assign($params['assign'], $_html_result);
- + } else {
- + return implode("\n",$_html_result);
- + }
- +
- +}
- +
- +function smarty_function_html_radios_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids) {
- + $_output = '';
- + if ($labels) {
- + if($label_ids) {
- + $_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!', '_', $name . '_' . $value));
- + $_output .= '<label for="' . $_id . '">';
- + } else {
- + $_output .= '<label>';
- + }
- + }
- + $_output .= '<input type="radio" name="'
- + . smarty_function_escape_special_chars($name) . '" value="'
- + . smarty_function_escape_special_chars($value) . '"';
- +
- + if ($labels && $label_ids) $_output .= ' id="' . $_id . '"';
- +
- + if ((string)$value==$selected) {
- + $_output .= ' checked="checked"';
- + }
- + $_output .= $extra . ' />' . $output;
- + if ($labels) $_output .= '</label>';
- + $_output .= $separator;
- +
- + return $_output;
- +}
- +
- +?>
- diff --git a/library/smarty/plugins/function.html_select_date.php b/library/smarty/plugins/function.html_select_date.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.html_select_date.php
- @@ -0,0 +1,331 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Smarty {html_select_date} plugin
- + *
- + * Type: function<br>
- + * Name: html_select_date<br>
- + * Purpose: Prints the dropdowns for date selection.
- + *
- + * ChangeLog:<br>
- + * - 1.0 initial release
- + * - 1.1 added support for +/- N syntax for begin
- + * and end year values. (Monte)
- + * - 1.2 added support for yyyy-mm-dd syntax for
- + * time value. (Jan Rosier)
- + * - 1.3 added support for choosing format for
- + * month values (Gary Loescher)
- + * - 1.3.1 added support for choosing format for
- + * day values (Marcus Bointon)
- + * - 1.3.2 support negative timestamps, force year
- + * dropdown to include given date unless explicitly set (Monte)
- + * - 1.3.4 fix behaviour of 0000-00-00 00:00:00 dates to match that
- + * of 0000-00-00 dates (cybot, boots)
- + * @link http://smarty.php.net/manual/en/language.function.html.select.date.php {html_select_date}
- + * (Smarty online manual)
- + * @version 1.3.4
- + * @author Andrei Zmievski
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param array
- + * @param Smarty
- + * @return string
- + */
- +function smarty_function_html_select_date($params, &$smarty)
- +{
- + require_once $smarty->_get_plugin_filepath('shared','escape_special_chars');
- + require_once $smarty->_get_plugin_filepath('shared','make_timestamp');
- + require_once $smarty->_get_plugin_filepath('function','html_options');
- + /* Default values. */
- + $prefix = "Date_";
- + $start_year = strftime("%Y");
- + $end_year = $start_year;
- + $display_days = true;
- + $display_months = true;
- + $display_years = true;
- + $month_format = "%B";
- + /* Write months as numbers by default GL */
- + $month_value_format = "%m";
- + $day_format = "%02d";
- + /* Write day values using this format MB */
- + $day_value_format = "%d";
- + $year_as_text = false;
- + /* Display years in reverse order? Ie. 2000,1999,.... */
- + $reverse_years = false;
- + /* Should the select boxes be part of an array when returned from PHP?
- + e.g. setting it to "birthday", would create "birthday[Day]",
- + "birthday[Month]" & "birthday[Year]". Can be combined with prefix */
- + $field_array = null;
- + /* <select size>'s of the different <select> tags.
- + If not set, uses default dropdown. */
- + $day_size = null;
- + $month_size = null;
- + $year_size = null;
- + /* Unparsed attributes common to *ALL* the <select>/<input> tags.
- + An example might be in the template: all_extra ='class ="foo"'. */
- + $all_extra = null;
- + /* Separate attributes for the tags. */
- + $day_extra = null;
- + $month_extra = null;
- + $year_extra = null;
- + /* Order in which to display the fields.
- + "D" -> day, "M" -> month, "Y" -> year. */
- + $field_order = 'MDY';
- + /* String printed between the different fields. */
- + $field_separator = "\n";
- + $time = time();
- + $all_empty = null;
- + $day_empty = null;
- + $month_empty = null;
- + $year_empty = null;
- + $extra_attrs = '';
- +
- + foreach ($params as $_key=>$_value) {
- + switch ($_key) {
- + case 'prefix':
- + case 'time':
- + case 'start_year':
- + case 'end_year':
- + case 'month_format':
- + case 'day_format':
- + case 'day_value_format':
- + case 'field_array':
- + case 'day_size':
- + case 'month_size':
- + case 'year_size':
- + case 'all_extra':
- + case 'day_extra':
- + case 'month_extra':
- + case 'year_extra':
- + case 'field_order':
- + case 'field_separator':
- + case 'month_value_format':
- + case 'month_empty':
- + case 'day_empty':
- + case 'year_empty':
- + $$_key = (string)$_value;
- + break;
- +
- + case 'all_empty':
- + $$_key = (string)$_value;
- + $day_empty = $month_empty = $year_empty = $all_empty;
- + break;
- +
- + case 'display_days':
- + case 'display_months':
- + case 'display_years':
- + case 'year_as_text':
- + case 'reverse_years':
- + $$_key = (bool)$_value;
- + break;
- +
- + default:
- + if(!is_array($_value)) {
- + $extra_attrs .= ' '.$_key.'="'.smarty_function_escape_special_chars($_value).'"';
- + } else {
- + $smarty->trigger_error("html_select_date: extra attribute '$_key' cannot be an array", E_USER_NOTICE);
- + }
- + break;
- + }
- + }
- +
- + if (preg_match('!^-\d+$!', $time)) {
- + // negative timestamp, use date()
- + $time = date('Y-m-d', $time);
- + }
- + // If $time is not in format yyyy-mm-dd
- + if (preg_match('/^(\d{0,4}-\d{0,2}-\d{0,2})/', $time, $found)) {
- + $time = $found[1];
- + } else {
- + // use smarty_make_timestamp to get an unix timestamp and
- + // strftime to make yyyy-mm-dd
- + $time = strftime('%Y-%m-%d', smarty_make_timestamp($time));
- + }
- + // Now split this in pieces, which later can be used to set the select
- + $time = explode("-", $time);
- +
- + // make syntax "+N" or "-N" work with start_year and end_year
- + if (preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match)) {
- + if ($match[1] == '+') {
- + $end_year = strftime('%Y') + $match[2];
- + } else {
- + $end_year = strftime('%Y') - $match[2];
- + }
- + }
- + if (preg_match('!^(\+|\-)\s*(\d+)$!', $start_year, $match)) {
- + if ($match[1] == '+') {
- + $start_year = strftime('%Y') + $match[2];
- + } else {
- + $start_year = strftime('%Y') - $match[2];
- + }
- + }
- + if (strlen($time[0]) > 0) {
- + if ($start_year > $time[0] && !isset($params['start_year'])) {
- + // force start year to include given date if not explicitly set
- + $start_year = $time[0];
- + }
- + if($end_year < $time[0] && !isset($params['end_year'])) {
- + // force end year to include given date if not explicitly set
- + $end_year = $time[0];
- + }
- + }
- +
- + $field_order = strtoupper($field_order);
- +
- + $html_result = $month_result = $day_result = $year_result = "";
- +
- + $field_separator_count = -1;
- + if ($display_months) {
- + $field_separator_count++;
- + $month_names = array();
- + $month_values = array();
- + if(isset($month_empty)) {
- + $month_names[''] = $month_empty;
- + $month_values[''] = '';
- + }
- + for ($i = 1; $i <= 12; $i++) {
- + $month_names[$i] = strftime($month_format, mktime(0, 0, 0, $i, 1, 2000));
- + $month_values[$i] = strftime($month_value_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 .= $extra_attrs . '>'."\n";
- +
- + $month_result .= smarty_function_html_options(array('output' => $month_names,
- + 'values' => $month_values,
- + 'selected' => (int)$time[1] ? strftime($month_value_format, mktime(0, 0, 0, (int)$time[1], 1, 2000)) : '',
- + 'print_result' => false),
- + $smarty);
- + $month_result .= '</select>';
- + }
- +
- + if ($display_days) {
- + $field_separator_count++;
- + $days = array();
- + if (isset($day_empty)) {
- + $days[''] = $day_empty;
- + $day_values[''] = '';
- + }
- + for ($i = 1; $i <= 31; $i++) {
- + $days[] = sprintf($day_format, $i);
- + $day_values[] = sprintf($day_value_format, $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 .= $extra_attrs . '>'."\n";
- + $day_result .= smarty_function_html_options(array('output' => $days,
- + 'values' => $day_values,
- + 'selected' => $time[2],
- + 'print_result' => false),
- + $smarty);
- + $day_result .= '</select>';
- + }
- +
- + if ($display_years) {
- + $field_separator_count++;
- + 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="' . $time[0] . '" 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);
- + } else {
- + sort($years, SORT_NUMERIC);
- + }
- + $yearvals = $years;
- + if(isset($year_empty)) {
- + array_unshift($years, $year_empty);
- + array_unshift($yearvals, '');
- + }
- + $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 .= $extra_attrs . '>'."\n";
- + $year_result .= smarty_function_html_options(array('output' => $years,
- + 'values' => $yearvals,
- + 'selected' => $time[0],
- + '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
- + if($i < $field_separator_count) {
- + $html_result .= $field_separator;
- + }
- + }
- +
- + return $html_result;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.html_select_time.php b/library/smarty/plugins/function.html_select_time.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.html_select_time.php
- @@ -0,0 +1,194 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty {html_select_time} function plugin
- + *
- + * Type: function<br>
- + * Name: html_select_time<br>
- + * Purpose: Prints the dropdowns for time selection
- + * @link http://smarty.php.net/manual/en/language.function.html.select.time.php {html_select_time}
- + * (Smarty online manual)
- + * @author Roberto Berto <roberto@berto.net>
- + * @credits Monte Ohrt <monte AT ohrt DOT com>
- + * @param array
- + * @param Smarty
- + * @return string
- + * @uses smarty_make_timestamp()
- + */
- +function smarty_function_html_select_time($params, &$smarty)
- +{
- + require_once $smarty->_get_plugin_filepath('shared','make_timestamp');
- + require_once $smarty->_get_plugin_filepath('function','html_options');
- + /* 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;
- + $all_extra = null;
- + $hour_extra = null;
- + $minute_extra = null;
- + $second_extra = null;
- + $meridian_extra = null;
- +
- + foreach ($params as $_key=>$_value) {
- + switch ($_key) {
- + case 'prefix':
- + case 'time':
- + case 'field_array':
- + case 'all_extra':
- + case 'hour_extra':
- + case 'minute_extra':
- + case 'second_extra':
- + case 'meridian_extra':
- + $$_key = (string)$_value;
- + break;
- +
- + case 'display_hours':
- + case 'display_minutes':
- + case 'display_seconds':
- + case 'display_meridian':
- + case 'use_24_hours':
- + $$_key = (bool)$_value;
- + break;
- +
- + case 'minute_interval':
- + case 'second_interval':
- + $$_key = (int)$_value;
- + break;
- +
- + default:
- + $smarty->trigger_error("[html_select_time] unknown parameter $_key", E_USER_WARNING);
- + }
- + }
- +
- + $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, $for_max = count($hours); $i < $for_max; $i++)
- + $hours[$i] = sprintf('%02d', $hours[$i]);
- + $html_result .= '<select name=';
- + if (null !== $field_array) {
- + $html_result .= '"' . $field_array . '[' . $prefix . 'Hour]"';
- + } else {
- + $html_result .= '"' . $prefix . 'Hour"';
- + }
- + if (null !== $hour_extra){
- + $html_result .= ' ' . $hour_extra;
- + }
- + if (null !== $all_extra){
- + $html_result .= ' ' . $all_extra;
- + }
- + $html_result .= '>'."\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, $for_max = count($all_minutes); $i < $for_max; $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]"';
- + } else {
- + $html_result .= '"' . $prefix . 'Minute"';
- + }
- + if (null !== $minute_extra){
- + $html_result .= ' ' . $minute_extra;
- + }
- + if (null !== $all_extra){
- + $html_result .= ' ' . $all_extra;
- + }
- + $html_result .= '>'."\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, $for_max = count($all_seconds); $i < $for_max; $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]"';
- + } else {
- + $html_result .= '"' . $prefix . 'Second"';
- + }
- +
- + if (null !== $second_extra){
- + $html_result .= ' ' . $second_extra;
- + }
- + if (null !== $all_extra){
- + $html_result .= ' ' . $all_extra;
- + }
- + $html_result .= '>'."\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]"';
- + } else {
- + $html_result .= '"' . $prefix . 'Meridian"';
- + }
- +
- + if (null !== $meridian_extra){
- + $html_result .= ' ' . $meridian_extra;
- + }
- + if (null !== $all_extra){
- + $html_result .= ' ' . $all_extra;
- + }
- + $html_result .= '>'."\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";
- + }
- +
- + return $html_result;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.html_table.php b/library/smarty/plugins/function.html_table.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.html_table.php
- @@ -0,0 +1,177 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty {html_table} function plugin
- + *
- + * Type: function<br>
- + * Name: html_table<br>
- + * Date: Feb 17, 2003<br>
- + * Purpose: make an html table from an array of data<br>
- + * Input:<br>
- + * - loop = array to loop through
- + * - cols = number of columns, comma separated list of column names
- + * or array of column names
- + * - rows = number of rows
- + * - table_attr = table attributes
- + * - th_attr = table heading attributes (arrays are cycled)
- + * - tr_attr = table row attributes (arrays are cycled)
- + * - td_attr = table cell attributes (arrays are cycled)
- + * - trailpad = value to pad trailing cells with
- + * - caption = text for caption element
- + * - vdir = vertical direction (default: "down", means top-to-bottom)
- + * - hdir = horizontal direction (default: "right", means left-to-right)
- + * - inner = inner loop (default "cols": print $loop line by line,
- + * $loop will be printed column by column otherwise)
- + *
- + *
- + * Examples:
- + * <pre>
- + * {table loop=$data}
- + * {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
- + * {table loop=$data cols="first,second,third" tr_attr=$colors}
- + * </pre>
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @author credit to Messju Mohr <messju at lammfellpuschen dot de>
- + * @author credit to boots <boots dot smarty at yahoo dot com>
- + * @version 1.1
- + * @link http://smarty.php.net/manual/en/language.function.html.table.php {html_table}
- + * (Smarty online manual)
- + * @param array
- + * @param Smarty
- + * @return string
- + */
- +function smarty_function_html_table($params, &$smarty)
- +{
- + $table_attr = 'border="1"';
- + $tr_attr = '';
- + $th_attr = '';
- + $td_attr = '';
- + $cols = $cols_count = 3;
- + $rows = 3;
- + $trailpad = ' ';
- + $vdir = 'down';
- + $hdir = 'right';
- + $inner = 'cols';
- + $caption = '';
- +
- + if (!isset($params['loop'])) {
- + $smarty->trigger_error("html_table: missing 'loop' parameter");
- + return;
- + }
- +
- + foreach ($params as $_key=>$_value) {
- + switch ($_key) {
- + case 'loop':
- + $$_key = (array)$_value;
- + break;
- +
- + case 'cols':
- + if (is_array($_value) && !empty($_value)) {
- + $cols = $_value;
- + $cols_count = count($_value);
- + } elseif (!is_numeric($_value) && is_string($_value) && !empty($_value)) {
- + $cols = explode(',', $_value);
- + $cols_count = count($cols);
- + } elseif (!empty($_value)) {
- + $cols_count = (int)$_value;
- + } else {
- + $cols_count = $cols;
- + }
- + break;
- +
- + case 'rows':
- + $$_key = (int)$_value;
- + break;
- +
- + case 'table_attr':
- + case 'trailpad':
- + case 'hdir':
- + case 'vdir':
- + case 'inner':
- + case 'caption':
- + $$_key = (string)$_value;
- + break;
- +
- + case 'tr_attr':
- + case 'td_attr':
- + case 'th_attr':
- + $$_key = $_value;
- + break;
- + }
- + }
- +
- + $loop_count = count($loop);
- + if (empty($params['rows'])) {
- + /* no rows specified */
- + $rows = ceil($loop_count/$cols_count);
- + } elseif (empty($params['cols'])) {
- + if (!empty($params['rows'])) {
- + /* no cols specified, but rows */
- + $cols_count = ceil($loop_count/$rows);
- + }
- + }
- +
- + $output = "<table $table_attr>\n";
- +
- + if (!empty($caption)) {
- + $output .= '<caption>' . $caption . "</caption>\n";
- + }
- +
- + if (is_array($cols)) {
- + $cols = ($hdir == 'right') ? $cols : array_reverse($cols);
- + $output .= "<thead><tr>\n";
- +
- + for ($r=0; $r<$cols_count; $r++) {
- + $output .= '<th' . smarty_function_html_table_cycle('th', $th_attr, $r) . '>';
- + $output .= $cols[$r];
- + $output .= "</th>\n";
- + }
- + $output .= "</tr></thead>\n";
- + }
- +
- + $output .= "<tbody>\n";
- + for ($r=0; $r<$rows; $r++) {
- + $output .= "<tr" . smarty_function_html_table_cycle('tr', $tr_attr, $r) . ">\n";
- + $rx = ($vdir == 'down') ? $r*$cols_count : ($rows-1-$r)*$cols_count;
- +
- + for ($c=0; $c<$cols_count; $c++) {
- + $x = ($hdir == 'right') ? $rx+$c : $rx+$cols_count-1-$c;
- + if ($inner!='cols') {
- + /* shuffle x to loop over rows*/
- + $x = floor($x/$cols_count) + ($x%$cols_count)*$rows;
- + }
- +
- + if ($x<$loop_count) {
- + $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">" . $loop[$x] . "</td>\n";
- + } else {
- + $output .= "<td" . smarty_function_html_table_cycle('td', $td_attr, $c) . ">$trailpad</td>\n";
- + }
- + }
- + $output .= "</tr>\n";
- + }
- + $output .= "</tbody>\n";
- + $output .= "</table>\n";
- +
- + return $output;
- +}
- +
- +function smarty_function_html_table_cycle($name, $var, $no) {
- + if(!is_array($var)) {
- + $ret = $var;
- + } else {
- + $ret = $var[$no % count($var)];
- + }
- +
- + return ($ret) ? ' '.$ret : '';
- +}
- +
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.mailto.php b/library/smarty/plugins/function.mailto.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.mailto.php
- @@ -0,0 +1,165 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty {mailto} function plugin
- + *
- + * Type: function<br>
- + * Name: mailto<br>
- + * Date: May 21, 2002
- + * Purpose: automate mailto address link creation, and optionally
- + * encode them.<br>
- + * Input:<br>
- + * - address = e-mail address
- + * - text = (optional) text to display, default is address
- + * - encode = (optional) can be one of:
- + * * none : no encoding (default)
- + * * javascript : encode with javascript
- + * * javascript_charcode : encode with javascript charcode
- + * * hex : encode with hexidecimal (no javascript)
- + * - cc = (optional) address(es) to carbon copy
- + * - bcc = (optional) address(es) to blind carbon copy
- + * - subject = (optional) e-mail subject
- + * - newsgroups = (optional) newsgroup(s) to post to
- + * - followupto = (optional) address(es) to follow up to
- + * - extra = (optional) extra tags for the href link
- + *
- + * Examples:
- + * <pre>
- + * {mailto address="me@domain.com"}
- + * {mailto address="me@domain.com" encode="javascript"}
- + * {mailto address="me@domain.com" encode="hex"}
- + * {mailto address="me@domain.com" subject="Hello to you!"}
- + * {mailto address="me@domain.com" cc="you@domain.com,they@domain.com"}
- + * {mailto address="me@domain.com" extra='class="mailto"'}
- + * </pre>
- + * @link http://smarty.php.net/manual/en/language.function.mailto.php {mailto}
- + * (Smarty online manual)
- + * @version 1.2
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @author credits to Jason Sweat (added cc, bcc and subject functionality)
- + * @param array
- + * @param Smarty
- + * @return string
- + */
- +function smarty_function_mailto($params, &$smarty)
- +{
- + $extra = '';
- +
- + if (empty($params['address'])) {
- + $smarty->trigger_error("mailto: missing 'address' parameter");
- + return;
- + } else {
- + $address = $params['address'];
- + }
- +
- + $text = $address;
- +
- + // netscape and mozilla do not decode %40 (@) in BCC field (bug?)
- + // so, don't encode it.
- + $search = array('%40', '%2C');
- + $replace = array('@', ',');
- + $mail_parms = array();
- + foreach ($params as $var=>$value) {
- + switch ($var) {
- + case 'cc':
- + case 'bcc':
- + case 'followupto':
- + if (!empty($value))
- + $mail_parms[] = $var.'='.str_replace($search,$replace,rawurlencode($value));
- + break;
- +
- + case 'subject':
- + case 'newsgroups':
- + $mail_parms[] = $var.'='.rawurlencode($value);
- + break;
- +
- + case 'extra':
- + case 'text':
- + $$var = $value;
- +
- + default:
- + }
- + }
- +
- + $mail_parm_vals = '';
- + for ($i=0; $i<count($mail_parms); $i++) {
- + $mail_parm_vals .= (0==$i) ? '?' : '&';
- + $mail_parm_vals .= $mail_parms[$i];
- + }
- + $address .= $mail_parm_vals;
- +
- + $encode = (empty($params['encode'])) ? 'none' : $params['encode'];
- + if (!in_array($encode,array('javascript','javascript_charcode','hex','none')) ) {
- + $smarty->trigger_error("mailto: 'encode' parameter must be none, javascript or hex");
- + return;
- + }
- +
- + if ($encode == 'javascript' ) {
- + $string = 'document.write(\'<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>\');';
- +
- + $js_encode = '';
- + for ($x=0; $x < strlen($string); $x++) {
- + $js_encode .= '%' . bin2hex($string[$x]);
- + }
- +
- + return '<script type="text/javascript">eval(unescape(\''.$js_encode.'\'))</script>';
- +
- + } elseif ($encode == 'javascript_charcode' ) {
- + $string = '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
- +
- + for($x = 0, $y = strlen($string); $x < $y; $x++ ) {
- + $ord[] = ord($string[$x]);
- + }
- +
- + $_ret = "<script type=\"text/javascript\" language=\"javascript\">\n";
- + $_ret .= "<!--\n";
- + $_ret .= "{document.write(String.fromCharCode(";
- + $_ret .= implode(',',$ord);
- + $_ret .= "))";
- + $_ret .= "}\n";
- + $_ret .= "//-->\n";
- + $_ret .= "</script>\n";
- +
- + return $_ret;
- +
- +
- + } elseif ($encode == 'hex') {
- +
- + preg_match('!^(.*)(\?.*)$!',$address,$match);
- + if(!empty($match[2])) {
- + $smarty->trigger_error("mailto: hex encoding does not work with extra attributes. Try javascript.");
- + return;
- + }
- + $address_encode = '';
- + for ($x=0; $x < strlen($address); $x++) {
- + if(preg_match('!\w!',$address[$x])) {
- + $address_encode .= '%' . bin2hex($address[$x]);
- + } else {
- + $address_encode .= $address[$x];
- + }
- + }
- + $text_encode = '';
- + for ($x=0; $x < strlen($text); $x++) {
- + $text_encode .= '&#x' . bin2hex($text[$x]).';';
- + }
- +
- + $mailto = "mailto:";
- + return '<a href="'.$mailto.$address_encode.'" '.$extra.'>'.$text_encode.'</a>';
- +
- + } else {
- + // no encoding
- + return '<a href="mailto:'.$address.'" '.$extra.'>'.$text.'</a>';
- +
- + }
- +
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.math.php b/library/smarty/plugins/function.math.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.math.php
- @@ -0,0 +1,85 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty {math} function plugin
- + *
- + * Type: function<br>
- + * Name: math<br>
- + * Purpose: handle math computations in template<br>
- + * @link http://smarty.php.net/manual/en/language.function.math.php {math}
- + * (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param array
- + * @param Smarty
- + * @return string
- + */
- +function smarty_function_math($params, &$smarty)
- +{
- + // be sure equation parameter is present
- + if (empty($params['equation'])) {
- + $smarty->trigger_error("math: missing equation parameter");
- + return;
- + }
- +
- + // strip out backticks, not necessary for math
- + $equation = str_replace('`','',$params['equation']);
- +
- + // make sure parenthesis are balanced
- + if (substr_count($equation,"(") != substr_count($equation,")")) {
- + $smarty->trigger_error("math: unbalanced parenthesis");
- + return;
- + }
- +
- + // match all vars in equation, make sure all are passed
- + preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]+)!",$equation, $match);
- + $allowed_funcs = array('int','abs','ceil','cos','exp','floor','log','log10',
- + 'max','min','pi','pow','rand','round','sin','sqrt','srand','tan');
- +
- + foreach($match[1] as $curr_var) {
- + if ($curr_var && !in_array($curr_var, array_keys($params)) && !in_array($curr_var, $allowed_funcs)) {
- + $smarty->trigger_error("math: function call $curr_var not allowed");
- + return;
- + }
- + }
- +
- + foreach($params as $key => $val) {
- + if ($key != "equation" && $key != "format" && $key != "assign") {
- + // make sure value is not empty
- + if (strlen($val)==0) {
- + $smarty->trigger_error("math: parameter $key is empty");
- + return;
- + }
- + if (!is_numeric($val)) {
- + $smarty->trigger_error("math: parameter $key: is not numeric");
- + return;
- + }
- + $equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation);
- + }
- + }
- +
- + eval("\$smarty_math_result = ".$equation.";");
- +
- + if (empty($params['format'])) {
- + if (empty($params['assign'])) {
- + return $smarty_math_result;
- + } else {
- + $smarty->assign($params['assign'],$smarty_math_result);
- + }
- + } else {
- + if (empty($params['assign'])){
- + printf($params['format'],$smarty_math_result);
- + } else {
- + $smarty->assign($params['assign'],sprintf($params['format'],$smarty_math_result));
- + }
- + }
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.popup.php b/library/smarty/plugins/function.popup.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.popup.php
- @@ -0,0 +1,119 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty {popup} function plugin
- + *
- + * Type: function<br>
- + * Name: popup<br>
- + * Purpose: make text pop up in windows via overlib
- + * @link http://smarty.php.net/manual/en/language.function.popup.php {popup}
- + * (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param array
- + * @param Smarty
- + * @return string
- + */
- +function smarty_function_popup($params, &$smarty)
- +{
- + $append = '';
- + foreach ($params as $_key=>$_value) {
- + switch ($_key) {
- + case 'text':
- + case 'trigger':
- + case 'function':
- + case 'inarray':
- + $$_key = (string)$_value;
- + if ($_key == 'function' || $_key == 'inarray')
- + $append .= ',' . strtoupper($_key) . ",'$_value'";
- + break;
- +
- + case 'caption':
- + case 'closetext':
- + case 'status':
- + $append .= ',' . strtoupper($_key) . ",'" . str_replace("'","\'",$_value) . "'";
- + break;
- +
- + case 'fgcolor':
- + case 'bgcolor':
- + case 'textcolor':
- + case 'capcolor':
- + case 'closecolor':
- + case 'textfont':
- + case 'captionfont':
- + case 'closefont':
- + case 'fgbackground':
- + case 'bgbackground':
- + case 'caparray':
- + case 'capicon':
- + case 'background':
- + case 'frame':
- + $append .= ',' . strtoupper($_key) . ",'$_value'";
- + break;
- +
- + case 'textsize':
- + case 'captionsize':
- + case 'closesize':
- + case 'width':
- + case 'height':
- + case 'border':
- + case 'offsetx':
- + case 'offsety':
- + case 'snapx':
- + case 'snapy':
- + case 'fixx':
- + case 'fixy':
- + case 'padx':
- + case 'pady':
- + case 'timeout':
- + case 'delay':
- + $append .= ',' . strtoupper($_key) . ",$_value";
- + break;
- +
- + case 'sticky':
- + case 'left':
- + case 'right':
- + case 'center':
- + case 'above':
- + case 'below':
- + case 'noclose':
- + case 'autostatus':
- + case 'autostatuscap':
- + case 'fullhtml':
- + case 'hauto':
- + case 'vauto':
- + case 'mouseoff':
- + case 'followmouse':
- + case 'closeclick':
- + if ($_value) $append .= ',' . strtoupper($_key);
- + break;
- +
- + default:
- + $smarty->trigger_error("[popup] unknown parameter $_key", E_USER_WARNING);
- + }
- + }
- +
- + if (empty($text) && !isset($inarray) && empty($function)) {
- + $smarty->trigger_error("overlib: attribute 'text' or 'inarray' or 'function' required");
- + return false;
- + }
- +
- + if (empty($trigger)) { $trigger = "onmouseover"; }
- +
- + $retval = $trigger . '="return overlib(\''.preg_replace(array("!'!","![\r\n]!"),array("\'",'\r'),$text).'\'';
- + $retval .= $append . ');"';
- + if ($trigger == 'onmouseover')
- + $retval .= ' onmouseout="nd();"';
- +
- +
- + return $retval;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/function.popup_init.php b/library/smarty/plugins/function.popup_init.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/function.popup_init.php
- @@ -0,0 +1,40 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty {popup_init} function plugin
- + *
- + * Type: function<br>
- + * Name: popup_init<br>
- + * Purpose: initialize overlib
- + * @link http://smarty.php.net/manual/en/language.function.popup.init.php {popup_init}
- + * (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param array
- + * @param Smarty
- + * @return string
- + */
- +function smarty_function_popup_init($params, &$smarty)
- +{
- + $zindex = 1000;
- +
- + if (!empty($params['zindex'])) {
- + $zindex = $params['zindex'];
- + }
- +
- + if (!empty($params['src'])) {
- + return '<div id="overDiv" style="position:absolute; visibility:hidden; z-index:'.$zindex.';"></div>' . "\n"
- + . '<script type="text/javascript" language="JavaScript" src="'.$params['src'].'"></script>' . "\n";
- + } else {
- + $smarty->trigger_error("popup_init: missing src parameter");
- + }
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.capitalize.php b/library/smarty/plugins/modifier.capitalize.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.capitalize.php
- @@ -0,0 +1,43 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty capitalize modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: capitalize<br>
- + * Purpose: capitalize words in the string
- + * @link http://smarty.php.net/manual/en/language.modifiers.php#LANGUAGE.MODIFIER.CAPITALIZE
- + * capitalize (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @return string
- + */
- +function smarty_modifier_capitalize($string, $uc_digits = false)
- +{
- + smarty_modifier_capitalize_ucfirst(null, $uc_digits);
- + return preg_replace_callback('!\'?\b\w(\w|\')*\b!', 'smarty_modifier_capitalize_ucfirst', $string);
- +}
- +
- +function smarty_modifier_capitalize_ucfirst($string, $uc_digits = null)
- +{
- + static $_uc_digits = false;
- +
- + if(isset($uc_digits)) {
- + $_uc_digits = $uc_digits;
- + return;
- + }
- +
- + if(substr($string[0],0,1) != "'" && !preg_match("!\d!",$string[0]) || $_uc_digits)
- + return ucfirst($string[0]);
- + else
- + return $string[0];
- +}
- +
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.cat.php b/library/smarty/plugins/modifier.cat.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.cat.php
- @@ -0,0 +1,33 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty cat modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: cat<br>
- + * Date: Feb 24, 2003
- + * Purpose: catenate a value to a variable
- + * Input: string to catenate
- + * Example: {$var|cat:"foo"}
- + * @link http://smarty.php.net/manual/en/language.modifier.cat.php cat
- + * (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @version 1.0
- + * @param string
- + * @param string
- + * @return string
- + */
- +function smarty_modifier_cat($string, $cat)
- +{
- + return $string . $cat;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.count_characters.php b/library/smarty/plugins/modifier.count_characters.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.count_characters.php
- @@ -0,0 +1,32 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty count_characters modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: count_characteres<br>
- + * Purpose: count the number of characters in a text
- + * @link http://smarty.php.net/manual/en/language.modifier.count.characters.php
- + * count_characters (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @param boolean include whitespace in the character count
- + * @return integer
- + */
- +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: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.count_paragraphs.php b/library/smarty/plugins/modifier.count_paragraphs.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.count_paragraphs.php
- @@ -0,0 +1,29 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty count_paragraphs modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: count_paragraphs<br>
- + * Purpose: count the number of paragraphs in a text
- + * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
- + * count_paragraphs (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @return integer
- + */
- +function smarty_modifier_count_paragraphs($string)
- +{
- + // count \r or \n characters
- + return count(preg_split('/[\r\n]+/', $string));
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.count_sentences.php b/library/smarty/plugins/modifier.count_sentences.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.count_sentences.php
- @@ -0,0 +1,29 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty count_sentences modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: count_sentences
- + * Purpose: count the number of sentences in a text
- + * @link http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
- + * count_sentences (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @return integer
- + */
- +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: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.count_words.php b/library/smarty/plugins/modifier.count_words.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.count_words.php
- @@ -0,0 +1,33 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty count_words modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: count_words<br>
- + * Purpose: count the number of words in a text
- + * @link http://smarty.php.net/manual/en/language.modifier.count.words.php
- + * count_words (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @return integer
- + */
- +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\\x80-\\xff]/', $split_array);
- +
- + return count($word_count);
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.date_format.php b/library/smarty/plugins/modifier.date_format.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.date_format.php
- @@ -0,0 +1,58 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Include the {@link shared.make_timestamp.php} plugin
- + */
- +require_once $smarty->_get_plugin_filepath('shared', 'make_timestamp');
- +/**
- + * Smarty date_format modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: date_format<br>
- + * Purpose: format datestamps via strftime<br>
- + * Input:<br>
- + * - string: input date string
- + * - format: strftime format for output
- + * - default_date: default date if $string is empty
- + * @link http://smarty.php.net/manual/en/language.modifier.date.format.php
- + * date_format (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @param string
- + * @param string
- + * @return string|void
- + * @uses smarty_make_timestamp()
- + */
- +function smarty_modifier_date_format($string, $format = '%b %e, %Y', $default_date = '')
- +{
- + if ($string != '') {
- + $timestamp = smarty_make_timestamp($string);
- + } elseif ($default_date != '') {
- + $timestamp = smarty_make_timestamp($default_date);
- + } else {
- + return;
- + }
- + if (DIRECTORY_SEPARATOR == '\\') {
- + $_win_from = array('%D', '%h', '%n', '%r', '%R', '%t', '%T');
- + $_win_to = array('%m/%d/%y', '%b', "\n", '%I:%M:%S %p', '%H:%M', "\t", '%H:%M:%S');
- + if (strpos($format, '%e') !== false) {
- + $_win_from[] = '%e';
- + $_win_to[] = sprintf('%\' 2d', date('j', $timestamp));
- + }
- + if (strpos($format, '%l') !== false) {
- + $_win_from[] = '%l';
- + $_win_to[] = sprintf('%\' 2d', date('h', $timestamp));
- + }
- + $format = str_replace($_win_from, $_win_to, $format);
- + }
- + return strftime($format, $timestamp);
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.debug_print_var.php b/library/smarty/plugins/modifier.debug_print_var.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.debug_print_var.php
- @@ -0,0 +1,90 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty debug_print_var modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: debug_print_var<br>
- + * Purpose: formats variable contents for display in the console
- + * @link http://smarty.php.net/manual/en/language.modifier.debug.print.var.php
- + * debug_print_var (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param array|object
- + * @param integer
- + * @param integer
- + * @return string
- + */
- +function smarty_modifier_debug_print_var($var, $depth = 0, $length = 40)
- +{
- + $_replace = array(
- + "\n" => '<i>\n</i>',
- + "\r" => '<i>\r</i>',
- + "\t" => '<i>\t</i>'
- + );
- +
- + switch (gettype($var)) {
- + case 'array' :
- + $results = '<b>Array (' . count($var) . ')</b>';
- + foreach ($var as $curr_key => $curr_val) {
- + $results .= '<br>' . str_repeat(' ', $depth * 2)
- + . '<b>' . strtr($curr_key, $_replace) . '</b> => '
- + . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
- + $depth--;
- + }
- + break;
- + case 'object' :
- + $object_vars = get_object_vars($var);
- + $results = '<b>' . get_class($var) . ' Object (' . count($object_vars) . ')</b>';
- + foreach ($object_vars as $curr_key => $curr_val) {
- + $results .= '<br>' . str_repeat(' ', $depth * 2)
- + . '<b> ->' . strtr($curr_key, $_replace) . '</b> = '
- + . smarty_modifier_debug_print_var($curr_val, ++$depth, $length);
- + $depth--;
- + }
- + break;
- + case 'boolean' :
- + case 'NULL' :
- + case 'resource' :
- + if (true === $var) {
- + $results = 'true';
- + } elseif (false === $var) {
- + $results = 'false';
- + } elseif (null === $var) {
- + $results = 'null';
- + } else {
- + $results = htmlspecialchars((string) $var);
- + }
- + $results = '<i>' . $results . '</i>';
- + break;
- + case 'integer' :
- + case 'float' :
- + $results = htmlspecialchars((string) $var);
- + break;
- + case 'string' :
- + $results = strtr($var, $_replace);
- + if (strlen($var) > $length ) {
- + $results = substr($var, 0, $length - 3) . '...';
- + }
- + $results = htmlspecialchars('"' . $results . '"');
- + break;
- + case 'unknown type' :
- + default :
- + $results = strtr((string) $var, $_replace);
- + if (strlen($results) > $length ) {
- + $results = substr($results, 0, $length - 3) . '...';
- + }
- + $results = htmlspecialchars($results);
- + }
- +
- + return $results;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.default.php b/library/smarty/plugins/modifier.default.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.default.php
- @@ -0,0 +1,32 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty default modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: default<br>
- + * Purpose: designate default value for empty variables
- + * @link http://smarty.php.net/manual/en/language.modifier.default.php
- + * default (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @param string
- + * @return string
- + */
- +function smarty_modifier_default($string, $default = '')
- +{
- + if (!isset($string) || $string === '')
- + return $default;
- + else
- + return $string;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.escape.php b/library/smarty/plugins/modifier.escape.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.escape.php
- @@ -0,0 +1,93 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty escape modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: escape<br>
- + * Purpose: Escape the string according to escapement type
- + * @link http://smarty.php.net/manual/en/language.modifier.escape.php
- + * escape (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @param html|htmlall|url|quotes|hex|hexentity|javascript
- + * @return string
- + */
- +function smarty_modifier_escape($string, $esc_type = 'html', $char_set = 'ISO-8859-1')
- +{
- + switch ($esc_type) {
- + case 'html':
- + return htmlspecialchars($string, ENT_QUOTES, $char_set);
- +
- + case 'htmlall':
- + return htmlentities($string, ENT_QUOTES, $char_set);
- +
- + case 'url':
- + return rawurlencode($string);
- +
- + case 'urlpathinfo':
- + return str_replace('%2F','/',rawurlencode($string));
- +
- + case 'quotes':
- + // escape unescaped single quotes
- + return preg_replace("%(?<!\\\\)'%", "\\'", $string);
- +
- + case 'hex':
- + // escape every character into hex
- + $return = '';
- + for ($x=0; $x < strlen($string); $x++) {
- + $return .= '%' . bin2hex($string[$x]);
- + }
- + return $return;
- +
- + case 'hexentity':
- + $return = '';
- + for ($x=0; $x < strlen($string); $x++) {
- + $return .= '&#x' . bin2hex($string[$x]) . ';';
- + }
- + return $return;
- +
- + case 'decentity':
- + $return = '';
- + for ($x=0; $x < strlen($string); $x++) {
- + $return .= '&#' . ord($string[$x]) . ';';
- + }
- + return $return;
- +
- + case 'javascript':
- + // escape quotes and backslashes, newlines, etc.
- + return strtr($string, array('\\'=>'\\\\',"'"=>"\\'",'"'=>'\\"',"\r"=>'\\r',"\n"=>'\\n','</'=>'<\/'));
- +
- + case 'mail':
- + // safe way to display e-mail address on a web page
- + return str_replace(array('@', '.'),array(' [AT] ', ' [DOT] '), $string);
- +
- + case 'nonstd':
- + // escape non-standard chars, such as ms document quotes
- + $_res = '';
- + for($_i = 0, $_len = strlen($string); $_i < $_len; $_i++) {
- + $_ord = ord(substr($string, $_i, 1));
- + // non-standard char, escape it
- + if($_ord >= 126){
- + $_res .= '&#' . $_ord . ';';
- + }
- + else {
- + $_res .= substr($string, $_i, 1);
- + }
- + }
- + return $_res;
- +
- + default:
- + return $string;
- + }
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.indent.php b/library/smarty/plugins/modifier.indent.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.indent.php
- @@ -0,0 +1,28 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty indent modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: indent<br>
- + * Purpose: indent lines of text
- + * @link http://smarty.php.net/manual/en/language.modifier.indent.php
- + * indent (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @param integer
- + * @param string
- + * @return string
- + */
- +function smarty_modifier_indent($string,$chars=4,$char=" ")
- +{
- + return preg_replace('!^!m',str_repeat($char,$chars),$string);
- +}
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.lower.php b/library/smarty/plugins/modifier.lower.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.lower.php
- @@ -0,0 +1,26 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty lower modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: lower<br>
- + * Purpose: convert string to lowercase
- + * @link http://smarty.php.net/manual/en/language.modifier.lower.php
- + * lower (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @return string
- + */
- +function smarty_modifier_lower($string)
- +{
- + return strtolower($string);
- +}
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.nl2br.php b/library/smarty/plugins/modifier.nl2br.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.nl2br.php
- @@ -0,0 +1,35 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty plugin
- + *
- + * Type: modifier<br>
- + * Name: nl2br<br>
- + * Date: Feb 26, 2003
- + * Purpose: convert \r\n, \r or \n to <<br>>
- + * Input:<br>
- + * - contents = contents to replace
- + * - preceed_test = if true, includes preceeding break tags
- + * in replacement
- + * Example: {$text|nl2br}
- + * @link http://smarty.php.net/manual/en/language.modifier.nl2br.php
- + * nl2br (Smarty online manual)
- + * @version 1.0
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @return string
- + */
- +function smarty_modifier_nl2br($string)
- +{
- + return nl2br($string);
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.regex_replace.php b/library/smarty/plugins/modifier.regex_replace.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.regex_replace.php
- @@ -0,0 +1,48 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty regex_replace modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: regex_replace<br>
- + * Purpose: regular expression search/replace
- + * @link http://smarty.php.net/manual/en/language.modifier.regex.replace.php
- + * regex_replace (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @param string|array
- + * @param string|array
- + * @return string
- + */
- +function smarty_modifier_regex_replace($string, $search, $replace)
- +{
- + if(is_array($search)) {
- + foreach($search as $idx => $s)
- + $search[$idx] = _smarty_regex_replace_check($s);
- + } else {
- + $search = _smarty_regex_replace_check($search);
- + }
- +
- + return preg_replace($search, $replace, $string);
- +}
- +
- +function _smarty_regex_replace_check($search)
- +{
- + if (($pos = strpos($search,"\0")) !== false)
- + $search = substr($search,0,$pos);
- + if (preg_match('!([a-zA-Z\s]+)$!s', $search, $match) && (strpos($match[1], 'e') !== false)) {
- + /* remove eval-modifier from $search */
- + $search = substr($search, 0, -strlen($match[1])) . preg_replace('![e\s]+!', '', $match[1]);
- + }
- + return $search;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.replace.php b/library/smarty/plugins/modifier.replace.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.replace.php
- @@ -0,0 +1,30 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty replace modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: replace<br>
- + * Purpose: simple search/replace
- + * @link http://smarty.php.net/manual/en/language.modifier.replace.php
- + * replace (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @param string
- + * @param string
- + * @return string
- + */
- +function smarty_modifier_replace($string, $search, $replace)
- +{
- + return str_replace($search, $replace, $string);
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.spacify.php b/library/smarty/plugins/modifier.spacify.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.spacify.php
- @@ -0,0 +1,30 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty spacify modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: spacify<br>
- + * Purpose: add spaces between characters in a string
- + * @link http://smarty.php.net/manual/en/language.modifier.spacify.php
- + * spacify (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @param string
- + * @return string
- + */
- +function smarty_modifier_spacify($string, $spacify_char = ' ')
- +{
- + return implode($spacify_char,
- + preg_split('//', $string, -1, PREG_SPLIT_NO_EMPTY));
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.string_format.php b/library/smarty/plugins/modifier.string_format.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.string_format.php
- @@ -0,0 +1,29 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty string_format modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: string_format<br>
- + * Purpose: format strings via sprintf
- + * @link http://smarty.php.net/manual/en/language.modifier.string.format.php
- + * string_format (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @param string
- + * @return string
- + */
- +function smarty_modifier_string_format($string, $format)
- +{
- + return sprintf($format, $string);
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.strip.php b/library/smarty/plugins/modifier.strip.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.strip.php
- @@ -0,0 +1,33 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty strip modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: strip<br>
- + * Purpose: Replace all repeated spaces, newlines, tabs
- + * with a single space or supplied replacement string.<br>
- + * Example: {$var|strip} {$var|strip:" "}
- + * Date: September 25th, 2002
- + * @link http://smarty.php.net/manual/en/language.modifier.strip.php
- + * strip (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @version 1.0
- + * @param string
- + * @param string
- + * @return string
- + */
- +function smarty_modifier_strip($text, $replace = ' ')
- +{
- + return preg_replace('!\s+!', $replace, $text);
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.strip_tags.php b/library/smarty/plugins/modifier.strip_tags.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.strip_tags.php
- @@ -0,0 +1,32 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty strip_tags modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: strip_tags<br>
- + * Purpose: strip html tags from text
- + * @link http://smarty.php.net/manual/en/language.modifier.strip.tags.php
- + * strip_tags (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @param boolean
- + * @return string
- + */
- +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: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.truncate.php b/library/smarty/plugins/modifier.truncate.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.truncate.php
- @@ -0,0 +1,50 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty truncate modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: truncate<br>
- + * Purpose: Truncate a string to a certain length if necessary,
- + * optionally splitting in the middle of a word, and
- + * appending the $etc string or inserting $etc into the middle.
- + * @link http://smarty.php.net/manual/en/language.modifier.truncate.php
- + * truncate (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @param integer
- + * @param string
- + * @param boolean
- + * @param boolean
- + * @return string
- + */
- +function smarty_modifier_truncate($string, $length = 80, $etc = '...',
- + $break_words = false, $middle = false)
- +{
- + if ($length == 0)
- + return '';
- +
- + if (strlen($string) > $length) {
- + $length -= min($length, strlen($etc));
- + if (!$break_words && !$middle) {
- + $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
- + }
- + if(!$middle) {
- + return substr($string, 0, $length) . $etc;
- + } else {
- + return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
- + }
- + } else {
- + return $string;
- + }
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.upper.php b/library/smarty/plugins/modifier.upper.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.upper.php
- @@ -0,0 +1,26 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty upper modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: upper<br>
- + * Purpose: convert string to uppercase
- + * @link http://smarty.php.net/manual/en/language.modifier.upper.php
- + * upper (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @return string
- + */
- +function smarty_modifier_upper($string)
- +{
- + return strtoupper($string);
- +}
- +
- +?>
- diff --git a/library/smarty/plugins/modifier.wordwrap.php b/library/smarty/plugins/modifier.wordwrap.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/modifier.wordwrap.php
- @@ -0,0 +1,29 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Smarty wordwrap modifier plugin
- + *
- + * Type: modifier<br>
- + * Name: wordwrap<br>
- + * Purpose: wrap a string of text at a given length
- + * @link http://smarty.php.net/manual/en/language.modifier.wordwrap.php
- + * wordwrap (Smarty online manual)
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @param integer
- + * @param string
- + * @param boolean
- + * @return string
- + */
- +function smarty_modifier_wordwrap($string,$length=80,$break="\n",$cut=false)
- +{
- + return wordwrap($string,$length,$break,$cut);
- +}
- +
- +?>
- diff --git a/library/smarty/plugins/outputfilter.trimwhitespace.php b/library/smarty/plugins/outputfilter.trimwhitespace.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/outputfilter.trimwhitespace.php
- @@ -0,0 +1,75 @@
- +<?php
- +/**
- + * Smarty plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +/**
- + * Smarty trimwhitespace outputfilter plugin
- + *
- + * File: outputfilter.trimwhitespace.php<br>
- + * Type: outputfilter<br>
- + * Name: trimwhitespace<br>
- + * Date: Jan 25, 2003<br>
- + * Purpose: trim leading white space and blank lines from
- + * template source after it gets interpreted, cleaning
- + * up code and saving bandwidth. Does not affect
- + * <<PRE>></PRE> and <SCRIPT></SCRIPT> blocks.<br>
- + * Install: Drop into the plugin directory, call
- + * <code>$smarty->load_filter('output','trimwhitespace');</code>
- + * from application.
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @author Contributions from Lars Noschinski <lars@usenet.noschinski.de>
- + * @version 1.3
- + * @param string
- + * @param Smarty
- + */
- +function smarty_outputfilter_trimwhitespace($source, &$smarty)
- +{
- + // Pull out the script blocks
- + preg_match_all("!<script[^>]*?>.*?</script>!is", $source, $match);
- + $_script_blocks = $match[0];
- + $source = preg_replace("!<script[^>]*?>.*?</script>!is",
- + '@@@SMARTY:TRIM:SCRIPT@@@', $source);
- +
- + // Pull out the pre blocks
- + preg_match_all("!<pre[^>]*?>.*?</pre>!is", $source, $match);
- + $_pre_blocks = $match[0];
- + $source = preg_replace("!<pre[^>]*?>.*?</pre>!is",
- + '@@@SMARTY:TRIM:PRE@@@', $source);
- +
- + // Pull out the textarea blocks
- + preg_match_all("!<textarea[^>]*?>.*?</textarea>!is", $source, $match);
- + $_textarea_blocks = $match[0];
- + $source = preg_replace("!<textarea[^>]*?>.*?</textarea>!is",
- + '@@@SMARTY:TRIM:TEXTAREA@@@', $source);
- +
- + // remove all leading spaces, tabs and carriage returns NOT
- + // preceeded by a php close tag.
- + $source = trim(preg_replace('/((?<!\?>)\n)[\s]+/m', '', $source));
- +
- + // replace textarea blocks
- + smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:TEXTAREA@@@",$_textarea_blocks, $source);
- +
- + // replace pre blocks
- + smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:PRE@@@",$_pre_blocks, $source);
- +
- + // replace script blocks
- + smarty_outputfilter_trimwhitespace_replace("@@@SMARTY:TRIM:SCRIPT@@@",$_script_blocks, $source);
- +
- + return $source;
- +}
- +
- +function smarty_outputfilter_trimwhitespace_replace($search_str, $replace, &$subject) {
- + $_len = strlen($search_str);
- + $_pos = 0;
- + for ($_i=0, $_count=count($replace); $_i<$_count; $_i++)
- + if (($_pos=strpos($subject, $search_str, $_pos))!==false)
- + $subject = substr_replace($subject, $replace[$_i], $_pos, $_len);
- + else
- + break;
- +
- +}
- +
- +?>
- diff --git a/library/smarty/plugins/shared.escape_special_chars.php b/library/smarty/plugins/shared.escape_special_chars.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/shared.escape_special_chars.php
- @@ -0,0 +1,31 @@
- +<?php
- +/**
- + * Smarty shared plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * escape_special_chars common function
- + *
- + * Function: smarty_function_escape_special_chars<br>
- + * Purpose: used by other smarty functions to escape
- + * special chars except for already escaped ones
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @return string
- + */
- +function smarty_function_escape_special_chars($string)
- +{
- + if(!is_array($string)) {
- + $string = preg_replace('!&(#?\w+);!', '%%%SMARTY_START%%%\%%%SMARTY_END%%%', $string);
- + $string = htmlspecialchars($string);
- + $string = str_replace(array('%%%SMARTY_START%%%','%%%SMARTY_END%%%'), array('&',';'), $string);
- + }
- + return $string;
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/library/smarty/plugins/shared.make_timestamp.php b/library/smarty/plugins/shared.make_timestamp.php
- new file mode 100644
- --- /dev/null
- +++ b/library/smarty/plugins/shared.make_timestamp.php
- @@ -0,0 +1,46 @@
- +<?php
- +/**
- + * Smarty shared plugin
- + * @package Smarty
- + * @subpackage plugins
- + */
- +
- +
- +/**
- + * Function: smarty_make_timestamp<br>
- + * Purpose: used by other smarty functions to make a timestamp
- + * from a string.
- + * @author Monte Ohrt <monte at ohrt dot com>
- + * @param string
- + * @return string
- + */
- +function smarty_make_timestamp($string)
- +{
- + if(empty($string)) {
- + // use "now":
- + $time = time();
- +
- + } elseif (preg_match('/^\d{14}$/', $string)) {
- + // it is mysql timestamp format of YYYYMMDDHHMMSS?
- + $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));
- +
- + } elseif (is_numeric($string)) {
- + // it is a numeric string, we handle it as timestamp
- + $time = (int)$string;
- +
- + } else {
- + // strtotime should handle it
- + $time = strtotime($string);
- + if ($time == -1 || $time === false) {
- + // strtotime() was not able to parse $string, use "now":
- + $time = time();
- + }
- + }
- + return $time;
- +
- +}
- +
- +/* vim: set expandtab: */
- +
- +?>
- diff --git a/templates/default/html_css.tpl b/templates/default/html_css.tpl
- new file mode 100644
- --- /dev/null
- +++ b/templates/default/html_css.tpl
- @@ -0,0 +1,8 @@
- +
- + <link rel="stylesheet" type="text/css" href="{$path}css/{config_get option='css_include_file'}" />
- + <link rel="stylesheet" type="text/css" href="{$path}css/jquery-ui.css" />
- + <link rel="stylesheet" type="text/css" href="{$path}css/common_config.php" />
- + {* Add right-to-left css if needed *}
- + {if $directionality == 'rtl'}<link rel="stylesheet" type="text/css" href="{$path}css/{config_get option='css_rtl_include_file'|escape:'html'}" />{/if}
- + {foreach from=$g_stylesheets_included item=t_stylesheet_path }<link rel="stylesheet" type="text/css" href="{$path}css/{$t_stylesheet_path|escape:'html'}" />{/foreach}
- +
- diff --git a/templates/default/html_footer.tpl b/templates/default/html_footer.tpl
- new file mode 100644
- --- /dev/null
- +++ b/templates/default/html_footer.tpl
- @@ -0,0 +1,27 @@
- + <div id="footer">
- + <hr />
- + <div id="powered-by-mantisbt-logo">
- + <a href="http://www.mantisbt.org" title="Mantis Bug Tracker: a free and open source web based bug tracking system."><img src="{$short_path}images/mantis_logo_button.gif" width="88" height="35" alt="Powered by Mantis Bug Tracker: a free and open source web based bug tracking system." /></a>
- + </div>
- +
- + {* Show optional user-specificed custom copyright statement *}
- + {if $copyright_statement}
- + <address id="user-copyright">$t_copyright_statement</address>
- + {/if}
- +
- + {* Show MantisBT version and copyright statement *}
- + <address id="mantisbt-copyright">Powered by <a href="http://www.mantisbt.org" title="Mantis Bug Tracker: a free and open source web based bug tracking system.">Mantis Bug Tracker</a> (MantisBT){$t_version_suffix}. Copyright ©{$t_copyright_years} MantisBT contributors. Licensed under the terms of the <a href="http://www.gnu.org/licenses/old-licenses/gpl-2.0.html" title="GNU General Public License (GPL) version 2">GNU General Public License (GPL) version 2</a> or a later version.</address>
- +
- + {* Show contact information *}
- + <address id="webmaster-contact-information">{lang_get string='webmaster_contact_information'}{config_get option='webmaster_email'}</address>
- +
- + { if $horizontal }<hr />{/if}
- +
- + {if $t_page_execution_time}<p id="page-execution-time">$t_page_execution_time</p>{/if}
- + {if $t_page_memory_usage}<p id="page-memory-usage">$t_page_memory_usage</p>{/if}
- + {if $t_total_queries_executed}<p id="total-queries-count">$t_total_queries_executed</p>{/if}
- + {if $t_unique_queries_executed}<p id="unique-queries-count">$t_unique_queries_executed</p>{/if}
- + {if $t_total_query_time}<p id="total-query-execution-time">$t_total_query_time</p>{/if}
- +
- + {$log_events}
- + </div>
- diff --git a/templates/default/html_head_javascript.tpl b/templates/default/html_head_javascript.tpl
- new file mode 100644
- --- /dev/null
- +++ b/templates/default/html_head_javascript.tpl
- @@ -0,0 +1,10 @@
- +
- + <script type="text/javascript" src="{$short_path}/javascript_config.php"></script>
- + <script type="text/javascript" src="{$short_path}/javascript_translations.php"></script>
- + <script type="text/javascript" src="{$short_path}/javascript/jquery.js"></script>
- + <script type="text/javascript" src="{$short_path}/javascript/jquery-ui.js"></script>
- + <script type="text/javascript" src="{$short_path}/javascript/common.js"></script>
- + {foreach from=$g_scripts_included item=p_filename}
- + <script type="text/javascript" src="{$short_path}/javascript/{$p_filename|escape:'html'}"></script>
- + {/foreach}
- +
- diff --git a/templates/default/html_login_info.tpl b/templates/default/html_login_info.tpl
- new file mode 100644
- --- /dev/null
- +++ b/templates/default/html_login_info.tpl
- @@ -0,0 +1,43 @@
- +
- + <div id="login-info">
- + {if current_user_is_anonymous() }
- + <span id="logged-anon-label">{ lang_get string='anonymous'}</span>
- + <span id="login-link"><a href="{$path}login_page.php?return={$t_return_page}">{lang_get string='login_link'}</a></span>
- + {if $allow_signup}
- + <span id="signup-link"><a href="{$path}signup_page.php">{lang_get string='signup_link'}</a></span>
- + {/if}
- + {else}
- + <span id="logged-in-label">{lang_get string='logged_in_as'}</span>
- + <span id="logged-in-user">{$t_username}</span>
- + <span id="logged-in">
- + {if $t_realname}<span id="logged-in-realname">{$t_realname}</span>{/if}
- + <span id="logged-in-accesslevel" class="{$t_access_level}">{$t_access_level}</span>
- + </span>
- + {/if}
- + </div>
- +
- + {if $rss_enabled}
- + <div id="rss-feed">
- + {* Link to RSS issues feed for the selected project, including authentication details. *}
- + <a href="{$rss_get_issues_feed_url|escape:'html'}">
- + <img src="{$short_path}images/rss.png" alt="{lang_get string='rss'}" title="{lang_get string='rss'}" />
- + </a>
- + </div>
- + {/if}
- +
- + {if $t_show_project_selector }
- + <form method="post" id="form-set-project" action="{$short_path}set_project.php">
- + <fieldset id="project-selector">
- + {* CSRF protection not required here - form does not result in modifications *}
- + <label for="form-set-project-id">{lang_get string='email_project'}</label>
- + <select id="form-set-project-id" name="project_id">
- + {$project_option_list}
- + </select>
- + <input type="submit" class="button" value="{lang_get string='switch'}" />
- + </fieldset>
- + </form>
- + <div id="current-time">{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}</div>
- + {else}
- + <div id="current-time-centered">{$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}</div>
- + {/if}
- +
- diff --git a/templates/default/html_menu.tpl b/templates/default/html_menu.tpl
- new file mode 100644
- --- /dev/null
- +++ b/templates/default/html_menu.tpl
- @@ -0,0 +1,46 @@
- + {if auth_is_user_authenticated()}
- + <form method="post" action="{$short_path}jump_to_bug.php" class="bug-jump-form">
- + <fieldset class="bug-jump">
- + {* CSRF protection not required here - form does not result in modifications *}
- + <input type="hidden" name="bug_label" value="{lang_get string='issue_id'}" />
- + <input type="text" name="bug_id" size="10" class="small" />
- + <input type="submit" class="button-small" value="{lang_get string='jump'}" />
- + </fieldset>
- + </form>
- +
- + <div class="main-menu">
- + <div>
- + <ul class="menu">
- + {* Main Page *}
- + <li><a href="{$short_path}main_page.php">{lang_get string='main_link'}</a></li>
- +
- + {foreach from=$t_menu_plugin_pre_options item=t_menu_option}
- + <li>{$t_menu_option}</li>
- + {/foreach}
- +
- + {foreach from=$t_menu_options item=t_menu_option}
- + <li>{$t_menu_option}</li>
- + {/foreach}
- +
- + {foreach from=$menu_plugin_post_options item=t_menu_option}
- + <li>{$t_menu_option}</li>
- + {/foreach}
- +
- + {foreach from=$t_menu_extra_options item=t_menu_option}
- + <li>{$t_menu_option}</li>
- + {/foreach}
- +
- + {* Time Tracking / Billing *}
- + {if $t_time_tracking_enabled}
- + <li><a href="{$short_path}billing_page.php">{lang_get string='time_tracking_billing_link'}</a></li>
- + {/if}
- +
- + {* Logout (no if anonymously logged in) *}
- + {if !current_user_is_anonymous()}
- + <li><a id="logout-link" href="{$short_path}logout_page.php">{lang_get string='logout_link'}</a></li>
- + {/if}
- + </ul>
- + </div>
- + </div>
- + {/if}
- +
- diff --git a/templates/default/html_top_banner.tpl b/templates/default/html_top_banner.tpl
- new file mode 100644
- --- /dev/null
- +++ b/templates/default/html_top_banner.tpl
- @@ -0,0 +1,15 @@
- +
- + {if $t_page }
- + {include_php file=$t_page};
- + {elseif $t_show_logo }
- + <div id="banner">
- + {if $t_show_url }
- + <a id="logo-link" href="{config_get option='logo_url'|escape:'html'}">
- + {/if}
- + <img id="logo-image" alt="Mantis Bug Tracker" src="{$path}{config_get option='logo_image'|escape:'html'}" />
- + {if $t_show_url}
- + </a>
- + {/if}
- + </div>
- + {/if}
- +
- diff --git a/templates/default/main.tpl b/templates/default/main.tpl
- new file mode 100644
- --- /dev/null
- +++ b/templates/default/main.tpl
- @@ -0,0 +1,49 @@
- +<?xml version="1.0" encoding="utf-8"?>
- +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- +<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en" >
- +
- +<head>
- + {include file='html_css.tpl'}
- +
- + <meta http-equiv="Content-type" content="application/xhtml+xml; charset=UTF-8" />
- + {include_php file=$meta_include_file}
- +
- + {if $g_robots_meta}<meta name="robots" content="{$g_robots_meta}" />{/if}
- +
- + {if $g_rss_feed_url}<link rel="alternate" type="application/rss+xml" title="RSS" href="{$g_rss_feed_url}" />{/if}
- +
- + {if $t_favicon_image}<link rel="shortcut icon" href="{$short_path}{$t_favicon_image}" type="image/x-icon" />{/if}
- +
- + <link rel="search" type="application/opensearchdescription+xml" title="MantisBT: Text Search" href="{$path}browser_search_plugin.php?type=text" />
- + <link rel="search" type="application/opensearchdescription+xml" title="MantisBT: Issue Id" href="{$path}browser_search_plugin.php?type=id" />
- +
- + <title>{$t_title}</title>
- +
- + {include file='html_head_javascript.tpl'}
- +
- + {if $t_url}
- + <meta http-equiv="Refresh" content="{$p_time};URL={$t_url}" />
- + {/if}
- +
- +</head>
- +
- +<body>
- +
- + <div id="mantis">
- +
- + {include file='html_top_banner.tpl'}
- + {* include file='html_login_info.tpl' *}
- + {include file='html_menu.tpl'}
- +
- + <div id="content">
- + {$content}
- + </div>
- +
- + {include file='html_footer.tpl'}
- +
- + </div>
- +
- +</body>
- +
- +</html>
- +
Add Comment
Please, Sign In to add comment