]> git.mxchange.org Git - friendica.git/blobdiff - include/conversation.php
Updating after post does now work
[friendica.git] / include / conversation.php
index 196fb6389cfe5e3bc2234fed9cae078894bb5eb4..daee67493bacf88f99db08276cea6c6b8744b0c0 100644 (file)
@@ -3,22 +3,18 @@
  * @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();
@@ -60,9 +56,8 @@ function item_extract_images($body) {
        $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;
@@ -102,7 +97,7 @@ function item_redir_and_replace_images($body, $images, $cid) {
                $cnt++;
        }
        return $newbody;
-}}
+}
 
 /**
  * Render actions localized
@@ -256,20 +251,6 @@ function localize_item(&$item) {
                $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
@@ -498,7 +479,6 @@ function item_condition() {
        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:
@@ -512,13 +492,11 @@ if (!function_exists('conversation')) {
 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);
 
        $profile_owner = 0;
-       $page_writeable = false;
        $live_update_div = '';
 
        $arr_blocked = null;
@@ -538,7 +516,6 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
 
        if ($mode === 'network') {
                $profile_owner = local_user();
-               $page_writeable = true;
                if (!$update) {
                        /*
                         * The special div is needed for liveUpdate to kick in for this page.
@@ -566,7 +543,6 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                }
        } elseif ($mode === 'profile') {
                $profile_owner = $a->profile['profile_uid'];
-               $page_writeable = can_write_wall($a,$profile_owner);
 
                if (!$update) {
                        $tab = notags(trim($_GET['tab']));
@@ -584,7 +560,6 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                }
        } elseif ($mode === 'notes') {
                $profile_owner = local_user();
-               $page_writeable = true;
                if (!$update) {
                        $live_update_div = '<div id="live-notes"></div>' . "\r\n"
                                . "<script> var profile_uid = " . local_user()
@@ -592,7 +567,6 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                }
        } elseif ($mode === 'display') {
                $profile_owner = $a->profile['uid'];
-               $page_writeable = can_write_wall($a,$profile_owner);
                if (!$update) {
                        $live_update_div = '<div id="live-display"></div>' . "\r\n"
                                . "<script> var profile_uid = " . $_SESSION['uid'] . ";"
@@ -600,7 +574,6 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                }
        } elseif ($mode === 'community') {
                $profile_owner = 0;
-               $page_writeable = false;
                if (!$update) {
                        $live_update_div = '<div id="live-community"></div>' . "\r\n"
                                . "<script> var profile_uid = -1; var netargs = '/?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
@@ -638,6 +611,12 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
        $page_template = get_markup_template("conversation.tpl");
 
        if ($items && count($items)) {
+               // Currently behind a config value. This allows the commenting and sharing of every public item.
+               if (Config::get('system', 'comment_public')) {
+                       $writable = ($items[0]['uid'] == 0) && in_array($items[0]['network'], array(NETWORK_OSTATUS, NETWORK_DIASPORA));
+               } else {
+                       $writable = false;
+               }
 
                if ($mode === 'network-new' || $mode === 'search' || $mode === 'community') {
 
@@ -733,7 +712,7 @@ function conversation(App $a, $items, $mode, $update, $preview = 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 {
@@ -742,7 +721,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                }
 
                                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 {
@@ -780,25 +759,14 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
 
                                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'];
@@ -864,7 +832,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                        // Normal View
                        $page_template = get_markup_template("threaded_conversation.tpl");
 
-                       $conv = new Conversation($mode, $preview);
+                       $conv = new Thread($mode, $preview, $writable);
 
                        /*
                         * get all the topmost parents
@@ -904,12 +872,12 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                                $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);
@@ -926,11 +894,11 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
                '$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 = '') {
 
@@ -1060,7 +1028,6 @@ function item_photo_menu($item) {
        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.
@@ -1136,9 +1103,8 @@ function builtin_activity_puller($item, &$conv_responses) {
                        return;
                }
        }
-}}
+}
 
-if (! function_exists('format_like')) {
 /**
  * Format the vote text for a profile item
  * @param int $cnt = number of people who vote the item
@@ -1229,7 +1195,7 @@ function format_like($cnt, array $arr, $type, $id) {
        $o .= $expanded;
 
        return $o;
-}}
+}
 
 function status_editor(App $a, $x, $notes_cid = 0, $popup = false) {
        $o = '';
@@ -1316,7 +1282,7 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) {
                '$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'),
@@ -1332,7 +1298,7 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) {
                '$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),
@@ -1362,17 +1328,19 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) {
 }
 
 /**
- * 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
@@ -1384,9 +1352,11 @@ function get_item_children(array $item_list, array $parent, $recursive = true)
                                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]);
                        }
                }
        }
@@ -1394,7 +1364,7 @@ function get_item_children(array $item_list, array $parent, $recursive = true)
 }
 
 /**
- * Recursively sorts a tree-like item array
+ * @brief Recursively sorts a tree-like item array
  *
  * @param array $items
  * @return array
@@ -1412,7 +1382,7 @@ function sort_item_children(array $items)
 }
 
 /**
- * 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
@@ -1438,6 +1408,8 @@ function add_children_to_list(array $children, 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
  */
@@ -1454,7 +1426,7 @@ function smart_flatten_conversation(array $parent)
                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));
@@ -1466,7 +1438,7 @@ function smart_flatten_conversation(array $parent)
 
                                // 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 ++;
                                }
 
@@ -1488,6 +1460,8 @@ function smart_flatten_conversation(array $parent)
  * 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
@@ -1520,17 +1494,21 @@ function conv_sort(array $item_list, $order)
                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);
                }
@@ -1548,7 +1526,7 @@ function conv_sort(array $item_list, $order)
 }
 
 /**
- * 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
@@ -1560,7 +1538,7 @@ function sort_thr_created(array $a, 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
@@ -1572,7 +1550,7 @@ function sort_thr_created_rev(array $a, 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