]> git.mxchange.org Git - friendica.git/blobdiff - include/text.php
Merge pull request #4243 from MrPetovan/task/switch-to-array-new-style
[friendica.git] / include / text.php
index c0a71cc784491115f006641b9a8a134e2607c17f..5ce0b850efdab64f3632782aab356d3c913d6a90 100644 (file)
@@ -1,14 +1,23 @@
 <?php
-
+/**
+ * @file include/text.php
+ */
 use Friendica\App;
+use Friendica\Content\ContactSelector;
+use Friendica\Content\Feature;
+use Friendica\Content\Smilies;
+use Friendica\Core\Config;
+use Friendica\Core\PConfig;
+use Friendica\Core\System;
+use Friendica\Database\DBM;
+use Friendica\Model\Profile;
+use Friendica\Model\Term;
+use Friendica\Util\Map;
 
-require_once "include/template_processor.php";
 require_once "include/friendica_smarty.php";
-require_once "include/Smilies.php";
-require_once "include/map.php";
 require_once "mod/proxy.php";
+require_once "include/conversation.php";
 
-if (! function_exists('replace_macros')) {
 /**
  * This is our template processor
  *
@@ -24,11 +33,11 @@ function replace_macros($s, $r) {
        $a = get_app();
 
        // pass $baseurl to all templates
-       $r['$baseurl'] = App::get_baseurl();
+       $r['$baseurl'] = System::baseUrl();
 
        $t = $a->template_engine();
        try {
-               $output = $t->replace_macros($s, $r);
+               $output = $t->replaceMacros($s, $r);
        } catch (Exception $e) {
                echo "<pre><b>" . __FUNCTION__ . "</b>: " . $e->getMessage() . "</pre>";
                killme();
@@ -37,24 +46,25 @@ function replace_macros($s, $r) {
        $a->save_timestamp($stamp1, "rendering");
 
        return $output;
-}}
+}
 
+/**
+ * @brief Generates a pseudo-random string of hexadecimal characters
+ *
+ * @param int $size
+ * @return string
+ */
+function random_string($size = 64)
+{
+       $byte_size = ceil($size / 2);
 
-// random string, there are 86 characters max in text mode, 128 for hex
-// output is urlsafe
+       $bytes = random_bytes($byte_size);
 
-define('RANDOM_STRING_HEX',  0x00 );
-define('RANDOM_STRING_TEXT', 0x01 );
+       $return = substr(bin2hex($bytes), 0, $size);
 
-if (! function_exists('random_string')) {
-function random_string($size = 64, $type = RANDOM_STRING_HEX) {
-       // generate a bit of entropy and run it through the whirlpool
-       $s = hash('whirlpool', (string) rand() . uniqid(rand(),true) . (string) rand(), (($type == RANDOM_STRING_TEXT) ? true : false));
-       $s = (($type == RANDOM_STRING_TEXT) ? str_replace("\n", "", base64url_encode($s,true)) : $s);
-       return(substr($s,0,$size));
-}}
+       return $return;
+}
 
-if (! function_exists('notags')) {
 /**
  * This is our primary input filter.
  *
@@ -73,15 +83,13 @@ if (! function_exists('notags')) {
  * @return string Filtered string
  */
 function notags($string) {
-       return str_replace(array("<", ">"), array('[', ']'), $string);
+       return str_replace(["<", ">"], ['[', ']'], $string);
 
 //  High-bit filter no longer used
-//     return(str_replace(array("<",">","\xBA","\xBC","\xBE"), array('[',']','','',''), $string));
-}}
-
+//     return str_replace(array("<",">","\xBA","\xBC","\xBE"), array('[',']','','',''), $string);
+}
 
 
-if (! function_exists('escape_tags')) {
 /**
  * use this on "body" or "content" input where angle chars shouldn't be removed,
  * and allow them to be safely displayed.
@@ -90,13 +98,9 @@ if (! function_exists('escape_tags')) {
  */
 function escape_tags($string) {
        return htmlspecialchars($string, ENT_COMPAT, 'UTF-8', false);
-}}
-
+}
 
-// generate a string that's random, but usually pronounceable.
-// used to generate initial passwords
 
-if (! function_exists('autoname')) {
 /**
  * generate a string that's random, but usually pronounceable.
  * used to generate initial passwords
@@ -109,12 +113,12 @@ function autoname($len) {
                return '';
        }
 
-       $vowels = array('a','a','ai','au','e','e','e','ee','ea','i','ie','o','ou','u');
+       $vowels = ['a','a','ai','au','e','e','e','ee','ea','i','ie','o','ou','u'];
        if (mt_rand(0, 5) == 4) {
                $vowels[] = 'y';
        }
 
-       $cons = array(
+       $cons = [
                        'b','bl','br',
                        'c','ch','cl','cr',
                        'd','dr',
@@ -135,13 +139,13 @@ function autoname($len) {
                        'w','wh',
                        'x',
                        'z','zh'
-                       );
+                       ];
 
-       $midcons = array('ck','ct','gn','ld','lf','lm','lt','mb','mm', 'mn','mp',
-                               'nd','ng','nk','nt','rn','rp','rt');
+       $midcons = ['ck','ct','gn','ld','lf','lm','lt','mb','mm', 'mn','mp',
+                               'nd','ng','nk','nt','rn','rp','rt'];
 
-       $noend = array('bl', 'br', 'cl','cr','dr','fl','fr','gl','gr',
-                               'kh', 'kl','kr','mn','pl','pr','rh','tr','qu','wh');
+       $noend = ['bl', 'br', 'cl','cr','dr','fl','fr','gl','gr',
+                               'kh', 'kl','kr','mn','pl','pr','rh','tr','qu','wh'];
 
        $start = mt_rand(0,2);
        if ($start == 0) {
@@ -176,13 +180,9 @@ function autoname($len) {
                $word = substr($word, 0, -1);
        }
        return $word;
-}}
-
+}
 
-// escape text ($str) for XML transport
-// returns escaped text.
 
-if (! function_exists('xmlify')) {
 /**
  * escape text ($str) for XML transport
  * @param string $str
@@ -196,7 +196,7 @@ function xmlify($str) {
        for ($x = 0; $x < $len; $x ++) {
                $char = mb_substr($str,$x,1);
 
-               switch( $char ) {
+               switch($char) {
 
                        case "\r" :
                                break;
@@ -233,10 +233,10 @@ function xmlify($str) {
        $buffer = htmlspecialchars($str, ENT_QUOTES, "UTF-8");
        $buffer = trim($buffer);
 
-       return($buffer);
-}}
+       return $buffer;
+}
+
 
-if (! function_exists('unxmlify')) {
 /**
  * undo an xmlify
  * @param string $s xml escaped text
@@ -254,25 +254,7 @@ function unxmlify($s) {
        */
        $ret = htmlspecialchars_decode($s, ENT_QUOTES);
        return $ret;
-}}
-
-if (! function_exists('hex2bin')) {
-/**
- * convenience wrapper, reverse the operation "bin2hex"
- * @param string $s
- * @return number
- */
-function hex2bin($s) {
-       if (! (is_string($s) && strlen($s))) {
-               return '';
-       }
-
-       if (! ctype_xdigit($s)) {
-               return $s;
-       }
-
-       return pack("H*",$s);
-}}
+}
 
 
 /**
@@ -293,19 +275,19 @@ function paginate_data(App $a, $count = null) {
        $stripped = trim($stripped, '/');
        $pagenum = $a->pager['page'];
 
-       if (($a->page_offset != '') AND !preg_match('/[?&].offset=/', $stripped)) {
+       if (($a->page_offset != '') && !preg_match('/[?&].offset=/', $stripped)) {
                $stripped .= '&offset=' . urlencode($a->page_offset);
        }
 
        $url = $stripped;
-       $data = array();
+       $data = [];
 
        function _l(&$d, $name, $url, $text, $class = '') {
                if (strpos($url, '?') === false && ($pos = strpos($url, '&')) !== false) {
                        $url = substr($url, 0, $pos) . '?' . substr($url, $pos + 1);
                }
 
-               $d[$name] = array('url' => $url, 'text' => $text, 'class' => $class);
+               $d[$name] = ['url' => $url, 'text' => $text, 'class' => $class];
        }
 
        if (!is_null($count)) {
@@ -331,7 +313,7 @@ function paginate_data(App $a, $count = null) {
                                $numstop = (($pagenum > ($numpages - 7)) ? $numpages : ($numstart + 8));
                        }
 
-                       $pages = array();
+                       $pages = [];
 
                        for ($i = $numstart; $i <= $numstop; $i++) {
                                if ($i == $a->pager['page']) {
@@ -360,7 +342,7 @@ function paginate_data(App $a, $count = null) {
        return $data;
 }
 
-if (! function_exists('paginate')) {
+
 /**
  * Automatic pagination.
  *
@@ -380,11 +362,11 @@ function paginate(App $a) {
 
        $data = paginate_data($a);
        $tpl = get_markup_template("paginate.tpl");
-       return replace_macros($tpl, array("pager" => $data));
+       return replace_macros($tpl, ["pager" => $data]);
+
+}
 
-}}
 
-if (! function_exists('alt_pager')) {
 /**
  * Alternative pager
  * @param App $a App instance
@@ -395,24 +377,24 @@ function alt_pager(App $a, $i) {
 
        $data = paginate_data($a, $i);
        $tpl = get_markup_template("paginate.tpl");
-       return replace_macros($tpl, array('pager' => $data));
+       return replace_macros($tpl, ['pager' => $data]);
+
+}
 
-}}
 
-if (! function_exists('scroll_loader')) {
 /**
  * Loader for infinite scrolling
  * @return string html for loader
  */
 function scroll_loader() {
        $tpl = get_markup_template("scroll_loader.tpl");
-       return replace_macros($tpl, array(
+       return replace_macros($tpl, [
                'wait' => t('Loading more entries...'),
                'end' => t('The end')
-       ));
-}}
+       ]);
+}
+
 
-if (! function_exists('expand_acl')) {
 /**
  * Turn user/group ACLs stored as angle bracketed text into arrays
  *
@@ -422,7 +404,7 @@ if (! function_exists('expand_acl')) {
 function expand_acl($s) {
        // turn string array of angle-bracketed elements into numeric array
        // e.g. "<1><2><3>" => array(1,2,3);
-       $ret = array();
+       $ret = [];
 
        if (strlen($s)) {
                $t = str_replace('<', '', $s);
@@ -434,9 +416,9 @@ function expand_acl($s) {
                }
        }
        return $ret;
-}}
+}
+
 
-if (! function_exists('sanitise_acl')) {
 /**
  * Wrap ACL elements in angle brackets for storage
  * @param string $item
@@ -447,10 +429,9 @@ function sanitise_acl(&$item) {
        } else {
                unset($item);
        }
-}}
+}
 
 
-if (! function_exists('perms2str')) {
 /**
  * Convert an ACL array to a storable string
  *
@@ -473,10 +454,9 @@ function perms2str($p) {
                $ret = implode('', $tmp);
        }
        return $ret;
-}}
+}
 
 
-if (! function_exists('item_new_uri')) {
 /**
  * generate a guaranteed unique (for this domain) item ID for ATOM
  * safe from birthday paradox
@@ -488,8 +468,6 @@ if (! function_exists('item_new_uri')) {
 function item_new_uri($hostname, $uid, $guid = "") {
 
        do {
-               $dups = false;
-
                if ($guid == "") {
                        $hash = get_guid(32);
                } else {
@@ -499,20 +477,13 @@ function item_new_uri($hostname, $uid, $guid = "") {
 
                $uri = "urn:X-dfrn:" . $hostname . ':' . $uid . ':' . $hash;
 
-               $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1",
-                       dbesc($uri));
-               if (dbm::is_result($r)) {
-                       $dups = true;
-               }
+               $dups = dba::exists('item', ['uri' => $uri]);
        } while ($dups == true);
 
        return $uri;
-}}
+}
 
-// Generate a guaranteed unique photo ID.
-// safe from birthday paradox
 
-if (! function_exists('photo_new_resource')) {
 /**
  * Generate a guaranteed unique photo ID.
  * safe from birthday paradox
@@ -528,16 +499,15 @@ function photo_new_resource() {
                        dbesc($resource)
                );
 
-               if (dbm::is_result($r)) {
+               if (DBM::is_result($r)) {
                        $found = true;
                }
        } while ($found == true);
 
        return $resource;
-}}
+}
 
 
-if (! function_exists('load_view_file')) {
 /**
  * @deprecated
  * wrapper to load a view template, checking for alternate
@@ -575,9 +545,9 @@ function load_view_file($s) {
        $content = file_get_contents($s);
        $a->save_timestamp($stamp1, "file");
        return $content;
-}}
+}
+
 
-if (! function_exists('get_intltext_template')) {
 /**
  * load a view template, checking for alternate
  * languages before falling back to the default
@@ -615,9 +585,9 @@ function get_intltext_template($s) {
                $a->save_timestamp($stamp1, "file");
                return $content;
        }
-}}
+}
+
 
-if (! function_exists('get_markup_template')) {
 /**
  * load template $s
  *
@@ -631,7 +601,7 @@ function get_markup_template($s, $root = '') {
        $a = get_app();
        $t = $a->template_engine();
        try {
-               $template = $t->get_template_file($s, $root);
+               $template = $t->getTemplateFile($s, $root);
        } catch (Exception $e) {
                echo "<pre><b>" . __FUNCTION__ . "</b>: " . $e->getMessage() . "</pre>";
                killme();
@@ -640,9 +610,9 @@ function get_markup_template($s, $root = '') {
        $a->save_timestamp($stamp1, "file");
 
        return $template;
-}}
+}
+
 
-if (! function_exists("get_template_file")) {
 /**
  *
  * @param App $a
@@ -669,10 +639,9 @@ function get_template_file($a, $filename, $root = '') {
        }
 
        return $template_file;
-}}
+}
 
 
-if (! function_exists('attribute_contains')) {
 /**
  *  for html,xml parsing - let's say you've got
  *  an attribute foobar="class1 class2 class3"
@@ -690,11 +659,11 @@ if (! function_exists('attribute_contains')) {
 function attribute_contains($attr, $s) {
        $a = explode(' ', $attr);
        return (count($a) && in_array($s,$a));
-}}
+}
+
 
-if (! function_exists('logger')) {
 /* setup int->string log level map */
-$LOGGER_LEVELS = array();
+$LOGGER_LEVELS = [];
 
 /**
  * @brief Logs the given message at the given log level
@@ -707,27 +676,25 @@ $LOGGER_LEVELS = array();
  * LOGGER_ALL
  *
  * @global App $a
- * @global dba $db
  * @global array $LOGGER_LEVELS
  * @param string $msg
  * @param int $level
  */
 function logger($msg, $level = 0) {
        $a = get_app();
-       global $db;
        global $LOGGER_LEVELS;
 
        // turn off logger in install mode
        if (
                $a->module == 'install'
-               || ! ($db && $db->connected)
+               || !dba::$connected
        ) {
                return;
        }
 
-       $debugging = get_config('system','debugging');
-       $logfile   = get_config('system','logfile');
-       $loglevel = intval(get_config('system','loglevel'));
+       $debugging = Config::get('system','debugging');
+       $logfile   = Config::get('system','logfile');
+       $loglevel = intval(Config::get('system','loglevel'));
 
        if (
                ! $debugging
@@ -753,7 +720,7 @@ function logger($msg, $level = 0) {
 
        $callers = debug_backtrace();
        $logline = sprintf("%s@%s\t[%s]:%s:%s:%s\t%s\n",
-                       datetime_convert(),
+                       datetime_convert('UTC', 'UTC', 'now', 'Y-m-d\TH:i:s\Z'),
                        $process_id,
                        $LOGGER_LEVELS[$level],
                        basename($callers[0]['file']),
@@ -765,7 +732,7 @@ function logger($msg, $level = 0) {
        $stamp1 = microtime(true);
        @file_put_contents($logfile, $logline, FILE_APPEND);
        $a->save_timestamp($stamp1, "file");
-}}
+}
 
 /**
  * @brief An alternative logger for development.
@@ -781,7 +748,6 @@ function logger($msg, $level = 0) {
  * LOGGER_ALL
  *
  * @global App $a
- * @global dba $db
  * @global array $LOGGER_LEVELS
  * @param string $msg
  * @param int $level
@@ -789,17 +755,16 @@ function logger($msg, $level = 0) {
 
 function dlogger($msg, $level = 0) {
        $a = get_app();
-       global $db;
 
        // turn off logger in install mode
        if (
                $a->module == 'install'
-               || ! ($db && $db->connected)
+               || !dba::$connected
        ) {
                return;
        }
 
-       $logfile = get_config('system','dlogfile');
+       $logfile = Config::get('system','dlogfile');
 
        if (! $logfile) {
                return;
@@ -834,7 +799,7 @@ function dlogger($msg, $level = 0) {
        $a->save_timestamp($stamp1, "file");
 }
 
-if (! function_exists('activity_match')) {
+
 /**
  * Compare activity uri. Knows about activity namespace.
  *
@@ -844,7 +809,7 @@ if (! function_exists('activity_match')) {
  */
 function activity_match($haystack,$needle) {
        return (($haystack === $needle) || ((basename($needle) === $haystack) && strstr($needle, NAMESPACE_ACTIVITY_SCHEMA)));
-}}
+}
 
 
 /**
@@ -860,7 +825,7 @@ function activity_match($haystack,$needle) {
  * @return array List of tag and person names
  */
 function get_tags($string) {
-       $ret = array();
+       $ret = [];
 
        // Convert hashtag links to hashtags
        $string = preg_replace('/#\[url\=([^\[\]]*)\](.*?)\[\/url\]/ism', '#$2', $string);
@@ -869,7 +834,7 @@ function get_tags($string) {
        $string = preg_replace('/\[code\](.*?)\[\/code\]/sm', '', $string);
 
        // Force line feeds at bbtags
-       $string = str_replace(array('[', ']'), array("\n[", "]\n"), $string);
+       $string = str_replace(['[', ']'], ["\n[", "]\n"], $string);
 
        // ignore anything in a bbtag
        $string = preg_replace('/\[(.*?)\]/sm', '', $string);
@@ -918,9 +883,6 @@ function get_tags($string) {
 }
 
 
-//
-
-if (! function_exists('qp')) {
 /**
  * quick and dirty quoted_printable encoding
  *
@@ -929,9 +891,9 @@ if (! function_exists('qp')) {
  */
 function qp($s) {
        return str_replace("%", "=", rawurlencode($s));
-}}
+}
+
 
-if (! function_exists('contact_block')) {
 /**
  * Get html for contact block.
  *
@@ -943,15 +905,12 @@ function contact_block() {
        $o = '';
        $a = get_app();
 
-       $shown = get_pconfig($a->profile['uid'],'system','display_friend_count');
-       if ($shown === false) {
-               $shown = 24;
-       }
+       $shown = PConfig::get($a->profile['uid'], 'system', 'display_friend_count', 24);
        if ($shown == 0) {
                return;
        }
 
-       if ((! is_array($a->profile)) || ($a->profile['hide-friends'])) {
+       if (!is_array($a->profile) || $a->profile['hide-friends']) {
                return $o;
        }
        $r = q("SELECT COUNT(*) AS `total` FROM `contact`
@@ -963,10 +922,10 @@ function contact_block() {
                        dbesc(NETWORK_OSTATUS),
                        dbesc(NETWORK_DIASPORA)
        );
-       if (dbm::is_result($r)) {
+       if (DBM::is_result($r)) {
                $total = intval($r[0]['total']);
        }
-       if (! $total) {
+       if (!$total) {
                $contacts = t('No contacts');
                $micropro = null;
        } else {
@@ -982,17 +941,17 @@ function contact_block() {
                                dbesc(NETWORK_DIASPORA),
                                intval($shown)
                );
-               if (dbm::is_result($r)) {
-                       $contacts = array();
+               if (DBM::is_result($r)) {
+                       $contacts = [];
                        foreach ($r AS $contact) {
                                $contacts[] = $contact["id"];
                        }
                        $r = q("SELECT `id`, `uid`, `addr`, `url`, `name`, `thumb`, `network` FROM `contact` WHERE `id` IN (%s)",
                                dbesc(implode(",", $contacts)));
 
-                       if (dbm::is_result($r)) {
-                               $contacts = sprintf( tt('%d Contact','%d Contacts', $total),$total);
-                               $micropro = Array();
+                       if (DBM::is_result($r)) {
+                               $contacts = sprintf(tt('%d Contact','%d Contacts', $total),$total);
+                               $micropro = [];
                                foreach ($r as $rr) {
                                        $micropro[] = micropro($rr,true,'mpfriend');
                                }
@@ -1001,19 +960,20 @@ function contact_block() {
        }
 
        $tpl = get_markup_template('contact_block.tpl');
-       $o = replace_macros($tpl, array(
+       $o = replace_macros($tpl, [
                '$contacts' => $contacts,
                '$nickname' => $a->profile['nickname'],
                '$viewcontacts' => t('View Contacts'),
                '$micropro' => $micropro,
-       ));
+       ]);
 
-       $arr = array('contacts' => $r, 'output' => $o);
+       $arr = ['contacts' => $r, 'output' => $o];
 
        call_hooks('contact_block_end', $arr);
        return $o;
 
-}}
+}
+
 
 /**
  * @brief Format contacts as picture links or as texxt links
@@ -1037,7 +997,7 @@ function contact_block() {
 function micropro($contact, $redirect = false, $class = '', $textmode = false) {
 
        // Use the contact URL if no address is available
-       if ($contact["addr"] == "") {
+       if (!x($contact, "addr")) {
                $contact["addr"] = $contact["url"];
        }
 
@@ -1046,14 +1006,13 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) {
        $redir = false;
 
        if ($redirect) {
-               $a = get_app();
                $redirect_url = 'redir/' . $contact['id'];
                if (local_user() && ($contact['uid'] == local_user()) && ($contact['network'] === NETWORK_DFRN)) {
                        $redir = true;
                        $url = $redirect_url;
                        $sparkle = ' sparkle';
                } else {
-                       $url = zrl($url);
+                       $url = Profile::zrl($url);
                }
        }
 
@@ -1062,8 +1021,8 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) {
                $url = '';
        }
 
-       return replace_macros(get_markup_template(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'),array(
-               '$click' => (($contact['click']) ? $contact['click'] : ''),
+       return replace_macros(get_markup_template(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'),[
+               '$click' => defaults($contact, 'click', ''),
                '$class' => $class,
                '$url' => $url,
                '$photo' => proxy_url($contact['thumb'], false, PROXY_SIZE_THUMB),
@@ -1072,64 +1031,66 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) {
                '$parkle' => $sparkle,
                '$redir' => $redir,
 
-       ));
+       ]);
 }
 
-
-
-if (! function_exists('search')) {
 /**
- * search box
+ * Search box.
  *
- * @param string $s search query
- * @param string $id html id
- * @param string $url search url
- * @param boolean $savedsearch show save search button
+ * @param string $s     Search query.
+ * @param string $id    HTML id
+ * @param string $url   Search url.
+ * @param bool   $save  Show save search button.
+ * @param bool   $aside Display the search widgit aside.
+ *
+ * @return string Formatted HTML.
  */
-function search($s, $id = 'search-box', $url = 'search', $save = false, $aside = true) {
-       $a = get_app();
+function search($s, $id = 'search-box', $url = 'search', $save = false, $aside = true)
+{
+       $mode = 'text';
 
-       $values = array(
+       if (strpos($s, '#') === 0) {
+               $mode = 'tag';
+       }
+       $save_label = $mode === 'text' ? t('Save') : t('Follow');
+
+       $values = [
                        '$s' => htmlspecialchars($s),
                        '$id' => $id,
                        '$action_url' => $url,
                        '$search_label' => t('Search'),
-                       '$save_label' => t('Save'),
-                       '$savedsearch' => feature_enabled(local_user(),'savedsearch'),
+                       '$save_label' => $save_label,
+                       '$savedsearch' => Feature::isEnabled(local_user(),'savedsearch'),
                        '$search_hint' => t('@name, !forum, #tags, content'),
-               );
+                       '$mode' => $mode
+               ];
 
        if (!$aside) {
-               $values['$searchoption'] = array(
+               $values['$searchoption'] = [
                                        t("Full Text"),
                                        t("Tags"),
-                                       t("Contacts"));
+                                       t("Contacts")];
 
-               if (get_config('system','poco_local_search')) {
+               if (Config::get('system','poco_local_search')) {
                        $values['$searchoption'][] = t("Forums");
                }
        }
 
        return replace_macros(get_markup_template('searchbox.tpl'), $values);
-}}
+}
 
-if (! function_exists('valid_email')) {
 /**
- * Check if $x is a valid email string
+ * @brief Check for a valid email string
  *
- * @param string $x
+ * @param string $email_address
  * @return boolean
  */
-function valid_email($x){
-
-       /// @TODO Removed because Fabio told me so.
-       //if (get_config('system','disable_email_validation'))
-       //      return true;
-       return preg_match('/^[_a-zA-Z0-9\-\+]+(\.[_a-zA-Z0-9\-\+]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/', $x);
-}}
+function valid_email($email_address)
+{
+       return preg_match('/^[_a-zA-Z0-9\-\+]+(\.[_a-zA-Z0-9\-\+]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/', $email_address);
+}
 
 
-if (! function_exists('linkify')) {
 /**
  * Replace naked text hyperlink with HTML formatted hyperlink
  *
@@ -1139,7 +1100,7 @@ function linkify($s) {
        $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\'\%\$\!\+]*)/", ' <a href="$1" target="_blank">$1</a>', $s);
        $s = preg_replace("/\<(.*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism",'<$1$2=$3&$4>',$s);
        return $s;
-}}
+}
 
 
 /**
@@ -1154,73 +1115,53 @@ function get_poke_verbs() {
        // index is present tense verb
        // value is array containing past tense verb, translation of present, translation of past
 
-       $arr = array(
-               'poke' => array( 'poked', t('poke'), t('poked')),
-               'ping' => array( 'pinged', t('ping'), t('pinged')),
-               'prod' => array( 'prodded', t('prod'), t('prodded')),
-               'slap' => array( 'slapped', t('slap'), t('slapped')),
-               'finger' => array( 'fingered', t('finger'), t('fingered')),
-               'rebuff' => array( 'rebuffed', t('rebuff'), t('rebuffed')),
-       );
+       $arr = [
+               'poke' => ['poked', t('poke'), t('poked')],
+               'ping' => ['pinged', t('ping'), t('pinged')],
+               'prod' => ['prodded', t('prod'), t('prodded')],
+               'slap' => ['slapped', t('slap'), t('slapped')],
+               'finger' => ['fingered', t('finger'), t('fingered')],
+               'rebuff' => ['rebuffed', t('rebuff'), t('rebuffed')],
+       ];
        call_hooks('poke_verbs', $arr);
        return $arr;
 }
 
 /**
- * Load moods
- * @return array index is mood, value is translated mood
- * @hook mood_verbs moods array
+ * @brief Translate days and months names.
+ *
+ * @param string $s String with day or month name.
+ * @return string Translated string.
  */
-function get_mood_verbs() {
-
-       $arr = array(
-               'happy'      => t('happy'),
-               'sad'        => t('sad'),
-               'mellow'     => t('mellow'),
-               'tired'      => t('tired'),
-               'perky'      => t('perky'),
-               'angry'      => t('angry'),
-               'stupefied'  => t('stupified'),
-               'puzzled'    => t('puzzled'),
-               'interested' => t('interested'),
-               'bitter'     => t('bitter'),
-               'cheerful'   => t('cheerful'),
-               'alive'      => t('alive'),
-               'annoyed'    => t('annoyed'),
-               'anxious'    => t('anxious'),
-               'cranky'     => t('cranky'),
-               'disturbed'  => t('disturbed'),
-               'frustrated' => t('frustrated'),
-               'motivated'  => t('motivated'),
-               'relaxed'    => t('relaxed'),
-               'surprised'  => t('surprised'),
-       );
+function day_translate($s) {
+       $ret = str_replace(['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'],
+               [t('Monday'), t('Tuesday'), t('Wednesday'), t('Thursday'), t('Friday'), t('Saturday'), t('Sunday')],
+               $s);
 
-       call_hooks('mood_verbs', $arr);
-       return $arr;
+       $ret = str_replace(['January','February','March','April','May','June','July','August','September','October','November','December'],
+               [t('January'), t('February'), t('March'), t('April'), t('May'), t('June'), t('July'), t('August'), t('September'), t('October'), t('November'), t('December')],
+               $ret);
+
+       return $ret;
 }
 
-if (! function_exists('day_translate')) {
 /**
- * Translate days and months names
+ * @brief Translate short days and months names.
  *
- * @param string $s
- * @return string
+ * @param string $s String with short day or month name.
+ * @return string Translated string.
  */
-function day_translate($s) {
-       $ret = str_replace(array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'),
-               array( t('Monday'), t('Tuesday'), t('Wednesday'), t('Thursday'), t('Friday'), t('Saturday'), t('Sunday')),
+function day_short_translate($s) {
+       $ret = str_replace(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
+               [t('Mon'), t('Tue'), t('Wed'), t('Thu'), t('Fri'), t('Sat'), t('Sun')],
                $s);
-
-       $ret = str_replace(array('January','February','March','April','May','June','July','August','September','October','November','December'),
-               array( t('January'), t('February'), t('March'), t('April'), t('May'), t('June'), t('July'), t('August'), t('September'), t('October'), t('November'), t('December')),
+       $ret = str_replace(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov','Dec'],
+               [t('Jan'), t('Feb'), t('Mar'), t('Apr'), t('May'), ('Jun'), t('Jul'), t('Aug'), t('Sep'), t('Oct'), t('Nov'), t('Dec')],
                $ret);
-
        return $ret;
-}}
+}
 
 
-if (! function_exists('normalise_link')) {
 /**
  * Normalize url
  *
@@ -1228,13 +1169,11 @@ if (! function_exists('normalise_link')) {
  * @return string
  */
 function normalise_link($url) {
-       $ret = str_replace(array('https:', '//www.'), array('http:', '//'), $url);
+       $ret = str_replace(['https:', '//www.'], ['http:', '//'], $url);
        return rtrim($ret,'/');
-}}
-
+}
 
 
-if (! function_exists('link_compare')) {
 /**
  * Compare two URLs to see if they are the same, but ignore
  * slight but hopefully insignificant differences such as if one
@@ -1248,7 +1187,8 @@ if (! function_exists('link_compare')) {
  */
 function link_compare($a, $b) {
        return (strcasecmp(normalise_link($a), normalise_link($b)) === 0);
-}}
+}
+
 
 /**
  * @brief Find any non-embedded images in private items and add redir links to them
@@ -1274,11 +1214,15 @@ function redir_private_images($a, &$item)
        }
 }
 
-function put_item_in_cache(&$item, $update = false) {
-
-       if (($item["rendered-hash"] != hash("md5", $item["body"])) OR ($item["rendered-hash"] == "") OR
-               ($item["rendered-html"] == "") OR get_config("system", "ignore_cache")) {
+function put_item_in_cache(&$item, $update = false)
+{
+       $rendered_hash = defaults($item, 'rendered-hash', '');
 
+       if ($rendered_hash == ''
+               || $item["rendered-html"] == ""
+               || $rendered_hash != hash("md5", $item["body"])
+               || Config::get("system", "ignore_cache")
+       ) {
                // The function "redir_private_images" changes the body.
                // I'm not sure if we should store it permanently, so we save the old value.
                $body = $item["body"];
@@ -1290,20 +1234,16 @@ function put_item_in_cache(&$item, $update = false) {
                $item["rendered-hash"] = hash("md5", $item["body"]);
                $item["body"] = $body;
 
-               if ($update AND ($item["id"] != 0)) {
-                       q("UPDATE `item` SET `rendered-html` = '%s', `rendered-hash` = '%s' WHERE `id` = %d",
-                               dbesc($item["rendered-html"]), dbesc($item["rendered-hash"]), intval($item["id"]));
+               if ($update && ($item["id"] > 0)) {
+                       dba::update('item', ['rendered-html' => $item["rendered-html"], 'rendered-hash' => $item["rendered-hash"]],
+                                       ['id' => $item["id"]], false);
                }
        }
 }
 
-// Given an item array, convert the body element from bbcode to html and add smilie icons.
-// If attach is true, also add icons for item attachments
-
-if (! function_exists('prepare_body')) {
 /**
- * Given an item array, convert the body element from bbcode to html and add smilie icons.
- * If attach is true, also add icons for item attachments
+ * @brief Given an item array, convert the body element from bbcode to html and add smilie icons.
+ * If attach is true, also add icons for item attachments.
  *
  * @param array $item
  * @param boolean $attach
@@ -1317,23 +1257,36 @@ function prepare_body(&$item, $attach = false, $preview = false) {
        $a = get_app();
        call_hooks('prepare_body_init', $item);
 
-       $searchpath = z_root() . "/search?tag=";
+       $searchpath = System::baseUrl() . "/search?tag=";
 
-       $tags = array();
-       $hashtags = array();
-       $mentions = array();
+       $tags = [];
+       $hashtags = [];
+       $mentions = [];
 
-       if (!get_config('system','suppress_tags')) {
-               $taglist = q("SELECT `type`, `term`, `url` FROM `term` WHERE `otype` = %d AND `oid` = %d AND `type` IN (%d, %d) ORDER BY `tid`",
-                               intval(TERM_OBJ_POST), intval($item['id']), intval(TERM_HASHTAG), intval(TERM_MENTION));
+       // In order to provide theme developers more possibilities, event items
+       // are treated differently.
+       if ($item['object-type'] === ACTIVITY_OBJ_EVENT && isset($item['event-id'])) {
+               $ev = format_event_item($item);
+               return $ev;
+       }
 
-               foreach ($taglist as $tag) {
+       if (!Config::get('system','suppress_tags')) {
+               $taglist = dba::p("SELECT `type`, `term`, `url` FROM `term` WHERE `otype` = ? AND `oid` = ? AND `type` IN (?, ?) ORDER BY `tid`",
+                               intval(TERM_OBJ_POST), intval($item['id']), intval(TERM_HASHTAG), intval(TERM_MENTION));
 
+               while ($tag = dba::fetch($taglist)) {
                        if ($tag["url"] == "") {
                                $tag["url"] = $searchpath.strtolower($tag["term"]);
                        }
 
+                       $orig_tag = $tag["url"];
+
+                       $tag["url"] = best_link_url($item, $sp, $tag["url"]);
+
                        if ($tag["type"] == TERM_HASHTAG) {
+                               if ($orig_tag != $tag["url"]) {
+                                       $item['body'] = str_replace($orig_tag, $tag["url"], $item['body']);
+                               }
                                $hashtags[] = "#<a href=\"".$tag["url"]."\" target=\"_blank\">".$tag["term"]."</a>";
                                $prefix = "#";
                        } elseif ($tag["type"] == TERM_MENTION) {
@@ -1342,31 +1295,32 @@ function prepare_body(&$item, $attach = false, $preview = false) {
                        }
                        $tags[] = $prefix."<a href=\"".$tag["url"]."\" target=\"_blank\">".$tag["term"]."</a>";
                }
+               dba::close($taglist);
        }
 
        $item['tags'] = $tags;
        $item['hashtags'] = $hashtags;
        $item['mentions'] = $mentions;
 
-       // Update the cached values if there is no "zrl=..." on the links
-       $update = (!local_user() and !remote_user() and ($item["uid"] == 0));
+       // Update the cached values if there is no "zrl=..." on the links.
+       $update = (!local_user() && !remote_user() && ($item["uid"] == 0));
 
-       // Or update it if the current viewer is the intented viewer
-       if (($item["uid"] == local_user()) AND ($item["uid"] != 0)) {
+       // Or update it if the current viewer is the intented viewer.
+       if (($item["uid"] == local_user()) && ($item["uid"] != 0)) {
                $update = true;
        }
 
        put_item_in_cache($item, $update);
        $s = $item["rendered-html"];
 
-       $prep_arr = array('item' => $item, 'html' => $s, 'preview' => $preview);
+       $prep_arr = ['item' => $item, 'html' => $s, 'preview' => $preview];
        call_hooks('prepare_body', $prep_arr);
        $s = $prep_arr['html'];
 
        if (! $attach) {
-               // Replace the blockquotes with quotes that are used in mails
+               // Replace the blockquotes with quotes that are used in mails.
                $mailquote = '<blockquote type="cite" class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">';
-               $s = str_replace(array('<blockquote>', '<blockquote class="spoiler">', '<blockquote class="author">'), array($mailquote, $mailquote, $mailquote), $s);
+               $s = str_replace(['<blockquote>', '<blockquote class="spoiler">', '<blockquote class="author">'], [$mailquote, $mailquote, $mailquote], $s);
                return $s;
        }
 
@@ -1374,11 +1328,10 @@ function prepare_body(&$item, $attach = false, $preview = false) {
        $vhead = false;
        $arr = explode('[/attach],', $item['attach']);
        if (count($arr)) {
-               $as .= '<div class="body-attach">';
                foreach ($arr as $r) {
                        $matches = false;
                        $icon = '';
-                       $cnt = preg_match_all('|\[attach\]href=\"(.*?)\" length=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"|',$r,$matches, PREG_SET_ORDER);
+                       $cnt = preg_match_all('|\[attach\]href=\"(.*?)\" length=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"|',$r ,$matches, PREG_SET_ORDER);
                        if ($cnt) {
                                foreach ($matches as $mtch) {
                                        $mime = $mtch[3];
@@ -1392,72 +1345,60 @@ function prepare_body(&$item, $attach = false, $preview = false) {
                                        if (strpos($mime, 'video') !== false) {
                                                if (!$vhead) {
                                                        $vhead = true;
-                                                       $a->page['htmlhead'] .= replace_macros(get_markup_template('videos_head.tpl'), array(
-                                                               '$baseurl' => z_root(),
-                                                       ));
-                                                       $a->page['end'] .= replace_macros(get_markup_template('videos_end.tpl'), array(
-                                                               '$baseurl' => z_root(),
-                                                       ));
+                                                       $a->page['htmlhead'] .= replace_macros(get_markup_template('videos_head.tpl'), [
+                                                               '$baseurl' => System::baseUrl(),
+                                                       ]);
+                                                       $a->page['end'] .= replace_macros(get_markup_template('videos_end.tpl'), [
+                                                               '$baseurl' => System::baseUrl(),
+                                                       ]);
                                                }
 
                                                $id = end(explode('/', $the_url));
-                                               $as .= replace_macros(get_markup_template('video_top.tpl'), array(
-                                                       '$video' => array(
+                                               $as .= replace_macros(get_markup_template('video_top.tpl'), [
+                                                       '$video' => [
                                                                'id'     => $id,
                                                                'title'  => t('View Video'),
                                                                'src'    => $the_url,
                                                                'mime'   => $mime,
-                                                       ),
-                                               ));
+                                                       ],
+                                               ]);
                                        }
 
-                                       $filetype = strtolower(substr( $mime, 0, strpos($mime,'/') ));
+                                       $filetype = strtolower(substr($mime, 0, strpos($mime, '/')));
                                        if ($filetype) {
-                                               $filesubtype = strtolower(substr( $mime, strpos($mime,'/') + 1 ));
+                                               $filesubtype = strtolower(substr($mime, strpos($mime, '/') + 1));
                                                $filesubtype = str_replace('.', '-', $filesubtype);
                                        } else {
                                                $filetype = 'unkn';
                                                $filesubtype = 'unkn';
                                        }
 
-                                       $icon = '<div class="attachtype icon s22 type-' . $filetype . ' subtype-' . $filesubtype . '"></div>';
-                                       /*$icontype = strtolower(substr($mtch[3],0,strpos($mtch[3],'/')));
-                                       switch($icontype) {
-                                               case 'video':
-                                               case 'audio':
-                                               case 'image':
-                                               case 'text':
-                                                       $icon = '<div class="attachtype icon s22 type-' . $icontype . '"></div>';
-                                                       break;
-                                               default:
-                                                       $icon = '<div class="attachtype icon s22 type-unkn"></div>';
-                                                       break;
-                                       }*/
-
                                        $title = ((strlen(trim($mtch[4]))) ? escape_tags(trim($mtch[4])) : escape_tags($mtch[1]));
                                        $title .= ' ' . $mtch[2] . ' ' . t('bytes');
 
+                                       $icon = '<div class="attachtype icon s22 type-' . $filetype . ' subtype-' . $filesubtype . '"></div>';
                                        $as .= '<a href="' . strip_tags($the_url) . '" title="' . $title . '" class="attachlink" target="_blank" >' . $icon . '</a>';
                                }
                        }
                }
-               $as .= '<div class="clear"></div></div>';
        }
-       $s = $s . $as;
+       if ($as != '') {
+               $s .= '<div class="body-attach">'.$as.'<div class="clear"></div></div>';
+       }
 
-       // map
+       // Map.
        if (strpos($s, '<div class="map">') !== false && x($item, 'coord')) {
-               $x = generate_map(trim($item['coord']));
+               $x = Map::byCoordinates(trim($item['coord']));
                if ($x) {
-                       $s = preg_replace('/\<div class\=\"map\"\>/','$0' . $x,$s);
+                       $s = preg_replace('/\<div class\=\"map\"\>/', '$0' . $x, $s);
                }
        }
 
 
-       // Look for spoiler
+       // Look for spoiler.
        $spoilersearch = '<blockquote class="spoiler">';
 
-       // Remove line breaks before the spoiler
+       // Remove line breaks before the spoiler.
        while ((strpos($s, "\n" . $spoilersearch) !== false)) {
                $s = str_replace("\n" . $spoilersearch, $spoilersearch, $s);
        }
@@ -1473,7 +1414,7 @@ function prepare_body(&$item, $attach = false, $preview = false) {
                $s = substr($s, 0, $pos) . $spoilerreplace . substr($s, $pos + strlen($spoilersearch));
        }
 
-       // Look for quote with author
+       // Look for quote with author.
        $authorsearch = '<blockquote class="author">';
 
        while ((strpos($s, $authorsearch) !== false)) {
@@ -1484,25 +1425,23 @@ function prepare_body(&$item, $attach = false, $preview = false) {
                $s = substr($s, 0, $pos) . $authorreplace . substr($s, $pos + strlen($authorsearch));
        }
 
-       // replace friendica image url size with theme preference
+       // Replace friendica image url size with theme preference.
        if (x($a->theme_info, 'item_image_size')){
                $ps = $a->theme_info['item_image_size'];
                $s = preg_replace('|(<img[^>]+src="[^"]+/photo/[0-9a-f]+)-[0-9]|', "$1-" . $ps, $s);
        }
 
-       $prep_arr = array('item' => $item, 'html' => $s);
+       $prep_arr = ['item' => $item, 'html' => $s];
        call_hooks('prepare_body_final', $prep_arr);
 
        return $prep_arr['html'];
-}}
-
+}
 
