2004-02-09 07:57:02 +01:00
< ? php
function wptexturize ( $text ) {
$output = " " ;
$textarr = preg_split ( " /(<.*>)/Us " , $text , - 1 , PREG_SPLIT_DELIM_CAPTURE ); // capture the tags as well as in between
$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 );
$curl = str_replace ( '--' , '–' , $curl );
$curl = str_replace ( " ... " , '…' , $curl );
$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 );
$curl = preg_replace ( " /'s/ " , " ’s " , $curl );
$curl = preg_replace ( " /'( \ d \ d(?:’|')?s)/ " , " ’ $ 1 " , $curl );
$curl = preg_replace ( '/(\s|\A|")\'/' , '$1‘' , $curl );
$curl = preg_replace ( " /( \ d+) \" / " , " $ 1″ " , $curl );
$curl = preg_replace ( " /( \ d+)'/ " , " $ 1′ " , $curl );
$curl = preg_replace ( " /( \ S)'([^' \ s])/ " , " $ 1’ $ 2 " , $curl );
$curl = preg_replace ( '/"([\s.,!?;:&\']|\Z)/' , '”$1' , $curl );
$curl = preg_replace ( '/(\s|\A)"/' , '$1“' , $curl );
$curl = preg_replace ( " /'([ \ s.]| \ Z)/ " , '’$1' , $curl );
$curl = preg_replace ( " / \ (tm \ )/i " , '™' , $curl );
$curl = preg_replace ( " / \ (c \ )/i " , '©' , $curl );
$curl = preg_replace ( " / \ (r \ )/i " , '®' , $curl );
$curl = preg_replace ( '/&([^#])(?![a-z]{1,8};)/' , '&$1' , $curl );
$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 ;
}
$output .= $curl ;
}
return $output ;
}
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-02-13 07:33:55 +01:00
$pee = preg_replace ( '!(<(?:table|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|p|h[1-6])[^>]*>)!' , " \n $ 1 " , $pee ); // Space things out a little
$pee = preg_replace ( '!(</(?:table|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|p|h[1-6])>)!' , " $ 1 \n " , $pee ); // Space things out a little
2004-02-09 07:57:02 +01:00
$pee = preg_replace ( " /( \r \n | \r )/ " , " \n " , $pee ); // cross-platform newlines
$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-02-13 07:33:55 +01:00
$pee = preg_replace ( '!<p>\s*(</?(?:table|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|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-02-13 07:33:55 +01:00
$pee = preg_replace ( '!<p>\s*(</?(?:table|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|p|h[1-6])[^>]*>)!' , " $ 1 " , $pee );
$pee = preg_replace ( '!(</?(?:table|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|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
$pee = preg_replace ( '!(</?(?:table|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|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-02-09 07:57:02 +01:00
$pee = preg_replace ( '/&([^#])(?![a-z]{1,8};)/' , '&$1' , $pee );
return $pee ;
}
function sanitize_title ( $title ) {
$title = strtolower ( $title );
$title = preg_replace ( '/&.+?;/' , '' , $title ); // kill entities
$title = preg_replace ( '/[^a-z0-9 -]/' , '' , $title );
$title = preg_replace ( '/\s+/' , ' ' , $title );
$title = trim ( $title );
$title = str_replace ( ' ' , '-' , $title );
$title = preg_replace ( '|-+|' , '-' , $title );
return $title ;
}
function convert_chars ( $content , $flag = 'obsolete attribute left there for backwards compatibility' ) { // html/unicode entities output
global $use_htmltrans , $wp_htmltrans , $wp_htmltranswinuni ;
// removes metadata tags
$content = preg_replace ( '/<title>(.+?)<\/title>/' , '' , $content );
$content = preg_replace ( '/<category>(.+?)<\/category>/' , '' , $content );
if ( $use_htmltrans ) {
// converts lone & characters into & (a.k.a. &)
$content = preg_replace ( '/&[^#](?![a-z]*;)/ie' , '"&".substr("\0",1)' , $content );
// converts HTML-entities to their display values in order to convert them again later
$content = preg_replace ( '/[' . chr ( 127 ) . '-' . chr ( 255 ) . ']/e' , '"&#".ord(\'\0\').";"' , $content );
$content = strtr ( $content , $wp_htmltrans );
// now converting: Windows CP1252 => Unicode (valid HTML)
// (if you've ever pasted text from MSWord, you'll understand)
$content = strtr ( $content , $wp_htmltranswinuni );
}
// you can delete these 2 lines if you don't like <br /> and <hr />
$content = str_replace ( " <br> " , " <br /> " , $content );
$content = str_replace ( " <hr> " , " <hr /> " , $content );
return $content ;
}
/*
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
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 ) {
global $use_balanceTags ;
if ( $use_balanceTags == 0 ) {
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 )) {
$newtext = $newtext . $tagqueue ;
$i = strpos ( $text , $regex [ 0 ]);
$l = strlen ( $tagqueue ) + 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
// Push if not img or br or hr
if ( $tag != 'br' && $tag != 'img' && $tag != 'hr' ) {
$stacksize = array_push ( $tagstack , $tag );
}
// Attributes
// $attributes = $regex[2];
$attributes = $regex [ 2 ];
if ( $attributes ) {
$attributes = ' ' . $attributes ;
}
$tag = '<' . $tag . $attributes . '>' ;
}
$newtext .= substr ( $text , 0 , $i ) . $tag ;
$text = substr ( $text , $i + $l );
}
// Clear Tag Queue
$newtext = $newtext . $tagqueue ;
// Add Remaining text
$newtext .= $text ;
// Empty Stack
while ( $x = array_pop ( $tagstack )) {
$newtext = $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 autobrize ( $content ) {
$content = preg_replace ( " /<br> \n / " , " \n " , $content );
$content = preg_replace ( " /<br \ /> \n / " , " \n " , $content );
$content = preg_replace ( " /( \015 \012 )|( \015 )|( \012 )/ " , " <br /> \n " , $content );
return $content ;
}
function unautobrize ( $content ) {
$content = preg_replace ( " /<br> \n / " , " \n " , $content ); //for PHP versions before 4.0.5
$content = preg_replace ( " /<br \ /> \n / " , " \n " , $content );
return $content ;
}
function format_to_edit ( $content ) {
global $autobr ;
$content = stripslashes ( $content );
if ( $autobr ) { $content = unautobrize ( $content ); }
$content = htmlspecialchars ( $content );
return $content ;
}
function format_to_post ( $content ) {
global $post_autobr , $comment_autobr ;
$content = addslashes ( $content );
if ( $post_autobr || $comment_autobr ) { $content = autobrize ( $content ); }
return $content ;
}
function zeroise ( $number , $threshold ) { // function to add leading zeros when necessary
$l = strlen ( $number );
if ( $l < $threshold )
for ( $i = 0 ; $i < ( $threshold - $l ); $i = $i + 1 ) { $number = '0' . $number ; }
return $number ;
}
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 ;
}
function make_clickable ( $text ) { // original function: phpBB, extended here for AIM & ICQ
$ret = " " . $text ;
$ret = preg_replace ( " #([ \n ])([a-z]+?)://([^, <> { } \n \r ]+)#i " , " \\ 1<a href= \" \\ 2:// \\ 3 \" target= \" _blank \" > \\ 2:// \\ 3</a> " , $ret );
$ret = preg_replace ( " #([ \n ])aim:([^,< \n \r ]+)#i " , " \\ 1<a href= \" aim:goim?screenname= \\ 2 \\ 3&message=Hello \" > \\ 2 \\ 3</a> " , $ret );
$ret = preg_replace ( " #([ \n ])icq:([^,< \n \r ]+)#i " , " \\ 1<a href= \" http://wwp.icq.com/scripts/search.dll?to= \\ 2 \\ 3 \" > \\ 2 \\ 3</a> " , $ret );
$ret = preg_replace ( " #([ \n ])www \ .([a-z0-9 \ -]+) \ .([a-z0-9 \ -. \ ~]+)((?:/[^,< \n \r ]*)?)#i " , " \\ 1<a href= \" http://www. \\ 2. \\ 3 \\ 4 \" target= \" _blank \" >www. \\ 2. \\ 3 \\ 4</a> " , $ret );
$ret = preg_replace ( " #([ \n ])([a-z0-9 \ -_.]+?)@([^,< \n \r ]+)#i " , " \\ 1<a href= \" mailto: \\ 2@ \\ 3 \" > \\ 2@ \\ 3</a> " , $ret );
$ret = substr ( $ret , 1 );
return $ret ;
}
function convert_bbcode ( $content ) {
global $wp_bbcode , $use_bbcode ;
if ( $use_bbcode ) {
$content = preg_replace ( $wp_bbcode [ " in " ], $wp_bbcode [ " out " ], $content );
}
$content = convert_bbcode_email ( $content );
return $content ;
}
function convert_bbcode_email ( $content ) {
global $use_bbcode ;
$bbcode_email [ " in " ] = array (
'#\[email](.+?)\[/email]#eis' ,
'#\[email=(.+?)](.+?)\[/email]#eis'
);
$bbcode_email [ " out " ] = array (
" '<a href= \" mailto:'.antispambot(' \\ 1').' \" >'.antispambot(' \\ 1').'</a>' " , // E-mail
" '<a href= \" mailto:'.antispambot(' \\ 1').' \" > \\ 2</a>' "
);
$content = preg_replace ( $bbcode_email [ " in " ], $bbcode_email [ " out " ], $content );
return $content ;
}
function convert_gmcode ( $content ) {
global $wp_gmcode , $use_gmcode ;
if ( $use_gmcode ) {
$content = preg_replace ( $wp_gmcode [ " in " ], $wp_gmcode [ " out " ], $content );
}
return $content ;
}
function convert_smilies ( $text ) {
global $smilies_directory , $use_smilies ;
global $wp_smiliessearch , $wp_smiliesreplace ;
$output = '' ;
if ( $use_smilies ) {
// 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 ) {
$chars = " /^([a-z0-9_]| \\ -| \\ .)+@(([a-z0-9_]| \\ -)+ \\ .)+[a-z] { 2,4} \$ /i " ;
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 04:46:55 +01:00
$time_difference = get_settings ( 'time_difference' );
2004-02-23 04:04:55 +01:00
// $string must be of the form 'yyyy-mm-dd hh:mm:ss'
2004-02-23 06:36:57 +01:00
if ( $string != gmdate ( 'Y-m-d H:i:s' , strtotime ( $string ))) {
2004-02-23 04:04:55 +01:00
$string_time = gmmktime ( substr ( $string , 11 , 13 ), substr ( $string , 14 , 16 ), substr ( $string , 17 , 19 ), substr ( $string , 5 , 7 ), substr ( $string , 8 , 10 ), substr ( $string , 0 , 4 ));
$gmt_time = $string_time - $time_difference * 3600 ;
2004-02-23 06:36:57 +01:00
return date ( 'Y-m-d H:i:s' , $gmt_time );
2004-02-23 04:04:55 +01:00
} else {
return $string ;
}
}
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 ) {
$time_difference = get_settings ( 'time_difference' );
// $string must be of the form 'yyyy-mm-dd hh:mm:ss'
2004-02-23 06:36:57 +01:00
if ( $string == gmdate ( 'Y-m-d H:i:s' , gmmktime ( substr ( $string , 11 , 13 ), substr ( $string , 14 , 16 ), substr ( $string , 17 , 19 ), substr ( $string , 5 , 7 ), substr ( $string , 8 , 10 ), substr ( $string , 0 , 4 )))) {
$local_time = strtotime ( $string ) + $time_difference * 3600 ;
return date ( 'Y-m-d H:i:s' , $local_time );
2004-02-23 05:37:11 +01:00
} else {
return $string ;
}
}
2004-02-09 07:57:02 +01:00
?>