2012-06-26 05:01:32 +00:00
< ? php
2011-06-10 03:02:48 +00:00
2011-01-31 09:38:49 +00:00
require_once ( " include/oembed.php " );
2011-06-10 03:02:48 +00:00
require_once ( 'include/event.php' );
2012-12-20 23:08:58 +00:00
function bb_cleanstyle ( $st ) {
return " <span style= \" " . cleancss ( $st [ 1 ]) . " ; \" > " . $st [ 2 ] . " </span> " ;
}
function bb_cleanclass ( $st ) {
return " <span class= \" " . cleancss ( $st [ 1 ]) . " \" > " . $st [ 2 ] . " </span> " ;
}
2012-08-17 05:59:21 +00:00
function cleancss ( $input ) {
2011-07-19 02:17:16 +00:00
2012-08-17 05:59:21 +00:00
$cleaned = " " ;
$input = strtolower ( $input );
for ( $i = 0 ; $i < strlen ( $input ); $i ++ ) {
$char = substr ( $input , $i , 1 );
if (( $char >= " a " ) and ( $char <= " z " ))
$cleaned .= $char ;
if ( ! ( strpos ( " #;:0123456789 " , $char ) === false ))
$cleaned .= $char ;
}
return ( $cleaned );
}
2011-07-19 02:17:16 +00:00
function stripcode_br_cb ( $s ) {
return '[code]' . str_replace ( '<br />' , '' , $s [ 1 ]) . '[/code]' ;
}
2011-10-24 12:30:11 +00:00
function tryoembed ( $match ){
$url = (( count ( $match ) == 2 ) ? $match [ 1 ] : $match [ 2 ]);
2012-02-13 01:15:09 +00:00
// logger("tryoembed: $url");
2012-02-19 19:36:59 +00:00
2011-10-24 12:30:11 +00:00
$o = oembed_fetch_url ( $url );
//echo "<pre>"; var_dump($match, $url, $o); killme();
if ( $o -> type == " error " ) return $match [ 0 ];
2012-02-19 19:36:59 +00:00
2011-10-24 12:30:11 +00:00
$html = oembed_format_object ( $o );
2011-10-25 12:59:31 +00:00
return $html ; //oembed_iframe($html,$o->width,$o->height);
2012-02-19 19:36:59 +00:00
2011-10-24 12:30:11 +00:00
}
2012-02-19 19:36:59 +00:00
// [noparse][i]italic[/i][/noparse] turns into
// [noparse][ i ]italic[ /i ][/noparse],
2012-02-12 22:35:29 +00:00
// to hide them from parser.
function bb_spacefy ( $st ) {
$whole_match = $st [ 0 ];
$captured = $st [ 1 ];
$spacefied = preg_replace ( " / \ [(.*?) \ ]/ " , " [ $ 1 ] " , $captured );
$new_str = str_replace ( $captured , $spacefied , $whole_match );
return $new_str ;
}
2012-02-19 19:36:59 +00:00
// The previously spacefied [noparse][ i ]italic[ /i ][/noparse],
2012-02-12 22:35:29 +00:00
// now turns back and the [noparse] tags are trimed
// returning [i]italic[/i]
2011-10-24 12:30:11 +00:00
2012-02-12 22:35:29 +00:00
function bb_unspacefy_and_trim ( $st ) {
$whole_match = $st [ 0 ];
$captured = $st [ 1 ];
$unspacefied = preg_replace ( " / \ [ (.*?) \ ]/ " , " [ $ 1] " , $captured );
return $unspacefied ;
}
2011-07-19 02:17:16 +00:00
2012-08-27 00:18:43 +00:00
function bb_find_open_close ( $s , $open , $close , $occurance = 1 ) {
if ( $occurance < 1 )
$occurance = 1 ;
$start_pos = - 1 ;
for ( $i = 1 ; $i <= $occurance ; $i ++ ) {
if ( $start_pos !== false )
$start_pos = strpos ( $s , $open , $start_pos + 1 );
}
if ( $start_pos === false )
return false ;
$end_pos = strpos ( $s , $close , $start_pos );
if ( $end_pos === false )
return false ;
$res = array ( 'start' => $start_pos , 'end' => $end_pos );
return $res ;
}
2012-08-26 20:56:34 +00:00
function get_bb_tag_pos ( $s , $name , $occurance = 1 ) {
if ( $occurance < 1 )
$occurance = 1 ;
$start_open = - 1 ;
for ( $i = 1 ; $i <= $occurance ; $i ++ ) {
if ( $start_open !== false )
$start_open = strpos ( $s , '[' . $name , $start_open + 1 ); // allow [name= type tags
}
if ( $start_open === false )
return false ;
$start_equal = strpos ( $s , '=' , $start_open );
$start_close = strpos ( $s , ']' , $start_open );
if ( $start_close === false )
return false ;
$start_close ++ ;
$end_open = strpos ( $s , '[/' . $name . ']' , $start_close );
if ( $end_open === false )
return false ;
$res = array ( 'start' => array ( 'open' => $start_open , 'close' => $start_close ),
'end' => array ( 'open' => $end_open , 'close' => $end_open + strlen ( '[/' . $name . ']' )) );
if ( $start_equal !== false )
$res [ 'start' ][ 'equal' ] = $start_equal + 1 ;
return $res ;
}
function bb_tag_preg_replace ( $pattern , $replace , $name , $s ) {
$string = $s ;
$occurance = 1 ;
$pos = get_bb_tag_pos ( $string , $name , $occurance );
while ( $pos !== false && $occurance < 1000 ) {
$start = substr ( $string , 0 , $pos [ 'start' ][ 'open' ]);
$subject = substr ( $string , $pos [ 'start' ][ 'open' ], $pos [ 'end' ][ 'close' ] - $pos [ 'start' ][ 'open' ]);
$end = substr ( $string , $pos [ 'end' ][ 'close' ]);
if ( $end === false )
$end = '' ;
$subject = preg_replace ( $pattern , $replace , $subject );
$string = $start . $subject . $end ;
$occurance ++ ;
$pos = get_bb_tag_pos ( $string , $name , $occurance );
}
return $string ;
}
2012-07-07 22:20:24 +00:00
if ( ! function_exists ( 'bb_extract_images' )) {
function bb_extract_images ( $body ) {
$saved_image = array ();
$orig_body = $body ;
$new_body = '' ;
$cnt = 0 ;
$img_start = strpos ( $orig_body , '[img' );
$img_st_close = ( $img_start !== false ? strpos ( substr ( $orig_body , $img_start ), ']' ) : false );
$img_end = ( $img_start !== false ? strpos ( substr ( $orig_body , $img_start ), '[/img]' ) : false );
while (( $img_st_close !== false ) && ( $img_end !== false )) {
$img_st_close ++ ; // make it point to AFTER the closing bracket
$img_end += $img_start ;
if ( ! strcmp ( substr ( $orig_body , $img_start + $img_st_close , 5 ), 'data:' )) {
// This is an embedded image
2012-07-08 00:47:13 +00:00
$saved_image [ $cnt ] = substr ( $orig_body , $img_start + $img_st_close , $img_end - ( $img_start + $img_st_close ));
2012-07-07 22:20:24 +00:00
$new_body = $new_body . substr ( $orig_body , 0 , $img_start ) . '[$#saved_image' . $cnt . '#$]' ;
2012-07-08 00:47:13 +00:00
$cnt ++ ;
2012-07-07 22:20:24 +00:00
}
else
$new_body = $new_body . substr ( $orig_body , 0 , $img_end + strlen ( '[/img]' ));
$orig_body = substr ( $orig_body , $img_end + strlen ( '[/img]' ));
if ( $orig_body === false ) // in case the body ends on a closing image tag
$orig_body = '' ;
$img_start = strpos ( $orig_body , '[img' );
$img_st_close = ( $img_start !== false ? strpos ( substr ( $orig_body , $img_start ), ']' ) : false );
$img_end = ( $img_start !== false ? strpos ( substr ( $orig_body , $img_start ), '[/img]' ) : false );
}
$new_body = $new_body . $orig_body ;
return array ( 'body' => $new_body , 'images' => $saved_image );
}}
if ( ! function_exists ( 'bb_replace_images' )) {
function bb_replace_images ( $body , $images ) {
$newbody = $body ;
$cnt = 0 ;
foreach ( $images as $image ) {
// We're depending on the property of 'foreach' (specified on the PHP website) that
// it loops over the array starting from the first element and going sequentially
// to the last element
$newbody = str_replace ( '[$#saved_image' . $cnt . '#$]' , '<img src="' . $image . '" alt="' . t ( 'Image/photo' ) . '" />' , $newbody );
$cnt ++ ;
}
return $newbody ;
}}
2012-12-17 02:01:40 +00:00
function bb_ShareAttributes ( $match ) {
2012-07-07 22:20:24 +00:00
2012-12-17 02:01:40 +00:00
$attributes = $match [ 1 ];
$author = " " ;
preg_match ( " /author='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
2012-12-21 01:10:26 +00:00
$author = html_entity_decode ( $matches [ 1 ], ENT_QUOTES , 'UTF-8' );
2012-12-17 02:01:40 +00:00
preg_match ( '/author="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$author = $matches [ 1 ];
$link = " " ;
preg_match ( " /link='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$link = $matches [ 1 ];
preg_match ( '/link="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$link = $matches [ 1 ];
$avatar = " " ;
preg_match ( " /avatar='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$avatar = $matches [ 1 ];
preg_match ( '/avatar="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$avatar = $matches [ 1 ];
$profile = " " ;
preg_match ( " /profile='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$profile = $matches [ 1 ];
preg_match ( '/profile="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$profile = $matches [ 1 ];
2013-01-15 22:58:50 +00:00
$posted = " " ;
preg_match ( " /posted='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$posted = $matches [ 1 ];
preg_match ( '/posted="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$posted = $matches [ 1 ];
$reldate = (( $posted ) ? " " . relative_date ( $posted ) : '' );
2012-12-17 02:01:40 +00:00
$headline = '<div class="shared_header">' ;
if ( $avatar != " " )
$headline .= '<img src="' . $avatar . '" height="32" width="32" >' ;
2013-01-15 22:58:50 +00:00
$headline .= sprintf ( t ( '<span><a href="%s" target="external-link">%s</a> wrote the following <a href="%s" target="external-link">post</a>' . $reldate . ':</span>' ), $profile , $author , $link );
2012-12-17 02:01:40 +00:00
$headline .= " </div> " ;
2012-12-19 11:18:52 +00:00
$text = $headline . '<blockquote class="shared_content">' . trim ( $match [ 2 ]) . " </blockquote> " ;
2012-12-17 02:01:40 +00:00
return ( $text );
}
2012-07-07 22:20:24 +00:00
2010-08-20 03:52:49 +00:00
// BBcode 2 HTML was written by WAY2WEB.net
2012-01-03 02:40:38 +00:00
// extended to work with Mistpark/Friendica - Mike Macgirvin
2010-08-20 03:52:49 +00:00
2012-06-17 23:29:08 +00:00
function bbcode ( $Text , $preserve_nl = false , $tryoembed = true ) {
2010-12-30 22:21:05 +00:00
2013-01-26 17:35:39 +00:00
$stamp1 = microtime ( true );
2012-06-03 01:05:23 +00:00
$a = get_app ();
2012-07-07 22:20:24 +00:00
// Hide all [noparse] contained bbtags by spacefying them
// POSSIBLE BUG --> Will the 'preg' functions crash if there's an embedded image?
2012-02-12 22:35:29 +00:00
$Text = preg_replace_callback ( " / \ [noparse \ ](.*?) \ [ \ /noparse \ ]/ism " , 'bb_spacefy' , $Text );
$Text = preg_replace_callback ( " / \ [nobb \ ](.*?) \ [ \ /nobb \ ]/ism " , 'bb_spacefy' , $Text );
$Text = preg_replace_callback ( " / \ [pre \ ](.*?) \ [ \ /pre \ ]/ism " , 'bb_spacefy' , $Text );
2011-11-27 12:09:14 +00:00
2012-09-20 02:35:39 +00:00
// Move all spaces out of the tags
$Text = preg_replace ( " / \ [( \ w*) \ ]( \ s*)/ism " , '$2[$1]' , $Text );
$Text = preg_replace ( " /( \ s*) \ [ \ /( \ w*) \ ]/ism " , '[/$2]$1' , $Text );
2012-07-07 22:20:24 +00:00
// Extract the private images which use data url's since preg has issues with
// large data sizes. Stash them away while we do bbcode conversion, and then put them back
2011-11-27 22:03:49 +00:00
// in after we've done all the regex matching. We cannot use any preg functions to do this.
2012-07-07 22:20:24 +00:00
$extracted = bb_extract_images ( $Text );
$Text = $extracted [ 'body' ];
$saved_image = $extracted [ 'images' ];
2011-11-27 12:09:14 +00:00
2011-09-11 22:44:07 +00:00
// If we find any event code, turn it into an event.
2012-02-19 19:36:59 +00:00
// After we're finished processing the bbcode we'll
2011-09-11 22:44:07 +00:00
// replace all of the event code with a reformatted version.
$ev = bbtoevent ( $Text );
2010-08-20 03:52:49 +00:00
// Replace any html brackets with HTML Entities to prevent executing HTML or script
// Don't use strip_tags here because it breaks [url] search by replacing & with amp
2010-12-30 22:21:05 +00:00
2010-08-20 03:52:49 +00:00
$Text = str_replace ( " < " , " < " , $Text );
$Text = str_replace ( " > " , " > " , $Text );
2012-12-17 02:01:40 +00:00
// remove some newlines before the general conversion
$Text = preg_replace ( " / \ s? \ [share(.*?) \ ] \ s?(.*?) \ s? \ [ \ /share \ ] \ s?/ism " , " [share $ 1] $ 2[/share] " , $Text );
2012-12-28 10:31:30 +00:00
$Text = preg_replace ( " / \ s? \ [quote(.*?) \ ] \ s?(.*?) \ s? \ [ \ /quote \ ] \ s?/ism " , " [quote $ 1] $ 2[/quote] " , $Text );
2012-12-17 02:01:40 +00:00
2013-01-04 23:21:05 +00:00
$Text = preg_replace ( " / \n \ [code \ ]/ism " , " [code] " , $Text );
$Text = preg_replace ( " / \ [ \ /code \ ] \n /ism " , " [/code] " , $Text );
2012-12-17 02:01:40 +00:00
// when the content is meant exporting to other systems then remove the avatar picture since this doesn't really look good on these systems
if ( ! $tryoembed )
$Text = preg_replace ( " / \ [share(.*?)avatar \ s?= \ s?'.*?' \ s?(.*?) \ ] \ s?(.*?) \ s? \ [ \ /share \ ] \ s?/ism " , " \n [share $ 1 $ 2] $ 3[/share] " , $Text );
2010-08-20 03:52:49 +00:00
// Convert new line chars to html <br /> tags
2011-04-10 10:00:29 +00:00
2012-07-02 23:34:01 +00:00
// nlbr seems to be hopelessly messed up
// $Text = nl2br($Text);
2012-07-02 08:11:19 +00:00
2012-07-02 23:34:01 +00:00
// We'll emulate it.
2012-12-19 11:18:52 +00:00
$Text = trim ( $Text );
2012-07-02 23:34:01 +00:00
$Text = str_replace ( " \r \n " , " \n " , $Text );
2012-12-28 10:31:30 +00:00
// removing multiplicated newlines
2013-01-04 23:21:05 +00:00
// $search = array("\n\n\n", "\n ", " \n", "[/quote]\n\n", "\n[/quote]");
// $replace = array("\n\n", "\n", "\n", "[/quote]\n", "[/quote]");
// do {
// $oldtext = $Text;
// $Text = str_replace($search, $replace, $Text);
// } while ($oldtext != $Text);
2012-12-28 10:31:30 +00:00
2012-07-02 08:11:19 +00:00
$Text = str_replace ( array ( " \r " , " \n " ), array ( '<br />' , '<br />' ), $Text );
2011-04-10 10:00:29 +00:00
if ( $preserve_nl )
$Text = str_replace ( array ( " \n " , " \r " ), array ( '' , '' ), $Text );
2010-08-20 03:52:49 +00:00
2011-06-10 03:02:48 +00:00
2012-07-02 08:11:19 +00:00
2010-08-20 03:52:49 +00:00
// Set up the parameters for a URL search string
2011-02-10 00:55:31 +00:00
$URLSearchString = " ^ \ [ \ ] " ;
2010-08-20 03:52:49 +00:00
// Set up the parameters for a MAIL search string
2011-02-10 00:55:31 +00:00
$MAILSearchString = $URLSearchString ;
2010-08-20 03:52:49 +00:00
2011-01-22 13:19:53 +00:00
2011-10-24 12:30:11 +00:00
// Perform URL Search
2011-10-26 02:59:57 +00:00
2012-12-17 02:01:40 +00:00
$Text = preg_replace ( " /([^ \ ] \ =' " . '"' . " ]|^)(https? \ : \ / \ /[a-zA-Z0-9 \ : \ / \ - \ ? \ & \ ; \ . \ = \ _ \ ~ \ # \ % \$ \ ! \ + \ ,]+)/ism " , '$1<a href="$2" target="external-link">$2</a>' , $Text );
2012-02-19 19:36:59 +00:00
2012-06-17 23:29:08 +00:00
if ( $tryoembed )
$Text = preg_replace_callback ( " / \ [bookmark \ =([^ \ ]]*) \ ].*? \ [ \ /bookmark \ ]/ism " , 'tryoembed' , $Text );
2011-10-24 12:30:11 +00:00
$Text = preg_replace ( " / \ [bookmark \ =([^ \ ]]*) \ ](.*?) \ [ \ /bookmark \ ]/ism " , '[url=$1]$2[/url]' , $Text );
2010-11-12 04:32:20 +00:00
2012-06-17 23:29:08 +00:00
if ( $tryoembed )
$Text = preg_replace_callback ( " / \ [url \ ]([ $URLSearchString ]*) \ [ \ /url \ ]/ism " , 'tryoembed' , $Text );
2011-09-20 11:07:24 +00:00
$Text = preg_replace ( " / \ [url \ ]([ $URLSearchString ]*) \ [ \ /url \ ]/ism " , '<a href="$1" target="external-link">$1</a>' , $Text );
$Text = preg_replace ( " / \ [url \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /url \ ]/ism " , '<a href="$1" target="external-link">$2</a>' , $Text );
//$Text = preg_replace("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" target="_blank">$2</a>', $Text);
2010-08-20 03:52:49 +00:00
2012-06-03 01:05:23 +00:00
// we may need to restrict this further if it picks up too many strays
// link acct:user@host to a webfinger profile redirector
$Text = preg_replace ( '/acct:(.*?)@(.*?)([ ,])/' , '<a href="' . $a -> get_baseurl () . '/acctlink?addr=' . " $ 1@ $ 2 "
. '" target="extlink" >acct:' . " $ 1@ $ 2 $ 3 " . '</a>' , $Text );
2010-11-12 04:32:20 +00:00
2010-08-20 03:52:49 +00:00
// Perform MAIL Search
2011-09-03 11:36:45 +00:00
$Text = preg_replace ( " / \ [mail \ ]([ $MAILSearchString ]*) \ [ \ /mail \ ]/ " , '<a href="mailto:$1">$1</a>' , $Text );
2011-06-08 05:13:07 +00:00
$Text = preg_replace ( " / \ [mail \ =([ $MAILSearchString ]*) \ ](.*?) \ [ \ /mail \ ]/ " , '<a href="mailto:$1">$2</a>' , $Text );
2012-02-19 19:36:59 +00:00
2010-08-20 03:52:49 +00:00
// Check for bold text
2011-09-03 11:36:45 +00:00
$Text = preg_replace ( " ( \ [b \ ](.*?) \ [ \ /b \ ])ism " , '<strong>$1</strong>' , $Text );
2010-08-20 03:52:49 +00:00
// Check for Italics text
2011-09-03 11:36:45 +00:00
$Text = preg_replace ( " ( \ [i \ ](.*?) \ [ \ /i \ ])ism " , '<em>$1</em>' , $Text );
2010-08-20 03:52:49 +00:00
// Check for Underline text
2011-09-03 11:36:45 +00:00
$Text = preg_replace ( " ( \ [u \ ](.*?) \ [ \ /u \ ])ism " , '<u>$1</u>' , $Text );
2010-08-20 03:52:49 +00:00
// Check for strike-through text
2011-09-03 11:36:45 +00:00
$Text = preg_replace ( " ( \ [s \ ](.*?) \ [ \ /s \ ])ism " , '<strike>$1</strike>' , $Text );
2010-08-20 03:52:49 +00:00
// Check for over-line text
2011-09-03 11:36:45 +00:00
$Text = preg_replace ( " ( \ [o \ ](.*?) \ [ \ /o \ ])ism " , '<span class="overline">$1</span>' , $Text );
2010-08-20 03:52:49 +00:00
// Check for colored text
2011-09-03 11:36:45 +00:00
$Text = preg_replace ( " ( \ [color=(.*?) \ ](.*?) \ [ \ /color \ ])ism " , " <span style= \" color: $ 1; \" > $ 2</span> " , $Text );
2010-08-20 03:52:49 +00:00
// Check for sized text
2012-02-12 22:59:07 +00:00
// [size=50] --> font-size: 50px (with the unit).
$Text = preg_replace ( " ( \ [size=( \ d*?) \ ](.*?) \ [ \ /size \ ])ism " , " <span style= \" font-size: $ 1px; \" > $ 2</span> " , $Text );
2011-09-03 11:36:45 +00:00
$Text = preg_replace ( " ( \ [size=(.*?) \ ](.*?) \ [ \ /size \ ])ism " , " <span style= \" font-size: $ 1; \" > $ 2</span> " , $Text );
2010-08-20 03:52:49 +00:00
2012-02-12 23:51:17 +00:00
// Check for centered text
$Text = preg_replace ( " ( \ [center \ ](.*?) \ [ \ /center \ ])ism " , " <div style= \" text-align:center; \" > $ 1</div> " , $Text );
2010-08-20 03:52:49 +00:00
// Check for list text
2012-02-13 01:10:06 +00:00
$Text = str_replace ( " [*] " , " <li> " , $Text );
2011-11-10 03:32:54 +00:00
2012-08-01 22:13:37 +00:00
// Check for style sheet commands
2012-12-20 23:08:58 +00:00
$Text = preg_replace_callback ( " ( \ [style=(.*?) \ ](.*?) \ [ \ /style \ ])ism " , " bb_cleanstyle " , $Text );
2012-08-01 22:13:37 +00:00
// Check for CSS classes
2012-12-20 23:08:58 +00:00
$Text = preg_replace_callback ( " ( \ [class=(.*?) \ ](.*?) \ [ \ /class \ ])ism " , " bb_cleanclass " , $Text );
2012-08-01 22:13:37 +00:00
2012-02-19 20:07:45 +00:00
// handle nested lists
$endlessloop = 0 ;
2012-06-25 23:05:42 +00:00
2012-06-28 03:21:26 +00:00
while (((( strpos ( $Text , " [/list] " ) !== false ) && ( strpos ( $Text , " [list " ) !== false )) ||
(( strpos ( $Text , " [/ol] " ) !== false ) && ( strpos ( $Text , " [ol] " ) !== false )) ||
2012-07-05 18:52:20 +00:00
(( strpos ( $Text , " [/ul] " ) !== false ) && ( strpos ( $Text , " [ul] " ) !== false )) ||
(( strpos ( $Text , " [/li] " ) !== false ) && ( strpos ( $Text , " [li] " ) !== false ))) && ( ++ $endlessloop < 20 )) {
2012-02-19 20:07:45 +00:00
$Text = preg_replace ( " / \ [list \ ](.*?) \ [ \ /list \ ]/ism " , '<ul class="listbullet" style="list-style-type: circle;">$1</ul>' , $Text );
$Text = preg_replace ( " / \ [list= \ ](.*?) \ [ \ /list \ ]/ism " , '<ul class="listnone" style="list-style-type: none;">$1</ul>' , $Text );
$Text = preg_replace ( " / \ [list=1 \ ](.*?) \ [ \ /list \ ]/ism " , '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' , $Text );
$Text = preg_replace ( " / \ [list=((?-i)i) \ ](.*?) \ [ \ /list \ ]/ism " , '<ul class="listlowerroman" style="list-style-type: lower-roman;">$2</ul>' , $Text );
$Text = preg_replace ( " / \ [list=((?-i)I) \ ](.*?) \ [ \ /list \ ]/ism " , '<ul class="listupperroman" style="list-style-type: upper-roman;">$2</ul>' , $Text );
$Text = preg_replace ( " / \ [list=((?-i)a) \ ](.*?) \ [ \ /list \ ]/ism " , '<ul class="listloweralpha" style="list-style-type: lower-alpha;">$2</ul>' , $Text );
$Text = preg_replace ( " / \ [list=((?-i)A) \ ](.*?) \ [ \ /list \ ]/ism " , '<ul class="listupperalpha" style="list-style-type: upper-alpha;">$2</ul>' , $Text );
2012-06-24 15:37:31 +00:00
$Text = preg_replace ( " / \ [ul \ ](.*?) \ [ \ /ul \ ]/ism " , '<ul class="listbullet" style="list-style-type: circle;">$1</ul>' , $Text );
$Text = preg_replace ( " / \ [ol \ ](.*?) \ [ \ /ol \ ]/ism " , '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' , $Text );
2012-07-05 18:52:20 +00:00
$Text = preg_replace ( " / \ [li \ ](.*?) \ [ \ /li \ ]/ism " , '<li>$1</li>' , $Text );
2012-02-19 20:07:45 +00:00
}
2012-02-13 01:27:08 +00:00
$Text = preg_replace ( " / \ [th \ ](.*?) \ [ \ /th \ ]/sm " , '<th>$1</th>' , $Text );
2011-09-03 11:36:45 +00:00
$Text = preg_replace ( " / \ [td \ ](.*?) \ [ \ /td \ ]/sm " , '<td>$1</td>' , $Text );
$Text = preg_replace ( " / \ [tr \ ](.*?) \ [ \ /tr \ ]/sm " , '<tr>$1</tr>' , $Text );
$Text = preg_replace ( " / \ [table \ ](.*?) \ [ \ /table \ ]/sm " , '<table>$1</table>' , $Text );
2011-06-21 23:45:47 +00:00
2011-09-03 11:36:45 +00:00
$Text = preg_replace ( " / \ [table border=1 \ ](.*?) \ [ \ /table \ ]/sm " , '<table border="1" >$1</table>' , $Text );
$Text = preg_replace ( " / \ [table border=0 \ ](.*?) \ [ \ /table \ ]/sm " , '<table border="0" >$1</table>' , $Text );
2011-06-21 23:45:47 +00:00
2012-02-13 22:16:51 +00:00
$Text = str_replace ( '[hr]' , '<hr />' , $Text );
2012-02-15 07:13:18 +00:00
// This is actually executed in prepare_body()
$Text = str_replace ( '[nosmile]' , '' , $Text );
2010-08-20 03:52:49 +00:00
// Check for font change text
2011-09-20 11:07:24 +00:00
$Text = preg_replace ( " / \ [font=(.*?) \ ](.*?) \ [ \ /font \ ]/sm " , " <span style= \" font-family: $ 1; \" > $ 2</span> " , $Text );
2010-08-20 03:52:49 +00:00
// Declare the format for [code] layout
2011-07-19 02:17:16 +00:00
2012-07-05 00:15:43 +00:00
// $Text = preg_replace_callback("/\[code\](.*?)\[\/code\]/ism",'stripcode_br_cb',$Text);
2011-07-19 02:17:16 +00:00
2010-08-20 03:52:49 +00:00
$CodeLayout = '<code>$1</code>' ;
// Check for [code] text
2011-09-03 11:36:45 +00:00
$Text = preg_replace ( " / \ [code \ ](.*?) \ [ \ /code \ ]/ism " , " $CodeLayout " , $Text );
2011-07-19 02:17:16 +00:00
2012-03-17 10:07:49 +00:00
// Declare the format for [spoiler] layout
$SpoilerLayout = '<blockquote class="spoiler">$1</blockquote>' ;
// Check for [spoiler] text
// handle nested quotes
$endlessloop = 0 ;
while (( strpos ( $Text , " [/spoiler] " ) !== false ) and ( strpos ( $Text , " [spoiler] " ) !== false ) and ( ++ $endlessloop < 20 ))
$Text = preg_replace ( " / \ [spoiler \ ](.*?) \ [ \ /spoiler \ ]/ism " , " $SpoilerLayout " , $Text );
2012-03-17 11:15:59 +00:00
// Check for [spoiler=Author] text
$t_wrote = t ( '$1 wrote:' );
// handle nested quotes
$endlessloop = 0 ;
while (( strpos ( $Text , " [/spoiler] " ) !== false ) and ( strpos ( $Text , " [spoiler= " ) !== false ) and ( ++ $endlessloop < 20 ))
$Text = preg_replace ( " / \ [spoiler=[ \" \ ']*(.*?)[ \" \ ']* \ ](.*?) \ [ \ /spoiler \ ]/ism " ,
" <br /><strong class= " . '"spoiler"' . " > " . $t_wrote . " </strong><blockquote class= " . '"spoiler"' . " > $ 2</blockquote> " ,
$Text );
2010-08-20 03:52:49 +00:00
// Declare the format for [quote] layout
2012-02-19 19:36:59 +00:00
$QuoteLayout = '<blockquote>$1</blockquote>' ;
2012-03-17 10:07:49 +00:00
2010-08-20 03:52:49 +00:00
// Check for [quote] text
2012-02-19 19:36:59 +00:00
// handle nested quotes
$endlessloop = 0 ;
2012-02-23 19:51:44 +00:00
while (( strpos ( $Text , " [/quote] " ) !== false ) and ( strpos ( $Text , " [quote] " ) !== false ) and ( ++ $endlessloop < 20 ))
2012-02-19 19:36:59 +00:00
$Text = preg_replace ( " / \ [quote \ ](.*?) \ [ \ /quote \ ]/ism " , " $QuoteLayout " , $Text );
2012-02-13 00:18:58 +00:00
// Check for [quote=Author] text
2012-02-13 04:56:44 +00:00
$t_wrote = t ( '$1 wrote:' );
2012-02-19 19:36:59 +00:00
// handle nested quotes
$endlessloop = 0 ;
2012-02-23 19:51:44 +00:00
while (( strpos ( $Text , " [/quote] " ) !== false ) and ( strpos ( $Text , " [quote= " ) !== false ) and ( ++ $endlessloop < 20 ))
2012-02-19 19:36:59 +00:00
$Text = preg_replace ( " / \ [quote=[ \" \ ']*(.*?)[ \" \ ']* \ ](.*?) \ [ \ /quote \ ]/ism " ,
2012-06-01 22:31:07 +00:00
" <br /><strong class= " . '"author"' . " > " . $t_wrote . " </strong><blockquote> $ 2</blockquote> " ,
2012-02-19 19:36:59 +00:00
$Text );
2012-02-13 00:18:58 +00:00
2011-09-18 07:16:18 +00:00
// [img=widthxheight]image source[/img]
2012-03-31 14:28:39 +00:00
//$Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="height: $2px; width: $1px;" >', $Text);
$Text = preg_replace ( " / \ [img \ =([0-9]*)x([0-9]*) \ ](.*?) \ [ \ /img \ ]/ism " , '<img src="$3" style="width: $1px;" >' , $Text );
2011-09-18 07:16:18 +00:00
2010-08-20 03:52:49 +00:00
// Images
// [img]pathtoimage[/img]
2011-09-03 11:36:45 +00:00
$Text = preg_replace ( " / \ [img \ ](.*?) \ [ \ /img \ ]/ism " , '<img src="$1" alt="' . t ( 'Image/photo' ) . '" />' , $Text );
2010-12-31 02:32:49 +00:00
2012-12-17 02:01:40 +00:00
// Shared content
$Text = preg_replace_callback ( " / \ [share(.*?) \ ](.*?) \ [ \ /share \ ]/ism " , " bb_ShareAttributes " , $Text );
2012-08-12 11:29:26 +00:00
$Text = preg_replace ( " / \ [crypt \ ](.*?) \ [ \ /crypt \ ]/ism " , '<br/><img src="' . $a -> get_baseurl () . '/images/lock_icon.gif" alt="' . t ( 'Encrypted content' ) . '" title="' . t ( 'Encrypted content' ) . '" /><br />' , $Text );
2012-08-19 07:35:39 +00:00
$Text = preg_replace ( " / \ [crypt=(.*?) \ ](.*?) \ [ \ /crypt \ ]/ism " , '<br/><img src="' . $a -> get_baseurl () . '/images/lock_icon.gif" alt="' . t ( 'Encrypted content' ) . '" title="' . '$1' . ' ' . t ( 'Encrypted content' ) . '" /><br />' , $Text );
2012-08-12 11:29:26 +00:00
2011-10-24 12:30:11 +00:00
// Try to Oembed
2012-06-17 23:29:08 +00:00
if ( $tryoembed ) {
2012-08-06 15:59:57 +00:00
$Text = preg_replace ( " / \ [video \ ](.*? \ .(ogg|ogv|oga|ogm|webm|mp4)) \ [ \ /video \ ]/ism " , '<video src="$1" controls="controls" width="' . $a -> videowidth . '" height="' . $a -> videoheight . '"><a href="$1">$1</a></video>' , $Text );
2012-07-05 21:36:00 +00:00
$Text = preg_replace ( " / \ [audio \ ](.*? \ .(ogg|ogv|oga|ogm|webm|mp4|mp3)) \ [ \ /audio \ ]/ism " , '<audio src="$1" controls="controls"><a href="$1">$1</a></audio>' , $Text );
2012-06-17 23:29:08 +00:00
$Text = preg_replace_callback ( " / \ [video \ ](.*?) \ [ \ /video \ ]/ism " , 'tryoembed' , $Text );
$Text = preg_replace_callback ( " / \ [audio \ ](.*?) \ [ \ /audio \ ]/ism " , 'tryoembed' , $Text );
2012-07-05 21:36:00 +00:00
} else {
$Text = preg_replace ( " / \ [video \ ](.*?) \ [ \ /video \ ]/ " , '$1' , $Text );
$Text = preg_replace ( " / \ [audio \ ](.*?) \ [ \ /audio \ ]/ " , '$1' , $Text );
2012-06-17 23:29:08 +00:00
}
2011-10-24 12:30:11 +00:00
2010-12-31 02:32:49 +00:00
// html5 video and audio
2012-07-05 21:36:00 +00:00
if ( $tryoembed )
2012-08-06 15:59:57 +00:00
$Text = preg_replace ( " / \ [iframe \ ](.*?) \ [ \ /iframe \ ]/ism " , '<iframe src="$1" width="' . $a -> videowidth . '" height="' . $a -> videoheight . '"><a href="$1">$1</a></iframe>' , $Text );
2012-07-05 21:36:00 +00:00
else
$Text = preg_replace ( " / \ [iframe \ ](.*?) \ [ \ /iframe \ ]/ism " , '<a href="$1">$1</a>' , $Text );
2010-08-20 03:52:49 +00:00
2011-12-15 09:08:19 +00:00
// Youtube extensions
2012-06-17 23:29:08 +00:00
if ( $tryoembed ) {
$Text = preg_replace_callback ( " / \ [youtube \ ](https?: \ / \ /www.youtube.com \ /watch \ ?v \ =.*?) \ [ \ /youtube \ ]/ism " , 'tryoembed' , $Text );
$Text = preg_replace_callback ( " / \ [youtube \ ](www.youtube.com \ /watch \ ?v \ =.*?) \ [ \ /youtube \ ]/ism " , 'tryoembed' , $Text );
$Text = preg_replace_callback ( " / \ [youtube \ ](https?: \ / \ /youtu.be \ /.*?) \ [ \ /youtube \ ]/ism " , 'tryoembed' , $Text );
}
2011-12-15 09:08:19 +00:00
$Text = preg_replace ( " / \ [youtube \ ]https?: \ / \ /www.youtube.com \ /watch \ ?v \ =(.*?) \ [ \ /youtube \ ]/ism " , '[youtube]$1[/youtube]' , $Text );
$Text = preg_replace ( " / \ [youtube \ ]https?: \ / \ /www.youtube.com \ /embed \ /(.*?) \ [ \ /youtube \ ]/ism " , '[youtube]$1[/youtube]' , $Text );
2012-06-17 23:29:08 +00:00
$Text = preg_replace ( " / \ [youtube \ ]https?: \ / \ /youtu.be \ /(.*?) \ [ \ /youtube \ ]/ism " , '[youtube]$1[/youtube]' , $Text );
2012-07-05 21:36:00 +00:00
if ( $tryoembed )
2012-08-06 15:59:57 +00:00
$Text = preg_replace ( " / \ [youtube \ ]([A-Za-z0-9 \ -_=]+)(.*?) \ [ \ /youtube \ ]/ism " , '<iframe width="' . $a -> videowidth . '" height="' . $a -> videoheight . '" src="http://www.youtube.com/embed/$1" frameborder="0" ></iframe>' , $Text );
2012-07-05 21:36:00 +00:00
else
$Text = preg_replace ( " / \ [youtube \ ]([A-Za-z0-9 \ -_=]+)(.*?) \ [ \ /youtube \ ]/ism " , " http://www.youtube.com/watch?v= $ 1 " , $Text );
2011-12-15 09:08:19 +00:00
2010-08-20 03:52:49 +00:00
2012-06-17 23:29:08 +00:00
if ( $tryoembed ) {
$Text = preg_replace_callback ( " / \ [vimeo \ ](https?: \ / \ /player.vimeo.com \ /video \ /[0-9]+).*? \ [ \ /vimeo \ ]/ism " , 'tryoembed' , $Text );
$Text = preg_replace_callback ( " / \ [vimeo \ ](https?: \ / \ /vimeo.com \ /[0-9]+).*? \ [ \ /vimeo \ ]/ism " , 'tryoembed' , $Text );
}
2011-10-24 12:39:39 +00:00
2011-10-12 01:24:37 +00:00
$Text = preg_replace ( " / \ [vimeo \ ]https?: \ / \ /player.vimeo.com \ /video \ /([0-9]+)(.*?) \ [ \ /vimeo \ ]/ism " , '[vimeo]$1[/vimeo]' , $Text );
2012-07-05 21:36:00 +00:00
$Text = preg_replace ( " / \ [vimeo \ ]https?: \ / \ /vimeo.com \ /([0-9]+)(.*?) \ [ \ /vimeo \ ]/ism " , '[vimeo]$1[/vimeo]' , $Text );
if ( $tryoembed )
2012-08-06 15:59:57 +00:00
$Text = preg_replace ( " / \ [vimeo \ ]([0-9]+)(.*?) \ [ \ /vimeo \ ]/ism " , '<iframe width="' . $a -> videowidth . '" height="' . $a -> videoheight . '" src="http://player.vimeo.com/video/$1" frameborder="0" ></iframe>' , $Text );
2012-07-05 21:36:00 +00:00
else
$Text = preg_replace ( " / \ [vimeo \ ]([0-9]+)(.*?) \ [ \ /vimeo \ ]/ism " , " http://vimeo.com/ $ 1 " , $Text );
2011-06-10 03:02:48 +00:00
2011-08-31 06:09:39 +00:00
// $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '<object width="425" height="350" type="application/x-shockwave-flash" data="http://www.youtube.com/v/$1" ><param name="movie" value="http://www.youtube.com/v/$1"></param><!--[if IE]><embed src="http://www.youtube.com/v/$1" type="application/x-shockwave-flash" width="425" height="350" /><![endif]--></object>', $Text);
2011-06-10 03:02:48 +00:00
2011-01-31 09:38:49 +00:00
// oembed tag
2011-01-31 15:45:58 +00:00
$Text = oembed_bbcode2html ( $Text );
2011-06-10 03:02:48 +00:00
2012-07-14 17:54:27 +00:00
// Avoid triple linefeeds through oembed
$Text = str_replace ( " <br style='clear:left'></span><br /><br /> " , " <br style='clear:left'></span><br /> " , $Text );
2011-06-10 03:02:48 +00:00
// If we found an event earlier, strip out all the event code and replace with a reformatted version.
2012-06-26 04:27:34 +00:00
// Replace the event-start section with the entire formatted event. The other bbcode is stripped.
// Summary (e.g. title) is required, earlier revisions only required description (in addition to
// start which is always required). Allow desc with a missing summary for compatibility.
2011-06-10 03:02:48 +00:00
2012-06-26 04:27:34 +00:00
if (( x ( $ev , 'desc' ) || x ( $ev , 'summary' )) && x ( $ev , 'start' )) {
2011-06-10 03:02:48 +00:00
$sub = format_event_html ( $ev );
2012-06-26 03:55:27 +00:00
$Text = preg_replace ( " / \ [event \ -summary \ ](.*?) \ [ \ /event \ -summary \ ]/ism " , '' , $Text );
2012-06-26 04:20:08 +00:00
$Text = preg_replace ( " / \ [event \ -description \ ](.*?) \ [ \ /event \ -description \ ]/ism " , '' , $Text );
$Text = preg_replace ( " / \ [event \ -start \ ](.*?) \ [ \ /event \ -start \ ]/ism " , $sub , $Text );
2011-09-03 11:36:45 +00:00
$Text = preg_replace ( " / \ [event \ -finish \ ](.*?) \ [ \ /event \ -finish \ ]/ism " , '' , $Text );
$Text = preg_replace ( " / \ [event \ -location \ ](.*?) \ [ \ /event \ -location \ ]/ism " , '' , $Text );
$Text = preg_replace ( " / \ [event \ -adjust \ ](.*?) \ [ \ /event \ -adjust \ ]/ism " , '' , $Text );
2011-06-10 03:02:48 +00:00
}
2012-02-12 22:35:29 +00:00
// Unhide all [noparse] contained bbtags unspacefying them
// and triming the [noparse] tag.
$Text = preg_replace_callback ( " / \ [noparse \ ](.*?) \ [ \ /noparse \ ]/ism " , 'bb_unspacefy_and_trim' , $Text );
$Text = preg_replace_callback ( " / \ [nobb \ ](.*?) \ [ \ /nobb \ ]/ism " , 'bb_unspacefy_and_trim' , $Text );
$Text = preg_replace_callback ( " / \ [pre \ ](.*?) \ [ \ /pre \ ]/ism " , 'bb_unspacefy_and_trim' , $Text );
2012-04-23 12:42:46 +00:00
$Text = preg_replace ( '/\[\&\;([#a-z0-9]+)\;\]/' , '&$1;' , $Text );
2012-08-15 11:52:18 +00:00
$Text = preg_replace ( '/\&\#039\;/' , '\'' , $Text );
$Text = preg_replace ( '/\"\;/' , '"' , $Text );
2012-04-23 12:42:46 +00:00
2011-09-15 03:47:49 +00:00
// fix any escaped ampersands that may have been converted into links
$Text = preg_replace ( " / \ <(.*?)(src|href)=(.*?) \ & \ ;(.*?) \ >/ism " , '<$1$2=$3&$4>' , $Text );
2012-07-18 01:33:04 +00:00
$Text = preg_replace ( " / \ <(.*?)(src|href)= \" [^hfm](.*?) \ >/ism " , '<$1$2="">' , $Text );
2012-07-07 22:20:24 +00:00
if ( $saved_image )
$Text = bb_replace_images ( $Text , $saved_image );
2011-11-27 12:09:14 +00:00
2012-07-05 21:36:00 +00:00
// Clean up the HTML by loading and saving the HTML with the DOM
// Only do it when it has to be done - for performance reasons
2013-01-13 08:37:15 +00:00
// Update: Now it is done every time - since bad structured html can break a whole page
//if (!$tryoembed) {
2012-07-05 21:36:00 +00:00
$doc = new DOMDocument ();
$doc -> preserveWhiteSpace = false ;
$Text = mb_convert_encoding ( $Text , 'HTML-ENTITIES' , " UTF-8 " );
$doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">' ;
@ $doc -> loadHTML ( $doctype . " <html><body> " . $Text . " </body></html> " );
$Text = $doc -> saveHTML ();
$Text = str_replace ( array ( " <html><body> " , " </body></html> " , $doctype ), array ( " " , " " , " " ), $Text );
$Text = str_replace ( '<br></li>' , '</li>' , $Text );
2012-07-08 16:27:11 +00:00
$Text = mb_convert_encoding ( $Text , " UTF-8 " , 'HTML-ENTITIES' );
2013-01-13 08:37:15 +00:00
//}
2012-07-05 21:36:00 +00:00
2010-12-30 22:21:05 +00:00
call_hooks ( 'bbcode' , $Text );
2013-01-26 17:35:39 +00:00
$a -> save_timestamp ( $stamp1 , " parser " );
2010-08-20 03:52:49 +00:00
return $Text ;
}
2012-02-23 19:59:34 +00:00