]> git.mxchange.org Git - friendica.git/commitdiff
Add data for shared posts from the original
authorMichael <heluecht@pirati.ca>
Wed, 4 Dec 2019 22:57:09 +0000 (22:57 +0000)
committerMichael <heluecht@pirati.ca>
Wed, 4 Dec 2019 22:57:09 +0000 (22:57 +0000)
mod/item.php
src/Content/Text/BBCode.php
src/Model/Item.php

index a96d28819365c1c02426d3febd65097fe078b194..999e7a25c67e58e00bdcf8c2be3bdaf741d62cd2 100644 (file)
@@ -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) {
index 38719e046cc5ec02a26646b30dcdf77a4a0bc4f3..0291c729e855f6ed52d314c3d35ad6550aca2572 100644 (file)
@@ -1055,7 +1055,7 @@ class BBCode extends BaseObject
                                $text = ($is_quote_share? '<br />' : '') . '<p>' . html_entity_decode('&#x2672; ', ENT_QUOTES, 'UTF-8') . ' @' . $author_contact['addr'] . ': ' . $content . '</p>' . "\n";
                                break;
                        case 9: // ActivityPub
-                               $author = '@<span class="vcard"><a href="' . $author_contact['url'] . '" class="url u-url mention" title="' . $author_contact['addr'] . '"><span class="fn nickname mention">' . $author_contact['addr'] . ':</span></a></span>';
+                               $author = '@<span class="vcard"><a href="' . $author_contact['url'] . '" class="url u-url mention" title="' . $author_contact['addr'] . '"><span class="fn nickname mention">' . $author_contact['addr'] . '</span></a>:</span>';
                                $text = '<div><a href="' . $attributes['link'] . '">' . html_entity_decode('&#x2672;', ENT_QUOTES, 'UTF-8') . '</a> ' . $author . '<blockquote>' . $content . '</blockquote></div>' . "\n";
                                break;
                        default:
index 0b6c1c8bf22620c4c972185ff1d26548ddd07015..1faee3bdcc1cdd915ea3c438000bce9e88c0418d 100644 (file)
@@ -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);
+       }
 }