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 );
$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 );
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-03-22 02:34:32 +01: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 );
$curl = preg_replace ( '/"(\s|\Z)/' , '”$1' , $curl );
2004-02-09 07:57:02 +01:00
$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 = 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 ;
}
2004-03-21 08:07:55 +01:00
function clean_pre ( $text ) {
$text = stripslashes ( $text );
$text = str_replace ( '<br />' , '' , $text );
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
$pee = preg_replace ( '!(<(?:table|thead|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|p|h[1-6])[^>]*>)!' , " \n $ 1 " , $pee );
$pee = preg_replace ( '!(</(?:table|thead|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|p|h[1-6])>)!' , " $ 1 \n " , $pee );
$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-03-11 17:38:54 +01:00
$pee = preg_replace ( '!<p>\s*(</?(?:table|thead|tbody|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-03-11 17:38:54 +01:00
$pee = preg_replace ( '!<p>\s*(</?(?:table|thead|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|p|h[1-6])[^>]*>)!' , " $ 1 " , $pee );
$pee = preg_replace ( '!(</?(?:table|thead|tbody|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
2004-03-11 17:38:54 +01:00
$pee = preg_replace ( '!(</?(?:table|thead|tbody|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-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 ;
}
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 ;
}
2004-04-22 09:41:57 +02:00
function convert_chars ( $content , $flag = 'obsolete' ) {
global $wp_htmltranswinuni ;
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 ;
}
/*
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 ) {
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 )) {
$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
}
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 ) {
$content = stripslashes ( $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
$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_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-02-09 07:57:02 +01:00
?>