📄 templateparser.php
字号:
<?php
class SmartTemplateParser
{
var $template;
var $extension_tagged = array();
var $error;
function SmartTemplateParser ( $template_filename )
{
// Load Template
if ($hd = @fopen($template_filename, "r"))
{
$this->template = fread($hd, filesize($template_filename));
fclose($hd);
}
else
{
$this->template = "File not found: '$template_filename'";
}
}
function compile( $compiled_template_filename = '' )
{
if (empty($this->template))
{
return;
}
// END, ELSE Blocks
$page = preg_replace("/<!-- ENDIF.+?-->/", "<?php\n}\n?>", $this->template);
$page = preg_replace("/<!-- END[ a-zA-Z0-9_.]* -->/", "<?php\n}\n\$_obj=\$_stack[--\$_stack_cnt];}\n?>", $page);
$page = str_replace("<!-- ELSE -->", "<?php\n} else {\n?>", $page);
// 'BEGIN - END' Blocks
if (preg_match_all('/<!-- BEGIN ([a-zA-Z0-9_.]+) -->/', $page, $var))
{
foreach ($var[1] as $tag)
{
list($parent, $block) = $this->var_name($tag);
$code = "<?php\n"
. "if (!empty(\$$parent"."['$block'])){\n"
. "if (!is_array(\$$parent"."['$block']))\n"
. "\$$parent"."['$block']=array(array('$block'=>\$$parent"."['$block']));\n"
. "\$_tmp_arr_keys=array_keys(\$$parent"."['$block']);\n"
. "if (\$_tmp_arr_keys[0]!='0')\n"
. "\$$parent"."['$block']=array(0=>\$$parent"."['$block']);\n"
. "\$_stack[\$_stack_cnt++]=\$_obj;\n"
. "foreach (\$$parent"."['$block'] as \$rowcnt=>\$$block) {\n"
. "\$$block"."['ROWCNT']=\$rowcnt;\n"
. "\$$block"."['ALTROW']=\$rowcnt%2;\n"
. "\$$block"."['ROWBIT']=\$rowcnt%2;\n"
. "\$_obj=&\$$block;\n?>";
$page = str_replace("<!-- BEGIN $tag -->", $code, $page);
}
}
// 'IF nnn="mmm"' Blocks
if (preg_match_all('/<!-- (ELSE)?IF ([a-zA-Z0-9_.]+)([!=<>]+)"([^"]*)" -->/', $page, $var))
{
foreach ($var[2] as $cnt => $tag)
{
list($parent, $block) = $this->var_name($tag);
$cmp = $var[3][$cnt];
$val = $var[4][$cnt];
$else = ($var[1][$cnt] == 'ELSE') ? '} else' : '';
if ($cmp == '=')
{
$cmp = '==';
}
$code = "<?php\n$else"."if (\$$parent"."['$block'] $cmp \"$val\"){\n?>";
$page = str_replace($var[0][$cnt], $code, $page);
}
}
// 'IF nnn' Blocks
if (preg_match_all('/<!-- (ELSE)?IF ([a-zA-Z0-9_.]+) -->/', $page, $var))
{
foreach ($var[2] as $cnt => $tag)
{
$else = ($var[1][$cnt] == 'ELSE') ? '} else' : '';
list($parent, $block) = $this->var_name($tag);
$code = "<?php\n$else"."if (!empty(\$$parent"."['$block'])){\n?>";
$page = str_replace($var[0][$cnt], $code, $page);
}
}
// Replace Scalars
if (preg_match_all('/{([a-zA-Z0-9_. >]+)}/', $page, $var))
{
foreach ($var[1] as $fulltag)
{
// Determin Command (echo / $obj[n]=)
list($cmd, $tag) = $this->cmd_name($fulltag);
list($block, $skalar) = $this->var_name($tag);
$code = "<?php\n$cmd \$$block"."['$skalar'];\n?>\n";
$page = str_replace('{'.$fulltag.'}', $code, $page);
}
}
// ROSI Special: Replace Translations
if (preg_match_all('/<"([a-zA-Z0-9_.]+)">/', $page, $var))
{
foreach ($var[1] as $tag)
{
list($block, $skalar) = $this->var_name($tag);
$code = "<?php\necho gettext('$skalar');\n?>\n";
$page = str_replace('<"'.$tag.'">', $code, $page);
}
}
// Include Extensions
if (preg_match_all('/{([a-zA-Z0-9_]+):([^}]*)}/', $page, $var))
{
foreach ($var[2] as $cnt => $tag)
{
// Determin Command (echo / $obj[n]=)
list($cmd, $tag) = $this->cmd_name($tag);
$extension = $var[1][$cnt];
if (!$this->extension_tagged[$extension])
{
$header .= "include_once \"smarttemplate_extensions/smarttemplate_extension_$extension.php\";\n";
$this->extension_tagged[$extension] = true;
}
if (!strlen($tag))
{
$code = "<?php\n$cmd smarttemplate_extension_$extension();\n?>\n";
}
elseif (substr($tag, 0, 1) == '"')
{
$code = "<?php\n$cmd smarttemplate_extension_$extension($tag);\n?>\n";
}
elseif (strpos($tag, ','))
{
list($tag, $addparam) = explode(',', $tag, 2);
list($block, $skalar) = $this->var_name($tag);
if (preg_match('/^([a-zA-Z_]+)/', $addparam, $match))
{
$nexttag = $match[1];
list($nextblock, $nextskalar) = $this->var_name($nexttag);
$addparam = substr($addparam, strlen($nexttag));
$code = "<?php\n$cmd smarttemplate_extension_$extension(\$$block"."['$skalar'],\$$nextblock"."['$nextskalar']"."$addparam);\n?>\n";
}
else
{
$code = "<?php\n$cmd smarttemplate_extension_$extension(\$$block"."['$skalar'],$addparam);\n?>\n";
}
}
else
{
list($block, $skalar) = $this->var_name($tag);
$code = "<?php\n$cmd smarttemplate_extension_$extension(\$$block"."['$skalar']);\n?>\n";
}
$page = str_replace($var[0][$cnt], $code, $page);
}
}
// Add Include Header
if ($header)
{
$page = "<?php\n$header\n?>$page";
}
// Store Code to Temp Dir
if (strlen($compiled_template_filename))
{
if ($hd = fopen($compiled_template_filename, "w"))
{
fwrite($hd, $page);
fclose($hd);
return true;
}
else
{
$this->error = "Could not write compiled file.";
return false;
}
}
else
{
return $page;
}
}
function var_name($tag)
{
$parent_level = 0;
while (substr($tag, 0, 7) == 'parent.')
{
$tag = substr($tag, 7);
$parent_level++;
}
if (substr($tag, 0, 4) == 'top.')
{
$obj = '_stack[0]';
$tag = substr($tag,4);
}
elseif ($parent_level)
{
$obj = '_stack[$_stack_cnt-'.$parent_level.']';
}
else
{
$obj = '_obj';
}
while (is_int(strpos($tag, '.')))
{
list($parent, $tag) = explode('.', $tag, 2);
if (is_numeric($parent))
{
$obj .= "[" . $parent . "]";
}
else
{
$obj .= "['" . $parent . "']";
}
}
return array($obj, $tag);
}
function cmd_name($tag)
{
if (preg_match('/^(.+) > ([a-zA-Z0-9_.]+)$/', $tag, $tagvar))
{
$tag = $tagvar[1];
list($newblock, $newskalar) = $this->var_name($tagvar[2]);
$cmd = "\$$newblock"."['$newskalar']=";
} else {
$cmd = "echo";
}
return array($cmd, $tag);
}
}
?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -