]> git.mxchange.org Git - friendica.git/blob - src/Content/Item.php
Replaced "getDetailsByURL" with "getByURL/getByURLForUser"
[friendica.git] / src / Content / Item.php
1 <?php
2 /**
3  * @copyright Copyright (C) 2020, Friendica
4  *
5  * @license GNU AGPL version 3 or any later version
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU Affero General Public License as
9  * published by the Free Software Foundation, either version 3 of the
10  * License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU Affero General Public License for more details.
16  *
17  * You should have received a copy of the GNU Affero General Public License
18  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
19  *
20  */
21
22 namespace Friendica\Content;
23
24 use Friendica\Database\DBA;
25 use Friendica\Model\Contact;
26 use Friendica\Model\FileTag;
27 use Friendica\Model\Tag;
28
29 /**
30  * A content helper class for displaying items
31  */
32 class Item
33 {
34         /**
35          * Return array with details for categories and folders for an item
36          *
37          * @param array $item
38          * @return [array, array]
39          *
40          * [
41          *      [ // categories array
42          *          {
43          *               'name': 'category name',
44          *               'removeurl': 'url to remove this category',
45          *               'first': 'is the first in this array? true/false',
46          *               'last': 'is the last in this array? true/false',
47          *           } ,
48          *           ....
49          *       ],
50          *       [ //folders array
51          *                      {
52          *               'name': 'folder name',
53          *               'removeurl': 'url to remove this folder',
54          *               'first': 'is the first in this array? true/false',
55          *               'last': 'is the last in this array? true/false',
56          *           } ,
57          *           ....
58          *       ]
59          *  ]
60          */
61         public function determineCategoriesTerms(array $item)
62         {
63                 $categories = [];
64                 $folders = [];
65                 $first = true;
66
67                 foreach (FileTag::fileToArray($item['file'] ?? '', 'category') as $savedFolderName) {
68                         if (!empty($item['author-link'])) {
69                                 $url = $item['author-link'] . "?category=" . rawurlencode($savedFolderName);
70                         } else {
71                                 $url = '#';
72                         }
73                         $categories[] = [
74                                 'name' => $savedFolderName,
75                                 'url' => $url,
76                                 'removeurl' => ((local_user() == $item['uid']) ? 'filerm/' . $item['id'] . '?cat=' . rawurlencode($savedFolderName) : ""),
77                                 'first' => $first,
78                                 'last' => false
79                         ];
80                         $first = false;
81                 }
82
83                 if (count($categories)) {
84                         $categories[count($categories) - 1]['last'] = true;
85                 }
86
87                 if (local_user() == $item['uid']) {
88                         foreach (FileTag::fileToArray($item['file'] ?? '') as $savedFolderName) {
89                                 $folders[] = [
90                                         'name' => $savedFolderName,
91                                         'url' => "#",
92                                         'removeurl' => ((local_user() == $item['uid']) ? 'filerm/' . $item['id'] . '?term=' . rawurlencode($savedFolderName) : ""),
93                                         'first' => $first,
94                                         'last' => false
95                                 ];
96                                 $first = false;
97                         }
98                 }
99
100                 if (count($folders)) {
101                         $folders[count($folders) - 1]['last'] = true;
102                 }
103
104                 return [$categories, $folders];
105         }
106
107         /**
108          * This function removes the tag $tag from the text $body and replaces it with
109          * the appropriate link.
110          *
111          * @param string  $body        the text to replace the tag in
112          * @param string  $inform      a comma-seperated string containing everybody to inform
113          * @param integer $profile_uid the user id to replace the tag for (0 = anyone)
114          * @param string  $tag         the tag to replace
115          * @param string  $network     The network of the post
116          *
117          * @return array|bool ['replaced' => $replaced, 'contact' => $contact];
118          * @throws \Friendica\Network\HTTPException\InternalServerErrorException
119          * @throws \ImagickException
120          */
121         public static function replaceTag(&$body, &$inform, $profile_uid, $tag, $network = '')
122         {
123                 $replaced = false;
124
125                 //is it a person tag?
126                 if (Tag::isType($tag, Tag::MENTION, Tag::IMPLICIT_MENTION, Tag::EXCLUSIVE_MENTION)) {
127                         $tag_type = substr($tag, 0, 1);
128                         //is it already replaced?
129                         if (strpos($tag, '[url=')) {
130                                 // Checking for the alias that is used for OStatus
131                                 $pattern = '/[@!]\[url\=(.*?)\](.*?)\[\/url\]/ism';
132                                 if (preg_match($pattern, $tag, $matches)) {
133                                         $data = Contact::getByURL($matches[1], 0, ['alias', 'nick'], false);
134
135                                         if ($data['alias'] != '') {
136                                                 $newtag = '@[url=' . $data['alias'] . ']' . $data['nick'] . '[/url]';
137                                         }
138                                 }
139
140                                 return $replaced;
141                         }
142
143                         //get the person's name
144                         $name = substr($tag, 1);
145
146                         // Sometimes the tag detection doesn't seem to work right
147                         // This is some workaround
148                         $nameparts = explode(' ', $name);
149                         $name = $nameparts[0];
150
151                         // Try to detect the contact in various ways
152                         if (strpos($name, 'http://') || strpos($name, '@')) {
153                                 $contact = Contact::getByURLForUser($name, $profile_uid, []);
154                         } else {
155                                 $contact = false;
156                                 $fields = ['id', 'url', 'nick', 'name', 'alias', 'network', 'forum', 'prv'];
157
158                                 if (strrpos($name, '+')) {
159                                         // Is it in format @nick+number?
160                                         $tagcid = intval(substr($name, strrpos($name, '+') + 1));
161                                         $contact = DBA::selectFirst('contact', $fields, ['id' => $tagcid, 'uid' => $profile_uid]);
162                                 }
163
164                                 // select someone by nick in the current network
165                                 if (!DBA::isResult($contact) && ($network != '')) {
166                                         $condition = ["`nick` = ? AND `network` = ? AND `uid` = ?",
167                                                 $name, $network, $profile_uid];
168                                         $contact = DBA::selectFirst('contact', $fields, $condition);
169                                 }
170
171                                 // select someone by attag in the current network
172                                 if (!DBA::isResult($contact) && ($network != '')) {
173                                         $condition = ["`attag` = ? AND `network` = ? AND `uid` = ?",
174                                                 $name, $network, $profile_uid];
175                                         $contact = DBA::selectFirst('contact', $fields, $condition);
176                                 }
177
178                                 //select someone by name in the current network
179                                 if (!DBA::isResult($contact) && ($network != '')) {
180                                         $condition = ['name' => $name, 'network' => $network, 'uid' => $profile_uid];
181                                         $contact = DBA::selectFirst('contact', $fields, $condition);
182                                 }
183
184                                 // select someone by nick in any network
185                                 if (!DBA::isResult($contact)) {
186                                         $condition = ["`nick` = ? AND `uid` = ?", $name, $profile_uid];
187                                         $contact = DBA::selectFirst('contact', $fields, $condition);
188                                 }
189
190                                 // select someone by attag in any network
191                                 if (!DBA::isResult($contact)) {
192                                         $condition = ["`attag` = ? AND `uid` = ?", $name, $profile_uid];
193                                         $contact = DBA::selectFirst('contact', $fields, $condition);
194                                 }
195
196                                 // select someone by name in any network
197                                 if (!DBA::isResult($contact)) {
198                                         $condition = ['name' => $name, 'uid' => $profile_uid];
199                                         $contact = DBA::selectFirst('contact', $fields, $condition);
200                                 }
201                         }
202
203                         // Check if $contact has been successfully loaded
204                         if (DBA::isResult($contact)) {
205                                 if (strlen($inform) && (isset($contact['notify']) || isset($contact['id']))) {
206                                         $inform .= ',';
207                                 }
208
209                                 if (isset($contact['id'])) {
210                                         $inform .= 'cid:' . $contact['id'];
211                                 } elseif (isset($contact['notify'])) {
212                                         $inform  .= $contact['notify'];
213                                 }
214
215                                 $profile = $contact['url'];
216                                 $newname = ($contact['name'] ?? '') ?: $contact['nick'];
217                         }
218
219                         //if there is an url for this persons profile
220                         if (isset($profile) && ($newname != '')) {
221                                 $replaced = true;
222                                 // create profile link
223                                 $profile = str_replace(',', '%2c', $profile);
224                                 $newtag = $tag_type.'[url=' . $profile . ']' . $newname . '[/url]';
225                                 $body = str_replace($tag_type . $name, $newtag, $body);
226                         }
227                 }
228
229                 return ['replaced' => $replaced, 'contact' => $contact];
230         }
231 }