<?php

function wptexturize($text) {
    global 
$wp_cockneyreplace;
    
$next true;
    
$output '';
    
$curl '';
    
$textarr preg_split('/(<.*>|\[.*\])/Us'$text, -1PREG_SPLIT_DELIM_CAPTURE);
    
$stop count($textarr);

    
// if a plugin has provided an autocorrect array, use it
    
if ( isset($wp_cockneyreplace) ) {
        
$cockney array_keys($wp_cockneyreplace);
        
$cockneyreplace array_values($wp_cockneyreplace);
    } else {
        
$cockney = array("'tain't","'twere","'twas","'tis","'twill","'til","'bout","'nuff","'round","'cause");
        
$cockneyreplace = array("&#8217;tain&#8217;t","&#8217;twere","&#8217;twas","&#8217;tis","&#8217;twill","&#8217;til","&#8217;bout","&#8217;nuff","&#8217;round","&#8217;cause");
    }

    
$static_characters array_merge(array('---'' -- ''--''xn&#8211;''...''``''\'s''\'\''' (tm)'), $cockney);
    
$static_replacements array_merge(array('&#8212;'' &#8212; ''&#8211;''xn--''&#8230;''&#8220;''&#8217;s''&#8221;'' &#8482;'), $cockneyreplace);

    
$dynamic_characters = array('/\'(\d\d(?:&#8217;|\')?s)/''/(\s|\A|")\'/''/(\d+)"/''/(\d+)\'/''/(\S)\'([^\'\s])/''/(\s|\A)"(?!\s)/''/"(\s|\S|\Z)/''/\'([\s.]|\Z)/''/(\d+)x(\d+)/');
    
$dynamic_replacements = array('&#8217;$1','$1&#8216;''$1&#8243;''$1&#8242;''$1&#8217;$2''$1&#8220;$2''&#8221;$1''&#8217;$1''$1&#215;$2');
    
    
$exclude_list = array();
    for ( 
$i 0$i $stop$i++ ) {
         
$curl $textarr[$i];

        if (isset(
$curl{0}) && '<' != $curl{0} && '[' != $curl{0} && $next) { // If it's not a tag
            // static strings
            
$curl str_replace($static_characters$static_replacements$curl);
            
// regular expressions
            
$curl preg_replace($dynamic_characters$dynamic_replacements$curl);
        } elseif (
strpos($curl'<code') !== false || strpos($curl'<pre') !== false || strpos($curl'<kbd') !== false || strpos($curl'<style') !== false || strpos($curl'<script') !== false) {
            
$next false;
            
preg_match('/<([a-z]+)/i'$curl$tag);
            
$exclude_list[] = '</' $tag[1];
        } elseif(
count($exclude_list) == 0) {
            
$next true;
        } elseif (
strpos($curlend($exclude_list)) !== false) {
            
$next true;
            
array_pop($exclude_list);
        }
        
        
$curl preg_replace('/&([^#])(?![a-zA-Z1-4]{1,8};)/''&#038;$1'$curl);
        
$output .= $curl;
    }

      return 
$output;
}

// Accepts matches array from preg_replace_callback in wpautop()
// or a string
function clean_pre($matches) {
    if ( 
is_array($matches) )
        
$text $matches[1] . $matches[2] . "</pre>";
    else
        
$text $matches;

    
$text str_replace('<br />'''$text);
    
$text str_replace('<p>'"\n"$text);
    
$text str_replace('</p>'''$text);

    return 
$text;
}

function 
wpautop($pee$br 1) {
    
$pee $pee "\n"// just to make things a little easier, pad the end
    
$pee preg_replace('|<br />\s*<br />|'"\n\n"$pee);
    
// Space things out a little
    
$allblocks '(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|map|area|blockquote|address|math|style|input|p|h[1-6]|hr)';
    
$pee preg_replace('!(<' $allblocks '[^>]*>)!'"\n$1"$pee);
    
$pee preg_replace('!(</' $allblocks '>)!'"$1\n\n"$pee);
    
$pee str_replace(array("\r\n""\r"), "\n"$pee); // cross-platform newlines
    
if ( strpos($pee'<object') !== false ) {
        
$pee preg_replace('|\s*<param([^>]*)>\s*|'"<param$1>"$pee); // no pee inside object/embed
        
$pee preg_replace('|\s*</embed>\s*|''</embed>'$pee);
    }
    
$pee preg_replace("/\n\n+/""\n\n"$pee); // take care of duplicates
    
$pee preg_replace('/\n?(.+?)(?:\n\s*\n|\z)/s'"<p>$1</p>\n"$pee); // make paragraphs, including one at the end
    
$pee preg_replace('|<p>\s*?</p>|'''$pee); // under certain strange conditions it could create a P of entirely whitespace
    
$pee preg_replace('!<p>([^<]+)\s*?(</(?:div|address|form)[^>]*>)!'"<p>$1</p>$2"$pee);
    
$pee preg_replace'|<p>|'"$1<p>"$pee );
    
$pee preg_replace('!<p>\s*(</?' $allblocks '[^>]*>)\s*</p>!'"$1"$pee); // don't pee all over a tag
    
$pee preg_replace("|<p>(<li.+?)</p>|""$1"$pee); // problem with nested lists
    
$pee preg_replace('|<p><blockquote([^>]*)>|i'"<blockquote$1><p>"$pee);
    
$pee str_replace('</blockquote></p>''</p></blockquote>'$pee);
    
$pee preg_replace('!<p>\s*(</?' $allblocks '[^>]*>)!'"$1"$pee);
    
$pee preg_replace('!(</?' $allblocks '[^>]*>)\s*</p>!'"$1"$pee);
    if (
$br) {
        
$pee preg_replace_callback('/<(script|style).*?<\/\\1>/s'create_function('$matches''return str_replace("\n", "<WPPreserveNewline />", $matches[0]);'), $pee);
        
$pee preg_replace('|(?<!<br />)\s*\n|'"<br />\n"$pee); // optionally make line breaks
        
$pee str_replace('<WPPreserveNewline />'"\n"$pee);
    }
    
$pee preg_replace('!(</?' $allblocks '[^>]*>)\s*<br />!'"$1"$pee);
    
$pee preg_replace('!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)[^>]*>)!''$1'$pee);
    if (
strpos($pee'<pre') !== false)
        
