]> git.mxchange.org Git - friendica.git/blobdiff - src/Content/Text/BBCode.php
Improve reshare format for Diaspora destinations
[friendica.git] / src / Content / Text / BBCode.php
index e304f47637eeaf1b0b2d9cb10a0734d35340685c..e49b14f47cbcaa7ab2324302574032a8770e0702 100644 (file)
@@ -11,9 +11,9 @@ use Exception;
 use Friendica\BaseObject;
 use Friendica\Content\OEmbed;
 use Friendica\Content\Smilies;
-use Friendica\Core\Addon;
 use Friendica\Core\Cache;
 use Friendica\Core\Config;
+use Friendica\Core\Hook;
 use Friendica\Core\L10n;
 use Friendica\Core\Logger;
 use Friendica\Core\Protocol;
@@ -37,13 +37,14 @@ class BBCode extends BaseObject
         *
         * @param string $body Message body
         * @return array
-        * 'type' -> Message type ("link", "video", "photo")
-        * 'text' -> Text before the shared message
-        * 'after' -> Text after the shared message
-        * 'image' -> Preview image of the message
-        * 'url' -> Url to the attached message
-        * 'title' -> Title of the attachment
-        * 'description' -> Description of the attachment
+        *                     'type' -> Message type ("link", "video", "photo")
+        *                     'text' -> Text before the shared message
+        *                     'after' -> Text after the shared message
+        *                     'image' -> Preview image of the message
+        *                     'url' -> Url to the attached message
+        *                     'title' -> Title of the attachment
+        *                     'description' -> Description of the attachment
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        private static function getOldAttachmentData($body)
        {
@@ -66,6 +67,7 @@ class BBCode extends BaseObject
                                        $post["after"] = trim(substr($body, $pos + strlen($data[0])));
                                } else {
                                        $post["text"] = trim(str_replace($data[0], "", $body));
+                                       $post["after"] = '';
                                }
 
                                $attacheddata = $data[2];
@@ -108,13 +110,14 @@ class BBCode extends BaseObject
         *
         * @param string $body Message body
         * @return array
