* @file include/conversation.php
*/
use Friendica\App;
+use Friendica\Content\Feature;
use Friendica\Core\Config;
-use Friendica\Core\Conversation;
-use Friendica\Core\Item;
use Friendica\Core\PConfig;
use Friendica\Core\System;
use Friendica\Database\DBM;
+use Friendica\Model\Contact;
+use Friendica\Object\Thread;
+use Friendica\Object\Post;
require_once "include/bbcode.php";
require_once "include/acl_selectors.php";
-/*
- * Note: the code in 'item_extract_images' and 'item_redir_and_replace_images'
- * is identical to the code in mod/message.php for 'item_extract_images' and
- * 'item_redir_and_replace_images'
- */
-if (! function_exists('item_extract_images')) {
function item_extract_images($body) {
$saved_image = array();
$new_body = $new_body . $orig_body;
return array('body' => $new_body, 'images' => $saved_image);
-}}
+}
-if (! function_exists('item_redir_and_replace_images')) {
function item_redir_and_replace_images($body, $images, $cid) {
$origbody = $body;
$cnt++;
}
return $newbody;
-}}
+}
/**
* Render actions localized
$item['body'] = sprintf($txt, $A, $B). "\n\n\n" . $Bphoto;
}
- if (stristr($item['verb'], ACTIVITY_MOOD)) {
- $verb = urldecode(substr($item['verb'], strpos($item['verb'], '#') + 1));
- if (! $verb) {
- return;
- }
-
- $Aname = $item['author-name'];
- $Alink = $item['author-link'];
- $A = '[url=' . zrl($Alink) . ']' . $Aname . '[/url]';
-
- $txt = t('%1$s is currently %2$s');
-
- $item['body'] = sprintf($txt, $A, t($verb));
- }
if (activity_match($item['verb'], ACTIVITY_TAG)) {
/// @TODO may hurt performance "joining" two tables + asterisk
return "`item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated`";
}
-if (!function_exists('conversation')) {
/**
* "Render" a conversation or list of items for HTML display.
* There are two major forms of display:
function conversation(App $a, $items, $mode, $update, $preview = false) {
require_once 'include/bbcode.php';
- require_once 'include/Contact.php';
require_once 'mod/proxy.php';
$ssl_state = ((local_user()) ? true : false);
}
if (!x($item, 'author-thumb') || ($item['author-thumb'] == "")) {
- $author_contact = get_contact_details_by_url($item['author-link'], $profile_owner);
+ $author_contact = Contact::getDetailsByURL($item['author-link'], $profile_owner);
if ($author_contact["thumb"]) {
$item['author-thumb'] = $author_contact["thumb"];
} else {
}
if (!isset($item['owner-thumb']) || ($item['owner-thumb'] == "")) {
- $owner_contact = get_contact_details_by_url($item['owner-link'], $profile_owner);
+ $owner_contact = Contact::getDetailsByURL($item['owner-link'], $profile_owner);
if ($owner_contact["thumb"]) {
$item['owner-thumb'] = $owner_contact["thumb"];
} else {
list($categories, $folders) = get_cats_and_terms($item);
- if ($a->theme['template_engine'] === 'internal') {
- $profile_name_e = template_escape($profile_name);
- $item['title_e'] = template_escape($item['title']);
- $body_e = template_escape($body);
- $tags_e = template_escape($tags);
- $hashtags_e = template_escape($hashtags);
- $mentions_e = template_escape($mentions);
- $location_e = template_escape($location);
- $owner_name_e = template_escape($owner_name);
- } else {
- $profile_name_e = $profile_name;
- $item['title_e'] = $item['title'];
- $body_e = $body;
- $tags_e = $tags;
- $hashtags_e = $hashtags;
- $mentions_e = $mentions;
- $location_e = $location;
- $owner_name_e = $owner_name;
- }
+ $profile_name_e = $profile_name;
+ $item['title_e'] = $item['title'];
+ $body_e = $body;
+ $tags_e = $tags;
+ $hashtags_e = $hashtags;
+ $mentions_e = $mentions;
+ $location_e = $location;
+ $owner_name_e = $owner_name;
if ($item['item_network'] == "") {
$item['item_network'] = $item['network'];
// Normal View
$page_template = get_markup_template("threaded_conversation.tpl");
- $conv = new Conversation($mode, $preview);
+ $conv = new Thread($mode, $preview);
/*
* get all the topmost parents
$item['pagedrop'] = $page_dropping;
if ($item['id'] == $item['parent']) {
- $item_object = new Item($item);
- $conv->add_thread($item_object);
+ $item_object = new Post($item);
+ $conv->addParent($item_object);
}
}
- $threads = $conv->get_template_data($conv_responses);
+ $threads = $conv->getTemplateData($conv_responses);
if (!$threads) {
logger('[ERROR] conversation : Failed to get template data.', LOGGER_DEBUG);
'$mode' => $mode,
'$user' => $a->user,
'$threads' => $threads,
- '$dropping' => ($page_dropping && feature_enabled(local_user(), 'multi_delete') ? t('Delete Selected Items') : False),
+ '$dropping' => ($page_dropping && Feature::isEnabled(local_user(), 'multi_delete') ? t('Delete Selected Items') : False),
));
return $o;
-}}
+}
function best_link_url($item, &$sparkle, $url = '') {
return $o;
}
-if (! function_exists('builtin_activity_puller')) {
/**
* @brief Checks item to see if it is one of the builtin activities (like/dislike, event attendance, consensus items, etc.)
* Increments the count of each matching activity and adds a link to the author as needed.
return;
}
}
-}}
+}
-if (! function_exists('format_like')) {
/**
* Format the vote text for a profile item
* @param int $cnt = number of people who vote the item
$o .= $expanded;
return $o;
-}}
+}
function status_editor(App $a, $x, $notes_cid = 0, $popup = false) {
$o = '';
'$title' => $x['title'],
'$placeholdertitle' => t('Set title'),
'$category' => $x['category'],
- '$placeholdercategory' => (feature_enabled(local_user(), 'categories') ? t('Categories (comma-separated list)') : ''),
+ '$placeholdercategory' => (Feature::isEnabled(local_user(), 'categories') ? t('Categories (comma-separated list)') : ''),
'$wait' => t('Please wait'),
'$permset' => t('Permission settings'),
'$shortpermset' => t('permissions'),
'$lockstate' => $x['lockstate'],
'$bang' => $x['bang'],
'$profile_uid' => $x['profile_uid'],
- '$preview' => ((feature_enabled($x['profile_uid'],'preview')) ? t('Preview') : ''),
+ '$preview' => ((Feature::isEnabled($x['profile_uid'],'preview')) ? t('Preview') : ''),
'$jotplugins' => $jotplugins,
'$notes_cid' => $notes_cid,
'$sourceapp' => t($a->sourcename),
}
/**
- * Returns all the children in the given item list of the given parent. If threading
- * is allowed, does it recursively.
+ * Plucks the children of the given parent from a given item list.
+ *
+ * @brief Plucks all the children in the given item list of the given parent
*
* @param array $item_list
* @param array $parent
+ * @param bool $recursive
* @return type
*/
-function get_item_children(array $item_list, array $parent, $recursive = true)
+function get_item_children(array &$item_list, array $parent, $recursive = true)
{
$children = [];
- foreach ($item_list as $item) {
+ foreach ($item_list as $i => $item) {
if ($item['id'] != $item['parent']) {
if ($recursive) {
// Fallback to parent-uri if thr-parent is not set
if ($thr_parent == $parent['uri']) {
$item['children'] = get_item_children($item_list, $item);
$children[] = $item;
+ unset($item_list[$i]);
}
} elseif ($item['parent'] == $parent['id']) {
$children[] = $item;
+ unset($item_list[$i]);
}
}
}
}
/**
- * Recursively sorts a tree-like item array
+ * @brief Recursively sorts a tree-like item array
*
* @param array $items
* @return array
}
/**
- * Recursively add all children items at the top level of a list
+ * @brief Recursively add all children items at the top level of a list
*
* @param array $children List of items to append
* @param array $item_list
* This process is rendered somewhat more complicated because items can be either
* replies or likes, and these don't factor at all in the reply count/last reply.
*
+ * @brief Selectively flattens a tree-like item structure to prevent threading stairs
+ *
* @param array $parent A tree-like array of items
* @return array
*/
if (isset($child['children']) && count($child['children'])) {
// This helps counting only the regular posts
$count_post_closure = function($var) {
- return $var['verb'] === 'http://activitystrea.ms/schema/1.0/post';
+ return $var['verb'] === ACTIVITY_POST;
};
$child_post_count = count(array_filter($child['children'], $count_post_closure));
// Searches the post item in the children
$j = 0;
- while($child['children'][$j]['verb'] !== 'http://activitystrea.ms/schema/1.0/post' && $j < count($child['children'])) {
+ while($child['children'][$j]['verb'] !== ACTIVITY_POST && $j < count($child['children'])) {
$j ++;
}
* sort the top-level posts either on "created" or "commented", and finally
* append all the items at the top level (???)
*
+ * @brief Expands a flat item list into a conversation array for display
+ *
* @param array $item_list A list of items belonging to one or more conversations
* @param string $order Either on "created" or "commented"
* @return array
usort($parents, 'sort_thr_commented');
}
- $thread_allowed = Config::get('system', 'thread_allow') && get_app()->theme_thread_allow;
-
+ /*
+ * Plucks children from the item_array, second pass collects eventual orphan
+ * items and add them as children of their top-level post.
+ */
foreach ($parents as $i => $parent) {
- $parents[$i]['children'] = get_item_children($item_array, $parent, $thread_allowed);
+ $parents[$i]['children'] =
+ array_merge(get_item_children($item_array, $parent, true),
+ get_item_children($item_array, $parent, false));
}
foreach ($parents as $i => $parent) {
$parents[$i]['children'] = sort_item_children($parents[$i]['children']);
}
- if ($thread_allowed && PConfig::get(local_user(), 'system', 'smart_threading', 0)) {
+ if (PConfig::get(local_user(), 'system', 'smart_threading', 0)) {
foreach ($parents as $i => $parent) {
$parents[$i] = smart_flatten_conversation($parent);
}
}
/**
- * usort() callback to sort item arrays by the created key
+ * @brief usort() callback to sort item arrays by the created key
*
* @param array $a
* @param array $b
}
/**
- * usort() callback to reverse sort item arrays by the created key
+ * @brief usort() callback to reverse sort item arrays by the created key
*
* @param array $a
* @param array $b
}
/**
- * usort() callback to sort item arrays by the commented key
+ * @brief usort() callback to sort item arrays by the commented key
*
* @param array $a
* @param array $b