Completed
Push — feature/update-1-2-4-2 ( 6c4151...ea1ffd )
by Ryan
03:11
created

htmLawed.php ➔ hl_bal()   F

Complexity

Conditions 102
Paths > 20000

Size

Total Lines 264

Duplication

Lines 84
Ratio 31.82 %

Code Coverage

Tests 115
CRAP Score 788.5416

Importance

Changes 0
Metric Value
cc 102
nc 1948433784
nop 3
dl 84
loc 264
ccs 115
cts 193
cp 0.5959
crap 788.5416
rs 0
c 0
b 0
f 0

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
/*
4
htmLawed 1.2.4.2, 16 May 2019
5
Copyright Santosh Patnaik
6
Dual licensed with LGPL 3 and GPL 2+
7
A PHP Labware internal utility - www.bioinformatics.org/phplabware/internal_utilities/htmLawed
8
9
See htmLawed_README.txt/htm
10
*/
11
12
/**
13
 * @param string $t
14
 * @param int|array $C
15
 * @param array|string $S
16
 * @return string
17
 */
18
function htmLawed($t, $C = 1, $S = array()) {
19 1731
    $C = is_array($C) ? $C : array();
20 1731
    if (!empty($C['valid_xhtml'])) {
21 559
        $C['elements'] = empty($C['elements']) ? '*-acronym-big-center-dir-font-isindex-s-strike-tt' : $C['elements'];
22 559
        $C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 2;
23 559
        $C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 2;
24
    }
25
    // config eles
26 1731
    $e = array('a' => 1, 'abbr' => 1, 'acronym' => 1, 'address' => 1, 'applet' => 1, 'area' => 1, 'article' => 1, 'aside' => 1, 'audio' => 1, 'b' => 1, 'bdi' => 1, 'bdo' => 1, 'big' => 1, 'blockquote' => 1, 'br' => 1, 'button' => 1, 'canvas' => 1, 'caption' => 1, 'center' => 1, 'cite' => 1, 'code' => 1, 'col' => 1, 'colgroup' => 1, 'command' => 1, 'data' => 1, 'datalist' => 1, 'dd' => 1, 'del' => 1, 'details' => 1, 'dfn' => 1, 'dir' => 1, 'div' => 1, 'dl' => 1, 'dt' => 1, 'em' => 1, 'embed' => 1, 'fieldset' => 1, 'figcaption' => 1, 'figure' => 1, 'font' => 1, 'footer' => 1, 'form' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'header' => 1, 'hgroup' => 1, 'hr' => 1, 'i' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'ins' => 1, 'isindex' => 1, 'kbd' => 1, 'keygen' => 1, 'label' => 1, 'legend' => 1, 'li' => 1, 'link' => 1, 'main' => 1, 'map' => 1, 'mark' => 1, 'menu' => 1, 'meta' => 1, 'meter' => 1, 'nav' => 1, 'noscript' => 1, 'object' => 1, 'ol' => 1, 'optgroup' => 1, 'option' => 1, 'output' => 1, 'p' => 1, 'param' => 1, 'pre' => 1, 'progress' => 1, 'q' => 1, 'rb' => 1, 'rbc' => 1, 'rp' => 1, 'rt' => 1, 'rtc' => 1, 'ruby' => 1, 's' => 1, 'samp' => 1, 'script' => 1, 'section' => 1, 'select' => 1, 'small' => 1, 'source' => 1, 'span' => 1, 'strike' => 1, 'strong' => 1, 'style' => 1, 'sub' => 1, 'summary' => 1, 'sup' => 1, 'table' => 1, 'tbody' => 1, 'td' => 1, 'textarea' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'time' => 1, 'tr' => 1, 'track' => 1, 'tt' => 1, 'u' => 1, 'ul' => 1, 'var' => 1, 'video' => 1, 'wbr' => 1); // 118 incl. deprecated & some Ruby
27
28 1731
    if (!empty($C['safe'])) {
29 559
        unset($e['applet'], $e['audio'], $e['canvas'], $e['embed'], $e['iframe'], $e['object'], $e['script'], $e['video']);
30
    }
31 1731
    $x = !empty($C['elements']) ? str_replace(array("\n", "\r", "\t", ' '), '', $C['elements']) : '*';
32 1731
    if ($x == '-*') {
33
        $e = array();
34 1731
    } elseif (strpos($x, '*') === false) {
35
        $e = array_flip(explode(',', $x));
36
    } else {
37 1731
        if (isset($x[1])) {
38 1163
            preg_match_all('`(?:^|-|\+)[^\-+]+?(?=-|\+|$)`', $x, $m, PREG_SET_ORDER);
39 1163
            for ($i = count($m); --$i >= 0;) {
40 1163
                $m[$i] = $m[$i][0];
41
            }
42 1163
            foreach ($m as $v) {
0 ignored issues
show
Bug introduced by
The expression $m of type null|array<integer,array<integer,string>> is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
43 1163
                if ($v[0] == '+') {
44
                    $e[substr($v, 1)] = 1;
45
                }
46 1163
                if ($v[0] == '-' && isset($e[($v = substr($v, 1))]) && !in_array('+'.$v, $m)) {
47 1163
                    unset($e[$v]);
48
                }
49
            }
50
        }
51
    }
52 1731
    $C['elements'] = &$e;
53
    // config attrs
54 1731
    $x = !empty($C['deny_attribute']) ? strtolower(str_replace(array("\n", "\r", "\t", ' '), '', $C['deny_attribute'])) : '';
55 1731
    $x = array_flip((isset($x[0]) && $x[0] == '*') ? str_replace('/', 'data-', explode('-', str_replace('data-', '/', $x))) : explode(',', $x.(!empty($C['safe']) ? ',on*' : '')));
56 1731
    $C['deny_attribute'] = $x;
57
    // config URLs
58 1731
    $x = (isset($C['schemes'][2]) && strpos($C['schemes'], ':')) ? strtolower($C['schemes']) : 'href: aim, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, tel, telnet'.(empty($C['safe']) ? ', app, javascript; *: data, javascript, ' : '; *:').'file, http, https';
59 1731
    $C['schemes'] = array();
60 1731
    foreach (explode(';', trim(str_replace(array(' ', "\t", "\r", "\n"), '', $x), ';')) as $v) {
61 1731
        $x = $x2 = null;
62 1731
        list($x, $x2) = explode(':', $v, 2);
63 1731
        if ($x2) {
64 1731
            $C['schemes'][$x] = array_flip(explode(',', $x2));
65
        }
66
    }
67 1731
    if (!isset($C['schemes']['*'])) {
68
        $C['schemes']['*'] = array('file' => 1, 'http' => 1, 'https' => 1);
69
        if (empty($C['safe'])) {
70
            $C['schemes']['*'] += array('data' => 1, 'javascript' => 1);
71
        }
72
    }
73 1731
    if (!empty($C['safe']) && empty($C['schemes']['style'])) {
74 559
        $C['schemes']['style'] = array('!' => 1);
75
    }
76 1731
    $C['abs_url'] = isset($C['abs_url']) ? $C['abs_url'] : 0;
77 1731
    if (!isset($C['base_url']) or !preg_match('`^[a-zA-Z\d.+\-]+://[^/]+/(.+?/)?$`', $C['base_url'])) {
78 1731
        $C['base_url'] = $C['abs_url'] = 0;
79
    }
80
    // config rest
81 1731
    $C['and_mark'] = empty($C['and_mark']) ? 0 : 1;
82 1731
    $C['anti_link_spam'] = (isset($C['anti_link_spam']) && is_array($C['anti_link_spam']) && count($C['anti_link_spam']) == 2 && (empty($C['anti_link_spam'][0]) or hl_regex($C['anti_link_spam'][0])) && (empty($C['anti_link_spam'][1]) or hl_regex($C['anti_link_spam'][1]))) ? $C['anti_link_spam'] : 0;
83 1731
    $C['anti_mail_spam'] = isset($C['anti_mail_spam']) ? $C['anti_mail_spam'] : 0;
84 1731
    $C['balance'] = isset($C['balance']) ? (bool)$C['balance'] : 1;
85 1731
    $C['cdata'] = isset($C['cdata']) ? $C['cdata'] : (empty($C['safe']) ? 3 : 0);
86 1731
    $C['clean_ms_char'] = empty($C['clean_ms_char']) ? 0 : $C['clean_ms_char'];
87 1731
    $C['comment'] = isset($C['comment']) ? $C['comment'] : (empty($C['safe']) ? 3 : 0);
88 1731
    $C['css_expression'] = empty($C['css_expression']) ? 0 : 1;
89 1731
    $C['direct_list_nest'] = empty($C['direct_list_nest']) ? 0 : 1;
90 1731
    $C['hexdec_entity'] = isset($C['hexdec_entity']) ? $C['hexdec_entity'] : 1;
91 1731
    $C['hook'] = (!empty($C['hook']) && function_exists($C['hook'])) ? $C['hook'] : 0;
92 1731
    $C['hook_tag'] = (!empty($C['hook_tag']) && function_exists($C['hook_tag'])) ? $C['hook_tag'] : 0;
93 1731
    $C['keep_bad'] = isset($C['keep_bad']) ? $C['keep_bad'] : 6;
94 1731
    $C['lc_std_val'] = isset($C['lc_std_val']) ? (bool)$C['lc_std_val'] : 1;
95 1731
    $C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 1;
96 1731
    $C['named_entity'] = isset($C['named_entity']) ? (bool)$C['named_entity'] : 1;
97 1731
    $C['no_deprecated_attr'] = isset($C['no_deprecated_attr']) ? $C['no_deprecated_attr'] : 1;
98 1731
    $C['parent'] = isset($C['parent'][0]) ? strtolower($C['parent']) : 'body';
99 1731
    $C['show_setting'] = !empty($C['show_setting']) ? $C['show_setting'] : 0;
100 1731
    $C['style_pass'] = empty($C['style_pass']) ? 0 : 1;
101 1731
    $C['tidy'] = empty($C['tidy']) ? 0 : $C['tidy'];
102 1731
    $C['unique_ids'] = isset($C['unique_ids']) && (!preg_match('`\W`', $C['unique_ids'])) ? $C['unique_ids'] : 1;
103 1731
    $C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 0;
104
105 1731
    if (isset($GLOBALS['C'])) {
106 1730
        $reC = $GLOBALS['C'];
107
    }
108 1731
    $GLOBALS['C'] = $C;
109 1731
    $S = is_array($S) ? $S : hl_spec($S);
110 1731
    if (isset($GLOBALS['S'])) {
111 1730
        $reS = $GLOBALS['S'];
112
    }
113 1731
    $GLOBALS['S'] = $S;
114
115 1731
    $t = preg_replace('`[\x00-\x08\x0b-\x0c\x0e-\x1f]`', '', $t);
116 1731
    if ($C['clean_ms_char']) {
117
        $x = array("\x7f" => '', "\x80" => '&#8364;', "\x81" => '', "\x83" => '&#402;', "\x85" => '&#8230;', "\x86" => '&#8224;', "\x87" => '&#8225;', "\x88" => '&#710;', "\x89" => '&#8240;', "\x8a" => '&#352;', "\x8b" => '&#8249;', "\x8c" => '&#338;', "\x8d" => '', "\x8e" => '&#381;', "\x8f" => '', "\x90" => '', "\x95" => '&#8226;', "\x96" => '&#8211;', "\x97" => '&#8212;', "\x98" => '&#732;', "\x99" => '&#8482;', "\x9a" => '&#353;', "\x9b" => '&#8250;', "\x9c" => '&#339;', "\x9d" => '', "\x9e" => '&#382;', "\x9f" => '&#376;');
118
        $x = $x + ($C['clean_ms_char'] == 1 ? array("\x82" => '&#8218;', "\x84" => '&#8222;', "\x91" => '&#8216;', "\x92" => '&#8217;', "\x93" => '&#8220;', "\x94" => '&#8221;') : array("\x82" => '\'', "\x84" => '"', "\x91" => '\'', "\x92" => '\'', "\x93" => '"', "\x94" => '"'));
119
        $t = strtr($t, $x);
120
    }
121 1731
    if ($C['cdata'] or $C['comment']) {
122 1172
        $t = preg_replace_callback('`<!(?:(?:--.*?--)|(?:\[CDATA\[.*?\]\]))>`sm', 'hl_cmtcd', $t);
123
    }
124 1731
    $t = preg_replace_callback('`&amp;([a-zA-Z][a-zA-Z0-9]{1,30}|#(?:[0-9]{1,8}|[Xx][0-9A-Fa-f]{1,7}));`', 'hl_ent', str_replace('&', '&amp;', $t));
125 1731
    if ($C['unique_ids'] && !isset($GLOBALS['hl_Ids'])) {
126 1
        $GLOBALS['hl_Ids'] = array();
127
    }
128 1731
    if ($C['hook']) {
129
        $t = $C['hook']($t, $C, $S);
130
    }
131 1731
    if ($C['show_setting'] && preg_match('`^[a-z][a-z0-9_]*$`i', $C['show_setting'])) {
132
        $GLOBALS[$C['show_setting']] = array('config' => $C, 'spec' => $S, 'time' => microtime());
133
    }
134
    // main
135 1731
    $t = preg_replace_callback('`<(?:(?:\s|$)|(?:[^>]*(?:>|$)))|>`m', 'hl_tag', $t);
136 1731
    $t = $C['balance'] ? hl_bal($t, $C['keep_bad'], $C['parent']) : $t;
137 1731
    $t = (($C['cdata'] or $C['comment']) && strpos($t, "\x01") !== false) ? str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05"), array('', '', '&', '<', '>'), $t) : $t;
138 1731
    $t = $C['tidy'] ? hl_tidy($t, $C['tidy'], $C['parent']) : $t;
139 1731
    unset($C, $e);
140 1731
    if (isset($reC)) {
141 1730
        $GLOBALS['C'] = $reC;
142
    }
143 1731
    if (isset($reS)) {
144 1730
        $GLOBALS['S'] = $reS;
145
    }
146
147 1731
    return $t;
148
}
149
150
function hl_attrval($a, $t, $p) {
151
    // check attr val against $S
152
    static $ma = array('accesskey', 'class', 'itemtype', 'rel');
153
    $s = in_array($a, $ma) ? ' ' : ($a == 'srcset' ? ',' : '');
154
    $r = array();
155
    $t = !empty($s) ? explode($s, $t) : array($t);
156
    foreach ($t as $tk => $tv) {
157
        $o = 1;
158
        $tv = trim($tv);
159
        $l = strlen($tv);
160
        foreach ($p as $k => $v) {
161
            if (!$l) {
162
                continue;
163
            }
164
            switch ($k) {
165
                case 'maxlen':
166
                    if ($l > $v) {
167
                        $o = 0;
168
                    }
169
                    break;
170
                case 'minlen':
171
                    if ($l < $v) {
172
                        $o = 0;
173
                    }
174
                    break;
175
                case 'maxval':
176
                    if ((float)($tv) > $v) {
177
                        $o = 0;
178
                    }
179
                    break;
180
                case 'minval':
181
                    if ((float)($tv) < $v) {
182
                        $o = 0;
183
                    }
184
                    break;
185
                case 'match':
186
                    if (!preg_match($v, $tv)) {
187
                        $o = 0;
188
                    }
189
                    break;
190
                case 'nomatch':
191
                    if (preg_match($v, $tv)) {
192
                        $o = 0;
193
                    }
194
                    break;
195
                case 'oneof':
196
                    $m = 0;
197
                    foreach (explode('|', $v) as $n) {
198
                        if ($tv == $n) {
199
                            $m = 1;
200
                            break;
201
                        }
202
                    }
203
                    $o = $m;
204
                    break;
205
                case 'noneof':
206
                    $m = 1;
207
                    foreach (explode('|', $v) as $n) {
208
                        if ($tv == $n) {
209
                            $m = 0;
210
                            break;
211
                        }
212
                    }
213
                    $o = $m;
214
                    break;
215
                default:
216
                    break;
217
            }
218
            if (!$o) {
219
                break;
220
            }
221
        }
222
        if ($o) {
223
            $r[] = $tv;
224
        }
225
    }
226
    if ($s == ',') {
227
        $s = ', ';
228
    }
229
    $r = implode($s, $r);
230
231
    return isset($r[0]) ? $r : (isset($p['default']) ? $p['default'] : 0);
232
}
233
234
function hl_bal($t, $do = 1, $in = 'div') {
235
    // balance tags
236
// by content
237 1731
    $cB = array('form' => 1, 'map' => 1, 'noscript' => 1); // Block
238 1731
    $cE = array('area' => 1, 'br' => 1, 'col' => 1, 'command' => 1, 'embed' => 1, 'hr' => 1, 'img' => 1, 'input' => 1, 'isindex' => 1, 'keygen' => 1, 'link' => 1, 'meta' => 1, 'param' => 1, 'source' => 1, 'track' => 1, 'wbr' => 1); // Empty
239 1731
    $cF = array('a' => 1, 'article' => 1, 'aside' => 1, 'audio' => 1, 'button' => 1, 'blockquote' => 1, 'canvas' => 1, 'del' => 1, 'details' => 1, 'div' => 1, 'dd' => 1, 'fieldset' => 1, 'figure' => 1, 'footer' => 1, 'header' => 1, 'iframe' => 1, 'ins' => 1, 'li' => 1, 'main' => 1, 'menu' => 1, 'nav' => 1, 'noscript' => 1, 'object' => 1, 'section' => 1, 'style' => 1, 'td' => 1, 'th' => 1, 'video' => 1); // Flow; later context-wise dynamic move of ins & del to $cI
240 1731
    $cI = array('abbr' => 1, 'acronym' => 1, 'address' => 1, 'b' => 1, 'bdi' => 1, 'bdo' => 1, 'big' => 1, 'caption' => 1, 'cite' => 1, 'code' => 1, 'data' => 1, 'datalist' => 1, 'dfn' => 1, 'dt' => 1, 'em' => 1, 'figcaption' => 1, 'font' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'hgroup' => 1, 'i' => 1, 'kbd' => 1, 'label' => 1, 'legend' => 1, 'mark' => 1, 'meter' => 1, 'output' => 1, 'p' => 1, 'pre' => 1, 'progress' => 1, 'q' => 1, 'rb' => 1, 'rt' => 1, 's' => 1, 'samp' => 1, 'small' => 1, 'span' => 1, 'strike' => 1, 'strong' => 1, 'sub' => 1, 'summary' => 1, 'sup' => 1, 'time' => 1, 'tt' => 1, 'u' => 1, 'var' => 1); // Inline
241 1731
    $cN = array('a' => array('a' => 1, 'address' => 1, 'button' => 1, 'details' => 1, 'embed' => 1, 'keygen' => 1, 'label' => 1, 'select' => 1, 'textarea' => 1), 'address' => array('address' => 1, 'article' => 1, 'aside' => 1, 'header' => 1, 'keygen' => 1, 'footer' => 1, 'nav' => 1, 'section' => 1), 'button' => array('a' => 1, 'address' => 1, 'button' => 1, 'details' => 1, 'embed' => 1, 'fieldset' => 1, 'form' => 1, 'iframe' => 1, 'input' => 1, 'keygen' => 1, 'label' => 1, 'select' => 1, 'textarea' => 1), 'fieldset' => array('fieldset' => 1), 'footer' => array('header' => 1, 'footer' => 1), 'form' => array('form' => 1), 'header' => array('header' => 1, 'footer' => 1), 'label' => array('label' => 1), 'main' => array('main' => 1), 'meter' => array('meter' => 1), 'noscript' => array('script' => 1), 'pre' => array('big' => 1, 'font' => 1, 'img' => 1, 'object' => 1, 'script' => 1, 'small' => 1, 'sub' => 1, 'sup' => 1), 'progress' => array('progress' => 1), 'rb' => array('ruby' => 1), 'rt' => array('ruby' => 1), 'time' => array('time' => 1)); // Illegal
242 1731
    $cN2 = array_keys($cN);
243 1731
    $cS = array('colgroup' => array('col' => 1), 'datalist' => array('option' => 1), 'dir' => array('li' => 1), 'dl' => array('dd' => 1, 'dt' => 1), 'hgroup' => array('h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1), 'menu' => array('li' => 1), 'ol' => array('li' => 1), 'optgroup' => array('option' => 1), 'option' => array('#pcdata' => 1), 'rbc' => array('rb' => 1), 'rp' => array('#pcdata' => 1), 'rtc' => array('rt' => 1), 'ruby' => array('rb' => 1, 'rbc' => 1, 'rp' => 1, 'rt' => 1, 'rtc' => 1), 'select' => array('optgroup' => 1, 'option' => 1), 'script' => array('#pcdata' => 1), 'table' => array('caption' => 1, 'col' => 1, 'colgroup' => 1, 'tfoot' => 1, 'tbody' => 1, 'tr' => 1, 'thead' => 1), 'tbody' => array('tr' => 1), 'tfoot' => array('tr' => 1), 'textarea' => array('#pcdata' => 1), 'thead' => array('tr' => 1), 'tr' => array('td' => 1, 'th' => 1), 'ul' => array('li' => 1)); // Specific - immediate parent-child
244 1731
    if ($GLOBALS['C']['direct_list_nest']) {
245 613
        $cS['ol'] = $cS['ul'] = $cS['menu'] += array('menu' => 1, 'ol' => 1, 'ul' => 1);
246
    }
247 1731
    $cO = array('address' => array('p' => 1), 'applet' => array('param' => 1), 'audio' => array('source' => 1, 'track' => 1), 'blockquote' => array('script' => 1), 'details' => array('summary' => 1), 'fieldset' => array('legend' => 1, '#pcdata' => 1),  'figure' => array('figcaption' => 1), 'form' => array('script' => 1), 'map' => array('area' => 1), 'object' => array('param' => 1, 'embed' => 1), 'video' => array('source' => 1, 'track' => 1)); // Other
248 1731
    $cT = array('colgroup' => 1, 'dd' => 1, 'dt' => 1, 'li' => 1, 'option' => 1, 'p' => 1, 'td' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'tr' => 1); // Omitable closing
249
// block/inline type; a/ins/del both type; #pcdata: text
250 1731
    $eB = array('a' => 1, 'address' => 1, 'article' => 1, 'aside' => 1, 'blockquote' => 1, 'center' => 1, 'del' => 1, 'details' => 1, 'dir' => 1, 'dl' => 1, 'div' => 1, 'fieldset' => 1, 'figure' => 1, 'footer' => 1, 'form' => 1, 'ins' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'header' => 1, 'hr' => 1, 'isindex' => 1, 'main' => 1, 'menu' => 1, 'nav' => 1, 'noscript' => 1, 'ol' => 1, 'p' => 1, 'pre' => 1, 'section' => 1, 'style' => 1, 'table' => 1, 'ul' => 1);
251 1731
    $eI = array('#pcdata' => 1, 'a' => 1, 'abbr' => 1, 'acronym' => 1, 'applet' => 1, 'audio' => 1, 'b' => 1, 'bdi' => 1, 'bdo' => 1, 'big' => 1, 'br' => 1, 'button' => 1, 'canvas' => 1, 'cite' => 1, 'code' => 1, 'command' => 1, 'data' => 1, 'datalist' => 1, 'del' => 1, 'dfn' => 1, 'em' => 1, 'embed' => 1, 'figcaption' => 1, 'font' => 1, 'i' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'ins' => 1, 'kbd' => 1, 'label' => 1, 'link' => 1, 'map' => 1, 'mark' => 1, 'meta' => 1, 'meter' => 1, 'object' => 1, 'output' => 1, 'progress' => 1, 'q' => 1, 'ruby' => 1, 's' => 1, 'samp' => 1, 'select' => 1, 'script' => 1, 'small' => 1, 'span' => 1, 'strike' => 1, 'strong' => 1, 'sub' => 1, 'summary' => 1, 'sup' => 1, 'textarea' => 1, 'time' => 1, 'tt' => 1, 'u' => 1, 'var' => 1, 'video' => 1, 'wbr' => 1);
252 1731
    $eN = array('a' => 1, 'address' => 1, 'article' => 1, 'aside' => 1, 'big' => 1, 'button' => 1, 'details' => 1, 'embed' => 1, 'fieldset' => 1, 'font' => 1, 'footer' => 1, 'form' => 1, 'header' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'keygen' => 1, 'label' => 1, 'meter' => 1, 'nav' => 1, 'object' => 1, 'progress' => 1, 'ruby' => 1, 'script' => 1, 'select' => 1, 'small' => 1, 'sub' => 1, 'sup' => 1, 'textarea' => 1, 'time' => 1); // Exclude from specific ele; $cN values
253 1731
    $eO = array('area' => 1, 'caption' => 1, 'col' => 1, 'colgroup' => 1, 'command' => 1, 'dd' => 1, 'dt' => 1, 'hgroup' => 1, 'keygen' => 1, 'legend' => 1, 'li' => 1, 'optgroup' => 1, 'option' => 1, 'param' => 1, 'rb' => 1, 'rbc' => 1, 'rp' => 1, 'rt' => 1, 'rtc' => 1, 'script' => 1, 'source' => 1, 'tbody' => 1, 'td' => 1, 'tfoot' => 1, 'thead' => 1, 'th' => 1, 'tr' => 1, 'track' => 1); // Missing in $eB & $eI
254 1731
    $eF = $eB + $eI;
255
256
    // $in sets allowed child
257 1731
    $in = ((isset($eF[$in]) && $in != '#pcdata') or isset($eO[$in])) ? $in : 'div';
258 1731
    if (isset($cE[$in])) {
259
        return !$do ? '' : str_replace(array('<', '>'), array('&lt;', '&gt;'), $t);
260
    }
261 1731
    if (isset($cS[$in])) {
262
        $inOk = $cS[$in];
263 1731
    } elseif (isset($cI[$in])) {
264
        $inOk = $eI;
265
        $cI['del'] = 1;
266
        $cI['ins'] = 1;
267 1731
    } elseif (isset($cF[$in])) {
268 1731
        $inOk = $eF;
269 1731
        unset($cI['del'], $cI['ins']);
270
    } elseif (isset($cB[$in])) {
271
        $inOk = $eB;
272
        unset($cI['del'], $cI['ins']);
273
    }
274 1731
    if (isset($cO[$in])) {
275
        $inOk = $inOk + $cO[$in];
0 ignored issues
show
Bug introduced by
The variable $inOk does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
276
    }
277 1731
    if (isset($cN[$in])) {
278
        $inOk = array_diff_assoc($inOk, $cN[$in]);
279
    }
280
281 1731
    $t = explode('<', $t);
282 1731
    $ok = $q = array(); // $q seq list of open non-empty ele
283 1731
    ob_start();
284
285 1731
    for ($i = -1, $ci = count($t); ++$i < $ci;) {
286
        // allowed $ok in parent $p
287 1731 View Code Duplication
        if ($ql = count($q)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
288 298
            $p = array_pop($q);
289 298
            $q[] = $p;
290 298
            if (isset($cS[$p])) {
291 27
                $ok = $cS[$p];
292 279
            } elseif (isset($cI[$p])) {
293 18
                $ok = $eI;
294 18
                $cI['del'] = 1;
295 18
                $cI['ins'] = 1;
296 265
            } elseif (isset($cF[$p])) {
297 265
                $ok = $eF;
298 265
                unset($cI['del'], $cI['ins']);
299
            } elseif (isset($cB[$p])) {
300
                $ok = $eB;
301
                unset($cI['del'], $cI['ins']);
302
            }
303 298
            if (isset($cO[$p])) {
304 2
                $ok = $ok + $cO[$p];
305
            }
306 298
            if (isset($cN[$p])) {
307 298
                $ok = array_diff_assoc($ok, $cN[$p]);
308
            }
309
        } else {
310 1731
            $ok = $inOk;
311 1731
            unset($cI['del'], $cI['ins']);
312
        }
313
        // bad tags, & ele content
314 1731 View Code Duplication
        if (isset($e) && ($do == 1 or (isset($ok['#pcdata']) && ($do == 3 or $do == 5)))) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
315
            echo '&lt;', $s, $e, $a, '&gt;';
0 ignored issues
show
Bug introduced by
The variable $s does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
Bug introduced by
The variable $a does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
316
        }
317 1731 View Code Duplication
        if (isset($x[0])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
318 284
            if (strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))) {
319
                echo '<div>', $x, '</div>';
320 284
            } elseif ($do < 3 or isset($ok['#pcdata'])) {
321 284
                echo $x;
322
            } elseif (strpos($x, "\x02\x04")) {
323
                foreach (preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v) {
324
                    echo substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : '');
325
                }
326
            } elseif ($do > 4) {
327
                echo preg_replace('`\S`', '', $x);
328
            }
329
        }