$pee preg_replace_callback('!(<pre.*?>)(.*?)</pre>!is''clean_pre'$pee );
    
$pee preg_replace"|\n</p>$|"'</p>'$pee );
    
$pee preg_replace('/<p>\s*?(' get_shortcode_regex() . ')\s*<\/p>/s''$1'$pee); // don't auto-p wrap shortcodes that stand alone

    
return $pee;
}


function 
seems_utf8($Str) { # by bmorel at ssi dot fr
    
$length strlen($Str);
    for (
$i=0$i $length$i++) {
        if (
ord($Str[$i]) < 0x80) continue; # 0bbbbbbb
        
elseif ((ord($Str[$i]) & 0xE0) == 0xC0$n=1# 110bbbbb
        
elseif ((ord($Str[$i]) & 0xF0) == 0xE0$n=2# 1110bbbb
        
elseif ((ord($Str[$i]) & 0xF8) == 0xF0$n=3# 11110bbb
        
elseif ((ord($Str[$i]) & 0xFC) == 0xF8$n=4# 111110bb
        
elseif ((ord($Str[$i]) & 0xFE) == 0xFC$n=5# 1111110b
        
else return false# Does not match any model
        
for ($j=0$j<$n$j++) { # n bytes matching 10bbbbbb follow ?
            
if ((++$i == $length) || ((ord($Str[$i]) & 0xC0) != 0x80))
            return 
false;
        }
    }
    return 
true;
}

function 
wp_specialchars$text$quotes ) {
    
// Like htmlspecialchars except don't double-encode HTML entities
    
$text str_replace('&&''&#038;&'$text);
    
$text str_replace('&&''&#038;&'$text);
    
$text preg_replace('/&(?:$|([^#])(?![a-z1-4]{1,8};))/''&#038;$1'$text);
    
$text str_replace('<''&lt;'$text);
    
$text str_replace('>''&gt;'$text);
    if ( 
'double' === $quotes ) {
        
$text str_replace('"''&quot;'$text);
    } elseif ( 
'single' === $quotes ) {
        
$text str_replace("'"'&#039;'$text);
    } elseif ( 
$quotes ) {
        
$text str_replace('"''&quot;'$text);
        
$text str_replace("'"'&#039;'$text);
    }
    return 
$text;
}

function 
utf8_uri_encode$utf8_string$length ) {
    
$unicode '';
    
$values = array();
    
$num_octets 1;
    
$unicode_length 0;

    
$string_length strlen$utf8_string );
    for (
$i 0$i $string_length$i++ ) {

        
$value ord$utf8_string$i ] );

        if ( 
$value 128 ) {
            if ( 
$length && ( $unicode_length >= $length ) )
                break;
            
$unicode .= chr($value);
            
$unicode_length++;
        } else {
            if ( 
count$values ) == $num_octets = ( $value 224 ) ? 3;

            
$values[] = $value;

            if ( 
$length && ( $unicode_length + ($num_octets 3) ) > $length )
                break;
            if ( 
count$values ) == $num_octets ) {
                if (
$num_octets == 3) {
                    
$unicode .= '%' dechex($values[0]) . '%' dechex($values[1]) . '%' dechex($values[2]);
                    
$unicode_length += 9;
                } else {
                    
$unicode .= '%' dechex($values[0]) . '%' dechex($values[1]);
                    
$unicode_length += 6;
                }

                
$values = array();
                
$num_octets 1;
            }
        }
    }

    return 
$unicode;
}

