diff --git a/boot.php b/boot.php index b8705fdf13..eb04732c5d 100644 --- a/boot.php +++ b/boot.php @@ -534,39 +534,6 @@ function is_site_admin() return local_user() && $admin_email && in_array(defaults($a->user, 'email', ''), $adminlist); } -/** - * @brief Returns querystring as string from a mapped array. - * - * @param array $params mapped array with query parameters - * @param string $name of parameter, default null - * - * @return string - */ -function build_querystring($params, $name = null) -{ - $ret = ""; - foreach ($params as $key => $val) { - if (is_array($val)) { - /// @TODO maybe not compare against null, use is_null() - if ($name == null) { - $ret .= build_querystring($val, $key); - } else { - $ret .= build_querystring($val, $name . "[$key]"); - } - } else { - $val = urlencode($val); - /// @TODO maybe not compare against null, use is_null() - if ($name != null) { - /// @TODO two string concated, can be merged to one - $ret .= $name . "[$key]" . "=$val&"; - } else { - $ret .= "$key=$val&"; - } - } - } - return $ret; -} - function explode_querystring($query) { $arg_st = strpos($query, '?'); diff --git a/include/text.php b/include/text.php index c4249f86c4..eb65334fd9 100644 --- a/include/text.php +++ b/include/text.php @@ -8,10 +8,8 @@ use Friendica\Content\Smilies; use Friendica\Content\Text\BBCode; use Friendica\Core\Protocol; use Friendica\Model\Contact; - use Friendica\Model\FileTag; use Friendica\Util\Strings; -use Friendica\Util\XML; /** * Turn user/group ACLs stored as angle bracketed text into arrays @@ -186,21 +184,17 @@ function get_cats_and_terms($item) { $categories = []; $folders = []; - - $matches = []; $first = true; - $cnt = preg_match_all('/<(.*?)>/', $item['file'], $matches, PREG_SET_ORDER); - if ($cnt) { - foreach ($matches as $mtch) { - $categories[] = [ - 'name' => XML::escape(FileTag::decode($mtch[1])), - 'url' => "#", - 'removeurl' => ((local_user() == $item['uid'])?'filerm/' . $item['id'] . '?f=&cat=' . XML::escape(FileTag::decode($mtch[1])):""), - 'first' => $first, - 'last' => false - ]; - $first = false; - } + + foreach (FileTag::fileToArray($item['file'], 'category') as $savedFolderName) { + $categories[] = [ + 'name' => $savedFolderName, + 'url' => "#", + 'removeurl' => ((local_user() == $item['uid']) ? 'filerm/' . $item['id'] . '?f=&cat=' . rawurlencode($savedFolderName) : ""), + 'first' => $first, + 'last' => false + ]; + $first = false; } if (count($categories)) { @@ -208,20 +202,15 @@ function get_cats_and_terms($item) } if (local_user() == $item['uid']) { - $matches = []; - $first = true; - $cnt = preg_match_all('/\[(.*?)\]/', $item['file'], $matches, PREG_SET_ORDER); - if ($cnt) { - foreach ($matches as $mtch) { - $folders[] = [ - 'name' => XML::escape(FileTag::decode($mtch[1])), - 'url' => "#", - 'removeurl' => ((local_user() == $item['uid']) ? 'filerm/' . $item['id'] . '?f=&term=' . XML::escape(FileTag::decode($mtch[1])) : ""), - 'first' => $first, - 'last' => false - ]; - $first = false; - } + foreach (FileTag::fileToArray($item['file']) as $savedFolderName) { + $folders[] = [ + 'name' => $savedFolderName, + 'url' => "#", + 'removeurl' => ((local_user() == $item['uid']) ? 'filerm/' . $item['id'] . '?f=&term=' . rawurlencode($savedFolderName) : ""), + 'first' => $first, + 'last' => false + ]; + $first = false; } } diff --git a/mod/item.php b/mod/item.php index b126c4825b..7af5c712f6 100644 --- a/mod/item.php +++ b/mod/item.php @@ -327,10 +327,9 @@ function item_post(App $a) { } } - if (!empty($categories)) - { + if (!empty($categories)) { // get the "fileas" tags for this post - $filedas = FileTag::fileToList($categories, 'file'); + $filedas = FileTag::fileToArray($categories); } // save old and new categories, so we can determine what needs to be deleted from pconfig @@ -338,10 +337,9 @@ function item_post(App $a) { $categories = FileTag::listToFile(trim(defaults($_REQUEST, 'category', '')), 'category'); $categories_new = $categories; - if (!empty($filedas)) - { + if (!empty($filedas)) { // append the fileas stuff to the new categories list - $categories .= FileTag::listToFile($filedas, 'file'); + $categories .= FileTag::arrayToFile($filedas); } // get contact info for poster diff --git a/mod/network.php b/mod/network.php index c8786b2f7b..7753ba2ca4 100644 --- a/mod/network.php +++ b/mod/network.php @@ -77,9 +77,7 @@ function network_init(App $a) // convert query string to array. remove friendica args $query_array = []; - $query_string = str_replace($a->cmd . '?', '', $a->query_string); - parse_str($query_string, $query_array); - array_shift($query_array); + parse_str(parse_url($a->query_string, PHP_URL_QUERY), $query_array); // fetch last used network view and redirect if needed if (!$is_a_date_query) { @@ -99,7 +97,7 @@ function network_init(App $a) if ($remember_tab) { // redirect if current selected tab is '/network' and - // last selected tab is _not_ '/network?f=&order=comment'. + // last selected tab is _not_ '/network?order=comment'. // and this isn't a date query $tab_baseurls = [ @@ -111,12 +109,12 @@ function network_init(App $a) '', //bookmarked ]; $tab_args = [ - 'f=&order=comment', //all - 'f=&order=post', //postord - 'f=&conv=1', //conv + 'order=comment', //all + 'order=post', //postord + 'conv=1', //conv '', //new - 'f=&star=1', //starred - 'f=&bmark=1', //bookmarked + 'star=1', //starred + 'bmark=1', //bookmarked ]; $k = array_search('active', $last_sel_tabs); @@ -140,7 +138,7 @@ function network_init(App $a) if ($remember_tab) { $net_args = array_merge($query_array, $net_args); - $net_queries = build_querystring($net_args); + $net_queries = http_build_query($net_args); $redir_url = ($net_queries ? $net_baseurl . '?' . $net_queries : $net_baseurl); @@ -202,12 +200,12 @@ function saved_searches($search) * * urls -> returns * '/network' => $no_active = 'active' - * '/network?f=&order=comment' => $comment_active = 'active' - * '/network?f=&order=post' => $postord_active = 'active' - * '/network?f=&conv=1', => $conv_active = 'active' + * '/network?order=comment' => $comment_active = 'active' + * '/network?order=post' => $postord_active = 'active' + * '/network?conv=1', => $conv_active = 'active' * '/network/new', => $new_active = 'active' - * '/network?f=&star=1', => $starred_active = 'active' - * '/network?f=&bmark=1', => $bookmarked_active = 'active' + * '/network?star=1', => $starred_active = 'active' + * '/network?bmark=1', => $bookmarked_active = 'active' * * @param App $a * @return array ($no_active, $comment_active, $postord_active, $conv_active, $new_active, $starred_active, $bookmarked_active); @@ -973,7 +971,7 @@ function network_tabs(App $a) $tabs = [ [ 'label' => L10n::t('Commented Order'), - 'url' => str_replace('/new', '', $cmd) . '?f=&order=comment' . (!empty($_GET['cid']) ? '&cid=' . $_GET['cid'] : ''), + 'url' => str_replace('/new', '', $cmd) . '?order=comment' . (!empty($_GET['cid']) ? '&cid=' . $_GET['cid'] : ''), 'sel' => $all_active, 'title' => L10n::t('Sort by Comment Date'), 'id' => 'commented-order-tab', @@ -981,7 +979,7 @@ function network_tabs(App $a) ], [ 'label' => L10n::t('Posted Order'), - 'url' => str_replace('/new', '', $cmd) . '?f=&order=post' . (!empty($_GET['cid']) ? '&cid=' . $_GET['cid'] : ''), + 'url' => str_replace('/new', '', $cmd) . '?order=post' . (!empty($_GET['cid']) ? '&cid=' . $_GET['cid'] : ''), 'sel' => $postord_active, 'title' => L10n::t('Sort by Post Date'), 'id' => 'posted-order-tab', @@ -991,7 +989,7 @@ function network_tabs(App $a) $tabs[] = [ 'label' => L10n::t('Personal'), - 'url' => str_replace('/new', '', $cmd) . (!empty($_GET['cid']) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&conv=1', + 'url' => str_replace('/new', '', $cmd) . (!empty($_GET['cid']) ? '/?cid=' . $_GET['cid'] : '/?f=') . '&conv=1', 'sel' => $conv_active, 'title' => L10n::t('Posts that mention or involve you'), 'id' => 'personal-tab', @@ -1001,7 +999,7 @@ function network_tabs(App $a) if (Feature::isEnabled(local_user(), 'new_tab')) { $tabs[] = [ 'label' => L10n::t('New'), - 'url' => 'network/new' . (!empty($_GET['cid']) ? '/?f=&cid=' . $_GET['cid'] : ''), + 'url' => 'network/new' . (!empty($_GET['cid']) ? '/?cid=' . $_GET['cid'] : ''), 'sel' => $new_active, 'title' => L10n::t('Activity Stream - by date'), 'id' => 'activitiy-by-date-tab', @@ -1012,7 +1010,7 @@ function network_tabs(App $a) if (Feature::isEnabled(local_user(), 'link_tab')) { $tabs[] = [ 'label' => L10n::t('Shared Links'), - 'url' => str_replace('/new', '', $cmd) . (!empty($_GET['cid']) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&bmark=1', + 'url' => str_replace('/new', '', $cmd) . (!empty($_GET['cid']) ? '/?cid=' . $_GET['cid'] : '/?f=') . '&bmark=1', 'sel' => $bookmarked_active, 'title' => L10n::t('Interesting Links'), 'id' => 'shared-links-tab', @@ -1022,7 +1020,7 @@ function network_tabs(App $a) $tabs[] = [ 'label' => L10n::t('Starred'), - 'url' => str_replace('/new', '', $cmd) . (!empty($_GET['cid']) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&star=1', + 'url' => str_replace('/new', '', $cmd) . (!empty($_GET['cid']) ? '/?cid=' . $_GET['cid'] : '/?f=') . '&star=1', 'sel' => $starred_active, 'title' => L10n::t('Favourite Posts'), 'id' => 'starred-posts-tab', diff --git a/src/App.php b/src/App.php index 2e357f8651..e5ec66f5e3 100644 --- a/src/App.php +++ b/src/App.php @@ -1104,7 +1104,7 @@ class App // Compatibility with the Android Diaspora client if ($this->module == 'stream') { - $this->internalRedirect('network?f=&order=post'); + $this->internalRedirect('network?order=post'); } if ($this->module == 'conversations') { @@ -1112,15 +1112,15 @@ class App } if ($this->module == 'commented') { - $this->internalRedirect('network?f=&order=comment'); + $this->internalRedirect('network?order=comment'); } if ($this->module == 'liked') { - $this->internalRedirect('network?f=&order=comment'); + $this->internalRedirect('network?order=comment'); } if ($this->module == 'activity') { - $this->internalRedirect('network/?f=&conv=1'); + $this->internalRedirect('network?conv=1'); } if (($this->module == 'status_messages') && ($this->cmd == 'status_messages/new')) { diff --git a/src/Content/ForumManager.php b/src/Content/ForumManager.php index af2c3725c4..98ea7aa6b9 100644 --- a/src/Content/ForumManager.php +++ b/src/Content/ForumManager.php @@ -111,7 +111,7 @@ class ForumManager $selected = (($cid == $contact['id']) ? ' forum-selected' : ''); $entry = [ - 'url' => 'network?f=&cid=' . $contact['id'], + 'url' => 'network?cid=' . $contact['id'], 'external_url' => Contact::magicLink($contact['url']), 'name' => $contact['name'], 'cid' => $contact['id'], diff --git a/src/Content/Widget.php b/src/Content/Widget.php index 066c17413a..dcfc1d0e3d 100644 --- a/src/Content/Widget.php +++ b/src/Content/Widget.php @@ -256,7 +256,7 @@ class Widget * @param string $baseurl baseurl * @param string $selected optional, default empty * @return string|void - * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws \Exception */ public static function fileAs($baseurl, $selected = '') { @@ -269,15 +269,9 @@ class Widget return; } - $matches = []; - $terms = array(); - $cnt = preg_match_all('/\[(.*?)\]/', $saved, $matches, PREG_SET_ORDER); - if ($cnt) { - foreach ($matches as $mtch) - { - $unescaped = XML::escape(FileTag::decode($mtch[1])); - $terms[] = ['ref' => $unescaped, 'name' => $unescaped]; - } + $terms = []; + foreach (FileTag::fileToArray($saved) as $savedFolderName) { + $terms[] = ['ref' => $savedFolderName, 'name' => $savedFolderName]; } return self::filter( @@ -312,15 +306,9 @@ class Widget return; } - $matches = []; $terms = array(); - $cnt = preg_match_all('/<(.*?)>/', $saved, $matches, PREG_SET_ORDER); - - if ($cnt) { - foreach ($matches as $mtch) { - $unescaped = XML::escape(FileTag::decode($mtch[1])); - $terms[] = ['ref' => $unescaped, 'name' => $unescaped]; - } + foreach (FileTag::fileToArray($saved, 'category') as $savedFolderName) { + $terms[] = ['ref' => $savedFolderName, 'name' => $savedFolderName]; } return self::filter( diff --git a/src/Model/FileTag.php b/src/Model/FileTag.php index 2ad864c9c4..c743cb1278 100644 --- a/src/Model/FileTag.php +++ b/src/Model/FileTag.php @@ -11,127 +11,149 @@ use Friendica\Database\DBA; /** * @brief This class handles FileTag related functions + * + * post categories and "save to file" use the same item.file table for storage. + * We will differentiate the different uses by wrapping categories in angle brackets + * and save to file categories in square brackets. + * To do this we need to escape these characters if they appear in our tag. */ class FileTag { - // post categories and "save to file" use the same item.file table for storage. - // We will differentiate the different uses by wrapping categories in angle brackets - // and save to file categories in square brackets. - // To do this we need to escape these characters if they appear in our tag. + /** + * @brief URL encode <, >, left and right brackets + * + * @param string $s String to be URL encoded. + * + * @return string The URL encoded string. + */ + public static function encode($s) + { + return str_replace(['<', '>', '[', ']'], ['%3c', '%3e', '%5b', '%5d'], $s); + } - /** - * @brief URL encode <, >, left and right brackets - * - * @param string $s String to be URL encoded. - * - * @return string The URL encoded string. - */ - public static function encode($s) - { - return str_replace(['<', '>', '[', ']'], ['%3c', '%3e', '%5b', '%5d'], $s); - } + /** + * @brief URL decode <, >, left and right brackets + * + * @param string $s The URL encoded string to be decoded + * + * @return string The decoded string. + */ + public static function decode($s) + { + return str_replace(['%3c', '%3e', '%5b', '%5d'], ['<', '>', '[', ']'], $s); + } - /** - * @brief URL decode <, >, left and right brackets - * - * @param string $s The URL encoded string to be decoded - * - * @return string The decoded string. - */ - public static function decode($s) - { - return str_replace(['%3c', '%3e', '%5b', '%5d'], ['<', '>', '[', ']'], $s); - } + /** + * @brief Query files for tag + * + * @param string $table The table to be queired. + * @param string $s The search term + * @param string $type Optional file type. + * + * @return string Query string. + */ + public static function fileQuery($table, $s, $type = 'file') + { + if ($type == 'file') { + $str = preg_quote('[' . str_replace('%', '%%', self::encode($s)) . ']'); + } else { + $str = preg_quote('<' . str_replace('%', '%%', self::encode($s)) . '>'); + } - /** - * @brief Query files for tag - * - * @param string $table The table to be queired. - * @param string $s The search term - * @param string $type Optional file type. - * - * @return string Query string. - */ - public static function fileQuery($table, $s, $type = 'file') - { - if ($type == 'file') { - $str = preg_quote('[' . str_replace('%', '%%', self::encode($s)) . ']'); - } else { - $str = preg_quote('<' . str_replace('%', '%%', self::encode($s)) . '>'); - } + return " AND " . (($table) ? DBA::escape($table) . '.' : '') . "file regexp '" . DBA::escape($str) . "' "; + } - return " AND " . (($table) ? DBA::escape($table) . '.' : '') . "file regexp '" . DBA::escape($str) . "' "; - } + /** + * Get file tags from array + * + * ex. given [music,video] return