330
        // get markup
331 1731
        if (!preg_match('`^(/?)([a-z1-6]+)([^>]*)>(.*)`sm', $t[$i], $r)) {
332 1731
            $x = $t[$i];
333 1731
            continue;
334
        }
335 946
        $s = null;
336 946
        $e = null;
337 946
        $a = null;
338 946
        $x = null;
339 946
        list($all, $s, $e, $a, $x) = $r;
0 ignored issues
show
Unused Code introduced by
The assignment to $all is unused. Consider omitting it like so list($first,,$third).

This checks looks for assignemnts to variables using the list(...) function, where not all assigned variables are subsequently used.

Consider the following code example.

<?php

function returnThreeValues() {
    return array('a', 'b', 'c');
}

list($a, $b, $c) = returnThreeValues();

print $a . " - " . $c;

Only the variables $a and $c are used. There was no need to assign $b.

Instead, the list call could have been.

list($a,, $c) = returnThreeValues();
Loading history...
340
        // close tag
341 946
        if ($s) {
342 298
            if (isset($cE[$e]) or !in_array($e, $q)) {
343 23
                continue;
344
            } // Empty/unopen
345 287
            if ($p == $e) {
0 ignored issues
show
Bug introduced by
The variable $p does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
346 286
                array_pop($q);
347 286
                echo '</', $e, '>';
348 286
                unset($e);
349 286
                continue;
350
            } // Last open
351 1
            $add = ''; // Nesting - close open tags that need to be
352 1
            for ($j = -1, $cj = count($q); ++$j < $cj;) {
353 1
                if (($d = array_pop($q)) == $e) {
354 1
                    break;
355
                } else {
356 1
                    $add .= "</{$d}>";
357
                }
358
            }
359 1
            echo $add, '</', $e, '>';
360 1
            unset($e);
361 1
            continue;
362
        }
