hl_tidy()   F
last analyzed

Complexity

Conditions 27
Paths 9266

Size

Total Lines 52
Code Lines 44

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 27
eloc 44
nc 9266
nop 3
dl 0
loc 52
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.1.22, 5 March 2016
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
$C = is_array($C) ? $C : array();
14
if(!empty($C['valid_xhtml'])){
15
 $C['elements'] = empty($C['elements']) ? '*-center-dir-font-isindex-menu-s-strike-u' : $C['elements'];
16
 $C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 2;
17
 $C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 2;
18
}
19
// config eles
20
$e = array('a'=>1, 'abbr'=>1, 'acronym'=>1, 'address'=>1, 'applet'=>1, 'area'=>1, 'b'=>1, 'bdo'=>1, 'big'=>1, 'blockquote'=>1, 'br'=>1, 'button'=>1, 'caption'=>1, 'center'=>1, 'cite'=>1, 'code'=>1, 'col'=>1, 'colgroup'=>1, 'dd'=>1, 'del'=>1, 'dfn'=>1, 'dir'=>1, 'div'=>1, 'dl'=>1, 'dt'=>1, 'em'=>1, 'embed'=>1, 'fieldset'=>1, 'font'=>1, 'form'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'i'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'ins'=>1, 'isindex'=>1, 'kbd'=>1, 'label'=>1, 'legend'=>1, 'li'=>1, 'map'=>1, 'menu'=>1, 'noscript'=>1, 'object'=>1, 'ol'=>1, 'optgroup'=>1, 'option'=>1, 'p'=>1, 'param'=>1, 'pre'=>1, 'q'=>1, 'rb'=>1, 'rbc'=>1, 'rp'=>1, 'rt'=>1, 'rtc'=>1, 'ruby'=>1, 's'=>1, 'samp'=>1, 'script'=>1, 'select'=>1, 'small'=>1, 'span'=>1, 'strike'=>1, 'strong'=>1, 'sub'=>1, 'sup'=>1, 'table'=>1, 'tbody'=>1, 'td'=>1, 'textarea'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1, 'tt'=>1, 'u'=>1, 'ul'=>1, 'var'=>1); // 86/deprecated+embed+ruby
21
if(!empty($C['safe'])){
22
 unset($e['applet'], $e['embed'], $e['iframe'], $e['object'], $e['script']);
23
}
24
$x = !empty($C['elements']) ? str_replace(array("\n", "\r", "\t", ' '), '', $C['elements']) : '*';
25
if($x == '-*'){$e = array();}
26
elseif(strpos($x, '*') === false){$e = array_flip(explode(',', $x));}
27
else{
28
 if(isset($x[1])){
29
  preg_match_all('`(?:^|-|\+)[^\-+]+?(?=-|\+|$)`', $x, $m, PREG_SET_ORDER);
30
  for($i=count($m); --$i>=0;){$m[$i] = $m[$i][0];}
31
  foreach($m as $v){
32
   if($v[0] == '+'){$e[substr($v, 1)] = 1;}
33
   if($v[0] == '-' && isset($e[($v = substr($v, 1))]) && !in_array('+'. $v, $m)){unset($e[$v]);}
34
  }
35
 }
36
}
37
$C['elements'] =& $e;
38
// config attrs
39
$x = !empty($C['deny_attribute']) ? str_replace(array("\n", "\r", "\t", ' '), '', $C['deny_attribute']) : '';
40
$x = array_flip((isset($x[0]) && $x[0] == '*') ? explode('-', $x) : explode(',', $x. (!empty($C['safe']) ? ',on*' : '')));
41
if(isset($x['on*'])){
42
 unset($x['on*']);
43
 $x += array('onblur'=>1, 'onchange'=>1, 'onclick'=>1, 'ondblclick'=>1, 'onfocus'=>1, 'onkeydown'=>1, 'onkeypress'=>1, 'onkeyup'=>1, 'onmousedown'=>1, 'onmousemove'=>1, 'onmouseout'=>1, 'onmouseover'=>1, 'onmouseup'=>1, 'onreset'=>1, 'onselect'=>1, 'onsubmit'=>1);
44
}
45
$C['deny_attribute'] = $x;
46
// config URL
47
$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, telnet; *:file, http, https';
48
$C['schemes'] = array();
49
foreach(explode(';', str_replace(array(' ', "\t", "\r", "\n"), '', $x)) as $v){
50
 $x = $x2 = null; list($x, $x2) = explode(':', $v, 2);
0 ignored issues
show
Unused Code introduced by
The assignment to $x is dead and can be removed.
Loading history...
Unused Code introduced by
The assignment to $x2 is dead and can be removed.
Loading history...
51
 if($x2){$C['schemes'][$x] = array_flip(explode(',', $x2));}
52
}
53
if(!isset($C['schemes']['*'])){$C['schemes']['*'] = array('file'=>1, 'http'=>1, 'https'=>1,);}
54
if(!empty($C['safe']) && empty($C['schemes']['style'])){$C['schemes']['style'] = array('!'=>1);}
55
$C['abs_url'] = isset($C['abs_url']) ? $C['abs_url'] : 0;
56
if(!isset($C['base_url']) or !preg_match('`^[a-zA-Z\d.+\-]+://[^/]+/(.+?/)?$`', $C['base_url'])){
57
 $C['base_url'] = $C['abs_url'] = 0;
58
}
59
// config rest
60
$C['and_mark'] = empty($C['and_mark']) ? 0 : 1;
61
$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;
62
$C['anti_mail_spam'] = isset($C['anti_mail_spam']) ? $C['anti_mail_spam'] : 0;
63
$C['balance'] = isset($C['balance']) ? (bool)$C['balance'] : 1;
64
$C['cdata'] = isset($C['cdata']) ? $C['cdata'] : (empty($C['safe']) ? 3 : 0);
65
$C['clean_ms_char'] = empty($C['clean_ms_char']) ? 0 : $C['clean_ms_char'];
66
$C['comment'] = isset($C['comment']) ? $C['comment'] : (empty($C['safe']) ? 3 : 0);
67
$C['css_expression'] = empty($C['css_expression']) ? 0 : 1;
68
$C['direct_list_nest'] = empty($C['direct_list_nest']) ? 0 : 1;
69
$C['hexdec_entity'] = isset($C['hexdec_entity']) ? $C['hexdec_entity'] : 1;
70
$C['hook'] = (!empty($C['hook']) && function_exists($C['hook'])) ? $C['hook'] : 0;
71
$C['hook_tag'] = (!empty($C['hook_tag']) && function_exists($C['hook_tag'])) ? $C['hook_tag'] : 0;
72
$C['keep_bad'] = isset($C['keep_bad']) ? $C['keep_bad'] : 6;
73
$C['lc_std_val'] = isset($C['lc_std_val']) ? (bool)$C['lc_std_val'] : 1;
74
$C['make_tag_strict'] = isset($C['make_tag_strict']) ? $C['make_tag_strict'] : 1;
75
$C['named_entity'] = isset($C['named_entity']) ? (bool)$C['named_entity'] : 1;
76
$C['no_deprecated_attr'] = isset($C['no_deprecated_attr']) ? $C['no_deprecated_attr'] : 1;
77
$C['parent'] = isset($C['parent'][0]) ? strtolower($C['parent']) : 'body';
78
$C['show_setting'] = !empty($C['show_setting']) ? $C['show_setting'] : 0;
79
$C['style_pass'] = empty($C['style_pass']) ? 0 : 1;
80
$C['tidy'] = empty($C['tidy']) ? 0 : $C['tidy'];
81
$C['unique_ids'] = isset($C['unique_ids']) ? $C['unique_ids'] : 1;
82
$C['xml:lang'] = isset($C['xml:lang']) ? $C['xml:lang'] : 0;
83
// own config options
84
// block elements allowed for nesting when only inline is allowed; Example span does not allow block elements as table; table is the only element tested so far
85
$C['allow_for_inline'] = isset($C['allow_for_inline'])?$C['allow_for_inline']:0;
86
87
if(isset($GLOBALS['C'])){$reC = $GLOBALS['C'];}
88
$GLOBALS['C'] = $C;
89
$S = is_array($S) ? $S : hl_spec($S);
90
if(isset($GLOBALS['S'])){$reS = $GLOBALS['S'];}
91
$GLOBALS['S'] = $S;
92
93
$t = preg_replace('`[\x00-\x08\x0b-\x0c\x0e-\x1f]`', '', $t);
94
if($C['clean_ms_char']){
95
 $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;');
96
 $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"=>'"'));
97
 $t = strtr($t, $x);
98
}
99
if($C['cdata'] or $C['comment']){$t = preg_replace_callback('`<!(?:(?:--.*?--)|(?:\[CDATA\[.*?\]\]))>`sm', 'hl_cmtcd', $t);}
100
$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));
101
if($C['unique_ids'] && !isset($GLOBALS['hl_Ids'])){$GLOBALS['hl_Ids'] = array();}
102
if($C['hook']){$t = $C['hook']($t, $C, $S);}
103
if($C['show_setting'] && preg_match('`^[a-z][a-z0-9_]*$`i', $C['show_setting'])){
104
 $GLOBALS[$C['show_setting']] = array('config'=>$C, 'spec'=>$S, 'time'=>microtime());
105
}
106
// main
107
$t = preg_replace_callback('`<(?:(?:\s|$)|(?:[^>]*(?:>|$)))|>`m', 'hl_tag', $t);
108
$t = $C['balance'] ? hl_bal($t, $C['keep_bad'], $C['parent']) : $t;
109
$t = (($C['cdata'] or $C['comment']) && strpos($t, "\x01") !== false) ? str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05"), array('', '', '&', '<', '>'), $t) : $t;
110
$t = $C['tidy'] ? hl_tidy($t, $C['tidy'], $C['parent']) : $t;
111
unset($C, $e);
112
if(isset($reC)){$GLOBALS['C'] = $reC;}
113
if(isset($reS)){$GLOBALS['S'] = $reS;}
114
return $t;
115
// eof
116
}
117
118
function hl_attrval($a, $t, $p){
119
// check attr val against $S
120
static $ma = array('accesskey', 'class', 'rel');
121
$s = in_array($a, $ma) ? ' ' : '';
122
$r = array();
123
$t = !empty($s) ? explode($s, $t) : array($t);
124
foreach($t as $tk=>$tv){
125
 $o = 1; $l = strlen($tv);
126
 foreach($p as $k=>$v){
127
  switch($k){
128
   case 'maxlen': if($l > $v){$o = 0;}
129
   break; case 'minlen': if($l < $v){$o = 0;}
130
   break; case 'maxval': if((float)($tv) > $v){$o = 0;}
131
   break; case 'minval': if((float)($tv) < $v){$o = 0;}
132
   break; case 'match': if(!preg_match($v, $tv)){$o = 0;}
133
   break; case 'nomatch': if(preg_match($v, $tv)){$o = 0;}
134
   break; case 'oneof':
135
    $m = 0;
136
    foreach(explode('|', $v) as $n){if($tv == $n){$m = 1; break;}}
137
    $o = $m;
138
   break; case 'noneof':
139
    $m = 1;
140
    foreach(explode('|', $v) as $n){if($tv == $n){$m = 0; break;}}
141
    $o = $m;
142
   break; default:
143
   break;
144
  }
145
  if(!$o){break;}
146
 }
147
 if($o){$r[] = $tv;}
148
}
149
$r = implode($s, $r);
150
return (isset($r[0]) ? $r : (isset($p['default']) ? $p['default'] : 0));
151
// eof
152
}
153
154
function hl_bal($t, $do=1, $in='div'){
155
// balance tags
156
// by content
157
$cB = array('blockquote'=>1, 'form'=>1, 'map'=>1, 'noscript'=>1); // Block
158
$cE = array('area'=>1, 'br'=>1, 'col'=>1, 'embed'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'isindex'=>1, 'param'=>1); // Empty
159
$cF = array('button'=>1, 'del'=>1, 'div'=>1, 'dd'=>1, 'fieldset'=>1, 'iframe'=>1, 'ins'=>1, 'li'=>1, 'noscript'=>1, 'object'=>1, 'td'=>1, 'th'=>1); // Flow; later context-wise dynamic move of ins & del to $cI
160
$cI = array('a'=>1, 'abbr'=>1, 'acronym'=>1, 'address'=>1, 'b'=>1, 'bdo'=>1, 'big'=>1, 'caption'=>1, 'cite'=>1, 'code'=>1, 'dfn'=>1, 'dt'=>1, 'em'=>1, 'font'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'i'=>1, 'kbd'=>1, 'label'=>1, 'legend'=>1, 'p'=>1, 'pre'=>1, 'q'=>1, 'rb'=>1, 'rt'=>1, 's'=>1, 'samp'=>1, 'small'=>1, 'span'=>1, 'strike'=>1, 'strong'=>1, 'sub'=>1, 'sup'=>1, 'tt'=>1, 'u'=>1, 'var'=>1); // Inline
161
$cN = array('a'=>array('a'=>1), 'button'=>array('a'=>1, 'button'=>1, 'fieldset'=>1, 'form'=>1, 'iframe'=>1, 'input'=>1, 'label'=>1, 'select'=>1, 'textarea'=>1), 'fieldset'=>array('fieldset'=>1), 'form'=>array('form'=>1), 'label'=>array('label'=>1), 'noscript'=>array('script'=>1), 'pre'=>array('big'=>1, 'font'=>1, 'img'=>1, 'object'=>1, 'script'=>1, 'small'=>1, 'sub'=>1, 'sup'=>1), 'rb'=>array('ruby'=>1), 'rt'=>array('ruby'=>1)); // Illegal
162
$cN2 = array_keys($cN);
163
$cR = array('blockquote'=>1, 'dir'=>1, 'dl'=>1, 'form'=>1, 'map'=>1, 'menu'=>1, 'noscript'=>1, 'ol'=>1, 'optgroup'=>1, 'rbc'=>1, 'rtc'=>1, 'ruby'=>1, 'select'=>1, 'table'=>1, 'tbody'=>1, 'tfoot'=>1, 'thead'=>1, 'tr'=>1, 'ul'=>1);
0 ignored issues
show
Unused Code introduced by
The assignment to $cR is dead and can be removed.
Loading history...
164
$cS = array('colgroup'=>array('col'=>1), 'dir'=>array('li'=>1), 'dl'=>array('dd'=>1, 'dt'=>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
165
if($GLOBALS['C']['direct_list_nest']){$cS['ol'] = $cS['ul'] += array('ol'=>1, 'ul'=>1);}
166
$cO = array('address'=>array('p'=>1), 'applet'=>array('param'=>1), 'blockquote'=>array('script'=>1), 'fieldset'=>array('legend'=>1, '#pcdata'=>1), 'form'=>array('script'=>1), 'map'=>array('area'=>1), 'object'=>array('param'=>1, 'embed'=>1)); // Other
167
$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
168
// block/inline type; ins & del both type; #pcdata: text
169
$eB = array('address'=>1, 'blockquote'=>1, 'center'=>1, 'del'=>1, 'dir'=>1, 'dl'=>1, 'div'=>1, 'fieldset'=>1, 'form'=>1, 'ins'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'hr'=>1, 'isindex'=>1, 'menu'=>1, 'noscript'=>1, 'ol'=>1, 'p'=>1, 'pre'=>1, 'table'=>1, 'ul'=>1);
170
$eI = array('#pcdata'=>1, 'a'=>1, 'abbr'=>1, 'acronym'=>1, 'applet'=>1, 'b'=>1, 'bdo'=>1, 'big'=>1, 'br'=>1, 'button'=>1, 'cite'=>1, 'code'=>1, 'del'=>1, 'dfn'=>1, 'em'=>1, 'embed'=>1, 'font'=>1, 'i'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'ins'=>1, 'kbd'=>1, 'label'=>1, 'map'=>1, 'object'=>1, 'q'=>1, 'ruby'=>1, 's'=>1, 'samp'=>1, 'select'=>1, 'script'=>1, 'small'=>1, 'span'=>1, 'strike'=>1, 'strong'=>1, 'sub'=>1, 'sup'=>1, 'textarea'=>1, 'tt'=>1, 'u'=>1, 'var'=>1);
171
if($GLOBALS['C']['allow_for_inline'] && is_array($GLOBALS['C']['allow_for_inline'])) foreach($GLOBALS['C']['allow_for_inline'] as $khai => $vhai) {$eI[$vhai]=1;}//allow table as if it was an inline element as <span> some Text <table>...</table> more text</span> is quite common
172
$eN = array('a'=>1, 'big'=>1, 'button'=>1, 'fieldset'=>1, 'font'=>1, 'form'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'label'=>1, 'object'=>1, 'ruby'=>1, 'script'=>1, 'select'=>1, 'small'=>1, 'sub'=>1, 'sup'=>1, 'textarea'=>1); // Exclude from specific ele; $cN values
173
$eO = array('area'=>1, 'caption'=>1, 'col'=>1, 'colgroup'=>1, 'dd'=>1, 'dt'=>1, 'legend'=>1, 'li'=>1, 'optgroup'=>1, 'option'=>1, 'param'=>1, 'rb'=>1, 'rbc'=>1, 'rp'=>1, 'rt'=>1, 'rtc'=>1, 'script'=>1, 'tbody'=>1, 'td'=>1, 'tfoot'=>1, 'thead'=>1, 'th'=>1, 'tr'=>1); // Missing in $eB & $eI
174
$eF = $eB + $eI;
175
176
// $in sets allowed child
177
$in = ((isset($eF[$in]) && $in != '#pcdata') or isset($eO[$in])) ? $in : 'div';
178
if(isset($cE[$in])){
179
 return (!$do ? '' : str_replace(array('<', '>'), array('&lt;', '&gt;'), $t));
180
}
181
if(isset($cS[$in])){$inOk = $cS[$in];}
182
elseif(isset($cI[$in])){$inOk = $eI; $cI['del'] = 1; $cI['ins'] = 1;}
183
elseif(isset($cF[$in])){$inOk = $eF; unset($cI['del'], $cI['ins']);}
184
elseif(isset($cB[$in])){$inOk = $eB; unset($cI['del'], $cI['ins']);}
185
if(isset($cO[$in])){$inOk = $inOk + $cO[$in];}
186
if(isset($cN[$in])){$inOk = array_diff_assoc($inOk, $cN[$in]);}
187
188
$t = explode('<', $t);
189
$ok = $q = array(); // $q seq list of open non-empty ele
190
ob_start();
191
192
for($i=-1, $ci=count($t); ++$i<$ci;){
193
 // allowed $ok in parent $p
194
 if($ql = count($q)){
195
  $p = array_pop($q);
196
  $q[] = $p;
197
  if(isset($cS[$p])){$ok = $cS[$p];}
198
  elseif(isset($cI[$p])){$ok = $eI; $cI['del'] = 1; $cI['ins'] = 1;}
199
  elseif(isset($cF[$p])){$ok = $eF; unset($cI['del'], $cI['ins']);}
200
  elseif(isset($cB[$p])){$ok = $eB; unset($cI['del'], $cI['ins']);}
201
  if(isset($cO[$p])){$ok = $ok + $cO[$p];}
202
  if(isset($cN[$p])){$ok = array_diff_assoc($ok, $cN[$p]);}
203
 }else{$ok = $inOk; unset($cI['del'], $cI['ins']);}
204
 // bad tags, & ele content
205
 if(isset($e) && ($do == 1 or (isset($ok['#pcdata']) && ($do == 3 or $do == 5)))){
206
  echo '&lt;', $s, $e, $a, '&gt;';
207
 }
208
 if(isset($x[0])){
209
  if(strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))){
210
   echo '<div>', $x, '</div>';
211
  }
212
  elseif($do < 3 or isset($ok['#pcdata'])){echo $x;}
213
  elseif(strpos($x, "\x02\x04")){
214
   foreach(preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v){
215
    echo (substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : ''));
216
   }
217
  }elseif($do > 4){echo preg_replace('`\S`', '', $x);}
218
 }
219
 // get markup
220
 if(!preg_match('`^(/?)([a-z1-6]+)([^>]*)>(.*)`sm', $t[$i], $r)){$x = $t[$i]; continue;}
221
 $s = null; $e = null; $a = null; $x = null; list($all, $s, $e, $a, $x) = $r;
0 ignored issues
show
Unused Code introduced by
The assignment to $s is dead and can be removed.
Loading history...
Unused Code introduced by
The assignment to $x is dead and can be removed.
Loading history...
Unused Code introduced by
The assignment to $e is dead and can be removed.
Loading history...
Unused Code introduced by
The assignment to $a is dead and can be removed.
Loading history...
222
 // close tag
223
 if($s){
224
  if(isset($cE[$e]) or !in_array($e, $q)){continue;} // Empty/unopen
225
  if($p == $e){array_pop($q); echo '</', $e, '>'; unset($e); continue;} // Last open
226
  $add = ''; // Nesting - close open tags that need to be
227
  for($j=-1, $cj=count($q); ++$j<$cj;){
228
   if(($d = array_pop($q)) == $e){break;}
229
   else{$add .= "</{$d}>";}
230
  }
231
  echo $add, '</', $e, '>'; unset($e); continue;
232
 }
233
 // open tag
234
 // $cB ele needs $eB ele as child
235
 if(isset($cB[$e]) && strlen(trim($x))){
236
  $t[$i] = "{$e}{$a}>";
237
  array_splice($t, $i+1, 0, 'div>'. $x); unset($e, $x); ++$ci; --$i; continue;
238
 }
239
 if((($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql)) && !isset($eB[$e]) && !isset($ok[$e])){
240
  array_splice($t, $i, 0, 'div>'); unset($e, $x); ++$ci; --$i; continue;
241
 }
242
 if($e == 'div' && !isset($ok['div']) && strpos($a, '-htmlawed-transform')){
243
  $t[$i] = "span{$a}>{$x}"; unset($e, $x); --$i; continue;
244
 }
245
 // if no open ele, $in = parent; mostly immediate parent-child relation should hold
246
 if(!$ql or !isset($eN[$e]) or !array_intersect($q, $cN2)){
247
  if(!isset($ok[$e])){
248
   if($ql && isset($cT[$p])){echo '</', array_pop($q), '>'; unset($e, $x); --$i;}
249
   continue;
250
  }
251
  if(!isset($cE[$e])){$q[] = $e;}
252
  echo '<', $e, $a, '>'; unset($e); continue;
253
 }
254
 // specific parent-child
255
 if(isset($cS[$p][$e])){
256
  if(!isset($cE[$e])){$q[] = $e;}
257
  echo '<', $e, $a, '>'; unset($e); continue;
258
 }
259
 // nesting
260
 $add = '';
261
 $q2 = array();
262
 for($k=-1, $kc=count($q); ++$k<$kc;){
263
  $d = $q[$k];
264
  $ok2 = array();
265
  if(isset($cS[$d])){$q2[] = $d; continue;}
266
  $ok2 = isset($cI[$d]) ? $eI : $eF;
267
  if(isset($cO[$d])){$ok2 = $ok2 + $cO[$d];}
268
  if(isset($cN[$d])){$ok2 = array_diff_assoc($ok2, $cN[$d]);}
269
  if(!isset($ok2[$e])){
270
   if(!$k && !isset($inOk[$e])){continue 2;}
271
   $add = "</{$d}>";
272
   for(;++$k<$kc;){$add = "</{$q[$k]}>{$add}";}
273
   break;
274
  }
275
  else{$q2[] = $d;}
276
 }
277
 $q = $q2;
278
 if(!isset($cE[$e])){$q[] = $e;}
279
 echo $add, '<', $e, $a, '>'; unset($e); continue;
280
}
281
282
// end
283
if($ql = count($q)){
284
 $p = array_pop($q);
285
 $q[] = $p;
286
 if(isset($cS[$p])){$ok = $cS[$p];}
287
 elseif(isset($cI[$p])){$ok = $eI; $cI['del'] = 1; $cI['ins'] = 1;}
288
 elseif(isset($cF[$p])){$ok = $eF; unset($cI['del'], $cI['ins']);}
289
 elseif(isset($cB[$p])){$ok = $eB; unset($cI['del'], $cI['ins']);}
290
 if(isset($cO[$p])){$ok = $ok + $cO[$p];}
291
 if(isset($cN[$p])){$ok = array_diff_assoc($ok, $cN[$p]);}
292
}else{$ok = $inOk; unset($cI['del'], $cI['ins']);}
293
if(isset($e) && ($do == 1 or (isset($ok['#pcdata']) && ($do == 3 or $do == 5)))){
294
 echo '&lt;', $s, $e, $a, '&gt;';
295
}
296
if(isset($x[0])){
297
 if(strlen(trim($x)) && (($ql && isset($cB[$p])) or (isset($cB[$in]) && !$ql))){
298
  echo '<div>', $x, '</div>';
299
 }
300
 elseif($do < 3 or isset($ok['#pcdata'])){echo $x;}
301
 elseif(strpos($x, "\x02\x04")){
302
  foreach(preg_split('`(\x01\x02[^\x01\x02]+\x02\x01)`', $x, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY) as $v){
303
   echo (substr($v, 0, 2) == "\x01\x02" ? $v : ($do > 4 ? preg_replace('`\S`', '', $v) : ''));
304
  }
305
 }elseif($do > 4){echo preg_replace('`\S`', '', $x);}
306
}
307
while(!empty($q) && ($e = array_pop($q))){echo '</', $e, '>';}
308
$o = ob_get_contents();
309
ob_end_clean();
310
return $o;
311
// eof
312
}
313
314
function hl_cmtcd($t){
315
// comment/CDATA sec handler
316
$t = $t[0];
317
global $C;
318
if(!($v = $C[$n = $t[3] == '-' ? 'comment' : 'cdata'])){return $t;}
319
if($v == 1){return '';}
320
if($n == 'comment'){
321
 if(substr(($t = preg_replace('`--+`', '-', substr($t, 4, -3))), -1) != ' '){$t .= ' ';}
322
}
323
else{$t = substr($t, 1, -1);}
324
$t = $v == 2 ? str_replace(array('&', '<', '>'), array('&amp;', '&lt;', '&gt;'), $t) : $t;
325
return str_replace(array('&', '<', '>'), array("\x03", "\x04", "\x05"), ($n == 'comment' ? "\x01\x02\x04!--$t--\x05\x02\x01" : "\x01\x01\x04$t\x05\x01\x01"));
326
// eof
327
}
328
329
function hl_ent($t){
330
// entitity handler
331
global $C;
332
$t = $t[1];
333
static $U = array('quot'=>1,'amp'=>1,'lt'=>1,'gt'=>1);
334
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');
335
if($t[0] != '#'){
336
 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)). ';';
