2012-06-26 05:01:32 +00:00
< ? php
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' );
2015-05-15 18:41:10 +00:00
require_once ( 'include/map.php' );
2015-10-05 20:19:34 +00:00
require_once ( 'mod/proxy.php' );
2016-01-10 14:44:23 +00:00
require_once ( 'include/Contact.php' );
2015-05-15 18:41:10 +00:00
2015-10-05 20:19:34 +00:00
function bb_PictureCacheExt ( $matches ) {
if ( strpos ( $matches [ 3 ], " data:image/ " ) === 0 )
return ( $matches [ 0 ]);
$matches [ 3 ] = proxy_url ( $matches [ 3 ]);
return " [img= " . $matches [ 1 ] . " x " . $matches [ 2 ] . " ] " . $matches [ 3 ] . " [/img] " ;
}
function bb_PictureCache ( $matches ) {
if ( strpos ( $matches [ 1 ], " data:image/ " ) === 0 )
return ( $matches [ 0 ]);
$matches [ 1 ] = proxy_url ( $matches [ 1 ]);
return " [img] " . $matches [ 1 ] . " [/img] " ;
}
2015-05-15 18:41:10 +00:00
function bb_map_coords ( $match ) {
// the extra space in the following line is intentional
return str_replace ( $match [ 0 ], '<div class="map" >' . generate_map ( str_replace ( '/' , ' ' , $match [ 1 ])) . '</div>' , $match [ 0 ]);
}
function bb_map_location ( $match ) {
// the extra space in the following line is intentional
return str_replace ( $match [ 0 ], '<div class="map" >' . generate_named_map ( $match [ 1 ]) . '</div>' , $match [ 0 ]);
}
2011-06-10 03:02:48 +00:00
2015-06-06 11:15:37 +00:00
function bb_attachment ( $Text , $simplehtml = false , $tryoembed = true ) {
2014-12-01 21:49:35 +00:00
$Text = preg_replace_callback ( " /(.*?) \ [attachment(.*?) \ ](.*?) \ [ \ /attachment \ ]/ism " ,
2015-06-06 11:15:37 +00:00
function ( $match ) use ( $simplehtml , $tryoembed ){
2014-06-02 21:45:32 +00:00
2014-12-01 21:49:35 +00:00
$attributes = $match [ 2 ];
2014-06-02 21:45:32 +00:00
2014-06-14 23:57:31 +00:00
$type = " " ;
preg_match ( " /type='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
2014-08-20 22:51:18 +00:00
$type = strtolower ( $matches [ 1 ]);
2014-06-02 21:45:32 +00:00
2014-06-14 23:57:31 +00:00
preg_match ( '/type="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
2014-08-20 22:51:18 +00:00
$type = strtolower ( $matches [ 1 ]);
2014-06-02 21:45:32 +00:00
2014-06-14 23:57:31 +00:00
if ( $type == " " )
return ( $match [ 0 ]);
2014-06-02 21:45:32 +00:00
2014-06-14 23:57:31 +00:00
if ( ! in_array ( $type , array ( " link " , " audio " , " video " )))
return ( $match [ 0 ]);
2014-06-02 21:45:32 +00:00
2014-06-14 23:57:31 +00:00
$url = " " ;
preg_match ( " /url='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$url = $matches [ 1 ];
2014-06-02 21:45:32 +00:00
2014-06-14 23:57:31 +00:00
preg_match ( '/url="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$url = $matches [ 1 ];
2014-06-02 21:45:32 +00:00
2014-06-14 23:57:31 +00:00
$title = " " ;
preg_match ( " /title='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$title = $matches [ 1 ];
2014-06-02 21:45:32 +00:00
2014-06-14 23:57:31 +00:00
preg_match ( '/title="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$title = $matches [ 1 ];
2014-06-02 21:45:32 +00:00
2015-01-02 00:43:31 +00:00
//$title = htmlentities($title, ENT_QUOTES, 'UTF-8', false);
2015-03-19 21:04:41 +00:00
$title = bbcode ( html_entity_decode ( $title , ENT_QUOTES , 'UTF-8' ), false , false , true );
2015-01-02 00:43:31 +00:00
$title = str_replace ( array ( " [ " , " ] " ), array ( " [ " , " ] " ), $title );
2014-08-25 12:08:26 +00:00
2014-06-14 23:57:31 +00:00
$image = " " ;
2014-08-20 22:51:18 +00:00
if ( $type != " video " ) {
preg_match ( " /image='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$image = $matches [ 1 ];
preg_match ( '/image="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$image = $matches [ 1 ];
}
2014-06-14 23:57:31 +00:00
$preview = " " ;
2014-08-20 22:51:18 +00:00
if ( $type != " video " ) {
preg_match ( " /preview='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$preview = $matches [ 1 ];
preg_match ( '/preview="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$preview = $matches [ 1 ];
}
2014-06-02 21:45:32 +00:00
2014-12-01 21:49:35 +00:00
if ((( strpos ( $match [ 1 ], " [img= " ) !== false ) OR ( strpos ( $match [ 1 ], " [img] " ) !== false )) AND ( $image != " " )) {
$preview = $image ;
$image = " " ;
}
2015-11-28 06:37:02 +00:00
if ( $simplehtml == 7 ) {
$title2 = $title ;
2015-11-28 09:28:14 +00:00
$test1 = trim ( html_entity_decode ( $match [ 1 ], ENT_QUOTES , 'UTF-8' ));
$test2 = trim ( html_entity_decode ( $title , ENT_QUOTES , 'UTF-8' ));
2015-11-28 06:37:02 +00:00
// If the link description is similar to the text above then don't add the link description
2015-11-28 09:28:14 +00:00
if (( $title != " " ) AND (( strpos ( $test1 , $test2 ) !== false ) OR
( similar_text ( $test1 , $test2 ) / strlen ( $title )) > 0.9 ))
2015-11-28 06:37:02 +00:00
$title2 = $url ;
2015-11-27 22:16:54 +00:00
$text = sprintf ( '<a href="%s" title="%s" class="attachment thumbnail" rel="nofollow external">%s</a><br />' ,
2015-11-28 06:37:02 +00:00
$url , $title , $title2 );
} elseif (( $simplehtml != 4 ) AND ( $simplehtml != 0 ))
2014-11-02 17:39:23 +00:00
$text = sprintf ( '<a href="%s" target="_blank">%s</a><br>' , $url , $title );
2014-06-02 21:45:32 +00:00
else {
2014-06-14 23:57:31 +00:00
$text = sprintf ( '<span class="type-%s">' , $type );
2014-06-02 21:45:32 +00:00
2014-07-27 14:10:09 +00:00
$bookmark = array ( sprintf ( '[bookmark=%s]%s[/bookmark]' , $url , $title ), $url , $title );
2014-06-02 21:45:32 +00:00
if ( $tryoembed )
2014-06-14 23:57:31 +00:00
$oembed = tryoembed ( $bookmark );
2014-06-02 21:45:32 +00:00
else
$oembed = $bookmark [ 0 ];
2015-05-01 08:42:43 +00:00
if ( strstr ( strtolower ( $oembed ), " <iframe " ))
$text = $oembed ;
else {
if (( $image != " " ) AND ! strstr ( strtolower ( $oembed ), " <img " ))
2015-10-05 20:19:34 +00:00
$text .= sprintf ( '<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-image" /></a><br />' , $url , proxy_url ( $image ), $title );
2015-05-01 08:42:43 +00:00
elseif (( $preview != " " ) AND ! strstr ( strtolower ( $oembed ), " <img " ))
2015-10-05 20:19:34 +00:00
$text .= sprintf ( '<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-preview" /></a><br />' , $url , proxy_url ( $preview ), $title );
2014-06-02 21:45:32 +00:00
2015-05-01 08:42:43 +00:00
$text .= $oembed ;
2014-06-02 21:45:32 +00:00
2015-05-01 08:42:43 +00:00
$text .= sprintf ( '<blockquote>%s</blockquote></span>' , trim ( $match [ 3 ]));
}
2014-06-02 21:45:32 +00:00
}
2014-12-01 21:49:35 +00:00
return ( $match [ 1 ] . $text );
2014-06-02 21:45:32 +00:00
}, $Text );
2014-06-14 23:57:31 +00:00
return ( $Text );
2014-06-02 21:45:32 +00:00
}
2014-08-25 12:08:26 +00:00
function bb_rearrange_share ( $shared ) {
if ( ! in_array ( strtolower ( $shared [ 2 ]), array ( " type-link " , " type-audio " , " type-video " )))
return ( $shared [ 0 ]);
if ( ! preg_match_all ( " / \ [bookmark \ =([^ \ ]]*) \ ](.*?) \ [ \ /bookmark \ ]/ism " , $shared [ 3 ], $bookmark ))
return ( $shared [ 0 ]);
$type = substr ( trim ( strtolower ( $shared [ 2 ])), 5 );
$title = " " ;
$url = " " ;
$preview = " " ;
$description = " " ;
if ( isset ( $bookmark [ 2 ][ 0 ]))
$title = $bookmark [ 2 ][ 0 ];
if ( isset ( $bookmark [ 1 ][ 0 ]))
$url = $bookmark [ 1 ][ 0 ];
$cleanedshare = trim ( $shared [ 3 ]);
$cleanedshare = preg_replace ( " / \ [img \ =([0-9]*)x([0-9]*) \ ](.*?) \ [ \ /img \ ]/ism " , '[img]$3[/img]' , $cleanedshare );
preg_match ( " / \ [img \ ](.*?) \ [ \ /img \ ]/ism " , $cleanedshare , $matches );
if ( $matches )
$preview = trim ( $matches [ 1 ]);
preg_match ( " / \ [quote \ ](.*?) \ [ \ /quote \ ]/ism " , $cleanedshare , $matches );
if ( $matches )
$description = trim ( $matches [ 1 ]);
2014-08-27 23:11:43 +00:00
$url = str_replace ( array ( " [ " , " ] " ), array ( " [ " , " ] " ), htmlentities ( $url , ENT_QUOTES , 'UTF-8' , false ));
$title = str_replace ( array ( " [ " , " ] " ), array ( " [ " , " ] " ), htmlentities ( $title , ENT_QUOTES , 'UTF-8' , false ));
$preview = str_replace ( array ( " [ " , " ] " ), array ( " [ " , " ] " ), htmlentities ( $preview , ENT_QUOTES , 'UTF-8' , false ));
2014-08-25 12:08:26 +00:00
$Text = trim ( $shared [ 1 ]) . " \n [attachment type=' " . $type . " ' " ;
if ( $url != " " )
$Text .= " url=' " . $url . " ' " ;
if ( $title != " " )
$Text .= " title=' " . $title . " ' " ;
if ( $preview != " " ) {
require_once ( " include/Photo.php " );
$picturedata = get_photo_info ( $preview );
2014-08-27 23:11:43 +00:00
2014-08-25 12:08:26 +00:00
if ( count ( $picturedata ) > 0 ) {
// if the preview picture is larger than 500 pixels then show it in a larger mode
// But only, if the picture isn't higher than large (To prevent huge posts)
if (( $picturedata [ 0 ] >= 500 ) AND ( $picturedata [ 0 ] >= $picturedata [ 1 ]))
$Text .= " image=' " . $preview . " ' " ;
else
$Text .= " preview=' " . $preview . " ' " ;
} else
$Text .= " preview=' " . $preview . " ' " ;
}
$Text .= " ] " . $description . " [/attachment] " ;
return ( $Text );
2014-03-16 17:16:05 +00:00
}
2014-06-14 23:57:31 +00:00
function bb_remove_share_information ( $Text , $plaintext = false , $nolink = false ) {
$Text = preg_replace_callback ( " ((.*?) \ [class=(.*?) \ ](.*?) \ [ \ /class \ ])ism " ,
function ( $match ) use ( $plaintext , $nolink ){
return ( bb_cleanup_share ( $match , $plaintext , $nolink ));
}, $Text );
return ( $Text );
2014-01-18 20:32:14 +00:00
}
2014-06-14 23:57:31 +00:00
function bb_cleanup_share ( $shared , $plaintext , $nolink ) {
2015-02-22 16:38:28 +00:00
$shared [ 1 ] = trim ( $shared [ 1 ]);
2014-05-18 16:56:07 +00:00
if ( ! in_array ( $shared [ 2 ], array ( " type-link " , " type-video " )))
2014-06-14 23:57:31 +00:00
return ( $shared [ 0 ]);
2014-01-18 20:32:14 +00:00
2014-06-14 23:57:31 +00:00
if ( $plaintext )
$shared [ 3 ] = preg_replace ( " / \ [bookmark \ =([^ \ ]]*) \ ](.*?) \ [ \ /bookmark \ ]/ism " , " [bookmark= $ 1] $ 1[/bookmark] " , $shared [ 3 ]);
if ( ! preg_match_all ( " / \ [bookmark \ =([^ \ ]]*) \ ](.*?) \ [ \ /bookmark \ ]/ism " , $shared [ 3 ], $bookmark ))
return ( $shared [ 0 ]);
2014-01-18 20:32:14 +00:00
2014-06-14 23:57:31 +00:00
if ( $nolink )
2015-02-22 16:38:28 +00:00
return ( $shared [ 1 ]);
2014-01-18 20:32:14 +00:00
2014-06-14 23:57:31 +00:00
$title = " " ;
$link = " " ;
2014-01-18 20:32:14 +00:00
2014-06-14 23:57:31 +00:00
if ( isset ( $bookmark [ 2 ][ 0 ]))
$title = $bookmark [ 2 ][ 0 ];
2014-01-18 20:32:14 +00:00
2014-06-14 23:57:31 +00:00
if ( isset ( $bookmark [ 1 ][ 0 ]))
$link = $bookmark [ 1 ][ 0 ];
2015-02-22 19:06:13 +00:00
if (( $shared [ 1 ] != " " ) AND ( strpos ( $title , $shared [ 1 ]) !== false ))
2015-02-22 16:38:28 +00:00
$shared [ 1 ] = $title ;
2014-11-02 17:39:23 +00:00
if (( $title != " " ) AND (( strpos ( $shared [ 1 ], $title ) !== false ) OR
( similar_text ( $shared [ 1 ], $title ) / strlen ( $title )) > 0.9 ))
2014-06-14 23:57:31 +00:00
$title = " " ;
2014-01-18 20:32:14 +00:00
2014-04-22 22:34:34 +00:00
// if (strpos($shared[1],$link) !== false)
// $link = "";
2014-01-18 20:32:14 +00:00
2014-06-14 23:57:31 +00:00
$text = trim ( $shared [ 1 ]);
2014-01-18 20:32:14 +00:00
if (( $text == " " ) AND ( $title != " " ) AND ( $link == " " ))
$text .= " \n \n " . trim ( $title );
2014-08-20 22:51:18 +00:00
// If the link already is included in the post, don't add it again
if (( $link != " " ) AND strpos ( $text , $link ))
return ( trim ( $text ));
2014-01-18 20:32:14 +00:00
if (( $link != " " ) AND ( $title != " " ))
$text .= " \n [url= " . trim ( $link ) . " ] " . trim ( $title ) . " [/url] " ;
elseif (( $link != " " ))
$text .= " \n " . trim ( $link );
2014-06-14 23:57:31 +00:00
return ( trim ( $text ));
2014-01-18 20:32:14 +00:00
}
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 ;
2013-12-08 15:49:07 +00:00
if ( ! ( strpos ( " #;:0123456789-_ " , $char ) === false ))
2012-08-17 05:59:21 +00:00
$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]' ;
}
2015-08-04 09:42:00 +00:00
function bb_onelinecode_cb ( $match ) {
if ( strpos ( $match [ 1 ], " <br> " ) === false ){
return " <key> " . $match [ 1 ] . " </key> " ;
}
return " <code> " . $match [ 1 ] . " </code> " ;
}
2011-10-24 12:30:11 +00:00
function tryoembed ( $match ){
2014-07-27 14:10:09 +00:00
$url = $match [ 1 ];
2013-09-03 22:01:00 +00:00
2013-09-04 05:39:03 +00:00
// Always embed the SSL version
2013-10-02 20:17:56 +00:00
$url = str_replace ( array ( " http://www.youtube.com/ " , " http://player.vimeo.com/ " ),
array ( " https://www.youtube.com/ " , " https://player.vimeo.com/ " ), $url );
2013-09-04 05:39:03 +00:00
2012-02-19 19:36:59 +00:00
2011-10-24 12:30:11 +00:00
$o = oembed_fetch_url ( $url );
2014-07-27 14:10:09 +00:00
if ( isset ( $match [ 2 ]))
$o -> title = $match [ 2 ];
2011-10-24 12:30:11 +00:00
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 );
2015-12-28 17:07:31 +00:00
return $html ;
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 ),
2014-06-14 23:57:31 +00:00
'end' => array ( 'open' => $end_open , 'close' => $end_open + strlen ( '[/' . $name . ']' )) );
2012-08-26 20:56:34 +00:00
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
2015-10-05 20:19:34 +00:00
$newbody = str_replace ( '[$#saved_image' . $cnt . '#$]' , '<img src="' . proxy_url ( $image ) . '" alt="' . t ( 'Image/photo' ) . '" />' , $newbody );
2012-07-07 22:20:24 +00:00
$cnt ++ ;
}
return $newbody ;
}}
2014-06-14 23:57:31 +00:00
function bb_ShareAttributes ( $share , $simplehtml ) {
$attributes = $share [ 2 ];
$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 ];
$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 ];
$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 ];
$posted = " " ;
2014-06-22 23:24:39 +00:00
$itemcache = get_itemcachepath ();
2014-06-14 23:57:31 +00:00
// relative dates only make sense when they aren't cached
if ( $itemcache == " " ) {
preg_match ( " /posted='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$posted = $matches [ 1 ];
2013-07-28 18:38:48 +00:00
2014-06-14 23:57:31 +00:00
preg_match ( '/posted="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$posted = $matches [ 1 ];
$reldate = (( $posted ) ? " " . relative_date ( $posted ) : '' );
}
2016-01-10 14:44:23 +00:00
$data = get_contact_details_by_url ( $profile );
if ( isset ( $data [ " name " ]) AND isset ( $data [ " addr " ]))
$userid_compact = $data [ " name " ] . " ( " . $data [ " addr " ] . " ) " ;
else
$userid_compact = GetProfileUsername ( $profile , $author , true );
if ( isset ( $data [ " addr " ]))
$userid = $data [ " addr " ];
else
$userid = GetProfileUsername ( $profile , $author , false );
if ( isset ( $data [ " name " ]))
$author = $data [ " name " ];
if ( isset ( $data [ " photo " ]))
$avatar = $data [ " photo " ];
2014-06-14 23:57:31 +00:00
$preshare = trim ( $share [ 1 ]);
if ( $preshare != " " )
$preshare .= " <br /><br /> " ;
switch ( $simplehtml ) {
case 1 :
$text = $preshare . html_entity_decode ( " ♲ " , ENT_QUOTES , 'UTF-8' ) . ' <a href="' . $profile . '">' . $userid . " </a>: <br />» " . $share [ 3 ] . " « " ;
break ;
case 2 :
2014-07-09 21:33:38 +00:00
$text = $preshare . html_entity_decode ( " ♲ " , ENT_QUOTES , 'UTF-8' ) . ' ' . $userid_compact . " : <br /> " . $share [ 3 ];
2014-06-14 23:57:31 +00:00
break ;
2014-07-24 20:51:28 +00:00
case 3 : // Diaspora
2015-04-03 10:37:29 +00:00
$headline .= '<b>' . html_entity_decode ( " ♲ " , ENT_QUOTES , 'UTF-8' ) . $userid . ':</b><br />' ;
2014-06-14 23:57:31 +00:00
$text = trim ( $share [ 1 ]);
if ( $text != " " )
$text .= " <hr /> " ;
2014-09-27 21:39:06 +00:00
if ( substr ( normalise_link ( $link ), 0 , 19 ) != " http://twitter.com/ " ) {
2015-04-03 10:37:29 +00:00
$text .= $headline . '<blockquote>' . trim ( $share [ 3 ]) . " </blockquote><br /> " ;
2014-09-27 21:39:06 +00:00
if ( $link != " " )
$text .= '<br /><a href="' . $link . '">[l]</a>' ;
} else
$text .= '<br /><a href="' . $link . '">' . $link . '</a>' ;
2014-06-14 23:57:31 +00:00
break ;
case 4 :
$headline = '<div class="shared_header">' ;
$headline .= '<span><b>' . html_entity_decode ( " ♲ " , ENT_QUOTES , 'UTF-8' );
$headline .= sprintf ( t ( '<a href="%1$s" target="_blank">%2$s</a> %3$s' ), $link , $userid , $posted );
$headline .= " :</b></span></div> " ;
$text = trim ( $share [ 1 ]);
if ( $text != " " )
$text .= " <hr /> " ;
$text .= $headline . '<blockquote class="shared_content">' . trim ( $share [ 3 ]) . " </blockquote><br /> " ;
break ;
case 5 :
2014-07-09 21:33:38 +00:00
$text = $preshare . html_entity_decode ( " ♲ " , ENT_QUOTES , 'UTF-8' ) . ' ' . $userid_compact . " : <br /> " . $share [ 3 ];
2014-06-14 23:57:31 +00:00
break ;
2014-07-24 20:51:28 +00:00
case 6 : // app.net
2014-07-09 22:12:12 +00:00
$text = $preshare . " >> @ " . $userid_compact . " : <br /> " . $share [ 3 ];
2014-07-09 21:33:38 +00:00
break ;
2014-07-24 20:51:28 +00:00
case 7 : // statusnet/GNU Social
2014-07-10 21:12:07 +00:00
$text = $preshare . html_entity_decode ( " ♲ " , ENT_QUOTES , 'UTF-8' ) . " @ " . $userid_compact . " : " . $share [ 3 ];
2014-07-09 21:33:38 +00:00
break ;
2014-07-24 20:51:28 +00:00
case 8 : // twitter
2014-07-10 21:12:07 +00:00
$text = $preshare . " RT @ " . $userid_compact . " : " . $share [ 3 ];
2014-06-14 23:57:31 +00:00
break ;
2014-07-24 20:51:28 +00:00
case 9 : // Google+/Facebook
$text = $preshare . html_entity_decode ( " ♲ " , ENT_QUOTES , 'UTF-8' ) . ' ' . $userid_compact . " : <br /> " . $share [ 3 ];
if ( $link != " " )
$text .= " <br /><br /> " . $link ;
break ;
2014-06-14 23:57:31 +00:00
default :
$headline = trim ( $share [ 1 ]) . '<div class="shared_header">' ;
if ( $avatar != " " )
2015-10-07 06:25:10 +00:00
$headline .= '<img src="' . proxy_url ( $avatar , false , PROXY_SIZE_MICRO ) . '" height="32" width="32" >' ;
2014-06-14 23:57:31 +00:00
$headline .= sprintf ( t ( '<span><a href="%s" target="_blank">%s</a> wrote the following <a href="%s" target="_blank">post</a>' . $reldate . ':</span>' ), $profile , $author , $link );
$headline .= " </div> " ;
$text = $headline . '<blockquote class="shared_content">' . trim ( $share [ 3 ]) . " </blockquote> " ;
break ;
}
return ( $text );
2013-07-28 18:38:48 +00:00
}
2014-08-26 15:10:46 +00:00
function GetProfileUsername ( $profile , $username , $compact = false , $getnetwork = false ) {
2014-01-18 20:32:14 +00:00
$twitter = preg_replace ( " =https?://twitter.com/(.*)=ism " , " $ 1@twitter.com " , $profile );
2014-07-09 21:33:38 +00:00
if ( $twitter != $profile ) {
2014-08-26 15:10:46 +00:00
if ( $getnetwork )
return ( NETWORK_TWITTER );
elseif ( $compact )
2014-07-09 21:33:38 +00:00
return ( $twitter );
else
return ( $username . " ( " . $twitter . " ) " );
}
2014-01-18 20:32:14 +00:00
2014-06-10 18:20:51 +00:00
$appnet = preg_replace ( " =https?://alpha.app.net/(.*)=ism " , " $ 1@alpha.app.net " , $profile );
2014-07-09 21:33:38 +00:00
if ( $appnet != $profile ) {
2014-08-26 15:10:46 +00:00
if ( $getnetwork )
return ( NETWORK_APPNET );
elseif ( $compact )
2014-07-09 21:33:38 +00:00
return ( $appnet );
else
return ( $username . " ( " . $appnet . " ) " );
}
2014-06-10 18:20:51 +00:00
2014-01-18 20:32:14 +00:00
$gplus = preg_replace ( " =https?://plus.google.com/(.*)=ism " , " $ 1@plus.google.com " , $profile );
2014-07-10 21:12:07 +00:00
if ( $gplus != $profile ) {
2014-08-26 15:10:46 +00:00
if ( $getnetwork )
return ( NETWORK_GPLUS );
elseif ( $compact )
2014-07-10 21:12:07 +00:00
return ( $gplususername . " ( " . $username . " ) " );
else
return ( $username . " ( " . $gplus . " ) " );
}
2014-01-18 20:32:14 +00:00
2013-07-28 18:38:48 +00:00
$friendica = preg_replace ( " =https?://(.*)/profile/(.*)=ism " , " $ 2@ $ 1 " , $profile );
2014-07-09 21:33:38 +00:00
if ( $friendica != $profile ) {
2014-08-26 15:10:46 +00:00
if ( $getnetwork )
return ( NETWORK_DFRN );
elseif ( $compact )
2014-07-09 21:33:38 +00:00
return ( $friendica );
else
return ( $username . " ( " . $friendica . " ) " );
}
2013-07-28 18:38:48 +00:00
$diaspora = preg_replace ( " =https?://(.*)/u/(.*)=ism " , " $ 2@ $ 1 " , $profile );
2014-07-09 21:33:38 +00:00
if ( $diaspora != $profile ) {
2014-08-26 15:10:46 +00:00
if ( $getnetwork )
return ( NETWORK_DIASPORA );
elseif ( $compact )
2014-07-09 21:33:38 +00:00
return ( $diaspora );
else
return ( $username . " ( " . $diaspora . " ) " );
}
2013-10-12 06:29:39 +00:00
2015-01-27 07:04:24 +00:00
$red = preg_replace ( " =https?://(.*)/channel/(.*)=ism " , " $ 2@ $ 1 " , $profile );
if ( $red != $profile ) {
if ( $getnetwork )
// red is identified as Diaspora - friendica can't connect directly to it
return ( NETWORK_DIASPORA );
elseif ( $compact )
return ( $red );
else
return ( $username . " ( " . $red . " ) " );
}
2013-07-28 18:38:48 +00:00
$StatusnetHost = preg_replace ( " =https?://(.*)/user/(.*)=ism " , " $ 1 " , $profile );
if ( $StatusnetHost != $profile ) {
$StatusnetUser = preg_replace ( " =https?://(.*)/user/(.*)=ism " , " $ 2 " , $profile );
if ( $StatusnetUser != $profile ) {
$UserData = fetch_url ( " http:// " . $StatusnetHost . " /api/users/show.json?user_id= " . $StatusnetUser );
$user = json_decode ( $UserData );
2014-07-09 21:33:38 +00:00
if ( $user ) {
2014-08-26 15:10:46 +00:00
if ( $getnetwork )
return ( NETWORK_STATUSNET );
elseif ( $compact )
2014-07-09 21:33:38 +00:00
return ( $user -> screen_name . " @ " . $StatusnetHost );
else
return ( $username . " ( " . $user -> screen_name . " @ " . $StatusnetHost . " ) " );
}
2013-07-28 18:38:48 +00:00
}
}
2014-04-22 22:34:34 +00:00
// pumpio (http://host.name/user)
$rest = preg_replace ( " =https?://([ \ . \ w]+)/([ \ . \ w]+)(.*)=ism " , " $ 3 " , $profile );
if ( $rest == " " ) {
2014-06-10 18:20:51 +00:00
$pumpio = preg_replace ( " =https?://([ \ . \ w]+)/([ \ . \ w]+)(.*)=ism " , " $ 2@ $ 1 " , $profile );
2014-07-09 21:33:38 +00:00
if ( $pumpio != $profile ) {
2014-08-26 15:10:46 +00:00
if ( $getnetwork )
return ( NETWORK_PUMPIO );
elseif ( $compact )
2014-07-09 21:33:38 +00:00
return ( $pumpio );
else
return ( $username . " ( " . $pumpio . " ) " );
}
2014-04-22 22:34:34 +00:00
}
2014-01-18 20:32:14 +00:00
2013-07-28 18:38:48 +00:00
return ( $username );
}
2013-02-15 19:14:45 +00:00
2015-02-02 19:26:05 +00:00
function bb_DiasporaLinks ( $match ) {
$a = get_app ();
return " [url= " . $a -> get_baseurl () . " /display/ " . $match [ 1 ] . " ] " . $match [ 2 ] . " [/url] " ;
}
2014-02-22 14:42:34 +00:00
function bb_RemovePictureLinks ( $match ) {
2014-02-23 14:51:57 +00:00
$text = Cache :: get ( $match [ 1 ]);
if ( is_null ( $text )){
2014-09-07 08:47:37 +00:00
$a = get_app ();
2015-03-07 22:14:26 +00:00
$stamp1 = microtime ( true );
2014-02-23 14:51:57 +00:00
$ch = @ curl_init ( $match [ 1 ]);
@ curl_setopt ( $ch , CURLOPT_NOBODY , true );
@ curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
2014-09-07 08:47:37 +00:00
@ curl_setopt ( $ch , CURLOPT_USERAGENT , $a -> get_useragent ());
2014-02-23 14:51:57 +00:00
@ curl_exec ( $ch );
$curl_info = @ curl_getinfo ( $ch );
2015-03-07 22:14:26 +00:00
$a -> save_timestamp ( $stamp1 , " network " );
2014-02-23 14:51:57 +00:00
if ( substr ( $curl_info [ " content_type " ], 0 , 6 ) == " image/ " )
$text = " [url= " . $match [ 1 ] . " ] " . $match [ 1 ] . " [/url] " ;
else {
$text = " [url= " . $match [ 2 ] . " ] " . $match [ 2 ] . " [/url] " ;
// if its not a picture then look if its a page that contains a picture link
require_once ( " include/network.php " );
$body = fetch_url ( $match [ 1 ]);
$doc = new DOMDocument ();
@ $doc -> loadHTML ( $body );
$xpath = new DomXPath ( $doc );
$list = $xpath -> query ( " //meta[@name] " );
foreach ( $list as $node ) {
$attr = array ();
if ( $node -> attributes -> length )
foreach ( $node -> attributes as $attribute )
$attr [ $attribute -> name ] = $attribute -> value ;
if ( strtolower ( $attr [ " name " ]) == " twitter:image " )
$text = " [url= " . $attr [ " content " ] . " ] " . $attr [ " content " ] . " [/url] " ;
}
2014-02-22 14:42:34 +00:00
}
2014-02-23 14:51:57 +00:00
Cache :: set ( $match [ 1 ], $text );
2014-02-22 14:42:34 +00:00
}
return ( $text );
}
2014-06-14 23:57:31 +00:00
function bb_expand_links ( $match ) {
2015-01-11 23:14:51 +00:00
if (( $match [ 3 ] == " " ) OR ( $match [ 2 ] == $match [ 3 ]) OR stristr ( $match [ 2 ], $match [ 3 ]))
2014-06-14 23:57:31 +00:00
return ( $match [ 1 ] . " [url] " . $match [ 2 ] . " [/url] " );
else
return ( $match [ 1 ] . $match [ 3 ] . " [url] " . $match [ 2 ] . " [/url] " );
}
2014-02-22 14:42:34 +00:00
function bb_CleanPictureLinksSub ( $match ) {
2014-02-23 14:51:57 +00:00
$text = Cache :: get ( $match [ 1 ]);
if ( is_null ( $text )){
2014-09-07 08:47:37 +00:00
$a = get_app ();
2015-03-07 22:14:26 +00:00
$stamp1 = microtime ( true );
2014-02-23 14:51:57 +00:00
$ch = @ curl_init ( $match [ 1 ]);
@ curl_setopt ( $ch , CURLOPT_NOBODY , true );
@ curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
2014-09-07 08:47:37 +00:00
@ curl_setopt ( $ch , CURLOPT_USERAGENT , $a -> get_useragent ());
2014-02-23 14:51:57 +00:00
@ curl_exec ( $ch );
$curl_info = @ curl_getinfo ( $ch );
2015-03-07 22:14:26 +00:00
$a -> save_timestamp ( $stamp1 , " network " );
2014-02-23 14:51:57 +00:00
// if its a link to a picture then embed this picture
if ( substr ( $curl_info [ " content_type " ], 0 , 6 ) == " image/ " )
$text = " [img] " . $match [ 1 ] . " [/img] " ;
else {
$text = " [img] " . $match [ 2 ] . " [/img] " ;
// if its not a picture then look if its a page that contains a picture link
require_once ( " include/network.php " );
$body = fetch_url ( $match [ 1 ]);
$doc = new DOMDocument ();
@ $doc -> loadHTML ( $body );
$xpath = new DomXPath ( $doc );
$list = $xpath -> query ( " //meta[@name] " );
foreach ( $list as $node ) {
$attr = array ();
if ( $node -> attributes -> length )
foreach ( $node -> attributes as $attribute )
$attr [ $attribute -> name ] = $attribute -> value ;
if ( strtolower ( $attr [ " name " ]) == " twitter:image " )
$text = " [img] " . $attr [ " content " ] . " [/img] " ;
}
2014-02-22 14:42:34 +00:00
}
2014-02-23 14:51:57 +00:00
Cache :: set ( $match [ 1 ], $text );
2014-02-22 14:42:34 +00:00
}
2014-02-11 22:42:06 +00:00
return ( $text );
}
2014-02-22 14:42:34 +00:00
function bb_CleanPictureLinks ( $text ) {
$text = preg_replace_callback ( " & \ [url=([^ \ [ \ ]]*) \ ] \ [img \ ](.*) \ [ \ /img \ ] \ [ \ /url \ ]&Usi " , 'bb_CleanPictureLinksSub' , $text );
return ( $text );
}
2014-02-11 22:42:06 +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
2014-01-02 21:29:44 +00:00
function bbcode ( $Text , $preserve_nl = false , $tryoembed = true , $simplehtml = false , $forplaintext = false ) {
2010-12-30 22:21:05 +00:00
2012-06-03 01:05:23 +00:00
$a = get_app ();
2016-02-22 22:20:59 +00:00
// Remove the abstract element. It is a non visible element.
$Text = remove_abstract ( $Text );
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 );
2014-02-02 08:54:33 +00:00
// Extract the private images which use data urls since preg has issues with
2012-07-07 22:20:24 +00:00
// 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 );
2014-08-25 12:08:26 +00:00
// Rearrange shares to attachments
$Text = preg_replace_callback ( " ((.*?) \ [class=(.*?) \ ](.*?) \ [ \ /class \ ])ism " , " bb_rearrange_share " , $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-02-15 19:14:45 +00:00
if ( get_config ( " system " , " remove_multiplicated_lines " )) {
2015-03-01 19:07:56 +00:00
$search = array ( " \n \n \n " , " \n " , " \n " , " [/quote] \n \n " , " \n [/quote] " , " [/li] \n " , " \n [li] " , " \n [ul] " , " [/ul] \n " , " \n \n [share " , " [/attachment] \n " ,
" \n [h1] " , " [/h1] \n " , " \n [h2] " , " [/h2] \n " , " \n [h3] " , " [/h3] \n " , " \n [h4] " , " [/h4] \n " , " \n [h5] " , " [/h5] \n " , " \n [h6] " , " [/h6] \n " );
$replace = array ( " \n \n " , " \n " , " \n " , " [/quote] \n " , " [/quote] " , " [/li] " , " [li] " , " [ul] " , " [/ul] " , " \n [share " , " [/attachment] " ,
" [h1] " , " [/h1] " , " [h2] " , " [/h2] " , " [h3] " , " [/h3] " , " [h4] " , " [/h4] " , " [h5] " , " [/h5] " , " [h6] " , " [/h6] " );
2013-02-15 19:14:45 +00:00
do {
$oldtext = $Text ;
$Text = str_replace ( $search , $replace , $Text );
} while ( $oldtext != $Text );
}
2012-12-28 10:31:30 +00:00
2014-11-02 17:39:23 +00:00
// Handle attached links or videos
2015-06-06 11:15:37 +00:00
$Text = bb_attachment ( $Text , $simplehtml , $tryoembed );
2014-11-02 17:39:23 +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
// 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
2014-05-18 16:56:07 +00:00
// Remove all hashtag addresses
2015-07-04 21:49:52 +00:00
if (( ! $tryoembed OR $simplehtml ) AND ! in_array ( $simplehtml , array ( 3 , 7 )))
2014-05-18 16:56:07 +00:00
$Text = preg_replace ( " /([#@]) \ [url \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /url \ ]/ism " , '$1$3' , $Text );
2015-07-04 21:49:52 +00:00
elseif ( $simplehtml == 3 )
$Text = preg_replace ( " /([@]) \ [url \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /url \ ]/ism " ,
'$1<a href="$2">$3</a>' ,
$Text );
2015-05-30 22:26:11 +00:00
elseif ( $simplehtml == 7 )
$Text = preg_replace ( " /([@]) \ [url \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /url \ ]/ism " ,
'$1<span class="vcard"><a href="$2" class="url" title="$3"><span class="fn nickname mention">$3</span></a></span>' ,
$Text );
2014-05-18 16:56:07 +00:00
2014-02-22 14:42:34 +00:00
// Bookmarks in red - will be converted to bookmarks in friendica
$Text = preg_replace ( " /# \ ^ \ [url \ ]([ $URLSearchString ]*) \ [ \ /url \ ]/ism " , '[bookmark=$1]$1[/bookmark]' , $Text );
$Text = preg_replace ( " /# \ ^ \ [url \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /url \ ]/ism " , '[bookmark=$1]$2[/bookmark]' , $Text );
2014-05-18 16:56:07 +00:00
$Text = preg_replace ( " /# \ [url \ =[ $URLSearchString ]* \ ] \ ^ \ [ \ /url \ ] \ [url \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /url \ ]/i " ,
" [bookmark= $ 1] $ 2[/bookmark] " , $Text );
2014-07-24 20:51:28 +00:00
if ( in_array ( $simplehtml , array ( 2 , 6 , 7 , 8 , 9 ))) {
2014-06-14 23:57:31 +00:00
$Text = preg_replace_callback ( " /([^#@]) \ [url \ =([^ \ ]]*) \ ](.*?) \ [ \ /url \ ]/ism " , " bb_expand_links " , $Text );
//$Text = preg_replace("/[^#@]\[url\=([^\]]*)\](.*?)\[\/url\]/ism",' $2 [url]$1[/url]',$Text);
2014-05-18 16:56:07 +00:00
$Text = preg_replace ( " / \ [bookmark \ =([^ \ ]]*) \ ](.*?) \ [ \ /bookmark \ ]/ism " , ' $2 [url]$1[/url]' , $Text );
}
2014-02-22 14:42:34 +00:00
2014-02-02 08:54:33 +00:00
if ( $simplehtml == 5 )
$Text = preg_replace ( " /[^#@] \ [url \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /url \ ]/ism " , '[url]$1[/url]' , $Text );
2011-01-22 13:19:53 +00:00
2011-10-24 12:30:11 +00:00
// Perform URL Search
2014-02-02 08:54:33 +00:00
if ( $tryoembed )
2014-07-27 14:10:09 +00:00
$Text = preg_replace_callback ( " / \ [bookmark \ =([^ \ ]]*) \ ](.*?) \ [ \ /bookmark \ ]/ism " , 'tryoembed' , $Text );
2014-02-02 08:54:33 +00:00
if ( $simplehtml == 5 )
$Text = preg_replace ( " / \ [bookmark \ =([^ \ ]]*) \ ](.*?) \ [ \ /bookmark \ ]/ism " , '[url]$1[/url]' , $Text );
else
$Text = preg_replace ( " / \ [bookmark \ =([^ \ ]]*) \ ](.*?) \ [ \ /bookmark \ ]/ism " , '[url=$1]$2[/url]' , $Text );
2015-02-02 19:26:05 +00:00
// Handle Diaspora posts
$Text = preg_replace_callback ( " & \ [url=/posts/([^ \ [ \ ]]*) \ ](.*) \ [ \ /url \ ]&Usi " , 'bb_DiasporaLinks' , $Text );
2014-01-02 21:29:44 +00:00
// if the HTML is used to generate plain text, then don't do this search, but replace all URL of that kind to text
2015-12-04 04:57:33 +00:00
// if ($simplehtml != 7) {
2015-11-28 06:37:02 +00:00
if ( ! $forplaintext )
$Text = preg_replace ( " /([^ \ ] \ =' " . '"' . " ]|^)(https? \ : \ / \ /[a-zA-Z0-9 \ : \ / \ - \ ? \ & \ ; \ . \ = \ _ \ ~ \ # \ % \$ \ ! \ + \ ,]+)/ism " , '$1<a href="$2" target="_blank">$2</a>' , $Text );
else {
$Text = preg_replace ( " ( \ [url \ ]([ $URLSearchString ]*) \ [ \ /url \ ])ism " , " $ 1 " , $Text );
$Text = preg_replace_callback ( " & \ [url=([^ \ [ \ ]]*) \ ] \ [img \ ](.*) \ [ \ /img \ ] \ [ \ /url \ ]&Usi " , 'bb_RemovePictureLinks' , $Text );
}
2015-12-04 04:57:33 +00:00
// }
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 );
2014-02-11 22:42:06 +00:00
$Text = preg_replace ( " / \ [url \ ]([ $URLSearchString ]*) \ [ \ /url \ ]/ism " , '<a href="$1" target="_blank">$1</a>' , $Text );
$Text = preg_replace ( " / \ [url \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /url \ ]/ism " , '<a href="$1" target="_blank">$2</a>' , $Text );
2011-09-20 11:07:24 +00:00
//$Text = preg_replace("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" target="_blank">$2</a>', $Text);
2010-08-20 03:52:49 +00:00
2013-04-25 09:36:52 +00:00
// Red compatibility, though the link can't be authenticated on Friendica
2014-02-11 22:42:06 +00:00
$Text = preg_replace ( " / \ [zrl \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /zrl \ ]/ism " , '<a href="$1" target="_blank">$2</a>' , $Text );
2013-04-25 09:36:52 +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
2015-05-30 22:26:11 +00:00
$Text = preg_replace ( '/acct:(.*?)@(.*?)([ ,])/' , '<a href="' . $a -> get_baseurl () . '/acctlink?addr=' . " $ 1@ $ 2 "
2012-06-03 01:05:23 +00:00
. '" 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 );
2015-05-30 22:26:11 +00:00
2015-05-15 18:41:10 +00:00
// leave open the posibility of [map=something]
// this is replaced in prepare_body() which has knowledge of the item location
2012-02-19 19:36:59 +00:00
2015-05-15 18:41:10 +00:00
if ( strpos ( $Text , '[/map]' ) !== false ) {
$Text = preg_replace_callback ( " / \ [map \ ](.*?) \ [ \ /map \ ]/ism " , 'bb_map_location' , $Text );
}
if ( strpos ( $Text , '[map=' ) !== false ) {
$Text = preg_replace_callback ( " / \ [map=(.*?) \ ]/ism " , 'bb_map_coords' , $Text );
}
if ( strpos ( $Text , '[map]' ) !== false ) {
$Text = preg_replace ( " / \ [map \ ]/ " , '<div class="map"></div>' , $Text );
2015-05-30 22:26:11 +00:00
}
2015-03-01 19:07:56 +00:00
// Check for headers
$Text = preg_replace ( " ( \ [h1 \ ](.*?) \ [ \ /h1 \ ])ism " , '<h1>$1</h1>' , $Text );
$Text = preg_replace ( " ( \ [h2 \ ](.*?) \ [ \ /h2 \ ])ism " , '<h2>$1</h2>' , $Text );
$Text = preg_replace ( " ( \ [h3 \ ](.*?) \ [ \ /h3 \ ])ism " , '<h3>$1</h3>' , $Text );
$Text = preg_replace ( " ( \ [h4 \ ](.*?) \ [ \ /h4 \ ])ism " , '<h4>$1</h4>' , $Text );
$Text = preg_replace ( " ( \ [h5 \ ](.*?) \ [ \ /h5 \ ])ism " , '<h5>$1</h5>' , $Text );
$Text = preg_replace ( " ( \ [h6 \ ](.*?) \ [ \ /h6 \ ])ism " , '<h6>$1</h6>' , $Text );
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
2014-06-14 23:57:31 +00:00
// [size=50] --> font-size: 50px (with the unit).
2014-06-10 18:20:51 +00:00
$Text = preg_replace ( " ( \ [size=( \ d*?) \ ](.*?) \ [ \ /size \ ])ism " , " <span style= \" font-size: $ 1px; line-height: initial; \" > $ 2</span> " , $Text );
$Text = preg_replace ( " ( \ [size=(.*?) \ ](.*?) \ [ \ /size \ ])ism " , " <span style= \" font-size: $ 1; line-height: initial; \" > $ 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
2014-06-14 23:57:31 +00:00
// handle nested lists
2012-02-19 20:07:45 +00:00
$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 )) ||
2015-05-30 22:26:11 +00:00
(( strpos ( $Text , " [/ol] " ) !== false ) && ( strpos ( $Text , " [ol] " ) !== false )) ||
(( strpos ( $Text , " [/ul] " ) !== false ) && ( strpos ( $Text , " [ul] " ) !== false )) ||
2012-07-05 18:52:20 +00:00
(( 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 " ,
2014-06-14 23:57:31 +00:00
" <br /><strong class= " . '"spoiler"' . " > " . $t_wrote . " </strong><blockquote class= " . '"spoiler"' . " > $ 2</blockquote> " ,
$Text );
2012-03-17 11:15:59 +00:00
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 " ,
2014-06-14 23:57:31 +00:00
" <br /><strong class= " . '"author"' . " > " . $t_wrote . " </strong><blockquote> $ 2</blockquote> " ,
$Text );
2012-02-13 00:18:58 +00:00
2015-10-05 20:19:34 +00:00
2011-09-18 07:16:18 +00:00
// [img=widthxheight]image source[/img]
2015-10-05 20:19:34 +00:00
$Text = preg_replace_callback ( " / \ [img \ =([0-9]*)x([0-9]*) \ ](.*?) \ [ \ /img \ ]/ism " , 'bb_PictureCacheExt' , $Text );
2012-03-31 14:28:39 +00:00
$Text = preg_replace ( " / \ [img \ =([0-9]*)x([0-9]*) \ ](.*?) \ [ \ /img \ ]/ism " , '<img src="$3" style="width: $1px;" >' , $Text );
2013-05-28 11:52:22 +00:00
$Text = preg_replace ( " / \ [zmg \ =([0-9]*)x([0-9]*) \ ](.*?) \ [ \ /zmg \ ]/ism " , '<img class="zrl" 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]
2015-10-05 20:19:34 +00:00
$Text = preg_replace_callback ( " / \ [img \ ](.*?) \ [ \ /img \ ]/ism " , 'bb_PictureCache' , $Text );
2011-09-03 11:36:45 +00:00
$Text = preg_replace ( " / \ [img \ ](.*?) \ [ \ /img \ ]/ism " , '<img src="$1" alt="' . t ( 'Image/photo' ) . '" />' , $Text );
2013-05-28 11:52:22 +00:00
$Text = preg_replace ( " / \ [zmg \ ](.*?) \ [ \ /zmg \ ]/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
2014-06-14 23:57:31 +00:00
$Text = preg_replace_callback ( " /(.*?) \ [share(.*?) \ ](.*?) \ [ \ /share \ ]/ism " ,
function ( $match ) use ( $simplehtml ){
return ( bb_ShareAttributes ( $match , $simplehtml ));
}, $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 );
2013-08-20 09:47:11 +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 );
//$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 {
2013-11-02 09:46:25 +00:00
$Text = preg_replace ( " / \ [video \ ](.*?) \ [ \ /video \ ]/ " ,
2014-02-11 22:42:06 +00:00
'<a href="$1" target="_blank">$1</a>' , $Text );
2013-11-02 09:46:25 +00:00
$Text = preg_replace ( " / \ [audio \ ](.*?) \ [ \ /audio \ ]/ " ,
2014-02-11 22:42:06 +00:00
'<a href="$1" target="_blank">$1</a>' , $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 ) {
2013-09-04 05:39:03 +00:00
$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 );
2012-06-17 23:29:08 +00:00
}
2013-09-04 05:39:03 +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 )
2013-09-04 05:39:03 +00:00
$Text = preg_replace ( " / \ [youtube \ ]([A-Za-z0-9 \ -_=]+)(.*?) \ [ \ /youtube \ ]/ism " , '<iframe width="' . $a -> videowidth . '" height="' . $a -> videoheight . '" src="https://www.youtube.com/embed/$1" frameborder="0" ></iframe>' , $Text );
2012-07-05 21:36:00 +00:00
else
2013-11-02 09:46:25 +00:00
$Text = preg_replace ( " / \ [youtube \ ]([A-Za-z0-9 \ -_=]+)(.*?) \ [ \ /youtube \ ]/ism " ,
2014-02-11 22:42:06 +00:00
'<a href="https://www.youtube.com/watch?v=$1" target="_blank">https://www.youtube.com/watch?v=$1</a>' , $Text );
2010-08-20 03:52:49 +00:00
2012-06-17 23:29:08 +00:00
if ( $tryoembed ) {
2015-03-07 20:08:22 +00:00
$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 );
2012-06-17 23:29:08 +00:00
}
2011-10-24 12:39:39 +00:00
2015-05-30 22:26:11 +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 )
2013-10-02 20:17:56 +00:00
$Text = preg_replace ( " / \ [vimeo \ ]([0-9]+)(.*?) \ [ \ /vimeo \ ]/ism " , '<iframe width="' . $a -> videowidth . '" height="' . $a -> videoheight . '" src="https://player.vimeo.com/video/$1" frameborder="0" ></iframe>' , $Text );
2012-07-05 21:36:00 +00:00
else
2013-11-02 09:46:25 +00:00
$Text = preg_replace ( " / \ [vimeo \ ]([0-9]+)(.*?) \ [ \ /vimeo \ ]/ism " ,
2014-02-11 22:42:06 +00:00
'<a href="https://vimeo.com/$1" target="_blank">https://vimeo.com/$1</a>' , $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-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.
2015-08-04 09:42:00 +00:00
// Summary (e.g. title) is required, earlier revisions only required description (in addition to
2012-06-26 04:27:34 +00:00
// 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' )) {
2015-10-17 07:41:58 +00:00
$sub = format_event_html ( $ev , $simplehtml );
2011-06-10 03:02:48 +00:00
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 );
2015-06-02 14:16:40 +00:00
$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
}
2015-08-04 09:42:00 +00:00
//replace oneliner <code> with <key>
$Text = preg_replace_callback ( " |(?!<br[^>]*>)<code>([^<]*)</code>(?!<br[^>]*>)|ism " , 'bb_onelinecode_cb' , $Text );
2015-06-02 14:16:40 +00:00
// Unhide all [noparse] contained bbtags unspacefying them
2012-02-12 22:35:29 +00:00
// 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
2013-03-02 23:46:54 +00:00
$Text = preg_replace ( " / \ <([^>]*?)(src|href)=(.*?) \ & \ ;(.*?) \ >/ism " , '<$1$2=$3&$4>' , $Text );
2015-08-06 06:13:15 +00:00
$Text = preg_replace ( " / \ <([^>]*?)(src|href)= \" (?!http|ftp|mailto|gopher|cid)(.*?) \ >/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
2014-08-07 05:58:20 +00:00
// Clean up the HTML by loading and saving the HTML with the DOM.
// Bad structured html can break a whole page.
// For performance reasons do it only with ativated item cache or at export.
if ( ! $tryoembed OR ( get_itemcachepath () != " " )) {
$doc = new DOMDocument ();
$doc -> preserveWhiteSpace = false ;
2012-07-05 21:36:00 +00:00
2014-08-07 19:55:17 +00:00
$Text = mb_convert_encoding ( $Text , 'HTML-ENTITIES' , " UTF-8 " );
2012-07-05 21:36:00 +00:00
2014-08-07 05:58:20 +00:00
$doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">' ;
$encoding = '<?xml encoding="UTF-8">' ;
@ $doc -> loadHTML ( $encoding . $doctype . " <html><body> " . $Text . " </body></html> " );
$doc -> encoding = 'UTF-8' ;
$Text = $doc -> saveHTML ();
$Text = str_replace ( array ( " <html><body> " , " </body></html> " , $doctype , $encoding ), array ( " " , " " , " " , " " ), $Text );
2012-07-05 21:36:00 +00:00
2014-08-07 05:58:20 +00:00
$Text = str_replace ( '<br></li>' , '</li>' , $Text );
2012-07-05 21:36:00 +00:00
2014-08-07 05:58:20 +00:00
//$Text = mb_convert_encoding($Text, "UTF-8", 'HTML-ENTITIES');
}
2012-07-05 21:36:00 +00:00
2013-08-24 12:54:07 +00:00
// Clean up some useless linebreaks in lists
//$Text = str_replace('<br /><ul','<ul ', $Text);
//$Text = str_replace('</ul><br />','</ul>', $Text);
//$Text = str_replace('</li><br />','</li>', $Text);
//$Text = str_replace('<br /><li>','<li>', $Text);
// $Text = str_replace('<br /><ul','<ul ', $Text);
2010-12-30 22:21:05 +00:00
call_hooks ( 'bbcode' , $Text );
2015-01-02 00:43:31 +00:00
return trim ( $Text );
2010-08-20 03:52:49 +00:00
}
2016-02-22 22:20:59 +00:00
/**
* @ brief Removes the " abstract " element from the text
*
* @ param string $text The text with BBCode
* @ return string The same text - but without " abstract " element
*/
function remove_abstract ( $text ) {
$text = preg_replace ( " /[ \ s| \n ]* \ [abstract \ ].*? \ [ \ /abstract \ ][ \ s| \n ]*/ism " , '' , $text );
$text = preg_replace ( " /[ \ s| \n ]* \ [abstract=.*? \ ].*? \ [ \ /abstract][ \ s| \n ]*/ism " , '' , $text );
return $text ;
}
/**
* @ brief Returns the value of the " abstract " element
*
* @ param string $text The text that maybe contains the element
* @ param string $addon The addon for which the abstract is meant for
* @ return string The abstract
*/
function fetch_abstract ( $text , $addon = " " ) {
$abstract = " " ;
$abstracts = array ();
$addon = strtolower ( $addon );
if ( preg_match_all ( " / \ [abstract=(.*?) \ ](.*?) \ [ \ /abstract \ ]/ism " , $text , $results , PREG_SET_ORDER ))
foreach ( $results AS $result )
$abstracts [ strtolower ( $result [ 1 ])] = $result [ 2 ];
if ( isset ( $abstracts [ $addon ]))
$abstract = $abstracts [ $addon ];
if ( $abstract == " " )
if ( preg_match ( " / \ [abstract \ ](.*?) \ [ \ /abstract \ ]/ism " , $text , $result ))
$abstract = $result [ 1 ];
return $abstract ;
}
2014-05-03 10:04:54 +00:00
?>