Completed
Pull Request — master (#24)
by Ryan
03:52 queued 02:50
created

htmLawed.php ➔ hl_bal()   F

Complexity

Conditions 100
Paths > 20000

Size

Total Lines 262

Duplication

Lines 84
Ratio 32.06 %

Code Coverage

Tests 124
CRAP Score 544.3709

Importance

Changes 0
Metric Value
cc 100
nc 429496.7295
nop 3
dl 84
loc 262
ccs 124
cts 192
cp 0.6458
crap 544.3709
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; case 'minlen':
170
                    if ($l < $v) {
171
                        $o = 0;
172
                    }
173
                    break; case 'maxval':
174
                        if ((float)($tv) > $v) {
175
                            $o = 0;
176
                        }
177
                    break; case 'minval':
178
                        if ((float)($tv) < $v) {
179
                            $o = 0;
180
                        }
181
                    break; case 'match':
182
                        if (!preg_match($v, $tv)) {
183
                            $o = 0;
184
                        }
185
                    break; case 'nomatch':
186
                        if (preg_match($v, $tv)) {
187
                            $o = 0;
188
                        }
189
                    break; case 'oneof':
190
                        $m = 0;
191
                        foreach (explode('|', $v) as $n) {
192
                            if ($tv == $n) {
193
                                $m = 1;
194
                                break;
195
                            }
196
                        }
197
                        $o = $m;
198
                    break; case 'noneof':
199
                        $m = 1;
200
                        foreach (explode('|', $v) as $n) {
201
                            if ($tv == $n) {
202
                                $m = 0;
203
                                break;
204
                            }
205
                        }
206
                        $o = $m;
207
                    break; default:
208
                    break;
209
            }
210
            if (!$o) {
211
                break;
212
            }
213
        }
214
        if ($o) {
215
            $r[] = $tv;
216
        }
217
    }
218
    if ($s == ',') {
219
        $s = ', ';
220
    }
221
    $r = implode($s, $r);
222
223
    return isset($r[0]) ? $r : (isset($p['default']) ? $p['default'] : 0);
224
}
225
226
function hl_bal($t, $do = 1, $in = 'div') {
227
    // balance tags
228
// by content
229 1731
    $cB = array('blockquote' => 1, 'form' => 1, 'map' => 1, 'noscript' => 1); // Block
230 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
231 1731
    $cF = array('a' => 1, 'article' => 1, 'aside' => 1, 'audio' => 1, 'button' => 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
232 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
233 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
234 1731
    $cN2 = array_keys($cN);
235 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
236 1731
    if ($GLOBALS['C']['direct_list_nest']) {
237 613
        $cS['ol'] = $cS['ul'] = $cS['menu'] += array('menu' => 1, 'ol' => 1, 'ul' => 1);
238
    }
239 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
240 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
241
// block/inline type; a/ins/del both type; #pcdata: text
242 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);
243 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);
244 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
245 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
246 1731
    $eF = $eB + $eI;
247
248
    // $in sets allowed child
249 1731
    $in = ((isset($eF[$in]) && $in != '#pcdata') or isset($eO[$in])) ? $in : 'div';
250 1731
    if (isset($cE[$in])) {
251
        return !$do ? '' : str_replace(array('<', '>'), array('&lt;', '&gt;'), $t);
252
    }
253 1731
    if (isset($cS[$in])) {
254
        $inOk = $cS[$in];
255 1731
    } elseif (isset($cI[$in])) {
256
        $inOk = $eI;
257
        $cI['del'] = 1;
258
        $cI['ins'] = 1;
259 1731
    } elseif (isset($cF[$in])) {
260 1731
        $inOk = $eF;
261 1731
        unset($cI['del'], $cI['ins']);
262
    } elseif (isset($cB[$in])) {
263
        $inOk = $eB;
264
        unset($cI['del'], $cI['ins']);
265
    }
266 1731
    if (isset($cO[$in])) {
267
        $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...
268
    }
269 1731
    if (isset($cN[$in])) {
270
        $inOk = array_diff_assoc($inOk, $cN[$in]);
271
    }
272
273 1731
    $t = explode('<', $t);
274 1731
    $ok = $q = array(); // $q seq list of open non-empty ele
275 1731
    ob_start();
276
277 1731
    for ($i = -1, $ci = count($t); ++$i < $ci;) {
278
        // allowed $ok in parent $p
279 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...
280 308
            $p = array_pop($q);
281 308
            $q[] = $p;
282 308
            if (isset($cS[$p])) {
283 27
                $ok = $cS[$p];
284 289
            } elseif (isset($cI[$p])) {
285 28
                $ok = $eI;
286 28
                $cI['del'] = 1;
287 28
                $cI['ins'] = 1;
288 265
            } elseif (isset($cF[$p])) {
289 264
                $ok = $eF;
290 264
                unset($cI['del'], $cI['ins']);
291 2
            } elseif (isset($cB[$p])) {
292 2
                $ok = $eB;
293 2
                unset($cI['del'], $cI['ins']);
294
            }
295 308
            if (isset($cO[$p])) {
296 2
                $ok = $ok + $cO[$p];
297
            }
298 308
            if (isset($cN[$p])) {
299 308
                $ok = array_diff_assoc($ok, $cN[$p]);
300
            }
301
        } else {
302 1731
            $ok = $inOk;
303 1731
            unset($cI['del'], $cI['ins']);
304
        }
