1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
declare(strict_types=1); |
4
|
|
|
|
5
|
|
|
namespace Efabrica\Translatte\Latte; |
6
|
|
|
|
7
|
|
|
use Latte\Compiler; |
8
|
|
|
use Latte\Engine; |
9
|
|
|
use Latte\MacroNode; |
10
|
|
|
use Latte\Macros\MacroSet; |
11
|
|
|
use Latte\PhpWriter; |
12
|
|
|
|
13
|
|
|
class TranslateMacros extends MacroSet |
14
|
|
|
{ |
15
|
|
|
|
16
|
|
|
public static function install(Compiler $compiler): void |
17
|
|
|
{ |
18
|
|
|
$me = new static($compiler); |
19
|
|
|
|
20
|
|
|
$me->addMacro('_', [$me, 'macroTranslate'], [$me, 'macroTranslate']); |
21
|
|
|
} |
22
|
|
|
|
23
|
|
|
public function macroTranslate(MacroNode $node, PhpWriter $writer) |
24
|
|
|
{ |
25
|
|
|
if ($node->closing) { |
26
|
|
|
if (strpos($node->content, '<?php') === FALSE) { |
27
|
|
|
$value = var_export($node->content, TRUE); |
28
|
|
|
$node->content = ''; |
29
|
|
|
} else { |
30
|
|
|
$node->openingCode = '<?php ob_start(function () {}) ?>' . $node->openingCode; |
31
|
|
|
$value = 'ob_get_clean()'; |
32
|
|
|
} |
33
|
|
|
|
34
|
|
|
if (!defined(Engine::class . '::VERSION_ID') || Engine::VERSION_ID < 20804) { |
35
|
|
|
return $writer->write('$_fi = new LR\FilterInfo(%var); echo %modifyContent($this->filters->filterContent("translate", $_fi, %raw))', $node->context[0], $value); |
36
|
|
|
} |
37
|
|
|
|
38
|
|
|
if (Engine::VERSION_ID >= 20900 && Engine::VERSION_ID < 20902) { |
39
|
|
|
return $writer->write('$__fi = new LR\FilterInfo(%var); echo %modifyContent($this->filters->filterContent("translate", $__fi, %raw))', $node->context[0], $value); |
40
|
|
|
} |
41
|
|
|
|
42
|
|
|
return $writer->write('$ʟ_fi = new LR\FilterInfo(%var); echo %modifyContent($this->filters->filterContent("translate", $ʟ_fi, %raw))', $node->context[0], $value); |
43
|
|
|
|
44
|
|
|
} elseif ($node->args !== '') { |
45
|
|
|
$node->empty = TRUE; |
46
|
|
|
if ($this->containsOnlyOneWord($node)) { |
47
|
|
|
return $writer->write('echo %modify(call_user_func($this->filters->translate, %node.word))'); |
48
|
|
|
|
49
|
|
|
} else { |
50
|
|
|
return $writer->write('echo %modify(call_user_func($this->filters->translate, %node.word, %node.args))'); |
51
|
|
|
} |
52
|
|
|
} |
53
|
|
|
} |
54
|
|
|
|
55
|
|
|
private function containsOnlyOneWord(MacroNode $node): bool |
56
|
|
|
{ |
57
|
|
|
$result = trim($node->tokenizer->joinUntil(',')) === trim($node->args); |
58
|
|
|
$node->tokenizer->reset(); |
59
|
|
|
return $result; |
60
|
|
|
} |
61
|
|
|
|
62
|
|
|
} |