From cb77b1af8cb96c1bbce299da15674a0e1d94fbe4 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 4 Aug 2019 03:45:23 +0000 Subject: [PATCH 1/2] API: We now transmit the text description there as well --- include/api.php | 25 +++++++++++++++++------- src/Model/Photo.php | 45 ++++++++++++++++++++++++++++++++++++++++++++ src/Module/Photo.php | 15 +++------------ 3 files changed, 66 insertions(+), 19 deletions(-) diff --git a/include/api.php b/include/api.php index 2c9ae9b387..d8cd6d2e21 100644 --- a/include/api.php +++ b/include/api.php @@ -2693,19 +2693,29 @@ function api_get_entitities(&$text, $bbcode) } } - preg_match_all("/\[img](.*?)\[\/img\]/ism", $bbcode, $images); + preg_match_all("/\[img\=(.*?)\](.*?)\[\/img\]/ism", $bbcode, $images, PREG_SET_ORDER); $ordered_images = []; - foreach ($images[1] as $image) { - //$start = strpos($text, $url, $offset); - $start = iconv_strpos($text, $image, 0, "UTF-8"); + foreach ($images as $image) { + $start = iconv_strpos($text, Photo::getGUID($image[1]), 0, "UTF-8"); if (!($start === false)) { - $ordered_images[$start] = $image; + $ordered_images[$start] = ['url' => $image[1], 'alt' => $image[2]]; + } + } + + preg_match_all("/\[img](.*?)\[\/img\]/ism", $bbcode, $images); + foreach ($images[1] as $image) { + $start = iconv_strpos($text, Photo::getGUID($image), 0, "UTF-8"); + if (!($start === false)) { + $ordered_images[$start] = ['url' => $image, 'alt' => '']; } } //$entities["media"] = array(); $offset = 0; - foreach ($ordered_images as $url) { + foreach ($ordered_images as $image) { + $url = $image['url']; + $ext_alt_text = $image['alt']; + $display_url = str_replace(["http://www.", "https://www."], ["", ""], $url); $display_url = str_replace(["http://", "https://"], ["", ""], $display_url); @@ -2713,7 +2723,7 @@ function api_get_entitities(&$text, $bbcode) $display_url = substr($display_url, 0, 25)."…"; } - $start = iconv_strpos($text, $url, $offset, "UTF-8"); + $start = iconv_strpos($text, Photo::getGUID($url), $offset, "UTF-8"); if (!($start === false)) { $image = Image::getInfoFromURL($url); if ($image) { @@ -2752,6 +2762,7 @@ function api_get_entitities(&$text, $bbcode) "url" => $url, "display_url" => $display_url, "expanded_url" => $url, + "ext_alt_text" => $ext_alt_text, "type" => "photo", "sizes" => $sizes]; } diff --git a/src/Model/Photo.php b/src/Model/Photo.php index f2a77b01fc..c983fdc058 100644 --- a/src/Model/Photo.php +++ b/src/Model/Photo.php @@ -21,6 +21,7 @@ use Friendica\Protocol\DFRN; use Friendica\Util\DateTimeFormat; use Friendica\Util\Network; use Friendica\Util\Security; +use Friendica\Util\Strings; require_once "include/dba.php"; @@ -664,4 +665,48 @@ class Photo extends BaseObject return true; } + + /** + * Strips known picture extensions from picture links + * + * @param string $name Picture link + * @return string stripped picture link + * @throws \Exception + */ + public static function stripExtension($name) + { + $name = str_replace([".jpg", ".png", ".gif"], ["", "", ""], $name); + foreach (Image::supportedTypes() as $m => $e) { + $name = str_replace("." . $e, "", $name); + } + return $name; + } + + /** + * Returns the GUID from picture links + * + * @param string $name Picture link + * @return string GUID + * @throws \Exception + */ + public static function getGUID($name) + { + $a = \get_app(); + $base = $a->getBaseURL(); + + $guid = str_replace([Strings::normaliseLink($base), '/photo/'], '', Strings::normaliseLink($name)); + + $guid = self::stripExtension($guid); + if (substr($guid, -2, 1) != "-") { + return ''; + } + + $scale = intval(substr($guid, -1, 1)); + if (empty($scale)) { + return ''; + } + + $guid = substr($guid, 0, -2); + return $guid; + } } diff --git a/src/Module/Photo.php b/src/Module/Photo.php index bcfe13f537..4ec4f204c3 100644 --- a/src/Module/Photo.php +++ b/src/Module/Photo.php @@ -53,15 +53,15 @@ class Photo extends BaseModule switch($a->argc) { case 4: $customsize = intval($a->argv[2]); - $uid = self::stripExtension($a->argv[3]); + $uid = MPhoto::stripExtension($a->argv[3]); $photo = self::getAvatar($uid, $a->argv[1]); break; case 3: - $uid = self::stripExtension($a->argv[2]); + $uid = MPhoto::stripExtension($a->argv[2]); $photo = self::getAvatar($uid, $a->argv[1]); break; case 2: - $photoid = self::stripExtension($a->argv[1]); + $photoid = MPhoto::stripExtension($a->argv[1]); $scale = 0; if (substr($photoid, -2, 1) == "-") { $scale = intval(substr($photoid, -1, 1)); @@ -117,15 +117,6 @@ class Photo extends BaseModule exit(); } - private static function stripExtension($name) - { - $name = str_replace([".jpg", ".png", ".gif"], ["", "", ""], $name); - foreach (Image::supportedTypes() as $m => $e) { - $name = str_replace("." . $e, "", $name); - } - return $name; - } - private static function getAvatar($uid, $type="avatar") { From 1b7f96dac8d53ab86e9366ce60b09d7c1b004161 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 4 Aug 2019 04:29:52 +0000 Subject: [PATCH 2/2] Partly reverted, real problem fixed --- include/api.php | 6 +++--- mod/photos.php | 2 +- src/Content/Text/BBCode.php | 15 ++++++++++++--- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/include/api.php b/include/api.php index d8cd6d2e21..543c018279 100644 --- a/include/api.php +++ b/include/api.php @@ -2696,7 +2696,7 @@ function api_get_entitities(&$text, $bbcode) preg_match_all("/\[img\=(.*?)\](.*?)\[\/img\]/ism", $bbcode, $images, PREG_SET_ORDER); $ordered_images = []; foreach ($images as $image) { - $start = iconv_strpos($text, Photo::getGUID($image[1]), 0, "UTF-8"); + $start = iconv_strpos($text, $image[1], 0, "UTF-8"); if (!($start === false)) { $ordered_images[$start] = ['url' => $image[1], 'alt' => $image[2]]; } @@ -2704,7 +2704,7 @@ function api_get_entitities(&$text, $bbcode) preg_match_all("/\[img](.*?)\[\/img\]/ism", $bbcode, $images); foreach ($images[1] as $image) { - $start = iconv_strpos($text, Photo::getGUID($image), 0, "UTF-8"); + $start = iconv_strpos($text, $image, 0, "UTF-8"); if (!($start === false)) { $ordered_images[$start] = ['url' => $image, 'alt' => '']; } @@ -2723,7 +2723,7 @@ function api_get_entitities(&$text, $bbcode) $display_url = substr($display_url, 0, 25)."…"; } - $start = iconv_strpos($text, Photo::getGUID($url), $offset, "UTF-8"); + $start = iconv_strpos($text, $url, $offset, "UTF-8"); if (!($start === false)) { $image = Image::getInfoFromURL($url); if ($image) { diff --git a/mod/photos.php b/mod/photos.php index fa4d5b2814..fb43619b6e 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -1567,7 +1567,7 @@ function photos_content(App $a) $a->page['htmlhead'] .= "\n" . '' . "\n"; $a->page['htmlhead'] .= '' . "\n"; - $a->page['htmlhead'] .= '' . "\n"; + $a->page['htmlhead'] .= '' . "\n"; $a->page['htmlhead'] .= '' . "\n"; $a->page['htmlhead'] .= '' . "\n"; diff --git a/src/Content/Text/BBCode.php b/src/Content/Text/BBCode.php index e2a4fa603c..b2d4ebb5d7 100644 --- a/src/Content/Text/BBCode.php +++ b/src/Content/Text/BBCode.php @@ -1102,7 +1102,11 @@ class BBCode extends BaseObject if (substr($curl_info["content_type"], 0, 6) == "image/") { $text = "[img]" . $match[1] . "[/img]"; } else { - $text = "[img]" . $match[2] . "[/img]"; + if (!empty($match[3])) { + $text = "[img=" . $match[2] . "]" . $match[3] . "[/img]"; + } else { + $text = "[img]" . $match[2] . "[/img]"; + } // if its not a picture then look if its a page that contains a picture link $body = Network::fetchUrl($match[1]); @@ -1120,7 +1124,11 @@ class BBCode extends BaseObject } if (strtolower($attr["name"]) == "twitter:image") { - $text = "[img]" . $attr["content"] . "[/img]"; + if (!empty($match[3])) { + $text = "[img=" . $attr["content"] . "]" . $match[3] . "[/img]"; + } else { + $text = "[img]" . $attr["content"] . "[/img]"; + } } } } @@ -1132,7 +1140,8 @@ class BBCode extends BaseObject public static function cleanPictureLinks($text) { - $return = preg_replace_callback("&\[url=([^\[\]]*)\]\[img\](.*)\[\/img\]\[\/url\]&Usi", 'self::cleanPictureLinksCallback', $text); + $return = preg_replace_callback("&\[url=([^\[\]]*)\]\[img=(.*)\](.*)\[\/img\]\[\/url\]&Usi", 'self::cleanPictureLinksCallback', $text); + $return = preg_replace_callback("&\[url=([^\[\]]*)\]\[img\](.*)\[\/img\]\[\/url\]&Usi", 'self::cleanPictureLinksCallback', $return); return $return; }