8000 [TwigBridge] fixed trans twig extractor · symfony/symfony@bae83c7 · GitHub
[go: up one dir, main page]

Skip to content

Commit bae83c7

Browse files
jfsimonfabpot
authored andcommitted
[TwigBridge] fixed trans twig extractor
1 parent 83382bc commit bae83c7

File tree

6 files changed

+223
-9
lines changed

6 files changed

+223
-9
lines changed

src/Symfony/Bridge/Twig/NodeVisitor/TranslationDefaultDomainNodeVisitor.php

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,17 @@ public function enterNode(\Twig_NodeInterface $node, \Twig_Environment $env)
3333
}
3434

3535
if ($node instanceof TransDefaultDomainNode) {
36-
$var = $env->getParser()->getVarName();
37-
$name = new \Twig_Node_Expression_AssignName($var, $node->getLine());
38-
$this->domain = new \Twig_Node_Expression_Name($var, $node->getLine());
36+
if ($node->getNode('expr') instanceof \Twig_Node_Expression_Constant) {
37+
$this->domain = $node->getNode('expr');
3938

40-
return new \Twig_Node_Set(false, new \Twig_Node(array($name)), new \Twig_Node(array($node->getNode('expr'))), $node->getLine());
39+
return $node;
40+
} else {
41+
$var = $env->getParser()->getVarName();
42+
$name = new \Twig_Node_Expression_AssignName($var, $node->getLine());
43+
$this->domain = new \Twig_Node_Expression_Name($var, $node->getLine());
44+
45+
return new \Twig_Node_Set(false, new \Twig_Node(array($name)), new \Twig_Node(array($node->getNode('expr'))), $node->getLine());
46+
}
4147
}
4248

4349
if (null === $this->domain) {
@@ -68,6 +74,10 @@ public function enterNode(\Twig_NodeInterface $node, \Twig_Environment $env)
6874
*/
6975
public function leaveNode(\Twig_NodeInterface $node, \Twig_Environment $env)
7076
{
77+
if ($node instanceof TransDefaultDomainNode) {
78+
return false;
79+
}
80+
7181
return $node;
7282
}
7383

@@ -76,6 +86,6 @@ public function leaveNode(\Twig_NodeInterface $node, \Twig_Environment $env)
7686
*/
7787
public function getPriority()
7888
{
79-
return 0;
89+
return -10;
8090
}
8191
}

src/Symfony/Bridge/Twig/NodeVisitor/TranslationNodeVisitor.php

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
*/
2121
class TranslationNodeVisitor implements \Twig_NodeVisitorInterface
2222
{
23+
const UNDEFINED_DOMAIN = '_undefined';
24+
2325
private $enabled = false;
2426
private $messages = array();
2527

@@ -57,7 +59,7 @@ public function enterNode(\Twig_NodeInterface $node, \Twig_Environment $env)
5759
// extract constant nodes with a trans filter
5860
$this->messages[] = array(
5961
$node->getNode('node')->getAttribute('value'),
60-
$node->getNode('arguments')->hasNode(1) ? $node->getNode('arguments')->getNode(1)->getAttribute('value') : null,
62+
$this->getReadDomainFromArguments($node->getNode('arguments'), 1),
6163
);
6264
} elseif (
6365
$node instanceof \Twig_Node_Expression_Filter &&
@@ -67,13 +69,13 @@ public function enterNode(\Twig_NodeInterface $node, \Twig_Environment $env)
6769
// extract constant nodes with a trans filter
6870
$this->messages[] = array(
6971
$node->getNode('node')->getAttribute('value'),
70-
$node->getNode('arguments')->hasNode(2) ? $node->getNode('arguments')->getNode(2)->getAttribute('value') : null,
72+
$this->getReadDomainFromArguments($node->getNode('arguments'), 2),
7173
);
7274
} elseif ($node instanceof TransNode) {
7375
// extract trans nodes
7476
$this->messages[] = array(
7577
$node->getNode('body')->getAttribute('data'),
76-
null === $node->getNode('domain') ? 'messages' : $node->getNode('domain')->getAttribute('value'),
78+
$this->getReadDomainFromNode($node->getNode('domain')),
7779
);
7880
}
7981