363
        // open tag
364
        // $cB ele needs $eB ele as child
365 946
        if (isset($cB[$e]) && strlen(trim($x))) {
366
            $t[$i] = "{$e}{$a}>";
367
            array_splice($t, $i + 1, 0, 'div>'.$x);
368
            unset($e, $x);
369
            ++$ci;
370
            --$i;
371
            continue;
372
        }
373 946
        if ((($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql)) && !isset($eB[$e]) && !isset($ok[$e])) {
374
            array_splice($t, $i, 0, 'div>');
375
            unset($e, $x);
376
            ++$ci;
377
            --$i;
378
            continue;
379
        }
380
        // if no open ele, $in = parent; mostly immediate parent-child relation should hold
381 946
        if (!$ql or !isset($eN[$e]) or !array_intersect($q, $cN2)) {
382 946
            if (!isset($ok[$e])) {
383 20
                if ($ql && isset($cT[$p])) {
384
                    echo '</', array_pop($q), '>';
385
                    unset($e, $x);
386
                    --$i;
387
                }
388 20
                continue;
389
            }
390 937
            if ($e !== 'span' || !empty($a)) {
391 927
                if (!isset($cE[$e])) {
392 359
                    $q[] = $e;
393
                }
394 927
                echo '<', $e, $a, '>';
395
            }
396 937
            unset($e);
397 937
            continue;
398
        }
399
        // specific parent-child
400
        if (isset($cS[$p][$e])) {
401
            if (!isset($cE[$e])) {
402
                $q[] = $e;
403
            }
404
            echo '<', $e, $a, '>';
405
            unset($e);
406
            continue;
407
        }
408
        // nesting
409
        $add = '';
410
        $q2 = array();
411
        for ($k = -1, $kc = count($q); ++$k < $kc;) {
412
            $d = $q[$k];
413
            $ok2 = array();
0 ignored issues
show
Unused Code introduced by
$ok2 is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
414
            if (isset($cS[$d])) {
415
                $q2[] = $d;
416
                continue;
417
            }
418
            $ok2 = isset($cI[$d]) ? $eI : $eF;
419
            if (isset($cO[$d])) {
420
                $ok2 = $ok2 + $cO[$d];
421
            }
422
            if (isset($cN[$d])) {
423
                $ok2 = array_diff_assoc($ok2, $cN[$d]);
424
            }
425
            if (!isset($ok2[$e])) {
426
                if (!$k && !isset($inOk[$e])) {
427
                    continue 2;
428
                }
429
                $add = "</{$d}>";
430
                for (; ++$k < $kc;) {
431
                    $add = "</{$q[$k]}>{$add}";
432
                }
433
                break;
434
            } else {
435
                $q2[] = $d;
436
            }
437
        }
438
        $q = $q2;
439
        if (!isset($cE[$e])) {
440
            $q[] = $e;
441
        }
442
        echo $add, '<', $e, $a, '>';
443
        unset($e);
444
        continue;
445
    }
446
447
    // end
448 1731 View Code Duplication
    if ($ql = count($q)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
449 111
        $p = array_pop($q);
450 111
        $q[] = $p;
451 111
        if (isset($cS[$p])) {
452 28
            $ok = $cS[$p];
453 84
        } elseif (isset($cI[$p])) {
454 2
            $ok = $eI;
455 2
            $cI['del'] = 1;
456 2
            $cI['ins'] = 1;
457 82
        } elseif (isset($cF[$p])) {
458 82
            $ok = $eF;
459 82
            unset($cI['del'], $cI['ins']);
460
        } elseif (isset($cB[$p])) {
461
            $ok = $eB;
462
            unset($cI['del'], $cI['ins']);
463
        }
464 111
        if (isset($cO[$p])) {
465
            $ok = $ok + $cO[$p];
466
        }
467 111
        if (isset($cN[$p])) {
468 111
            $ok = array_diff_assoc($ok, $cN[$p]);
469
        }
470
    } else {
471 1657
        $ok = $inOk;
472 1657
        unset($cI['del'], $cI['ins']);
473
    }
474 1731 View Code Duplication
    if (isset($e) && ($do == 1 or (isset($ok['#pcdata']) && ($do == 3 or $do == 5)))) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
475
        echo '&lt;', $s, $e, $a, '&gt;';
476
    }
477 1731 View Code Duplication
    if (isset($x[0])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
478 499
        if (strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))) {
479
            echo '<div>', $x, '</div>';
480 499
        } elseif ($do < 3 or isset($ok['#pcdata'])) {
481 499
            echo $x;
482
        } elseif (strpos($x, "\x02\x04")) {
483
            foreach (preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v) {
484
                echo substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : '');
485
            }