305
        // bad tags, & ele content
306 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...
307
            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...
308
        }
309 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...
310 284
            if (strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))) {
311 1
                echo '<div>', $x, '</div>';
312 284
            } elseif ($do < 3 or isset($ok['#pcdata'])) {
313 284
                echo $x;
314
            } elseif (strpos($x, "\x02\x04")) {
315
                foreach (preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v) {
316
                    echo substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : '');
317
                }
318
            } elseif ($do > 4) {
319
                echo preg_replace('`\S`', '', $x);
320
            }
321
        }
322
        // get markup
323 1731
        if (!preg_match('`^(/?)([a-z1-6]+)([^>]*)>(.*)`sm', $t[$i], $r)) {
324 1731
            $x = $t[$i];
325 1731
            continue;
326
        }
327 946
        $s = null;
328 946
        $e = null;
329 946
        $a = null;
330 946
        $x = null;
331 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...
332
        // close tag
333 946
        if ($s) {
334 298
            if (isset($cE[$e]) or !in_array($e, $q)) {
335 3
                continue;
336
            } // Empty/unopen
337 297
            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...
338 296
                array_pop($q);
339 296
                echo '</', $e, '>';
340 296
                unset($e);
341 296
                continue;
342
            } // Last open
343 2
            $add = ''; // Nesting - close open tags that need to be
344 2
            for ($j = -1, $cj = count($q); ++$j < $cj;) {
345 2
                if (($d = array_pop($q)) == $e) {
346 2
                    break;
347
                } else {
348 2
                    $add .= "</{$d}>";
349
                }
350
            }
351 2
            echo $add, '</', $e, '>';
352 2
            unset($e);
353 2
            continue;
354
        }
355
        // open tag
356
        // $cB ele needs $eB ele as child
357 946
        if (isset($cB[$e]) && strlen(trim($x))) {
358 1
            $t[$i] = "{$e}{$a}>";
359 1
            array_splice($t, $i + 1, 0, 'div>'.$x);
360 1
            unset($e, $x);
361 1
            ++$ci;
362 1
            --$i;
363 1
            continue;
364
        }
365 946
        if ((($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql)) && !isset($eB[$e]) && !isset($ok[$e])) {
366
            array_splice($t, $i, 0, 'div>');
367
            unset($e, $x);
368
            ++$ci;
369
            --$i;
370
            continue;
371
        }
372
        // if no open ele, $in = parent; mostly immediate parent-child relation should hold
373 946
        if (!$ql or !isset($eN[$e]) or !array_intersect($q, $cN2)) {
374 946
            if (!isset($ok[$e])) {
375 21
                if ($ql && isset($cT[$p])) {
376
                    echo '</', array_pop($q), '>';
377
                    unset($e, $x);
378
                    --$i;
379
                }
380 21
                continue;
381
            }
382 937
            if (!isset($cE[$e])) {
383 369
                $q[] = $e;
384
            }
385 937
            echo '<', $e, $a, '>';
386 937
            unset($e);
387 937
            continue;
388
        }
389
        // specific parent-child
390
        if (isset($cS[$p][$e])) {
391
            if (!isset($cE[$e])) {
392
                $q[] = $e;
393
            }
394
            echo '<', $e, $a, '>';
395
            unset($e);
396
            continue;
397
        }
398
        // nesting
399
        $add = '';
400
        $q2 = array();
401
        for ($k = -1, $kc = count($q); ++$k < $kc;) {
402
            $d = $q[$k];
403
            $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...
404
            if (isset($cS[$d])) {
405
                $q2[] = $d;
406
                continue;
407
            }
408
            $ok2 = isset($cI[$d]) ? $eI : $eF;
409
            if (isset($cO[$d])) {
410
                $ok2 = $ok2 + $cO[$d];
411
            }
412
            if (isset($cN[$d])) {
413
                $ok2 = array_diff_assoc($ok2, $cN[$d]);
414
            }
415
            if (!isset($ok2[$e])) {
416
                if (!$k && !isset($inOk[$e])) {
417
                    continue 2;
418
                }
419
                $add = "</{$d}>";
420
                for (; ++$k < $kc;) {
421
                    $add = "</{$q[$k]}>{$add}";
422
                }
423
                break;
424
            } else {
425
                $q2[] = $d;
426
            }
427
        }