function 
remove_accents($string) {
    if ( !
preg_match('/[\x80-\xff]/'$string) )
        return 
$string;

    if (
seems_utf8($string)) {
        
$chars = array(
        
// Decompositions for Latin-1 Supplement
        
chr(195).chr(128) => 'A'chr(195).chr(129) => 'A',
        
chr(195).chr(130) => 'A'chr(195).chr(131) => 'A',
        
chr(195).chr(132) => 'A'chr(195).chr(133) => 'A',
        
chr(195).chr(135) => 'C'chr(195).chr(136) => 'E',
        
chr(195).chr(137) => 'E'chr(195).chr(138) => 'E',
        
chr(195).chr(139) => 'E'chr(195).chr(140) => 'I',
        
chr(195).chr(141) => 'I'chr(195).chr(142) => 'I',
        
chr(195).chr(143) => 'I'chr(195).chr(145) => 'N',
        
chr(195).chr(146) => 'O'chr(195).chr(147) => 'O',
        
chr(195).chr(148) => 'O'chr(195).chr(149) => 'O',
        
chr(195).chr(150) => 'O'chr(195).chr(153) => 'U',
        
chr(195).chr(154) => 'U'chr(195).chr(155) => 'U',
        
chr(195).chr(156) => 'U'chr(195).chr(157) => 'Y',
        
chr(195).chr(159) => 's'chr(195).chr(160) => 'a',
        
chr(195).chr(161) => 'a'chr(195).chr(162) => 'a',
        
chr(195).chr(163) => 'a'chr(195).chr(164) => 'a',
        
chr(195).chr(165) => 'a'chr(195).chr(167) => 'c',
        
chr(195).chr(168) => 'e'chr(195).chr(169) => 'e',
        
chr(195).chr(170) => 'e'chr(195).chr(171) => 'e',
        
chr(195).chr(172) => 'i'chr(195).chr(173) => 'i',
        
chr(195).chr(174) => 'i'chr(195).chr(175) => 'i',
        
chr(195).chr(177) => 'n'chr(195).chr(178) => 'o',
        
chr(195).chr(179) => 'o'chr(195).chr(180) => 'o',
        
chr(195).chr(181) => 'o'chr(195).chr(182) => 'o',
        
chr(195).chr(182) => 'o'chr(195).chr(185) => 'u',
        
chr(195).chr(186) => 'u'chr(195).chr(187) => 'u',
        
chr(195).chr(188) => 'u'chr(195).chr(189) => 'y',
        
chr(195).chr(191) => 'y',
        
// Decompositions for Latin Extended-A
        
chr(196).chr(128) => 'A'chr(196).chr(129) => 'a',
        
chr(196).chr(130) => 'A'chr(196).chr(131) => 'a',
        
chr(196).chr(132) => 'A'chr(196).chr(133) => 'a',
        
chr(196).chr(134) => 'C'chr(196).chr(135) => 'c',
        
chr(196).chr(136) => 'C'chr(196).chr(137) => 'c',
        
chr(196).chr(138) => 'C'chr(196).chr(139) => 'c',
        
chr(196).chr(140) => 'C'chr(196).chr(141) => 'c',
        
chr(196).chr(142) => 'D'chr(196).chr(143) => 'd',
        
chr(196).chr(144) => 'D'chr(196).chr(145) => 'd',
        
chr(196).chr(146) => 'E'chr(196).chr(147) => 'e',
        
chr(196).chr(148) => 'E'chr(196).chr(149) => 'e',
        
chr(196).chr(150) => 'E'chr(196).chr(151) => 'e',
        
chr(196).chr(152) => 'E'chr(196).chr(153) => 'e',
        
chr(196).chr(154) => 'E'chr(196).chr(155) => 'e',
        
chr(196).chr(156) => 'G'chr(196).chr(157) => 'g',
        
chr(196).chr(158) => 'G'chr(196).chr(159) => 'g',
        
chr(196).chr(160) => 'G'chr(196).chr(161) => 'g',
        
chr(196).chr(162) => 'G'chr(196).chr(163) => 'g',
        
chr(196).chr(164) => 'H'chr(196).chr(165) => 'h',
        
chr(196).chr(166) => 'H'chr(196).chr(167) => 'h',
        
chr(196).chr(168) => 'I'chr(196).chr(169) => 'i',
        
chr(196).chr(170) => 'I'chr(196).chr(171) => 'i',
        
chr(196).chr(172) => 'I'chr(196).chr(173) => 'i',
        
chr(196).chr(174) => 'I'chr(196).chr(175) => 'i',
        
chr(196).chr(176) => 'I'chr(196).chr(177) => 'i',
        
chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
        
chr(196).chr(180) => 'J'chr(196).chr(181) => 'j',
        
chr(196).chr(182) => 'K'chr(196).chr(183) => 'k',
        
chr(196).chr(184) => 'k'chr(196).chr(185) => 'L',
        
chr(196).chr(186) => 'l'chr(196).chr(187) => 'L',
        
chr(196).chr(188) => 'l'chr(196).chr(189) => 'L',
        
chr(196).chr(190) => 'l'chr(196).chr(191) => 'L',
        
chr(197).chr(128) => 'l'chr(197).chr(129) => 'L',
        
chr(197).chr(130) => 'l'chr(197).chr(131) => 'N',
        
chr(197).chr(132) => 'n'chr(197).chr(133) => 'N',
        
chr(197).chr(134) => 'n'chr(197).chr(135) => 'N',
        
chr(197).chr(136) => 'n'chr(197).chr(137) => 'N',
        
chr(197).chr(138) => 'n'chr(197).chr(139) => 'N',
        
chr(197).chr(140) => 'O'chr(197).chr(141) => 'o',
        
chr(197).chr(142) => 'O'chr(197).chr(143) => 'o',
        
chr(197).chr(144) => 'O'chr(197).chr(145) => 'o',
        
chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
        
chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
        
chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
        
chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
        
chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
        
chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
        
chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
        
chr(197).chr(160) => 'S'chr(197).chr(161) => 's',
        
chr(197).chr(162) => 'T'chr(197).chr(163) => 't',
        
chr(197).chr(164) => 'T'chr(197).chr(165) => 't',
        
chr(197).chr(166) => 'T'chr(197).chr(167) => 't',
        
chr(197).chr(168) => 'U'chr(197).chr(169) => 'u',
        
chr(197).chr(170) => 'U'chr(197).chr(171) => 'u',
        
chr(197).chr(172) => 'U'chr(197).chr(173) => 'u',
        
chr(197).chr(174) => 'U'chr(197).chr(175) => 'u',
        
chr(197).chr(176) => 'U'chr(197).chr(177) => 'u',
        
chr(197).chr(178) => 'U'chr(197).chr(179) => 'u',
        
chr(197).chr(180) => 'W'chr(197).chr(181) => 'w',
        
chr(197).chr(182) => 'Y'chr(197).chr(183) => 'y',
        
chr(197).chr(184) => 'Y'chr(197).chr(185) => 'Z',
        
chr(197).chr(186) => 'z'chr(197).chr(187) => 'Z',
        
chr(197).chr(188) => 'z'chr(197).chr(189) => 'Z',
        
chr(197).chr(190) => 'z'chr(197).chr(191) => 's',
        
// Euro Sign
        
chr(226).chr(130).chr(172) => 'E',
        
// GBP (Pound) Sign
        
chr(194).chr(163) => '');

        
$string strtr($string$chars);
    } else {
        
// Assume ISO-8859-1 if not UTF-8
        
$chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
            .
chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
            .
chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)
            .
chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)
            .
chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)
            .
chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)
            .
chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)
            .
chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)
            .
chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)
            .
chr(252).chr(253).chr(255);

        
$chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";

        
$string strtr($string$chars['in'], $chars['out']);
        
$double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
        
$double_chars['out'] = array('OE''oe''AE''DH''TH''ss''ae''dh''th');
        
$string str_replace($double_chars['in'], $double_chars['out'], $string);
    }

    return 
$string;
}

function 
sanitize_file_name$name ) { // Like sanitize_title, but with periods
    
$name strtolower$name );
    
$name preg_replace('/&.+?;/'''$name); // kill entities
    
$name str_replace'_''-'$name );
    
$name preg_replace('/[^a-z0-9\s-.]/'''$name);
    
$name preg_replace('/\s+/''-'$name);
    
$name preg_replace('|-+|''-'$name);
    
$name trim($name'-');
    return 
$name;
}

function 
sanitize_user$username$strict false ) {
    
$raw_username $username;
    
$username strip_tags($username);
    
// Kill octets
    
$username preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|'''$username);
    
$username preg_replace('/&.+?;/'''$username); // Kill entities

    // If strict, reduce to ASCII for max portability.
    
if ( $strict )
        
$username preg_replace('|[^a-z0-9 _.\-@]|i'''$username);

    return 
apply_filters('sanitize_user'$username$raw_username$strict);
}

function 
sanitize_title($title$fallback_title '') {
    
$title strip_tags($title);
    
$title apply_filters('sanitize_title'$title);

    if ( 
'' === $title || false === $title )
        
$title $fallback_title;

    return 
$title;
}

function 
sanitize_title_with_dashes($title) {
    
$title strip_tags($title);
    
// Preserve escaped octets.
    
$title preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|''---$1---'$title);
    
// Remove percent signs that are not part of an octet.
    
$title str_replace('%'''$title);
    
// Restore octets.
    
$title preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|''%$1'$title);

    
$title remove_accents($title);
    if (
seems_utf8($title)) {
        if (
function_exists('mb_strtolower')) {
            
$title mb_strtolower($title'UTF-8');
        }
        
$title utf8_uri_encode($title200);
    }

    
$title strtolower($title);
    
$title preg_replace('/&.+?;/'''$title); // kill entities
    
$title preg_replace('/[^%a-z0-9 _-]/'''$title);
    
$title preg_replace('/\s+/''-'$title);
    
$title preg_replace('|-+|''-'$title);
    
$title trim($title'-');

    return 
$title;
}

// ensures a string is a valid SQL order by clause like: post_name ASC, ID DESC
// accepts one or more columns, with or without ASC/DESC, and also accepts RAND()
function sanitize_sql_orderby$orderby ){
    
preg_match('/^\s*([a-z0-9_]+(\s+(ASC|DESC))?(\s*,\s*|\s*$))+|^\s*RAND\(\s*\)\s*$/i'$orderby$obmatches);
    if ( !
$obmatches )
        return 
false;
    return 
$orderby;
}

function 
convert_chars($content$deprecated '') {
    
// Translation of invalid Unicode references range to valid range
    
$wp_htmltranswinuni = array(
    
'&#128;' => '&#8364;'// the Euro sign
    
'&#129;' => '',
    
'&#130;' => '&#8218;'// these are Windows CP1252 specific characters
    
'&#131;' => '&#402;',  // they would look weird on non-Windows browsers
    
'&#132;' => '&#8222;',
    
'&#133;' => '&#8230;',
    
'&#134;' => '&#8224;',
    
'&#135;' => '&#8225;',
    
'&#136;' => '&#710;',
    
'&#137;' => '&#8240;',
    
'&#138;' => '&#352;',
    
'&#139;' => '&#8249;',
    
'&#140;' => '&#338;',
    
'&#141;' => '',
    
'&#142;' => '&#382;',
    
'&#143;' => '',
    
'&#144;' => '',
    
'&#145;' => '&#8216;',
    
'&#146;' => '&#8217;',
    
'&#147;' => '&#8220;',
    
'&#148;' => '&#8221;',
    
'&#149;' => '&#8226;',
    
'&#150;' => '&#8211;',
    
'&#151;' => '&#8212;',
    
'&#152;' => '&#732;',
    
'&#153;' => '&#8482;',
    
'&#154;' => '&#353;',
    
'&#155;' => '&#8250;',
    
'&#156;' => '&#339;',
    
'&#157;' => '',
    
'&#158;' => '',
    
'&#159;' => '&#376;'
    
);

    
// Remove metadata tags
    
$content preg_replace('/<title>(.+?)<\/title>/','',$content);
    
$content preg_replace('/<category>(.+?)<\/category>/','',$content);

    
// Converts lone & characters into &#38; (a.k.a. &amp;)
    
$content preg_replace('/&([^#])(?![a-z1-4]{1,8};)/i''&#038;$1'$content);

    
// Fix Word pasting
    
$content strtr($content$wp_htmltranswinuni);

    
// Just a little XHTML help
    
$content str_replace('<br>''<br />'$content);
    
$content str_replace('<hr>''<hr />'$content);

    return 
$content;
}

function 
funky_javascript_fix($text) {
    
// Fixes for browsers' javascript bugs
    
global $is_macIE$is_winIE;

    if ( 
$is_winIE || $is_macIE )
        
$text =  preg_replace("/\%u([0-9A-F]{4,4})/e",  "'&#'.base_convert('\\1',16,10).';'"$text);

    return 
$text;
}

function 
balanceTags$text$force false ) {
    if ( !
$force && get_option('use_balanceTags') == )
        return 
$text;
    return 
force_balance_tags$text );
}

/*
 force_balance_tags

 Balances Tags of string using a modified stack.

 @param text      Text to be balanced
 @param force     Forces balancing, ignoring the value of the option
 @return          Returns balanced text
 @author          Leonard Lin (leonard@acm.org)
 @version         v1.1
 @date            November 4, 2001
 @license         GPL v2.0
 @notes
 @changelog
 ---  Modified by Scott Reilly (coffee2code) 02 Aug 2004
    1.2  ***TODO*** Make better - change loop condition to $text
    1.1  Fixed handling of append/stack pop order of end text
         Added Cleaning Hooks
    1.0  First Version
*/
function force_balance_tags$text ) {
    
$tagstack = array(); $stacksize 0$tagqueue ''$newtext '';
    
$single_tags = array('br''hr''img''input'); //Known single-entity/self-closing tags
    
$nestable_tags = array('blockquote''div''span'); //Tags that can be immediately nested within themselves

    # WP bug fix for comments - in case you REALLY meant to type '< !--'
    
$text str_replace('< !--''<    !--'$text);
    
# WP bug fix for LOVE <3 (and other situations with '<' before a number)
    
$text preg_replace('#<([0-9]{1})#''&lt;$1'$text);

    while (
preg_match("/<(\/?\w*)\s*([^>]*)>/",$text,$regex)) {
        
$newtext .= $tagqueue;

        
$i strpos($text,$regex[0]);
        
$l strlen($regex[0]);

        
// clear the shifter
        
$tagqueue '';
        
// Pop or Push
        
if ($regex[1][0] == "/") { // End Tag
            
$tag strtolower(substr($regex[1],1));
            
// if too many closing tags
            
if($stacksize <= 0) {
                
$tag '';
                
//or close to be safe $tag = '/' . $tag;
            
}
            
// if stacktop value = tag close value then pop
            
else if ($tagstack[$stacksize 1] == $tag) { // found closing tag
                
$tag '</' $tag '>'// Close Tag
                // Pop
                
array_pop ($tagstack);
                
$stacksize--;
            } else { 
// closing tag not at top, search for it
                
for ($j=$stacksize-1;$j>=0;$j--) {
                    if (
$tagstack[$j] == $tag) {
                    
// add tag to tagqueue
                        
for ($k=$stacksize-1;$k>=$j;$k--){
                            
$tagqueue .= '</' array_pop ($tagstack) . '>';
                            
$stacksize--;
                        }
                        break;
                    }
                }
                
$tag '';
            }
        } else { 
// Begin Tag
            
$tag strtolower($regex[1]);

            
// Tag Cleaning

            // If self-closing or '', don't do anything.
            
if((substr($regex[2],-1) == '/') || ($tag == '')) {
            }
            
// ElseIf it's a known single-entity tag but it doesn't close itself, do so
            
elseif ( in_array($tag$single_tags) ) {
                
$regex[2] .= '/';
            } else {    
// Push the tag onto the stack
                // If the top of the stack is the same as the tag we want to push, close previous tag
                
if (($stacksize 0) && !in_array($tag$nestable_tags) && ($tagstack[$stacksize 1] == $tag)) {
                    
$tagqueue '</' array_pop ($tagstack) . '>';
                    
$stacksize--;
                }
                
$stacksize array_push ($tagstack$tag);
            }

            
// Attributes
            
$attributes $regex[2];
            if(
$attributes) {
                
$attributes ' '.$attributes;
            }
            
$tag '<'.$tag.$attributes.'>';
            
//If already queuing a close tag, then put this tag on, too
            
if ($tagqueue) {
                
$tagqueue .= $tag;
                
$tag '';
            }
        }
        
$newtext .= substr($text,0,$i) . $tag;
        
$text substr($text,$i+$l);
    }

    
// Clear Tag Queue
    
$newtext .= $tagqueue;

    
// Add Remaining text
    
$newtext .= $text;

    
// Empty Stack
    
while($x array_pop($tagstack)) {
        
$newtext .= '</' $x '>'// Add remaining tags to close
    
}

    
// WP fix for the bug with HTML comments
    
$newtext str_replace("< !--","<!--",$newtext);
    
$newtext str_replace("<    !--","< !--",$newtext);

    return 
$newtext;
}

function 
format_to_edit($content$richedit false) {
    
$content apply_filters('format_to_edit'$content);
    if (! 
$richedit )
        
$content htmlspecialchars($content);
    return 
$content;
}

function 
format_to_post($content) {
    
$content apply_filters('format_to_post'$content);
    return 
$content;
}

function 
zeroise($number,$threshold) { // function to add leading zeros when necessary
    
return sprintf('%0'.$threshold.'s'$number);
}


function 
backslashit($string) {
    
$string preg_replace('/^([0-9])/''\\\\\\\\\1'$string);
    
$string preg_replace('/([a-z])/i''\\\\\1'$string);
    return 
$string;
}

function 
trailingslashit($string) {
    return 
untrailingslashit($string) . '/';
}

function 
untrailingslashit($string) {
    return 
rtrim($string'/');
}

function 
addslashes_gpc($gpc) {
    global 
$wpdb;

    if (
get_magic_quotes_gpc()) {
        
$gpc stripslashes($gpc);
    }

    return 
$wpdb->escape($gpc);
}


function 
stripslashes_deep($value) {
     
$value is_array($value) ?
         
array_map('stripslashes_deep'$value) :
         
stripslashes($value);

     return 
$value;
}

function 
urlencode_deep($value) {
     
$value is_array($value) ?
         
array_map('urlencode_deep'$value) :
         
urlencode($value);

     return 
$value;
}

function 
antispambot($emailaddy$mailto=0) {
    
$emailNOSPAMaddy '';
    
srand ((float) microtime() * 1000000);
    for (
$i 0$i strlen($emailaddy); $i $i 1) {
        
$j floor(rand(01+$mailto));
        if (
$j==0) {
            
$emailNOSPAMaddy .= '&#'.ord(substr($emailaddy,$i,1)).';';
        } elseif (
$j==1) {
            
$emailNOSPAMaddy .= substr($emailaddy,$i,1);
        } elseif (
$j==2) {
            
$emailNOSPAMaddy .= '%'.zeroise(dechex(ord(substr($emailaddy$i1))), 2);
        }
    }
    
$emailNOSPAMaddy str_replace('@','&#64;',$emailNOSPAMaddy);
    return 
$emailNOSPAMaddy;
}

function 
_make_url_clickable_cb($matches) {
    
$ret '';
    
$url $matches[2];
    
$url clean_url($url);
    if ( empty(
$url) )
        return 
$matches[0];
    
// removed trailing [.,;:] from URL
    
if ( in_array(substr($url, -1), array('.'','';'':')) === true ) {
        
$ret substr($url, -1);
        
$url substr($url0strlen($url)-1);
    }
    return 
$matches[1] . "<a href=\"$url\" rel=\"nofollow\">$url</a>" $ret;
}

function 
_make_web_ftp_clickable_cb($matches) {
    
$ret '';
    
$dest $matches[2];
    
$dest 'http://' $dest;
    
$dest clean_url($dest);
    if ( empty(
$dest) )
        return 
$matches[0];
    
// removed trailing [,;:] from URL
    
if ( in_array(substr($dest, -1), array('.'','';'':')) === true ) {
        
$ret substr($dest, -1);
        
$dest substr($dest0strlen($dest)-1);
    }
    return 
$matches[1] . "<a href=\"$dest\" rel=\"nofollow\">$dest</a>" $ret;
}

function 
_make_email_clickable_cb($matches) {
    
$email $matches[2] . '@' $matches[3];
    return 
$matches[1] . "<a href=\"mailto:$email\">$email</a>";
}

function 
make_clickable($ret) {
    
$ret ' ' $ret;
    
// in testing, using arrays here was found to be faster
    
$ret preg_replace_callback('#([\s>])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)#is''_make_url_clickable_cb'$ret);
    
$ret preg_replace_callback('#([\s>])((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*)#is''_make_web_ftp_clickable_cb'$ret);
    
$ret preg_replace_callback('#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i''_make_email_clickable_cb'$ret);
    
// this one is not in an array because we need it to run last, for cleanup of accidental links within links
    
$ret preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i""$1$3</a>"$ret);
    
$ret trim($ret);
    return 
$ret;
}

function 
wp_rel_nofollow$text ) {
    global 
$wpdb;
    
// This is a pre save filter, so text is already escaped.
    
$text stripslashes($text);
    
$text preg_replace_callback('|<a (.+?)>|i''wp_rel_nofollow_callback'$text);
    
$text $wpdb->escape($text);
    return 
$text;
}

function 
wp_rel_nofollow_callback$matches ) {
    
$text $matches[1];
    
$text str_replace(array(' rel="nofollow"'" rel='nofollow'"), ''$text);
    return 
"<a $text rel=\"nofollow\">";
}

function 
convert_smilies($text) {
    global 
$wp_smiliessearch$wp_smiliesreplace;
    
$output '';
    if ( 
get_option('use_smilies') && !empty($wp_smiliessearch) && !empty($wp_smiliesreplace) ) {
        
// HTML loop taken from texturize function, could possible be consolidated
        
$textarr preg_split("/(<.*>)/U"$text, -1PREG_SPLIT_DELIM_CAPTURE); // capture the tags as well as in between
        
$stop count($textarr);// loop stuff
        
for ($i 0$i $stop$i++) {
            
$content $textarr[$i];
            if ((
strlen($content) > 0) && ('<' != $content{0})) { // If it's not a tag
                
$content preg_replace($wp_smiliessearch$wp_smiliesreplace$content);
            }
            
$output .= $content;
        }
    } else {
        
// return default text.
        
$output $text;
    }
    return 
$output;
}


function 
is_email($user_email) {
    
$chars "/^([a-z0-9+_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,6}\$/i";
    if (
strpos($user_email'@') !== false && strpos($user_email'.') !== false) {
        if (
preg_match($chars$user_email)) {
            return 
true;
        } else {
            return 
false;
        }
    } else {
        return 
false;
    }
}

// used by wp-mail to handle charsets in email subjects
function wp_iso_descrambler($string) {
  
/* this may only work with iso-8859-1, I'm afraid */
  
if (!preg_match('#\=\?(.+)\?Q\?(.+)\?\=#i'$string$matches)) {
    return 
$string;
  } else {
    
$subject str_replace('_'' '$matches[2]);
    
$subject preg_replace('#\=([0-9a-f]{2})#ei'"chr(hexdec(strtolower('$1')))"$subject);
    return 
$subject;
  }
}


// give it a date, it will give you the same date as GMT
function get_gmt_from_date($string) {
  
// note: this only substracts $time_difference from the given date
  
preg_match('#([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})#'$string$matches);
  
$string_time gmmktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
  
$string_gmt gmdate('Y-m-d H:i:s'$string_time get_option('gmt_offset') * 3600);
  return 
$string_gmt;
}

// give it a GMT date, it will give you the same date with $time_difference added
function get_date_from_gmt($string) {
  
// note: this only adds $time_difference to the given date
  
preg_match('#([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})#'$string$matches);
  
$string_time gmmktime($matches[4], $matches[5], $matches[6], $matches[2], $matches[3], $matches[1]);
  
$string_localtime gmdate('Y-m-d H:i:s'$string_time get_option('gmt_offset')*3600);
  return 
$string_localtime;
}

// computes an offset in seconds from an iso8601 timezone
function iso8601_timezone_to_offset($timezone) {
  
// $timezone is either 'Z' or '[+|-]hhmm'
  
if ($timezone == 'Z') {
    
$offset 0;
  } else {
    
$sign    = (substr($timezone01) == '+') ? : -1;
    
$hours   intval(substr($timezone12));
    
$minutes intval(substr($timezone34)) / 60;
    
$offset  $sign 3600 * ($hours $minutes);
  }
  return 
$offset;
}

// converts an iso8601 date to MySQL DateTime format used by post_date[_gmt]
function iso8601_to_datetime($date_string$timezone USER) {
  if (
$timezone == GMT) {
    
preg_match('#([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(Z|[\+|\-][0-9]{2,4}){0,1}#'$date_string$date_bits);
    if (!empty(
$date_bits[7])) { // we have a timezone, so let's compute an offset
      
$offset iso8601_timezone_to_offset($date_bits[7]);
    } else { 
// we don't have a timezone, so we assume user local timezone (not server's!)
      
$offset 3600 get_option('gmt_offset');
    }
    
$timestamp gmmktime($date_bits[4], $date_bits[5], $date_bits[6], $date_bits[2], $date_bits[3], $date_bits[1]);
    
$timestamp -= $offset;
    return 
gmdate('Y-m-d H:i:s'$timestamp);
  } elseif (
$timezone == USER) {
    return 
preg_replace('#([0-9]{4})([0-9]{2})([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(Z|[\+|\-][0-9]{2,4}){0,1}#''$1-$2-$3 $4:$5:$6'$date_string);
  }
}

function 
popuplinks($text) {
    
// Comment text in popup windows should be filtered through this.
    // Right now it's a moderately dumb function, ideally it would detect whether
    // a target or rel attribute was already there and adjust its actions accordingly.
    
$text preg_replace('/<a (.+?)>/i'"<a $1 target='_blank' rel='external'>"$text);
    return 
$text;
}

function 
sanitize_email($email) {
    return 
preg_replace('/[^a-z0-9+_.@-]/i'''$email);
}

function 
human_time_diff$from$to '' ) {
    if ( empty(
$to) )
        
$to time();
    
$diff = (int) abs($to $from);
    if (
$diff <= 3600) {
        
$mins round($diff 60);
        if (
$mins <= 1) {
            
$mins 1;
        }
        
$since sprintf(__ngettext('%s min''%s mins'$mins), $mins);
    } else if ((
$diff <= 86400) && ($diff 3600)) {
        
$hours round($diff 3600);
        if (
$hours <= 1) {
            
$hours 1;
        }
        
$since sprintf(__ngettext('%s hour''%s hours'$hours), $hours);
    } elseif (
$diff >= 86400) {
        
$days round($diff 86400);
        if (
$days <= 1) {
            
$days 1;
        }
        
$since sprintf(__ngettext('%s day''%s days'$days), $days);
    }
    return 
$since;
}

function 
wp_trim_excerpt($text) { // Fakes an excerpt if needed
    
if ( '' == $text ) {
        
$text get_the_content('');
        
$text apply_filters('the_content'$text);
        
$text str_replace(']]>'']]&gt;'$text);
        
$text strip_tags($text);
        
$excerpt_length 55;
        
$words explode(' '$text$excerpt_length 1);
        if (
count($words) > $excerpt_length) {
            
array_pop($words);
            
array_push($words'[...]');
            
$text implode(' '$words);
        }
    }
    return 
$text;
}

function 
ent2ncr($text) {
    
$to_ncr = array(
        
'&quot;' => '&#34;',
        
'&amp;' => '&#38;',
        
'&frasl;' => '&#47;',
        
'&lt;' => '&#60;',
        
'&gt;' => '&#62;',
        
'|' => '&#124;',
        
'&nbsp;' => '&#160;',
        
'&iexcl;' => '&#161;',
        
'&cent;' => '&#162;',
        
'&pound;' => '&#163;',
        
'&curren;' => '&#164;',
        
'&yen;' => '&#165;',
        
'&brvbar;' => '&#166;',
        
'&brkbar;' => '&#166;',
        
'&sect;' => '&#167;',
        
'&uml;' => '&#168;',
        
'&die;' => '&#168;',
        
'&copy;' => '&#169;',
        
'&ordf;' => '&#170;',
        
'&laquo;' => '&#171;',
        
'&not;' => '&#172;',
        
'&shy;' => '&#173;',
        
'&reg;' => '&#174;',
        
'&macr;' => '&#175;',
        
'&hibar;' => '&#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;',
        
'&OElig;' => '&#338;',
        
'&oelig;' => '&#339;',
        
'&Scaron;' => '&#352;',
        
'&scaron;' => '&#353;',
        
'&Yuml;' => '&#376;',
        
'&fnof;' => '&#402;',
        
'&circ;' => '&#710;',
        
'&tilde;' => '&#732;',
        
'&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;',
        
'&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;',
        
'&bull;' => '&#8226;',
        
'&hellip;' => '&#8230;',
        
'&permil;' => '&#8240;',
        
'&prime;' => '&#8242;',
        
'&Prime;' => '&#8243;',
        
'&lsaquo;' => '&#8249;',
        
'&rsaquo;' => '&#8250;',
        
'&oline;' => '&#8254;',
        
'&frasl;' => '&#8260;',
        
'&euro;' => '&#8364;',
        
'&image;' => '&#8465;',
        
'&weierp;' => '&#8472;',
        
'&real;' => '&#8476;',
        
'&trade;' => '&#8482;',
        
'&alefsym;' => '&#8501;',
        
'&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;',
        
'&larr;' => '&#8592;',
        
'&uarr;' => '&#8593;',
        
'&rarr;' => '&#8594;',
        
'&darr;' => '&#8595;',
        
'&harr;' => '&#8596;',
        
'&loz;' => '&#9674;',
        
'&spades;' => '&#9824;',
        
'&clubs;' => '&#9827;',
        
'&hearts;' => '&#9829;',
        
'&diams;' => '&#9830;'
    
);

    return 
str_replacearray_keys($to_ncr), array_values($to_ncr), $text );
}

function 
wp_richedit_pre($text) {
    
// Filtering a blank results in an annoying <br />\n
    
if ( empty($text) ) return apply_filters('richedit_pre''');

    
$output $text;
    
$output convert_chars($output);
    
$output wpautop($output);

    
// These must be double-escaped or planets will collide.
    
$output str_replace('&lt;''&amp;lt;'$output);
    
$output str_replace('&gt;''&amp;gt;'$output);

    return 
apply_filters('richedit_pre'$output);
}

function 
wp_htmledit_pre($output) {
    if ( !empty(
$output) )
        
$output htmlspecialchars($outputENT_NOQUOTES); // convert only < > &

    
return apply_filters('htmledit_pre'$output);
}

function 
clean_url$url$protocols null$context 'display' ) {
    
$original_url $url;

    if (
'' == $url) return $url;
    
$url preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@()]|i'''$url);
    
$strip = array('%0d''%0a');
    
$url str_replace($strip''$url);
    
$url str_replace(';//''://'$url);
    
/* If the URL doesn't appear to contain a scheme, we
     * presume it needs http:// appended (unless a relative
     * link starting with / or a php file).
    */
    
if ( strpos($url':') === false &&
        
substr$url0) != '/' && !preg_match('/^[a-z0-9-]+?\.php/i'$url) )
        
$url 'http://' $url;

    
// Replace ampersands ony when displaying.
    
if ( 'display' == $context )
        
$url preg_replace('/&([^#])(?![a-z]{2,8};)/''&#038;$1'$url);

    if ( !
is_array($protocols) )
        
$protocols = array('http''https''ftp''ftps''mailto''news''irc''gopher''nntp''feed''telnet');
    if ( 
wp_kses_bad_protocol$url$protocols ) != $url )
        return 
'';

    return 
apply_filters('clean_url'$url$original_url$context);
}

function 
sanitize_url$url$protocols null ) {
    return 
clean_url$url$protocols'db');
}

// Borrowed from the PHP Manual user notes. Convert entities, while
// preserving already-encoded entities:
function htmlentities2($myHTML) {
    
$translation_table=get_html_translation_table (HTML_ENTITIES,ENT_QUOTES);
    
$translation_table[chr(38)] = '&';
    return 
preg_replace("/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,3};)/","&amp;" strtr($myHTML$translation_table));
}

// Escape single quotes, specialchar double quotes, and fix line endings.
function js_escape($text) {
    
$safe_text wp_specialchars($text'double');
    
$safe_text preg_replace('/&#(x)?0*(?(1)27|39);?/i'"'"stripslashes($safe_text));
    
$safe_text preg_replace("/\r?\n/""\\n"addslashes($safe_text));
    return 
apply_filters('js_escape'$safe_text$text);
}

// Escaping for HTML attributes
function attribute_escape($text) {
    
$safe_text wp_specialchars($texttrue);
    return 
apply_filters('attribute_escape'$safe_text$text);
}

// Escape a HTML tag name
function tag_escape($tag_name) {
    
$safe_tag strtolowerpreg_replace('[^a-zA-Z_:]'''$tag_name) );
    return 
apply_filters('tag_escape'$safe_tag$tag_name);
}

/**
 * Escapes text for SQL LIKE special characters % and _
 *
 * @param string text the text to be escaped
 * @return string text, safe for inclusion in LIKE query
 */
function like_escape($text) {
    return 
str_replace(array("%""_"), array("\\%""\\_"), $text);
}

