2012-06-26 07:01:32 +02:00
< ? php
2011-06-10 05:02:48 +02:00
2011-01-31 10:38:49 +01:00
require_once ( " include/oembed.php " );
2011-06-10 05:02:48 +02:00
require_once ( 'include/event.php' );
2012-12-21 00:08:58 +01: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 07:59:21 +02:00
function cleancss ( $input ) {
2011-07-19 04:17:16 +02:00
2012-08-17 07:59:21 +02: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 04:17:16 +02:00
function stripcode_br_cb ( $s ) {
return '[code]' . str_replace ( '<br />' , '' , $s [ 1 ]) . '[/code]' ;
}
2011-10-24 14:30:11 +02:00
function tryoembed ( $match ){
$url = (( count ( $match ) == 2 ) ? $match [ 1 ] : $match [ 2 ]);
2012-02-13 02:15:09 +01:00
// logger("tryoembed: $url");
2012-02-19 20:36:59 +01:00
2011-10-24 14:30:11 +02:00
$o = oembed_fetch_url ( $url );
//echo "<pre>"; var_dump($match, $url, $o); killme();
if ( $o -> type == " error " ) return $match [ 0 ];
2012-02-19 20:36:59 +01:00
2011-10-24 14:30:11 +02:00
$html = oembed_format_object ( $o );
2011-10-25 14:59:31 +02:00
return $html ; //oembed_iframe($html,$o->width,$o->height);
2012-02-19 20:36:59 +01:00
2011-10-24 14:30:11 +02:00
}
2012-02-19 20:36:59 +01:00
// [noparse][i]italic[/i][/noparse] turns into
// [noparse][ i ]italic[ /i ][/noparse],
2012-02-12 23:35:29 +01: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 20:36:59 +01:00
// The previously spacefied [noparse][ i ]italic[ /i ][/noparse],
2012-02-12 23:35:29 +01:00
// now turns back and the [noparse] tags are trimed
// returning [i]italic[/i]
2011-10-24 14:30:11 +02:00
2012-02-12 23:35:29 +01:00
function bb_unspacefy_and_trim ( $st ) {
$whole_match = $st [ 0 ];
$captured = $st [ 1 ];
$unspacefied = preg_replace ( " / \ [ (.*?) \ ]/ " , " [ $ 1] " , $captured );
return $unspacefied ;
}
2011-07-19 04:17:16 +02:00
2012-08-27 02:18:43 +02: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 22:56:34 +02: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-08 00:20:24 +02: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 02:47:13 +02:00
$saved_image [ $cnt ] = substr ( $orig_body , $img_start + $img_st_close , $img_end - ( $img_start + $img_st_close ));
2012-07-08 00:20:24 +02:00
$new_body = $new_body . substr ( $orig_body , 0 , $img_start ) . '[$#saved_image' . $cnt . '#$]' ;
2012-07-08 02:47:13 +02:00
$cnt ++ ;
2012-07-08 00:20:24 +02: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 03:01:40 +01:00
function bb_ShareAttributes ( $match ) {
2012-07-08 00:20:24 +02:00
2012-12-17 03:01:40 +01:00
$attributes = $match [ 1 ];
$author = " " ;
preg_match ( " /author='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
2012-12-21 02:10:26 +01:00
$author = html_entity_decode ( $matches [ 1 ], ENT_QUOTES , 'UTF-8' );
2012-12-17 03:01:40 +01: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 23:58:50 +01: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 03:01:40 +01:00
$headline = '<div class="shared_header">' ;
if ( $avatar != " " )
$headline .= '<img src="' . $avatar . '" height="32" width="32" >' ;
2013-01-15 23:58:50 +01: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 03:01:40 +01:00
$headline .= " </div> " ;
2012-12-19 12:18:52 +01:00
$text = $headline . '<blockquote class="shared_content">' . trim ( $match [ 2 ]) . " </blockquote> " ;
2012-12-17 03:01:40 +01:00
return ( $text );
}
2012-07-08 00:20:24 +02:00
2013-02-15 20:14:45 +01:00
function bb_ShareAttributesSimple ( $match ) {
$attributes = $match [ 1 ];
$author = " " ;
preg_match ( " /author='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$author = html_entity_decode ( $matches [ 1 ], ENT_QUOTES , 'UTF-8' );
preg_match ( '/author="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$author = $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 ];
$text = " <br /> " . html_entity_decode ( " ♲ " , ENT_QUOTES , 'UTF-8' ) . ' <a href="' . $profile . '">' . $author . " </a>: <br />» " . $match [ 2 ] . " « " ;
return ( $text );
}
2010-08-20 05:52:49 +02:00
// BBcode 2 HTML was written by WAY2WEB.net
2012-01-03 03:40:38 +01:00
// extended to work with Mistpark/Friendica - Mike Macgirvin
2010-08-20 05:52:49 +02:00
2013-02-15 20:14:45 +01:00
function bbcode ( $Text , $preserve_nl = false , $tryoembed = true , $simplehtml = false ) {
2010-12-30 23:21:05 +01:00
2013-01-26 18:35:39 +01:00
$stamp1 = microtime ( true );
2012-06-03 03:05:23 +02:00
$a = get_app ();
2012-07-08 00:20:24 +02: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 23:35:29 +01: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 13:09:14 +01:00
2012-09-20 04:35:39 +02: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-08 00:20:24 +02: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 23:03:49 +01:00
// in after we've done all the regex matching. We cannot use any preg functions to do this.
2012-07-08 00:20:24 +02:00
$extracted = bb_extract_images ( $Text );
$Text = $extracted [ 'body' ];
$saved_image = $extracted [ 'images' ];
2011-11-27 13:09:14 +01:00
2011-09-12 00:44:07 +02:00
// If we find any event code, turn it into an event.
2012-02-19 20:36:59 +01:00
// After we're finished processing the bbcode we'll
2011-09-12 00:44:07 +02:00
// replace all of the event code with a reformatted version.
$ev = bbtoevent ( $Text );
2010-08-20 05:52:49 +02: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 23:21:05 +01:00
2010-08-20 05:52:49 +02:00
$Text = str_replace ( " < " , " < " , $Text );
$Text = str_replace ( " > " , " > " , $Text );
2012-12-17 03:01:40 +01: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 11:31:30 +01:00
$Text = preg_replace ( " / \ s? \ [quote(.*?) \ ] \ s?(.*?) \ s? \ [ \ /quote \ ] \ s?/ism " , " [quote $ 1] $ 2[/quote] " , $Text );
2012-12-17 03:01:40 +01:00
2013-01-05 00:21:05 +01:00
$Text = preg_replace ( " / \n \ [code \ ]/ism " , " [code] " , $Text );
$Text = preg_replace ( " / \ [ \ /code \ ] \n /ism " , " [/code] " , $Text );
2012-12-17 03:01:40 +01: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 05:52:49 +02:00
// Convert new line chars to html <br /> tags
2011-04-10 12:00:29 +02:00
2012-07-03 01:34:01 +02:00
// nlbr seems to be hopelessly messed up
// $Text = nl2br($Text);
2012-07-02 10:11:19 +02:00
2012-07-03 01:34:01 +02:00
// We'll emulate it.
2012-12-19 12:18:52 +01:00
$Text = trim ( $Text );
2012-07-03 01:34:01 +02:00
$Text = str_replace ( " \r \n " , " \n " , $Text );
2012-12-28 11:31:30 +01:00
// removing multiplicated newlines
2013-02-15 20:14:45 +01:00
if ( get_config ( " system " , " remove_multiplicated_lines " )) {
$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 11:31:30 +01:00
2012-07-02 10:11:19 +02:00
$Text = str_replace ( array ( " \r " , " \n " ), array ( '<br />' , '<br />' ), $Text );
2011-04-10 12:00:29 +02:00
if ( $preserve_nl )
$Text = str_replace ( array ( " \n " , " \r " ), array ( '' , '' ), $Text );
2010-08-20 05:52:49 +02:00
2011-06-10 05:02:48 +02:00
2012-07-02 10:11:19 +02:00
2010-08-20 05:52:49 +02:00
// Set up the parameters for a URL search string
2011-02-10 01:55:31 +01:00
$URLSearchString = " ^ \ [ \ ] " ;
2010-08-20 05:52:49 +02:00
// Set up the parameters for a MAIL search string
2011-02-10 01:55:31 +01:00
$MAILSearchString = $URLSearchString ;
2010-08-20 05:52:49 +02:00
2011-01-22 14:19:53 +01:00
2011-10-24 14:30:11 +02:00
// Perform URL Search
2011-10-26 04:59:57 +02:00
2012-12-17 03:01:40 +01:00
$Text = preg_replace ( " /([^ \ ] \ =' " . '"' . " ]|^)(https? \ : \ / \ /[a-zA-Z0-9 \ : \ / \ - \ ? \ & \ ; \ . \ = \ _ \ ~ \ # \ % \$ \ ! \ + \ ,]+)/ism " , '$1<a href="$2" target="external-link">$2</a>' , $Text );
2012-02-19 20:36:59 +01:00
2012-06-18 01:29:08 +02:00
if ( $tryoembed )
$Text = preg_replace_callback ( " / \ [bookmark \ =([^ \ ]]*) \ ].*? \ [ \ /bookmark \ ]/ism " , 'tryoembed' , $Text );
2011-10-24 14:30:11 +02:00
$Text = preg_replace ( " / \ [bookmark \ =([^ \ ]]*) \ ](.*?) \ [ \ /bookmark \ ]/ism " , '[url=$1]$2[/url]' , $Text );
2010-11-12 05:32:20 +01:00
2012-06-18 01:29:08 +02:00
if ( $tryoembed )
$Text = preg_replace_callback ( " / \ [url \ ]([ $URLSearchString ]*) \ [ \ /url \ ]/ism " , 'tryoembed' , $Text );
2011-09-20 13:07:24 +02: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 05:52:49 +02:00
2012-06-03 03:05:23 +02: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 05:32:20 +01:00
2010-08-20 05:52:49 +02:00
// Perform MAIL Search
2011-09-03 13:36:45 +02:00
$Text = preg_replace ( " / \ [mail \ ]([ $MAILSearchString ]*) \ [ \ /mail \ ]/ " , '<a href="mailto:$1">$1</a>' , $Text );
2011-06-08 07:13:07 +02:00
$Text = preg_replace ( " / \ [mail \ =([ $MAILSearchString ]*) \ ](.*?) \ [ \ /mail \ ]/ " , '<a href="mailto:$1">$2</a>' , $Text );
2012-02-19 20:36:59 +01:00
2010-08-20 05:52:49 +02:00
// Check for bold text
2011-09-03 13:36:45 +02:00
$Text = preg_replace ( " ( \ [b \ ](.*?) \ [ \ /b \ ])ism " , '<strong>$1</strong>' , $Text );
2010-08-20 05:52:49 +02:00
// Check for Italics text
2011-09-03 13:36:45 +02:00
$Text = preg_replace ( " ( \ [i \ ](.*?) \ [ \ /i \ ])ism " , '<em>$1</em>' , $Text );
2010-08-20 05:52:49 +02:00
// Check for Underline text
2011-09-03 13:36:45 +02:00
$Text = preg_replace ( " ( \ [u \ ](.*?) \ [ \ /u \ ])ism " , '<u>$1</u>' , $Text );
2010-08-20 05:52:49 +02:00
// Check for strike-through text
2011-09-03 13:36:45 +02:00
$Text = preg_replace ( " ( \ [s \ ](.*?) \ [ \ /s \ ])ism " , '<strike>$1</strike>' , $Text );
2010-08-20 05:52:49 +02:00
// Check for over-line text
2011-09-03 13:36:45 +02:00
$Text = preg_replace ( " ( \ [o \ ](.*?) \ [ \ /o \ ])ism " , '<span class="overline">$1</span>' , $Text );
2010-08-20 05:52:49 +02:00
// Check for colored text
2011-09-03 13:36:45 +02:00
$Text = preg_replace ( " ( \ [color=(.*?) \ ](.*?) \ [ \ /color \ ])ism " , " <span style= \" color: $ 1; \" > $ 2</span> " , $Text );
2010-08-20 05:52:49 +02:00
// Check for sized text
2012-02-12 23:59:07 +01: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 13:36:45 +02:00
$Text = preg_replace ( " ( \ [size=(.*?) \ ](.*?) \ [ \ /size \ ])ism " , " <span style= \" font-size: $ 1; \" > $ 2</span> " , $Text );
2010-08-20 05:52:49 +02:00
2012-02-13 00:51:17 +01:00
// Check for centered text
$Text = preg_replace ( " ( \ [center \ ](.*?) \ [ \ /center \ ])ism " , " <div style= \" text-align:center; \" > $ 1</div> " , $Text );
2010-08-20 05:52:49 +02:00
// Check for list text
2012-02-13 02:10:06 +01:00
$Text = str_replace ( " [*] " , " <li> " , $Text );
2011-11-10 04:32:54 +01:00
2012-08-02 00:13:37 +02:00
// Check for style sheet commands
2012-12-21 00:08:58 +01:00
$Text = preg_replace_callback ( " ( \ [style=(.*?) \ ](.*?) \ [ \ /style \ ])ism " , " bb_cleanstyle " , $Text );
2012-08-02 00:13:37 +02:00
// Check for CSS classes
2012-12-21 00:08:58 +01:00
$Text = preg_replace_callback ( " ( \ [class=(.*?) \ ](.*?) \ [ \ /class \ ])ism " , " bb_cleanclass " , $Text );
2012-08-02 00:13:37 +02:00
2012-02-19 21:07:45 +01:00
// handle nested lists
$endlessloop = 0 ;
2012-06-26 01:05:42 +02:00
2012-06-28 05:21:26 +02:00
while (((( strpos ( $Text , " [/list] " ) !== false ) && ( strpos ( $Text , " [list " ) !== false )) ||
(( strpos ( $Text , " [/ol] " ) !== false ) && ( strpos ( $Text , " [ol] " ) !== false )) ||
2012-07-05 20:52:20 +02:00
(( strpos ( $Text , " [/ul] " ) !== false ) && ( strpos ( $Text , " [ul] " ) !== false )) ||
(( strpos ( $Text , " [/li] " ) !== false ) && ( strpos ( $Text , " [li] " ) !== false ))) && ( ++ $endlessloop < 20 )) {
2012-02-19 21:07:45 +01: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 17:37:31 +02: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 20:52:20 +02:00
$Text = preg_replace ( " / \ [li \ ](.*?) \ [ \ /li \ ]/ism " , '<li>$1</li>' , $Text );
2012-02-19 21:07:45 +01:00
}
2012-02-13 02:27:08 +01:00
$Text = preg_replace ( " / \ [th \ ](.*?) \ [ \ /th \ ]/sm " , '<th>$1</th>' , $Text );
2011-09-03 13:36:45 +02: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-22 01:45:47 +02:00
2011-09-03 13:36:45 +02: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-22 01:45:47 +02:00
2012-02-13 23:16:51 +01:00
$Text = str_replace ( '[hr]' , '<hr />' , $Text );
2012-02-15 08:13:18 +01:00
// This is actually executed in prepare_body()
$Text = str_replace ( '[nosmile]' , '' , $Text );
2010-08-20 05:52:49 +02:00
// Check for font change text
2011-09-20 13:07:24 +02:00
$Text = preg_replace ( " / \ [font=(.*?) \ ](.*?) \ [ \ /font \ ]/sm " , " <span style= \" font-family: $ 1; \" > $ 2</span> " , $Text );
2010-08-20 05:52:49 +02:00
// Declare the format for [code] layout
2011-07-19 04:17:16 +02:00
2012-07-05 02:15:43 +02:00
// $Text = preg_replace_callback("/\[code\](.*?)\[\/code\]/ism",'stripcode_br_cb',$Text);
2011-07-19 04:17:16 +02:00
2010-08-20 05:52:49 +02:00
$CodeLayout = '<code>$1</code>' ;
// Check for [code] text
2011-09-03 13:36:45 +02:00
$Text = preg_replace ( " / \ [code \ ](.*?) \ [ \ /code \ ]/ism " , " $CodeLayout " , $Text );
2011-07-19 04:17:16 +02:00
2012-03-17 11:07:49 +01: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 12:15:59 +01: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 05:52:49 +02:00
// Declare the format for [quote] layout
2012-02-19 20:36:59 +01:00
$QuoteLayout = '<blockquote>$1</blockquote>' ;
2012-03-17 11:07:49 +01:00
2010-08-20 05:52:49 +02:00
// Check for [quote] text
2012-02-19 20:36:59 +01:00
// handle nested quotes
$endlessloop = 0 ;
2012-02-23 20:51:44 +01:00
while (( strpos ( $Text , " [/quote] " ) !== false ) and ( strpos ( $Text , " [quote] " ) !== false ) and ( ++ $endlessloop < 20 ))
2012-02-19 20:36:59 +01:00
$Text = preg_replace ( " / \ [quote \ ](.*?) \ [ \ /quote \ ]/ism " , " $QuoteLayout " , $Text );
2012-02-13 01:18:58 +01:00
// Check for [quote=Author] text
2012-02-13 05:56:44 +01:00
$t_wrote = t ( '$1 wrote:' );
2012-02-19 20:36:59 +01:00
// handle nested quotes
$endlessloop = 0 ;
2012-02-23 20:51:44 +01:00
while (( strpos ( $Text , " [/quote] " ) !== false ) and ( strpos ( $Text , " [quote= " ) !== false ) and ( ++ $endlessloop < 20 ))
2012-02-19 20:36:59 +01:00
$Text = preg_replace ( " / \ [quote=[ \" \ ']*(.*?)[ \" \ ']* \ ](.*?) \ [ \ /quote \ ]/ism " ,
2012-06-02 00:31:07 +02:00
" <br /><strong class= " . '"author"' . " > " . $t_wrote . " </strong><blockquote> $ 2</blockquote> " ,
2012-02-19 20:36:59 +01:00
$Text );
2012-02-13 01:18:58 +01:00
2011-09-18 09:16:18 +02:00
// [img=widthxheight]image source[/img]
2012-03-31 16:28:39 +02: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 09:16:18 +02:00
2010-08-20 05:52:49 +02:00
// Images
// [img]pathtoimage[/img]
2011-09-03 13:36:45 +02:00
$Text = preg_replace ( " / \ [img \ ](.*?) \ [ \ /img \ ]/ism " , '<img src="$1" alt="' . t ( 'Image/photo' ) . '" />' , $Text );
2010-12-31 03:32:49 +01:00
2012-12-17 03:01:40 +01:00
// Shared content
2013-02-15 20:14:45 +01:00
if ( ! $simplehtml )
$Text = preg_replace_callback ( " / \ [share(.*?) \ ](.*?) \ [ \ /share \ ]/ism " , " bb_ShareAttributes " , $Text );
else
$Text = preg_replace_callback ( " / \ [share(.*?) \ ](.*?) \ [ \ /share \ ]/ism " , " bb_ShareAttributesSimple " , $Text );
2012-08-12 13:29:26 +02: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 09:35:39 +02: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 13:29:26 +02:00
2011-10-24 14:30:11 +02:00
// Try to Oembed
2012-06-18 01:29:08 +02:00
if ( $tryoembed ) {
2012-08-06 17:59:57 +02: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 23:36:00 +02: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-18 01:29:08 +02:00
$Text = preg_replace_callback ( " / \ [video \ ](.*?) \ [ \ /video \ ]/ism " , 'tryoembed' , $Text );
$Text = preg_replace_callback ( " / \ [audio \ ](.*?) \ [ \ /audio \ ]/ism " , 'tryoembed' , $Text );
2012-07-05 23:36:00 +02:00
} else {
$Text = preg_replace ( " / \ [video \ ](.*?) \ [ \ /video \ ]/ " , '$1' , $Text );
$Text = preg_replace ( " / \ [audio \ ](.*?) \ [ \ /audio \ ]/ " , '$1' , $Text );
2012-06-18 01:29:08 +02:00
}
2011-10-24 14:30:11 +02:00
2010-12-31 03:32:49 +01:00
// html5 video and audio
2012-07-05 23:36:00 +02:00
if ( $tryoembed )
2012-08-06 17:59:57 +02: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 23:36:00 +02:00
else
$Text = preg_replace ( " / \ [iframe \ ](.*?) \ [ \ /iframe \ ]/ism " , '<a href="$1">$1</a>' , $Text );
2010-08-20 05:52:49 +02:00
2011-12-15 10:08:19 +01:00
// Youtube extensions
2012-06-18 01:29:08 +02: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 10:08:19 +01: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-18 01:29:08 +02:00
$Text = preg_replace ( " / \ [youtube \ ]https?: \ / \ /youtu.be \ /(.*?) \ [ \ /youtube \ ]/ism " , '[youtube]$1[/youtube]' , $Text );
2012-07-05 23:36:00 +02:00
if ( $tryoembed )
2012-08-06 17:59:57 +02: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 23:36:00 +02:00
else
$Text = preg_replace ( " / \ [youtube \ ]([A-Za-z0-9 \ -_=]+)(.*?) \ [ \ /youtube \ ]/ism " , " http://www.youtube.com/watch?v= $ 1 " , $Text );
2011-12-15 10:08:19 +01:00
2010-08-20 05:52:49 +02:00
2012-06-18 01:29:08 +02: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 14:39:39 +02:00
2011-10-12 03:24:37 +02:00
$Text = preg_replace ( " / \ [vimeo \ ]https?: \ / \ /player.vimeo.com \ /video \ /([0-9]+)(.*?) \ [ \ /vimeo \ ]/ism " , '[vimeo]$1[/vimeo]' , $Text );
2012-07-05 23:36:00 +02:00
$Text = preg_replace ( " / \ [vimeo \ ]https?: \ / \ /vimeo.com \ /([0-9]+)(.*?) \ [ \ /vimeo \ ]/ism " , '[vimeo]$1[/vimeo]' , $Text );
if ( $tryoembed )
2012-08-06 17:59:57 +02: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 23:36:00 +02:00
else
$Text = preg_replace ( " / \ [vimeo \ ]([0-9]+)(.*?) \ [ \ /vimeo \ ]/ism " , " http://vimeo.com/ $ 1 " , $Text );
2011-06-10 05:02:48 +02:00
2011-08-31 08:09:39 +02: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 05:02:48 +02:00
2011-01-31 10:38:49 +01:00
// oembed tag
2011-01-31 16:45:58 +01:00
$Text = oembed_bbcode2html ( $Text );
2011-06-10 05:02:48 +02:00
2012-07-14 19:54:27 +02: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 05:02:48 +02:00
// If we found an event earlier, strip out all the event code and replace with a reformatted version.
2012-06-26 06:27:34 +02: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 05:02:48 +02:00
2012-06-26 06:27:34 +02:00
if (( x ( $ev , 'desc' ) || x ( $ev , 'summary' )) && x ( $ev , 'start' )) {
2011-06-10 05:02:48 +02:00
$sub = format_event_html ( $ev );
2012-06-26 05:55:27 +02:00
$Text = preg_replace ( " / \ [event \ -summary \ ](.*?) \ [ \ /event \ -summary \ ]/ism " , '' , $Text );
2012-06-26 06:20:08 +02:00
$Text = preg_replace ( " / \ [event \ -description \ ](.*?) \ [ \ /event \ -description \ ]/ism " , '' , $Text );
$Text = preg_replace ( " / \ [event \ -start \ ](.*?) \ [ \ /event \ -start \ ]/ism " , $sub , $Text );
2011-09-03 13:36:45 +02: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 05:02:48 +02:00
}
2012-02-12 23:35:29 +01: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 14:42:46 +02:00
$Text = preg_replace ( '/\[\&\;([#a-z0-9]+)\;\]/' , '&$1;' , $Text );
2012-08-15 13:52:18 +02:00
$Text = preg_replace ( '/\&\#039\;/' , '\'' , $Text );
$Text = preg_replace ( '/\"\;/' , '"' , $Text );
2012-04-23 14:42:46 +02:00
2011-09-15 05:47:49 +02:00
// fix any escaped ampersands that may have been converted into links
2013-02-27 00:34:40 +01:00
$Text = preg_replace ( " / \ <([^>]*?)(src|href)=(.*?) \ & \ ;(.*?) \ >/ism " , '<$1$2=$3&$4>' , $Text );
$Text = preg_replace ( " / \ <([^>]*?)(src|href)= \" [^hfm](.*?) \ >/ism " , '<$1$2="">' , $Text );
2012-07-08 00:20:24 +02:00
if ( $saved_image )
$Text = bb_replace_images ( $Text , $saved_image );
2011-11-27 13:09:14 +01:00
2012-07-05 23:36:00 +02: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 09:37:15 +01:00
// Update: Now it is done every time - since bad structured html can break a whole page
//if (!$tryoembed) {
2013-02-27 02:33:18 +01:00
// $doc = new DOMDocument();
// $doc->preserveWhiteSpace = false;
2012-07-05 23:36:00 +02:00
2013-02-27 02:33:18 +01:00
// $Text = mb_convert_encoding($Text, 'HTML-ENTITIES', "UTF-8");
2012-07-05 23:36:00 +02:00
2013-02-27 02:33:18 +01:00
// $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>");
2012-07-05 23:36:00 +02:00
2013-02-27 02:33:18 +01:00
// $Text = $doc->saveHTML();
// $Text = str_replace(array("<html><body>", "</body></html>", $doctype), array("", "", ""), $Text);
2012-07-05 23:36:00 +02:00
2013-02-27 02:33:18 +01:00
// $Text = str_replace('<br></li>','</li>', $Text);
2012-07-08 18:27:11 +02:00
2013-02-27 02:33:18 +01:00
// $Text = mb_convert_encoding($Text, "UTF-8", 'HTML-ENTITIES');
2013-01-13 09:37:15 +01:00
//}
2012-07-05 23:36:00 +02:00
2010-12-30 23:21:05 +01:00
call_hooks ( 'bbcode' , $Text );
2013-01-26 18:35:39 +01:00
$a -> save_timestamp ( $stamp1 , " parser " );
2010-08-20 05:52:49 +02:00
return $Text ;
}
2012-02-23 20:59:34 +01:00