mirror of
https://github.com/fenom-template/fenom.git
synced 2023-08-10 21:13:07 +03:00
Add STRIP option
This commit is contained in:
parent
83e02ebbe9
commit
45afbfabdf
@ -1,7 +1,8 @@
|
|||||||
Fenom - Template Engine for PHP
|
Fenom - Template Engine for PHP
|
||||||
===============================
|
===============================
|
||||||
|
|
||||||
> Composer package: `{"fenom/fenom": "2.*"}`. See on [Packagist.org](https://packagist.org/packages/fenom/fenom)
|
> Composer [package](https://packagist.org/packages/fenom/fenom): `{"fenom/fenom": "2.*"}`.
|
||||||
|
> For old version: `{"fenom/fenom": "1.*"}`. List of incompatibilities between 1.* and 2.* versions.
|
||||||
|
|
||||||
[](https://packagist.org/packages/fenom/fenom)
|
[](https://packagist.org/packages/fenom/fenom)
|
||||||
[](https://travis-ci.org/bzick/fenom)
|
[](https://travis-ci.org/bzick/fenom)
|
||||||
@ -9,6 +10,10 @@ Fenom - Template Engine for PHP
|
|||||||
[](https://packagist.org/packages/fenom/fenom)
|
[](https://packagist.org/packages/fenom/fenom)
|
||||||
## [Usage](./docs/usage.md) :: [Documentation](./docs/readme.md) :: [Benchmark](./docs/benchmark.md) :: [Articles](./docs/articles.md)
|
## [Usage](./docs/usage.md) :: [Documentation](./docs/readme.md) :: [Benchmark](./docs/benchmark.md) :: [Articles](./docs/articles.md)
|
||||||
|
|
||||||
|
## What is it
|
||||||
|
|
||||||
|
*Fenom* (from "fenomenal") — шаблонизатор на PHP с большими возможностями и синтаксисом Smarty.
|
||||||
|
|
||||||
* Simple [syntax](./docs/syntax.md)
|
* Simple [syntax](./docs/syntax.md)
|
||||||
* [Fast](./docs/benchmark.md)
|
* [Fast](./docs/benchmark.md)
|
||||||
* [Secure](./docs/settings.md)
|
* [Secure](./docs/settings.md)
|
||||||
|
71
docs/start.md
Normal file
71
docs/start.md
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
Basic usage
|
||||||
|
===========
|
||||||
|
|
||||||
|
## Install Fenom
|
||||||
|
|
||||||
|
### Composer
|
||||||
|
|
||||||
|
Add package Fenom in your require-list in `composer.json`:
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"require": {
|
||||||
|
"fenom/fenom": "2.*"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
and update project's dependencies: `composer update`.
|
||||||
|
|
||||||
|
### Custom loader
|
||||||
|
|
||||||
|
Clone Fenom to any directory: `git clone https://github.com/bzick/fenom.git`. Recommended use latest tag.
|
||||||
|
Fenom use [psr-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md#autoloading-standard) autoloading standard. Therefore you can
|
||||||
|
* use `psr-0` format in your project loader for loading Fenom's classes
|
||||||
|
* or register Fenom's autoloader: ```php
|
||||||
|
Fenom::registerAutoload();
|
||||||
|
```
|
||||||
|
For loading itself.
|
||||||
|
|
||||||
|
Also you can use this autoloader for loading any library with `psr-0` file naming:
|
||||||
|
```php
|
||||||
|
Fenom::registerAutoload(PROJECT_DIR."/src");
|
||||||
|
```
|
||||||
|
|
||||||
|
## Setup Fenom
|
||||||
|
|
||||||
|
Create an object via factory method
|
||||||
|
```php
|
||||||
|
$fenom = Fenom::factory('/path/to/templates', '/path/to/compiled/template', $options);
|
||||||
|
```
|
||||||
|
|
||||||
|
Create an object via `new` operator
|
||||||
|
```php
|
||||||
|
$fenom = new Fenom(new Provider('/path/to/templates'));
|
||||||
|
$fenom->setCompileDir('/path/to/template/cache');
|
||||||
|
$fenom->setOptions($options);
|
||||||
|
```
|
||||||
|
|
||||||
|
* `/path/to/templates` — directory, where stores your templates.
|
||||||
|
* `/path/to/template/cache` — directory, where stores compiled templates in PHP files.
|
||||||
|
* `$options` - bit-mask or array of [Fenom settings](./docs/settings.md).
|
||||||
|
|
||||||
|
### Use Fenom
|
||||||
|
|
||||||
|
Output template
|
||||||
|
```php
|
||||||
|
$fenom->display("template/name.tpl", $vars);
|
||||||
|
```
|
||||||
|
|
||||||
|
Get the result of rendering the template
|
||||||
|
```php
|
||||||
|
$result = $fenom->fetch("template/name.tpl", $vars);
|
||||||
|
```
|
||||||
|
|
||||||
|
Create the pipeline of rendering into callback
|
||||||
|
```php
|
||||||
|
$fenom->pipe(
|
||||||
|
"template/sitemap.tpl",
|
||||||
|
$vars,
|
||||||
|
$callback = [new SplFileObject("/tmp/sitemap.xml", "w"), "fwrite"], // pipe to file /tmp/sitemap.xml
|
||||||
|
$chunk_size = 1e6 // chunk size for callback
|
||||||
|
);
|
||||||
|
```
|
@ -1,11 +1,61 @@
|
|||||||
Syntax [RU]
|
Syntax
|
||||||
===========
|
======
|
||||||
|
|
||||||
Fenom implement [Smarty](http://www.smarty.net/) syntax with some improvements
|
Fenom implements [Smarty](http://www.smarty.net/) syntax with some improvements.
|
||||||
|
All Fenom tags enclosed in the delimiters `{` and `}`, for example `{var $five = 5}`.
|
||||||
|
If you wanna leave delimiters as is in the template use [special statements or tags](#ignoring-delimiters).
|
||||||
|
|
||||||
|
*Note*
|
||||||
|
Fenom implements [Smarty](http://www.smarty.net/) syntax but not implements Smarty tags, however, some tags very similar.
|
||||||
|
But not so bad, Fenom has the [extras](https://github.com/bzick/fenom-extra) that make Fenom like Smarty.
|
||||||
|
|
||||||
## Variable
|
## Variable
|
||||||
|
|
||||||
### Use variables
|
Variables in Fenom can be either displayed directly or used as arguments for functions, attributes and modifiers,
|
||||||
|
inside conditional expressions, etc.
|
||||||
|
|
||||||
|
### Example variables
|
||||||
|
|
||||||
|
Next example uses simple variables `$user_id` ans `$user_name`
|
||||||
|
```smarty
|
||||||
|
<div class="user">Hello, <a href="/users/{$user_id}">{$user_name}</a>.</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
Example outputs next HTML code:
|
||||||
|
```html
|
||||||
|
<div class="user">Hello, <a href="/users/17">Bzick</a>.</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
Переменные могут быть массивом. В этом случае обращение по ключу происходит через опертор `.` или, как в PHP, через операторы `[` и `]`
|
||||||
|
```smarty
|
||||||
|
<div class="user">Hello, <a href="/users/{$user.id}">{$user.name}</a>.</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
`{$user.id}` and `{$user['id']}` are same.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<div class="user">Hello, <a href="/users/{$user->id}">{$user->name}</a>.</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<div class="user">Hello, <a href="/users/{$user->getId()}">{$user->getName()}</a>.</div>
|
||||||
|
```
|
||||||
|
|
||||||
|
*Note*
|
||||||
|
Be careful, Fenom do not checks existence of the method before invoke.
|
||||||
|
To avoid the problem class of the object have to define method `__call`, which throws an exception etc.
|
||||||
|
Also you may disable invoke method in [settings](./docs/settings.md).
|
||||||
|
|
||||||
|
Multidimensional value support
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{$foo.bar.baz}
|
||||||
|
{$foo.$bar.$baz}
|
||||||
|
{$foo[4].baz}
|
||||||
|
{$foo[4].$baz}
|
||||||
|
{$foo.bar.baz[4]}
|
||||||
|
{$foo[ $bar.baz ]}
|
||||||
|
```
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{$foo}
|
{$foo}
|
||||||
@ -25,7 +75,7 @@ Fenom implement [Smarty](http://www.smarty.net/) syntax with some improvements
|
|||||||
|
|
||||||
### System variable
|
### System variable
|
||||||
|
|
||||||
Unnamed system variable starts with `$.` and allow access to global variables and system info (fix doc):
|
Unnamed system variable starts with `$.` and allows access to global variables and system info (fix doc):
|
||||||
|
|
||||||
* `$.get` is `$_GET`.
|
* `$.get` is `$_GET`.
|
||||||
* `$.post` is `$_POST`.
|
* `$.post` is `$_POST`.
|
||||||
@ -47,17 +97,6 @@ Unnamed system variable starts with `$.` and allow access to global variables an
|
|||||||
{/if}
|
{/if}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Multidimensional value support
|
|
||||||
|
|
||||||
```smarty
|
|
||||||
{$foo.bar.baz}
|
|
||||||
{$foo.$bar.$baz}
|
|
||||||
{$foo[4].baz}
|
|
||||||
{$foo[4].$baz}
|
|
||||||
{$foo.bar.baz[4]}
|
|
||||||
{$foo[ $bar.baz ]}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Math operations
|
### Math operations
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
|
@ -1,38 +0,0 @@
|
|||||||
Basic usage
|
|
||||||
===========
|
|
||||||
|
|
||||||
### Initialize Fenom
|
|
||||||
|
|
||||||
Creating an object via factory method
|
|
||||||
```php
|
|
||||||
$fenom = Fenom::factory('/path/to/templates', '/path/to/compiled/template', $options);
|
|
||||||
```
|
|
||||||
|
|
||||||
Creating an object via `new` operator
|
|
||||||
```php
|
|
||||||
$fenom = new Fenom(new Provider('/path/to/templates'));
|
|
||||||
$fenom->setCompileDir('/path/to/template/cache');
|
|
||||||
$fenom->setOptions($options);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Rendering template
|
|
||||||
|
|
||||||
Output template
|
|
||||||
```php
|
|
||||||
$fenom->display("template/name.tpl", $vars);
|
|
||||||
```
|
|
||||||
|
|
||||||
Get the result of rendering the template
|
|
||||||
```php
|
|
||||||
$result = $fenom->fetch("template/name.tpl", $vars);
|
|
||||||
```
|
|
||||||
|
|
||||||
Create the pipeline of rendering into callback
|
|
||||||
```php
|
|
||||||
$fenom->pipe(
|
|
||||||
"template/sitemap.tpl",
|
|
||||||
$vars,
|
|
||||||
$callback = [new SplFileObject("/tmp/sitemap.xml", "w"), "fwrite"], // pipe to file /tmp/sitemap.xml
|
|
||||||
$chunk_size = 1e6 // chunk size for callback
|
|
||||||
);
|
|
||||||
```
|
|
@ -38,9 +38,6 @@ class Fenom
|
|||||||
const DENY_STATICS = 0x2000;
|
const DENY_STATICS = 0x2000;
|
||||||
const AUTO_STRIP = 0x4000;
|
const AUTO_STRIP = 0x4000;
|
||||||
|
|
||||||
/* @deprecated */
|
|
||||||
const DENY_INLINE_FUNCS = 0x20;
|
|
||||||
|
|
||||||
/* Default parsers */
|
/* Default parsers */
|
||||||
const DEFAULT_CLOSE_COMPILER = 'Fenom\Compiler::stdClose';
|
const DEFAULT_CLOSE_COMPILER = 'Fenom\Compiler::stdClose';
|
||||||
const DEFAULT_FUNC_PARSER = 'Fenom\Compiler::stdFuncParser';
|
const DEFAULT_FUNC_PARSER = 'Fenom\Compiler::stdFuncParser';
|
||||||
@ -66,6 +63,7 @@ class Fenom
|
|||||||
"force_verify" => self::FORCE_VERIFY,
|
"force_verify" => self::FORCE_VERIFY,
|
||||||
"auto_trim" => self::AUTO_TRIM,
|
"auto_trim" => self::AUTO_TRIM,
|
||||||
"disable_statics" => self::DENY_STATICS,
|
"disable_statics" => self::DENY_STATICS,
|
||||||
|
"strip" => self::AUTO_STRIP,
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -265,10 +263,20 @@ class Fenom
|
|||||||
'type' => self::INLINE_COMPILER,
|
'type' => self::INLINE_COMPILER,
|
||||||
'parser' => 'Fenom\Compiler::tagRaw'
|
'parser' => 'Fenom\Compiler::tagRaw'
|
||||||
),
|
),
|
||||||
'autoescape' => array(
|
'autoescape' => array( // deprecated
|
||||||
'type' => self::BLOCK_COMPILER,
|
'type' => self::BLOCK_COMPILER,
|
||||||
'open' => 'Fenom\Compiler::autoescapeOpen',
|
'open' => 'Fenom\Compiler::escapeOpen',
|
||||||
'close' => 'Fenom\Compiler::autoescapeClose'
|
'close' => 'Fenom\Compiler::nope'
|
||||||
|
),
|
||||||
|
'escape' => array(
|
||||||
|
'type' => self::BLOCK_COMPILER,
|
||||||
|
'open' => 'Fenom\Compiler::escapeOpen',
|
||||||
|
'close' => 'Fenom\Compiler::nope'
|
||||||
|
),
|
||||||
|
'strip' => array(
|
||||||
|
'type' => self::BLOCK_COMPILER,
|
||||||
|
'open' => 'Fenom\Compiler::stripOpen',
|
||||||
|
'close' => 'Fenom\Compiler::nope'
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -988,7 +996,7 @@ class Fenom
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register PSR-0 autoload for Fenom
|
* Register PSR-0 autoload
|
||||||
* @param string $dir custom directory for autoloading, if NULL — autoload itself
|
* @param string $dir custom directory for autoloading, if NULL — autoload itself
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
|
@ -962,7 +962,7 @@ class Compiler
|
|||||||
* @param Tokenizer $tokens
|
* @param Tokenizer $tokens
|
||||||
* @param Tag $tag
|
* @param Tag $tag
|
||||||
*/
|
*/
|
||||||
public static function autoescapeOpen(Tokenizer $tokens, Tag $tag)
|
public static function escapeOpen(Tokenizer $tokens, Tag $tag)
|
||||||
{
|
{
|
||||||
$expected = ($tokens->get(T_STRING) == "true" ? true : false);
|
$expected = ($tokens->get(T_STRING) == "true" ? true : false);
|
||||||
$tokens->next();
|
$tokens->next();
|
||||||
@ -970,11 +970,20 @@ class Compiler
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Tokenizer $tokens
|
* Do nothing
|
||||||
* @param Tag $tag
|
|
||||||
*/
|
*/
|
||||||
public static function autoescapeClose(Tokenizer $tokens, Tag $tag)
|
public static function nope()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Tokenizer $tokens
|
||||||
|
* @param Tag $tag
|
||||||
|
*/
|
||||||
|
public static function stripOpen(Tokenizer $tokens, Tag $tag)
|
||||||
|
{
|
||||||
|
$expected = ($tokens->get(T_STRING) == "true" ? true : false);
|
||||||
|
$tokens->next();
|
||||||
|
$tag->setOption(\Fenom::AUTO_STRIP, $expected);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -140,7 +140,7 @@ class Modifier
|
|||||||
{
|
{
|
||||||
$str = trim($str);
|
$str = trim($str);
|
||||||
if ($to_line) {
|
if ($to_line) {
|
||||||
return preg_replace('#[\s]+#ms', ' ', $str);
|
return preg_replace('#\s+#ms', ' ', $str);
|
||||||
} else {
|
} else {
|
||||||
return preg_replace('#[ \t]{2,}#', ' ', $str);
|
return preg_replace('#[ \t]{2,}#', ' ', $str);
|
||||||
}
|
}
|
||||||
@ -158,7 +158,7 @@ class Modifier
|
|||||||
} elseif (is_array($item)) {
|
} elseif (is_array($item)) {
|
||||||
return count($item);
|
return count($item);
|
||||||
} elseif ($item instanceof \Countable) {
|
} elseif ($item instanceof \Countable) {
|
||||||
return count($item);
|
return $item->count();
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -263,13 +263,27 @@ class Tag extends \ArrayObject
|
|||||||
return $this->tpl->out($code, $this->escape);
|
return $this->tpl->out($code, $this->escape);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable escape option for the tag
|
||||||
|
*/
|
||||||
public function optEscape()
|
public function optEscape()
|
||||||
{
|
{
|
||||||
$this->escape = true;
|
$this->escape = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable escape option for the tag
|
||||||
|
*/
|
||||||
public function optRaw()
|
public function optRaw()
|
||||||
{
|
{
|
||||||
$this->escape = false;
|
$this->escape = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enable strip spaces option for the tag
|
||||||
|
*/
|
||||||
|
public function optStrip()
|
||||||
|
{
|
||||||
|
$this->setOption(\Fenom::AUTO_STRIP, true);
|
||||||
|
}
|
||||||
}
|
}
|
@ -344,7 +344,6 @@ class Template extends Render
|
|||||||
foreach ($this->_filters as $filter) {
|
foreach ($this->_filters as $filter) {
|
||||||
$text = call_user_func($filter, $this, $text);
|
$text = call_user_func($filter, $this, $text);
|
||||||
}
|
}
|
||||||
$this->_body .= $text;
|
|
||||||
} else {
|
} else {
|
||||||
$fragments = explode("<?", $text);
|
$fragments = explode("<?", $text);
|
||||||
foreach ($fragments as &$fragment) {
|
foreach ($fragments as &$fragment) {
|
||||||
@ -354,11 +353,16 @@ class Template extends Render
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$this->_body .= implode('<?php echo "<?"; ?>', $fragments);
|
$text = implode('<?php echo "<?"; ?>', $fragments);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$this->_body .= str_replace("<?", '<?php echo "<?"; ?>' . PHP_EOL, $text);
|
$text = str_replace("<?", '<?php echo "<?"; ?>' . PHP_EOL, $text);
|
||||||
}
|
}
|
||||||
|
if($this->_options & Fenom::AUTO_STRIP) {
|
||||||
|
$text = preg_replace('/\s+/uS', ' ', $text);
|
||||||
|
$text = preg_replace('/\s*([\pP\pS]+)\s*/uS', '$1', $text);
|
||||||
|
}
|
||||||
|
$this->_body .= $text;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -11,18 +11,7 @@ class TestCase extends \PHPUnit_Framework_TestCase
|
|||||||
*/
|
*/
|
||||||
public $fenom;
|
public $fenom;
|
||||||
|
|
||||||
public $values = array(
|
public $values;
|
||||||
"zero" => 0,
|
|
||||||
"one" => 1,
|
|
||||||
"two" => 2,
|
|
||||||
"three" => 3,
|
|
||||||
"float" => 4.5,
|
|
||||||
"bool" => true,
|
|
||||||
0 => "empty value",
|
|
||||||
1 => "one value",
|
|
||||||
2 => "two value",
|
|
||||||
3 => "three value",
|
|
||||||
);
|
|
||||||
|
|
||||||
public static function getVars()
|
public static function getVars()
|
||||||
{
|
{
|
||||||
@ -40,6 +29,12 @@ class TestCase extends \PHPUnit_Framework_TestCase
|
|||||||
"b" => 2,
|
"b" => 2,
|
||||||
"two" => 2
|
"two" => 2
|
||||||
),
|
),
|
||||||
|
"num" => array(
|
||||||
|
1 => "one",
|
||||||
|
2 => "two",
|
||||||
|
3 => "three",
|
||||||
|
4 => "four"
|
||||||
|
),
|
||||||
0 => "empty value",
|
0 => "empty value",
|
||||||
1 => "one value",
|
1 => "one value",
|
||||||
2 => "two value",
|
2 => "two value",
|
||||||
@ -62,6 +57,7 @@ class TestCase extends \PHPUnit_Framework_TestCase
|
|||||||
$this->fenom->addModifier('append', __CLASS__ . '::append');
|
$this->fenom->addModifier('append', __CLASS__ . '::append');
|
||||||
$this->fenom->addFunction('test_function', __CLASS__ . '::inlineFunction');
|
$this->fenom->addFunction('test_function', __CLASS__ . '::inlineFunction');
|
||||||
$this->fenom->addBlockFunction('test_block_function', __CLASS__ . '::blockFunction');
|
$this->fenom->addBlockFunction('test_block_function', __CLASS__ . '::blockFunction');
|
||||||
|
$this->values = $this->getVars();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function dots($value)
|
public static function dots($value)
|
||||||
|
@ -185,7 +185,7 @@ class TemplateTest extends TestCase
|
|||||||
'Mod: {$lorem|str_rot13}!',
|
'Mod: {$lorem|str_rot13}!',
|
||||||
'Fenom\Error\CompileException',
|
'Fenom\Error\CompileException',
|
||||||
"Modifier str_rot13 not found",
|
"Modifier str_rot13 not found",
|
||||||
Fenom::DENY_INLINE_FUNCS
|
Fenom::DENY_NATIVE_FUNCS
|
||||||
),
|
),
|
||||||
array('Mod: {$lorem|my_encode}!', 'Fenom\Error\CompileException', "Modifier my_encode not found"),
|
array('Mod: {$lorem|my_encode}!', 'Fenom\Error\CompileException', "Modifier my_encode not found"),
|
||||||
array('Mod: {$lorem|truncate:}!', 'Fenom\Error\CompileException', "Unexpected end of expression"),
|
array('Mod: {$lorem|truncate:}!', 'Fenom\Error\CompileException', "Unexpected end of expression"),
|
||||||
|
@ -13,7 +13,8 @@ class FenomTest extends \Fenom\TestCase
|
|||||||
array("auto_reload", Fenom::AUTO_RELOAD),
|
array("auto_reload", Fenom::AUTO_RELOAD),
|
||||||
array("force_include", Fenom::FORCE_INCLUDE),
|
array("force_include", Fenom::FORCE_INCLUDE),
|
||||||
array("auto_escape", Fenom::AUTO_ESCAPE),
|
array("auto_escape", Fenom::AUTO_ESCAPE),
|
||||||
array("force_verify", Fenom::FORCE_VERIFY)
|
array("force_verify", Fenom::FORCE_VERIFY),
|
||||||
|
array("strip", Fenom::AUTO_STRIP),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -289,6 +290,19 @@ class FenomTest extends \Fenom\TestCase
|
|||||||
);
|
);
|
||||||
$this->assertSame(3, $iteration);
|
$this->assertSame(3, $iteration);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group strip
|
||||||
|
*/
|
||||||
|
public function testStrip() {
|
||||||
|
$this->fenom->setOptions(Fenom::AUTO_STRIP);
|
||||||
|
$tpl = <<<TPL
|
||||||
|
<div class="item item-one">
|
||||||
|
<a href="/item/{\$one}">number {\$num.1}</a>
|
||||||
|
</div>
|
||||||
|
TPL;
|
||||||
|
$this->assertRender($tpl, '<div class="item item-one"><a href="/item/1">number one</a></div>');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user