Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
40.91% covered (danger)
40.91%
9 / 22
CRAP
45.83% covered (danger)
45.83%
22 / 48
Theme
0.00% covered (danger)
0.00%
0 / 1
40.91% covered (danger)
40.91%
9 / 22
142.86
45.83% covered (danger)
45.83%
22 / 48
 getLang
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 setLang
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 getMetas
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 setMetas
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 addMeta
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 renderMetas
100.00% covered (success)
100.00%
1 / 1
3
100.00% covered (success)
100.00%
7 / 7
 getTitle
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 setTitle
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
2 / 2
 renderTitle
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 getBody
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 setBody
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 getStyles
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 setStyles
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 appendStyles
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 prependStyles
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 renderStyles
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 4
 getScripts
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 setScripts
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 appendScripts
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 prependScripts
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 renderScripts
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 4
 escape
0.00% covered (danger)
0.00%
0 / 1
2.06
75.00% covered (warning)
75.00%
3 / 4
1<?php namespace Framework\Theme;
2
3class Theme
4{
5    protected string $lang = 'en';
6    /**
7     * @var array|array[]
8     */
9    protected array $metas = [];
10    protected string $title = '';
11    protected string $body = '';
12    /**
13     * @var array|string[]
14     */
15    protected array $styles = [];
16    /**
17     * @var array|string[]
18     */
19    protected array $scripts = [];
20
21    public function getLang() : string
22    {
23        return $this->lang;
24    }
25
26    /**
27     * @param string $lang
28     *
29     * @return $this
30     */
31    public function setLang(string $lang)
32    {
33        $this->lang = $lang;
34        return $this;
35    }
36
37    /**
38     * @return array|array[]
39     */
40    public function getMetas() : array
41    {
42        return $this->metas;
43    }
44
45    /**
46     * @param array|array[] $metas
47     *
48     * @return $this
49     */
50    public function setMetas(array $metas)
51    {
52        $this->metas = $metas;
53        return $this;
54    }
55
56    /**
57     * @param array|string[] $meta
58     *
59     * @return $this
60     */
61    public function addMeta(array $meta)
62    {
63        $this->metas[] = $meta;
64        return $this;
65    }
66
67    public function renderMetas() : string
68    {
69        $content = '';
70        foreach ($this->getMetas() as $meta) {
71            $part = '';
72            foreach ($meta as $key => $value) {
73                $part .= $this->escape($key) . '="' . $this->escape($value) . '" ';
74            }
75            $content .= '<meta ' . \rtrim($part) . '>' . \PHP_EOL;
76        }
77        return $content;
78    }
79
80    public function getTitle() : string
81    {
82        return $this->title;
83    }
84
85    /**
86     * @param string $title
87     *
88     * @return $this
89     */
90    public function setTitle(string $title)
91    {
92        $this->title = $title;
93        return $this;
94    }
95
96    public function renderTitle() : string
97    {
98        return '<title>' . $this->escape($this->getTitle()) . '</title>' . \PHP_EOL;
99    }
100
101    public function getBody() : string
102    {
103        return $this->body;
104    }
105
106    /**
107     * @param string $body
108     *
109     * @return $this
110     */
111    public function setBody(string $body)
112    {
113        $this->body = $body;
114        return $this;
115    }
116
117    /**
118     * @return array|string[]
119     */
120    public function getStyles() : array
121    {
122        return $this->styles;
123    }
124
125    /**
126     * @param array|string[] $styles
127     *
128     * @return $this
129     */
130    public function setStyles(array $styles)
131    {
132        $this->styles = $styles;
133        return $this;
134    }
135
136    /**
137     * @param array|string[] $styles
138     *
139     * @return $this
140     */
141    public function appendStyles(array $styles)
142    {
143        \array_push($this->styles, ...$styles);
144        return $this;
145    }
146
147    /**
148     * @param array|string[] $styles
149     *
150     * @return $this
151     */
152    public function prependStyles(array $styles)
153    {
154        \array_unshift($this->styles, ...$styles);
155        return $this;
156    }
157
158    public function renderStyles() : string
159    {
160        $content = '';
161        foreach ($this->getStyles() as $style) {
162            $content .= '<link rel="stylesheet" type="text/css" href="' . $this->escape($style) . '">' . \PHP_EOL;
163        }
164        return $content;
165    }
166
167    /**
168     * @return array|string[]
169     */
170    public function getScripts() : array
171    {
172        return $this->scripts;
173    }
174
175    /**
176     * @param array|string[] $scripts
177     *
178     * @return $this
179     */
180    public function setScripts(array $scripts)
181    {
182        $this->scripts = $scripts;
183        return $this;
184    }
185
186    /**
187     * @param array|string[] $scripts
188     *
189     * @return $this
190     */
191    public function appendScripts(array $scripts)
192    {
193        \array_push($this->scripts, ...$scripts);
194        return $this;
195    }
196
197    /**
198     * @param array|string[] $scripts
199     *
200     * @return $this
201     */
202    public function prependScripts(array $scripts)
203    {
204        \array_unshift($this->scripts, ...$scripts);
205        return $this;
206    }
207
208    public function renderScripts() : string
209    {
210        $content = '';
211        foreach ($this->getScripts() as $script) {
212            $content .= '<script src="' . $this->escape($script) . '"></script>' . \PHP_EOL;
213        }
214        return $content;
215    }
216
217    public function escape(?string $text, string $encoding = 'UTF-8') : string
218    {
219        $text = (string) $text;
220        return empty($text)
221            ? $text
222            : \htmlspecialchars($text, \ENT_QUOTES | \ENT_HTML5, $encoding);
223    }
224}