Completed
Push — develop ( dbe6e9...4ce4ad )
by Peter
17:41
created

Translate::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
/**
3
 * Webino (http://webino.sk)
4
 *
5
 * @link        https://github.com/webino/WebinoDraw for the canonical source repository
6
 * @copyright   Copyright (c) 2012-2017 Webino, s. r. o. (http://webino.sk)
7
 * @author      Peter Bačinský <[email protected]>
8
 * @license     BSD-3-Clause
9
 */
10
11
namespace WebinoDraw\Draw\Helper;
12
13
use WebinoDraw\Dom\Attr;
14
use WebinoDraw\Dom\NodeList;
15
use WebinoDraw\VarTranslator\Translation;
16
use Zend\I18n\Translator\TranslatorInterface;
17
18
/**
19
 * Class Translate
20
 */
21
class Translate extends Element
22
{
23
    /**
24
     * Draw helper service name
25
     */
26
    const SERVICE = 'webinodrawtranslate';
27
28
    /**
29
     * @var TranslatorInterface
30
     */
31
    protected $translator;
32
33
    /**
34
     * @param TranslatorInterface|object $translator
35
     */
36
    public function __construct(TranslatorInterface $translator)
37
    {
38
        $this->translator = $translator;
39
    }
40
41
    /**
42
     * @param TranslatorInterface $translator
43
     * @return $this
44
     */
45
    public function setTranslator(TranslatorInterface $translator)
46
    {
47
        $this->translator = $translator;
48
        return $this;
49
    }
50
51
    /**
52
     * @param NodeList $nodes
53
     * @param array $spec
54
     * @return self
55
     */
56
    public function drawNodes(NodeList $nodes, array $spec)
57
    {
58
        $remainNodes = $this->translateAttribNodes($nodes, $this->resolveTextDomain($spec));
59
        if (empty($remainNodes)) {
60
            // return early when all nodes were attribs
61
            return $this;
62
        }
63
64
        return parent::drawNodes($nodes->create($remainNodes), $spec);
65
    }
66
67
    /**
68
     * @param string $value
69
     * @param Translation $varTranslation
70
     * @param array $spec
71
     * @return string
72
     */
73
    public function translateValue($value, Translation $varTranslation, array $spec)
74
    {
75
        $varValue = trim(parent::translateValue($value, $varTranslation, $spec));
76
        if (empty($varValue)) {
77
            return '';
78
        }
79
80
        return $this->translator->translate($varValue, $this->resolveTextDomain($spec));
81
    }
82
83
    /**
84
     * @param NodeList $nodes
85
     * @param string $textDomain
86
     * @return array
87
     */
88
    protected function translateAttribNodes(NodeList $nodes, $textDomain)
89
    {
90
        $remainNodes = [];
91
        foreach ($nodes as $node) {
92
            if ($node instanceof Attr && !$node->isEmpty()) {
93
                $node->nodeValue = $this->translator->translate($node->nodeValue, $textDomain);
94
            }
95
96
            $remainNodes[] = $node;
97
        }
98
99
        return $remainNodes;
100
    }
101
102
    /**
103
     * @param array $spec
104
     * @return string
105
     */
106
    protected function resolveTextDomain(array $spec)
107
    {
108
        // TODO inversion of control (spec object)
109
        return !empty($spec['text_domain']) ? $spec['text_domain'] : 'default';
110
    }
111
}
112