diff --git a/mod/item.php b/mod/item.php index a96d288193..999e7a25c6 100644 --- a/mod/item.php +++ b/mod/item.php @@ -730,6 +730,9 @@ function item_post(App $a) { } } + // If this was a share, add missing data here + $datarray = Item::addShareDataFromOriginal($datarray); + $post_id = Item::insert($datarray); if (!$post_id) { diff --git a/src/Content/Text/BBCode.php b/src/Content/Text/BBCode.php index 38719e046c..0291c729e8 100644 --- a/src/Content/Text/BBCode.php +++ b/src/Content/Text/BBCode.php @@ -1055,7 +1055,7 @@ class BBCode extends BaseObject $text = ($is_quote_share? '
' : '') . '

' . html_entity_decode('♲ ', ENT_QUOTES, 'UTF-8') . ' @' . $author_contact['addr'] . ': ' . $content . '

' . "\n"; break; case 9: // ActivityPub - $author = '@' . $author_contact['addr'] . ':'; + $author = '@' . $author_contact['addr'] . ':'; $text = '
' . html_entity_decode('♲', ENT_QUOTES, 'UTF-8') . ' ' . $author . '
' . $content . '
' . "\n"; break; default: diff --git a/src/Model/Item.php b/src/Model/Item.php index 0b6c1c8bf2..1faee3bdcc 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -3759,4 +3759,71 @@ class Item extends BaseObject return 0; } + + /** + * Return share data from an item array (if the item is shared item) + * We are providing the complete Item array, because at some time in the future + * we hopefully will define these values not in the body anymore but in some item fields. + * This function is meant to replace all similar functions in the system. + * + * @param array $item + * + * @return array with share information + */ + public static function getShareArray($item) + { + if (!preg_match("/(.*?)\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", $item['body'], $matches)) { + return []; + } + + $attribute_string = $matches[2]; + $attributes = ['comment' => trim($matches[1]), 'shared' => trim($matches[3])]; + foreach(['author', 'profile', 'avatar', 'guid', 'posted', 'link'] as $field) { + if (preg_match("/$field=(['\"])(.+?)\\1/ism", $attribute_string, $matches)) { + $attributes[$field] = trim(html_entity_decode($matches[2] ?? '', ENT_QUOTES, 'UTF-8')); + } + } + return $attributes; + } + + /** + * Fetch item information for shared items from the original items and adds it. + * + * @param array $item + * + * @return array item array with data from the original item + */ + public static function addShareDataFromOriginal($item) + { + $shared = self::getShareArray($item); + if (empty($shared)) { + return $item; + } + + // Real reshares always have got a GUID. + if (empty($shared['guid'])) { + return $item; + } + + $uid = $item['uid'] ?? 0; + + // first try to fetch the item via the GUID. This will work for all reshares that had been created on this system + $shared_item = self::selectFirst(['title', 'body', 'attach'], ['guid' => $shared['guid'], 'uid' => [0, $uid]]); + if (!DBA::isResult($shared_item)) { + // Otherwhise try to find (and possibly fetch) the item via the link. This should work for Diaspora and ActivityPub posts + $id = self::fetchByLink($shared['link'], $uid); + if (empty($id)) { + return $item; + } + + $shared_item = self::selectFirst(['title', 'body', 'attach'], ['id' => $id]); + if (!DBA::isResult($shared_item)) { + return $item; + } + } + $item['body'] = preg_replace("/(.*?\[share.*?\]\s?).*?(\s?\[\/share\]\s?)/ism", '$1' . $shared_item['body'] . '$2', $item['body']); + unset($shared_item['body']); + + return array_merge($item, $shared_item); + } }