HtmlEscape::setDefaultHtmlFlags()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace EngineWorks\Templates\Plugins;
6
7
use EngineWorks\Templates\Plugin;
8
9
class HtmlEscape implements Plugin
10
{
11
    /** @var int flags as used in htmlspecialchars php function */
12
    private $defaultHtmlFlags;
13
14
    /**
15
     * @return array{e: string, js: string, ejs: string, uri: string, url: string, qry: string}
16
     */
17 3
    public function getCallablesTable(): array
18
    {
19
        return [
20 3
            'e' => 'html',
21
            'js' => 'javascript',
22
            'ejs' => 'javascriptInHtml',
23
            'uri' => 'uri',
24
            'url' => 'url',
25
            'qry' => 'query',
26
        ];
27
    }
28
29 10
    public function __construct(int $defaultHtmlFlags = ENT_COMPAT | ENT_HTML5)
30
    {
31 10
        $this->setDefaultHtmlFlags($defaultHtmlFlags);
32
    }
33
34 2
    public function html(string $string, int $flags = null): string
35
    {
36 2
        return htmlspecialchars($string, $flags ?? $this->getDefaultHtmlFlags());
37
    }
38
39 2
    public function javascript(string $string): string
40
    {
41 2
        return str_replace(
42 2
            ['\\', "'", '"', "\r", "\n", "\t", "\f"],
43 2
            ['\\\\', "\\'", '\\"', '\\r', '\\n', '\\t', '\\f'],
44
            $string
45
        );
46
    }
47
48 1
    public function javascriptInHtml(string $string): string
49
    {
50 1
        return $this->javascript($this->html($string));
51
    }
52
53 1
    public function uri(string $string): string
54
    {
55 1
        return rawurlencode($string);
56
    }
57
58
    /** @param array<string, (scalar|null)|(scalar|null)[]> $vars */
59 1
    public function query(array $vars): string
60
    {
61 1
        return http_build_query($vars, '', '&', PHP_QUERY_RFC3986);
62
    }
63
64
    /** @param array<string, mixed> $vars */
65 2
    public function url(string $url, array $vars = []): string
66
    {
67
        // get query and fragment
68 2
        $qrystr = (string) parse_url($url, PHP_URL_QUERY);
69 2
        $fragstr = (string) parse_url($url, PHP_URL_FRAGMENT);
70 2
        $qrylen = strlen($qrystr);
71 2
        $fraglen = strlen($fragstr);
72 2
        $parts = intval($qrylen > 0) + intval($fraglen > 0);
73
        // exit if there are any qrystring, fragment and does not include new vars
74 2
        if ([] === $vars && 0 === $parts) {
75 1
            return $url;
76
        }
77
        // get the path without query string and fragment
78 1
        if ($parts > 0) {
79 1
            $url = substr($url, 0, strlen($url) - $qrylen - $fraglen - $parts);
80
        }
81
        // put the current query string into an array
82 1
        parse_str($qrystr, $qryvars);
83
        // merge new properties to the array
84 1
        $qryvars = array_merge($qryvars, $vars);
85
        // return with new query string and fragment
86
        return $url
87 1
            . (([] !== $qryvars) ? '?' . $this->query($qryvars) : '')
88 1
            . (($fraglen > 0) ? '#' . $fragstr : '');
89
    }
90
91
    /**
92
     * Get default html flags as used in htmlspecialchars php function
93
     */
94 3
    public function getDefaultHtmlFlags(): int
95
    {
96 3
        return $this->defaultHtmlFlags;
97
    }
98
99
    /**
100
     * Set default html flags as used in htmlspecialchars php function
101
     */
102 10
    public function setDefaultHtmlFlags(int $defaultHtmlFlags): void
103
    {
104 10
        $this->defaultHtmlFlags = $defaultHtmlFlags;
105
    }
106
}
107