428
        $q = $q2;
429
        if (!isset($cE[$e])) {
430
            $q[] = $e;
431
        }
432
        echo $add, '<', $e, $a, '>';
433
        unset($e);
434
        continue;
435
    }
436
437
    // end
438 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...
439 111
        $p = array_pop($q);
440 111
        $q[] = $p;
441 111
        if (isset($cS[$p])) {
442 28
            $ok = $cS[$p];
443 84
        } elseif (isset($cI[$p])) {
444 2
            $ok = $eI;
445 2
            $cI['del'] = 1;
446 2
            $cI['ins'] = 1;
447 82
        } elseif (isset($cF[$p])) {
448 82
            $ok = $eF;
449 82
            unset($cI['del'], $cI['ins']);
450
        } elseif (isset($cB[$p])) {
451
            $ok = $eB;
452
            unset($cI['del'], $cI['ins']);
453
        }
454 111
        if (isset($cO[$p])) {
455
            $ok = $ok + $cO[$p];
456
        }
457 111
        if (isset($cN[$p])) {
458 111
            $ok = array_diff_assoc($ok, $cN[$p]);
459
        }
460
    } else {
461 1657
        $ok = $inOk;
462 1657
        unset($cI['del'], $cI['ins']);
463
    }
464 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...
465
        echo '&lt;', $s, $e, $a, '&gt;';
466
    }
467 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...
468 493
        if (strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))) {
469
            echo '<div>', $x, '</div>';
470 493
        } elseif ($do < 3 or isset($ok['#pcdata'])) {
471 493
            echo $x;
472
        } elseif (strpos($x, "\x02\x04")) {
473
            foreach (preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v) {
474
                echo substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : '');
475
            }
476
        } elseif ($do > 4) {
477
            echo preg_replace('`\S`', '', $x);
478
        }
479
    }
480 1731
    while (!empty($q) && ($e = array_pop($q))) {
481 111
        echo '</', $e, '>';
482
    }
483 1731
    $o = ob_get_contents();
484 1731
    ob_end_clean();
485
486 1731
    return $o;
487
}
488
489
function hl_cmtcd($t) {
490
    // comment/CDATA sec handler
491 29
    $t = $t[0];
492 29
    global $C;
493 29
    if (!($v = $C[$n = $t[3] == '-' ? 'comment' : 'cdata'])) {
494
        return $t;
495
    }
496 29
    if ($v == 1) {
497 29
        return '';
498
    }
499
    if ($n == 'comment' && $v < 4) {
500
        if (substr(($t = preg_replace('`--+`', '-', substr($t, 4, -3))), -1) != ' ') {
501
            $t .= ' ';
502
        }
503
    } else {
504
        $t = substr($t, 1, -1);
505
    }
506
    $t = $v == 2 ? str_replace(array('&', '<', '>'), array('&amp;', '&lt;', '&gt;'), $t) : $t;
507
508
    return str_replace(array('&', '<', '>'), array("\x03", "\x04", "\x05"), ($n == 'comment' ? "\x01\x02\x04!--$t--\x05\x02\x01" : "\x01\x01\x04$t\x05\x01\x01"));
509
}
510
511
function hl_ent($t) {
512
    // entitity handler
513 249
    global $C;
514 249
    $t = $t[1];
515 249
    static $U = array('quot' => 1, 'amp' => 1, 'lt' => 1, 'gt' => 1);
516 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');
517 249
    if ($t[0] != '#') {
518 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)).';';
519
    }
520 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))) {
521 37
        return ($C['and_mark'] ? "\x06" : '&')."amp;#{$t};";
522
    }
523
524 78
    return ($C['and_mark'] ? "\x06" : '&').'#'.(((ctype_digit($t) && $C['hexdec_entity'] < 2) or !$C['hexdec_entity']) ? $n : 'x'.dechex($n)).';';
