$datarray['author-uri-id'] = ItemURI::getIdByURI($datarray['author-link']);
$datarray['owner-updated'] = '';
$datarray['has-media'] = false;
- $datarray['body'] = Item::improveSharedDataInBody($datarray);
+ $datarray['body'] = DI::contentItem()->improveSharedDataInBody($datarray);
$o = DI::conversation()->create([array_merge($contact_record, $datarray)], 'search', false, true);
}
$datarray['uri-id'] = ItemURI::getIdByURI($datarray['uri']);
- $datarray['body'] = Item::improveSharedDataInBody($datarray);
+ $datarray['body'] = DI::contentItem()->improveSharedDataInBody($datarray);
if ($orig_post) {
$fields = [
$shared_content .= '[h3]' . $item['title'] . "[/h3]\n";
}
- $shared = $this->getSharedPost($item, ['uri-id', 'uri', 'body', 'title', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink', 'network']);
+ $shared = $this->getShareArray($item);
// If it is a reshared post then reformat it to avoid display problems with two share elements
if (!empty($shared)) {
- if (($encaspulated_share = $this->createSharedBlockByArray($shared['post'], $add_media))) {
+ if (!empty($shared['guid']) && ($encaspulated_share = $this->createSharedPostByGuid($shared['guid'], 0, '', $add_media))) {
$item['body'] = preg_replace("/\[share.*?\](.*)\[\/share\]/ism", $encaspulated_share, $item['body']);
}
return [];
}
+
+ /**
+ * Improve the data in shared posts
+ *
+ * @param array $item
+ * @param bool $add_media
+ * @return string body
+ */
+ public function improveSharedDataInBody(array $item, bool $add_media = false): string
+ {
+ $shared = BBCode::fetchShareAttributes($item['body']);
+ if (empty($shared['guid']) && empty($shared['message_id'])) {
+ return $item['body'];
+ }
+
+ $link = $shared['link'] ?: $shared['message_id'];
+
+ if (empty($shared_content)) {
+ $shared_content = $this->createSharedPostByUrl($link, $item['uid'] ?? 0, $add_media);
+ }
+
+ if (empty($shared_content)) {
+ return $item['body'];
+ }
+
+ $item['body'] = preg_replace("/\[share.*?\](.*)\[\/share\]/ism", $shared_content, $item['body']);
+
+ Logger::debug('New shared data', ['uri-id' => $item['uri-id'], 'link' => $link, 'guid' => $item['guid']]);
+ return $item['body'];
+ }
+
+ /**
+ * 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
+ */
+ private function getShareArray(array $item): array
+ {
+ $attributes = BBCode::fetchShareAttributes($item['body'] ?? '');
+ if (!empty($attributes)) {
+ return $attributes;
+ }
+
+ if (!empty($item['quote-uri-id'])) {
+ $shared = Post::selectFirst(['author-name', 'author-link', 'author-avatar', 'plink', 'created', 'guid', 'uri', 'body'], ['uri-id' => $item['quote-uri-id']]);
+ if (!empty($shared)) {
+ return [
+ 'author' => $shared['author-name'],
+ 'profile' => $shared['author-link'],
+ 'avatar' => $shared['author-avatar'],
+ 'link' => $shared['plink'],
+ 'posted' => $shared['created'],
+ 'guid' => $shared['guid'],
+ 'message_id' => $shared['uri'],
+ 'comment' => $item['body'],
+ 'shared' => $shared['body'],
+ ];
+ }
+ }
+
+ return [];
+ }
}
}
}
- Tag::store($term['uri-id'], $term['type'], $term['term'], $term['url'], false);
+ Tag::store($term['uri-id'], $term['type'], $term['term'], $term['url']);
$id = $term['tid'];
++$rows;
use Friendica\BaseFactory;
use Friendica\Content\ContactSelector;
+use Friendica\Content\Item as ContentItem;
use Friendica\Database\Database;
use Friendica\Database\DBA;
-use Friendica\DI;
use Friendica\Model\Item;
use Friendica\Model\Post;
use Friendica\Model\Tag as TagModel;
private $mstdnErrorFactory;
/** @var Poll */
private $mstdnPollFactory;
+ /** @var ContentItem */
+ private $contentItem;
public function __construct(LoggerInterface $logger, Database $dba,
Account $mstdnAccountFactory, Mention $mstdnMentionFactory,
Tag $mstdnTagFactory, Card $mstdnCardFactory,
- Attachment $mstdnAttachementFactory, Error $mstdnErrorFactory, Poll $mstdnPollFactory)
+ Attachment $mstdnAttachementFactory, Error $mstdnErrorFactory,
+ Poll $mstdnPollFactory, ContentItem $contentItem)
{
parent::__construct($logger);
$this->dba = $dba;
$this->mstdnAttachementFactory = $mstdnAttachementFactory;
$this->mstdnErrorFactory = $mstdnErrorFactory;
$this->mstdnPollFactory = $mstdnPollFactory;
+ $this->contentItem = $contentItem;
}
/**
$poll = null;
}
- $shared = DI::contentItem()->getSharedPost($item, ['uri-id']);
+ $shared = $this->contentItem->getSharedPost($item, ['uri-id']);
if (!empty($shared)) {
$shared_uri_id = $shared['post']['uri-id'];
namespace Friendica\Factory\Api\Twitter;
use Friendica\BaseFactory;
+use Friendica\Content\Item as ContentItem;
use Friendica\Content\Text\BBCode;
use Friendica\Content\Text\HTML;
use Friendica\Database\Database;
-use Friendica\DI;
use Friendica\Factory\Api\Friendica\Activities;
use Friendica\Factory\Api\Twitter\User as TwitterUser;
use Friendica\Model\Item;
private $activities;
/** @var Activities entity */
private $attachment;
+ /** @var ContentItem */
+ private $contentItem;
- public function __construct(LoggerInterface $logger, Database $dba, TwitterUser $twitteruser, Hashtag $hashtag, Media $media, Url $url, Mention $mention, Activities $activities, Attachment $attachment)
+ public function __construct(LoggerInterface $logger, Database $dba, TwitterUser $twitteruser, Hashtag $hashtag, Media $media, Url $url, Mention $mention, Activities $activities, Attachment $attachment, ContentItem $contentItem)
{
parent::__construct($logger);
$this->dba = $dba;
$this->mention = $mention;
$this->activities = $activities;
$this->attachment = $attachment;
+ $this->contentItem = $contentItem;
}
/**
$friendica_activities = $this->activities->createFromUriId($item['uri-id'], $uid);
- $shared = DI::contentItem()->getSharedPost($item, ['uri-id']);
+ $shared = $this->contentItem->getSharedPost($item, ['uri-id']);
if (!empty($shared)) {
$shared_uri_id = $shared['post']['uri-id'];
return true;
}
- /**
- * Improve the data in shared posts
- *
- * @param array $item
- * @param bool $add_media
- * @return string body
- */
- public static function improveSharedDataInBody(array $item, bool $add_media = false): string
- {
- $shared = BBCode::fetchShareAttributes($item['body']);
- if (empty($shared['guid']) && empty($shared['message_id'])) {
- return $item['body'];
- }
-
- $link = $shared['link'] ?: $shared['message_id'];
-
- if (empty($shared_content)) {
- $shared_content = DI::contentItem()->createSharedPostByUrl($link, $item['uid'] ?? 0, $add_media);
- }
-
- if (empty($shared_content)) {
- return $item['body'];
- }
-
- $item['body'] = preg_replace("/\[share.*?\](.*)\[\/share\]/ism", $shared_content, $item['body']);
-
- Logger::debug('New shared data', ['uri-id' => $item['uri-id'], 'link' => $link, 'guid' => $item['guid']]);
- return $item['body'];
- }
-
/**
* Fetch the uri-id of a quote
*
* @param string $hash
* @param string $name
* @param string $url
- * @param boolean $probing Whether probing is active
* @return void
*/
- public static function storeByHash(int $uriId, string $hash, string $name, string $url = '', bool $probing = true)
+ public static function storeByHash(int $uriId, string $hash, string $name, string $url = '')
{
$type = self::getTypeForHash($hash);
if ($type == self::UNKNOWN) {
return;
}
- self::store($uriId, $type, $name, $url, $probing);
+ self::store($uriId, $type, $name, $url);
}
/**
* @param integer $uriId URI-Id
* @param string $body Body of the post
* @param string $tags Accepted tags
- * @param boolean $probing Perform a probing for contacts, adding them if needed
* @return void
*/
- public static function storeFromBody(int $uriId, string $body, string $tags = null, bool $probing = true)
+ public static function storeFromBody(int $uriId, string $body, string $tags = null)
{
- Logger::info('Check for tags', ['uri-id' => $uriId, 'hash' => $tags, 'callstack' => System::callstack()]);
+ $item = ['uri-id' => $uriId, 'body' => $body, 'quote-uri-id' => null];
+ self::storeFromArray($item, $tags);
+ }
+
+ /**
+ * Store tags and mentions from the item array
+ *
+ * @param array $item Item array
+ * @param string $tags Accepted tags
+ * @return void
+ */
+ public static function storeFromArray(array $item, string $tags = null)
+ {
+ Logger::info('Check for tags', ['uri-id' => $item['uri-id'], 'hash' => $tags, 'callstack' => System::callstack()]);
if (is_null($tags)) {
$tags = self::TAG_CHARACTER[self::HASHTAG] . self::TAG_CHARACTER[self::MENTION] . self::TAG_CHARACTER[self::EXCLUSIVE_MENTION];
}
// Only remove the shared data from "real" reshares
- $shared = BBCode::fetchShareAttributes($body);
- if (!empty($shared['guid'])) {
- $share_body = $shared['shared'];
- $body = BBCode::removeSharedData($body);
+ $shared = DI::contentItem()->getSharedPost($item, ['uri-id']);
+ if (!empty($shared)) {
+ $item['body'] = BBCode::removeSharedData($item['body']);
}
- foreach (self::getFromBody($body, $tags) as $tag) {
- self::storeByHash($uriId, $tag[1], $tag[3], $tag[2], $probing);
+ foreach (self::getFromBody($item['body'], $tags) as $tag) {
+ self::storeByHash($item['uri-id'], $tag[1], $tag[3], $tag[2]);
}
// Search for hashtags in the shared body (but only if hashtags are wanted)
- if (!empty($share_body) && (strpos($tags, self::TAG_CHARACTER[self::HASHTAG]) !== false)) {
- foreach (self::getFromBody($share_body, self::TAG_CHARACTER[self::HASHTAG]) as $tag) {
- self::storeByHash($uriId, $tag[1], $tag[3], $tag[2], $probing);
+ if (!empty($shared) && (strpos($tags, self::TAG_CHARACTER[self::HASHTAG]) !== false)) {
+ foreach (self::getByURIId($shared['post']['uri-id'], [self::HASHTAG]) as $tag) {
+ self::store($item['uri-id'], $tag['type'], $tag['name'], $tag['url']);
}
}
}
if (!empty($activity['source'])) {
$item['body'] = $activity['source'];
$item['raw-body'] = $content;
- $item['body'] = Item::improveSharedDataInBody($item);
+ $item['body'] = DI::contentItem()->improveSharedDataInBody($item);
} else {
$parent_uri = $item['parent-uri'] ?? $item['thr-parent'];
if (empty($activity['directmessage']) && ($parent_uri != $item['uri']) && ($item['gravity'] == Item::GRAVITY_COMMENT)) {
$data['quoteUrl'] = $item['quote-uri'];
} elseif (!empty($item['quote-uri']) && !$exists_reshare) {
$body .= "\n" . DI::contentItem()->createSharedPostByUriId($item['quote-uri-id'], $item['uid'], true);
- $item['body'] = Item::improveSharedDataInBody($item, true);
+ $item['body'] = DI::contentItem()->improveSharedDataInBody($item, true);
}
$data['content'] = BBCode::convertForUriId($item['uri-id'], $body, BBCode::ACTIVITYPUB);
$item['uri-id'] = ItemURI::insert(['uri' => $item['uri'], 'guid' => $item['guid']]);
- $item['body'] = Item::improveSharedDataInBody($item);
+ $item['body'] = DI::contentItem()->improveSharedDataInBody($item);
Tag::storeFromBody($item['uri-id'], $item['body']);