337
}
338
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))){
339
 return ($C['and_mark'] ? "\x06" : '&'). "amp;#{$t};";
340
}
341
return ($C['and_mark'] ? "\x06" : '&'). '#'. (((ctype_digit($t) && $C['hexdec_entity'] < 2) or !$C['hexdec_entity']) ? $n : 'x'. dechex($n)). ';';
342
// eof
343
}
344
345
function hl_prot($p, $c=null){
346
// check URL scheme
347
global $C;
348
$b = $a = '';
349
if($c == null){$c = 'style'; $b = $p[1]; $a = $p[3]; $p = trim($p[2]);}
350
$c = isset($C['schemes'][$c]) ? $C['schemes'][$c] : $C['schemes']['*'];
351
static $d = 'denied:';
352
if(isset($c['!']) && substr($p, 0, 7) != $d){$p = "$d$p";}
353
if(isset($c['*']) or !strcspn($p, '#?;') or (substr($p, 0, 7) == $d)){return "{$b}{$p}{$a}";} // All ok, frag, query, param
354
if(preg_match('`^([^:?[@!$()*,=/\'\]]+?)(:|&#(58|x3a);|%3a|\\\\0{0,4}3a).`i', $p, $m) && !isset($c[strtolower($m[1])])){ // Denied prot
355
 return "{$b}{$d}{$p}{$a}";
356
}
357
if($C['abs_url']){
358
 if($C['abs_url'] == -1 && strpos($p, $C['base_url']) === 0){ // Make url rel
359
  $p = substr($p, strlen($C['base_url']));
360
 }elseif(empty($m[1])){ // Make URL abs
361
  if(substr($p, 0, 2) == '//'){$p = substr($C['base_url'], 0, strpos($C['base_url'], ':')+1). $p;}
362
  elseif($p[0] == '/'){$p = preg_replace('`(^.+?://[^/]+)(.*)`', '$1', $C['base_url']). $p;}
363
  elseif(strcspn($p, './')){$p = $C['base_url']. $p;}
364
  else{
365
   preg_match('`^([a-zA-Z\d\-+.]+://[^/]+)(.*)`', $C['base_url'], $m);
366
   $p = preg_replace('`(?<=/)\./`', '', $m[2]. $p);
367
   while(preg_match('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', $p)){
368
    $p = preg_replace('`(?<=/)([^/]{3,}|[^/.]+?|\.[^/.]|[^/.]\.)/\.\./`', '', $p);
369
   }
370
   $p = $m[1]. $p;
371
  }
372
 }
373
}
374
return "{$b}{$p}{$a}";
375
// eof
376
}
377
378
function hl_regex($p){
379
// ?regex
380
if(empty($p)){return 0;}
381
if($t = ini_get('track_errors')){$o = isset($php_errormsg) ? $php_errormsg : null;}
382
else{ini_set('track_errors', 1);}
383
unset($php_errormsg);
384
if(($d = ini_get('display_errors'))){ini_set('display_errors', 0);}
385
preg_match($p, '');
386
if($d){ini_set('display_errors', 1);}
387
$r = isset($php_errormsg) ? 0 : 1;
388
if($t){$php_errormsg = isset($o) ? $o : null;}
0 ignored issues
show
Unused Code introduced by
The assignment to $php_errormsg is dead and can be removed.
Loading history...
389
else{ini_set('track_errors', 0);}
390
return $r;
391
// eof
392
}
393
394
function hl_spec($t){
395
// final $spec
396
$s = array();
397
$t = str_replace(array("\t", "\r", "\n", ' '), '', preg_replace_callback('/"(?>(`.|[^"])*)"/sm', create_function('$m', 'return substr(str_replace(array(";", "|", "~", " ", ",", "/", "(", ")", \'`"\'), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", "\""), $m[0]), 1, -1);'), trim($t)));
0 ignored issues
show
Deprecated Code introduced by
The function create_function() has been deprecated: 7.2 ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

397
$t = str_replace(array("\t", "\r", "\n", ' '), '', preg_replace_callback('/"(?>(`.|[^"])*)"/sm', /** @scrutinizer ignore-deprecated */ create_function('$m', 'return substr(str_replace(array(";", "|", "~", " ", ",", "/", "(", ")", \'`"\'), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08", "\""), $m[0]), 1, -1);'), trim($t)));

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
398
for($i = count(($t = explode(';', $t))); --$i>=0;){
399
 $w = $t[$i];
400
 if(empty($w) or ($e = strpos($w, '=')) === false or !strlen(($a =  substr($w, $e+1)))){continue;}
401
 $y = $n = array();
402
 foreach(explode(',', $a) as $v){
403
  if(!preg_match('`^([a-z:\-\*]+)(?:\((.*?)\))?`i', $v, $m)){continue;}
404
  if(($x = strtolower($m[1])) == '-*'){$n['*'] = 1; continue;}
405
  if($x[0] == '-'){$n[substr($x, 1)] = 1; continue;}
406
  if(!isset($m[2])){$y[$x] = 1; continue;}
407
  foreach(explode('/', $m[2]) as $m){
408
   if(empty($m) or ($p = strpos($m, '=')) == 0 or $p < 5){$y[$x] = 1; continue;}
409
   $y[$x][strtolower(substr($m, 0, $p))] = str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", "\x08"), array(";", "|", "~", " ", ",", "/", "(", ")"), substr($m, $p+1));
410
  }
411
  if(isset($y[$x]['match']) && !hl_regex($y[$x]['match'])){unset($y[$x]['match']);}
412
  if(isset($y[$x]['nomatch']) && !hl_regex($y[$x]['nomatch'])){unset($y[$x]['nomatch']);}
413
 }
414
 if(!count($y) && !count($n)){continue;}
415
 foreach(explode(',', substr($w, 0, $e)) as $v){
416
  if(!strlen(($v = strtolower($v)))){continue;}
417
  if(count($y)){$s[$v] = $y;}
418
  if(count($n)){$s[$v]['n'] = $n;}
419
 }
420
}
421
return $s;
422
// eof
423
}
424
425
function hl_tag($t){
426
// tag/attribute handler
427
global $C;
428
$t = $t[0];
429
// invalid < >
430
if($t == '< '){return '&lt; ';}
431
if($t == '>'){return '&gt;';}
432
if(!preg_match('`^<(/?)([a-zA-Z][a-zA-Z1-6]*)([^>]*?)\s?>$`m', $t, $m)){
433
 //return str_replace(array('<', '>'), array('&lt;', '&gt;'), $t);
434
 return (($C['keep_bad']%2) ? str_replace(array('<', '>'), array('&lt;', '&gt;'), $t) : '');
435
}elseif(!isset($C['elements'][($e = strtolower($m[2]))])){
436
 return (($C['keep_bad']%2) ? str_replace(array('<', '>'), array('&lt;', '&gt;'), $t) : '');
437
}
438
// attr string
439
$a = str_replace(array("\n", "\r", "\t"), ' ', trim($m[3]));
440
// tag transform
441
static $eD = array('applet'=>1, 'center'=>1, 'dir'=>1, 'embed'=>1, 'font'=>1, 'isindex'=>1, 'menu'=>1, 's'=>1, 'strike'=>1, 'u'=>1); // Deprecated
442
if($C['make_tag_strict'] && isset($eD[$e])){
443
 $trt = hl_tag2($e, $a, $C['make_tag_strict']);
444
 if(!$e){return (($C['keep_bad']%2) ? str_replace(array('<', '>'), array('&lt;', '&gt;'), $t) : '');}
445
}
446
// close tag
447
static $eE = array('area'=>1, 'br'=>1, 'col'=>1, 'embed'=>1, 'hr'=>1, 'img'=>1, 'input'=>1, 'isindex'=>1, 'param'=>1); // Empty ele
448
if(!empty($m[1])){
449
 return (!isset($eE[$e]) ? (empty($C['hook_tag']) ? "</$e>" : $C['hook_tag']($e)) : (($C['keep_bad'])%2 ? str_replace(array('<', '>'), array('&lt;', '&gt;'), $t) : ''));
450
}
451
// open tag & attr
452
static $aN = array('abbr'=>array('td'=>1, 'th'=>1), 'accept-charset'=>array('form'=>1), 'accept'=>array('form'=>1, 'input'=>1), 'accesskey'=>array('a'=>1, 'area'=>1, 'button'=>1, 'input'=>1, 'label'=>1, 'legend'=>1, 'textarea'=>1), 'action'=>array('form'=>1), 'align'=>array('caption'=>1, 'embed'=>1, 'applet'=>1, 'iframe'=>1, 'img'=>1, 'input'=>1, 'object'=>1, 'legend'=>1, 'table'=>1, 'hr'=>1, 'div'=>1, 'h1'=>1, 'h2'=>1, 'h3'=>1, 'h4'=>1, 'h5'=>1, 'h6'=>1, 'p'=>1, 'col'=>1, 'colgroup'=>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), 'axis'=>array('td'=>1, 'th'=>1), 'bgcolor'=>array('embed'=>1, 'table'=>1, 'tr'=>1, 'td'=>1, 'th'=>1), 'border'=>array('table'=>1, 'img'=>1, 'object'=>1), 'bordercolor'=>array('table'=>1, 'td'=>1, 'tr'=>1), 'cellpadding'=>array('table'=>1), 'cellspacing'=>array('table'=>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('input'=>1), 'cite'=>array('blockquote'=>1, 'q'=>1, 'del'=>1, 'ins'=>1), 'classid'=>array('object'=>1), 'clear'=>array('br'=>1), 'code'=>array('applet'=>1), 'codebase'=>array('object'=>1, 'applet'=>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), 'coords'=>array('area'=>1, 'a'=>1), 'data'=>array('object'=>1), 'datetime'=>array('del'=>1, 'ins'=>1), 'declare'=>array('object'=>1), 'defer'=>array('script'=>1), 'dir'=>array('bdo'=>1), 'disabled'=>array('button'=>1, 'input'=>1, 'optgroup'=>1, 'option'=>1, 'select'=>1, 'textarea'=>1), 'enctype'=>array('form'=>1), 'face'=>array('font'=>1), 'flashvars'=>array('embed'=>1), 'for'=>array('label'=>1), 'frame'=>array('table'=>1), 'frameborder'=>array('iframe'=>1), 'headers'=>array('td'=>1, 'th'=>1), 'height'=>array('embed'=>1, 'iframe'=>1, 'td'=>1, 'th'=>1, 'img'=>1, 'object'=>1, 'applet'=>1), 'href'=>array('a'=>1, 'area'=>1), 'hreflang'=>array('a'=>1), 'hspace'=>array('applet'=>1, 'img'=>1, 'object'=>1), 'ismap'=>array('img'=>1, 'input'=>1), 'label'=>array('option'=>1, 'optgroup'=>1), 'language'=>array('script'=>1), 'longdesc'=>array('img'=>1, 'iframe'=>1), 'marginheight'=>array('iframe'=>1), 'marginwidth'=>array('iframe'=>1), 'maxlength'=>array('input'=>1), 'method'=>array('form'=>1), 'model'=>array('embed'=>1), 'multiple'=>array('select'=>1), 'name'=>array('button'=>1, 'embed'=>1, 'textarea'=>1, 'applet'=>1, 'select'=>1, 'form'=>1, 'iframe'=>1, 'img'=>1, 'a'=>1, 'input'=>1, 'object'=>1, 'map'=>1, 'param'=>1), 'nohref'=>array('area'=>1), 'noshade'=>array('hr'=>1), 'nowrap'=>array('td'=>1, 'th'=>1), 'object'=>array('applet'=>1), 'onblur'=>array('a'=>1, 'area'=>1, 'button'=>1, 'input'=>1, 'label'=>1, 'select'=>1, 'textarea'=>1), 'onchange'=>array('input'=>1, 'select'=>1, 'textarea'=>1), 'onfocus'=>array('a'=>1, 'area'=>1, 'button'=>1, 'input'=>1, 'label'=>1, 'select'=>1, 'textarea'=>1), 'onreset'=>array('form'=>1), 'onselect'=>array('input'=>1, 'textarea'=>1), 'onsubmit'=>array('form'=>1), 'pluginspage'=>array('embed'=>1), 'pluginurl'=>array('embed'=>1), 'prompt'=>array('isindex'=>1), 'readonly'=>array('textarea'=>1, 'input'=>1), 'rel'=>array('a'=>1), 'rev'=>array('a'=>1), 'rows'=>array('textarea'=>1), 'rowspan'=>array('td'=>1, 'th'=>1), 'rules'=>array('table'=>1), 'scope'=>array('td'=>1, 'th'=>1), 'scrolling'=>array('iframe'=>1), 'selected'=>array('option'=>1), 'shape'=>array('area'=>1, 'a'=>1), 'size'=>array('hr'=>1, 'font'=>1, 'input'=>1, 'select'=>1), 'span'=>array('col'=>1, 'colgroup'=>1), 'src'=>array('embed'=>1, 'script'=>1, 'input'=>1, 'iframe'=>1, 'img'=>1), 'standby'=>array('object'=>1), 'start'=>array('ol'=>1), 'summary'=>array('table'=>1), 'tabindex'=>array('a'=>1, 'area'=>1, 'button'=>1, 'input'=>1, 'object'=>1, 'select'=>1, 'textarea'=>1), 'target'=>array('a'=>1, 'area'=>1, 'form'=>1), 'type'=>array('a'=>1, 'embed'=>1, 'object'=>1, 'param'=>1, 'script'=>1, 'input'=>1, 'li'=>1, 'ol'=>1, 'ul'=>1, 'button'=>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('input'=>1, 'option'=>1, 'param'=>1, 'button'=>1, 'li'=>1), 'valuetype'=>array('param'=>1), 'vspace'=>array('applet'=>1, 'img'=>1, 'object'=>1), 'width'=>array('embed'=>1, 'hr'=>1, 'iframe'=>1, 'img'=>1, 'object'=>1, 'table'=>1, 'td'=>1, 'th'=>1, 'applet'=>1, 'col'=>1, 'colgroup'=>1, 'pre'=>1), 'wmode'=>array('embed'=>1), 'xml:space'=>array('pre'=>1, 'script'=>1, 'style'=>1)); // Ele-specific
453
$aN['background']=(isset($aN['background'])?array_merge($aN['background'],array('td'=>1)):array('td'=>1));//allow attribute background for (additional) elements, its not allowed by HTML Standards exept for body, but used anyway; one should check for the url to be allowed by application means
454
static $aNE = array('allowfullscreen'=>1, 'checked'=>1, 'compact'=>1, 'declare'=>1, 'defer'=>1, 'disabled'=>1, 'ismap'=>1, 'multiple'=>1, 'nohref'=>1, 'noresize'=>1, 'noshade'=>1, 'nowrap'=>1, 'readonly'=>1, 'selected'=>1); // Empty
455
static $aNP = array('action'=>1, 'cite'=>1, 'classid'=>1, 'codebase'=>1, 'data'=>1, 'href'=>1, 'longdesc'=>1, 'model'=>1, 'pluginspage'=>1, 'pluginurl'=>1, 'usemap'=>1); // Need scheme check; excludes style, on* & src
456
static $aNU = array('class'=>array('param'=>1, 'script'=>1), 'dir'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'iframe'=>1, 'param'=>1, 'script'=>1), 'id'=>array('script'=>1), 'lang'=>array('applet'=>1, 'br'=>1, 'iframe'=>1, 'param'=>1, 'script'=>1), 'xml:lang'=>array('applet'=>1, 'br'=>1, 'iframe'=>1, 'param'=>1, 'script'=>1), 'onclick'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'ondblclick'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onkeydown'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onkeypress'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onkeyup'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onmousedown'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onmousemove'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onmouseout'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onmouseover'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'onmouseup'=>array('applet'=>1, 'bdo'=>1, 'br'=>1, 'font'=>1, 'iframe'=>1, 'isindex'=>1, 'param'=>1, 'script'=>1), 'style'=>array('param'=>1, 'script'=>1), 'title'=>array('param'=>1, 'script'=>1)); // Univ & exceptions
457
458
if($C['lc_std_val']){
459
 // predef attr vals for $eAL & $aNE ele
460
 static $aNL = array('all'=>1, 'baseline'=>1, 'bottom'=>1, 'button'=>1, 'center'=>1, 'char'=>1, 'checkbox'=>1, 'circle'=>1, 'col'=>1, 'colgroup'=>1, 'cols'=>1, 'data'=>1, 'default'=>1, 'file'=>1, 'get'=>1, 'groups'=>1, 'hidden'=>1, 'image'=>1, 'justify'=>1, 'left'=>1, 'ltr'=>1, 'middle'=>1, 'none'=>1, 'object'=>1, 'password'=>1, 'poly'=>1, 'post'=>1, 'preserve'=>1, 'radio'=>1, 'rect'=>1, 'ref'=>1, 'reset'=>1, 'right'=>1, 'row'=>1, 'rowgroup'=>1, 'rows'=>1, 'rtl'=>1, 'submit'=>1, 'text'=>1, 'top'=>1);
461
 static $eAL = array('a'=>1, 'area'=>1, 'bdo'=>1, 'button'=>1, 'col'=>1, 'form'=>1, 'img'=>1, 'input'=>1, 'object'=>1, 'optgroup'=>1, 'option'=>1, 'param'=>1, 'script'=>1, 'select'=>1, 'table'=>1, 'td'=>1, 'tfoot'=>1, 'th'=>1, 'thead'=>1, 'tr'=>1, 'xml:space'=>1);
462
 $lcase = isset($eAL[$e]) ? 1 : 0;
463
}
464
465
$depTr = 0;
466
if($C['no_deprecated_attr']){
467
 // dep attr:applicable ele
468
 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('img'=>1, 'object'=>1), 'bordercolor'=>array('table'=>1, 'td'=>1, 'tr'=>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), 'start'=>array('ol'=>1), 'type'=>array('li'=>1, 'ol'=>1, 'ul'=>1), 'value'=>array('li'=>1), 'vspace'=>array('img'=>1, 'object'=>1), 'width'=>array('hr'=>1, 'pre'=>1, 'td'=>1, 'th'=>1));
469
 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, 'li'=>1, 'map'=>1, 'object'=>1, 'ol'=>1, 'p'=>1, 'pre'=>1, 'script'=>1, 'table'=>1, 'td'=>1, 'th'=>1, 'tr'=>1, 'ul'=>1);
470
 $depTr = isset($eAD[$e]) ? 1 : 0;
471
}
472
473
// attr name-vals
474
if(strpos($a, "\x01") !== false){$a = preg_replace('`\x01[^\x01]*\x01`', '', $a);} // No comment/CDATA sec
475
$mode = 0; $a = trim($a, ' /'); $aA = array();
476
while(strlen($a)){
477
 $w = 0;
478
 switch($mode){
479
  case 0: // Name
480
   if(preg_match('`^[a-zA-Z][\-a-zA-Z:]+`', $a, $m)){
481
    $nm = strtolower($m[0]);
482
    $w = $mode = 1; $a = ltrim(substr_replace($a, '', 0, strlen($m[0])));
483
   }
484
  break; case 1:
485
   if($a[0] == '='){ // =
486
    $w = 1; $mode = 2; $a = ltrim($a, '= ');
487
   }else{ // No val
488
    $w = 1; $mode = 0; $a = ltrim($a);
489
    $aA[$nm] = '';
490
   }
491
  break; case 2: // Val
492
   if(preg_match('`^((?:"[^"]*")|(?:\'[^\']*\')|(?:\s*[^\s"\']+))(.*)`', $a, $m)){
493
    $a = ltrim($m[2]); $m = $m[1]; $w = 1; $mode = 0;
494
    $aA[$nm] = trim(str_replace('<', '&lt;', ($m[0] == '"' or $m[0] == '\'') ? substr($m, 1, -1) : $m));
495
   }
496
  break;
497
 }
498
 if($w == 0){ // Parse errs, deal with space, " & '
499
  $a = preg_replace('`^(?:"[^"]*("|$)|\'[^\']*(\'|$)|\S)*\s*`', '', $a);
500
  $mode = 0;
501
 }
502
}
503
if($mode == 1){$aA[$nm] = '';}
504
505
// clean attrs
506
global $S;
507
$rl = isset($S[$e]) ? $S[$e] : array();
508
$a = array(); $nfr = 0;
509
foreach($aA as $k=>$v){
510
  if(((isset($C['deny_attribute']['*']) ? isset($C['deny_attribute'][$k]) : !isset($C['deny_attribute'][$k])) && (isset($aN[$k][$e]) or (isset($aNU[$k]) && !isset($aNU[$k][$e]))) && !isset($rl['n'][$k]) && !isset($rl['n']['*'])) or isset($rl[$k])){
511
  if(isset($aNE[$k])){$v = $k;}
512
  elseif(!empty($lcase) && (($e != 'button' or $e != 'input') or $k == 'type')){ // Rather loose but ?not cause issues
513
   $v = (isset($aNL[($v2 = strtolower($v))])) ? $v2 : $v;
514
  }
515
  if($k == 'style' && !$C['style_pass']){
516
   if(false !== strpos($v, '&#')){
517
    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;'=>'\\');
518
    $v = strtr($v, $sC);
519
   }
520
   $v = preg_replace_callback('`(url(?:\()(?: )*(?:\'|"|&(?:quot|apos);)?)(.+?)((?:\'|"|&(?:quot|apos);)?(?: )*(?:\)))`iS', 'hl_prot', $v);
521
   $v = !$C['css_expression'] ? preg_replace('`expression`i', ' ', preg_replace('`\\\\\S|(/|(%2f))(\*|(%2a))`i', ' ', $v)) : $v;
522
  }elseif(isset($aNP[$k]) or strpos($k, 'src') !== false or $k[0] == 'o'){
523
   $v = str_replace("­", ' ', (strpos($v, '&') !== false ? str_replace(array('&#xad;', '&#173;', '&shy;'), ' ', $v) : $v)); # double-quoted char is soft-hyphen; appears here as "­" or hyphen or something else depending on viewing software
524
   $v = hl_prot($v, $k);
525
   if($k == 'href'){ // X-spam
526
    if($C['anti_mail_spam'] && strpos($v, 'mailto:') === 0){
527
     $v = str_replace('@', htmlspecialchars($C['anti_mail_spam']), $v);
528
    }elseif($C['anti_link_spam']){
529
     $r1 = $C['anti_link_spam'][1];
530
     if(!empty($r1) && preg_match($r1, $v)){continue;}
531
     $r0 = $C['anti_link_spam'][0];
532
     if(!empty($r0) && preg_match($r0, $v)){
533
      if(isset($a['rel'])){
534
       if(!preg_match('`\bnofollow\b`i', $a['rel'])){$a['rel'] .= ' nofollow';}
535
      }elseif(isset($aA['rel'])){
536
       if(!preg_match('`\bnofollow\b`i', $aA['rel'])){$nfr = 1;}
537
      }else{$a['rel'] = 'nofollow';}
538
     }
539
    }
540
   }
541
  }
542
  if(isset($rl[$k]) && is_array($rl[$k]) && ($v = hl_attrval($k, $v, $rl[$k])) === 0){continue;}
543
  $a[$k] = str_replace('"', '&quot;', $v);
544
 }
545
}
546
if($nfr){$a['rel'] = isset($a['rel']) ? $a['rel']. ' nofollow' : 'nofollow';}
547
548
// rqd attr
549
static $eAR = array('area'=>array('alt'=>'area'), 'bdo'=>array('dir'=>'ltr'), 'form'=>array('action'=>''), 'img'=>array('src'=>'', 'alt'=>'image'), 'map'=>array('name'=>''), 'optgroup'=>array('label'=>''), 'param'=>array('name'=>''), 'script'=>array('type'=>'text/javascript'), 'textarea'=>array('rows'=>'10', 'cols'=>'50'));
550
if(isset($eAR[$e])){
551
 foreach($eAR[$e] as $k=>$v){
552
  if(!isset($a[$k])){$a[$k] = isset($v[0]) ? $v : $k;}
553
 }
554
}
555
556
// depr attrs
557
if($depTr){
558
 $c = array();
559
 foreach($a as $k=>$v){
560
  if($k == 'style' or !isset($aND[$k][$e])){continue;}
561
  if($k == 'align'){
562
   unset($a['align']);
563
   if($e == 'img' && ($v == 'left' or $v == 'right')){$c[] = 'float: '. $v;}
564
   elseif(($e == 'div' or $e == 'table') && $v == 'center'){$c[] = 'margin: auto';}
565
   else{$c[] = 'text-align: '. $v;}
566
  }elseif($k == 'bgcolor'){
567
   unset($a['bgcolor']);
568
   $c[] = 'background-color: '. $v;
569
  }elseif($k == 'border'){
570
   unset($a['border']); $c[] = "border: {$v}px";
571
  }elseif($k == 'bordercolor'){
572
   unset($a['bordercolor']); $c[] = 'border-color: '. $v;
573
  }elseif($k == 'clear'){
574
   unset($a['clear']); $c[] = 'clear: '. ($v != 'all' ? $v : 'both');
575
  }elseif($k == 'compact'){
576
   unset($a['compact']); $c[] = 'font-size: 85%';
577
  }elseif($k == 'height' or $k == 'width'){
578
   unset($a[$k]); $c[] = $k. ': '. ($v[0] != '*' ? $v. (ctype_digit($v) ? 'px' : '') : 'auto');
579
  }elseif($k == 'hspace'){
580
   unset($a['hspace']); $c[] = "margin-left: {$v}px; margin-right: {$v}px";
581
  }elseif($k == 'language' && !isset($a['type'])){
582
   unset($a['language']);
583
   $a['type'] = 'text/'. strtolower($v);
584
  }elseif($k == 'name'){
585
   if($C['no_deprecated_attr'] == 2 or ($e != 'a' && $e != 'map')){unset($a['name']);}
586
   if(!isset($a['id']) && preg_match('`[a-zA-Z][a-zA-Z\d.:_\-]*`', $v)){$a['id'] = $v;}
587
  }elseif($k == 'noshade'){
588
   unset($a['noshade']); $c[] = 'border-style: none; border: 0; background-color: gray; color: gray';
589
  }elseif($k == 'nowrap'){
590
   unset($a['nowrap']); $c[] = 'white-space: nowrap';
591
  }elseif($k == 'size'){
592
   unset($a['size']); $c[] = 'size: '. $v. 'px';
593
  }elseif($k == 'start' or $k == 'value'){
594
   unset($a[$k]);
595
  }elseif($k == 'type'){
596
   unset($a['type']);
597
   static $ol_type = array('i'=>'lower-roman', 'I'=>'upper-roman', 'a'=>'lower-latin', 'A'=>'upper-latin', '1'=>'decimal');
598
   $c[] = 'list-style-type: '. (isset($ol_type[$v]) ? $ol_type[$v] : 'decimal');
599
  }elseif($k == 'vspace'){
600
   unset($a['vspace']); $c[] = "margin-top: {$v}px; margin-bottom: {$v}px";
601
  }
602
 }
603
 if(count($c)){
604
  $c = implode('; ', $c);
605
  $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;'). '; '. $c. ';': $c. ';';
606
 }
607
}
608
// unique ID
609
if($C['unique_ids'] && isset($a['id'])){
610
 if(!preg_match('`^[A-Za-z][A-Za-z0-9_\-.:]*$`', ($id = $a['id'])) or (isset($GLOBALS['hl_Ids'][$id]) && $C['unique_ids'] == 1)){unset($a['id']);
611
 }else{
612
  while(isset($GLOBALS['hl_Ids'][$id])){$id = $C['unique_ids']. $id;}
613
  $GLOBALS['hl_Ids'][($a['id'] = $id)] = 1;
614
 }
615
}
616
// xml:lang
617
if($C['xml:lang'] && isset($a['lang'])){
618
 $a['xml:lang'] = isset($a['xml:lang']) ? $a['xml:lang'] : $a['lang'];
619
 if($C['xml:lang'] == 2){unset($a['lang']);}
620
}
621
// for transformed tag
622
if(!empty($trt)){
623
 $a['style'] = isset($a['style']) ? rtrim($a['style'], ' ;'). '; '. $trt : $trt;
624
}
625
// return with empty ele /
626
if(empty($C['hook_tag'])){
627
 $aA = '';
628
 foreach($a as $k=>$v){$aA .= " {$k}=\"{$v}\"";}
629
 return "<{$e}{$aA}". (isset($eE[$e]) ? ' /' : ''). '>';
630
}
631
else{return $C['hook_tag']($e, $a);}
632
// eof
633
}
634
635
function hl_tag2(&$e, &$a, $t=1){
636
// transform tag
637
if($e == 'center'){$e = 'div'; return 'text-align: center;';}
638
if($e == 'dir' or $e == 'menu'){$e = 'ul'; return '';}
639
if($e == 's' or $e == 'strike'){$e = 'span'; return 'text-decoration: line-through;';}
640
if($e == 'u'){$e = 'span'; return 'text-decoration: underline;';}
641
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%');
642
if($e == 'font' && $t !=3){//3 is a new make_tag_strict config value, to indicate that transformation is to be performed, but don't transform font, as size transformation of numeric sizes to keywords alters the intended result too much
643
 $a2 = '';
644
 while(preg_match('`(^|\s)(color|size)\s*=\s*(\'|")?(.+?)(\\3|\s|$)`i', $a, $m)){
645
  $a = str_replace($m[0], ' ', $a);
646
  $a2 .= strtolower($m[2]) == 'color' ? (' color: '. str_replace('"', '\'', trim($m[4])). ';') : (isset($fs[($m = trim($m[4]))]) ? ($a2 .= ' font-size: '. str_replace('"', '\'', $fs[$m]). ';') : '');
647
 }
648
 while(preg_match('`(^|\s)face\s*=\s*(\'|")?([^=]+?)\\2`i', $a, $m) or preg_match('`(^|\s)face\s*=(\s*)(\S+)`i', $a, $m)){
649
  $a = str_replace($m[0], ' ', $a);
650
  $a2 .= ' font-family: '. str_replace('"', '\'', trim($m[3])). ';';
651
 }
652
 $e = 'span'; return ltrim(str_replace('<', '', $a2));
653
}
654
if($t == 2){$e = 0; return 0;}
655
return '';
656
// eof
657
}
658
659
function hl_tidy($t, $w, $p){
660
// Tidy/compact HTM
661
if(strpos(' pre,script,textarea', "$p,")){return $t;}
662
$t = preg_replace('`\s+`', ' ', preg_replace_callback(array('`(<(!\[CDATA\[))(.+?)(\]\]>)`sm', '`(<(!--))(.+?)(-->)`sm', '`(<(pre|script|textarea)[^>]*?>)(.+?)(</\2>)`sm'), create_function('$m', 'return $m[1]. str_replace(array("<", ">", "\n", "\r", "\t", " "), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), $m[3]). $m[4];'), $t));
0 ignored issues
show
Deprecated Code introduced by
The function create_function() has been deprecated: 7.2 ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

662
$t = preg_replace('`\s+`', ' ', preg_replace_callback(array('`(<(!\[CDATA\[))(.+?)(\]\]>)`sm', '`(<(!--))(.+?)(-->)`sm', '`(<(pre|script|textarea)[^>]*?>)(.+?)(</\2>)`sm'), /** @scrutinizer ignore-deprecated */ create_function('$m', 'return $m[1]. str_replace(array("<", ">", "\n", "\r", "\t", " "), array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), $m[3]). $m[4];'), $t));

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
663
if(($w = strtolower($w)) == -1){
664
 return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t);
665
}
666
$s = strpos(" $w", 't') ? "\t" : ' ';
667
$s = preg_match('`\d`', $w, $m) ? str_repeat($s, $m[0]) : str_repeat($s, ($s == "\t" ? 1 : 2));
668
$N = preg_match('`[ts]([1-9])`', $w, $m) ? $m[1] : 0;
669
$a = array('br'=>1);
670
$b = array('button'=>1, 'input'=>1, 'option'=>1, 'param'=>1);
671
$c = array('caption'=>1, 'dd'=>1, 'dt'=>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, 'td'=>1, 'textarea'=>1, 'th'=>1);
672
$d = array('address'=>1, 'blockquote'=>1, 'center'=>1, 'colgroup'=>1, 'dir'=>1, 'div'=>1, 'dl'=>1, 'fieldset'=>1, 'form'=>1, 'hr'=>1, 'iframe'=>1, 'map'=>1, 'menu'=>1, 'noscript'=>1, 'ol'=>1, 'optgroup'=>1, 'rbc'=>1, 'rtc'=>1, 'ruby'=>1, 'script'=>1, 'select'=>1, 'table'=>1, 'tbody'=>1, 'tfoot'=>1, 'thead'=>1, 'tr'=>1, 'ul'=>1);
673
$T = explode('<', $t);
674
$X = 1;
675
while($X){
676
 $n = $N;
677
 $t = $T;
678
 ob_start();
679
 if(isset($d[$p])){echo str_repeat($s, ++$n);}
680
 echo ltrim(array_shift($t));
681
 for($i=-1, $j=count($t); ++$i<$j;){
682
  $r = ''; list($e, $r) = explode('>', $t[$i]);
0 ignored issues
show
Unused Code introduced by
The assignment to $r is dead and can be removed.
Loading history...
683
  $x = $e[0] == '/' ? 0 : (substr($e, -1) == '/' ? 1 : ($e[0] != '!' ? 2 : -1));
684
  $y = !$x ? ltrim($e, '/') : ($x > 0 ? substr($e, 0, strcspn($e, ' ')) : 0);
685
  $e = "<$e>";
686
  if(isset($d[$y])){
687
   if(!$x){
688
    if($n){echo "\n", str_repeat($s, --$n), "$e\n", str_repeat($s, $n);}
689
    else{++$N; ob_end_clean(); continue 2;}
690
   }
691
   else{echo "\n", str_repeat($s, $n), "$e\n", str_repeat($s, ($x != 1 ? ++$n : $n));}
692
   echo $r; continue;
693
  }
694
  $f = "\n". str_repeat($s, $n);
695
  if(isset($c[$y])){
696
   if(!$x){echo $e, $f, $r;}
697
   else{echo $f, $e, $r;}
698
  }elseif(isset($b[$y])){echo $f, $e, $r;
699
  }elseif(isset($a[$y])){echo $e, $f, $r;
700
  }elseif(!$y){echo $f, $e, $f, $r;
701
  }else{echo $e, $r;}
702
 }
703
 $X = 0;
704
}
705
$t = str_replace(array("\n ", " \n"), "\n", preg_replace('`[\n]\s*?[\n]+`', "\n", ob_get_contents()));
706
ob_end_clean();
707
if(($l = strpos(" $w", 'r') ? (strpos(" $w", 'n') ? "\r\n" : "\r") : 0)){
708
 $t = str_replace("\n", $l, $t);
709
}
710
return str_replace(array("\x01", "\x02", "\x03", "\x04", "\x05", "\x07"), array('<', '>', "\n", "\r", "\t", ' '), $t);
711
// eof
712
}
713
714
function hl_version(){
715
// rel
716
return '1.1.22';
717
// eof
718
}
719
720
function kses($t, $h, $p=array('http', 'https', 'ftp', 'news', 'nntp', 'telnet', 'gopher', 'mailto')){
721
// kses compat
722
foreach($h as $k=>$v){
723
 $h[$k]['n']['*'] = 1;
724
}
725
$C['cdata'] = $C['comment'] = $C['make_tag_strict'] = $C['no_deprecated_attr'] = $C['unique_ids'] = 0;
0 ignored issues
show
Comprehensibility Best Practice introduced by
$C was never initialized. Although not strictly required by PHP, it is generally a good practice to add $C = array(); before regardless.
Loading history...
726
$C['keep_bad'] = 1;
727
$C['elements'] = count($h) ? strtolower(implode(',', array_keys($h))) : '-*';
728
$C['hook'] = 'kses_hook';
729
$C['schemes'] = '*:'. implode(',', $p);
730
return htmLawed($t, $C, $h);
731
// eof
732
}
733
734
function kses_hook($t, &$C, &$S){
0 ignored issues
show
Unused Code introduced by
The parameter $S is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

734
function kses_hook($t, &$C, /** @scrutinizer ignore-unused */ &$S){

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $C is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

734
function kses_hook($t, /** @scrutinizer ignore-unused */ &$C, &$S){

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
735
// kses compat
736
return $t;
737
// eof
738
}
739