-        * 'type' -> Message type ("link", "video", "photo")
-        * 'text' -> Text before the shared message
-        * 'after' -> Text after the shared message
-        * 'image' -> Preview image of the message
-        * 'url' -> Url to the attached message
-        * 'title' -> Title of the attachment
-        * 'description' -> Description of the attachment
+        *                     'type' -> Message type ("link", "video", "photo")
+        *                     'text' -> Text before the shared message
+        *                     'after' -> Text after the shared message
+        *                     'image' -> Preview image of the message
+        *                     'url' -> Url to the attached message
+        *                     'title' -> Title of the attachment
+        *                     'description' -> Description of the attachment
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        public static function getAttachmentData($body)
        {
@@ -345,6 +348,7 @@ class BBCode extends BaseObject
        /**
         * @brief Converts a BBCode text into plaintext
         *
+        * @param      $text
         * @param bool $keep_urls Whether to keep URLs in the resulting plaintext
         *
         * @return string
@@ -446,6 +450,7 @@ class BBCode extends BaseObject
         * @brief Truncates imported message body string length to max_import_size
         * @param string $body
         * @return string
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        public static function limitBodySize($body)
        {
@@ -532,10 +537,11 @@ class BBCode extends BaseObject
         * Note: Can produce a [bookmark] tag in the returned string
         *
         * @brief Processes [attachment] tags
-        * @param string $return
+        * @param string   $return
         * @param bool|int $simplehtml
-        * @param bool $tryoembed
+        * @param bool     $tryoembed
         * @return string
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        private static function convertAttachment($return, $simplehtml = false, $tryoembed = true)
        {
@@ -626,7 +632,7 @@ class BBCode extends BaseObject
                        $data["title"] = $data["url"];
                }
 
-               if (($data["text"] == "") && ($data["title"] != "") && ($data["url"] == "")) {
+               if (empty($data["text"]) && !empty($data["title"]) && empty($data["url"])) {
                        return $data["title"] . $data["after"];
                }
 
@@ -777,10 +783,10 @@ class BBCode extends BaseObject
        /**
         * Performs a preg_replace within the boundaries of all named BBCode tags in a text
         *
-        * @param type $pattern Preg pattern string
-        * @param type $replace Preg replace string
-        * @param type $name    BBCode tag name
-        * @param type $text    Text to search
+        * @param string $pattern Preg pattern string
+        * @param string $replace Preg replace string
+        * @param string $name    BBCode tag name
+        * @param string $text    Text to search
         * @return string
         */
        public static function pregReplaceInTag($pattern, $replace, $name, $text)
@@ -930,6 +936,7 @@ class BBCode extends BaseObject
         * @param boolean $is_quote_share Whether there is content before the [share] block
         * @param integer $simplehtml     Mysterious integer value depending on the target network/formatting style
         * @return string
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        private static function convertShareCallback(array $attributes, array $author_contact, $content, $is_quote_share, $simplehtml)
        {
@@ -943,15 +950,19 @@ class BBCode extends BaseObject
                                $text = ($is_quote_share? '<br />' : '') . '<p>' . html_entity_decode('&#x2672; ', ENT_QUOTES, 'UTF-8') . ' ' . $author_contact['addr'] . ': </p>' . "\n" . $content;
                                break;
                        case 3: // Diaspora
-                               $headline = '<p><b>' . html_entity_decode('&#x2672; ', ENT_QUOTES, 'UTF-8') . $mention . ':</b></p>' . "\n";
-
                                if (stripos(Strings::normaliseLink($attributes['link']), 'http://twitter.com/') === 0) {
                                        $text = ($is_quote_share? '<hr />' : '') . '<p><a href="' . $attributes['link'] . '">' . $attributes['link'] . '</a></p>' . "\n";
                                } else {
+                                       $headline = '<p><b>♲ <a href="' . $attributes['profile'] . '">' . $attributes['author'] . '</a>:</b></p>' . "\n";
+
+                                       if (!empty($attributes['posted']) && !empty($attributes['link'])) {
+                                               $headline = '<p><b>♲ <a href="' . $attributes['profile'] . '">' . $attributes['author'] . '</a></b> - <a href="' . $attributes['link'] . '">' . $attributes['posted'] . ' GMT</a></p>' . "\n";
+                                       }
+
                                        $text = ($is_quote_share? '<hr />' : '') . $headline . '<blockquote>' . trim($content) . '</blockquote>' . "\n";
 
-                                       if ($attributes['link'] != '') {
-                                               $text .= '<p><a href="' . $attributes['link'] . '">[l]</a></p>' . "\n";
+                                       if (empty($attributes['posted']) && !empty($attributes['link'])) {
+                                               $text .= '<p><a href="' . $attributes['link'] . '">[Source]</a></p>' . "\n";
                                        }
                                }
 
@@ -1021,7 +1032,7 @@ class BBCode extends BaseObject
                        @curl_exec($ch);
                        $curl_info = @curl_getinfo($ch);
 
-                       $a->saveTimestamp($stamp1, "network");
+                       $a->getProfiler()->saveTimestamp($stamp1, "network", System::callstack());
 
                        if (substr($curl_info["content_type"], 0, 6) == "image/") {
                                $text = "[url=" . $match[1] . "]" . $match[1] . "[/url]";
@@ -1080,7 +1091,7 @@ class BBCode extends BaseObject
                        @curl_exec($ch);
                        $curl_info = @curl_getinfo($ch);
 
-                       $a->saveTimestamp($stamp1, "network");
+                       $a->getProfiler()->saveTimestamp($stamp1, "network", System::callstack());
 
                        // if its a link to a picture then embed this picture
                        if (substr($curl_info["content_type"], 0, 6) == "image/") {
@@ -1142,8 +1153,9 @@ class BBCode extends BaseObject
         * @param int    $simple_html
         * @param bool   $for_plaintext
         * @return string
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function convert($text, $try_oembed = true, $simple_html = false, $for_plaintext = false)
+       public static function convert($text, $try_oembed = true, $simple_html = 0, $for_plaintext = false)
        {
                $a = self::getApp();
 
@@ -1171,7 +1183,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) {
@@ -1286,7 +1298,7 @@ class BBCode extends BaseObject
                                $text);
                } elseif ($simple_html == 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>',
+                               '$1<span class="vcard"><a href="$2" class="url u-url mention" title="$3"><span class="fn nickname mention">$3</span></a></span>',
                                $text);
                } elseif (!$simple_html) {
                        $text = preg_replace("/([@!])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism",
@@ -1354,6 +1366,12 @@ class BBCode extends BaseObject
                                . '</a>';
                }, $text);
 
+               // We need no target="_blank" for local links
+               // convert links start with System::baseUrl() as local link without the target="_blank" attribute
+               $escapedBaseUrl = preg_quote(System::baseUrl(), '/');
+               $text = preg_replace("/\[url\](".$escapedBaseUrl."[$URLSearchString]*)\[\/url\]/ism", '<a href="$1">$1</a>', $text);
+               $text = preg_replace("/\[url\=(".$escapedBaseUrl."[$URLSearchString]*)\](.*?)\[\/url\]/ism", '<a href="$1">$2</a>', $text);             
+
                $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);
 
@@ -1676,7 +1694,7 @@ class BBCode extends BaseObject
 
                // Replace non graphical smilies for external posts
                if ($simple_html) {
-                       $text = Smilies::replace($text, false, true);
+                       $text = Smilies::replace($text);
                }
 
                // Unhide all [noparse] contained bbtags unspacefying them
@@ -1730,7 +1748,7 @@ class BBCode extends BaseObject
 
                // 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.
+               // For performance reasons do it only with activated item cache or at export.
                if (!$try_oembed || (get_itemcachepath() != "")) {
                        $doc = new DOMDocument();
                        $doc->preserveWhiteSpace = false;
@@ -1756,7 +1774,7 @@ class BBCode extends BaseObject
                //$Text = str_replace('<br /><li>', '<li>', $Text);
                //$Text = str_replace('<br /><ul', '<ul ', $Text);
 
-               Addon::callHooks('bbcode', $text);
+               Hook::callAll('bbcode', $text);
 
                return trim($text);
        }
@@ -1809,7 +1827,12 @@ class BBCode extends BaseObject
         * @brief Callback function to replace a Friendica style mention in a mention for Diaspora
         *
         * @param array $match Matching values for the callback
+        *                     [1] = Mention type (! or @)
+        *                     [2] = Name
+        *                     [3] = Address
         * @return string Replaced mention
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
         */
        private static function bbCodeMention2DiasporaCallback($match)
        {
@@ -1823,7 +1846,7 @@ class BBCode extends BaseObject
                        return $match[0];
                }
 
-               $mention = '@{' . $match[2] . '; ' . $contact['addr'] . '}';
+               $mention = $match[1] . '{' . $match[2] . '; ' . $contact['addr'] . '}';
                return $mention;
        }
 
@@ -1836,6 +1859,7 @@ class BBCode extends BaseObject
         * @param string $text
         * @param bool   $for_diaspora Diaspora requires more changes than Libertree
         * @return string
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        public static function toMarkdown($text, $for_diaspora = true)
        {
@@ -1896,7 +1920,7 @@ class BBCode extends BaseObject
                // unmask the special chars back to HTML
                $text = str_replace(['&\_lt\_;', '&\_gt\_;', '&\_amp\_;'], ['&lt;', '&gt;', '&amp;'], $text);
 
-               $a->saveTimestamp($stamp1, "parser");
+               $a->getProfiler()->saveTimestamp($stamp1, "parser", System::callstack());
 
                // Libertree has a problem with escaped hashtags.
                $text = str_replace(['\#'], ['#'], $text);
@@ -1908,13 +1932,13 @@ class BBCode extends BaseObject
                if ($for_diaspora) {
                        $url_search_string = "^\[\]";
                        $text = preg_replace_callback(
-                               "/([@]\[(.*?)\])\(([$url_search_string]*?)\)/ism",
+                               "/([@!])\[(.*?)\]\(([$url_search_string]*?)\)/ism",
                                ['self', 'bbCodeMention2DiasporaCallback'],
                                $text
                        );
                }
 
-               Addon::callHooks('bb2diaspora', $text);
+               Hook::callAll('bb2diaspora', $text);
 
                return $text;
        }
@@ -1940,7 +1964,7 @@ class BBCode extends BaseObject
         $string = preg_replace('/#\[url\=([^\[\]]*)\](.*?)\[\/url\]/ism', '#$2', $string);
 
         // ignore anything in a code block
-        $string = preg_replace('/\[code\](.*?)\[\/code\]/sm', '', $string);
+        $string = preg_replace('/\[code.*?\].*?\[\/code\]/sm', '', $string);
 
         // Force line feeds at bbtags
         $string = str_replace(['[', ']'], ["\n[", "]\n"], $string);