Merge branch 'origin/master'

This commit is contained in:
Ivan Shalganov 2013-10-08 14:11:47 +04:00
commit 24f22f8f43
9 changed files with 59 additions and 23 deletions

View File

@ -1,12 +1,27 @@
Changelog
=========
### 1.4.4
### 1.4.7 (2013-09-19)
- Bug fixes
- Tests++
### 1.4.3
### 1.4.6 (2013-09-19)
- Bug fixes
- Tests++
### 1.4.5 (2013-09-15)
- Bug fixes
- Tests++
### 1.4.4 (2013-09-13)
- Bug fixes
- Tests++
### 1.4.3 (2013-09-10)
- Bug fixes

View File

@ -1,11 +1,12 @@
Fenom - Template Engine for PHP
===============================
> Composer package: `{"fenom/fenom": "dev-master"}`. See on [Packagist.org](https://packagist.org/packages/fenom/fenom)
> Composer package: `{"fenom/fenom": "1.*"}`. See on [Packagist.org](https://packagist.org/packages/fenom/fenom)
[![Latest Stable Version](https://poser.pugx.org/fenom/fenom/v/stable.png)](https://packagist.org/packages/fenom/fenom)
[![Build Status](https://travis-ci.org/bzick/fenom.png?branch=master)](https://travis-ci.org/bzick/fenom)
[![Coverage Status](https://coveralls.io/repos/bzick/fenom/badge.png?branch=master)](https://coveralls.io/r/bzick/fenom?branch=master)
[![Total Downloads](https://poser.pugx.org/fenom/fenom/downloads.png)](https://packagist.org/packages/fenom/fenom)
## [Usage](./docs/usage.md) :: [Documentation](./docs/readme.md) :: [Benchmark](./docs/benchmark.md) :: [Articles](./docs/articles.md)
* Simple [syntax](./docs/syntax.md)

View File

@ -5,7 +5,7 @@ For installation use [composer](http://getcomposer.org). Add in your `composer.j
```json
{
"require": {
"fenom/fenom": "dev-master"
"fenom/fenom": "1.*"
}
}
```

View File

@ -1,14 +1,14 @@
Settings [RU]
=============
Settings
========
### Engine settings
Что бы установить папку для хранения кеша собранных шаблонов
### Template cache
```php
$fenom->setCompileDir($dir);
```
This method set the name of the directory where template caches are stored. By default this is `/tmp`. This directory must be writeable.
### Template settings
```php
@ -20,7 +20,7 @@ $fenom->setOptions($options);
Параметры могут быть массивом `'option_name' => true` (если ключ не указан автоматически задаётся false) или битовой маской.
* **disable_methods**, `Fenom::DENY_METHODS`, запретить вызов методов у объектов
* **disable_methods**, `Fenom::DENY_METHODS`, disable calling methods in templates. Any method call in the template will throw `Fenom\SecurityException`.
* **disable_native_funcs**, `Fenom::DENY_INLINE_FUNCS`, запретить использование PHP функций, кроме разрешенных.
* **auto_reload**, `Fenom::AUTO_RELOAD`, пересобирать шаблон если его оригинал был изменён (замедляет работу шаблонизатора).
* **force_compile**, `Fenom::FORCE_COMPILE`, пересобирать шаблон при каждом вызове (сильно замедляет работу шаблонизатора).
@ -46,4 +46,4 @@ $fenom->setOptions(Fenom::AUTO_RELOAD | Fenom::FORCE_INCLUDE);
## :raw
## :trim, :ltrim, :rtrim
## :trim, :ltrim, :rtrim

View File

@ -570,12 +570,12 @@ class Compiler
$tpl->addDepend($donor);
return '?>' . $donor->getBody() . '<?php ';
} else {
// throw new InvalidUsageException('template name must be given explicitly yet');
throw new InvalidUsageException('template name must be given explicitly yet');
// under construction
$tpl->_compatible = true;
return '$donor = $tpl->getStorage()->getTemplate(' . $cname . ', \Fenom\Template::EXTENDED);' . PHP_EOL .
'$donor->fetch((array)$tpl);' . PHP_EOL .
'$tpl->b += (array)$donor->b';
// $tpl->_compatible = true;
// return '$donor = $tpl->getStorage()->getTemplate(' . $cname . ', \Fenom\Template::EXTENDED);' . PHP_EOL .
// '$donor->fetch((array)$tpl);' . PHP_EOL .
// '$tpl->b += (array)$donor->b';
}
}
@ -1000,10 +1000,10 @@ class Compiler
$tag = $tpl->getStorage()->getTag($func, $tpl);
if ($tag["type"] == \Fenom::INLINE_FUNCTION) {
$code = $tpl->parseAct($tokens);
} elseif ($tag["type"] == \Fenom::BLOCK_FUNCTION) {
$code = $tpl->parseAct($tokens);
$tpl->getLastScope()->escape = false;
return $code;
// } elseif ($tag["type"] == \Fenom::BLOCK_FUNCTION) {
// $code = $tpl->parseAct($tokens);
// $tpl->getLastScope()->escape = false;
// return $code;
} else {
throw new InvalidUsageException("Raw mode allow for expressions or functions");
}

View File

@ -91,7 +91,7 @@ class Tokenizer
* @see http://docs.php.net/manual/en/tokens.php
* @var array groups of tokens
*/
private static $_macros = array(
public static $macros = array(
self::MACRO_STRING => array(
\T_ABSTRACT => 1, \T_ARRAY => 1, \T_AS => 1, \T_BREAK => 1, \T_BREAK => 1, \T_CASE => 1,
\T_CATCH => 1, \T_CLASS => 1, \T_CLASS_C => 1, \T_CLONE => 1, \T_CONST => 1, \T_CONTINUE => 1,
@ -255,7 +255,7 @@ class Tokenizer
}
} else {
if (isset(self::$_macros[$expect][$token])) {
if (isset(self::$macros[$expect][$token])) {
return true;
}
}

View File

@ -102,5 +102,17 @@ class ProviderTest extends TestCase
"template2.tpl"
), $list);
}
public function testRm() {
$this->assertTrue(is_dir(FENOM_RESOURCES . '/template/sub'));
Provider::rm(FENOM_RESOURCES . '/template/sub');
$this->assertFalse(is_dir(FENOM_RESOURCES . '/template/sub'));
$this->assertTrue(is_file(FENOM_RESOURCES . '/template/template1.tpl'));
Provider::rm(FENOM_RESOURCES . '/template/template1.tpl');
$this->assertFalse(is_file(FENOM_RESOURCES . '/template/template1.tpl'));
$this->assertTrue(is_file(FENOM_RESOURCES . '/template/template2.tpl'));
Provider::clean(FENOM_RESOURCES . '/template/');
$this->assertFalse(is_file(FENOM_RESOURCES . '/template/template2.tpl'));
}
}

View File

@ -770,7 +770,7 @@ class TemplateTest extends TestCase
public function _testSandbox()
{
try {
var_dump($this->fenom->setOptions(Fenom::FORCE_VERIFY)->addFilter(function ($txt) {return $txt;})->compileCode('- <?php {$a} ?> -')->fetch(['a' => 1]));
var_dump($this->fenom->setOptions(Fenom::FORCE_VERIFY)->addFilter(function ($txt) {return $txt;})->compileCode('- {$a} -')->fetch(array('a' => 1)));
} catch (\Exception $e) {
print_r($e->getMessage() . "\n" . $e->getTraceAsString());
}

View File

@ -10,6 +10,7 @@ class TokenizerTest extends \PHPUnit_Framework_TestCase
{
$code = 'hello, please resolve this example: sin($x)+tan($x*$t) = {U|[0,1]}';
$tokens = new Tokenizer($code);
$this->assertSame(27, $tokens->count());
$this->assertSame($tokens, $tokens->back());
$this->assertSame(T_STRING, $tokens->key());
$this->assertSame("hello", $tokens->current());
@ -55,6 +56,8 @@ class TokenizerTest extends \PHPUnit_Framework_TestCase
$this->assertFalse($tokens->is(T_DNUMBER));
$this->assertFalse($tokens->is(":"));
$this->assertSame("(", $tokens->getNext("(", ")"));
$this->assertTrue($tokens->hasBackList(T_STRING, ':'));
$this->assertFalse($tokens->hasBackList(T_LNUMBER, ':'));
$tokens->next();
$tokens->next();
@ -87,6 +90,11 @@ class TokenizerTest extends \PHPUnit_Framework_TestCase
$this->assertSame(")", $tokens->current());
$this->assertTrue($tokens->isLast());
$this->assertSame($tokens, $tokens->next());
$tokens->p = 1000;
$this->assertSame($tokens, $tokens->next());
$tokens->p = -1000;
$this->assertSame($tokens, $tokens->back());
$this->assertNull($tokens->undef);
}
}