HtmlElementCss   A
last analyzed

Complexity

Total Complexity 26

Size/Duplication

Total Lines 196
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 83
c 1
b 0
f 0
dl 0
loc 196
ccs 92
cts 92
cp 1
rs 10
wmc 26

7 Methods

Rating   Name   Duplication   Size   Complexity  
A toggleClass() 0 30 5
A setCss() 0 24 5
A removeCss() 0 15 4
A addClass() 0 18 3
A hasClass() 0 6 1
A removeClass() 0 23 4
A getCss() 0 19 4
1
<?php
2
3
namespace Sulao\HtmlQuery;
4
5
/**
6
 * Class HtmlElementCss
7
 *
8
 * @package Sulao\HtmlQuery
9
 */
10
trait HtmlElementCss
11
{
12
    abstract public function hasAttr(string $attributeName);
13
    abstract public function setAttr(string $name, string $value);
14
    abstract public function getAttr(string $name);
15
    abstract public function removeAttr(string $attributeName);
16
17
    /**
18
     * Adds the specified class(es).
19
     *
20
     * @param string $className
21
     */
22 4
    public function addClass(string $className)
23
    {
24 4
        if (!$this->hasAttr('class')) {
25 2
            $this->setAttr('class', $className);
26 2
            return;
27
        }
28
29 3
        $classNames = Helper::splitClass($className);
30 3
        $class = (string) $this->getAttr('class');
31 3
        $classes = Helper::splitClass($class);
32
33 3
        $classArr = array_diff($classNames, $classes);
34 3
        if (empty($classArr)) {
35 2
            return;
36
        }
37
38 3
        $class .= ' ' . implode(' ', $classArr);
39 3
        $this->setAttr('class', $class);
40 3
    }
41
42
    /**
43
     * Determine whether the node is assigned the given class.
44
     *
45
     * @param string $className
46
     *
47
     * @return bool
48
     */
49 2
    public function hasClass(string $className)
50
    {
51 2
        $class = (string) $this->getAttr('class');
52 2
        $classes = Helper::splitClass($class);
53
54 2
        return in_array($className, $classes);
55
    }
56
57
    /**
58
     * Remove a single class, multiple classes, or all classes.
59
     *
60
     * @param string|null $className
61
     */
62 2
    public function removeClass(?string $className = null)
63
    {
64 2
        if (!$this->hasAttr('class')) {
65 1
            return;
66
        }
67
68 2
        if (is_null($className)) {
69 2
            $this->removeAttr('class');
70 2
            return;
71
        }
72
73 2
        $classNames = Helper::splitClass($className);
74 2
        $class = (string) $this->getAttr('class');
75 2
        $classes = Helper::splitClass($class);
76
77 2
        $classArr = array_diff($classes, $classNames);
78 2
        if (empty($classArr)) {
79 2
            $this->removeAttr('class');
80 2
            return;
81
        }
82
83 2
        $class = implode(' ', $classArr);
84 2
        $this->setAttr('class', $class);
85 2
    }
86
87
    /**
88
     * Add or remove class(es), depending on either the class's presence
89
     * or the value of the state argument.
90
     *
91
     * @param string $className
92
     * @param bool|null   $state
93
     */
94 1
    public function toggleClass(string $className, ?bool $state = null)
95
    {
96 1
        if (!is_null($state)) {
97 1
            if ($state) {
98 1
                $this->addClass($className);
99
            } else {
100 1
                $this->removeClass($className);
101
            }
102 1
            return;
103
        }
104
105 1
        if (!$this->hasAttr('class')) {
106 1
            $this->setAttr('class', $className);
107 1
            return;
108
        }
109
110 1
        $classNames = Helper::splitClass($className);
111 1
        $classes = Helper::splitClass((string) $this->getAttr('class'));
112
113 1
        $classArr = array_diff($classes, $classNames);
114 1
        $classArr = array_merge(
115 1
            $classArr,
116 1
            array_diff($classNames, $classes)
117
        );
118 1
        if (empty($classArr)) {
119 1
            $this->removeClass($className);
120 1
            return;
121
        }
122
123 1
        $this->setAttr('class', implode(' ', $classArr));
124 1
    }
125
126
    /**
127
     * Get the value of a computed style property
128
     *
129
     * @param string $name
130
     *
131
     * @return string|null
132
     */
133 1
    public function getCss(string $name)
134
    {
135 1
        $style = (string) $this->getAttr('style');
136 1
        $css = Helper::splitCss($style);
137 1
        if (!$css) {
138 1
            return null;
139
        }
140
141 1
        if (array_key_exists($name, $css)) {
142 1
            return $css[$name];
143
        }
144
145 1
        $arr = array_change_key_case($css, CASE_LOWER);
146 1
        $key = strtolower($name);
147 1
        if (array_key_exists($key, $arr)) {
148 1
            return $arr[$key];
149
        }
150
151 1
        return null;
152
    }
153
154
    /**
155
     * Set or Remove one CSS property.
156
     *
157
     * @param string      $name
158
     * @param string|null $value
159
     */
160 1
    public function setCss(string $name, ?string $value)
161
    {
162 1
        if ((string) $value === '') {
163 1
            $this->removeCss($name);
164 1
            return;
165
        }
166
167 1
        $style = (string) $this->getAttr('style');
168 1
        if (!$style) {
169 1
            $this->setAttr('style', $name . ': ' . $value . ';');
170 1
            return;
171
        }
172
173 1
        $css = Helper::splitCss($style);
174 1
        if (!array_key_exists($name, $css)) {
175 1
            $keys = Helper::caseInsensitiveSearch($name, array_keys($css));
176 1
            foreach ($keys as $key) {
177 1
                unset($css[$key]);
178
            }
179
        }
180
181 1
        $css[$name] = $value;
182 1
        $style = Helper::implodeCss($css);
183 1
        $this->setAttr('style', $style);
184 1
    }
185
186
    /**
187
     * Remove one CSS property.
188
     *
189
     * @param string $name
190
     */
191 1
    public function removeCss(string $name)
192
    {
193 1
        $style = (string) $this->getAttr('style');
194
195 1
        if ($style !== '') {
196 1
            $css = Helper::splitCss($style);
197 1
            $keys = Helper::caseInsensitiveSearch($name, array_keys($css));
198
199 1
            if (!empty($keys)) {
200 1
                foreach ($keys as $key) {
201 1
                    unset($css[$key]);
202
                }
203
204 1
                $style = Helper::implodeCss($css);
205 1
                $this->setAttr('style', $style);
206
            }
207
        }
208 1
    }
209
}
210