-if (! function_exists('prepare_text')) {
 /**
- * Given a text string, convert from bbcode to html and add smilie icons.
+ * @brief Given a text string, convert from bbcode to html and add smilie icons.
  *
- * @param string $text
- * @return string
+ * @param string $text String with bbcode.
+ * @return string Formattet HTML.
  */
 function prepare_text($text) {
 
@@ -1515,9 +1454,7 @@ function prepare_text($text) {
        }
 
        return trim($s);
-}}
-
-
+}
 
 /**
  * return array with details for categories and folders for an item
@@ -1546,24 +1483,23 @@ function prepare_text($text) {
  *       ]
  *  ]
  */
-function get_cats_and_terms($item) {
-
-       $a = get_app();
-       $categories = array();
-       $folders = array();
+function get_cats_and_terms($item)
+{
+       $categories = [];
+       $folders = [];
 
        $matches = false;
        $first = true;
        $cnt = preg_match_all('/<(.*?)>/', $item['file'], $matches, PREG_SET_ORDER);
        if ($cnt) {
                foreach ($matches as $mtch) {
-                       $categories[] = array(
+                       $categories[] = [
                                'name' => xmlify(file_tag_decode($mtch[1])),
                                'url' =>  "#",
                                'removeurl' => ((local_user() == $item['uid'])?'filerm/' . $item['id'] . '?f=&cat=' . xmlify(file_tag_decode($mtch[1])):""),
                                'first' => $first,
                                'last' => false
-                       );
+                       ];
                        $first = false;
                }
        }
@@ -1578,13 +1514,13 @@ function get_cats_and_terms($item) {
                $cnt = preg_match_all('/\[(.*?)\]/', $item['file'], $matches, PREG_SET_ORDER);
                if ($cnt) {
                        foreach ($matches as $mtch) {
-                               $folders[] = array(
+                               $folders[] = [
                                        'name' => xmlify(file_tag_decode($mtch[1])),
                                        'url' =>  "#",
                                        'removeurl' => ((local_user() == $item['uid']) ? 'filerm/' . $item['id'] . '?f=&term=' . xmlify(file_tag_decode($mtch[1])) : ""),
                                        'first' => $first,
                                        'last' => false
-                               );
+                               ];
                                $first = false;
                        }
                }
@@ -1594,10 +1530,10 @@ function get_cats_and_terms($item) {
                $folders[count($folders) - 1]['last'] = true;
        }
 
-       return array($categories, $folders);
+       return [$categories, $folders];
 }
 
-if (! function_exists('get_plink')) {
+
 /**
  * get private link for item
  * @param array $item
@@ -1607,13 +1543,13 @@ function get_plink($item) {
        $a = get_app();
 
        if ($a->user['nickname'] != "") {
-               $ret = array(
+               $ret = [
                                //'href' => "display/" . $a->user['nickname'] . "/" . $item['id'],
                                'href' => "display/" . $item['guid'],
                                'orig' => "display/" . $item['guid'],
                                'title' => t('View on separate page'),
                                'orig_title' => t('view on separate page'),
-                       );
+                       ];
 
                if (x($item, 'plink')) {
                        $ret["href"] = $a->remove_baseurl($item['plink']);
@@ -1621,19 +1557,19 @@ function get_plink($item) {
                }
 
        } elseif (x($item, 'plink') && ($item['private'] != 1)) {
-               $ret = array(
+               $ret = [
                                'href' => $item['plink'],
                                'orig' => $item['plink'],
                                'title' => t('link to source'),
-                       );
+                       ];
        } else {
-               $ret = array();
+               $ret = [];
        }
 
        return $ret;
-}}
+}
+
 
-if (! function_exists('unamp')) {
 /**
  * replace html amp entity with amp char
  * @param string $s
@@ -1641,23 +1577,23 @@ if (! function_exists('unamp')) {
  */
 function unamp($s) {
        return str_replace('&amp;', '&', $s);
-}}
+}
 
 
-if (! function_exists('return_bytes')) {
 /**
  * return number of bytes in size (K, M, G)
  * @param string $size_str
  * @return number
  */
-function return_bytes ($size_str) {
+function return_bytes($size_str) {
        switch (substr ($size_str, -1)) {
                case 'M': case 'm': return (int)$size_str * 1048576;
                case 'K': case 'k': return (int)$size_str * 1024;
                case 'G': case 'g': return (int)$size_str * 1073741824;
                default: return $size_str;
        }
-}}
+}
+
 
 /**
  * @return string
@@ -1669,10 +1605,10 @@ function generate_user_guid() {
                $x = q("SELECT `uid` FROM `user` WHERE `guid` = '%s' LIMIT 1",
                        dbesc($guid)
                );
-               if (! dbm::is_result($x)) {
+               if (! DBM::is_result($x)) {
                        $found = false;
                }
-       } while ($found == true );
+       } while ($found == true);
 
        return $guid;
 }
@@ -1725,73 +1661,6 @@ function base64url_decode($s) {
 }
 
 
-if (!function_exists('str_getcsv')) {
-       /**
-        * Parse csv string
-        *
-        * @param string $input
-        * @param string $delimiter
-        * @param string $enclosure
-        * @param string $escape
-        * @param string $eol
-        * @return boolean|array False on error, otherwise array[row][column]
-        */
-function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\', $eol = '\n') {
-       if (is_string($input) && !empty($input)) {
-               $output = array();
-               $tmp    = preg_split("/".$eol."/",$input);
-               if (is_array($tmp) && !empty($tmp)) {
-                       while (list($line_num, $line) = each($tmp)) {
-                               if (preg_match("/".$escape.$enclosure."/",$line)) {
-                                       while ($strlen = strlen($line)) {
-                                               $pos_delimiter       = strpos($line,$delimiter);
-                                               $pos_enclosure_start = strpos($line,$enclosure);
-                                               if (
-                                                       is_int($pos_delimiter) && is_int($pos_enclosure_start)
-                                                       && ($pos_enclosure_start < $pos_delimiter)
-                                                       ) {
-                                                       $enclosed_str = substr($line,1);
-                                                       $pos_enclosure_end = strpos($enclosed_str,$enclosure);
-                                                       $enclosed_str = substr($enclosed_str,0,$pos_enclosure_end);
-                                                       $output[$line_num][] = $enclosed_str;
-                                                       $offset = $pos_enclosure_end+3;
-                                               } else {
-                                                       if (empty($pos_delimiter) && empty($pos_enclosure_start)) {
-                                                               $output[$line_num][] = substr($line,0);
-                                                               $offset = strlen($line);
-                                                       } else {
-                                                               $output[$line_num][] = substr($line,0,$pos_delimiter);
-                                                               $offset = (
-                                                                       !empty($pos_enclosure_start)
-                                                                       && ($pos_enclosure_start < $pos_delimiter)
-                                                                       )
-                                                                       ?$pos_enclosure_start
-                                                                       :$pos_delimiter+1;
-                                                       }
-                                               }
-                                               $line = substr($line,$offset);
-                                       }
-                               } else {
-                                       $line = preg_split("/".$delimiter."/",$line);
-
-                                       /*
-                                        * Validating against pesky extra line breaks creating false rows.
-                                        */
-                                       if (is_array($line) && !empty($line[0])) {
-                                               $output[$line_num] = $line;
-                               }
-                               }
-                       }
-                       return $output;
-               } else {
-               return false;
-               }
-       } else {
-               return false;
-       }
-}
-}
-
 /**
  * return div element with class 'clear'
  * @return string
@@ -1847,7 +1716,7 @@ function array_xmlify($val){
 
 
 /**
- * transorm link href and img src from relative to absolute
+ * transform link href and img src from relative to absolute
  *
  * @param string $text
  * @param string $base base url
@@ -1911,19 +1780,19 @@ function item_post_type($item) {
 // To do this we need to escape these characters if they appear in our tag.
 
 function file_tag_encode($s) {
-       return str_replace(array('<','>','[',']'),array('%3c','%3e','%5b','%5d'),$s);
+       return str_replace(['<','>','[',']'],['%3c','%3e','%5b','%5d'],$s);
 }
 
 function file_tag_decode($s) {
-       return str_replace(array('%3c', '%3e', '%5b', '%5d'), array('<', '>', '[', ']'), $s);
+       return str_replace(['%3c', '%3e', '%5b', '%5d'], ['<', '>', '[', ']'], $s);
 }
 
 function file_tag_file_query($table,$s,$type = 'file') {
 
        if ($type == 'file') {
-               $str = preg_quote( '[' . str_replace('%', '%%', file_tag_encode($s)) . ']' );
+               $str = preg_quote('[' . str_replace('%', '%%', file_tag_encode($s)) . ']');
        } else {
-               $str = preg_quote( '<' . str_replace('%', '%%', file_tag_encode($s)) . '>' );
+               $str = preg_quote('<' . str_replace('%', '%%', file_tag_encode($s)) . '>');
        }
        return " AND " . (($table) ? dbesc($table) . '.' : '') . "file regexp '" . dbesc($str) . "' ";
 }
@@ -1975,20 +1844,20 @@ function file_tag_update_pconfig($uid, $file_old, $file_new, $type = 'file') {
        // $file_old - categories previously associated with an item
        // $file_new - new list of categories for an item
 
-       if (! intval($uid))
+       if (!intval($uid)) {
                return false;
-
-       if ($file_old == $file_new)
+       }
+       if ($file_old == $file_new) {
                return true;
+       }
 
-       $saved = get_pconfig($uid,'system','filetags');
+       $saved = PConfig::get($uid, 'system', 'filetags');
        if (strlen($saved)) {
                if ($type == 'file') {
                        $lbracket = '[';
                        $rbracket = ']';
                        $termtype = TERM_FILE;
-               }
-               else {
+               } else {
                        $lbracket = '<';
                        $rbracket = '>';
                        $termtype = TERM_CATEGORY;
@@ -1997,7 +1866,7 @@ function file_tag_update_pconfig($uid, $file_old, $file_new, $type = 'file') {
                $filetags_updated = $saved;
 
                // check for new tags to be added as filetags in pconfig
-               $new_tags = array();
+               $new_tags = [];
                $check_new_tags = explode(",",file_tag_file_to_list($file_new,$type));
 
                foreach ($check_new_tags as $tag) {
@@ -2008,7 +1877,7 @@ function file_tag_update_pconfig($uid, $file_old, $file_new, $type = 'file') {
                $filetags_updated .= file_tag_list_to_file(implode(",",$new_tags),$type);
 
                // check for deleted tags to be removed from filetags in pconfig
-               $deleted_tags = array();
+               $deleted_tags = [];
                $check_deleted_tags = explode(",",file_tag_file_to_list($file_old,$type));
 
                foreach ($check_deleted_tags as $tag) {
@@ -2023,37 +1892,34 @@ function file_tag_update_pconfig($uid, $file_old, $file_new, $type = 'file') {
                                intval($termtype),
                                intval($uid));
 
-                       if (dbm::is_result($r)) {
+                       if (DBM::is_result($r)) {
                                unset($deleted_tags[$key]);
-                       }
-                       else {
+                       } else {
                                $filetags_updated = str_replace($lbracket . file_tag_encode($tag) . $rbracket,'',$filetags_updated);
                        }
                }
 
                if ($saved != $filetags_updated) {
-                       set_pconfig($uid, 'system', 'filetags', $filetags_updated);
+                       PConfig::set($uid, 'system', 'filetags', $filetags_updated);
                }
                return true;
+       } elseif (strlen($file_new)) {
+               PConfig::set($uid, 'system', 'filetags', $file_new);
        }
-       else
-               if (strlen($file_new)) {
-                       set_pconfig($uid, 'system', 'filetags', $file_new);
-               }
-               return true;
+       return true;
 }
 
-function file_tag_save_file($uid, $item, $file) {
-       require_once "include/files.php";
-
-       $result = false;
-       if (! intval($uid))
+function file_tag_save_file($uid, $item, $file)
+{
+       if (! intval($uid)) {
                return false;
+       }
+
        $r = q("SELECT `file` FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
                intval($item),
                intval($uid)
        );
-       if (dbm::is_result($r)) {
+       if (DBM::is_result($r)) {
                if (! stristr($r[0]['file'],'[' . file_tag_encode($file) . ']')) {
                        q("UPDATE `item` SET `file` = '%s' WHERE `id` = %d AND `uid` = %d",
                                dbesc($r[0]['file'] . '[' . file_tag_encode($file) . ']'),
@@ -2062,23 +1928,22 @@ function file_tag_save_file($uid, $item, $file) {
                        );
                }
 
-               create_files_from_item($item);
+               Term::createFromItem($item);
 
-               $saved = get_pconfig($uid,'system','filetags');
-               if ((! strlen($saved)) || (! stristr($saved, '[' . file_tag_encode($file) . ']'))) {
-                       set_pconfig($uid, 'system', 'filetags', $saved . '[' . file_tag_encode($file) . ']');
+               $saved = PConfig::get($uid, 'system', 'filetags');
+               if (!strlen($saved) || !stristr($saved, '[' . file_tag_encode($file) . ']')) {
+                       PConfig::set($uid, 'system', 'filetags', $saved . '[' . file_tag_encode($file) . ']');
                }
-               info( t('Item filed') );
+               info(t('Item filed'));
        }
        return true;
 }
 
-function file_tag_unsave_file($uid, $item, $file, $cat = false) {
-       require_once "include/files.php";
-
-       $result = false;
-       if (! intval($uid))
+function file_tag_unsave_file($uid, $item, $file, $cat = false)
+{
+       if (! intval($uid)) {
                return false;
+       }
 
        if ($cat == true) {
                $pattern = '<' . file_tag_encode($file) . '>' ;
@@ -2088,12 +1953,11 @@ function file_tag_unsave_file($uid, $item, $file, $cat = false) {
                $termtype = TERM_FILE;
        }
 
-
        $r = q("SELECT `file` FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
                intval($item),
                intval($uid)
        );
-       if (! dbm::is_result($r)) {
+       if (! DBM::is_result($r)) {
                return false;
        }
 
@@ -2103,24 +1967,24 @@ function file_tag_unsave_file($uid, $item, $file, $cat = false) {
                intval($uid)
        );
 
-       create_files_from_item($item);
+       Term::createFromItem($item);
 
        $r = q("SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d",
                dbesc($file),
                intval(TERM_OBJ_POST),
                intval($termtype),
-               intval($uid));
-
-       if (! dbm::is_result($r)) {
-               $saved = get_pconfig($uid,'system','filetags');
-               set_pconfig($uid, 'system', 'filetags', str_replace($pattern, '', $saved));
+               intval($uid)
+       );
+       if (!DBM::is_result($r)) {
+               $saved = PConfig::get($uid, 'system', 'filetags');
+               PConfig::set($uid, 'system', 'filetags', str_replace($pattern, '', $saved));
        }
 
        return true;
 }
 
 function normalise_openid($s) {
-       return trim(str_replace(array('http://', 'https://'), array('', ''), $s), '/');
+       return trim(str_replace(['http://', 'https://'], ['', ''], $s), '/');
 }
 
 
@@ -2159,7 +2023,7 @@ function is_a_date_arg($s) {
 function deindent($text, $chr = "[\t ]", $count = NULL) {
        $lines = explode("\n", $text);
        if (is_null($count)) {
-               $m = array();
+               $m = [];
                $k = 0;
                while ($k < count($lines) && strlen($lines[$k]) == 0) {
                        $k++;
@@ -2175,7 +2039,7 @@ function deindent($text, $chr = "[\t ]", $count = NULL) {
 }
 
 function formatBytes($bytes, $precision = 2) {
-        $units = array('B', 'KB', 'MB', 'GB', 'TB');
+       $units = ['B', 'KB', 'MB', 'GB', 'TB'];
 
        $bytes = max($bytes, 0);
        $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
@@ -2197,16 +2061,14 @@ function formatBytes($bytes, $precision = 2) {
  */
 function format_network_name($network, $url = 0) {
        if ($network != "") {
-               require_once 'include/contact_selectors.php';
                if ($url != "") {
-                       $network_name = '<a href="'.$url.'">'.network_to_name($network, $url)."</a>";
+                       $network_name = '<a href="'.$url.'">'.ContactSelector::networkToName($network, $url)."</a>";
                } else {
-                       $network_name = network_to_name($network);
+                       $network_name = ContactSelector::networkToName($network);
                }
 
                return $network_name;
        }
-
 }
 
 /**
@@ -2225,10 +2087,10 @@ function text_highlight($s, $lang) {
        // Autoload the library to make constants available
        class_exists('Text_Highlighter_Renderer_Html');
 
-       $options = array(
+       $options = [
                'numbers' => HL_NUMBERS_LI,
                'tabsize' => 4,
-       );
+       ];
 
        $tag_added = false;
        $s = trim(html_entity_decode($s, ENT_COMPAT));
@@ -2245,7 +2107,8 @@ function text_highlight($s, $lang) {
        }
 
        $renderer = new Text_Highlighter_Renderer_Html($options);
-       $hl = Text_Highlighter::factory($lang);
+       $factory = new Text_Highlighter();
+       $hl = $factory->factory($lang);
        $hl->setRenderer($renderer);
        $o = $hl->highlight($s);
        $o = str_replace("\n", '', $o);