Tag::extractTagAttributes()   D
last analyzed

Complexity

Conditions 15
Paths 147

Size

Total Lines 78
Code Lines 50

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 55
CRAP Score 15.0097

Importance

Changes 0
Metric Value
dl 0
loc 78
ccs 55
cts 57
cp 0.9649
rs 4.7945
c 0
b 0
f 0
cc 15
eloc 50
nc 147
nop 1
crap 15.0097

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Kaloa\Renderer\Inigo;
4
5
/**
6
 *
7
 */
8
final class Tag
9
{
10
    /**
11
     *
12
     * @var string
13
     */
14
    private $name;
15
16
    /**
17
     *
18
     * @var array
19
     */
20
    private $attributes;
21
22
    /**
23
     *
24
     * @var boolean
25
     */
26
    private $isClosingTag;
27
28
    /**
29
     *
30
     * @var string
31
     */
32
    private $rawData;
33
34
    /**
35
     *
36
     * @var boolean
37
     */
38
    private $isValid;
39
40
    /**
41
     *
42
     * @var array|null
43
     */
44
    private $myHandler;
45
46
    /**
47
     *
48
     * @param string $tagString
49
     * @param array $handlers
50
     */
51 18
    public function __construct($tagString, array $handlers)
52
    {
53 18
        $this->rawData = $tagString;
54 18
        $this->name    = $this->extractTagName($tagString);
55
56 18
        $this->myHandler = null;
57
58 18
        foreach ($handlers as $handler) {
59 18
            if ($handler['name'] === $this->name) {
60 18
                $this->myHandler = $handler;
61 18
                break;
62
            }
63 18
        }
64
65 18
        $this->isValid      = (null !== $this->myHandler);
66 18
        $this->isClosingTag = ('/' === mb_substr($tagString, 1, 1));
67 18
        $this->attributes   = $this->extractTagAttributes($tagString);
68 18
    }
69
70
    /**
71
     *
72
     * @return string
73
     */
74 18
    public function getRawData()
75
    {
76 18
        return $this->rawData;
77
    }
78
79
    /**
80
     * Returns the tag name from a valid tag string
81
     *
82
     * "[tag=http://.../]" => "tag"
83
     * "[/TAG]"            => "tag"
84
     *
85
     * @return string
86
     */
87 18
    public function getName()
88
    {
89 18
        return $this->name;
90
    }
91
92
    /**
93
     *
94
     * @return array
95
     */
96 18
    public function getAttributes()
97
    {
98 18
        return $this->attributes;
99
    }
100
101
    /**
102
     *
103
     * @return boolean
104
     */
105 18
    public function isClosingTag()
106
    {
107 18
        return $this->isClosingTag;
108
    }
109
110
    /**
111
     *
112
     * @return boolean
113
     */
114 18
    public function isOfType($tagType)
115
    {
116 18
        return ($this->isValid && $this->myHandler['type'] & $tagType);
117
    }
118
119
    /**
120
     *
121
     * @return boolean
122
     */
123 18
    public function isValid()
124
    {
125 18
        return $this->isValid;
126
    }
127
128
    /**
129
     *
130
     *
131
     * @param string $tagString
132
     * @return string
133
     */
134 18
    private function extractTagName($tagString)
135
    {
136 18
        $name       = '';
137 18
        $tagPattern = '[A-Za-z][A-Za-z0-9_]*';
138 18
        $matches    = array();
139
140 18
        if (1 === preg_match('/\A\[(' . $tagPattern . ')[\s=\]]/', $tagString, $matches)) {
141 18
            $name = strtolower($matches[1]);
142 18
        } elseif (1 === preg_match('/\A\[\/(' . $tagPattern . ')\s*\]\z/', $tagString, $matches)) {
143 18
            $name = strtolower($matches[1]);
144 18
        }
145
146 18
        return $name;
147
    }
148
149
    /**
150
     *
151
     * @param  string $tagString
152
     * @return array
153
     */
154 18
    private function extractTagAttributes($tagString)
155
    {
156 18
        if (false === $this->isValid) {
157 2
            return array();
158
        }
159
160 18
        $ret = array();
161
162 18
        $tagString = str_replace('&quot;', '"', $tagString);
163 18
        $tagString = str_replace("\\\"", '&quot;', $tagString);
164
165 18
        $tagString = trim(mb_substr($tagString, 1, mb_strlen($tagString) - 2));
166
167 18
        $i = mb_strpos($tagString, ' ');
168 18
        $j = mb_strpos($tagString, '=');
169 18
        if ((!($j === false)) && (($j < $i) || ($i === false))) {
170 10
            $i = $j;
171 10
        }
172
173 18
        if ($i === false) {
174 18
            return array();
175
        }
176
177 11
        $tagString = trim(mb_substr($tagString, $i));
178
179 11
        if (mb_substr($tagString, 0, 1) == '=') {
180
            //if
181 10
            $t = ltrim(mb_substr($tagString, 1));
182 10
            if (mb_substr($t, 0, 1) == '"') {
183 6
                $i = mb_strpos($tagString, '"');
184 6
                $j = mb_strpos($tagString, '"', $i + 1);
185 6
                $ret['__default'] = mb_substr($tagString, $i + 1, $j - ($i + 1));
186 6
                $tagString = trim(mb_substr($tagString, $j + 1));
187 6
            } else {
188 8
                $i = mb_strpos($t, ' ');
189 8
                if ($i === false) {
190 8
                    $ret['__default'] = trim($t);
191 8
                    $tagString = trim(mb_substr($t, $i + 1));
192 8
                } else {
193 1
                    $ret['__default'] = mb_substr($t, 0, $i);
194 1
                    $tagString = trim(mb_substr($t, $i + 1));
195
                }
196
            }
197 10
        }
198
199 11
        $i = mb_strpos($tagString, '=');
200 11
        while (!($i === false)) {
201 10
            $j = mb_strpos($tagString, '"');
202 10
            $k = mb_strpos($tagString, '"', $j + 1);
203 10
            if (($k > -1) && (mb_substr($tagString, $k - 1, 1) == '\\')) {
204
                $k = mb_strpos($tagString, '"', $k + 1);
205
            }
206 10
            $ret[trim(mb_substr($tagString, 0, $i))] = mb_substr($tagString, $j + 1, $k - ($j + 1));
207 10
            $tagString = trim(mb_substr($tagString, $k + 1));
208 10
            $i = mb_strpos($tagString, '=');
209 10
        }
210
211 11
        $retNew = array();
212 11
        foreach ($ret as $key => $value) {
213 11
            $retNew[strtolower($key)] = $value;
214 11
        }
215 11
        $ret = $retNew;
216 11
        unset($retNew);
217
218 11
        if (isset($ret['__default'])) {
219 10
            $defaultParam = $this->myHandler['function']->defaultParam;
220
221 10
            if (!isset($ret[$defaultParam])) {
222 10
                $ret[$defaultParam] = $ret['__default'];
223 10
            }
224
225 10
            unset($ret['__default']);
226 10
        }
227
228 11
        ksort($ret);
229
230 11
        return $ret;
231
    }
232
}
233