525
}
526
527
function hl_prot($p, $c = null) {
528
    // check URL scheme
529 566
    global $C;
530 566
    $b = $a = '';
531 566
    if ($c == null) {
532 17
        $c = 'style';
533 17
        $b = $p[1];
534 17
        $a = $p[3];
535 17
        $p = trim($p[2]);
536
    }
537 566
    $c = isset($C['schemes'][$c]) ? $C['schemes'][$c] : $C['schemes']['*'];
538 566
    static $d = 'denied:';
539 566
    if (isset($c['!']) && substr($p, 0, 7) != $d) {
540 12
        $p = "$d$p";
541
    }
542 566
    if (isset($c['*']) or !strcspn($p, '#?;') or (substr($p, 0, 7) == $d)) {
543 127
        return "{$b}{$p}{$a}";
544
    } // All ok, frag, query, param
545 545
    if (preg_match('`^([^:?[@!$()*,=/\'\]]+?)(:|&#(58|x3a);|%3a|\\\\0{0,4}3a).`i', $p, $m) && !isset($c[strtolower($m[1])])) { // Denied prot
546 324
        return "{$b}{$d}{$p}{$a}";
547
    }
548 223
    if ($C['abs_url']) {
549
        if ($C['abs_url'] == -1 && strpos($p, $C['base_url']) === 0) { // Make url rel
550
            $p = substr($p, strlen($C['base_url']));
551
        } elseif (empty($m[1])) { // Make URL abs
552
            if (substr($p, 0, 2) == '//') {
553
                $p = substr($C['base_url'], 0, strpos($C['base_url'], ':') + 1).$p;
554
            } elseif ($p[0] == '/') {
555
                $p = preg_replace('`(^.+?://[^/]+)(.*)`', '$1', $C['base_url']).$p;
556
            } elseif (strcspn($p, './')) {
557
                $p = $C['base_url'].$p;
558
            } else {
559
                preg_match('`^([a-zA-Z\d\-+.]+://[^/]+)(.*)`', $C['base_url'], $m);
560
                $p = preg_replace('`(?<=/)\./`', '', $m[2].$p);
561
                while (preg_match('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', $p)) {
562
                    $p = preg_replace('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', '', $p);
563
                }
564
                $p = $m[1].$p;
565
            }
566
        }
567
    }
568
569 223
    return "{$b}{$p}{$a}";
570
}
571
572
function hl_regex($p) {
573
    // check regex
574 1154
    if (empty($p)) {
575
        return 0;
576
    }
577 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...
578 1154
        error_clear_last();
579 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...
580
        if ($t = ini_get('track_errors')) {
581
            $o = isset($php_errormsg) ? $php_errormsg : null;
582
        } else {
583
            ini_set('track_errors', 1);
584
        }
585
        unset($php_errormsg);
586
    }
587 1154
    if (($d = ini_get('display_errors'))) {
588 1154
        ini_set('display_errors', 0);
589
    }
590 1154
    preg_match($p, '');
591 1154
    if ($v) {
592 1154
        $r = error_get_last() == null ? 1 : 0;
593 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...
594
        $r = isset($php_errormsg) ? 0 : 1;
595
        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...
596
            $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...
597
        } else {
598
            ini_set('track_errors', 0);
599
        }
600
    }
601 1154
    if ($d) {
602 1154
        ini_set('display_errors', 1);
603
    }
604
605 1154
    return $r;
606
}
607
608
function hl_spec($t) {
609
    // final $spec
610 559
    $s = array();
611 559
    if (!function_exists('hl_aux1')) {
612
        function hl_aux1($m) {
613
            return substr(str_replace(array(';', '|', '~', ' ', ',', '/', '(', ')', '`"'), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", '"'), $m[0]), 1, -1);
614
        }
615
    }
616 559
    $t = str_replace(array("\t", "\r", "\n", ' '), '', preg_replace_callback('/"(?>(`.|[^"])*)"/sm', 'hl_aux1', trim($t)));
617 559
    for ($i = count(($t = explode(';', $t))); --$i >= 0;) {
618 559
        $w = $t[$i];
619 559
        if (empty($w) or ($e = strpos($w, '=')) === false or !strlen(($a = substr($w, $e + 1)))) {
620 559
            continue;
621
        }
622
        $y = $n = array();
623
        foreach (explode(',', $a) as $v) {
624
            if (!preg_match('`^([a-z:\-\*]+)(?:\((.*?)\))?`i', $v, $m)) {
625
                continue;
626
            }
627
            if (($x = strtolower($m[1])) == '-*') {
628
                $n['*'] = 1;
629
                continue;
630
            }
631
            if ($x[0] == '-') {
632
                $n[substr($x, 1)] = 1;
633
                continue;
634
            }
635
            if (!isset($m[2])) {
636
                $y[$x] = 1;
637
                continue;
638
            }
639
            foreach (explode('/', $m[2]) as $m) {
640
                if (empty($m) or ($p = strpos($m, '=')) == 0 or $p < 5) {
641
                    $y[$x] = 1;
642
                    continue;
643
                }
644
                $y[$x][strtolower(substr($m, 0, $p))] = str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08"), array(';', '|', '~', ' ', ',', '/', '(', ')'), substr($m, $p + 1));
645
            }
646 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...
647
                unset($y[$x]['match']);
648
            }
649 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...
650
                unset($y[$x]['nomatch']);
651
            }
652
        }
653
        if (!count($y) && !count($n)) {
654
            continue;
655
        }
656
        foreach (explode(',', substr($w, 0, $e)) as $v) {
657
            if (!strlen(($v = strtolower($v)))) {
658
                continue;
659
            }
660
            if (count($y)) {
661
                if (!isset($s[$v])) {
662
                    $s[$v] = $y;
663
                } else {
664
                    $s[$v] = array_merge($s[$v], $y);
665
                }
666
            }
667
            if (count($n)) {
668
                if (!isset($s[$v]['n'])) {
669
                    $s[$v]['n'] = $n;
670
                } else {
671
                    $s[$v]['n'] = array_merge($s[$v]['n'], $n);
672
                }
673
            }
674
        }
675
    }
676
677 559
    return $s;
678
}
679
680
function hl_tag($t) {
681
    // tag/attribute handler
682 1637
    global $C;
683 1637
    $t = $t[0];
684
    // invalid < >
685 1637
    if ($t == '< ') {
686
        return '&lt; ';
687
    }
688 1637
    if ($t == '>') {
689 200
        return '&gt;';
690
    }
691 1637
    if (!preg_match('`^<(/?)([a-zA-Z][a-zA-Z1-6]*)([^>]*?)\s?>$`m', $t, $m)) {
692 91
        return str_replace(array('<', '>'), array('&lt;', '&gt;'), $t);
693 1583
    } elseif (!isset($C['elements'][($e = strtolower($m[2]))])) {
694 721
        return ($C['keep_bad'] % 2) ? str_replace(array('<', '>'), array('&lt;', '&gt;'), $t) : '';
695
    }
696
    // attr string
697 946
    $a = str_replace(array("\n", "\r", "\t"), ' ', trim($m[3]));
698
    // tag transform
699 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
700 946
    if ($C['make_tag_strict'] && isset($eD[$e])) {
701 1
        $trt = hl_tag2($e, $a, $C['make_tag_strict']);
702 1
        if (!$e) {
703
            return ($C['keep_bad'] % 2) ? str_replace(array('<', '>'), array('&lt;', '&gt;'), $t) : '';
704
        }
705
    }
706
    // close tag
707 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
708 946
    if (!empty($m[1])) {
709 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) : '');
710
    }
