]> git.mxchange.org Git - friendica.git/blobdiff - src/Content/Text/BBCode.php
Exclude [attachment] from tag search
[friendica.git] / src / Content / Text / BBCode.php
index 9a13e3f0975ba3399715715b9b36bd5dba6d8e13..2070d22d131d534b43f3040e6b6683f50f8d3ea1 100644 (file)
@@ -68,6 +68,12 @@ class BBCode
 
        const TOP_ANCHOR = '<br class="top-anchor">';
        const BOTTOM_ANCHOR = '<br class="button-anchor">';
+
+       const PREVIEW_NONE     = 0;
+       const PREVIEW_NO_IMAGE = 1;
+       const PREVIEW_LARGE    = 2;
+       const PREVIEW_SMALL    = 3;
+
        /**
         * Fetches attachment data that were generated the old way
         *
@@ -267,8 +273,8 @@ class BBCode
                // Get all linked images with alternative image description
                if (preg_match_all("/\[img=(http[^\[\]]*)\]([^\[\]]*)\[\/img\]/Usi", $body, $pictures, PREG_SET_ORDER)) {
                        foreach ($pictures as $picture) {
-                               if (Photo::isLocal($picture[1])) {
-                                       $post['images'][] = ['url' => str_replace('-1.', '-0.', $picture[1]), 'description' => $picture[2]];
+                               if ($id = Photo::getIdForName($picture[1])) {
+                                       $post['images'][] = ['url' => str_replace('-1.', '-0.', $picture[1]), 'description' => $picture[2], 'id' => $id];
                                } else {
                                        $post['remote_images'][] = ['url' => $picture[1], 'description' => $picture[2]];
                                }
@@ -280,8 +286,8 @@ class BBCode
 
                if (preg_match_all("/\[img\]([^\[\]]*)\[\/img\]/Usi", $body, $pictures, PREG_SET_ORDER)) {
                        foreach ($pictures as $picture) {
-                               if (Photo::isLocal($picture[1])) {
-                                       $post['images'][] = ['url' => str_replace('-1.', '-0.', $picture[1]), 'description' => ''];
+                               if ($id = Photo::getIdForName($picture[1])) {
+                                       $post['images'][] = ['url' => str_replace('-1.', '-0.', $picture[1]), 'description' => '', 'id' => $id];
                                } else {
                                        $post['remote_images'][] = ['url' => $picture[1], 'description' => ''];
                                }
@@ -654,7 +660,7 @@ class BBCode
         * @return string
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       public static function convertAttachment(string $text, int $simplehtml = self::INTERNAL, bool $tryoembed = true, array $data = [], int $uriid = 0): string
+       public static function convertAttachment(string $text, int $simplehtml = self::INTERNAL, bool $tryoembed = true, array $data = [], int $uriid = 0, int $preview_mode = self::PREVIEW_LARGE): string
        {
                DI::profiler()->startRecording('rendering');
                $data = $data ?: self::getAttachmentData($text);
@@ -689,12 +695,18 @@ class BBCode
                                $return = sprintf('<div class="type-%s">', $data['type']);
                        }
 
+                       if ($preview_mode == self::PREVIEW_NO_IMAGE) {
+                               unset($data['image']);
+                               unset($data['preview']);
+                       }
+
                        if (!empty($data['title']) && !empty($data['url'])) {
+                               $preview_class = $preview_mode == self::PREVIEW_LARGE ? 'attachment-image' : 'attachment-preview';
                                if (!empty($data['image']) && empty($data['text']) && ($data['type'] == 'photo')) {
-                                       $return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="attachment-image" /></a>', $data['url'], self::proxyUrl($data['image'], $simplehtml, $uriid), $data['title']);
+                                       $return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="' . $preview_class . '" /></a>', $data['url'], self::proxyUrl($data['image'], $simplehtml, $uriid), $data['title']);
                                } else {
                                        if (!empty($data['image'])) {
-                                               $return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="attachment-image" /></a><br>', $data['url'], self::proxyUrl($data['image'], $simplehtml, $uriid), $data['title']);
+                                               $return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="' . $preview_class . '" /></a><br>', $data['url'], self::proxyUrl($data['image'], $simplehtml, $uriid), $data['title']);
                                        } elseif (!empty($data['preview'])) {
                                                $return .= sprintf('<a href="%s" target="_blank" rel="noopener noreferrer"><img src="%s" alt="" title="%s" class="attachment-preview" /></a><br>', $data['url'], self::proxyUrl($data['preview'], $simplehtml, $uriid), $data['title']);
                                        }
@@ -1588,8 +1600,8 @@ class BBCode
                                $text = str_replace(">", "&gt;", $text);
 
                                // remove some newlines before the general conversion
-                               $text = preg_replace("/\s?\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", "[share$1]$2[/share]", $text);
-                               $text = preg_replace("/\s?\[quote(.*?)\]\s?(.*?)\s?\[\/quote\]\s?/ism", "[quote$1]$2[/quote]", $text);
+                               $text = preg_replace("/\s?\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", "\n[share$1]$2[/share]\n", $text);
+                               $text = preg_replace("/\s?\[quote(.*?)\]\s?(.*?)\s?\[\/quote\]\s?/ism", "\n[quote$1]$2[/quote]\n", $text);
 
                                // 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 (!$try_oembed) {
@@ -2090,7 +2102,7 @@ class BBCode
                                $text = preg_replace('/\<([^>]*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism', '<$1$2=$3&$4>', $text);
 
                                // sanitizes src attributes (http and redir URLs for displaying in a web page, cid used for inline images in emails)
-                               $allowed_src_protocols = ['//', 'http://', 'https://', 'redir/', 'cid:'];
+                               $allowed_src_protocols = ['//', 'http://', 'https://', 'contact/redir/', 'cid:'];
 
                                array_walk($allowed_src_protocols, function(&$value) { $value = preg_quote($value, '#');});
 
@@ -2105,7 +2117,7 @@ class BBCode
                                $allowed_link_protocols[] = '//';
                                $allowed_link_protocols[] = 'http://';
                                $allowed_link_protocols[] = 'https://';
-                               $allowed_link_protocols[] = 'redir/';
+                               $allowed_link_protocols[] = 'contact/redir/';
 
                                array_walk($allowed_link_protocols, function(&$value) { $value = preg_quote($value, '#');});
 
@@ -2343,7 +2355,7 @@ class BBCode
                DI::profiler()->startRecording('rendering');
                $ret = [];
 
-               self::performWithEscapedTags($string, ['noparse', 'pre', 'code', 'img'], function ($string) use (&$ret) {
+               self::performWithEscapedTags($string, ['noparse', 'pre', 'code', 'img', 'attachment'], function ($string) use (&$ret) {
                        // Convert hashtag links to hashtags
                        $string = preg_replace('/#\[url\=([^\[\]]*)\](.*?)\[\/url\]/ism', '#$2 ', $string);
 
@@ -2587,7 +2599,7 @@ class BBCode
                // Bypass attachment if parse url for a comment
                if (!$tryAttachment) {
                        DI::profiler()->stopRecording();
-                       return "\n" . '[url=' . $url . ']' . $siteinfo['title'] . '[/url]';
+                       return "\n" . '[url=' . $url . ']' . ($siteinfo['title'] ?? $url) . '[/url]';
                }
 
                // Format it as BBCode attachment