Completed
Push — feature/update-1-2-4-2 ( ea1ffd...526224 )
by Ryan
02:52
created

htmLawed.php ➔ hl_bal()   F

Complexity

Conditions 100
Paths > 20000

Size

Total Lines 262

Duplication

Lines 84
Ratio 32.06 %

Code Coverage

Tests 114
CRAP Score 770.2236

Importance

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