Skip to content

Commit e566ddc

Browse files
authored
Merge pull request #1 from jaem3l/feature/tag
eval tag
2 parents cf978e2 + 53e19b9 commit e566ddc

File tree

7 files changed

+127
-31
lines changed

7 files changed

+127
-31
lines changed

README.md

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,28 @@ Installation
1212

1313
You can install the extension by using composer require.
1414

15+
Example Usage
16+
-------------
17+
18+
Using the eval function:
19+
```twig
20+
{{ eval('echo 1+1;') }}
21+
```
22+
23+
Using the eval tag:
24+
```twig
25+
{% eval %}
26+
echo file_get_contents("/var/log/system.log");
27+
{% endeval %}
28+
```
29+
1530
Tests
1631
-----
1732

1833
Just run
1934

20-
```
21-
phpunit tests/Twig/EvalExtensionTest.php
35+
```bash
36+
$ vendor/bin/phpunit tests/EvalExtensionTest.php
2237
```
2338

2439
No pesky phpunit.xml needed.

composer.json

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,18 @@
1111
],
1212
"autoload": {
1313
"psr-4": {
14-
"Brumann\\Twig\\": "src/Twig"
14+
"jæm3l\\Twig\\": "src"
1515
}
1616
},
17-
"require": {},
17+
"autoload-dev": {
18+
"psr-4": {
19+
"jæm3l\\Twig\\Tests\\": "tests"
20+
}
21+
},
22+
"require": {
23+
"twig/twig": "^1.34.3|^2.4"
24+
},
1825
"require-dev": {
19-
"twig/twig": "^2.4",
2026
"phpunit/phpunit": "^6.4"
2127
}
2228
}

src/EvalExtension.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace jæm3l\Twig;
6+
7+
use Twig\Extension\AbstractExtension;
8+
use Twig\TwigFunction;
9+
10+
class EvalExtension extends AbstractExtension
11+
{
12+
public function getFunctions(): array
13+
{
14+
return [
15+
new TwigFunction('eval', 'eval'),
16+
];
17+
}
18+
19+
public function getTokenParsers(): array
20+
{
21+
return [
22+
new EvalTokenParser(),
23+
];
24+
}
25+
}

src/EvalNode.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace jæm3l\Twig;
6+
7+
use Twig\Node\Node;
8+
9+
class EvalNode extends Node
10+
{
11+
public function compile(\Twig_Compiler $compiler): void
12+
{
13+
$code = array_reduce($this->nodes, function(string $code, \Twig_Node $node) {
14+
return $code . $node->getAttribute('data');
15+
}, '');
16+
17+
$compiler
18+
->addDebugInfo($this)
19+
->write(sprintf('eval("%s;");', addslashes($code)))
20+
;
21+
}
22+
}

src/EvalTokenParser.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace jæm3l\Twig;
6+
7+
use Twig\TokenParser\AbstractTokenParser;
8+
9+
class EvalTokenParser extends AbstractTokenParser
10+
{
11+
public function parse(\Twig_Token $token)
12+
{
13+
$stream = $this->parser->getStream();
14+
15+
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
16+
$content = $this->parser->subparse([$this, 'decideEvalEnd'], true);
17+
$stream->expect(\Twig_Token::BLOCK_END_TYPE);
18+
19+
return new EvalNode([$content], [], $token->getLine(), $this->getTag());
20+
}
21+
22+
public function decideEvalEnd(\Twig_Token $token): bool
23+
{
24+
return $token->test('endeval');
25+
}
26+
27+
public function getTag(): string
28+
{
29+
return 'eval';
30+
}
31+
}

src/Twig/EvalExtension.php

Lines changed: 0 additions & 20 deletions
This file was deleted.

tests/Twig/EvalExtensionTest.php renamed to tests/EvalExtensionTest.php

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
declare(strict_types=1);
44

5-
namespace Brumann\Twig\Tests;
5+
namespace jæm3l\Twig\Tests;
66

7-
use Brumann\Twig\EvalExtension;
7+
use jæm3l\Twig\EvalExtension;
88
use PHPUnit\Framework\TestCase;
9+
use Twig\Environment;
10+
use Twig\Loader\ArrayLoader;
911

1012
class EvalExtensionTest extends TestCase
1113
{
@@ -15,8 +17,8 @@ public function testSimpleEval()
1517
'simple_eval' => '{{ eval("echo 1+1;") }}',
1618
];
1719

18-
$loader = new \Twig_Loader_Array($templates);
19-
$twig = new \Twig_Environment($loader);
20+
$loader = new ArrayLoader($templates);
21+
$twig = new Environment($loader);
2022
$twig->addExtension(new EvalExtension());
2123

2224
$output = $twig->render('simple_eval');
@@ -30,12 +32,27 @@ public function testNestedEval()
3032
'nested_eval' => '{{ eval("eval(\"echo 1+2;\");") }}',
3133
];
3234

33-
$loader = new \Twig_Loader_Array($templates);
34-
$twig = new \Twig_Environment($loader);
35+
$loader = new ArrayLoader($templates);
36+
$twig = new Environment($loader);
3537
$twig->addExtension(new EvalExtension());
3638

3739
$output = $twig->render('nested_eval');
3840

3941
$this->assertSame('3', $output);
4042
}
43+
44+
public function testEvalTag()
45+
{
46+
$templates = [
47+
'eval_tag' => '{% eval %}echo 1+3;{% endeval %}',
48+
];
49+
50+
$loader = new ArrayLoader($templates);
51+
$twig = new Environment($loader);
52+
$twig->addExtension(new EvalExtension());
53+
54+
$output = $twig->render('eval_tag');
55+
56+
$this->assertSame('4', $output);
57+
}
4158
}

0 commit comments

Comments
 (0)