711
712
    // open tag & attr
713 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
714 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
715 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
716 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
717 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*
718 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*
719
720 946
    if ($C['lc_std_val']) {
721
        // predef attr vals for $eAL & $aNE ele
722 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);
723 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);
724 946
        $lcase = isset($eAL[$e]) ? 1 : 0;
725
    }
726
727 946
    $depTr = 0;
728 946
    if ($C['no_deprecated_attr']) {
729
        // depr attr:applicable ele
730 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));
731 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);
732 946
        $depTr = isset($eAD[$e]) ? 1 : 0;
733
    }
734
735
    // attr name-vals
736 946
    if (strpos($a, "\x01") !== false) {
737
        $a = preg_replace('`\x01[^\x01]*\x01`', '', $a);
738
    } // No comment/CDATA sec
739 946
    $mode = 0;
740 946
    $a = trim($a, ' /');
741 946
    $aA = array();
742 946
    while (strlen($a)) {
743 909
        $w = 0;
744
        switch ($mode) {
745 909
            case 0: // Name
746 909
                if (preg_match('`^[a-zA-Z][^\s=/]+`', $a, $m)) {
747 891
                    $nm = strtolower($m[0]);
748 891
                    $w = $mode = 1;
749 891
                    $a = ltrim(substr_replace($a, '', 0, strlen($m[0])));
750
                }
751 909
                break; case 1:
752 891
                if ($a[0] == '=') { // =
753 891
                    $w = 1;
754 891
                    $mode = 2;
755 891
                    $a = ltrim($a, '= ');
756
                } else { // No val
757
                    $w = 1;
758
                    $mode = 0;
759
                    $a = ltrim($a);
760
                    $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...
761
                }
762 891
                break; case 2: // Val
763 891
                    if (preg_match('`^((?:"[^"]*")|(?:\'[^\']*\')|(?:\s*[^\s"\']+))(.*)`', $a, $m)) {
764 891
                        $a = ltrim($m[2]);
765 891
                        $m = $m[1];
766 891
                        $w = 1;
767 891
                        $mode = 0;
768 891
                        $aA[$nm] = trim(str_replace('<', '&lt;', ($m[0] == '"' or $m[0] == '\'') ? substr($m, 1, -1) : $m));
769
                    }
770 891
                break;
771
        }
772 909
        if ($w == 0) { // Parse errs, deal with space, " & '
773 173
            $a = preg_replace('`^(?:"[^"]*("|$)|\'[^\']*(\'|$)|\S)*\s*`', '', $a);
774 173
            $mode = 0;
775
        }
776
    }
777 946
    if ($mode == 1) {
778 1
        $aA[$nm] = '';
779
    }
780
781
    // clean attrs
782 946
    global $S;
783 946
    $rl = isset($S[$e]) ? $S[$e] : array();
784 946
    $a = array();
785 946
    $nfr = 0;
786 946
    $d = $C['deny_attribute'];
787 946
    foreach ($aA as $k => $v) {
788 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])) {
789 699
            if (isset($aNE[$k])) {
790 3
                $v = $k;
791 699
            } elseif (!empty($lcase) && (($e != 'button' or $e != 'input') or $k == 'type')) { // Rather loose but ?not cause issues
792 574
                $v = (isset($aNL[($v2 = strtolower($v))])) ? $v2 : $v;
793
            }
794 699
            if ($k == 'style' && !$C['style_pass']) {
795 40
                if (false !== strpos($v, '&#')) {
796 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;' => '\\');
797 3
                    $v = strtr($v, $sC);
798
                }
799 40
                $v = preg_replace_callback('`(url(?:\()(?: )*(?:\'|"|&(?:quot|apos);)?)(.+?)((?:\'|"|&(?:quot|apos);)?(?: )*(?:\)))`iS', 'hl_prot', $v);
800 40
                $v = !$C['css_expression'] ? preg_replace('`expression`i', ' ', preg_replace('`\\\\\S|(/|(%2f))(\*|(%2a))`i', ' ', $v)) : $v;
801 664
            } elseif (isset($aNP[$k]) or isset($aNO[$k])) {
802 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
803 550
                if ($k == 'srcset') {
804
                    $v2 = '';
805
                    foreach (explode(',', $v) as $k1 => $v1) {
806
                        $v1 = explode(' ', ltrim($v1), 2);
807
                        $k1 = isset($v1[1]) ? trim($v1[1]) : '';
808
                        $v1 = trim($v1[0]);
809
                        if (isset($v1[0])) {
810
                            $v2 .= hl_prot($v1, $k).(empty($k1) ? '' : ' '.$k1).', ';
811
                        }
812
                    }
813
                    $v = trim($v2, ', ');
814
                }
815 550
                if ($k == 'itemtype') {
816
                    $v2 = '';
817
                    foreach (explode(' ', $v) as $v1) {
818
                        if (isset($v1[0])) {
819
                            $v2 .= hl_prot($v1, $k).' ';
820
                        }
821
                    }
822
                    $v = trim($v2, ' ');
823
                } else {
824 550
                    $v = hl_prot($v, $k);
825
                }
826 550
                if ($k == 'href') { // X-spam
827 161
                    if ($C['anti_mail_spam'] && strpos($v, 'mailto:') === 0) {
828
                        $v = str_replace('@', htmlspecialchars($C['anti_mail_spam']), $v);
829 161
                    } elseif ($C['anti_link_spam']) {
830 101
                        $r1 = $C['anti_link_spam'][1];
831 101
                        if (!empty($r1) && preg_match($r1, $v)) {
832
                            continue;
833
                        }
834 101
                        $r0 = $C['anti_link_spam'][0];
835 101
                        if (!empty($r0) && preg_match($r0, $v)) {
836 101
                            if (isset($a['rel'])) {
837 42
                                if (!preg_match('`\bnofollow\b`i', $a['rel'])) {
838 42
                                    $a['rel'] .= ' nofollow';
839
                                }
840 89
                            } elseif (isset($aA['rel'])) {
841 1
                                if (!preg_match('`\bnofollow\b`i', $aA['rel'])) {
842 1
                                    $nfr = 1;
843
                                }
844
                            } else {
845 88
                                $a['rel'] = 'nofollow';
846
                            }
847
                        }
848
                    }
849
                }
850
            }
851 699
            if (isset($rl[$k]) && is_array($rl[$k]) && ($v = hl_attrval($k, $v, $rl[$k])) === 0) {
852
                continue;
853
            }
854 699
            $a[$k] = str_replace('"', '&quot;', $v);
855
        }
856
    }
857 946
    if ($nfr) {
858
        $a['rel'] = isset($a['rel']) ? $a['rel'].' nofollow' : 'nofollow';
859
    }
860
861
    // rqd attr
862 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'));
863 946
    if (isset($eAR[$e])) {
864 497
        foreach ($eAR[$e] as $k => $v) {
865 497
            if (!isset($a[$k])) {
866 488
                $a[$k] = isset($v[0]) ? $v : $k;
867
            }
868
        }
869
    }
870
871
    // depr attr
