newer template
parent
a274138775
commit
e1953bb666
|
@ -8,7 +8,7 @@
|
|||
|
||||
# Homepage: http://yourcmc.ru/wiki/VMX::Template
|
||||
# Author: Vitaliy Filippov, 2006-2013
|
||||
# $Id: template.php 1356 2013-02-17 11:45:17Z vitalif $
|
||||
# $Id$
|
||||
|
||||
class VMXTemplateState
|
||||
{
|
||||
|
@ -63,9 +63,6 @@ class VMXTemplate
|
|||
// Version of code classes, saved into static $version
|
||||
const CODE_VERSION = 3;
|
||||
|
||||
// Logged errors
|
||||
var $errors = array();
|
||||
|
||||
// Data passed to the template
|
||||
var $tpldata = array();
|
||||
|
||||
|
@ -92,18 +89,6 @@ class VMXTemplate
|
|||
$this->options = new VMXTemplateOptions($options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Log an error
|
||||
*/
|
||||
function error($e, $fatal = false)
|
||||
{
|
||||
$this->errors[] = $e;
|
||||
if ($this->options->raise_error && $fatal)
|
||||
die(__CLASS__." error: $e");
|
||||
elseif ($this->options->print_error)
|
||||
print __CLASS__." error: $e<br />";
|
||||
}
|
||||
|
||||
/**
|
||||
* Clear template data
|
||||
*/
|
||||
|
@ -277,7 +262,8 @@ class VMXTemplate
|
|||
}
|
||||
if (!($text = $this->loadfile($fn)))
|
||||
{
|
||||
$this->error("couldn't load template file '$fn'", true);
|
||||
$e = error_get_last();
|
||||
$this->options->error("couldn't load template file '$fn': ".$e['message'], true);
|
||||
$this->failed[$fn] = true;
|
||||
return NULL;
|
||||
}
|
||||
|
@ -289,14 +275,14 @@ class VMXTemplate
|
|||
$r = include($file);
|
||||
if ($r !== 1)
|
||||
{
|
||||
$this->error("error including compiled template for '$fn'", true);
|
||||
$this->options->error("error including compiled template for '$fn'", true);
|
||||
$this->failed[$fn] = true;
|
||||
return NULL;
|
||||
}
|
||||
if (!class_exists($class) || !isset($class::$version) || $class::$version < self::CODE_VERSION)
|
||||
{
|
||||
// Cache file from some older version - reset it
|
||||
$this->error("Please, clear template cache path after upgrading VMX::Template", true);
|
||||
$this->options->error("Please, clear template cache path after upgrading VMX::Template", true);
|
||||
$this->failed[$fn] = true;
|
||||
return NULL;
|
||||
}
|
||||
|
@ -357,7 +343,7 @@ class VMXTemplate
|
|||
$load = false;
|
||||
if (!($text = self::cache_get("U$fn")) || $this->options->reload)
|
||||
{
|
||||
$mtime = stat($fn);
|
||||
$mtime = @stat($fn);
|
||||
$mtime = $mtime[9];
|
||||
if (!$text)
|
||||
{
|
||||
|
@ -375,7 +361,7 @@ class VMXTemplate
|
|||
// Reload if file changed
|
||||
if ($load)
|
||||
{
|
||||
if ($fp = fopen($fn, "rb"))
|
||||
if ($fp = @fopen($fn, "rb"))
|
||||
{
|
||||
fseek($fp, 0, SEEK_END);
|
||||
$t = ftell($fp);
|
||||
|
@ -518,7 +504,7 @@ class VMXTemplate
|
|||
{
|
||||
if (is_callable($sub))
|
||||
return call_user_func_array($sub, $args);
|
||||
$this->error("Unknown function: '$f'");
|
||||
$this->parent->options->error("Unknown function: '$f'");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -727,14 +713,19 @@ class VMXTemplateOptions
|
|||
var $filters = array(); // filter to run on output of every template
|
||||
var $use_utf8 = true; // use UTF-8 for all string operations on template variables
|
||||
var $raise_error = false; // die() on fatal template errors
|
||||
var $log_error = false; // send errors to standard error output
|
||||
var $print_error = false; // print fatal template errors
|
||||
var $strict_end = false; // require block name in ending instructions for FOR, BEGIN, SET and FUNCTION <!-- END block -->
|
||||
var $strip_space = false; // strip spaces from beginning and end of each line
|
||||
var $compiletime_functions = array(); // custom compile-time functions (code generators)
|
||||
|
||||
// Logged errors (not an option)
|
||||
var $errors;
|
||||
|
||||
function __construct($options = array())
|
||||
{
|
||||
$this->set($options);
|
||||
$this->errors = array();
|
||||
}
|
||||
|
||||
function set($options)
|
||||
|
@ -763,6 +754,34 @@ class VMXTemplateOptions
|
|||
}
|
||||
$this->root = preg_replace('!/*$!s', '/', $this->root);
|
||||
}
|
||||
|
||||
function __destruct()
|
||||
{
|
||||
if ($this->print_error && $this->errors && PHP_SAPI != 'cli')
|
||||
{
|
||||
print '<div id="template-errors" style="display: block; border: 1px solid black; padding: 8px; background: #fcc">'.
|
||||
'VMXTemplate errors:<ul><li>'.
|
||||
implode('</li><li>', array_map('html_pbr', $this->errors)).
|
||||
'</li></ul>';
|
||||
$fp = fopen("php://stderr", 'a');
|
||||
fprintf($fp, "VMXTemplate errors:\n".implode("\n", $this->errors));
|
||||
fclose($fp);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Log an error or a warning
|
||||
*/
|
||||
function error($e, $fatal = false)
|
||||
{
|
||||
$this->errors[] = $e;
|
||||
if ($this->raise_error && $fatal)
|
||||
die("VMXTemplate error: $e");
|
||||
if ($this->log_error)
|
||||
error_log("VMXTemplate error: $e");
|
||||
elseif ($this->print_error && PHP_SAPI == 'cli')
|
||||
print("VMXTemplate error: $e\n");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -785,7 +804,7 @@ class VMXTemplateParser
|
|||
var $tokens, $tokpos, $tokline, $ptr;
|
||||
|
||||
// Possible tokens consisting of special characters
|
||||
static $chartokens = '+ - = * / % ! , . < > ( ) { } [ ] | || && == != <= >= =>';
|
||||
static $chartokens = '+ - = * / % ! , . < > ( ) { } [ ] | .. && == != <= >= =>';
|
||||
|
||||
// ops_and: ops_eq | ops_eq "&&" ops_and | ops_eq "AND" ops_and
|
||||
// ops_eq: ops_cmp | ops_cmp "==" ops_cmp | ops_cmp "!=" ops_cmp
|
||||
|
@ -933,17 +952,7 @@ class VMXTemplateParser
|
|||
|
||||
function warn($text)
|
||||
{
|
||||
if ($this->options->print_error)
|
||||
{
|
||||
if (PHP_SAPI == 'cli')
|
||||
{
|
||||
print "$text\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
print htmlspecialchars($text).'<br />';
|
||||
}
|
||||
}
|
||||
$this->options->error($text);
|
||||
}
|
||||
|
||||
function raise($msg)
|
||||
|
@ -1543,7 +1552,8 @@ $varref = \$item;
|
|||
$varref_index = \$stack[count(\$stack)-1]++;";
|
||||
}
|
||||
|
||||
// exp: ops_or | ops_or "|" exp
|
||||
// (concatenation)
|
||||
// exp: ops_or | ops_or ".." exp
|
||||
function parse_exp()
|
||||
{
|
||||
if (strtolower($this->tok()) == '$not')
|
||||
|
@ -1552,7 +1562,7 @@ $varref_index = \$stack[count(\$stack)-1]++;";
|
|||
return '(!'.$this->parse_exp().')';
|
||||
}
|
||||
$e = array($this->parse_or());
|
||||
while ($this->tok() == '|')
|
||||
while ($this->tok() == '..')
|
||||
{
|
||||
$this->ptr++;
|
||||
$e[] = $this->parse_or();
|
||||
|
|
Loading…
Reference in New Issue