Fix #195; Catch Throwable exceptions;

This commit is contained in:
bzick 2016-02-23 13:16:48 +03:00
parent 46708c6195
commit 3766505e5c
3 changed files with 22 additions and 8 deletions

View File

@ -402,7 +402,7 @@ class Compiler
$tag["last"][] = false;
$tokens->next();
} else {
$tag["last"][] = $tag->tpl->parseScalar($tokens, false);
$tag["last"][] = $tag->tpl->parseScalar($tokens);
}
if ($tokens->is(',')) {
$tokens->next();

View File

@ -330,6 +330,7 @@ class Template extends Render
private function _appendText($text)
{
$this->_line += substr_count($text, "\n");
$strip = $this->_options & Fenom::AUTO_STRIP;
if ($this->_filters) {
if (strpos($text, "<?") === false) {
foreach ($this->_filters as $filter) {
@ -344,13 +345,12 @@ class Template extends Render
}
}
}
$text = implode('<?php echo "<?"; ?>', $fragments);
$text = implode('<?php echo "<?"; ?>' . ($strip ? '' : PHP_EOL), $fragments);
}
} else {
$text = str_replace("<?", '<?php echo "<?"; ?>' . PHP_EOL, $text);
$text = str_replace("<?", '<?php echo "<?"; ?>' . ($strip ? '' : PHP_EOL), $text);
}
if($this->_options & Fenom::AUTO_STRIP) {
if($strip) {
$text = preg_replace('/\s+/uS', ' ', str_replace(array("\r", "\n"), " ", $text));
$text = str_replace("> <", "><", $text);
}
@ -563,6 +563,8 @@ class Template extends Render
throw new SecurityException($e->getMessage() . " in {$this->_name} line {$this->_line}, near '{" . $tokens->getSnippetAsString(0, 0) . "' <- there", 0, E_ERROR, $this->_name, $this->_line, $e);
} catch (\Exception $e) {
throw new CompileException($e->getMessage() . " in {$this->_name} line {$this->_line}, near '{" . $tokens->getSnippetAsString(0, 0) . "' <- there", 0, E_ERROR, $this->_name, $this->_line, $e);
} catch (\Throwable $e) {
throw new CompileException($e->getMessage() . " in {$this->_name} line {$this->_line}, near '{" . $tokens->getSnippetAsString(0, 0) . "' <- there", 0, E_ERROR, $this->_name, $this->_line, $e);
}
}
@ -718,7 +720,7 @@ class Template extends Render
$exp[] = $this->parseIs($tokens, $item, $var);
} elseif ($operator == "in" || ($operator == "not" && $tokens->isNextToken("in"))) {
$item = array_pop($exp);
$exp[] = $this->parseIn($tokens, $item, $var);
$exp[] = $this->parseIn($tokens, $item);
} else {
break;
}
@ -785,7 +787,7 @@ class Template extends Render
switch($tokens->key()) {
case T_LNUMBER:
case T_DNUMBER:
$code = $unary . $this->parseScalar($tokens, true);
$code = $unary . $this->parseScalar($tokens);
break;
case T_CONSTANT_ENCAPSED_STRING:
case '"':
@ -793,7 +795,7 @@ class Template extends Render
if ($unary) {
throw new UnexpectedTokenException($tokens->back());
}
$code = $this->parseScalar($tokens, true);
$code = $this->parseScalar($tokens);
break;
case '$':
$code = $this->parseAccessor($tokens, $is_var);

View File

@ -349,6 +349,18 @@ class FenomTest extends \Fenom\TestCase
TPL;
$this->assertRender($tpl, '<div class="item item-one"><a href="/item/1">number one</a></div>');
}
/**
* Bug #195
* @group strip-xml
*/
public function testStripXML() {
$this->fenom->setOptions(Fenom::AUTO_STRIP);
$tpl = <<<TPL
<?xml version="1.0"?>
TPL;
$this->assertRender($tpl, '<?xml version="1.0"?>');
}
}