872 946
    if ($depTr) {
873 790
        $c = array();
874 790
        foreach ($a as $k => $v) {
875 650
            if ($k == 'style' or !isset($aND[$k][$e])) {
876 649
                continue;
877
            }
878 4
            $v = str_replace(array('\\', ':', ';', '&#'), '', $v);
879 4
            if ($k == 'align') {
880 1
                unset($a['align']);
881 1
                if ($e == 'img' && ($v == 'left' or $v == 'right')) {
882
                    $c[] = 'float: '.$v;
883 1
                } elseif (($e == 'div' or $e == 'table') && $v == 'center') {
884
                    $c[] = 'margin: auto';
885
                } else {
886 1
                    $c[] = 'text-align: '.$v;
887
                }
888 3
            } elseif ($k == 'bgcolor') {
889
                unset($a['bgcolor']);
890
                $c[] = 'background-color: '.$v;
891 3
            } elseif ($k == 'border') {
892
                unset($a['border']);
893
                $c[] = "border: {$v}px";
894 3
            } elseif ($k == 'bordercolor') {
895
                unset($a['bordercolor']);
896
                $c[] = 'border-color: '.$v;
897 3
            } elseif ($k == 'cellspacing') {
898
                unset($a['cellspacing']);
899
                $c[] = "border-spacing: {$v}px";
900 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...
901
                unset($a['clear']);
902
                $c[] = 'clear: '.($v != 'all' ? $v : 'both');
903 3
            } elseif ($k == 'compact') {
904
                unset($a['compact']);
905
                $c[] = 'font-size: 85%';
906 3
            } elseif ($k == 'height' or $k == 'width') {
907
                unset($a[$k]);
908
                $c[] = $k.': '.($v[0] != '*' ? $v.(ctype_digit($v) ? 'px' : '') : 'auto');
909 3
            } elseif ($k == 'hspace') {
910
                unset($a['hspace']);
911
                $c[] = "margin-left: {$v}px; margin-right: {$v}px";
912 3
            } elseif ($k == 'language' && !isset($a['type'])) {
913
                unset($a['language']);
914
                $a['type'] = 'text/'.strtolower($v);
915 3
            } elseif ($k == 'name') {
916 3
                if ($C['no_deprecated_attr'] == 2 or ($e != 'a' && $e != 'map')) {
917
                    unset($a['name']);
918
                }
919 3
                if (!isset($a['id']) && !preg_match('`\W`', $v)) {
920 3
                    $a['id'] = $v;
921
                }
922
            } elseif ($k == 'noshade') {
923
                unset($a['noshade']);
924
                $c[] = 'border-style: none; border: 0; background-color: gray; color: gray';
925
            } elseif ($k == 'nowrap') {
926
                unset($a['nowrap']);
927
                $c[] = 'white-space: nowrap';
928 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...
929
                unset($a['size']);
930
                $c[] = 'size: '.$v.'px';
931
            } elseif ($k == 'vspace') {
932
                unset($a['vspace']);
933
                $c[] = "margin-top: {$v}px; margin-bottom: {$v}px";
934
            }
935
        }
936 790
        if (count($c)) {
937 1
            $c = implode('; ', $c);
938 1
            $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;').'; '.$c.';' : $c.';';
939
        }
940
    }
941
    // unique ID
942 946
    if ($C['unique_ids'] && isset($a['id'])) {
943
        if (preg_match('`\s`', ($id = $a['id'])) or (isset($GLOBALS['hl_Ids'][$id]) && $C['unique_ids'] == 1)) {
944
            unset($a['id']);
945
        } else {
946
            while (isset($GLOBALS['hl_Ids'][$id])) {
947
                $id = $C['unique_ids'].$id;
948
            }
949
            $GLOBALS['hl_Ids'][($a['id'] = $id)] = 1;
950
        }
951
    }
952
    // xml:lang
953 946
    if ($C['xml:lang'] && isset($a['lang'])) {
954
        $a['xml:lang'] = isset($a['xml:lang']) ? $a['xml:lang'] : $a['lang'];
955
        if ($C['xml:lang'] == 2) {
956
            unset($a['lang']);
957
        }
958
    }
959
    // for transformed tag
960 946
    if (!empty($trt)) {
961 1
        $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;').'; '.$trt : $trt;
962
    }
963
    // return with empty ele /
964 946
    if (empty($C['hook_tag'])) {
965 946
        $aA = '';
966 946
        foreach ($a as $k => $v) {
967 772
            $aA .= " {$k}=\"{$v}\"";
968
        }
969
970 946
        return "<{$e}{$aA}".(isset($eE[$e]) ? ' /' : '').'>';
971
    } else {
972
        return $C['hook_tag']($e, $a);
973
    }
974
}
975
976
function hl_tag2(&$e, &$a, $t = 1) {
977
    // transform tag
978 1
    if ($e == 'big') {
979
        $e = 'span';
980
981
        return 'font-size: larger;';
982
    }
983 1
    if ($e == 's' or $e == 'strike') {
984
        $e = 'span';
985
986
        return 'text-decoration: line-through;';
987
    }
988 1
    if ($e == 'tt') {
989
        $e = 'code';
990
991
        return '';
992
    }
993 1
    if ($e == 'center') {
994
        $e = 'div';
995
996
        return 'text-align: center;';
997
    }
998 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%');
999 1
    if ($e == 'font') {
1000 1
        $a2 = '';
1001 1
        while (preg_match('`(^|\s)(color|size)\s*=\s*(\'|")?(.+?)(\\3|\s|$)`i', $a, $m)) {
1002 1
            $a = str_replace($m[0], ' ', $a);
1003 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]).';') : '');
1004
        }
