From: Michael Date: Mon, 11 Nov 2019 22:37:50 +0000 (+0000) Subject: Fix image links with descriptions in API and AP transmission X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=1b5fa55bdcc6d0d62bc5ee2a6182027b9d552318;p=friendica.git Fix image links with descriptions in API and AP transmission --- diff --git a/include/api.php b/include/api.php index d5eb9c5418..8325e39b71 100644 --- a/include/api.php +++ b/include/api.php @@ -2554,6 +2554,7 @@ function api_get_attachments(&$body) { $text = $body; $text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $text); + $text = preg_replace("/\[img\=(.*?)\](.*?)\[\/img\]/ism", '[img]$1[/img]', $text); $URLSearchString = "^\[\]"; $ret = preg_match_all("/\[img\]([$URLSearchString]*)\[\/img\]/ism", $text, $images); diff --git a/src/Model/Photo.php b/src/Model/Photo.php index 10e80a4fb5..bf0acf53eb 100644 --- a/src/Model/Photo.php +++ b/src/Model/Photo.php @@ -715,4 +715,25 @@ class Photo extends BaseObject return DBA::exists('photo', ['resource-id' => $guid]); } + + /** + * Tests if the link points to a locally stored picture page + * + * @param string $name Page link + * @return boolean + * @throws \Exception + */ + public static function isLocalLink($name) + { + $a = \get_app(); + $base = $a->getBaseURL(); + + $guid = str_replace(Strings::normaliseLink($base), '', Strings::normaliseLink($name)); + $guid = preg_replace("=/photos/.*/image/(.*)=ism", '$1', $guid); + if (empty($guid)) { + return false; + } + + return DBA::exists('photo', ['resource-id' => $guid]); + } } diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index c5f3bae470..3f962b8cf9 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -19,6 +19,7 @@ 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; @@ -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("/\[url=([^\[\]]*)\]\[img\](.*)\[\/img\]\[\/url\]/Usi", '[url]$1[/url]', $body); - $body = preg_replace("/\[img\]([^\[\]]*)\[\/img\]/Usi", '[url]$1[/url]', $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::isLocalLink($match[1])) { + return ''; + } + // otherwise we just return the link + return '[url]' . $match[1] . '[/url]'; + }, + $body + ); + + // Remove all pictures + $body = preg_replace("/\[img\]([^\[\]]*)\[\/img\]/Usi", '', $body); return $body; }