⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smarty_compiler.class.php

📁 通达网络办公 - Office Anywhere 2008 增强版100%源码(3.4.081216) 内含 通达OA2008增強版接近完美破解补丁20081216集 及 最新通达OA2008ADV(
💻 PHP
📖 第 1 页 / 共 3 页
字号:
		}
		switch ( $expr_type )
		{
		case "even" :
			if ( $tokens[$expr_end] == "by" )
			{
				++$expr_end;
				$expr_arg = $tokens[$expr_end++];
				$expr = "!((".$is_arg." / {$expr_arg}) % {$expr_arg})";
			}
			else
			{
				$expr = "!(".$is_arg." % 2)";
			}
			break;
		case "odd" :
			if ( $tokens[$expr_end] == "by" )
			{
				++$expr_end;
				$expr_arg = $tokens[$expr_end++];
				$expr = "((".$is_arg." / {$expr_arg}) % {$expr_arg})";
			}
			else
			{
				$expr = "(".$is_arg." % 2)";
			}
			break;
		case "div" :
			if ( $tokens[$expr_end] == "by" )
			{
				++$expr_end;
				$expr_arg = $tokens[$expr_end++];
				$expr = "!(".$is_arg." % {$expr_arg})";
			}
			else
			{
				$this->_syntax_error( "expecting 'by' after 'div'" );
				break;
				$this->_syntax_error( "unknown 'is' expression - '".$expr_type."'" );
			}
		}
		$expr = "!(".$expr.")";
		array_splice( &$tokens, 0, $expr_end, $expr );
		return $tokens;
	}

	public function _parse_attrs( $tag_args, $quote = TRUE )
	{
		preg_match_all( "/(?:\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"       |\n                          '[^'\\\\]*(?:\\\\.[^'\\\\]*)*'     | (?>[^\"'=\\s]+)\n                         )+ |\n                         [=]\n                        /x", $tag_args, $match );
		$tokens = $match[0];
		$var_delims = array( "\$", "#", "%" );
		$attrs = array( );
		$state = 0;
	default :
		switch ( $state )
		{
			foreach ( $tokens as $token )
			{
			case 0 :
				if ( preg_match( "!^\\w+\$!", $token ) )
				{
					$attr_name = $token;
					$state = 1;
				}
				else
				{
					$this->_syntax_error( "invalid attribute name - '".$token."'" );
				}
				continue;
			case 1 :
				if ( $token == "=" )
				{
					$state = 2;
				}
				else
				{
					$this->_syntax_error( "expecting '=' after attribute name" );
				}
			}
			continue;
		case 2 :
			if ( $token != "=" )
			{
				if ( preg_match( "!^(on|yes|true)\$!", $token ) )
				{
					$token = TRUE;
				}
				else if ( preg_match( "!^(off|no|false)\$!", $token ) )
				{
					$token = FALSE;
				}
				else if ( $quote && !in_array( $token[0], $var_delims ) || ( $token[0] == "\"" || !( $token[0] == "'" ) && !( $token[strlen( $token ) - 1] == $token[0] ) ) )
				{
					$token = "\"".$token."\"";
				}
				$attrs[$attr_name] = $token;
				$state = 0;
			}
			else
			{
				$this->_syntax_error( "'=' cannot be an attribute value" );
			}
		}
		$this->_parse_vars_props( $attrs );
		return $attrs;
	}

	public function _parse_vars_props( &$tokens )
	{
		$qstr_regexp = "\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"|'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'";
		$var_exprs = preg_grep( "!^\\\$\\w+(?>(\\[(\\d+|\\w+(\\.\\w+)?)\\])|((\\.|->)\\w+))*(?>\\|@?\\w+(:(?>".$qstr_regexp."|[^|]+))*)*\$!", $tokens );
		$conf_var_exprs = preg_grep( "!^#(\\w+)#(?>\\|@?\\w+(:(?>".$qstr_regexp."|[^|]+))*)*\$!", $tokens );
		$sect_prop_exprs = preg_grep( "!^%\\w+\\.\\w+%(?>\\|@?\\w+(:(?>".$qstr_regexp."|[^|]+))*)*\$!", $tokens );
		if ( count( $var_exprs ) )
		{
			foreach ( $var_exprs as $expr_index => $var_expr )
			{
				$tokens[$expr_index] = $this->_parse_var( $var_expr );
			}
		}
		if ( count( $conf_var_exprs ) )
		{
			foreach ( $conf_var_exprs as $expr_index => $var_expr )
			{
				$tokens[$expr_index] = $this->_parse_conf_var( $var_expr );
			}
		}
		if ( count( $sect_prop_exprs ) )
		{
			foreach ( $sect_prop_exprs as $expr_index => $section_prop_expr )
			{
				$tokens[$expr_index] = $this->_parse_section_prop( $section_prop_expr );
			}
		}
	}

	public function _parse_var( $var_expr )
	{
		$parts = explode( "|", substr( $var_expr, 1 ), 2 );
		$var_ref = $parts[0];
		$modifiers = isset( $parts[1] ) ? $parts[1] : "";
		preg_match_all( "!\\[\\w+(\\.\\w+)?\\]|(->|\\.)\\w+|^\\w+!", $var_ref, $match );
		$indexes = $match[0];
		$var_name = array_shift( &$indexes );
		if ( $var_name == "smarty" )
		{
			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."']";
			}
		}
		else
		{
			$output = "\$this->_tpl_vars['".$var_name."']";
		}
		foreach ( $indexes as $index )
		{
			if ( $index[0] == "[" )
			{
				$index = substr( $index, 1, -1 );
				if ( is_numeric( $index ) )
				{
					$output .= "[".$index."]";
				}
				else
				{
					$parts = explode( ".", $index );
					$section = $parts[0];
					$section_prop = isset( $parts[1] ) ? $parts[1] : "index";
					$output .= "[\$this->_sections['".$section."']['{$section_prop}']]";
				}
			}
			else if ( $index[0] == "." )
			{
				$output .= "['".substr( $index, 1 )."']";
			}
			else
			{
				$output .= $index;
			}
		}
		$this->_parse_modifiers( $output, $modifiers );
		return $output;
	}

	public 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;
	}

	public 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;
	}

	public function _parse_modifiers( &$output, $modifier_string )
	{
		$qstr_regexp = "\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"|'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'";
		preg_match_all( "!\\|(@?\\w+)((?>:(?:".$qstr_regexp."|[^|]+))*)!", "|".$modifier_string, $match );
		list( , $modifiers, $modifier_arg_strings ) = $match;
		$i = 0;
		for ( ;	$i < count( $modifiers );	++$i	)
		{
			$modifier_name = $modifiers[$i];
			preg_match_all( "!:(".$qstr_regexp."|[^:]+)!", $modifier_arg_strings[$i], $match );
			$modifier_args = $match[1];
			if ( $modifier_name[0] == "@" )
			{
				$map_array = "false";
				$modifier_name = substr( $modifier_name, 1 );
			}
			else
			{
				$map_array = "true";
			}
			@$mod_func_name = $this->custom_mods[$modifier_name];
			if ( !isset( $mod_func_name ) )
			{
				if ( $this->security && !in_array( $modifier_name, $this->security_settings['MODIFIER_FUNCS'] ) )
				{
					$this->_syntax_error( "(secure mode) modifier '".$modifier_name."' is not allowed", E_USER_WARNING );
				}
				else
				{
					$mod_func_name = $modifier_name;
				}
			}
			if ( !function_exists( $mod_func_name ) )
			{
				$this->_syntax_error( "modifier '".$modifier_name."' is not implemented", E_USER_WARNING );
			}
			else
			{
				$this->_parse_vars_props( $modifier_args );
				if ( 0 < count( $modifier_args ) )
				{
					$modifier_args = ", ".implode( ", ", $modifier_args );
				}
				else
				{
					$modifier_args = "";
				}
				$output = "\$this->_run_mod_handler('".$mod_func_name."', {$map_array}, {$output}{$modifier_args})";
			}
		}
	}

	public function _compile_smarty_ref( &$indexes )
	{
		$ref = substr( $indexes[0], 1 );
		switch ( $ref )
		{
		case "now" :
			$compiled_ref = "time()";
			if ( !( 1 < count( $indexes ) ) )
			{
				break;
			}
			$this->_syntax_error( "\$smarty".implode( "", $indexes )." is an invalid reference" );
			break;
		case "foreach" :
		case "section" :
			if ( $indexes[1][0] != "." )
			{
				$this->_syntax_error( "\$smarty".implode( "", array_slice( $indexes, 0, 2 ) )." is an invalid reference" );
			}
			$name = substr( $indexes[1], 1 );
			array_shift( &$indexes );
			if ( $ref == "foreach" )
			{
				$compiled_ref = "\$this->_foreach['".$name."']";
			}
			else
			{
				$compiled_ref = "\$this->_sections['".$name."']";
			}
			break;
		case "env" :
		case "get" :
		case "post" :
		case "cookies" :
		case "server" :
		case "session" :
		case "request" :
		case "capture" :
			return;
			$this->_syntax_error( "\$smarty.".$ref." is an unknown reference" );
		}
		array_shift( &$indexes );
		return $compiled_ref;
	}

	public function _syntax_error( $error_msg, $error_type = E_USER_ERROR )
	{
		trigger_error( "Smarty: [in ".$this->_current_file." line ".$this->_current_line_no.( "]: syntax error: ".$error_msg ), $error_type );
	}

}

?>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -