$toplevel_item_id = intval($_REQUEST['parent'] ?? 0);
$thr_parent_uri = trim($_REQUEST['parent_uri'] ?? '');
- $thread_parent_uriid = 0;
- $thread_parent_contact = null;
-
$toplevel_item = null;
$parent_user = null;
- $parent_contact = null;
-
$objecttype = null;
$profile_uid = ($_REQUEST['profile_uid'] ?? 0) ?: local_user();
$posttype = ($_REQUEST['post_type'] ?? '') ?: Item::PT_ARTICLE;
// if this isn't the top-level parent of the conversation, find it
if (DBA::isResult($toplevel_item)) {
// The URI and the contact is taken from the direct parent which needn't to be the top parent
- $thread_parent_uriid = $toplevel_item['uri-id'];
$thr_parent_uri = $toplevel_item['uri'];
- $thread_parent_contact = Contact::getDetailsByURL($toplevel_item["author-link"]);
- if ($toplevel_item['id'] != $toplevel_item['parent']) {
+ if ($toplevel_item['gravity'] != GRAVITY_PARENT) {
$toplevel_item = Item::selectFirst([], ['id' => $toplevel_item['parent']]);
}
}
$verb = $orig_post['verb'];
$objecttype = $orig_post['object-type'];
$app = $orig_post['app'];
- $categories = $orig_post['file'];
+ $categories = $orig_post['file'] ?? '';
$title = Strings::escapeTags(trim($_REQUEST['title']));
$body = trim($body);
$private = $orig_post['private'];
// Look for any tags and linkify them
$inform = '';
-
- $tags = BBCode::getTags($body);
-
- if ($thread_parent_uriid && !\Friendica\Content\Feature::isEnabled($uid, 'explicit_mentions')) {
- $tags = item_add_implicit_mentions($tags, $thread_parent_contact, $thread_parent_uriid);
- }
-
- $tagged = [];
-
$private_forum = false;
+ $private_id = null;
$only_to_forum = false;
$forum_contact = [];
- if (count($tags)) {
+ BBCode::performWithEscapedTags($body, ['noparse', 'pre', 'code'], function ($body) use ($profile_uid, $network, $str_contact_allow, &$inform, &$private_forum, &$private_id, &$only_to_forum, &$forum_contact) {
+ $tags = BBCode::getTags($body);
+
+ $tagged = [];
+
foreach ($tags as $tag) {
$tag_type = substr($tag, 0, 1);
continue;
}
- /*
- * If we already tagged 'Robert Johnson', don't try and tag 'Robert'.
+ /* If we already tagged 'Robert Johnson', don't try and tag 'Robert'.
* Robert Johnson should be first in the $tags array
*/
- $fullnametagged = false;
- /// @TODO $tagged is initialized above if () block and is not filled, maybe old-lost code?
foreach ($tagged as $nextTag) {
if (stristr($nextTag, $tag . ' ')) {
- $fullnametagged = true;
- break;
+ continue 2;
}
}
- if ($fullnametagged) {
- continue;
- }
$success = handle_tag($body, $inform, local_user() ? local_user() : $profile_uid, $tag, $network);
if ($success['replaced']) {
$tagged[] = $tag;
}
// When the forum is private or the forum is addressed with a "!" make the post private
- if (is_array($success['contact']) && (!empty($success['contact']['prv']) || ($tag_type == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]))) {
+ if (!empty($success['contact']['prv']) || ($tag_type == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION])) {
$private_forum = $success['contact']['prv'];
$only_to_forum = ($tag_type == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]);
$private_id = $success['contact']['id'];
$forum_contact = $success['contact'];
- } elseif (is_array($success['contact']) && !empty($success['contact']['forum']) &&
- ($str_contact_allow == '<' . $success['contact']['id'] . '>')) {
+ } elseif (!empty($success['contact']['forum']) && ($str_contact_allow == '<' . $success['contact']['id'] . '>')) {
$private_forum = false;
$only_to_forum = true;
$private_id = $success['contact']['id'];
$forum_contact = $success['contact'];
}
}
- }
+
+ return $body;
+ });
+
$original_contact_id = $contact_id;
// Check for hashtags in the body and repair or add hashtag links
if ($preview || $orig_post) {
- Item::setHashtags($datarray);
+ $datarray['body'] = Item::setHashtags($datarray['body']);
}
// preview mode - prepare the body for display and send it via json
// We set the datarray ID to -1 because in preview mode the dataray
// doesn't have an ID.
$datarray["id"] = -1;
+ $datarray["uri-id"] = -1;
$datarray["item_id"] = -1;
$datarray["author-network"] = Protocol::DFRN;
Tag::storeFromBody($datarray['uri-id'], $datarray['body']);
+ if (!\Friendica\Content\Feature::isEnabled($uid, 'explicit_mentions') && ($datarray['gravity'] == GRAVITY_COMMENT)) {
+ Tag::createImplicitMentions($datarray['uri-id'], $datarray['thr-parent-id']);
+ }
+
// update filetags in pconfig
FileTag::updatePconfig($uid, $categories_old, $categories_new, 'category');
return ['replaced' => $replaced, 'contact' => $contact];
}
-
-function item_add_implicit_mentions(array $tags, array $thread_parent_contact, $thread_parent_uriid)
-{
- if (DI::config()->get('system', 'disable_implicit_mentions')) {
- // Add a tag if the parent contact is from ActivityPub or OStatus (This will notify them)
- if (in_array($thread_parent_contact['network'], [Protocol::OSTATUS, Protocol::ACTIVITYPUB])) {
- $contact = Tag::TAG_CHARACTER[Tag::MENTION] . '[url=' . $thread_parent_contact['url'] . ']' . $thread_parent_contact['nick'] . '[/url]';
- if (!stripos(implode($tags), '[url=' . $thread_parent_contact['url'] . ']')) {
- $tags[] = $contact;
- }
- }
- } else {
- $implicit_mentions = [
- $thread_parent_contact['url'] => $thread_parent_contact['nick']
- ];
-
- $parent_terms = Tag::getByURIId($thread_parent_uriid, [Tag::MENTION, Tag::IMPLICIT_MENTION]);
-
- foreach ($parent_terms as $parent_term) {
- $implicit_mentions[$parent_term['url']] = $parent_term['name'];
- }
-
- foreach ($implicit_mentions as $url => $label) {
- if ($url != \Friendica\Model\Profile::getMyURL() && !stripos(implode($tags), '[url=' . $url . ']')) {
- $tags[] = Tag::TAG_CHARACTER[Tag::IMPLICIT_MENTION] . '[url=' . $url . ']' . $label . '[/url]';
- }
- }
- }
-
- return $tags;
-}