function 
wp_make_link_relative$link ) {
    return 
preg_replace('|https?://[^/]+(/.*)|i''$1'$link );
}

function 
sanitize_option($option$value) { // Remember to call stripslashes!

    
switch ($option) {
        case 
'admin_email':
            
$value sanitize_email($value);
            break;

        case 
'default_post_edit_rows':
        case 
'mailserver_port':
        case 
'comment_max_links':
        case 
'page_on_front':
        case 
'rss_excerpt_length':
        case 
'default_category':
        case 
'default_email_category':
        case 
'default_link_category':
            
$value abs((int) $value);
            break;

        case 
'posts_per_page':
        case 
'posts_per_rss':
            
$value = (int) $value;
            if ( empty(
$value) ) $value 1;
            if ( 
$value < -$value abs($value);
            break;

        case 
'default_ping_status':
        case 
'default_comment_status':
            
// Options that if not there have 0 value but need to be something like "closed"
            
if ( $value == '0' || $value == '')
                
$value 'closed';
            break;

        case 
'blogdescription':
        case 
'blogname':
            
$value addslashes($value);
            
$value wp_filter_post_kses$value ); // calls stripslashes then addslashes
            
$value stripslashes($value);
            
$value wp_specialchars$value );
            break;

        case 
'blog_charset':
            
$value preg_replace('/[^a-zA-Z0-9_-]/'''$value); // strips slashes
            
break;

        case 
'date_format':
        case 
'time_format':
        case 
'mailserver_url':
        case 
'mailserver_login':
        case 
'mailserver_pass':
        case 
'ping_sites':
        case 
'upload_path':
            
$value strip_tags($value);
            
$value addslashes($value);
            
$value wp_filter_kses($value); // calls stripslashes then addslashes
            
$value stripslashes($value);
            break;

        case 
'gmt_offset':
            
$value preg_replace('/[^0-9:.-]/'''$value); // strips slashes
            
break;

        case 
'siteurl':
        case 
'home':
            
$value stripslashes($value);
            
$value clean_url($value);
            break;
        default :
            
$value apply_filters("sanitize_option_{$option}"$value$option);
            break;
    }

    return 
$value;
}

function 
wp_parse_str$string, &$array ) {
    
parse_str$string$array );
    if ( 
get_magic_quotes_gpc() )
        
$array stripslashes_deep$array ); // parse_str() adds slashes if magicquotes is on.  See: http://php.net/parse_str
    
$array apply_filters'wp_parse_str'$array );
}

// Convert lone less than signs.  KSES already converts lone greater than signs.
function wp_pre_kses_less_than$text ) {
    return 
preg_replace_callback('%<[^>]*?((?=<)|>|$)%''wp_pre_kses_less_than_callback'$text);
}

function 
wp_pre_kses_less_than_callback$matches ) {
    if ( 
false === strpos($matches[0], '>') )
        return 
wp_specialchars($matches[0]);
    return 
$matches[0];
}

/**
 * wp_sprintf() - sprintf() with filters
 */
function wp_sprintf$pattern ) {
    
$args func_get_args( );
    
$len strlen($pattern);
    
$start 0;
    
$result '';
    
$arg_index 0;
    while ( 
$len $start ) {
        
// Last character: append and break
        
if ( strlen($pattern) - == $start ) {
            
$result .= substr($pattern, -1);
            break;
        }

        
// Literal %: append and continue
        
if ( substr($pattern$start2) == '%%' ) {
            
$start += 2;
            
$result .= '%';
            continue;
        }

        
// Get fragment before next %
        
$end strpos($pattern'%'$start 1);
        if ( 
false === $end )
            
$end $len;
        
$fragment substr($pattern$start$end $start);

        
// Fragment has a specifier
        
if ( $pattern{$start} == '%' ) {
            
// Find numbered arguments or take the next one in order
            
if ( preg_match('/^%(\d+)\$/'$fragment$matches) ) {
                
$arg = isset($args[$matches[1]]) ? $args[$matches[1]] : '';
                
$fragment str_replace("%{$matches[1]}$"'%'$fragment);
            } else {
                ++
$arg_index;
                
$arg = isset($args[$arg_index]) ? $args[$arg_index] : '';
            }

            
// Apply filters OR sprintf
            
$_fragment apply_filters'wp_sprintf'$fragment$arg );
            if ( 
$_fragment != $fragment )
                
$fragment $_fragment;
            else
                
$fragment sprintf($fragmentstrval($arg) );
        }

        
// Append to result and move to next fragment
        
$result .= $fragment;
        
$start $end;
    }
    return 
$result;
}

/**
 * wp_sprintf_l - List specifier %l for wp_sprintf
 *
 * @param unknown_type $pattern
 * @param unknown_type $args
 * @return unknown
 */
function wp_sprintf_l($pattern$args) {
    
// Not a match
    
if ( substr($pattern02) != '%l' )
        return 
$pattern;

    
// Nothing to work with
    
if ( empty($args) )
        return 
'';

    
// Translate and filter the delimiter set (avoid ampersands and entities here)
    
$l apply_filters('wp_sprintf_l', array(
        
'between'          => _c(', |between list items'),
        
'between_last_two' => _c(', and |between last two list items'),
        
'between_only_two' => _c(' and |between only two list items'),
        ));

    
$args = (array) $args;
    
$result array_shift($args);
    if ( 
count($args) == )
        
$result .= $l['between_only_two'] . array_shift($args);
    
// Loop when more than two args
    
while ( count($args) ) {
        
$arg array_shift($args);
        if ( 
$i == )
            
$result .= $l['between_last_two'] . $arg;
        else
            
$result .= $l['between'] . $arg;
    }
    return 
$result substr($pattern2);
}

/**
 * Safely extracts not more than the first $count characters from html string
 *
 * UTF-8, tags and entities safe prefix extraction. Entities inside will *NOT* be
 * counted as one character. For example &amp; will be counted as 4, &lt; as 3, etc.
 *
 * @param integer $str String to get the excerpt from
 * @param integer $count Maximum number of characters to take
 * @eaturn string the excerpt
 */
function wp_html_excerpt$str$count ) {
    
$str strip_tags$str );
    
$str mb_strcut$str0$count );
    
// remove part of an entity at the end
    
$str preg_replace'/&[^;\s]{0,6}$/'''$str );
    return 
$str;
}

?>