@@ -93,6 +95,43 @@ public function leaveNode(\Twig_NodeInterface $node, \Twig_Environment $env)
9395
*/
9496
public function getPriority()
9597
{
96-
return -10;
98+
return 0;
99+
}
100+
101+
/**
102+
* @param \Twig_Node $arguments
103+
* @param int $index
104+
*
105+
* @return string|null
106+
*/
107+
private function getReadDomainFromArguments(\Twig_Node $arguments, $index)
108+
{
109+
if ($arguments->hasNode('domain')) {
110+
$argument = $arguments->getNode('domain');
111+
} elseif ($arguments->hasNode($index)) {
112+
$argument = $arguments->getNode($index);
113+
} else {
114+
return null;
115+
}
116+
117+
return $this->getReadDomainFromNode($argument);
118+
}
119+
120+
/**
121+
* @param \Twig_Node $node
122+
*
123+
* @return string|null
124+
*/
125+
private function getReadDomainFromNode(\Twig_Node $node = null)
126+
{
127+
if (null === $node) {
128+
return null;
129+
}
130+
131+
if ($node instanceof \Twig_Node_Expression_Constant) {
132+
return $node->getAttribute('value');
133+
}
134+
135+
return self::UNDEFINED_DOMAIN;
97136
}
98137
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
namespace Symfony\Bridge\Twig\Tests\NodeVisitor;
4+
5+
use Symfony\Bridge\Twig\NodeVisitor\TranslationDefaultDomainNodeVisitor;
6+
use Symfony\Bridge\Twig\NodeVisitor\TranslationNodeVisitor;
7+
use Symfony\Bridge\Twig\Tests\TestCase;
8+
9+
class TranslationDefaultDomainNodeVisitorTest extends TestCase
10+
{
11+
private static $message = 'message';
12+
private static $domain = 'domain';
13+
14+
/** @dataProvider getDefaultDomainAssignmentTestData */
15+
public function testDefaultDomainAssignment(\Twig_Node $node)
16+
{
17+
$env = new \Twig_Environment(new \Twig_Loader_String(), array('cache' => false, 'autoescape' => false, 'optimizations' => 0));
18+
19+
$visitor = new TranslationDefaultDomainNodeVisitor();
20+
21+
// visit trans_default_domain tag
22+
$defaultDomain = TwigNodeProvider::getTransDefaultDomainTag('domain');
23+
$visitor->enterNode($defaultDomain, $env);
24+
$visitor->leaveNode($defaultDomain, $env);
25+
26+
// visit tested node
27+
$enteredNode = $visitor->enterNode($node, $env);
28+
$leavedNode = $visitor->leaveNode($node, $env);
29+
$this->assertSame($node, $enteredNode);
30+
$this->assertSame($node, $leavedNode);
31+
32+
// extracting tested node messages
33+
$visitor = new TranslationNodeVisitor();
34+
$visitor->enable();
35+
$visitor->enterNode($node, $env);
36+
$visitor->leaveNode($node, $env);
37+
38+
$this->assertEquals(array(array(self::$message, self::$domain)), $visitor->getMessages());
39+
}
40+
41+
public function getDefaultDomainAssignmentTestData()
42+
{
43+
return array(
44+
array(TwigNodeProvider::getTransFilter(self::$message, self::$domain)),
45+
array(TwigNodeProvider::getTransChoiceFilter(self::$message, self::$domain)),
46+
array(TwigNodeProvider::getTransTag(self::$message, self::$domain)),
47+
);
48+
}
49+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
namespace Symfony\Bridge\Twig\Tests\NodeVisitor;
4+
5+
use Symfony\Bridge\Twig\NodeVisitor\TranslationNodeVisitor;
6+
use Symfony\Bridge\Twig\Tests\TestCase;
7+
8+
class TranslationNodeVisitorTest extends TestCase
9+
{
10+
/** @dataProvider getMessagesExtractionTestData */
11+
public function testMessagesExtraction(\Twig_Node $node, array $expectedMessages)
12+
{
13+
$env = new \Twig_Environment(new \Twig_Loader_String(), array('cache' => false, 'autoescape' => false, 'optimizations' => 0));
14+
$visitor = new TranslationNodeVisitor();
15+
$visitor->enable();
16+
$visitor->enterNode($node, $env);
17+
$visitor->leaveNode($node, $env);
18+
$this->assertEquals($expectedMessages, $visitor->getMessages());
19+
}
20+
21+
public function testMessageExtractionWithInvalidDomainNode()
22+
{
23+
$message = 'new key';
24+
25+
$node = new \Twig_Node_Expression_Filter(
26+
new \Twig_Node_Expression_Constant($message, 0),
27+
new \Twig_Node_Expression_Constant('trans', 0),
28+
new \Twig_Node(array(
29+
new \Twig_Node_Expression_Array(array(), 0),
30+
new \Twig_Node_Expression_Name('variable', 0),
31+
)),
32+
0
33+
);
34+
35+
$this->testMessagesExtraction($node, array(array($message, TranslationNodeVisitor::UNDEFINED_DOMAIN)));
36+
}
37+
38+
public function getMessagesExtractionTestData()
39+
{
40+
$message = 'new key';
41+
$domain = 'domain';
42+
43+
return array(
44+
array(TwigNodeProvider::getTransFilter($message), array(array($message, null))),
45+
array(TwigNodeProvider::getTransChoiceFilter($message), array(array($message, null))),
46+
array(TwigNodeProvider::getTransTag($message), array(array($message, null))),
47+
array(TwigNodeProvider::getTransFilter($message, $domain), array(array($message, $domain))),
48+
array(TwigNodeProvider::getTransChoiceFilter($message, $domain), array(array($message, $domain))),
49+
array(TwigNodeProvider::getTransTag($message, $domain), array(array($message, $domain))),
50+
);
51+
}
52+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
namespace Symfony\Bridge\Twig\Tests\NodeVisitor;
4+
5+
use Symfony\Bridge\Twig\Node\TransDefaultDomainNode;
6+
use Symfony\Bridge\Twig\Node\TransNode;
7+
8+
class TwigNodeProvider
9+
{
10+
public static function getTransFilter($message, $domain = null)
11+
{
12+
$arguments = $domain ? array(
13+
new \Twig_Node_Expression_Array(array(), 0),
14+
new \Twig_Node_Expression_Constant($domain, 0),
15+
) : array();
16+
17+
return new \Twig_Node_Expression_Filter(
18+
new \Twig_Node_Expression_Constant($message, 0),
19+
new \Twig_Node_Expression_Constant('trans', 0),
20+
new \Twig_Node($arguments),
21+
0
22+
);
23+
}
24+
25+
public static function getTransChoiceFilter($message, $domain = null)
26+
{
27+
$arguments = $domain ? array(
28+
new \Twig_Node_Expression_Constant(0, 0),
29+
new \Twig_Node_Expression_Array(array(), 0),
30+
new \Twig_Node_Expression_Constant($domain, 0),
31+
) : array();
32+
33+
return new \Twig_Node_Expression_Filter(
34+
new \Twig_Node_Expression_Constant($message, 0),
35+
new \Twig_Node_Expression_Constant('transchoice', 0),
36+
new \Twig_Node($arguments),
37+
0
38+
);
39+
}
40+
41+
public static function getTransTag($message, $domain = null)
42+
{
43+
return new TransNode(
44+
new \Twig_Node_Body(array(), array('data' => $message)),
45+
$domain ? new \Twig_Node_Expression_Constant($domain, 0) : null
46+
);
47+
}
48+
49+
public static function getTransDefaultDomainTag($domain)
50+
{
51+
return new TransDefaultDomainNode(
52+
new \Twig_Node_Expression_Constant($domain, 0)
53+
);
54+
}
55+
}

src/Symfony/Bridge/Twig/Tests/Translation/TwigExtractorTest.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,15 @@ public function getExtractData()
6767
array('{% trans from "domain" %}new key{% endtrans %}', array('new key' => 'domain')),
6868
array('{% set foo = "new key" | trans %}', array('new key' => 'messages')),
6969
array('{{ 1 ? "new key" | trans : "another key" | trans }}', array('new key' => 'messages', 'another key' => 'messages')),
70+
71+
// make sure 'trans_default_domain' tag is supported
72+
array('{% trans_default_domain "domain" %}{{ "new key"|trans }}', array('new key' => 'domain')),
73+
array('{% trans_default_domain "domain" %}{{ "new key"|transchoice }}', array('new key' => 'domain')),
74+
array('{% trans_default_domain "domain" %}{% trans %}new key{% endtrans %}', array('new key' => 'domain')),
75+
76+
// make sure this works with twig's named arguments
77+
array('{{ "new key" | trans(domain="domain") }}', array('new key' => 'domain')),
78+
array('{{ "new key" | transchoice(domain="domain", count=1) }}', array('new key' => 'domain')),
7079
);
7180
}
7281
}

0 commit comments

Comments
 (0)
0