486
        } elseif ($do > 4) {
487
            echo preg_replace('`\S`', '', $x);
488
        }
489
    }
490 1731
    while (!empty($q) && ($e = array_pop($q))) {
491 111
        echo '</', $e, '>';
492
    }
493 1731
    $o = ob_get_contents();
494 1731
    ob_end_clean();
495
496 1731
    return $o;
497
}
498
499
function hl_cmtcd($t) {
500
    // comment/CDATA sec handler
501 29
    $t = $t[0];
502 29
    global $C;
503 29
    if (!($v = $C[$n = $t[3] == '-' ? 'comment' : 'cdata'])) {
504
        return $t;
505
    }
506 29
    if ($v == 1) {
507 29
        return '';
508
    }
509
    if ($n == 'comment' && $v < 4) {
510
        if (substr(($t = preg_replace('`--+`', '-', substr($t, 4, -3))), -1) != ' ') {
511
            $t .= ' ';
512
        }
513
    } else {
514
        $t = substr($t, 1, -1);
515
    }
516
    $t = $v == 2 ? str_replace(array('&', '<', '>'), array('&amp;', '&lt;', '&gt;'), $t) : $t;
517
518
    return str_replace(array('&', '<', '>'), array("\x03", "\x04", "\x05"), ($n == 'comment' ? "\x01\x02\x04!--$t--\x05\x02\x01" : "\x01\x01\x04$t\x05\x01\x01"));
519
}
520
521
function hl_ent($t) {
522
    // entitity handler
523 249
    global $C;
524 249
    $t = $t[1];
525 249
    static $U = array('quot' => 1, 'amp' => 1, 'lt' => 1, 'gt' => 1);
526 249
    static $N = array('fnof' => '402', 'Alpha' => '913', 'Beta' => '914', 'Gamma' => '915', 'Delta' => '916', 'Epsilon' => '917', 'Zeta' => '918', 'Eta' => '919', 'Theta' => '920', 'Iota' => '921', 'Kappa' => '922', 'Lambda' => '923', 'Mu' => '924', 'Nu' => '925', 'Xi' => '926', 'Omicron' => '927', 'Pi' => '928', 'Rho' => '929', 'Sigma' => '931', 'Tau' => '932', 'Upsilon' => '933', 'Phi' => '934', 'Chi' => '935', 'Psi' => '936', 'Omega' => '937', 'alpha' => '945', 'beta' => '946', 'gamma' => '947', 'delta' => '948', 'epsilon' => '949', 'zeta' => '950', 'eta' => '951', 'theta' => '952', 'iota' => '953', 'kappa' => '954', 'lambda' => '955', 'mu' => '956', 'nu' => '957', 'xi' => '958', 'omicron' => '959', 'pi' => '960', 'rho' => '961', 'sigmaf' => '962', 'sigma' => '963', 'tau' => '964', 'upsilon' => '965', 'phi' => '966', 'chi' => '967', 'psi' => '968', 'omega' => '969', 'thetasym' => '977', 'upsih' => '978', 'piv' => '982', 'bull' => '8226', 'hellip' => '8230', 'prime' => '8242', 'Prime' => '8243', 'oline' => '8254', 'frasl' => '8260', 'weierp' => '8472', 'image' => '8465', 'real' => '8476', 'trade' => '8482', 'alefsym' => '8501', 'larr' => '8592', 'uarr' => '8593', 'rarr' => '8594', 'darr' => '8595', 'harr' => '8596', 'crarr' => '8629', 'lArr' => '8656', 'uArr' => '8657', 'rArr' => '8658', 'dArr' => '8659', 'hArr' => '8660', 'forall' => '8704', 'part' => '8706', 'exist' => '8707', 'empty' => '8709', 'nabla' => '8711', 'isin' => '8712', 'notin' => '8713', 'ni' => '8715', 'prod' => '8719', 'sum' => '8721', 'minus' => '8722', 'lowast' => '8727', 'radic' => '8730', 'prop' => '8733', 'infin' => '8734', 'ang' => '8736', 'and' => '8743', 'or' => '8744', 'cap' => '8745', 'cup' => '8746', 'int' => '8747', 'there4' => '8756', 'sim' => '8764', 'cong' => '8773', 'asymp' => '8776', 'ne' => '8800', 'equiv' => '8801', 'le' => '8804', 'ge' => '8805', 'sub' => '8834', 'sup' => '8835', 'nsub' => '8836', 'sube' => '8838', 'supe' => '8839', 'oplus' => '8853', 'otimes' => '8855', 'perp' => '8869', 'sdot' => '8901', 'lceil' => '8968', 'rceil' => '8969', 'lfloor' => '8970', 'rfloor' => '8971', 'lang' => '9001', 'rang' => '9002', 'loz' => '9674', 'spades' => '9824', 'clubs' => '9827', 'hearts' => '9829', 'diams' => '9830', 'apos' => '39',  'OElig' => '338', 'oelig' => '339', 'Scaron' => '352', 'scaron' => '353', 'Yuml' => '376', 'circ' => '710', 'tilde' => '732', 'ensp' => '8194', 'emsp' => '8195', 'thinsp' => '8201', 'zwnj' => '8204', 'zwj' => '8205', 'lrm' => '8206', 'rlm' => '8207', 'ndash' => '8211', 'mdash' => '8212', 'lsquo' => '8216', 'rsquo' => '8217', 'sbquo' => '8218', 'ldquo' => '8220', 'rdquo' => '8221', 'bdquo' => '8222', 'dagger' => '8224', 'Dagger' => '8225', 'permil' => '8240', 'lsaquo' => '8249', 'rsaquo' => '8250', 'euro' => '8364', 'nbsp' => '160', 'iexcl' => '161', 'cent' => '162', 'pound' => '163', 'curren' => '164', 'yen' => '165', 'brvbar' => '166', 'sect' => '167', 'uml' => '168', 'copy' => '169', 'ordf' => '170', 'laquo' => '171', 'not' => '172', 'shy' => '173', 'reg' => '174', 'macr' => '175', 'deg' => '176', 'plusmn' => '177', 'sup2' => '178', 'sup3' => '179', 'acute' => '180', 'micro' => '181', 'para' => '182', 'middot' => '183', 'cedil' => '184', 'sup1' => '185', 'ordm' => '186', 'raquo' => '187', 'frac14' => '188', 'frac12' => '189', 'frac34' => '190', 'iquest' => '191', 'Agrave' => '192', 'Aacute' => '193', 'Acirc' => '194', 'Atilde' => '195', 'Auml' => '196', 'Aring' => '197', 'AElig' => '198', 'Ccedil' => '199', 'Egrave' => '200', 'Eacute' => '201', 'Ecirc' => '202', 'Euml' => '203', 'Igrave' => '204', 'Iacute' => '205', 'Icirc' => '206', 'Iuml' => '207', 'ETH' => '208', 'Ntilde' => '209', 'Ograve' => '210', 'Oacute' => '211', 'Ocirc' => '212', 'Otilde' => '213', 'Ouml' => '214', 'times' => '215', 'Oslash' => '216', 'Ugrave' => '217', 'Uacute' => '218', 'Ucirc' => '219', 'Uuml' => '220', 'Yacute' => '221', 'THORN' => '222', 'szlig' => '223', 'agrave' => '224', 'aacute' => '225', 'acirc' => '226', 'atilde' => '227', 'auml' => '228', 'aring' => '229', 'aelig' => '230', 'ccedil' => '231', 'egrave' => '232', 'eacute' => '233', 'ecirc' => '234', 'euml' => '235', 'igrave' => '236', 'iacute' => '237', 'icirc' => '238', 'iuml' => '239', 'eth' => '240', 'ntilde' => '241', 'ograve' => '242', 'oacute' => '243', 'ocirc' => '244', 'otilde' => '245', 'ouml' => '246', 'divide' => '247', 'oslash' => '248', 'ugrave' => '249', 'uacute' => '250', 'ucirc' => '251', 'uuml' => '252', 'yacute' => '253', 'thorn' => '254', 'yuml' => '255');
527 249
    if ($t[0] != '#') {
528 147
        return ($C['and_mark'] ? "\x06" : '&').(isset($U[$t]) ? $t : (isset($N[$t]) ? (!$C['named_entity'] ? '#'.($C['hexdec_entity'] > 1 ? 'x'.dechex($N[$t]) : $N[$t]) : $t) : 'amp;'.$t)).';';
529
    }
530 114
    if (($n = ctype_digit($t = substr($t, 1)) ? intval($t) : hexdec(substr($t, 1))) < 9 or ($n > 13 && $n < 32) or $n == 11 or $n == 12 or ($n > 126 && $n < 160 && $n != 133) or ($n > 55295 && ($n < 57344 or ($n > 64975 && $n < 64992) or $n == 65534 or $n == 65535 or $n > 1114111))) {
531 37
        return ($C['and_mark'] ? "\x06" : '&')."amp;#{$t};";
532
    }
533
534 78
    return ($C['and_mark'] ? "\x06" : '&').'#'.(((ctype_digit($t) && $C['hexdec_entity'] < 2) or !$C['hexdec_entity']) ? $n : 'x'.dechex($n)).';';
535
}
536
537
function hl_prot($p, $c = null) {
538
    // check URL scheme
539 566
    global $C;
540 566
    $b = $a = '';
541 566
    if ($c == null) {
542 17
        $c = 'style';
543 17
        $b = $p[1];
544 17
        $a = $p[3];
545 17
        $p = trim($p[2]);
546
    }
547 566
    $c = isset($C['schemes'][$c]) ? $C['schemes'][$c] : $C['schemes']['*'];
548 566
    static $d = 'denied:';
549 566
    if (isset($c['!']) && substr($p, 0, 7) != $d) {
550 12
        $p = "$d$p";
551
    }
552 566
    if (isset($c['*']) or !strcspn($p, '#?;') or (substr($p, 0, 7) == $d)) {
553 127
        return "{$b}{$p}{$a}";
554
    } // All ok, frag, query, param
555 545
    if (preg_match('`^([^:?[@!$()*,=/\'\]]+?)(:|&#(58|x3a);|%3a|\\\\0{0,4}3a).`i', $p, $m) && !isset($c[strtolower($m[1])])) { // Denied prot
556 324
        return "{$b}{$d}{$p}{$a}";
557
    }
558 223
    if ($C['abs_url']) {
559
        if ($C['abs_url'] == -1 && strpos($p, $C['base_url']) === 0) { // Make url rel
560
            $p = substr($p, strlen($C['base_url']));
561
        } elseif (empty($m[1])) { // Make URL abs
562
            if (substr($p, 0, 2) == '//') {
563
                $p = substr($C['base_url'], 0, strpos($C['base_url'], ':') + 1).$p;
564
            } elseif ($p[0] == '/') {
565
                $p = preg_replace('`(^.+?://[^/]+)(.*)`', '$1', $C['base_url']).$p;
566
            } elseif (strcspn($p, './')) {
567
                $p = $C['base_url'].$p;
568
            } else {
569
                preg_match('`^([a-zA-Z\d\-+.]+://[^/]+)(.*)`', $C['base_url'], $m);
570
                $p = preg_replace('`(?<=/)\./`', '', $m[2].$p);
571
                while (preg_match('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', $p)) {
572
                    $p = preg_replace('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', '', $p);
573
                }
574
                $p = $m[1].$p;
575
            }
576
        }
577
    }
578
579 223
    return "{$b}{$p}{$a}";
580
}
581
582
function hl_regex($p) {
583
    // check regex
584 1154
    if (empty($p)) {
585
        return 0;
586
    }
587 1154
    if ($v = function_exists('error_clear_last') && function_exists('error_get_last')) {
0 ignored issues
show
Comprehensibility introduced by
Consider adding parentheses for clarity. Current Interpretation: $v = (function_exists('e...ists('error_get_last')), Probably Intended Meaning: ($v = function_exists('e...xists('error_get_last')
Loading history...
588 1154
        error_clear_last();
589 View Code Duplication
    } else {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
590
        if ($t = ini_get('track_errors')) {
591
            $o = isset($php_errormsg) ? $php_errormsg : null;
592
        } else {
593
            ini_set('track_errors', 1);
594
        }
595
        unset($php_errormsg);
596
    }
597 1154
    if (($d = ini_get('display_errors'))) {
598 1154
        ini_set('display_errors', 0);
599
    }
600 1154
    preg_match($p, '');
601 1154
    if ($v) {
602 1154
        $r = error_get_last() == null ? 1 : 0;
603 View Code Duplication
    } else {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
604
        $r = isset($php_errormsg) ? 0 : 1;
605
        if ($t) {
0 ignored issues
show
Bug introduced by
The variable $t does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
606
            $php_errormsg = isset($o) ? $o : null;
0 ignored issues
show
Unused Code introduced by
$php_errormsg is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
607
        } else {
608
            ini_set('track_errors', 0);
609
        }
610
    }
611 1154
    if ($d) {
612 1154
        ini_set('display_errors', 1);
613
    }
614
615 1154
    return $r;
616
}
617
618
function hl_spec($t) {
619
    // final $spec
620 559
    $s = array();
621 559
    if (!function_exists('hl_aux1')) {
622
        function hl_aux1($m) {
623
            return substr(str_replace(array(';', '|', '~', ' ', ',', '/', '(', ')', '`"'), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", '"'), $m[0]), 1, -1);
624
        }
625
    }
626 559
    $t = str_replace(array("\t", "\r", "\n", ' '), '', preg_replace_callback('/"(?>(`.|[^"])*)"/sm', 'hl_aux1', trim($t)));
627 559
    for ($i = count(($t = explode(';', $t))); --$i >= 0;) {
628 559
        $w = $t[$i];
629 559
        if (empty($w) or ($e = strpos($w, '=')) === false or !strlen(($a = substr($w, $e + 1)))) {
630 559
            continue;
631
        }
632
        $y = $n = array();
633
        foreach (explode(',', $a) as $v) {
634
            if (!preg_match('`^([a-z:\-\*]+)(?:\((.*?)\))?`i', $v, $m)) {
635
                continue;
636
            }
637
            if (($x = strtolower($m[1])) == '-*') {
638
                $n['*'] = 1;
639
                continue;
640
            }
641
            if ($x[0] == '-') {
642
                $n[substr($x, 1)] = 1;
643
                continue;
644
            }
645
            if (!isset($m[2])) {
646
                $y[$x] = 1;
647
                continue;
648
            }
649
            foreach (explode('/', $m[2]) as $m) {
650
                if (empty($m) or ($p = strpos($m, '=')) == 0 or $p < 5) {
651
                    $y[$x] = 1;
652
                    continue;
653
                }
654
                $y[$x][strtolower(substr($m, 0, $p))] = str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08"), array(';', '|', '~', ' ', ',', '/', '(', ')'), substr($m, $p + 1));
655
            }
656 View Code Duplication
            if (isset($y[$x]['match']) && !hl_regex($y[$x]['match'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
657
                unset($y[$x]['match']);
658
            }
659 View Code Duplication
            if (isset($y[$x]['nomatch']) && !hl_regex($y[$x]['nomatch'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
660
                unset($y[$x]['nomatch']);
661
            }
662
        }
663
        if (!count($y) && !count($n)) {
664
            continue;
665
        }
666
        foreach (explode(',', substr($w, 0, $e)) as $v) {
667
            if (!strlen(($v = strtolower($v)))) {
668
                continue;
669
            }
670
            if (count($y)) {
671
                if (!isset($s[$v])) {
672
                    $s[$v] = $y;
673
                } else {
674
                    $s[$v] = array_merge($s[$v], $y);
675
                }
676
            }
677
            if (count($n)) {
678
                if (!isset($s[$v]['n'])) {
679
                    $s[$v]['n'] = $n;
680
                } else {
681
                    $s[$v]['n'] = array_merge($s[$v]['n'], $n);
682
                }
683
            }
684
        }
685
    }
686
687 559
    return $s;
688
}
689
690
function hl_tag($t) {
691
    // tag/attribute handler
692 1637
    global $C;
693 1637
    $t = $t[0];
694
    // invalid < >
695 1637
    if ($t == '< ') {
696
        return '&lt; ';
697
    }
698 1637
    if ($t == '>') {
699 200
        return '&gt;';
700
    }
701 1637
    if (!preg_match('`^<(/?)([a-zA-Z][a-zA-Z1-6]*)([^>]*?)\s?>$`m', $t, $m)) {
702 91
        return str_replace(array('<', '>'), array('&lt;', '&gt;'), $t);
703 1583
    } elseif (!isset($C['elements'][($e = strtolower($m[2]))])) {
704 721
        return ($C['keep_bad'] % 2) ? str_replace(array('<', '>'), array('&lt;', '&gt;'), $t) : '';
705
    }
706
    // attr string
707 946
    $a = str_replace(array("\n", "\r", "\t"), ' ', trim($m[3]));
708
    // tag transform
709 946
    static $eD = array('acronym' => 1, 'applet' => 1, 'big' => 1, 'center' => 1, 'dir' => 1, 'font' => 1, 'isindex' => 1, 's' => 1, 'strike' => 1, 'tt' => 1); // Deprecated
710 946
    if ($C['make_tag_strict'] && isset($eD[$e])) {
711 1
        $trt = hl_tag2($e, $a, $C['make_tag_strict']);
712 1
        if (!$e) {
713
            return ($C['keep_bad'] % 2) ? str_replace(array('<', '>'), array('&lt;', '&gt;'), $t) : '';
714
        }
715
    }
716
    // close tag
717 946
    static $eE = array('area' => 1, 'br' => 1, 'col' => 1, 'command' => 1, 'embed' => 1, 'hr' => 1, 'img' => 1, 'input' => 1, 'isindex' => 1, 'keygen' => 1, 'link' => 1, 'meta' => 1, 'param' => 1, 'source' => 1, 'track' => 1, 'wbr' => 1); // Empty ele
718 946
    if (!empty($m[1])) {
719 311
        return !isset($eE[$e]) ? (empty($C['hook_tag']) ? "</$e>" : $C['hook_tag']($e)) : (($C['keep_bad']) % 2 ? str_replace(array('<', '>'), array('&lt;', '&gt;'), $t) : '');
720
    }
721
722
    // open tag & attr
723 946
    static $aN = array('abbr' => array('td' => 1, 'th' => 1), 'accept' => array('form' => 1, 'input' => 1), 'accept-charset' => array('form' => 1), 'action' => array('form' => 1), 'align' => array('applet' => 1, 'caption' => 1, 'col' => 1, 'colgroup' => 1, 'div' => 1, 'embed' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'hr' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'legend' => 1, 'object' => 1, 'p' => 1, 'table' => 1, 'tbody' => 1, 'td' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'tr' => 1), 'allowfullscreen' => array('iframe' => 1), 'alt' => array('applet' => 1, 'area' => 1, 'img' => 1, 'input' => 1), 'archive' => array('applet' => 1, 'object' => 1), 'async' => array('script' => 1), 'autocomplete' => array('form' => 1, 'input' => 1), 'autofocus' => array('button' => 1, 'input' => 1, 'keygen' => 1, 'select' => 1, 'textarea' => 1), 'autoplay' => array('audio' => 1, 'video' => 1), 'axis' => array('td' => 1, 'th' => 1), 'bgcolor' => array('embed' => 1, 'table' => 1, 'td' => 1, 'th' => 1, 'tr' => 1), 'border' => array('img' => 1, 'object' => 1, 'table' => 1), 'bordercolor' => array('table' => 1, 'td' => 1, 'tr' => 1), 'cellpadding' => array('table' => 1), 'cellspacing' => array('table' => 1), 'challenge' => array('keygen' => 1), 'char' => array('col' => 1, 'colgroup' => 1, 'tbody' => 1, 'td' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'tr' => 1), 'charoff' => array('col' => 1, 'colgroup' => 1, 'tbody' => 1, 'td' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'tr' => 1), 'charset' => array('a' => 1, 'script' => 1), 'checked' => array('command' => 1, 'input' => 1), 'cite' => array('blockquote' => 1, 'del' => 1, 'ins' => 1, 'q' => 1), 'classid' => array('object' => 1), 'clear' => array('br' => 1), 'code' => array('applet' => 1), 'codebase' => array('applet' => 1, 'object' => 1), 'codetype' => array('object' => 1), 'color' => array('font' => 1), 'cols' => array('textarea' => 1), 'colspan' => array('td' => 1, 'th' => 1), 'compact' => array('dir' => 1, 'dl' => 1, 'menu' => 1, 'ol' => 1, 'ul' => 1), 'content' => array('meta' => 1), 'controls' => array('audio' => 1, 'video' => 1), 'coords' => array('a' => 1, 'area' => 1), 'crossorigin' => array('img' => 1), 'data' => array('object' => 1), 'datetime' => array('del' => 1, 'ins' => 1, 'time' => 1), 'declare' => array('object' => 1), 'default' => array('track' => 1), 'defer' => array('script' => 1), 'dirname' => array('input' => 1, 'textarea' => 1), 'disabled' => array('button' => 1, 'command' => 1, 'fieldset' => 1, 'input' => 1, 'keygen' => 1, 'optgroup' => 1, 'option' => 1, 'select' => 1, 'textarea' => 1), 'download' => array('a' => 1), 'enctype' => array('form' => 1), 'face' => array('font' => 1), 'flashvars' => array('embed' => 1), 'for' => array('label' => 1, 'output' => 1), 'form' => array('button' => 1, 'fieldset' => 1, 'input' => 1, 'keygen' => 1, 'label' => 1, 'object' => 1, 'output' => 1, 'select' => 1, 'textarea' => 1), 'formaction' => array('button' => 1, 'input' => 1), 'formenctype' => array('button' => 1, 'input' => 1), 'formmethod' => array('button' => 1, 'input' => 1), 'formnovalidate' => array('button' => 1, 'input' => 1), 'formtarget' => array('button' => 1, 'input' => 1), 'frame' => array('table' => 1), 'frameborder' => array('iframe' => 1), 'headers' => array('td' => 1, 'th' => 1), 'height' => array('applet' => 1, 'canvas' => 1, 'embed' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'object' => 1, 'td' => 1, 'th' => 1, 'video' => 1), 'high' => array('meter' => 1), 'href' => array('a' => 1, 'area' => 1, 'link' => 1), 'hreflang' => array('a' => 1, 'area' => 1, 'link' => 1), 'hspace' => array('applet' => 1, 'embed' => 1, 'img' => 1, 'object' => 1), 'icon' => array('command' => 1), 'ismap' => array('img' => 1, 'input' => 1), 'keyparams' => array('keygen' => 1), 'keytype' => array('keygen' => 1), 'kind' => array('track' => 1), 'label' => array('command' => 1, 'menu' => 1, 'option' => 1, 'optgroup' => 1, 'track' => 1), 'language' => array('script' => 1), 'list' => array('input' => 1), 'longdesc' => array('img' => 1, 'iframe' => 1), 'loop' => array('audio' => 1, 'video' => 1), 'low' => array('meter' => 1), 'marginheight' => array('iframe' => 1), 'marginwidth' => array('iframe' => 1), 'max' => array('input' => 1, 'meter' => 1, 'progress' => 1), 'maxlength' => array('input' => 1, 'textarea' => 1), 'media' => array('a' => 1, 'area' => 1, 'link' => 1, 'source' => 1, 'style' => 1), 'mediagroup' => array('audio' => 1, 'video' => 1), 'method' => array('form' => 1), 'min' => array('input' => 1, 'meter' => 1), 'model' => array('embed' => 1), 'multiple' => array('input' => 1, 'select' => 1), 'muted' => array('audio' => 1, 'video' => 1), 'name' => array('a' => 1, 'applet' => 1, 'button' => 1, 'embed' => 1, 'fieldset' => 1, 'form' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'keygen' => 1, 'map' => 1, 'object' => 1, 'output' => 1, 'param' => 1, 'select' => 1, 'textarea' => 1), 'nohref' => array('area' => 1), 'noshade' => array('hr' => 1), 'novalidate' => array('form' => 1), 'nowrap' => array('td' => 1, 'th' => 1), 'object' => array('applet' => 1), 'open' => array('details' => 1), 'optimum' => array('meter' => 1), 'pattern' => array('input' => 1), 'ping' => array('a' => 1, 'area' => 1), 'placeholder' => array('input' => 1, 'textarea' => 1), 'pluginspage' => array('embed' => 1), 'pluginurl' => array('embed' => 1), 'poster' => array('video' => 1), 'pqg' => array('keygen' => 1), 'preload' => array('audio' => 1, 'video' => 1), 'prompt' => array('isindex' => 1), 'pubdate' => array('time' => 1), 'radiogroup' => array('command' => 1), 'readonly' => array('input' => 1, 'textarea' => 1), 'rel' => array('a' => 1, 'area' => 1, 'link' => 1), 'required' => array('input' => 1, 'select' => 1, 'textarea' => 1), 'rev' => array('a' => 1), 'reversed' => array('ol' => 1), 'rows' => array('textarea' => 1), 'rowspan' => array('td' => 1, 'th' => 1), 'rules' => array('table' => 1), 'sandbox' => array('iframe' => 1), 'scope' => array('td' => 1, 'th' => 1), 'scoped' => array('style' => 1), 'scrolling' => array('iframe' => 1), 'seamless' => array('iframe' => 1), 'selected' => array('option' => 1), 'shape' => array('a' => 1, 'area' => 1), 'size' => array('font' => 1, 'hr' => 1, 'input' => 1, 'select' => 1), 'sizes' => array('link' => 1), 'span' => array('col' => 1, 'colgroup' => 1), 'src' => array('audio' => 1, 'embed' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'script' => 1, 'source' => 1, 'track' => 1, 'video' => 1), 'srcdoc' => array('iframe' => 1), 'srclang' => array('track' => 1), 'srcset' => array('img' => 1), 'standby' => array('object' => 1), 'start' => array('ol' => 1), 'step' => array('input' => 1), 'summary' => array('table' => 1), 'target' => array('a' => 1, 'area' => 1, 'form' => 1), 'type' => array('a' => 1, 'area' => 1, 'button' => 1, 'command' => 1, 'embed' => 1, 'input' => 1, 'li' => 1, 'link' => 1, 'menu' => 1, 'object' => 1, 'ol' => 1, 'param' => 1, 'script' => 1, 'source' => 1, 'style' => 1, 'ul' => 1), 'typemustmatch' => array('object' => 1), 'usemap' => array('img' => 1, 'input' => 1, 'object' => 1), 'valign' => array('col' => 1, 'colgroup' => 1, 'tbody' => 1, 'td' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'tr' => 1), 'value' => array('button' => 1, 'data' => 1, 'input' => 1, 'li' => 1, 'meter' => 1, 'option' => 1, 'param' => 1, 'progress' => 1), 'valuetype' => array('param' => 1), 'vspace' => array('applet' => 1, 'embed' => 1, 'img' => 1, 'object' => 1), 'width' => array('applet' => 1, 'canvas' => 1, 'col' => 1, 'colgroup' => 1, 'embed' => 1, 'hr' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'object' => 1, 'pre' => 1, 'table' => 1, 'td' => 1, 'th' => 1, 'video' => 1), 'wmode' => array('embed' => 1), 'wrap' => array('textarea' => 1)); // Ele-specific
724 946
    static $aNA = array('aria-activedescendant' => 1, 'aria-atomic' => 1, 'aria-autocomplete' => 1, 'aria-busy' => 1, 'aria-checked' => 1, 'aria-controls' => 1, 'aria-describedby' => 1, 'aria-disabled' => 1, 'aria-dropeffect' => 1, 'aria-expanded' => 1, 'aria-flowto' => 1, 'aria-grabbed' => 1, 'aria-haspopup' => 1, 'aria-hidden' => 1, 'aria-invalid' => 1, 'aria-label' => 1, 'aria-labelledby' => 1, 'aria-level' => 1, 'aria-live' => 1, 'aria-multiline' => 1, 'aria-multiselectable' => 1, 'aria-orientation' => 1, 'aria-owns' => 1, 'aria-posinset' => 1, 'aria-pressed' => 1, 'aria-readonly' => 1, 'aria-relevant' => 1, 'aria-required' => 1, 'aria-selected' => 1, 'aria-setsize' => 1, 'aria-sort' => 1, 'aria-valuemax' => 1, 'aria-valuemin' => 1, 'aria-valuenow' => 1, 'aria-valuetext' => 1); // ARIA
725 946
    static $aNE = array('allowfullscreen' => 1, 'checkbox' => 1, 'checked' => 1, 'command' => 1, 'compact' => 1, 'declare' => 1, 'defer' => 1, 'default' => 1, 'disabled' => 1, 'hidden' => 1, 'inert' => 1, 'ismap' => 1, 'itemscope' => 1, 'multiple' => 1, 'nohref' => 1, 'noresize' => 1, 'noshade' => 1, 'nowrap' => 1, 'open' => 1, 'radio' => 1, 'readonly' => 1, 'required' => 1, 'reversed' => 1, 'selected' => 1); // Empty
726 946
    static $aNO = array('onabort' => 1, 'onblur' => 1, 'oncanplay' => 1, 'oncanplaythrough' => 1, 'onchange' => 1, 'onclick' => 1, 'oncontextmenu' => 1, 'oncopy' => 1, 'oncuechange' => 1, 'oncut' => 1, 'ondblclick' => 1, 'ondrag' => 1, 'ondragend' => 1, 'ondragenter' => 1, 'ondragleave' => 1, 'ondragover' => 1, 'ondragstart' => 1, 'ondrop' => 1, 'ondurationchange' => 1, 'onemptied' => 1, 'onended' => 1, 'onerror' => 1, 'onfocus' => 1, 'onformchange' => 1, 'onforminput' => 1, 'oninput' => 1, 'oninvalid' => 1, 'onkeydown' => 1, 'onkeypress' => 1, 'onkeyup' => 1, 'onload' => 1, 'onloadeddata' => 1, 'onloadedmetadata' => 1, 'onloadstart' => 1, 'onlostpointercapture' => 1, 'onmousedown' => 1, 'onmousemove' => 1, 'onmouseout' => 1, 'onmouseover' => 1, 'onmouseup' => 1, 'onmousewheel' => 1, 'onpaste' => 1, 'onpause' => 1, 'onplay' => 1, 'onplaying' => 1, 'onpointercancel' => 1, 'ongotpointercapture' => 1, 'onpointerdown' => 1, 'onpointerenter' => 1, 'onpointerleave' => 1, 'onpointermove' => 1, 'onpointerout' => 1, 'onpointerover' => 1, 'onpointerup' => 1, 'onprogress' => 1, 'onratechange' => 1, 'onreadystatechange' => 1, 'onreset' => 1, 'onsearch' => 1, 'onscroll' => 1, 'onseeked' => 1, 'onseeking' => 1, 'onselect' => 1, 'onshow' => 1, 'onstalled' => 1, 'onsubmit' => 1, 'onsuspend' => 1, 'ontimeupdate' => 1, 'ontoggle' => 1, 'ontouchcancel' => 1, 'ontouchend' => 1, 'ontouchmove' => 1, 'ontouchstart' => 1, 'onvolumechange' => 1, 'onwaiting' => 1, 'onwheel' => 1); // Event
727 946
    static $aNP = array('action' => 1, 'cite' => 1, 'classid' => 1, 'codebase' => 1, 'data' => 1, 'href' => 1, 'itemtype' => 1, 'longdesc' => 1, 'model' => 1, 'pluginspage' => 1, 'pluginurl' => 1, 'src' => 1, 'srcset' => 1, 'usemap' => 1); // Need scheme check; excludes style, on*
728 946
    static $aNU = array('accesskey' => 1, 'class' => 1, 'contenteditable' => 1, 'contextmenu' => 1, 'dir' => 1, 'draggable' => 1, 'dropzone' => 1, 'hidden' => 1, 'id' => 1, 'inert' => 1, 'itemid' => 1, 'itemprop' => 1, 'itemref' => 1, 'itemscope' => 1, 'itemtype' => 1, 'lang' => 1, 'role' => 1, 'spellcheck' => 1, 'style' => 1, 'tabindex' => 1, 'title' => 1, 'translate' => 1, 'xmlns' => 1, 'xml:base' => 1, 'xml:lang' => 1, 'xml:space' => 1); // Univ; excludes on*, aria*
729
730 946
    if ($C['lc_std_val']) {
731
        // predef attr vals for $eAL & $aNE ele
732 946
        static $aNL = array('all' => 1, 'auto' => 1, 'baseline' => 1, 'bottom' => 1, 'button' => 1, 'captions' => 1, 'center' => 1, 'chapters' => 1, 'char' => 1, 'checkbox' => 1, 'circle' => 1, 'col' => 1, 'colgroup' => 1, 'color' => 1, 'cols' => 1, 'data' => 1, 'date' => 1, 'datetime' => 1, 'datetime-local' => 1, 'default' => 1, 'descriptions' => 1, 'email' => 1, 'file' => 1, 'get' => 1, 'groups' => 1, 'hidden' => 1, 'image' => 1, 'justify' => 1, 'left' => 1, 'ltr' => 1, 'metadata' => 1, 'middle' => 1, 'month' => 1, 'none' => 1, 'number' => 1, 'object' => 1, 'password' => 1, 'poly' => 1, 'post' => 1, 'preserve' => 1, 'radio' => 1, 'range' => 1, 'rect' => 1, 'ref' => 1, 'reset' => 1, 'right' => 1, 'row' => 1, 'rowgroup' => 1, 'rows' => 1, 'rtl' => 1, 'search' => 1, 'submit' => 1, 'subtitles' => 1, 'tel' => 1, 'text' => 1, 'time' => 1, 'top' => 1, 'url' => 1, 'week' => 1);
733 946
        static $eAL = array('a' => 1, 'area' => 1, 'bdo' => 1, 'button' => 1, 'col' => 1, 'fieldset' => 1, 'form' => 1, 'img' => 1, 'input' => 1, 'object' => 1, 'ol' => 1, 'optgroup' => 1, 'option' => 1, 'param' => 1, 'script' => 1, 'select' => 1, 'table' => 1, 'td' => 1, 'textarea' => 1, 'tfoot' => 1, 'th' => 1, 'thead' => 1, 'tr' => 1, 'track' => 1, 'xml:space' => 1);
734 946
        $lcase = isset($eAL[$e]) ? 1 : 0;
735
    }
736
737 946
    $depTr = 0;
738 946
    if ($C['no_deprecated_attr']) {
739
        // depr attr:applicable ele
740 946
        static $aND = array('align' => array('caption' => 1, 'div' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'hr' => 1, 'img' => 1, 'input' => 1, 'legend' => 1, 'object' => 1, 'p' => 1, 'table' => 1), 'bgcolor' => array('table' => 1, 'td' => 1, 'th' => 1, 'tr' => 1), 'border' => array('object' => 1), 'bordercolor' => array('table' => 1, 'td' => 1, 'tr' => 1), 'cellspacing' => array('table' => 1), 'clear' => array('br' => 1), 'compact' => array('dl' => 1, 'ol' => 1, 'ul' => 1), 'height' => array('td' => 1, 'th' => 1), 'hspace' => array('img' => 1, 'object' => 1), 'language' => array('script' => 1), 'name' => array('a' => 1, 'form' => 1, 'iframe' => 1, 'img' => 1, 'map' => 1), 'noshade' => array('hr' => 1), 'nowrap' => array('td' => 1, 'th' => 1), 'size' => array('hr' => 1), 'vspace' => array('img' => 1, 'object' => 1), 'width' => array('hr' => 1, 'pre' => 1, 'table' => 1, 'td' => 1, 'th' => 1));
741 946
        static $eAD = array('a' => 1, 'br' => 1, 'caption' => 1, 'div' => 1, 'dl' => 1, 'form' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'hr' => 1, 'iframe' => 1, 'img' => 1, 'input' => 1, 'legend' => 1, 'map' => 1, 'object' => 1, 'ol' => 1, 'p' => 1, 'pre' => 1, 'script' => 1, 'table' => 1, 'td' => 1, 'th' => 1, 'tr' => 1, 'ul' => 1);
742 946
        $depTr = isset($eAD[$e]) ? 1 : 0;
743
    }
744
745
    // attr name-vals
746 946
    if (strpos($a, "\x01") !== false) {
747
        $a = preg_replace('`\x01[^\x01]*\x01`', '', $a);
748
    } // No comment/CDATA sec
749 946
    $mode = 0;
750 946
    $a = trim($a, ' /');
751 946
    $aA = array();
752 946
    while (strlen($a)) {
753 909
        $w = 0;
754
        switch ($mode) {
755 909
            case 0: // Name
756 909
                if (preg_match('`^[a-zA-Z][^\s=/]+`', $a, $m)) {
757 891
                    $nm = strtolower($m[0]);
758 891
                    $w = $mode = 1;
759 891
                    $a = ltrim(substr_replace($a, '', 0, strlen($m[0])));
760
                }
761 909
                break;
762 891
            case 1:
763 891
                if ($a[0] == '=') { // =
764 891
                    $w = 1;
765 891
                    $mode = 2;
766 891
                    $a = ltrim($a, '= ');
767
                } else { // No val
768
                    $w = 1;
769
                    $mode = 0;
770
                    $a = ltrim($a);
771
                    $aA[$nm] = '';
0 ignored issues
show
Bug introduced by
The variable $nm does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
772
                }
773 891
                break;
774 891
            case 2: // Val
775 891
                if (preg_match('`^((?:"[^"]*")|(?:\'[^\']*\')|(?:\s*[^\s"\']+))(.*)`', $a, $m)) {
776 891
                    $a = ltrim($m[2]);
777 891
                    $m = $m[1];
778 891
                    $w = 1;
779 891
                    $mode = 0;
780 891
                    $aA[$nm] = trim(str_replace('<', '&lt;', ($m[0] == '"' or $m[0] == '\'') ? substr($m, 1, -1) : $m));
781
                }
782 891
                break;
783
        }
784 909
        if ($w == 0) { // Parse errs, deal with space, " & '
785 173
            $a = preg_replace('`^(?:"[^"]*("|$)|\'[^\']*(\'|$)|\S)*\s*`', '', $a);
786 173
            $mode = 0;
787
        }
788
    }
789 946
    if ($mode == 1) {
790 1
        $aA[$nm] = '';
791
    }
792
793
    // clean attrs
794 946
    global $S;
795 946
    $rl = isset($S[$e]) ? $S[$e] : array();
796 946
    $a = array();
797 946
    $nfr = 0;
798 946
    $d = $C['deny_attribute'];
799 946
    foreach ($aA as $k => $v) {
800 891
        if (((isset($d['*']) ? isset($d[$k]) : !isset($d[$k])) && (isset($aN[$k][$e]) or isset($aNU[$k]) or (isset($aNO[$k]) && !isset($d['on*'])) or (isset($aNA[$k]) && !isset($d['aria*'])) or (!isset($d['data*']) && preg_match('`data-((?!xml)[^:]+$)`', $k))) && !isset($rl['n'][$k]) && !isset($rl['n']['*'])) or isset($rl[$k])) {
801 699
            if (isset($aNE[$k])) {
802 3
                $v = $k;
803 699
            } elseif (!empty($lcase) && (($e != 'button' or $e != 'input') or $k == 'type')) { // Rather loose but ?not cause issues
804 574
                $v = (isset($aNL[($v2 = strtolower($v))])) ? $v2 : $v;
805
            }
806 699
            if ($k == 'style' && !$C['style_pass']) {
807 40
                if (false !== strpos($v, '&#')) {
808 3
                    static $sC = array('&#x20;' => ' ', '&#32;' => ' ', '&#x45;' => 'e', '&#69;' => 'e', '&#x65;' => 'e', '&#101;' => 'e', '&#x58;' => 'x', '&#88;' => 'x', '&#x78;' => 'x', '&#120;' => 'x', '&#x50;' => 'p', '&#80;' => 'p', '&#x70;' => 'p', '&#112;' => 'p', '&#x53;' => 's', '&#83;' => 's', '&#x73;' => 's', '&#115;' => 's', '&#x49;' => 'i', '&#73;' => 'i', '&#x69;' => 'i', '&#105;' => 'i', '&#x4f;' => 'o', '&#79;' => 'o', '&#x6f;' => 'o', '&#111;' => 'o', '&#x4e;' => 'n', '&#78;' => 'n', '&#x6e;' => 'n', '&#110;' => 'n', '&#x55;' => 'u', '&#85;' => 'u', '&#x75;' => 'u', '&#117;' => 'u', '&#x52;' => 'r', '&#82;' => 'r', '&#x72;' => 'r', '&#114;' => 'r', '&#x4c;' => 'l', '&#76;' => 'l', '&#x6c;' => 'l', '&#108;' => 'l', '&#x28;' => '(', '&#40;' => '(', '&#x29;' => ')', '&#41;' => ')', '&#x20;' => ':', '&#32;' => ':', '&#x22;' => '"', '&#34;' => '"', '&#x27;' => "'", '&#39;' => "'", '&#x2f;' => '/', '&#47;' => '/', '&#x2a;' => '*', '&#42;' => '*', '&#x5c;' => '\\', '&#92;' => '\\');
809 3
                    $v = strtr($v, $sC);
810
                }
811 40
                $v = preg_replace_callback('`(url(?:\()(?: )*(?:\'|"|&(?:quot|apos);)?)(.+?)((?:\'|"|&(?:quot|apos);)?(?: )*(?:\)))`iS', 'hl_prot', $v);
812 40
                $v = !$C['css_expression'] ? preg_replace('`expression`i', ' ', preg_replace('`\\\\\S|(/|(%2f))(\*|(%2a))`i', ' ', $v)) : $v;
813 664
            } elseif (isset($aNP[$k]) or isset($aNO[$k])) {
814 550
                $v = str_replace('­', ' ', (strpos($v, '&') !== false ? str_replace(array('&#xad;', '&#173;', '&shy;'), ' ', $v) : $v)); // double-quoted char: soft-hyphen; appears here as "­" or hyphen or something else depending on viewing software
815 550
                if ($k == 'srcset') {
816
                    $v2 = '';
817
                    foreach (explode(',', $v) as $k1 => $v1) {
818
                        $v1 = explode(' ', ltrim($v1), 2);
819
                        $k1 = isset($v1[1]) ? trim($v1[1]) : '';
820
                        $v1 = trim($v1[0]);
821
                        if (isset($v1[0])) {
822
                            $v2 .= hl_prot($v1, $k).(empty($k1) ? '' : ' '.$k1).', ';
823
                        }
824
                    }
825
                    $v = trim($v2, ', ');
826
                }
827 550
                if ($k == 'itemtype') {
828
                    $v2 = '';
829
                    foreach (explode(' ', $v) as $v1) {
830
                        if (isset($v1[0])) {
831
                            $v2 .= hl_prot($v1, $k).' ';
832
                        }
833
                    }
834
                    $v = trim($v2, ' ');
835
                } else {
836 550
                    $v = hl_prot($v, $k);
837
                }
838 550
                if ($k == 'href') { // X-spam
839 161
                    if ($C['anti_mail_spam'] && strpos($v, 'mailto:') === 0) {
840
                        $v = str_replace('@', htmlspecialchars($C['anti_mail_spam']), $v);
841 161
                    } elseif ($C['anti_link_spam']) {
842 101
                        $r1 = $C['anti_link_spam'][1];
843 101
                        if (!empty($r1) && preg_match($r1, $v)) {
844
                            continue;
845
                        }
846 101
                        $r0 = $C['anti_link_spam'][0];
847 101
                        if (!empty($r0) && preg_match($r0, $v)) {
848 101
                            if (isset($a['rel'])) {
849 42
                                if (!preg_match('`\bnofollow\b`i', $a['rel'])) {
850 42
                                    $a['rel'] .= ' nofollow';
851
                                }
852 89
                            } elseif (isset($aA['rel'])) {
853 1
                                if (!preg_match('`\bnofollow\b`i', $aA['rel'])) {
854 1
                                    $nfr = 1;
855
                                }
856
                            } else {
857 88
                                $a['rel'] = 'nofollow';
858
                            }
859
                        }
860
                    }
861
                }
862
            }
863 699
            if (isset($rl[$k]) && is_array($rl[$k]) && ($v = hl_attrval($k, $v, $rl[$k])) === 0) {
864
                continue;
865
            }
866 699
            $a[$k] = str_replace('"', '&quot;', $v);
867
        }
868
    }
869 946
    if ($nfr) {
870
        $a['rel'] = isset($a['rel']) ? $a['rel'].' nofollow' : 'nofollow';
871
    }
872
873
    // rqd attr
874 946
    static $eAR = array('area' => array('alt' => 'area'), 'bdo' => array('dir' => 'ltr'), 'command' => array('label' => ''), 'form' => array('action' => ''), 'img' => array('src' => '', 'alt' => 'image'), 'map' => array('name' => ''), 'optgroup' => array('label' => ''), 'param' => array('name' => ''), 'style' => array('scoped' => ''), 'textarea' => array('rows' => '10', 'cols' => '50'));
875 946
    if (isset($eAR[$e])) {
876 497
        foreach ($eAR[$e] as $k => $v) {
877 497
            if (!isset($a[$k])) {
878 488
                $a[$k] = isset($v[0]) ? $v : $k;
879
            }
880
        }
881
    }
882
883
    // depr attr
884 946
    if ($depTr) {
885 790
        $c = array();
886 790
        foreach ($a as $k => $v) {
887 650
            if ($k == 'style' or !isset($aND[$k][$e])) {
888 649
                continue;
889
            }
890 4
            $v = str_replace(array('\\', ':', ';', '&#'), '', $v);
891 4
            if ($k == 'align') {
892 1
                unset($a['align']);
893 1
                if ($e == 'img' && ($v == 'left' or $v == 'right')) {
894
                    $c[] = 'float: '.$v;
895 1
                } elseif (($e == 'div' or $e == 'table') && $v == 'center') {
896
                    $c[] = 'margin: auto';
897
                } else {
898 1
                    $c[] = 'text-align: '.$v;
899
                }
900 3
            } elseif ($k == 'bgcolor') {
901
                unset($a['bgcolor']);
902
                $c[] = 'background-color: '.$v;
903 3
            } elseif ($k == 'border') {
904
                unset($a['border']);
905
                $c[] = "border: {$v}px";
906 3
            } elseif ($k == 'bordercolor') {
907
                unset($a['bordercolor']);
908
                $c[] = 'border-color: '.$v;
909 3
            } elseif ($k == 'cellspacing') {
910
                unset($a['cellspacing']);
911
                $c[] = "border-spacing: {$v}px";
912 3 View Code Duplication
            } elseif ($k == 'clear') {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
913
                unset($a['clear']);
914
                $c[] = 'clear: '.($v != 'all' ? $v : 'both');
915 3
            } elseif ($k == 'compact') {
916
                unset($a['compact']);
917
                $c[] = 'font-size: 85%';
918 3
            } elseif ($k == 'height' or $k == 'width') {
919
                unset($a[$k]);
920
                $c[] = $k.': '.($v[0] != '*' ? $v.(ctype_digit($v) ? 'px' : '') : 'auto');
921 3
            } elseif ($k == 'hspace') {
922
                unset($a['hspace']);
923
                $c[] = "margin-left: {$v}px; margin-right: {$v}px";
924 3
            } elseif ($k == 'language' && !isset($a['type'])) {
925
                unset($a['language']);
926
                $a['type'] = 'text/'.strtolower($v);
927 3
            } elseif ($k == 'name') {
928 3
                if ($C['no_deprecated_attr'] == 2 or ($e != 'a' && $e != 'map')) {
929
                    unset($a['name']);
930
                }
931 3
                if (!isset($a['id']) && !preg_match('`\W`', $v)) {
932 3
                    $a['id'] = $v;
933
                }
934
            } elseif ($k == 'noshade') {
935
                unset($a['noshade']);
936
                $c[] = 'border-style: none; border: 0; background-color: gray; color: gray';
937
            } elseif ($k == 'nowrap') {
938
                unset($a['nowrap']);
939
                $c[] = 'white-space: nowrap';
940 View Code Duplication
            } elseif ($k == 'size') {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
941
                unset($a['size']);
942
                $c[] = 'size: '.$v.'px';
943
            } elseif ($k == 'vspace') {
944
                unset($a['vspace']);
945
                $c[] = "margin-top: {$v}px; margin-bottom: {$v}px";
946
            }
947
        }
948 790
        if (count($c)) {
949 1
            $c = implode('; ', $c);
950 1
            $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;').'; '.$c.';' : $c.';';
951
        }
952
    }
953
    // unique ID
954 946
    if ($C['unique_ids'] && isset($a['id'])) {
955
        if (preg_match('`\s`', ($id = $a['id'])) or (isset($GLOBALS['hl_Ids'][$id]) && $C['unique_ids'] == 1)) {
956
            unset($a['id']);
957
        } else {
958
            while (isset($GLOBALS['hl_Ids'][$id])) {
959
                $id = $C['unique_ids'].$id;
960
            }
961
            $GLOBALS['hl_Ids'][($a['id'] = $id)] = 1;
962
        }
963
    }
964
    // xml:lang
965 946
    if ($C['xml:lang'] && isset($a['lang'])) {
966
        $a['xml:lang'] = isset($a['xml:lang']) ? $a['xml:lang'] : $a['lang'];
967
        if ($C['xml:lang'] == 2) {
968
            unset($a['lang']);
969
        }
970
    }
971
    // for transformed tag
972 946
    if (!empty($trt)) {
973 1
        $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;').'; '.$trt : $trt;
974
    }
975
    // return with empty ele /
976 946
    if (empty($C['hook_tag'])) {
977 946
        $aA = '';
978 946
        foreach ($a as $k => $v) {
979 772
            $aA .= " {$k}=\"{$v}\"";
980
        }
981
982 946
        return "<{$e}{$aA}".(isset($eE[$e]) ? ' /' : '').'>';
983
    } else {
984
        return $C['hook_tag']($e, $a);
985
    }
986
}
987
988
function hl_tag2(&$e, &$a, $t = 1) {
989
    // transform tag
990 1
    if ($e == 'big') {
991
        $e = 'span';
992
993
        return 'font-size: larger;';
994
    }
995 1
    if ($e == 's' or $e == 'strike') {
996
        $e = 'span';
997
998
        return 'text-decoration: line-through;';
999
    }
1000 1
    if ($e == 'tt') {
1001
        $e = 'code';
1002
1003
        return '';
1004
    }
1005 1
    if ($e == 'center') {
1006
        $e = 'div';
1007
1008
        return 'text-align: center;';
1009
    }
1010 1
    static $fs = array('0' => 'xx-small', '1' => 'xx-small', '2' => 'small', '3' => 'medium', '4' => 'large', '5' => 'x-large', '6' => 'xx-large', '7' => '300%', '-1' => 'smaller', '-2' => '60%', '+1' => 'larger', '+2' => '150%', '+3' => '200%', '+4' => '300%');
1011 1
    if ($e == 'font') {
1012 1
        $a2 = '';
1013 1
        while (preg_match('`(^|\s)(color|size)\s*=\s*(\'|")?(.+?)(\\3|\s|$)`i', $a, $m)) {
1014 1
            $a = str_replace($m[0], ' ', $a);
1015 1
            $a2 .= strtolower($m[2]) == 'color' ? (' color: '.str_replace('"', '\'', trim($m[4])).';') : (isset($fs[($m = trim($m[4]))]) ? ($a2 .= ' font-size: '.str_replace('"', '\'', $fs[$m]).';') : '');
1016
        }
1017 1
        while (preg_match('`(^|\s)face\s*=\s*(\'|")?([^=]+?)\\2`i', $a, $m) or preg_match('`(^|\s)face\s*=(\s*)(\S+)`i', $a, $m)) {
1018
            $a = str_replace($m[0], ' ', $a);
1019
            $a2 .= ' font-family: '.str_replace('"', '\'', trim($m[3])).';';
1020
        }
1021 1
        $e = 'span';
1022
1023 1
        return ltrim(str_replace('<', '', $a2));
1024
    }
1025
    if ($e == 'acronym') {
1026
        $e = 'abbr';
1027
1028
        return '';
1029
    }
1030
    if ($e == 'dir') {
1031
        $e = 'ul';
1032
1033
        return '';
1034
    }
1035
    if ($t == 2) {
1036
        $e = 0;
1037
1038
        return 0;
1039
    }
1040
1041
    return '';
1042
}
1043
1044
function hl_tidy($t, $w, $p) {
1045
    // tidy/compact HTM
1046
    if (strpos(' pre,script,textarea', "$p,")) {
1047
        return $t;
1048
    }
1049
    if (!function_exists('hl_aux2')) {
1050
        function hl_aux2($m) {
1051
            return $m[1].str_replace(array('<', '>', "\n", "\r", "\t", ' '), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), $m[3]).$m[4];
1052
        }
1053
    }
1054
    $t = preg_replace(array('`(<\w[^>]*(?<!/)>)\s+`', '`\s+`', '`(<\w[^>]*(?<!/)>) `'), array(' $1', ' ', '$1'), preg_replace_callback(array('`(<(!\[CDATA\[))(.+?)(\]\]>)`sm', '`(<(!--))(.+?)(-->)`sm', '`(<(pre|script|textarea)[^>]*?>)(.+?)(</\2>)`sm'), 'hl_aux2', $t));
1055
    if (($w = strtolower($w)) == -1) {
1056
        return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t);
1057
    }
1058
    $s = strpos(" $w", 't') ? "\t" : ' ';
1059
    $s = preg_match('`\d`', $w, $m) ? str_repeat($s, $m[0]) : str_repeat($s, ($s == "\t" ? 1 : 2));
1060
    $N = preg_match('`[ts]([1-9])`', $w, $m) ? $m[1] : 0;
1061
    $a = array('br' => 1);
1062
    $b = array('button' => 1, 'command' => 1, 'input' => 1, 'option' => 1, 'param' => 1, 'track' => 1);
1063
    $c = array('audio' => 1, 'canvas' => 1, 'caption' => 1, 'dd' => 1, 'dt' => 1, 'figcaption' => 1, 'h1' => 1, 'h2' => 1, 'h3' => 1, 'h4' => 1, 'h5' => 1, 'h6' => 1, 'isindex' => 1, 'label' => 1, 'legend' => 1, 'li' => 1, 'object' => 1, 'p' => 1, 'pre' => 1, 'style' => 1, 'summary' => 1, 'td' => 1, 'textarea' => 1, 'th' => 1, 'video' => 1);
1064
    $d = array('address' => 1, 'article' => 1, 'aside' => 1, 'blockquote' => 1, 'center' => 1, 'colgroup' => 1, 'datalist' => 1, 'details' => 1, 'dir' => 1, 'div' => 1, 'dl' => 1, 'fieldset' => 1, 'figure' => 1, 'footer' => 1, 'form' => 1, 'header' => 1, 'hgroup' => 1, 'hr' => 1, 'iframe' => 1, 'main' => 1, 'map' => 1, 'menu' => 1, 'nav' => 1, 'noscript' => 1, 'ol' => 1, 'optgroup' => 1, 'rbc' => 1, 'rtc' => 1, 'ruby' => 1, 'script' => 1, 'section' => 1, 'select' => 1, 'table' => 1, 'tbody' => 1, 'tfoot' => 1, 'thead' => 1, 'tr' => 1, 'ul' => 1);
1065
    $T = explode('<', $t);
1066
    $X = 1;
1067
    while ($X) {
1068
        $n = $N;
1069
        $t = $T;
1070
        ob_start();
1071
        if (isset($d[$p])) {
1072
            echo str_repeat($s, ++$n);
1073
        }
1074
        echo ltrim(array_shift($t));
1075
        for ($i = -1, $j = count($t); ++$i < $j;) {
1076
            $r = '';
1077
            list($e, $r) = explode('>', $t[$i]);
1078
            $x = $e[0] == '/' ? 0 : (substr($e, -1) == '/' ? 1 : ($e[0] != '!' ? 2 : -1));
1079
            $y = !$x ? ltrim($e, '/') : ($x > 0 ? substr($e, 0, strcspn($e, ' ')) : 0);
1080
            $e = "<$e>";
1081
            if (isset($d[$y])) {
1082
                if (!$x) {
1083
                    if ($n) {
1084
                        echo "\n", str_repeat($s, --$n), "$e\n", str_repeat($s, $n);
1085
                    } else {
1086
                        ++$N;
1087
                        ob_end_clean();
1088
                        continue 2;
1089
                    }
1090
                } else {
1091
                    echo "\n", str_repeat($s, $n), "$e\n", str_repeat($s, ($x != 1 ? ++$n : $n));
1092
                }
1093
                echo $r;
1094
                continue;
1095
            }
1096
            $f = "\n".str_repeat($s, $n);
1097
            if (isset($c[$y])) {
1098
                if (!$x) {
1099
                    echo $e, $f, $r;
1100
                } else {
1101
                    echo $f, $e, $r;
1102
                }
1103
            } elseif (isset($b[$y])) {
1104
                echo $f, $e, $r;
1105
            } elseif (isset($a[$y])) {
1106
                echo $e, $f, $r;
1107
            } elseif (!$y) {
1108
                echo $f, $e, $f, $r;
1109
            } else {
1110
                echo $e, $r;
1111
            }
1112
        }
1113
        $X = 0;
1114
    }
1115
    $t = str_replace(array("\n ", " \n"), "\n", preg_replace('`[\n]\s*?[\n]+`', "\n", ob_get_contents()));
1116
    ob_end_clean();
1117
    if (($l = strpos(" $w", 'r') ? (strpos(" $w", 'n') ? "\r\n" : "\r") : 0)) {
1118
        $t = str_replace("\n", $l, $t);
1119
    }
1120
1121
    return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t);
1122
}
1123
1124
function hl_version() {
1125
    // version
1126
    return '1.2.4.2';
1127
}
1128