]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/ActivityPub/Transmitter.php
Fix: Mentions in the HTML part of the "contentMap" now are links
[friendica.git] / src / Protocol / ActivityPub / Transmitter.php
index 531b4c6621d0c9791e18c3f6c60ba1a6697c1560..545ac22c699b0a668cfe486c7d17f617dd01d123 100644 (file)
@@ -6,31 +6,32 @@ namespace Friendica\Protocol\ActivityPub;
 
 use Friendica\BaseObject;
 use Friendica\Content\Feature;
-use Friendica\Database\DBA;
+use Friendica\Content\Text\BBCode;
+use Friendica\Content\Text\Plaintext;
+use Friendica\Core\Cache;
 use Friendica\Core\Config;
 use Friendica\Core\Logger;
-use Friendica\Core\System;
-use Friendica\Protocol\Activity;
-use Friendica\Util\HTTPSignature;
 use Friendica\Core\Protocol;
-use Friendica\Model\Conversation;
-use Friendica\Model\Contact;
+use Friendica\Core\System;
+use Friendica\Database\DBA;
 use Friendica\Model\APContact;
+use Friendica\Model\Contact;
+use Friendica\Model\Conversation;
 use Friendica\Model\Item;
+use Friendica\Model\Profile;
+use Friendica\Model\Photo;
 use Friendica\Model\Term;
 use Friendica\Model\User;
+use Friendica\Protocol\Activity;
+use Friendica\Protocol\ActivityPub;
 use Friendica\Util\DateTimeFormat;
-use Friendica\Content\Text\BBCode;
-use Friendica\Content\Text\Plaintext;
-use Friendica\Util\XML;
+use Friendica\Util\HTTPSignature;
+use Friendica\Util\Images;
 use Friendica\Util\JsonLD;
 use Friendica\Util\LDSignature;
-use Friendica\Model\Profile;
-use Friendica\Object\Image;
-use Friendica\Protocol\ActivityPub;
-use Friendica\Core\Cache;
 use Friendica\Util\Map;
 use Friendica\Util\Network;
+use Friendica\Util\XML;
 
 require_once 'include/api.php';
 require_once 'mod/share.php';
@@ -1049,7 +1050,7 @@ class Transmitter
                // Grab all pictures without alternative descriptions and create attachments out of them
                if (preg_match_all("/\[img\]([^\[\]]*)\[\/img\]/Usi", $body, $pictures)) {
                        foreach ($pictures[1] as $picture) {
-                               $imgdata = Image::getInfoFromURL($picture);
+                               $imgdata = Images::getInfoFromURLCached($picture);
                                if ($imgdata) {
                                        $attachments[] = ['type' => 'Document',
                                                'mediaType' => $imgdata['mime'],
@@ -1062,7 +1063,7 @@ class Transmitter
                // Grab all pictures with alternative description and create attachments out of them
                if (preg_match_all("/\[img=([^\[\]]*)\]([^\[\]]*)\[\/img\]/Usi", $body, $pictures, PREG_SET_ORDER)) {
                        foreach ($pictures as $picture) {
-                               $imgdata = Image::getInfoFromURL($picture[1]);
+                               $imgdata = Images::getInfoFromURLCached($picture[1]);
                                if ($imgdata) {
                                        $attachments[] = ['type' => 'Document',
                                                'mediaType' => $imgdata['mime'],
@@ -1097,19 +1098,34 @@ class Transmitter
        }
 
        /**
-        * Remove image elements and replaces them with links to the image
+        * Remove image elements since they are added as attachment
         *
         * @param string $body
         *
-        * @return string with replaced elements
+        * @return string with removed images
         */
        private static function removePictures($body)
        {
                // Simplify image codes
                $body = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $body);
+               $body = preg_replace("/\[img\=(.*?)\](.*?)\[\/img\]/ism", '[img]$1[/img]', $body);
+
+               // Now remove local links
+               $body = preg_replace_callback(
+                       '/\[url=([^\[\]]*)\]\[img\](.*)\[\/img\]\[\/url\]/Usi',
+                       function ($match) {
+                               // We remove the link when it is a link to a local photo page
+                               if (Photo::isLocalPage($match[1])) {
+                                       return '';
+                               }
+                               // otherwise we just return the link
+                               return '[url]' . $match[1] . '[/url]';
+                       },
+                       $body
+               );
 
-               $body = preg_replace("/\[url=([^\[\]]*)\]\[img\](.*)\[\/img\]\[\/url\]/Usi", '[url]$1[/url]', $body);
-               $body = preg_replace("/\[img\]([^\[\]]*)\[\/img\]/Usi", '[url]$1[/url]', $body);
+               // Remove all pictures
+               $body = preg_replace("/\[img\]([^\[\]]*)\[\/img\]/Usi", '', $body);
 
                return $body;
        }
@@ -1254,6 +1270,12 @@ class Transmitter
                        $data['content'] = BBCode::convert($body, false, 9);
                }
 
+               $regexp = "/[@!]\[url\=([^\[\]]*)\].*?\[\/url\]/ism";
+               $richbody = preg_replace_callback($regexp, ['self', 'mentionCallback'], $item['body']);
+
+               $data['contentMap']['text/html'] = BBCode::convert($richbody, false);
+               $data['contentMap']['text/markdown'] = BBCode::toMarkdown($item["body"]);
+
                $data['source'] = ['content' => $item['body'], 'mediaType' => "text/bbcode"];
 
                if (!empty($item['signed_text']) && ($item['uri'] != $item['thr-parent'])) {