2004-02-09 07:57:02 +01:00
< ? php
function wptexturize ( $text ) {
2004-04-22 09:41:57 +02:00
$output = '' ;
// Capture tags and everything inside them
$textarr = preg_split ( " /(<.*>)/Us " , $text , - 1 , PREG_SPLIT_DELIM_CAPTURE );
2004-02-09 07:57:02 +01:00
$stop = count ( $textarr ); $next = true ; // loop stuff
for ( $i = 0 ; $i < $stop ; $i ++ ) {
$curl = $textarr [ $i ];
2004-02-16 04:02:25 +01:00
2004-02-09 07:57:02 +01:00
if ( isset ( $curl { 0 }) && '<' != $curl { 0 } && $next ) { // If it's not a tag
$curl = str_replace ( '---' , '—' , $curl );
2004-09-04 22:47:52 +02:00
$curl = preg_replace ( '/(\s)--(\s)/' , '$1—$2' , $curl );
2004-02-09 07:57:02 +01:00
$curl = str_replace ( '--' , '–' , $curl );
2004-09-04 22:47:52 +02:00
$curl = str_replace ( '...' , '…' , $curl );
2004-02-09 07:57:02 +01:00
$curl = str_replace ( '``' , '“' , $curl );
// This is a hack, look at this more later. It works pretty well though.
$cockney = array ( " 'tain't " , " 'twere " , " 'twas " , " 'tis " , " 'twill " , " 'til " , " 'bout " , " 'nuff " , " 'round " );
$cockneyreplace = array ( " ’tain’t " , " ’twere " , " ’twas " , " ’tis " , " ’twill " , " ’til " , " ’bout " , " ’nuff " , " ’round " );
$curl = str_replace ( $cockney , $cockneyreplace , $curl );
2004-03-22 02:34:32 +01:00
$curl = preg_replace ( " /'s/ " , '’s' , $curl );
2004-02-09 07:57:02 +01:00
$curl = preg_replace ( " /'( \ d \ d(?:’|')?s)/ " , " ’ $ 1 " , $curl );
$curl = preg_replace ( '/(\s|\A|")\'/' , '$1‘' , $curl );
2004-06-11 19:52:41 +02:00
$curl = preg_replace ( '/(\d+)"/' , '$1″' , $curl );
$curl = preg_replace ( " /( \ d+)'/ " , '$1′' , $curl );
2004-02-09 07:57:02 +01:00
$curl = preg_replace ( " /( \ S)'([^' \ s])/ " , " $ 1’ $ 2 " , $curl );
2004-03-22 02:34:32 +01:00
$curl = preg_replace ( '/(\s|\A)"(?!\s)/' , '$1“$2' , $curl );
2004-09-04 22:47:52 +02:00
$curl = preg_replace ( '/"(\s|\S|\Z)/' , '”$1' , $curl );
2004-02-09 07:57:02 +01:00
$curl = preg_replace ( " /'([ \ s.]| \ Z)/ " , '’$1' , $curl );
2004-09-04 22:47:52 +02:00
$curl = preg_replace ( " / \ (tm \ )/i " , ' ™' , $curl );
2004-02-09 07:57:02 +01:00
$curl = str_replace ( " '' " , '”' , $curl );
$curl = preg_replace ( '/(d+)x(\d+)/' , " $ 1× $ 2 " , $curl );
} elseif ( strstr ( $curl , '<code' ) || strstr ( $curl , '<pre' ) || strstr ( $curl , '<kbd' || strstr ( $curl , '<style' ) || strstr ( $curl , '<script' ))) {
// strstr is fast
$next = false ;
} else {
$next = true ;
}
2004-09-08 10:48:36 +02:00
$curl = preg_replace ( '/&([^#])(?![a-z12]{1,8};)/' , '&$1' , $curl );
2004-02-09 07:57:02 +01:00
$output .= $curl ;
}
return $output ;
}
2004-03-21 08:07:55 +01:00
function clean_pre ( $text ) {
$text = str_replace ( '<br />' , '' , $text );
2005-01-06 11:10:55 +01:00
$text = str_replace ( '<p>' , " \n " , $text );
$text = str_replace ( '</p>' , '' , $text );
2004-03-21 08:07:55 +01:00
return $text ;
}
2004-02-09 07:57:02 +01:00
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 );
2004-04-22 09:41:57 +02:00
// Space things out a little
2004-12-07 21:09:46 +01:00
$pee = preg_replace ( '!(<(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|math|p|h[1-6])[^>]*>)!' , " \n $ 1 " , $pee );
$pee = preg_replace ( '!(</(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|math|p|h[1-6])>)!' , " $ 1 \n " , $pee );
2004-04-22 09:41:57 +02:00
$pee = str_replace ( array ( " \r \n " , " \r " ), " \n " , $pee ); // cross-platform newlines
2004-02-09 07:57:02 +01:00
$pee = preg_replace ( " / \n \n +/ " , " \n \n " , $pee ); // take care of duplicates
$pee = preg_replace ( '/\n?(.+?)(?:\n\s*\n|\z)/s' , " \t <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
2004-12-09 01:32:14 +01:00
$pee = preg_replace ( '!<p>\s*(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|hr|pre|select|form|blockquote|math|p|h[1-6])[^>]*>)\s*</p>!' , " $ 1 " , $pee ); // don't pee all over a tag
2004-02-09 07:57:02 +01:00
$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 );
2004-12-09 01:32:14 +01:00
$pee = preg_replace ( '!<p>\s*(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|hr|pre|select|form|blockquote|math|p|h[1-6])[^>]*>)!' , " $ 1 " , $pee );
2004-12-07 21:09:46 +01:00
$pee = preg_replace ( '!(</?(?:table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|math|p|h[1-6])[^>]*>)\s*</p>!' , " $ 1 " , $pee );
2004-02-09 07:57:02 +01:00
if ( $br ) $pee = preg_replace ( '|(?<!<br />)\s*\n|' , " <br /> \n " , $pee ); // optionally make line breaks
2004-08-23 11:07:07 +02:00
$pee = preg_replace ( '!(</?(?:table|thead|tfoot|caption|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|math|p|h[1-6])[^>]*>)\s*<br />!' , " $ 1 " , $pee );
2004-02-13 07:33:55 +01:00
$pee = preg_replace ( '!<br />(\s*</?(?:p|li|div|dl|dd|dt|th|pre|td|ul|ol)>)!' , '$1' , $pee );
2004-03-29 05:54:57 +02:00
$pee = preg_replace ( '!(<pre.*?>)(.*?)</pre>!ise' , " stripslashes(' $ 1') . clean_pre(' $ 2') . '</pre>' " , $pee );
2004-02-09 07:57:02 +01:00
return $pee ;
}
2004-05-22 16:34:09 +02:00
function seems_utf8 ( $Str ) { # by bmorel at ssi dot fr
for ( $i = 0 ; $i < strlen ( $Str ); $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 == strlen ( $Str )) || (( ord ( $Str [ $i ]) & 0xC0 ) != 0x80 ))
return false ;
}
}
return true ;
}
2004-12-12 21:41:19 +01:00
function wp_specialchars ( $text , $quotes = 0 ) {
// Like htmlspecialchars except don't double-encode HTML entities
$text = preg_replace ( '/&([^#])(?![a-z12]{1,8};)/' , '&$1' , $text ); -
$text = str_replace ( '<' , '<' , $text );
$text = str_replace ( '>' , '>' , $text );
if ( $quotes ) {
$text = str_replace ( '"' , '"' , $text );
2004-12-25 18:21:43 +01:00
$text = str_replace ( " ' " , ''' , $text );
2004-12-12 21:41:19 +01:00
}
return $text ;
}
2004-09-10 10:36:54 +02:00
function utf8_uri_encode ( $utf8_string ) {
$unicode = '' ;
$values = array ();
$num_octets = 1 ;
for ( $i = 0 ; $i < strlen ( $utf8_string ); $i ++ ) {
$value = ord ( $utf8_string [ $i ] );
if ( $value < 128 ) {
$unicode .= chr ( $value );
} else {
if ( count ( $values ) == 0 ) $num_octets = ( $value < 224 ) ? 2 : 3 ;
$values [] = $value ;
if ( count ( $values ) == $num_octets ) {
if ( $num_octets == 3 ) {
$unicode .= '%' . dechex ( $values [ 0 ]) . '%' . dechex ( $values [ 1 ]) . '%' . dechex ( $values [ 2 ]);
} else {
$unicode .= '%' . dechex ( $values [ 0 ]) . '%' . dechex ( $values [ 1 ]);
}
$values = array ();
$num_octets = 1 ;
}
}
}
return $unicode ;
}
2004-05-22 16:34:09 +02:00
function remove_accents ( $string ) {
if ( seems_utf8 ( $string )) {
2004-12-09 01:16:33 +01:00
$chars = array ( // Decompositions for Latin-1 Supplement
chr ( 195 ) . chr ( 128 ) => 'A' , chr ( 195 ) . chr ( 129 ) => 'A' ,
2004-09-10 10:36:54 +02:00
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 ( 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' ,
2004-12-09 01:16:33 +01:00
// Decompositions for Latin Extended-A
// TODO: Finish me.
2004-09-10 10:36:54 +02:00
chr ( 197 ) . chr ( 146 ) => 'OE' , chr ( 197 ) . chr ( 147 ) => 'oe' ,
chr ( 197 ) . chr ( 160 ) => 'S' , chr ( 197 ) . chr ( 161 ) => 's' ,
chr ( 197 ) . chr ( 189 ) => 'Z' , chr ( 197 ) . chr ( 190 ) => 'z' ,
2004-12-09 01:16:33 +01:00
// Euro Sign
2004-09-10 10:36:54 +02:00
chr ( 226 ) . chr ( 130 ) . chr ( 172 ) => 'E' );
$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 );
2004-05-22 16:34:09 +02:00
}
2004-09-10 10:36:54 +02:00
2004-05-22 16:34:09 +02:00
return $string ;
}
2004-07-24 05:22:49 +02:00
function sanitize_title ( $title , $fallback_title = '' ) {
2005-01-02 10:08:55 +01:00
$title = strip_tags ( $title );
$title = apply_filters ( 'sanitize_title' , $title );
2004-08-06 03:28:51 +02:00
2005-01-02 10:08:55 +01:00
if ( empty ( $title )) {
$title = $fallback_title ;
}
2004-05-21 10:37:55 +02:00
2005-01-02 10:08:55 +01:00
return $title ;
2004-02-09 07:57:02 +01:00
}
2004-05-21 10:37:55 +02:00
function sanitize_title_with_dashes ( $title ) {
2004-09-16 03:08:50 +02:00
$title = strip_tags ( $title );
2005-02-01 09:31:13 +01:00
// 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 );
2005-01-02 10:08:55 +01:00
$title = remove_accents ( $title );
if ( seems_utf8 ( $title )) {
if ( function_exists ( 'mb_strtolower' )) {
$title = mb_strtolower ( $title , 'UTF-8' );
2004-09-10 10:36:54 +02:00
}
2005-01-02 10:08:55 +01:00
$title = utf8_uri_encode ( $title );
}
2004-09-10 10:36:54 +02:00
2005-01-02 10:08:55 +01:00
$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 , '-' );
2004-05-17 00:14:14 +02:00
2005-01-02 10:08:55 +01:00
return $title ;
2004-05-17 00:07:26 +02:00
}
2004-04-22 09:41:57 +02:00
function convert_chars ( $content , $flag = 'obsolete' ) {
2004-12-23 01:08:43 +01:00
// Translation of invalid Unicode references range to valid range
$wp_htmltranswinuni = array (
'€' => '€' , // the Euro sign
'' => '' ,
'‚' => '‚' , // these are Windows CP1252 specific characters
'ƒ' => 'ƒ' , // they would look weird on non-Windows browsers
'„' => '„' ,
'…' => '…' ,
'†' => '†' ,
'‡' => '‡' ,
'ˆ' => 'ˆ' ,
'‰' => '‰' ,
'Š' => 'Š' ,
'‹' => '‹' ,
'Œ' => 'Œ' ,
'' => '' ,
'Ž' => 'ž' ,
'' => '' ,
'' => '' ,
'‘' => '‘' ,
'’' => '’' ,
'“' => '“' ,
'”' => '”' ,
'•' => '•' ,
'–' => '–' ,
'—' => '—' ,
'˜' => '˜' ,
'™' => '™' ,
'š' => 'š' ,
'›' => '›' ,
'œ' => 'œ' ,
'' => '' ,
'ž' => '' ,
'Ÿ' => 'Ÿ'
);
2004-02-09 07:57:02 +01:00
2004-04-22 09:41:57 +02:00
// Remove metadata tags
2004-02-09 07:57:02 +01:00
$content = preg_replace ( '/<title>(.+?)<\/title>/' , '' , $content );
$content = preg_replace ( '/<category>(.+?)<\/category>/' , '' , $content );
2004-04-22 09:41:57 +02:00
// Converts lone & characters into & (a.k.a. &)
$content = preg_replace ( '/&([^#])(?![a-z]{1,8};)/i' , '&$1' , $content );
// Fix Word pasting
2004-04-22 02:44:14 +02:00
$content = strtr ( $content , $wp_htmltranswinuni );
2004-02-09 07:57:02 +01:00
2004-04-22 09:41:57 +02:00
// Just a little XHTML help
$content = str_replace ( '<br>' , '<br />' , $content );
$content = str_replace ( '<hr>' , '<hr />' , $content );
2004-02-09 07:57:02 +01:00
return $content ;
}
2004-12-23 01:08:43 +01:00
function funky_javascript_fix ( $text ) {
// Fixes for browsers' javascript bugs
2004-12-30 18:34:27 +01:00
global $is_macIE , $is_winIE ;
2004-12-23 01:08:43 +01:00
2004-12-30 18:34:27 +01:00
if ( $is_winIE || $is_macIE )
2004-12-23 01:08:43 +01:00
$text = preg_replace ( " / \ %u([0-9A-F] { 4,4})/e " , " '&#'.base_convert(' \\ 1',16,10).';' " , $text );
return $text ;
}
2004-02-09 07:57:02 +01:00
/*
balanceTags
Balances Tags of string using a modified stack .
@ param text Text to be balanced
@ return Returns balanced text
@ author Leonard Lin ( leonard @ acm . org )
@ version v1 . 1
@ date November 4 , 2001
@ license GPL v2 . 0
@ notes
@ changelog
2005-01-06 11:24:11 +01:00
--- Modified by Scott Reilly ( coffee2code ) 02 Aug 2004
2004-02-09 07:57:02 +01:00
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 balanceTags ( $text , $is_comment = 0 ) {
2004-03-01 07:13:32 +01:00
if ( get_settings ( 'use_balanceTags' ) == 0 ) {
2004-02-09 07:57:02 +01:00
return $text ;
}
$tagstack = array (); $stacksize = 0 ; $tagqueue = '' ; $newtext = '' ;
# 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})#' , '<$1' , $text );
while ( preg_match ( " /<( \ /? \ w*) \ s*([^>]*)>/ " , $text , $regex )) {
2005-01-06 11:24:11 +01:00
$newtext .= $tagqueue ;
2004-02-09 07:57:02 +01:00
$i = strpos ( $text , $regex [ 0 ]);
2005-01-06 11:24:11 +01:00
$l = strlen ( $regex [ 0 ]);
2004-02-09 07:57:02 +01:00
// 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
2005-01-06 11:24:11 +01:00
// 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 ( $tag == 'br' || $tag == 'img' || $tag == 'hr' || $tag == 'input' ) {
$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 ) && ( $tag != 'div' ) && ( $tagstack [ $stacksize - 1 ] == $tag )) {
$tagqueue = '</' . array_pop ( $tagstack ) . '>' ;
$stacksize -- ;
}
2004-02-09 07:57:02 +01:00
$stacksize = array_push ( $tagstack , $tag );
}
// Attributes
$attributes = $regex [ 2 ];
if ( $attributes ) {
$attributes = ' ' . $attributes ;
}
$tag = '<' . $tag . $attributes . '>' ;
2005-01-06 11:24:11 +01:00
//If already queuing a close tag, then put this tag on, too
if ( $tagqueue ) {
$tagqueue .= $tag ;
$tag = '' ;
}
2004-02-09 07:57:02 +01:00
}
$newtext .= substr ( $text , 0 , $i ) . $tag ;
$text = substr ( $text , $i + $l );
}
// Clear Tag Queue
2005-01-06 11:24:11 +01:00
$newtext .= $tagqueue ;
2004-02-09 07:57:02 +01:00
// Add Remaining text
$newtext .= $text ;
// Empty Stack
while ( $x = array_pop ( $tagstack )) {
2005-01-06 11:24:11 +01:00
$newtext .= '</' . $x . '>' ; // Add remaining tags to close
2004-02-09 07:57:02 +01:00
}
2004-04-22 09:41:57 +02:00
// WP fix for the bug with HTML comments
2004-02-09 07:57:02 +01:00
$newtext = str_replace ( " < !-- " , " <!-- " , $newtext );
$newtext = str_replace ( " < !-- " , " < !-- " , $newtext );
return $newtext ;
}
function format_to_edit ( $content ) {
2004-04-05 01:15:54 +02:00
$content = apply_filters ( 'format_to_edit' , $content );
2004-02-09 07:57:02 +01:00
$content = htmlspecialchars ( $content );
return $content ;
}
2004-03-29 05:54:57 +02:00
2004-02-09 07:57:02 +01:00
function format_to_post ( $content ) {
2004-03-29 05:54:57 +02:00
global $wpdb ;
2004-04-05 01:15:54 +02:00
$content = apply_filters ( 'format_to_post' , $content );
2004-02-09 07:57:02 +01:00
return $content ;
}
function zeroise ( $number , $threshold ) { // function to add leading zeros when necessary
2004-12-30 18:34:27 +01:00
return sprintf ( '%0' . $threshold . 's' , $number );
2004-02-09 07:57:02 +01:00
}
function backslashit ( $string ) {
$string = preg_replace ( '/([a-z])/i' , '\\\\\1' , $string );
return $string ;
}
function trailingslashit ( $string ) {
if ( '/' != substr ( $string , - 1 )) {
$string .= '/' ;
}
return $string ;
}
function addslashes_gpc ( $gpc ) {
if ( ! get_magic_quotes_gpc ()) {
$gpc = addslashes ( $gpc );
}
return $gpc ;
}
function antispambot ( $emailaddy , $mailto = 0 ) {
$emailNOSPAMaddy = '' ;
srand (( float ) microtime () * 1000000 );
for ( $i = 0 ; $i < strlen ( $emailaddy ); $i = $i + 1 ) {
$j = floor ( rand ( 0 , 1 + $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 , $i , 1 ))), 2 );
}
}
$emailNOSPAMaddy = str_replace ( '@' , '@' , $emailNOSPAMaddy );
return $emailNOSPAMaddy ;
}
2004-12-28 21:28:57 +01:00
function make_clickable ( $ret ) {
2004-08-28 10:40:13 +02:00
$ret = ' ' . $ret . ' ' ;
2005-01-21 19:24:14 +01:00
$ret = preg_replace ( " #([ \ s>])(https?)://([^ \ s<> { }()]+[^ \ s.,<> { }()])#i " , " $ 1<a href=' $ 2:// $ 3' rel='nofollow'> $ 2:// $ 3</a> " , $ret );
$ret = preg_replace ( " #( \ s)www \ .([a-z0-9 \ -]+) \ .([a-z0-9 \ -. \ ~]+)((?:/[^ <> { }() \n \r ]*[^., <> { }() \n \r ]?)?)#i " , " $ 1<a href='http://www. $ 2. $ 3 $ 4' rel='nofollow'>www. $ 2. $ 3 $ 4</a> " , $ret );
2004-12-24 22:00:06 +01:00
$ret = preg_replace ( " #( \ s)([a-z0-9 \ -_.]+)@([^,< \n \r ]+)#i " , " $ 1<a href= \" mailto: $ 2@ $ 3 \" > $ 2@ $ 3</a> " , $ret );
2004-08-28 10:40:13 +02:00
$ret = trim ( $ret );
return $ret ;
2004-02-09 07:57:02 +01:00
}
2005-01-21 19:24:14 +01:00
function wp_rel_nofollow ( $text ) {
2005-02-11 01:55:01 +01:00
$text = preg_replace ( '|<a (.+?)>|i' , '<a $1 rel="nofollow">' , $text );
2005-01-21 19:24:14 +01:00
return $text ;
}
2004-02-09 07:57:02 +01:00
function convert_smilies ( $text ) {
global $wp_smiliessearch , $wp_smiliesreplace ;
$output = '' ;
2004-03-01 20:55:45 +01:00
if ( get_settings ( 'use_smilies' )) {
2004-02-09 07:57:02 +01:00
// HTML loop taken from texturize function, could possible be consolidated
$textarr = preg_split ( " /(<.*>)/U " , $text , - 1 , PREG_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 = str_replace ( $wp_smiliessearch , $wp_smiliesreplace , $content );
}
$output .= $content ;
}
} else {
// return default text.
$output = $text ;
}
return $output ;
}
function is_email ( $user_email ) {
2004-05-14 07:52:53 +02:00
$chars = " /^([a-z0-9+_]| \\ -| \\ .)+@(([a-z0-9_]| \\ -)+ \\ .)+[a-z] { 2,6} \$ /i " ;
2004-02-09 07:57:02 +01:00
if ( strstr ( $user_email , '@' ) && strstr ( $user_email , '.' )) {
if ( preg_match ( $chars , $user_email )) {
return true ;
} else {
return false ;
}
} else {
return false ;
}
}
function strip_all_but_one_link ( $text , $mylink ) {
$match_link = '#(<a.+?href.+?' . '>)(.+?)(</a>)#' ;
preg_match_all ( $match_link , $text , $matches );
$count = count ( $matches [ 0 ]);
for ( $i = 0 ; $i < $count ; $i ++ ) {
if ( ! strstr ( $matches [ 0 ][ $i ], $mylink )) {
$text = str_replace ( $matches [ 0 ][ $i ], $matches [ 2 ][ $i ], $text );
}
}
return $text ;
}
2004-02-22 01:31:25 +01:00
// 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 ;
}
}
2004-02-23 04:04:55 +01:00
// give it a date, it will give you the same date as GMT
function get_gmt_from_date ( $string ) {
2004-02-23 17:09:27 +01:00
// 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 ]);
2004-04-24 23:52:24 +02:00
$string_gmt = gmdate ( 'Y-m-d H:i:s' , $string_time - get_settings ( 'gmt_offset' ) * 3600 );
2004-02-23 17:09:27 +01:00
return $string_gmt ;
2004-02-23 04:04:55 +01:00
}
2004-02-23 05:37:11 +01:00
// give it a GMT date, it will give you the same date with $time_difference added
function get_date_from_gmt ( $string ) {
2004-02-23 17:09:27 +01:00
// 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 ]);
2004-04-24 23:52:24 +02:00
$string_localtime = gmdate ( 'Y-m-d H:i:s' , $string_time + get_settings ( 'gmt_offset' ) * 3600 );
2004-02-23 17:09:27 +01:00
return $string_localtime ;
2004-02-23 05:37:11 +01:00
}
2004-05-31 19:02:09 +02:00
// 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 ( $timezone , 0 , 1 ) == '+' ) ? 1 : - 1 ;
$hours = intval ( substr ( $timezone , 1 , 2 ));
$minutes = intval ( substr ( $timezone , 3 , 4 )) / 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_settings ( '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 );
}
}
2004-06-10 12:01:45 +02:00
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 ;
}
2004-12-16 03:57:05 +01:00
function sanitize_email ( $email ) {
return preg_replace ( '/[^a-z0-9+_.@-]/i' , '' , $email );
}
2004-12-19 01:10:10 +01:00
function human_time_diff ( $from , $to = '' ) {
if ( empty ( $to ) )
$to = time ();
2005-03-10 09:01:02 +01:00
$diff = ( int ) abs ( $to - $from );
2004-12-19 01:10:10 +01:00
if ( $diff <= 3600 ) {
$mins = round ( $diff / 60 );
2005-01-24 07:01:04 +01:00
if ( $mins <= 1 )
$since = __ ( '1 min' );
else
$since = sprintf ( __ ( '%s mins' ), $mins );
2004-12-19 01:10:10 +01:00
} else if (( $diff <= 86400 ) && ( $diff > 3600 )) {
$hours = round ( $diff / 3600 );
if ( $hours <= 1 )
$since = __ ( '1 hour' );
else
$since = sprintf ( __ ( '%s hours' ), $hours );
} elseif ( $diff >= 86400 ) {
$days = round ( $diff / 86400 );
if ( $days <= 1 )
$since = __ ( '1 day' );
else
$since = sprintf ( __ ( '%s days' ), $days );
}
return $since ;
}
2005-03-14 02:02:04 +01:00
function wp_trim_excerpt ( $text ) { // Fakes an excerpt if needed
2005-02-15 01:21:21 +01:00
global $post ;
if ( '' == $text ) {
$text = $post -> post_content ;
2005-03-14 02:02:04 +01:00
$text = apply_filters ( 'the_content' , $text );
$text = str_replace ( ']]>' , ']]>' , $text );
$text = strip_tags ( $text );
2005-02-15 01:21:21 +01:00
$excerpt_length = 55 ;
2005-03-14 02:02:04 +01:00
$words = explode ( ' ' , $text , $excerpt_length + 1 );
if ( count ( $words ) > $excerpt_length ) {
array_pop ( $words );
array_push ( $words , '[...]' );
$text = implode ( ' ' , $words );
2005-02-15 01:21:21 +01:00
}
2005-03-14 02:02:04 +01:00
}
2005-02-15 01:21:21 +01:00
return $text ;
}
2005-03-14 02:02:04 +01:00
?>