2009-12-29 20:12:51 +00:00
< ? php
/**
2010-02-27 23:28:14 +00:00
* Smarty Internal Plugin Smarty Template Compiler Base
*
* This file contains the basic classes and methodes for compiling Smarty templates with lexer / parser
*
* @ package Smarty
* @ subpackage Compiler
* @ author Uwe Tews
*/
2010-08-17 15:39:51 +00:00
2009-12-29 20:12:51 +00:00
/**
2010-02-27 23:28:14 +00:00
* Main compiler class
*/
2009-12-29 20:12:51 +00:00
class Smarty_Internal_TemplateCompilerBase {
2010-01-09 19:23:35 +00:00
// hash for nocache sections
private $nocache_hash = null ;
// suppress generation of nocache code
2010-02-05 17:03:22 +00:00
public $suppressNocacheProcessing = false ;
2009-12-29 20:12:51 +00:00
// compile tag objects
static $_tag_objects = array ();
// tag stack
public $_tag_stack = array ();
// current template
2010-02-09 21:20:17 +00:00
public $template = null ;
2010-11-11 21:34:36 +00:00
// optional log of tag/attributes
public $used_tags = array ();
2009-12-29 20:12:51 +00:00
/**
2010-02-27 23:28:14 +00:00
* Initialize compiler
*/
2009-12-29 20:12:51 +00:00
public function __construct ()
{
$this -> nocache_hash = str_replace ( '.' , '-' , uniqid ( rand (), true ));
2009-12-30 14:26:42 +00:00
}
// abstract function doCompile($_content);
/**
2010-02-27 23:28:14 +00:00
* Methode to compile a Smarty template
*
* @ param $template template object to compile
* @ return bool true if compiling succeeded , false if it failed
*/
2009-12-30 14:26:42 +00:00
public function compileTemplate ( $template )
{
2010-01-07 19:33:18 +00:00
if ( empty ( $template -> properties [ 'nocache_hash' ])) {
$template -> properties [ 'nocache_hash' ] = $this -> nocache_hash ;
} else {
$this -> nocache_hash = $template -> properties [ 'nocache_hash' ];
}
2009-12-30 14:26:42 +00:00
// flag for nochache sections
$this -> nocache = false ;
$this -> tag_nocache = false ;
// save template object in compiler class
$this -> template = $template ;
$this -> smarty -> _current_file = $this -> template -> getTemplateFilepath ();
// template header code
$template_header = '' ;
if ( ! $template -> suppressHeader ) {
$template_header .= " <?php /* Smarty version " . Smarty :: SMARTY_VERSION . " , created on " . strftime ( " %Y-%m-%d %H:%M:%S " ) . " \n " ;
$template_header .= " compiled from \" " . $this -> template -> getTemplateFilepath () . " \" */ ?> \n " ;
}
2009-12-29 20:12:51 +00:00
2009-12-30 14:26:42 +00:00
do {
// flag for aborting current and start recompile
$this -> abort_and_recompile = false ;
// get template source
$_content = $template -> getTemplateSource ();
// run prefilter if required
if ( isset ( $this -> smarty -> autoload_filters [ 'pre' ]) || isset ( $this -> smarty -> registered_filters [ 'pre' ])) {
2010-11-22 19:43:11 +00:00
$template -> template_source = $_content = Smarty_Internal_Filter_Handler :: runFilter ( 'pre' , $_content , $template );
2009-12-30 14:26:42 +00:00
}
// on empty template just return header
if ( $_content == '' ) {
2009-12-29 20:12:51 +00:00
if ( $template -> suppressFileDependency ) {
2009-12-30 14:26:42 +00:00
$template -> compiled_template = '' ;
2009-12-29 20:12:51 +00:00
} else {
2009-12-30 14:26:42 +00:00
$template -> compiled_template = $template_header . $template -> createPropertyHeader ();
2009-12-29 20:12:51 +00:00
}
return true ;
2009-12-30 14:26:42 +00:00
}
// call compiler
$_compiled_code = $this -> doCompile ( $_content );
2010-03-31 16:23:01 +00:00
} while ( $this -> abort_and_recompile );
// return compiled code to template object
if ( $template -> suppressFileDependency ) {
$template -> compiled_template = $_compiled_code ;
2009-12-30 14:26:42 +00:00
} else {
2010-03-31 16:23:01 +00:00
$template -> compiled_template = $template_header . $template -> createPropertyHeader () . $_compiled_code ;
}
// run postfilter if required
if ( isset ( $this -> smarty -> autoload_filters [ 'post' ]) || isset ( $this -> smarty -> registered_filters [ 'post' ])) {
2010-11-15 19:17:18 +00:00
$template -> compiled_template = Smarty_Internal_Filter_Handler :: runFilter ( 'post' , $template -> compiled_template , $template );
2009-12-29 20:12:51 +00:00
}
2009-12-30 14:26:42 +00:00
}
2009-12-29 20:12:51 +00:00
2009-12-30 14:26:42 +00:00
/**
2010-02-27 23:28:14 +00:00
* Compile Tag
*
* This is a call back from the lexer / parser
* It executes the required compile plugin for the Smarty tag
*
* @ param string $tag tag name
* @ param array $args array with tag attributes
2010-11-11 21:34:36 +00:00
* @ param array $parameter array with compilation parameter
2010-02-27 23:28:14 +00:00
* @ return string compiled code
*/
2010-11-11 21:34:36 +00:00
public function compileTag ( $tag , $args , $parameter = array ())
2009-12-30 14:26:42 +00:00
{
// $args contains the attributes parsed and compiled by the lexer/parser
// assume that tag does compile into code, but creates no HTML output
$this -> has_code = true ;
2010-11-11 21:34:36 +00:00
$this -> has_output = false ;
// log tag/attributes
if ( isset ( $this -> smarty -> get_used_tags ) && $this -> smarty -> get_used_tags ) {
$this -> used_tags [] = array ( $tag , $args );
}
// check nocache option flag
if ( in_array ( " 'nocache' " , $args ) || in_array ( array ( 'nocache' => 'true' ), $args )
|| in_array ( array ( 'nocache' => '"true"' ), $args ) || in_array ( array ( 'nocache' => " 'true' " ), $args )) {
$this -> tag_nocache = true ;
}
2009-12-30 14:26:42 +00:00
// compile the smarty tag (required compile classes to compile the tag are autoloaded)
2010-11-11 21:34:36 +00:00
if (( $_output = $this -> callTagCompiler ( $tag , $args , $parameter )) === false ) {
2010-05-11 17:01:08 +00:00
if ( isset ( $this -> smarty -> template_functions [ $tag ])) {
// template defined by {template} tag
2010-11-11 21:34:36 +00:00
$args [ '_attr' ][ 'name' ] = " ' " . $tag . " ' " ;
$_output = $this -> callTagCompiler ( 'call' , $args , $parameter );
2010-05-11 17:01:08 +00:00
}
}
if ( $_output !== false ) {
2009-12-30 14:26:42 +00:00
if ( $_output !== true ) {
// did we get compiled code
if ( $this -> has_code ) {
// Does it create output?
if ( $this -> has_output ) {
$_output .= " \n " ;
2009-12-29 20:12:51 +00:00
}
2009-12-30 14:26:42 +00:00
// return compiled code
return $_output ;
2009-12-29 20:12:51 +00:00
}
2009-12-30 14:26:42 +00:00
}
// tag did not produce compiled code
return '' ;
} else {
2010-11-11 21:34:36 +00:00
// map_named attributes
if ( isset ( $args [ '_attr' ])) {
foreach ( $args [ '_attr' ] as $key => $attribute ) {
if ( is_array ( $attribute )) {
$args = array_merge ( $args , $attribute );
}
}
}
2009-12-30 14:26:42 +00:00
// not an internal compiler tag
2010-04-30 14:00:26 +00:00
if ( strlen ( $tag ) < 6 || substr ( $tag , - 5 ) != 'close' ) {
2009-12-30 14:26:42 +00:00
// check if tag is a registered object
2010-11-11 21:34:36 +00:00
if ( isset ( $this -> smarty -> registered_objects [ $tag ]) && isset ( $parameter [ 'object_methode' ])) {
$methode = $parameter [ 'object_methode' ];
2009-12-30 14:26:42 +00:00
if ( ! in_array ( $methode , $this -> smarty -> registered_objects [ $tag ][ 3 ]) &&
( empty ( $this -> smarty -> registered_objects [ $tag ][ 1 ]) || in_array ( $methode , $this -> smarty -> registered_objects [ $tag ][ 1 ]))) {
2010-11-11 21:34:36 +00:00
return $this -> callTagCompiler ( 'private_object_function' , $args , $parameter , $tag , $methode );
2009-12-30 14:26:42 +00:00
} elseif ( in_array ( $methode , $this -> smarty -> registered_objects [ $tag ][ 3 ])) {
2010-11-11 21:34:36 +00:00
return $this -> callTagCompiler ( 'private_object_block_function' , $args , $parameter , $tag , $methode );
2009-12-30 14:26:42 +00:00
} else {
return $this -> trigger_template_error ( 'unallowed methode "' . $methode . '" in registered object "' . $tag . '"' , $this -> lex -> taglineno );
2009-12-29 20:12:51 +00:00
}
2009-12-30 14:26:42 +00:00
}
// check if tag is registered
2010-11-11 21:34:36 +00:00
foreach ( array ( Smarty :: PLUGIN_COMPILER , Smarty :: PLUGIN_FUNCTION , Smarty :: PLUGIN_BLOCK ) as $type ) {
2009-12-30 14:26:42 +00:00
if ( isset ( $this -> smarty -> registered_plugins [ $type ][ $tag ])) {
// if compiler function plugin call it now
2010-11-11 21:34:36 +00:00
if ( $type == Smarty :: PLUGIN_COMPILER ) {
$new_args = array ();
foreach ( $args as $mixed ) {
$new_args = array_merge ( $new_args , $mixed );
}
2009-12-30 14:26:42 +00:00
if ( ! $this -> smarty -> registered_plugins [ $type ][ $tag ][ 1 ]) {
$this -> tag_nocache = true ;
2009-12-29 20:12:51 +00:00
}
2010-07-01 19:57:56 +00:00
$function = $this -> smarty -> registered_plugins [ $type ][ $tag ][ 0 ];
if ( ! is_array ( $function )) {
2010-11-11 21:34:36 +00:00
return $function ( $new_args , $this );
2010-07-01 19:57:56 +00:00
} else if ( is_object ( $function [ 0 ])) {
2010-11-11 21:34:36 +00:00
return $this -> smarty -> registered_plugins [ $type ][ $tag ][ 0 ][ 0 ] -> $function [ 1 ]( $new_args , $this );
2010-07-01 19:57:56 +00:00
} else {
2010-11-11 21:34:36 +00:00
return call_user_func_array ( $this -> smarty -> registered_plugins [ $type ][ $tag ][ 0 ], array ( $new_args , $this ));
2010-07-01 19:57:56 +00:00
}
2009-12-29 20:12:51 +00:00
}
2009-12-30 14:26:42 +00:00
// compile registered function or block function
2010-11-11 21:34:36 +00:00
if ( $type == Smarty :: PLUGIN_FUNCTION || $type == Smarty :: PLUGIN_BLOCK ) {
return $this -> callTagCompiler ( 'private_registered_' . $type , $args , $parameter , $tag );
2009-12-29 20:12:51 +00:00
}
}
2009-12-30 14:26:42 +00:00
}
// check plugins from plugins folder
foreach ( $this -> smarty -> plugin_search_order as $plugin_type ) {
2010-11-13 04:10:52 +00:00
if ( $plugin_type == Smarty :: PLUGIN_BLOCK && $this -> smarty -> loadPlugin ( 'smarty_compiler_' . $tag )) {
2009-12-29 20:12:51 +00:00
$plugin = 'smarty_compiler_' . $tag ;
2010-02-09 21:20:17 +00:00
if ( is_callable ( $plugin )) {
2010-02-27 23:28:14 +00:00
return $plugin ( $args , $this -> smarty );
2010-02-09 21:20:17 +00:00
}
2009-12-29 20:12:51 +00:00
if ( class_exists ( $plugin , false )) {
2010-02-27 23:28:14 +00:00
$plugin_object = new $plugin ;
if ( method_exists ( $plugin_object , 'compile' )) {
return $plugin_object -> compile ( $args , $this );
}
2009-12-29 20:12:51 +00:00
}
2010-08-13 10:39:51 +00:00
throw new SmartyException ( " Plugin \" { $tag } \" not callable " );
2009-12-30 14:26:42 +00:00
} else {
2010-01-01 12:07:36 +00:00
if ( $function = $this -> getPlugin ( $tag , $plugin_type )) {
2010-11-11 21:34:36 +00:00
return $this -> callTagCompiler ( 'private_' . $plugin_type . '_plugin' , $args , $parameter , $tag , $function );
2009-12-30 14:26:42 +00:00
}
}
}
} else {
// compile closing tag of block function
$base_tag = substr ( $tag , 0 , - 5 );
// check if closing tag is a registered object
2010-11-11 21:34:36 +00:00
if ( isset ( $this -> smarty -> registered_objects [ $base_tag ]) && isset ( $parameter [ 'object_methode' ])) {
$methode = $parameter [ 'object_methode' ];
2009-12-30 14:26:42 +00:00
if ( in_array ( $methode , $this -> smarty -> registered_objects [ $base_tag ][ 3 ])) {
2010-11-11 21:34:36 +00:00
return $this -> callTagCompiler ( 'private_object_block_function' , $args , $parameter , $tag , $methode );
2009-12-30 14:26:42 +00:00
} else {
return $this -> trigger_template_error ( 'unallowed closing tag methode "' . $methode . '" in registered object "' . $base_tag . '"' , $this -> lex -> taglineno );
}
}
// registered block tag ?
2010-11-11 21:34:36 +00:00
if ( isset ( $this -> smarty -> registered_plugins [ Smarty :: PLUGIN_BLOCK ][ $base_tag ])) {
return $this -> callTagCompiler ( 'private_registered_block' , $args , $parameter , $tag );
2009-12-30 14:26:42 +00:00
}
// block plugin?
2010-11-11 21:34:36 +00:00
if ( $function = $this -> getPlugin ( $base_tag , Smarty :: PLUGIN_BLOCK )) {
return $this -> callTagCompiler ( 'private_block_plugin' , $args , $parameter , $tag , $function );
2009-12-30 14:26:42 +00:00
}
2010-11-13 04:10:52 +00:00
if ( $this -> smarty -> loadPlugin ( 'smarty_compiler_' . $tag )) {
2009-12-30 14:26:42 +00:00
$plugin = 'smarty_compiler_' . $tag ;
2010-02-09 21:20:17 +00:00
if ( is_callable ( $plugin )) {
2010-02-27 23:28:14 +00:00
return $plugin ( $args , $this -> smarty );
2010-02-09 21:20:17 +00:00
}
2009-12-30 14:26:42 +00:00
if ( class_exists ( $plugin , false )) {
2010-02-27 23:28:14 +00:00
$plugin_object = new $plugin ;
if ( method_exists ( $plugin_object , 'compile' )) {
return $plugin_object -> compile ( $args , $this );
}
2009-12-29 20:12:51 +00:00
}
2010-08-13 10:39:51 +00:00
throw new SmartyException ( " Plugin \" { $tag } \" not callable " );
2009-12-29 20:12:51 +00:00
}
}
2009-12-30 14:26:42 +00:00
$this -> trigger_template_error ( " unknown tag \" " . $tag . " \" " , $this -> lex -> taglineno );
}
}
/**
2010-02-27 23:28:14 +00:00
* lazy loads internal compile plugin for tag and calls the compile methode
*
* compile objects cached for reuse .
* class name format : Smarty_Internal_Compile_TagName
* plugin filename format : Smarty_Internal_Tagname . php
*
* @ param $tag string tag name
* @ param $args array with tag attributes
* @ param $param1 optional parameter
* @ param $param2 optional parameter
* @ param $param3 optional parameter
* @ return string compiled code
*/
2009-12-30 14:26:42 +00:00
public function callTagCompiler ( $tag , $args , $param1 = null , $param2 = null , $param3 = null )
{
// re-use object if already exists
if ( isset ( self :: $_tag_objects [ $tag ])) {
// compile this tag
2010-02-27 23:28:14 +00:00
return self :: $_tag_objects [ $tag ] -> compile ( $args , $this , $param1 , $param2 , $param3 );
2009-12-30 14:26:42 +00:00
}
// lazy load internal compiler plugin
$class_name = 'Smarty_Internal_Compile_' . $tag ;
2010-11-13 04:10:52 +00:00
if ( $this -> smarty -> loadPlugin ( $class_name )) {
2009-12-30 14:26:42 +00:00
// use plugin if found
self :: $_tag_objects [ $tag ] = new $class_name ;
// compile this tag
2010-02-27 23:28:14 +00:00
return self :: $_tag_objects [ $tag ] -> compile ( $args , $this , $param1 , $param2 , $param3 );
2009-12-29 20:12:51 +00:00
}
2009-12-30 14:26:42 +00:00
// no internal compile plugin for this tag
return false ;
}
2009-12-29 20:12:51 +00:00
2009-12-30 14:26:42 +00:00
/**
2010-02-27 23:28:14 +00:00
* Check for plugins and return function name
*
* @ param $pugin_name string name of plugin or function
* @ param $type string type of plugin
* @ return string call name of function
*/
2009-12-30 14:26:42 +00:00
public function getPlugin ( $plugin_name , $type )
{
2010-02-05 17:03:22 +00:00
$function = null ;
if ( $this -> template -> caching && ( $this -> nocache || $this -> tag_nocache )) {
if ( isset ( $this -> template -> required_plugins [ 'nocache' ][ $plugin_name ][ $type ])) {
$function = $this -> template -> required_plugins [ 'nocache' ][ $plugin_name ][ $type ][ 'function' ];
} else if ( isset ( $this -> template -> required_plugins [ 'compiled' ][ $plugin_name ][ $type ])) {
$this -> template -> required_plugins [ 'nocache' ][ $plugin_name ][ $type ] = $this -> template -> required_plugins [ 'compiled' ][ $plugin_name ][ $type ];
$function = $this -> template -> required_plugins [ 'nocache' ][ $plugin_name ][ $type ][ 'function' ];
2009-12-29 20:12:51 +00:00
}
2010-02-05 17:03:22 +00:00
} else {
if ( isset ( $this -> template -> required_plugins [ 'compiled' ][ $plugin_name ][ $type ])) {
$function = $this -> template -> required_plugins [ 'compiled' ][ $plugin_name ][ $type ][ 'function' ];
} else if ( isset ( $this -> template -> required_plugins [ 'compiled' ][ $plugin_name ][ $type ])) {
$this -> template -> required_plugins [ 'compiled' ][ $plugin_name ][ $type ] = $this -> template -> required_plugins [ 'nocache' ][ $plugin_name ][ $type ];
$function = $this -> template -> required_plugins [ 'compiled' ][ $plugin_name ][ $type ][ 'function' ];
}
}
if ( isset ( $function )) {
2009-12-30 14:26:42 +00:00
if ( $type == 'modifier' ) {
2010-04-07 15:10:34 +00:00
$this -> template -> saved_modifier [ $plugin_name ] = true ;
2009-12-29 20:12:51 +00:00
}
2010-02-05 17:03:22 +00:00
return $function ;
2009-12-29 20:12:51 +00:00
}
2009-12-30 14:26:42 +00:00
// loop through plugin dirs and find the plugin
2010-02-05 17:03:22 +00:00
$function = 'smarty_' . $type . '_' . $plugin_name ;
2009-12-30 14:26:42 +00:00
$found = false ;
foreach (( array ) $this -> smarty -> plugins_dir as $_plugin_dir ) {
$file = rtrim ( $_plugin_dir , '/\\' ) . DS . $type . '.' . $plugin_name . '.php' ;
if ( file_exists ( $file )) {
2009-12-31 16:38:12 +00:00
// require_once($file);
2009-12-30 14:26:42 +00:00
$found = true ;
break ;
}
}
if ( $found ) {
2009-12-31 16:38:12 +00:00
if ( $this -> template -> caching && ( $this -> nocache || $this -> tag_nocache )) {
2010-02-05 17:03:22 +00:00
$this -> template -> required_plugins [ 'nocache' ][ $plugin_name ][ $type ][ 'file' ] = $file ;
$this -> template -> required_plugins [ 'nocache' ][ $plugin_name ][ $type ][ 'function' ] = $function ;
2009-12-30 14:26:42 +00:00
} else {
2010-02-05 17:03:22 +00:00
$this -> template -> required_plugins [ 'compiled' ][ $plugin_name ][ $type ][ 'file' ] = $file ;
$this -> template -> required_plugins [ 'compiled' ][ $plugin_name ][ $type ][ 'function' ] = $function ;
2009-12-31 16:38:12 +00:00
}
if ( $type == 'modifier' ) {
2010-04-07 15:19:02 +00:00
$this -> template -> saved_modifier [ $plugin_name ] = true ;
2009-12-31 16:38:12 +00:00
}
2010-02-05 17:03:22 +00:00
return $function ;
2010-01-01 12:07:36 +00:00
}
2010-02-05 17:03:22 +00:00
if ( is_callable ( $function )) {
2010-01-01 12:07:36 +00:00
// plugin function is defined in the script
2010-02-05 17:03:22 +00:00
return $function ;
2009-12-29 20:12:51 +00:00
}
2009-12-30 14:26:42 +00:00
return false ;
}
/**
2010-02-27 23:28:14 +00:00
* Inject inline code for nocache template sections
*
* This method gets the content of each template element from the parser .
* If the content is compiled code and it should be not cached the code is injected
* into the rendered output .
*
* @ param string $content content of template element
* @ param boolean $tag_nocache true if the parser detected a nocache situation
* @ param boolean $is_code true if content is compiled code
* @ return string content
*/
2009-12-30 14:26:42 +00:00
public function processNocacheCode ( $content , $is_code )
{
// If the template is not evaluated and we have a nocache section and or a nocache tag
2010-01-09 19:23:35 +00:00
if ( $is_code && ! empty ( $content )) {
2009-12-30 14:26:42 +00:00
// generate replacement code
2010-01-09 19:23:35 +00:00
if (( ! $this -> template -> resource_object -> isEvaluated || $this -> template -> forceNocache ) && $this -> template -> caching && ! $this -> suppressNocacheProcessing &&
( $this -> nocache || $this -> tag_nocache || $this -> template -> forceNocache == 2 )) {
2009-12-30 14:26:42 +00:00
$this -> template -> has_nocache_code = true ;
$_output = str_replace ( " ' " , " \ ' " , $content );
2010-12-17 21:05:29 +00:00
$_output = str_replace ( " ^#^ " , " ' " , $_output );
2010-01-14 20:57:27 +00:00
$_output = " <?php echo '/*%%SmartyNocache: { $this -> nocache_hash } %%*/ " . $_output . " /*/%%SmartyNocache: { $this -> nocache_hash } %%*/';?> " ;
2009-12-30 14:26:42 +00:00
// make sure we include modifer plugins for nocache code
2010-04-07 15:19:02 +00:00
if ( isset ( $this -> template -> saved_modifier )) {
foreach ( $this -> template -> saved_modifier as $plugin_name => $dummy ) {
2010-02-05 17:03:22 +00:00
if ( isset ( $this -> template -> required_plugins [ 'compiled' ][ $plugin_name ][ 'modifier' ])) {
$this -> template -> required_plugins [ 'nocache' ][ $plugin_name ][ 'modifier' ] = $this -> template -> required_plugins [ 'compiled' ][ $plugin_name ][ 'modifier' ];
2009-12-29 20:12:51 +00:00
}
}
2010-04-12 15:06:24 +00:00
$this -> template -> saved_modifier = null ;
2009-12-29 20:12:51 +00:00
}
} else {
$_output = $content ;
}
2009-12-30 14:26:42 +00:00
} else {
$_output = $content ;
2009-12-29 20:12:51 +00:00
}
2010-01-09 19:23:35 +00:00
$this -> suppressNocacheProcessing = false ;
2010-05-07 13:08:46 +00:00
$this -> tag_nocache = false ;
2009-12-30 14:26:42 +00:00
return $_output ;
}
/**
2010-02-27 23:28:14 +00:00
* display compiler error messages without dying
*
* If parameter $args is empty it is a parser detected syntax error .
* In this case the parser is called to obtain information about expected tokens .
*
* If parameter $args contains a string this is used as error message
*
* @ param $args string individual error message or null
*/
2009-12-30 14:26:42 +00:00
public function trigger_template_error ( $args = null , $line = null )
{
// get template source line which has error
if ( ! isset ( $line )) {
$line = $this -> lex -> line ;
}
$match = preg_split ( " / \n / " , $this -> lex -> data );
2010-11-23 23:36:16 +00:00
$error_text = 'Syntax Error in template "' . $this -> template -> getTemplateFilepath () . '" on line ' . $line . ' "' . htmlspecialchars ( trim ( preg_replace ( '![\t\r\n]+!' , ' ' , $match [ $line - 1 ]))) . '" ' ;
2009-12-30 14:26:42 +00:00
if ( isset ( $args )) {
// individual error message
$error_text .= $args ;
} else {
// expected token from parser
2010-11-23 23:36:16 +00:00
$error_text .= ' - Unexpected "' . $this -> lex -> value . '"' ;
if ( count ( $this -> parser -> yy_get_expected_tokens ( $this -> parser -> yymajor )) <= 4 ) {
foreach ( $this -> parser -> yy_get_expected_tokens ( $this -> parser -> yymajor ) as $token ) {
$exp_token = $this -> parser -> yyTokenName [ $token ];
if ( isset ( $this -> lex -> smarty_token_names [ $exp_token ])) {
// token type from lexer
$expect [] = '"' . $this -> lex -> smarty_token_names [ $exp_token ] . '"' ;
} else {
// otherwise internal token name
$expect [] = $this -> parser -> yyTokenName [ $token ];
}
}
$error_text .= ', expected one of: ' . implode ( ' , ' , $expect );
}
2009-12-29 20:12:51 +00:00
}
2010-08-13 10:39:51 +00:00
throw new SmartyCompilerException ( $error_text );
2009-12-29 20:12:51 +00:00
}
2010-11-11 21:34:36 +00:00
}
2010-02-27 23:28:14 +00:00
?>