1005 1
        while (preg_match('`(^|\s)face\s*=\s*(\'|")?([^=]+?)\\2`i', $a, $m) or preg_match('`(^|\s)face\s*=(\s*)(\S+)`i', $a, $m)) {
1006
            $a = str_replace($m[0], ' ', $a);
1007
            $a2 .= ' font-family: '.str_replace('"', '\'', trim($m[3])).';';
1008
        }
1009 1
        $e = 'span';
1010
1011 1
        return ltrim(str_replace('<', '', $a2));
1012
    }
1013
    if ($e == 'acronym') {
1014
        $e = 'abbr';
1015
1016
        return '';
1017
    }
1018
    if ($e == 'dir') {
1019
        $e = 'ul';
1020
1021
        return '';
1022
    }
1023
    if ($t == 2) {
1024
        $e = 0;
1025
1026
        return 0;
1027
    }
1028
1029
    return '';
1030
}
1031
1032
function hl_tidy($t, $w, $p) {
1033
    // tidy/compact HTM
1034
    if (strpos(' pre,script,textarea', "$p,")) {
1035
        return $t;
1036
    }
1037
    if (!function_exists('hl_aux2')) {
1038
        function hl_aux2($m) {
1039
            return $m[1].str_replace(array('<', '>', "\n", "\r", "\t", ' '), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), $m[3]).$m[4];
1040
        }
1041
    }
1042
    $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));
1043
    if (($w = strtolower($w)) == -1) {
1044
        return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t);
1045
    }
1046
    $s = strpos(" $w", 't') ? "\t" : ' ';
1047
    $s = preg_match('`\d`', $w, $m) ? str_repeat($s, $m[0]) : str_repeat($s, ($s == "\t" ? 1 : 2));
1048
    $N = preg_match('`[ts]([1-9])`', $w, $m) ? $m[1] : 0;
1049
    $a = array('br' => 1);
1050
    $b = array('button' => 1, 'command' => 1, 'input' => 1, 'option' => 1, 'param' => 1, 'track' => 1);
1051
    $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);
1052
    $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);
1053
    $T = explode('<', $t);
1054
    $X = 1;
1055
    while ($X) {
1056
        $n = $N;
1057
        $t = $T;
1058
        ob_start();
1059
        if (isset($d[$p])) {
1060
            echo str_repeat($s, ++$n);
1061
        }
1062
        echo ltrim(array_shift($t));
1063
        for ($i = -1, $j = count($t); ++$i < $j;) {
1064
            $r = '';
1065
            list($e, $r) = explode('>', $t[$i]);
1066
            $x = $e[0] == '/' ? 0 : (substr($e, -1) == '/' ? 1 : ($e[0] != '!' ? 2 : -1));
1067
            $y = !$x ? ltrim($e, '/') : ($x > 0 ? substr($e, 0, strcspn($e, ' ')) : 0);
1068
            $e = "<$e>";
1069
            if (isset($d[$y])) {
1070
                if (!$x) {
1071
                    if ($n) {
1072
                        echo "\n", str_repeat($s, --$n), "$e\n", str_repeat($s, $n);
1073
                    } else {
1074
                        ++$N;
1075
                        ob_end_clean();
1076
                        continue 2;
1077
                    }
1078
                } else {
1079
                    echo "\n", str_repeat($s, $n), "$e\n", str_repeat($s, ($x != 1 ? ++$n : $n));
1080
                }
1081
                echo $r;
1082
                continue;
1083
            }
1084
            $f = "\n".str_repeat($s, $n);
1085
            if (isset($c[$y])) {
1086
                if (!$x) {
1087
                    echo $e, $f, $r;
1088
                } else {
1089
                    echo $f, $e, $r;
1090
                }
1091
            } elseif (isset($b[$y])) {
1092
                echo $f, $e, $r;
1093
            } elseif (isset($a[$y])) {
1094
                echo $e, $f, $r;
1095
            } elseif (!$y) {
1096
                echo $f, $e, $f, $r;
1097
            } else {
1098
                echo $e, $r;
1099
            }
1100
        }
1101
        $X = 0;
1102
    }
1103
    $t = str_replace(array("\n ", " \n"), "\n", preg_replace('`[\n]\s*?[\n]+`', "\n", ob_get_contents()));
1104
    ob_end_clean();
1105
    if (($l = strpos(" $w", 'r') ? (strpos(" $w", 'n') ? "\r\n" : "\r") : 0)) {
1106
        $t = str_replace("\n", $l, $t);
1107
    }
1108
1109
    return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t);
1110
}
1111
1112
function hl_version() {
1113
    // version
1114
    return '1.2.4.2';
1115
}
1116