Completed
Push — master ( 57124c...4c4a02 )
by Jáchym
01:30
created

TranslateMacros::macroTranslate()   B

Complexity

Conditions 9
Paths 9

Size

Total Lines 31

Duplication

Lines 6
Ratio 19.35 %

Importance

Changes 0
Metric Value
dl 6
loc 31
rs 8.0555
c 0
b 0
f 0
cc 9
nc 9
nop 2
1
<?php
2
3
/**
4
 * This file is part of the Kdyby (http://www.kdyby.org)
5
 *
6
 * Copyright (c) 2008 Filip Procházka ([email protected])
7
 *
8
 * For the full copyright and license information, please view the file license.txt that was distributed with this source code.
9
 */
10
11
namespace Kdyby\Translation\Latte;
12
13
use Kdyby\Translation\PrefixedTranslator;
14
use Latte\Compiler;
15
use Latte\Engine;
16
use Latte\MacroNode;
17
use Latte\PhpWriter;
18
19
class TranslateMacros extends \Latte\Macros\MacroSet
20
{
21
22
	use \Kdyby\StrictObjects\Scream;
23
24
	public static function install(Compiler $compiler)
25
	{
26
		$me = new static($compiler);
27
		/** @var \Kdyby\Translation\Latte\TranslateMacros $me */
28
29
		$me->addMacro('_', [$me, 'macroTranslate'], [$me, 'macroTranslate']);
30
		$me->addMacro('translator', [$me, 'macroDomain'], [$me, 'macroDomain']);
31
32
		return $me;
33
	}
34
35
	/**
36
	 * {_$var |modifiers}
37
	 * {_$var, $count |modifiers}
38
	 * {_"Sample message", $count |modifiers}
39
	 * {_some.string.id, $count |modifiers}
40
	 */
41
	public function macroTranslate(MacroNode $node, PhpWriter $writer)
42
	{
43
		if ($node->closing) {
44
			if (strpos($node->content, '<?php') === FALSE) {
45
				$value = var_export($node->content, TRUE);
46
				$node->content = '';
47
			} else {
48
				$node->openingCode = '<?php ob_start(function () {}) ?>' . $node->openingCode;
49
				$value = 'ob_get_clean()';
50
			}
51
52 View Code Duplication
			if (!defined(Engine::class . '::VERSION_ID') || Engine::VERSION_ID < 20804) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
53
				return $writer->write('$_fi = new LR\FilterInfo(%var); echo %modifyContent($this->filters->filterContent("translate", $_fi, %raw))', $node->context[0], $value);
54
			}
55
56 View Code Duplication
			if (Engine::VERSION_ID >= 20900 && Engine::VERSION_ID < 20902) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
57
				return $writer->write('$__fi = new LR\FilterInfo(%var); echo %modifyContent($this->filters->filterContent("translate", $__fi, %raw))', $node->context[0], $value);
58
			}
59
60
			return $writer->write('$ʟ_fi = new LR\FilterInfo(%var); echo %modifyContent($this->filters->filterContent("translate", $ʟ_fi, %raw))', $node->context[0], $value);
61
62
		} elseif ($node->args !== '') {
63
			$node->empty = TRUE;
64
			if ($this->containsOnlyOneWord($node)) {
65
				return $writer->write('echo %modify(call_user_func($this->filters->translate, %node.word))');
66
67
			} else {
68
				return $writer->write('echo %modify(call_user_func($this->filters->translate, %node.word, %node.args))');
69
			}
70
		}
71
	}
72
73
	/**
74
	 * @param \Latte\MacroNode $node
75
	 * @param \Latte\PhpWriter $writer
76
	 * @throws \Latte\CompileException for invalid domain
77
	 * @return string|NULL
78
	 */
79
	public function macroDomain(MacroNode $node, PhpWriter $writer)
80
	{
81
		if ($node->closing) {
82
			if ($node->content !== NULL && $node->content !== '') {
83
				return $writer->write('$_translator->unregister($this);');
84
			}
85
86
		} else {
87
			if ($node->empty) {
88
				throw new \Latte\CompileException('Expected message prefix, none given');
89
			}
90
91
			return $writer->write('$_translator = ' . PrefixedTranslator::class . '::register($this, %node.word);');
92
		}
93
	}
94
95
	/**
96
	 * @param \Latte\MacroNode $node
97
	 * @return bool
98
	 */
99
	private function containsOnlyOneWord(MacroNode $node)
100
	{
101
		$result = trim($node->tokenizer->joinUntil(',')) === trim($node->args);
102
		$node->tokenizer->reset();
103
		return $result;
104
	}
105
106
}
107