📄 template.compiler.php
字号:
$this->_DreamCMSelse_stack[count($this->_DreamCMSelse_stack)-1] = true;
return "<?php }}else{ ?>";
break;
case '/DreamCMS':
if (array_pop($this->_DreamCMSelse_stack)){
return "<?php }?>";
}else{
return "<?php }}?>";
}
break;
case 'ldelim':
return $this->left_delimiter;
break;
case 'rdelim':
return $this->right_delimiter;
break;
case 'literal':
list (,$literal) = each($this->_literal);
$this->_linenum += substr_count($literal, "\n");
return "<?php echo '" . str_replace("'", "\'", str_replace("\\", "\\\\", $literal)) . "'; ?>";
break;
case 'php':
list (,$php_block) = each($this->_php_blocks);
//过滤PHP 2007-7-23 0:13
if($this->php_handling != "DreamCMS_PHP_ALLOW"){
return htmlspecialchars($php_extract . '<?php '.$php_block.' ?>');
break;
}
//过滤PHP 2007-7-23 0:13
$this->_linenum += substr_count($php_block, "\n");
$php_extract = '';
if($this->php_extract_vars){
if (strnatcmp(PHP_VERSION, '4.3.0') >= 0){
$php_extract = '<?php extract($this->_vars, EXTR_REFS); ?>' . "\n";
}else{
$php_extract = '<?php extract($this->_vars); ?>' . "\n";
}
}
return $php_extract . '<?php '.$php_block.' ?>';
break;
case 'foreach':
array_push($this->_foreachelse_stack, false);
$_args = $this->_parse_arguments($arguments);
if (!isset($_args['from'])){
$this->trigger_error("missing 'from' attribute in 'foreach'", E_USER_ERROR, __FILE__, __LINE__);
}
if (!isset($_args['value']) && !isset($_args['item'])){
$this->trigger_error("missing 'value' attribute in 'foreach'", E_USER_ERROR, __FILE__, __LINE__);
}
if (isset($_args['value'])){
$_args['value'] = $this->_dequote($_args['value']);
}
elseif (isset($_args['item'])){
$_args['value'] = $this->_dequote($_args['item']);
}
isset($_args['key']) ? $_args['key'] = "\$this->_vars['".$this->_dequote($_args['key'])."'] => " : $_args['key'] = '';
$_result = '<?php if (count((array)' . $_args['from'] . ')){ foreach ((array)' . $_args['from'] . ' as ' . $_args['key'] . '$this->_vars[\'' . $_args['value'] . '\']){ ?>';
return $_result;
break;
case 'foreachelse':
$this->_foreachelse_stack[count($this->_foreachelse_stack)-1] = true;
return "<?php }}else{ ?>";
break;
case '/foreach':
if (array_pop($this->_foreachelse_stack)){
return "<?php } ?>";
}else{
return "<?php }} ?>";
}
break;
case 'for':
$this->_for_stack++;
$_args = $this->_parse_arguments($arguments);
if (!isset($_args['start'])){
$this->trigger_error("missing 'start' attribute in 'for'", E_USER_ERROR, __FILE__, __LINE__);
}
if (!isset($_args['stop'])){
$this->trigger_error("missing 'stop' attribute in 'for'", E_USER_ERROR, __FILE__, __LINE__);
}
if (!isset($_args['step'])){
$_args['step'] = 1;
}
$_result = '<?php for($for' . $this->_for_stack . ' = ' . $_args['start'] . '; ((' . $_args['start'] . ' < ' . $_args['stop'] . ') ? ($for' . $this->_for_stack . ' < ' . $_args['stop'] . ') : ($for' . $this->_for_stack . ' > ' . $_args['stop'] . ')); $for' . $this->_for_stack . ' += ((' . $_args['start'] . ' < ' . $_args['stop'] . ') ? ' . $_args['step'] . ' : -' . $_args['step'] . ')){ ?>';
if (isset($_args['value'])){
$_result .= '<?php $this->assign(\'' . $this->_dequote($_args['value']) . '\', $for' . $this->_for_stack . '); ?>';
}
return $_result;
break;
case '/for':
$this->_for_stack--;
return "<?php } ?>";
break;
case 'section':
array_push($this->_sectionelse_stack, false);
if (!function_exists('compile_section_start')){
require_once(TEMPLATE_LITE_DIR . "internal/compile.section_start.php");
}
return compile_section_start($arguments, $this);
break;
case 'sectionelse':
$this->_sectionelse_stack[count($this->_sectionelse_stack)-1] = true;
return "<?php endfor; else: ?>";
break;
case '/section':
if (array_pop($this->_sectionelse_stack)){
return "<?php endif; ?>";
}else{
return "<?php endfor; endif; ?>";
}
break;
case 'while':
$_args = $this->_compile_if($arguments, false, true);
return '<?php while(' . $_args . '){ ?>';
break;
case '/while':
return "<?php } ?>";
break;
case 'if':
return $this->_compile_if($arguments);
break;
case 'else':
return "<?php else: ?>";
break;
case 'elseif':
return $this->_compile_if($arguments, true);
break;
case '/if':
return "<?php endif; ?>";
break;
case 'assign':
$_args = $this->_parse_arguments($arguments);
if (!isset($_args['var'])){
$this->trigger_error("missing 'var' attribute in 'assign'", E_USER_ERROR, __FILE__, __LINE__);
}
if (!isset($_args['value'])){
$this->trigger_error("missing 'value' attribute in 'assign'", E_USER_ERROR, __FILE__, __LINE__);
}
return '<?php $this->assign(\'' . $this->_dequote($_args['var']) . '\', ' . $_args['value'] . '); ?>';
break;
case 'switch':
$_args = $this->_parse_arguments($arguments);
if (!isset($_args['from'])){
$this->trigger_error("missing 'from' attribute in 'switch'", E_USER_ERROR, __FILE__, __LINE__);
}
array_push($this->_switch_stack, array("matched" => false, "var" => $this->_dequote($_args['from'])));
return;
break;
case '/switch':
array_pop($this->_switch_stack);
return '<?php break; endswitch; ?>';
break;
case 'case':
if (count($this->_switch_stack) > 0){
$_result = "<?php ";
$_args = $this->_parse_arguments($arguments);
$_index = count($this->_switch_stack) - 1;
if (!$this->_switch_stack[$_index]["matched"]){
$_result .= 'switch(' . $this->_switch_stack[$_index]["var"] . '): ';
$this->_switch_stack[$_index]["matched"] = true;
}else{
$_result .= 'break; ';
}
if (!empty($_args['value'])){
$_result .= 'case '.$_args['value'].': ';
}else{
$_result .= 'default: ';
}
return $_result . ' ?>';
}else{
$this->trigger_error("unexpected 'case', 'case' can only be in a 'switch'", E_USER_ERROR, __FILE__, __LINE__);
}
break;
default:
$_result = "";
if ($this->_compile_compiler_function($function, $arguments, $_result)){
return $_result;
}else if ($this->_compile_custom_block($function, $modifiers, $arguments, $_result)){
return $_result;
}elseif ($this->_compile_custom_function($function, $modifiers, $arguments, $_result)){
return $_result;
}else{
$this->trigger_error($function." function does not exist", E_USER_ERROR, __FILE__, __LINE__);
}
break;
}
}
function _compile_compiler_function($function, $arguments, &$_result){
if ($function = $this->_plugin_exists($function, "compiler")){
$_args = $this->_parse_arguments($arguments);
$_result = '<?php ' . $function($_args, $this) . ' ?>';
return true;
}else{
return false;
}
}
function _compile_custom_function($function, $modifiers, $arguments, &$_result){
if (!function_exists('compile_compile_custom_function')){
require_once(TEMPLATE_LITE_DIR . "internal/compile.compile_custom_function.php");
}
return compile_compile_custom_function($function, $modifiers, $arguments, $_result, $this);
}
function _compile_custom_block($function, $modifiers, $arguments, &$_result){
if (!function_exists('compile_compile_custom_block')){
require_once(TEMPLATE_LITE_DIR . "internal/compile.compile_custom_block.php");
}
return compile_compile_custom_block($function, $modifiers, $arguments, $_result, $this);
}
function _compile_if($arguments, $elseif = false, $while = false){
if (!function_exists('compile_compile_if')){
require_once(TEMPLATE_LITE_DIR . "internal/compile.compile_if.php");
}
return compile_compile_if($arguments, $elseif, $while, $this);
}
function _parse_is_expr($is_arg, $_arg){
if (!function_exists('compile_parse_is_expr')){
require_once(TEMPLATE_LITE_DIR . "internal/compile.parse_is_expr.php");
}
return compile_parse_is_expr($is_arg, $_arg, $this);
}
function _compile_config($variable){
if (!function_exists('compile_compile_config')){
require_once(TEMPLATE_LITE_DIR . "internal/compile.compile_config.php");
}
return compile_compile_config($variable, $this);
}
function _dequote($string){
if (($string{0} == "'" || $string{0} == '"') && $string{strlen($string)-1} == $string{0}){
return substr($string, 1, -1);
}else{
return $string;
}
}
function _parse_arguments($arguments){
$_match = array();
$_result = array();
$_variables = array();
preg_match_all('/(?:' . $this->_qstr_regexp . ' | (?>[^"\'=\s]+))+|[=]/x', $arguments, $_match);
/*
Parse state:
0 - expecting attribute name
1 - expecting '='
2 - expecting attribute value (not '=')
*/
$state = 0;
foreach($_match[0] as $value){
switch($state){
case 0:
// valid attribute name
if (is_string($value)){
$a_name = $value;
$state = 1;
}else{
$this->trigger_error("invalid attribute name: '$token'", E_USER_ERROR, __FILE__, __LINE__);
}
break;
case 1:
if ($value == '='){
$state = 2;
}else{
$this->trigger_error("expecting '=' after '$last_value'", E_USER_ERROR, __FILE__, __LINE__);
}
break;
case 2:
if ($value != '='){
if ($value == 'yes' || $value == 'on' || $value == 'true'){
$value = true;
}elseif ($value == 'no' || $value == 'off' || $value == 'false'){
$value = false;
}elseif ($value == 'null'){
$value = null;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -