X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FContent%2FItem.php;h=06190dc88f5ff2f8584432de6765de0ac6041374;hb=38de3a53a5c9d47cffd95a7c686d9a353565bdee;hp=ed6ec9c877bb729126bb1ed5a00d0805946d0b2b;hpb=edf006905b5108d16eb5d4a5974198e0a93e41e7;p=friendica.git diff --git a/src/Content/Item.php b/src/Content/Item.php index ed6ec9c877..06190dc88f 100644 --- a/src/Content/Item.php +++ b/src/Content/Item.php @@ -1,13 +1,35 @@ . + * + */ namespace Friendica\Content; -use Friendica\Model\FileTag; +use Friendica\Database\DBA; +use Friendica\Model\Contact; +use Friendica\Model\Tag; +use Friendica\Model\Post; /** * A content helper class for displaying items */ -final class Item +class Item { /** * Return array with details for categories and folders for an item @@ -42,11 +64,16 @@ final class Item $folders = []; $first = true; - foreach (FileTag::fileToArray($item['file'] ?? '', 'category') as $savedFolderName) { + foreach (Post\Category::getArrayByURIId($item['uri-id'], $item['uid'], Post\Category::CATEGORY) as $savedFolderName) { + if (!empty($item['author-link'])) { + $url = $item['author-link'] . "?category=" . rawurlencode($savedFolderName); + } else { + $url = '#'; + } $categories[] = [ 'name' => $savedFolderName, - 'url' => "#", - 'removeurl' => ((local_user() == $item['uid']) ? 'filerm/' . $item['id'] . '?f=&cat=' . rawurlencode($savedFolderName) : ""), + 'url' => $url, + 'removeurl' => ((local_user() == $item['uid']) ? 'filerm/' . $item['id'] . '?cat=' . rawurlencode($savedFolderName) : ""), 'first' => $first, 'last' => false ]; @@ -58,11 +85,11 @@ final class Item } if (local_user() == $item['uid']) { - foreach (FileTag::fileToArray($item['file'] ?? '') as $savedFolderName) { + foreach (Post\Category::getArrayByURIId($item['uri-id'], $item['uid'], Post\Category::FILE) as $savedFolderName) { $folders[] = [ 'name' => $savedFolderName, 'url' => "#", - 'removeurl' => ((local_user() == $item['uid']) ? 'filerm/' . $item['id'] . '?f=&term=' . rawurlencode($savedFolderName) : ""), + 'removeurl' => ((local_user() == $item['uid']) ? 'filerm/' . $item['id'] . '?term=' . rawurlencode($savedFolderName) : ""), 'first' => $first, 'last' => false ]; @@ -76,4 +103,129 @@ final class Item return [$categories, $folders]; } + + /** + * This function removes the tag $tag from the text $body and replaces it with + * the appropriate link. + * + * @param string $body the text to replace the tag in + * @param string $inform a comma-seperated string containing everybody to inform + * @param integer $profile_uid the user id to replace the tag for (0 = anyone) + * @param string $tag the tag to replace + * @param string $network The network of the post + * + * @return array|bool ['replaced' => $replaced, 'contact' => $contact]; + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws \ImagickException + */ + public static function replaceTag(&$body, &$inform, $profile_uid, $tag, $network = '') + { + $replaced = false; + + //is it a person tag? + if (Tag::isType($tag, Tag::MENTION, Tag::IMPLICIT_MENTION, Tag::EXCLUSIVE_MENTION)) { + $tag_type = substr($tag, 0, 1); + //is it already replaced? + if (strpos($tag, '[url=')) { + // Checking for the alias that is used for OStatus + $pattern = '/[@!]\[url\=(.*?)\](.*?)\[\/url\]/ism'; + if (preg_match($pattern, $tag, $matches)) { + $data = Contact::getByURL($matches[1], false, ['alias', 'nick']); + + if ($data['alias'] != '') { + $newtag = '@[url=' . $data['alias'] . ']' . $data['nick'] . '[/url]'; + } + } + + return $replaced; + } + + //get the person's name + $name = substr($tag, 1); + + // Sometimes the tag detection doesn't seem to work right + // This is some workaround + $nameparts = explode(' ', $name); + $name = $nameparts[0]; + + // Try to detect the contact in various ways + if (strpos($name, 'http://') || strpos($name, '@')) { + $contact = Contact::getByURLForUser($name, $profile_uid); + } else { + $contact = false; + $fields = ['id', 'url', 'nick', 'name', 'alias', 'network', 'forum', 'prv']; + + if (strrpos($name, '+')) { + // Is it in format @nick+number? + $tagcid = intval(substr($name, strrpos($name, '+') + 1)); + $contact = DBA::selectFirst('contact', $fields, ['id' => $tagcid, 'uid' => $profile_uid]); + } + + // select someone by nick in the current network + if (!DBA::isResult($contact) && ($network != '')) { + $condition = ["`nick` = ? AND `network` = ? AND `uid` = ?", + $name, $network, $profile_uid]; + $contact = DBA::selectFirst('contact', $fields, $condition); + } + + // select someone by attag in the current network + if (!DBA::isResult($contact) && ($network != '')) { + $condition = ["`attag` = ? AND `network` = ? AND `uid` = ?", + $name, $network, $profile_uid]; + $contact = DBA::selectFirst('contact', $fields, $condition); + } + + //select someone by name in the current network + if (!DBA::isResult($contact) && ($network != '')) { + $condition = ['name' => $name, 'network' => $network, 'uid' => $profile_uid]; + $contact = DBA::selectFirst('contact', $fields, $condition); + } + + // select someone by nick in any network + if (!DBA::isResult($contact)) { + $condition = ["`nick` = ? AND `uid` = ?", $name, $profile_uid]; + $contact = DBA::selectFirst('contact', $fields, $condition); + } + + // select someone by attag in any network + if (!DBA::isResult($contact)) { + $condition = ["`attag` = ? AND `uid` = ?", $name, $profile_uid]; + $contact = DBA::selectFirst('contact', $fields, $condition); + } + + // select someone by name in any network + if (!DBA::isResult($contact)) { + $condition = ['name' => $name, 'uid' => $profile_uid]; + $contact = DBA::selectFirst('contact', $fields, $condition); + } + } + + // Check if $contact has been successfully loaded + if (DBA::isResult($contact)) { + if (strlen($inform) && (isset($contact['notify']) || isset($contact['id']))) { + $inform .= ','; + } + + if (isset($contact['id'])) { + $inform .= 'cid:' . $contact['id']; + } elseif (isset($contact['notify'])) { + $inform .= $contact['notify']; + } + + $profile = $contact['url']; + $newname = ($contact['name'] ?? '') ?: $contact['nick']; + } + + //if there is an url for this persons profile + if (isset($profile) && ($newname != '')) { + $replaced = true; + // create profile link + $profile = str_replace(',', '%2c', $profile); + $newtag = $tag_type.'[url=' . $profile . ']' . $newname . '[/url]'; + $body = str_replace($tag_type . $name, $newtag, $body); + } + } + + return ['replaced' => $replaced, 'contact' => $contact]; + } }