X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fbbcode.php;h=cff26f5c8ebf2864744db9fbc2c4f6866668f588;hb=b4361e37e062221c1dd2ae660cf7dc9be725ecc4;hp=40f4935fba21aecba992fa4d6c7277a2ea75dd1a;hpb=ae3c9b7b2b6f6b8bf7a5d5e72bd66f1bff3b081d;p=friendica.git diff --git a/include/bbcode.php b/include/bbcode.php index 40f4935fba..cff26f5c8e 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -3,11 +3,86 @@ require_once("include/oembed.php"); require_once('include/event.php'); + + +function stripcode_br_cb($s) { + return '[code]' . str_replace('
', '', $s[1]) . '[/code]'; +} + +function tryoembed($match){ + $url = ((count($match)==2)?$match[1]:$match[2]); +// logger("tryoembed: $url"); + + $o = oembed_fetch_url($url); + + //echo "
"; var_dump($match, $url, $o); killme();
+
+	if ($o->type=="error") return $match[0];
+
+	$html = oembed_format_object($o);
+	return $html; //oembed_iframe($html,$o->width,$o->height);
+
+}
+
+// [noparse][i]italic[/i][/noparse] turns into
+// [noparse][ i ]italic[ /i ][/noparse],
+// 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;
+}
+
+// The previously spacefied [noparse][ i ]italic[ /i ][/noparse],
+// now turns back and the [noparse] tags are trimed
+// returning [i]italic[/i]
+
+function bb_unspacefy_and_trim($st) {
+  $whole_match = $st[0];
+  $captured = $st[1];
+  $unspacefied = preg_replace("/\[ (.*?)\ ]/", "[$1]", $captured);
+  return $unspacefied;
+}
+
 	// BBcode 2 HTML was written by WAY2WEB.net
-	// extended to work with Mistpark/Friendika - Mike Macgirvin
+	// extended to work with Mistpark/Friendica - Mike Macgirvin
 
 function bbcode($Text,$preserve_nl = false) {
 
+	// Hide all [noparse] contained bbtags spacefying them
+
+	$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);
+
+
+	// Extract a single private image which uses data url's since preg has issues with
+	// large data sizes. Stash it away while we do bbcode conversion, and then put it back
+	// in after we've done all the regex matching. We cannot use any preg functions to do this.
+
+	$saved_image = '';
+	$img_start = strpos($Text,'[img]data:');
+	$img_end = strpos($Text,'[/img]');
+
+	if($img_start !== false && $img_end !== false && $img_end > $img_start) {
+		$start_fragment = substr($Text,0,$img_start);
+		$img_start += strlen('[img]');
+		$saved_image = substr($Text,$img_start,$img_end - $img_start);
+		$end_fragment = substr($Text,$img_end + strlen('[/img]'));
+//		logger('saved_image: ' . $saved_image,LOGGER_DEBUG);
+		$Text = $start_fragment . '[$#saved_image#$]' . $end_fragment;
+	}
+
+	// If we find any event code, turn it into an event.
+	// After we're finished processing the bbcode we'll
+	// replace all of the event code with a reformatted version.
+
+	$ev = bbtoevent($Text);
+
+
 	// 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
 
@@ -20,100 +95,163 @@ function bbcode($Text,$preserve_nl = false) {
 	if($preserve_nl)
 		$Text = str_replace(array("\n","\r"), array('',''),$Text);
 
-	// If we find any event code, turn it into an event.
-	// After we're finished processing the bbcode we'll 
-	// replace all of the event code with a reformatted version.
-
-	$ev = bbtoevent($Text);
 
 	// Set up the parameters for a URL search string
 	$URLSearchString = "^\[\]";
 	// Set up the parameters for a MAIL search string
 	$MAILSearchString = $URLSearchString;
 
+
 	// Perform URL Search
 
+	$Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1$2', $Text);
 
-	$Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'\%\$\!\+\,]+)/", ' $2', $Text);
+	$Text = preg_replace_callback("/\[bookmark\=([^\]]*)\].*?\[\/bookmark\]/ism",'tryoembed',$Text);
+	$Text = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",'[url=$1]$2[/url]',$Text);
 
-	$Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/", '$1', $Text);
-	$Text = preg_replace("(\[url\=([$URLSearchString]*)\](.*?)\[/url\])", '$2', $Text);
-	//$Text = preg_replace("(\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[/url\])", '$2', $Text);
+	$Text = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism",'tryoembed',$Text);
+	$Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/ism", '$1', $Text);
+	$Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '$2', $Text);
+	//$Text = preg_replace("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", '$2', $Text);
 
 
 	// Perform MAIL Search
-	$Text = preg_replace("(\[mail\]([$MAILSearchString]*)\[/mail\])", '$1', $Text);
+	$Text = preg_replace("/\[mail\]([$MAILSearchString]*)\[\/mail\]/", '$1', $Text);
 	$Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '$2', $Text);
-         
+
 	// Check for bold text
