]> git.mxchange.org Git - friendica.git/blobdiff - include/bbcode.php
Bugfix for pull request #2147 (Fix for issue #2122)
[friendica.git] / include / bbcode.php
index 6c5a400ddc307a069ac67a56a57f09c0fc668017..100c3b93061c9515f13df2c5a060cc31278b1512 100644 (file)
@@ -2,7 +2,23 @@
 require_once("include/oembed.php");
 require_once('include/event.php');
 require_once('include/map.php');
+require_once('mod/proxy.php');
 
+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]";
+}
 
 function bb_map_coords($match) {
        // the extra space in the following line is intentional
@@ -83,10 +99,19 @@ function bb_attachment($Text, $simplehtml = false, $tryoembed = true) {
                                $image = "";
                        }
 
-                       if ($simplehtml == 7)
-                               $text = sprintf('<a href="%s" title="%s" class="attachment thumbnail" rel="nofollow external">%s</a>',
-                                               $url, $title, $title);
-                       elseif (($simplehtml != 4) AND ($simplehtml != 0))
+                       if ($simplehtml == 7) {
+                               $title2 = $title;
+
+                               $test1 = trim(html_entity_decode($match[1],ENT_QUOTES,'UTF-8'));
+                               $test2 = trim(html_entity_decode($title,ENT_QUOTES,'UTF-8'));
+
+                               // If the link description is similar to the text above then don't add the link description
+                               if (($title != "") AND ((strpos($test1,$test2) !== false) OR
+                                       (similar_text($test1,$test2) / strlen($title)) > 0.9))
+                                       $title2 = $url;
+                               $text = sprintf('<a href="%s" title="%s" class="attachment thumbnail" rel="nofollow external">%s</a><br />',
+                                               $url, $title, $title2);
+                       } elseif (($simplehtml != 4) AND ($simplehtml != 0))
                                $text = sprintf('<a href="%s" target="_blank">%s</a><br>', $url, $title);
                        else {
                                $text = sprintf('<span class="type-%s">', $type);
@@ -101,9 +126,9 @@ function bb_attachment($Text, $simplehtml = false, $tryoembed = true) {
                                        $text = $oembed;
                                else {
                                        if (($image != "") AND !strstr(strtolower($oembed), "<img "))
-                                               $text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-image" /></a><br />', $url, $image, $title);
+                                               $text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-image" /></a><br />', $url, proxy_url($image), $title);
                                        elseif (($preview != "") AND !strstr(strtolower($oembed), "<img "))
-                                               $text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-preview" /></a><br />', $url, $preview, $title);
+                                               $text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-preview" /></a><br />', $url, proxy_url($preview), $title);
 
                                        $text .= $oembed;
 
@@ -268,6 +293,13 @@ function stripcode_br_cb($s) {
        return '[code]' . str_replace('<br />', '', $s[1]) . '[/code]';
 }
 
+function bb_onelinecode_cb($match) {
+       if (strpos($match[1],"<br>")===false){
+               return "<key>".$match[1]."</key>";
+       }
+       return "<code>".$match[1]."</code>";
+}
+
 function tryoembed($match){
        //$url = ((count($match)==2)?$match[1]:$match[2]);
        $url = $match[1];
@@ -448,7 +480,7 @@ function bb_replace_images($body, $images) {
                // 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);
+               $newbody = str_replace('[$#saved_image' . $cnt . '#$]', '<img src="' . proxy_url($image) .'" alt="' . t('Image/photo') . '" />', $newbody);
                $cnt++;
        }
 
@@ -578,7 +610,7 @@ function bb_ShareAttributes($share, $simplehtml) {
                default:
                        $headline = trim($share[1]).'<div class="shared_header">';
                        if ($avatar != "")
-                               $headline .= '<img src="'.$avatar.'" height="32" width="32" >';
+                               $headline .= '<img src="'.proxy_url($avatar, false, PROXY_SIZE_MICRO).'" height="32" width="32" >';
 
                        $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>";
@@ -887,8 +919,12 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true, $simplehtml = fal
        $MAILSearchString = $URLSearchString;
 
        // Remove all hashtag addresses
-       if ((!$tryoembed OR $simplehtml) AND ($simplehtml != 7))
+       if ((!$tryoembed OR $simplehtml) AND !in_array($simplehtml, array(3, 7)))
                $Text = preg_replace("/([#@])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '$1$3', $Text);
+       elseif ($simplehtml == 3)
+               $Text = preg_replace("/([@])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism",
+                       '$1<a href="$2">$3</a>',
+                       $Text);
        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>',
@@ -923,12 +959,14 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true, $simplehtml = fal
        $Text = preg_replace_callback("&\[url=/posts/([^\[\]]*)\](.*)\[\/url\]&Usi", 'bb_DiasporaLinks', $Text);
 
        // if the HTML is used to generate plain text, then don't do this search, but replace all URL of that kind to text
-       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);
-       }
+//     if ($simplehtml != 7) {
+               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);
+               }
+//     }
 
        if ($tryoembed)
                $Text = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism",'tryoembed',$Text);
@@ -1091,13 +1129,17 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true, $simplehtml = fal
                                     "<br /><strong class=".'"author"'.">" . $t_wrote . "</strong><blockquote>$2</blockquote>",
                                     $Text);
 
+
        // [img=widthxheight]image source[/img]
-       //$Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="height: $2px; width: $1px;" >', $Text);
+       $Text = preg_replace_callback("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", 'bb_PictureCacheExt', $Text);
+
        $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="width: $1px;" >', $Text);
        $Text = preg_replace("/\[zmg\=([0-9]*)x([0-9]*)\](.*?)\[\/zmg\]/ism", '<img class="zrl" src="$3" style="width: $1px;" >', $Text);
 
        // Images
        // [img]pathtoimage[/img]
+       $Text = preg_replace_callback("/\[img\](.*?)\[\/img\]/ism", 'bb_PictureCache', $Text);
+
        $Text = preg_replace("/\[img\](.*?)\[\/img\]/ism", '<img src="$1" alt="' . t('Image/photo') . '" />', $Text);
        $Text = preg_replace("/\[zmg\](.*?)\[\/zmg\]/ism", '<img src="$1" alt="' . t('Image/photo') . '" />', $Text);
 
@@ -1175,11 +1217,11 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true, $simplehtml = fal
 
        // If we found an event earlier, strip out all the event code and replace with a reformatted version.
        // 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 
+       // 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.
 
        if((x($ev,'desc') || x($ev,'summary')) && x($ev,'start')) {
-               $sub = format_event_html($ev);
+               $sub = format_event_html($ev, $simplehtml);
 
                $Text = preg_replace("/\[event\-summary\](.*?)\[\/event\-summary\]/ism",'',$Text);
                $Text = preg_replace("/\[event\-description\](.*?)\[\/event\-description\]/ism",'',$Text);
@@ -1189,6 +1231,10 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true, $simplehtml = fal
                $Text = preg_replace("/\[event\-adjust\](.*?)\[\/event\-adjust\]/ism",'',$Text);
        }
 
+
+       //replace oneliner <code> with <key>
+       $Text = preg_replace_callback("|(?!<br[^>]*>)<code>([^<]*)</code>(?!<br[^>]*>)|ism", 'bb_onelinecode_cb', $Text);
+
        // Unhide all [noparse] contained bbtags unspacefying them
        // and triming the [noparse] tag.
 
@@ -1203,7 +1249,7 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true, $simplehtml = fal
 
        // fix any escaped ampersands that may have been converted into links
        $Text = preg_replace("/\<([^>]*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism",'<$1$2=$3&$4>',$Text);
-       $Text = preg_replace("/\<([^>]*?)(src|href)=\"(?!http|ftp|mailto|cid)(.*?)\>/ism",'<$1$2="">',$Text);
+       $Text = preg_replace("/\<([^>]*?)(src|href)=\"(?!http|ftp|mailto|gopher|cid)(.*?)\>/ism",'<$1$2="">',$Text);
 
        if($saved_image)
                $Text = bb_replace_images($Text, $saved_image);