]> git.mxchange.org Git - friendica.git/commitdiff
BBcode, Tags - fix BBCode created tags in [code] blocks, fix usage of multiple #...
authorPeter Liebetrau <peter.liebetrau@gmail.com>
Tue, 29 Jan 2019 20:17:11 +0000 (21:17 +0100)
committerPeter Liebetrau <peter.liebetrau@gmail.com>
Tue, 29 Jan 2019 20:17:11 +0000 (21:17 +0100)
src/Content/Text/BBCode.php
src/Model/Item.php

index 2c2054750c5f0d06fb631b66d0ee65fe97ac034c..e0190c0c1d2005a8751c8b3526b114d7ca9ed7c5 100644 (file)
@@ -1178,7 +1178,7 @@ class BBCode extends BaseObject
                // Extracting multi-line code blocks before the whitespace processing
                $codeblocks = [];
 
-               $text = preg_replace_callback("#\[code(?:=([^\]]*))?\](.*?)\[\/code\]#is",
+               $text = preg_replace_callback("#\[code(?:=([^\]]*))?\](.*?)\[\/code\]#ism",
                        function ($matches) use (&$codeblocks) {
                                $return = $matches[0];
                                if (strpos($matches[2], "\n") !== false) {
index 67071db31817d315b25b7a10b00d8f9b23cf3387..192c9b141001147100c98c49dee58942546e20d4 100644 (file)
@@ -2400,6 +2400,17 @@ class Item extends BaseObject
 
                $URLSearchString = "^\[\]";
 
+               // What happens in [code], stays in [code]!
+               // escape the # and the [
+               // hint: we will also get in trouble with #tags, when we want markdown in posts -> ### Headline 3
+               $item["body"] = preg_replace_callback("/\[code(.*)\](.*?)\[\/code\]/ism",
+                       function ($match) {
+                               // we truly ESCape all # and [ to prevent gettin weird tags in [code] blocks
+                               $find = ['#', '['];
+                               $replace = [chr(27).'sharp', chr(27).'leftsquarebracket'];
+                               return ("[code" . str_replace($find, $replace, $match[1]) . "]" . $match[2] . "[/code]");
+                       }, $item["body"]);
+               
                // All hashtags should point to the home server if "local_tags" is activated
                if (Config::get('system', 'local_tags')) {
                        $item["body"] = preg_replace("/#\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism",
@@ -2435,21 +2446,35 @@ class Item extends BaseObject
                        }
 
                        $basetag = str_replace('_',' ',substr($tag,1));
+                       if($basetag[0] != '#') { 
+                               $newtag = '#[url=' . System::baseUrl() . '/search?tag=' . $basetag . ']' . $basetag . '[/url]';
 
-                       $newtag = '#[url=' . System::baseUrl() . '/search?tag=' . $basetag . ']' . $basetag . '[/url]';
-
-                       $item["body"] = str_replace($tag, $newtag, $item["body"]);
+                               $item["body"] = str_replace($tag, $newtag, $item["body"]);
 
-                       if (!stristr($item["tag"], "/search?tag=" . $basetag . "]" . $basetag . "[/url]")) {
-                               if (strlen($item["tag"])) {
-                                       $item["tag"] = ',' . $item["tag"];
+                               if (!stristr($item["tag"], "/search?tag=" . $basetag . "]" . $basetag . "[/url]")) {
+                                       if (strlen($item["tag"])) {
+                                               $item["tag"] = ',' . $item["tag"];
+                                       }
+                                       $item["tag"] = $newtag . $item["tag"];
                                }
-                               $item["tag"] = $newtag . $item["tag"];
                        }
                }
 
                // Convert back the masked hashtags
                $item["body"] = str_replace("&num;", "#", $item["body"]);
+
+               // Remember! What happens in [code], stays in [code]
+               // roleback the # and [
+               $item["body"] = preg_replace_callback("/\[code(.*)\](.*?)\[\/code\]/ism",
+                       function ($match) {
+                               // we truly unESCape all sharp and leftsquarebracket
+                               $find = [chr(27).'sharp', chr(27).'leftsquarebracket'];
+                               $replace = ['#', '['];
+                               return ("[code" . str_replace($find, $replace, $match[1]) . "]" . $match[2] . "[/code]");
+                       }, $item["body"]);
+
+               // Convert back the masked hashtags
+               $item["body"] = str_replace("&num;", "#", $item["body"]);
        }
 
        public static function getGuidById($id)