-	$Text = preg_replace("(\[b\](.*?)\[\/b\])is",'$1',$Text);
+	$Text = preg_replace("(\[b\](.*?)\[\/b\])ism",'$1',$Text);
 
 	// Check for Italics text
-	$Text = preg_replace("(\[i\](.*?)\[\/i\])is",'$1',$Text);
+	$Text = preg_replace("(\[i\](.*?)\[\/i\])ism",'$1',$Text);
 
 	// Check for Underline text
-	$Text = preg_replace("(\[u\](.*?)\[\/u\])is",'$1',$Text);
+	$Text = preg_replace("(\[u\](.*?)\[\/u\])ism",'$1',$Text);
 
 	// Check for strike-through text
-	$Text = preg_replace("(\[s\](.*?)\[\/s\])is",'$1',$Text);
+	$Text = preg_replace("(\[s\](.*?)\[\/s\])ism",'$1',$Text);
 
 	// Check for over-line text
-	$Text = preg_replace("(\[o\](.*?)\[\/o\])is",'$1',$Text);
+	$Text = preg_replace("(\[o\](.*?)\[\/o\])ism",'$1',$Text);
 
 	// Check for colored text
-	$Text = preg_replace("(\[color=(.*?)\](.*?)\[\/color\])is","$2",$Text);
+	$Text = preg_replace("(\[color=(.*?)\](.*?)\[\/color\])ism","$2",$Text);
 
 	// Check for sized text
-	$Text = preg_replace("(\[size=(.*?)\](.*?)\[\/size\])is","$2",$Text);
+        // [size=50] --> font-size: 50px (with the unit).
+	$Text = preg_replace("(\[size=(\d*?)\](.*?)\[\/size\])ism","$2",$Text);
+	$Text = preg_replace("(\[size=(.*?)\](.*?)\[\/size\])ism","$2",$Text);
+
+	// Check for centered text
+	$Text = preg_replace("(\[center\](.*?)\[\/center\])ism","
$1
",$Text); // Check for list text - $Text = preg_replace("/\[list\](.*?)\[\/list\]/is", '' ,$Text); - $Text = preg_replace("/\[list=1\](.*?)\[\/list\]/is", '' ,$Text); - $Text = preg_replace("/\[list=i\](.*?)\[\/list\]/s",'' ,$Text); - $Text = preg_replace("/\[list=I\](.*?)\[\/list\]/s", '' ,$Text); - $Text = preg_replace("/\[list=a\](.*?)\[\/list\]/s", '' ,$Text); - $Text = preg_replace("/\[list=A\](.*?)\[\/list\]/s", '' ,$Text); $Text = str_replace("[*]", "
  • ", $Text); + $Text = preg_replace("/\[li\](.*?)\[\/li\]/ism", '
  • $1
  • ' ,$Text); + + // handle nested lists + $endlessloop = 0; + while ((strpos($Text, "[/list]") !== false) and (strpos($Text, "[list") !== false) and (++$endlessloop < 20)) { + $Text = preg_replace("/\[list\](.*?)\[\/list\]/ism", '' ,$Text); + $Text = preg_replace("/\[list=\](.*?)\[\/list\]/ism", '' ,$Text); + $Text = preg_replace("/\[list=1\](.*?)\[\/list\]/ism", '' ,$Text); + $Text = preg_replace("/\[list=((?-i)i)\](.*?)\[\/list\]/ism",'' ,$Text); + $Text = preg_replace("/\[list=((?-i)I)\](.*?)\[\/list\]/ism", '' ,$Text); + $Text = preg_replace("/\[list=((?-i)a)\](.*?)\[\/list\]/ism", '' ,$Text); + $Text = preg_replace("/\[list=((?-i)A)\](.*?)\[\/list\]/ism", '' ,$Text); + } + + $Text = preg_replace("/\[ul\](.*?)\[\/ul\]/ism", '' ,$Text); + $Text = preg_replace("/\[ol\](.*?)\[\/ol\]/ism", '' ,$Text); + + $Text = preg_replace("/\[th\](.*?)\[\/th\]/sm", '$1' ,$Text); + $Text = preg_replace("/\[td\](.*?)\[\/td\]/sm", '$1' ,$Text); + $Text = preg_replace("/\[tr\](.*?)\[\/tr\]/sm", '$1' ,$Text); + $Text = preg_replace("/\[table\](.*?)\[\/table\]/sm", '$1
    ' ,$Text); + + $Text = preg_replace("/\[table border=1\](.*?)\[\/table\]/sm", '$1
    ' ,$Text); + $Text = preg_replace("/\[table border=0\](.*?)\[\/table\]/sm", '$1
    ' ,$Text); + + $Text = str_replace('[hr]','
    ', $Text); + + // This is actually executed in prepare_body() + + $Text = str_replace('[nosmile]','',$Text); // Check for font change text - $Text = preg_replace("(\[font=(.*?)\](.*?)\[\/font\])","$2",$Text); + $Text = preg_replace("/\[font=(.*?)\](.*?)\[\/font\]/sm","$2",$Text); // Declare the format for [code] layout + + $Text = preg_replace_callback("/\[code\](.*?)\[\/code\]/ism",'stripcode_br_cb',$Text); + $CodeLayout = '$1'; // Check for [code] text - $Text = preg_replace("/\[code\](.*?)\[\/code\]/is","$CodeLayout", $Text); + $Text = preg_replace("/\[code\](.*?)\[\/code\]/ism","$CodeLayout", $Text); + // Declare the format for [quote] layout - $QuoteLayout = '
    $1
    '; + $QuoteLayout = '
    $1
    '; // Check for [quote] text - $Text = preg_replace("/\[quote\](.*?)\[\/quote\]/is","$QuoteLayout", $Text); - + // handle nested quotes + $endlessloop = 0; + while ((strpos($Text, "[/quote]") !== false) and (strpos($Text, "[quote]") !== false) and (++$endlessloop < 20)) + $Text = preg_replace("/\[quote\](.*?)\[\/quote\]/ism","$QuoteLayout", $Text); + + // Check for [quote=Author] text + + $t_wrote = t('$1 wrote:'); + + // handle nested quotes + $endlessloop = 0; + while ((strpos($Text, "[/quote]")!== false) and (strpos($Text, "[quote=") !== false) and (++$endlessloop < 20)) + $Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism", + "
    " . $t_wrote . " $2
    ", + $Text); + + // [img=widthxheight]image source[/img] + $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '', $Text); + // Images // [img]pathtoimage[/img] - $Text = preg_replace("/\[img\](.*?)\[\/img\]/", '' . t('Image/photo') . '', $Text); + $Text = preg_replace("/\[img\](.*?)\[\/img\]/ism", '' . t('Image/photo') . '', $Text); + + + + // Try to Oembed + $Text = preg_replace_callback("/\[video\](.*?)\[\/video\]/ism", 'tryoembed', $Text); + $Text = preg_replace_callback("/\[audio\](.*?)\[\/audio\]/ism", 'tryoembed', $Text); + // html5 video and audio - $Text = preg_replace("/\[video\](.*?)\[\/video\]/", '', $Text); + $Text = preg_replace("/\[video\](.*?)\[\/video\]/ism", '', $Text); - $Text = preg_replace("/\[audio\](.*?)\[\/audio\]/", '', $Text); + $Text = preg_replace("/\[audio\](.*?)\[\/audio\]/ism", '', $Text); - $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/", '', $Text); + $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '', $Text); - // [img=widthxheight]image source[/img] - $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/", '', $Text); - - if (get_pconfig(local_user(), 'oembed', 'use_for_youtube' )==1){ - // use oembed for youtube links - $Text = preg_replace("/\[youtube\]/",'[embed]',$Text); - $Text = preg_replace("/\[\/youtube\]/",'[/embed]',$Text); - } else { - // Youtube extensions - $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/",'[youtube]$1[/youtube]',$Text); - $Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/",'[youtube]$1[/youtube]',$Text); - $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '', $Text); - } -// $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '', $Text); + // Youtube extensions + $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); + + $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); + $Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text); + + + $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", '', $Text); + + + $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); + + $Text = preg_replace("/\[vimeo\]https?:\/\/player.vimeo.com\/video\/([0-9]+)(.*?)\[\/vimeo\]/ism",'[vimeo]$1[/vimeo]',$Text); + $Text = preg_replace("/\[vimeo\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/vimeo\]/ism",'[vimeo]$1[/vimeo]',$Text); + $Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", '', $Text); + +// $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '', $Text); // oembed tag @@ -124,16 +262,27 @@ function bbcode($Text,$preserve_nl = false) { if(x($ev,'desc') && x($ev,'start')) { $sub = format_event_html($ev); - $Text = preg_replace("/\[event\-description\](.*?)\[\/event\-description\]/is",$sub,$Text); - $Text = preg_replace("/\[event\-start\](.*?)\[\/event\-start\]/is",'',$Text); - $Text = preg_replace("/\[event\-finish\](.*?)\[\/event\-finish\]/is",'',$Text); - $Text = preg_replace("/\[event\-location\](.*?)\[\/event\-location\]/is",'',$Text); - $Text = preg_replace("/\[event\-adjust\](.*?)\[\/event\-adjust\]/is",'',$Text); + $Text = preg_replace("/\[event\-description\](.*?)\[\/event\-description\]/ism",$sub,$Text); + $Text = preg_replace("/\[event\-start\](.*?)\[\/event\-start\]/ism",'',$Text); + $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); } + // 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); + + // fix any escaped ampersands that may have been converted into links + $Text = preg_replace("/\<(.*?)(src|href)=(.*?)\&\;(.*?)\>/ism",'<$1$2=$3&$4>',$Text); + if(strlen($saved_image)) + $Text = str_replace('[$#saved_image#$]','' . t('Image/photo') . '',$Text); - call_hooks('bbcode',$Text); return $Text; } +