]> git.mxchange.org Git - friendica.git/blobdiff - include/text.php
Merge pull request #4195 from zeroadam/ContactSelector-#3878
[friendica.git] / include / text.php
index c2c6dcdfc992d15f61d94c426559652024475d3b..7ed561bbbbf0d21aae96885e4c85089d1f863dc5 100644 (file)
@@ -1,15 +1,21 @@
 <?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\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
  *
@@ -29,7 +35,7 @@ function replace_macros($s, $r) {
 
        $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();
@@ -38,24 +44,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.
  *
@@ -77,12 +84,10 @@ function notags($string) {
        return str_replace(array("<", ">"), array('[', ']'), $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.
@@ -91,13 +96,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
@@ -177,13 +178,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
@@ -197,7 +194,7 @@ function xmlify($str) {
        for ($x = 0; $x < $len; $x ++) {
                $char = mb_substr($str,$x,1);
 
-               switch( $char ) {
+               switch($char) {
 
                        case "\r" :
                                break;
@@ -234,10 +231,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
@@ -255,25 +252,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);
-}}
+}
 
 
 /**
@@ -361,7 +340,7 @@ function paginate_data(App $a, $count = null) {
        return $data;
 }
 
-if (! function_exists('paginate')) {
+
 /**
  * Automatic pagination.
  *
@@ -383,9 +362,9 @@ function paginate(App $a) {
        $tpl = get_markup_template("paginate.tpl");
        return replace_macros($tpl, array("pager" => $data));
 
-}}
+}
+
 
-if (! function_exists('alt_pager')) {
 /**
  * Alternative pager
  * @param App $a App instance
@@ -398,9 +377,9 @@ function alt_pager(App $a, $i) {
        $tpl = get_markup_template("paginate.tpl");
        return replace_macros($tpl, array('pager' => $data));
 
-}}
+}
+
 
-if (! function_exists('scroll_loader')) {
 /**
  * Loader for infinite scrolling
  * @return string html for loader
@@ -411,9 +390,9 @@ function scroll_loader() {
                '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
  *
@@ -435,9 +414,9 @@ function expand_acl($s) {
                }
        }
        return $ret;
-}}
+}
+
 
-if (! function_exists('sanitise_acl')) {
 /**
  * Wrap ACL elements in angle brackets for storage
  * @param string $item
@@ -448,10 +427,9 @@ function sanitise_acl(&$item) {
        } else {
                unset($item);
        }
-}}
+}
 
 
-if (! function_exists('perms2str')) {
 /**
  * Convert an ACL array to a storable string
  *
@@ -474,10 +452,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
@@ -502,12 +479,9 @@ function item_new_uri($hostname, $uid, $guid = "") {
        } 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
@@ -523,16 +497,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
@@ -570,9 +543,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
@@ -610,9 +583,9 @@ function get_intltext_template($s) {
                $a->save_timestamp($stamp1, "file");
                return $content;
        }
-}}
+}
+
 
-if (! function_exists('get_markup_template')) {
 /**
  * load template $s
  *
@@ -626,7 +599,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();
@@ -635,9 +608,9 @@ function get_markup_template($s, $root = '') {
        $a->save_timestamp($stamp1, "file");
 
        return $template;
-}}
+}
+
 
-if (! function_exists("get_template_file")) {
 /**
  *
  * @param App $a
@@ -664,10 +637,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"
@@ -685,9 +657,9 @@ 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();
 
@@ -702,27 +674,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
@@ -760,7 +730,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.
@@ -776,7 +746,6 @@ function logger($msg, $level = 0) {
  * LOGGER_ALL
  *
  * @global App $a
- * @global dba $db
  * @global array $LOGGER_LEVELS
  * @param string $msg
  * @param int $level
@@ -784,17 +753,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;
@@ -829,7 +797,7 @@ function dlogger($msg, $level = 0) {
        $a->save_timestamp($stamp1, "file");
 }
 
-if (! function_exists('activity_match')) {
+
 /**
  * Compare activity uri. Knows about activity namespace.
  *
@@ -839,7 +807,7 @@ if (! function_exists('activity_match')) {
  */
 function activity_match($haystack,$needle) {
        return (($haystack === $needle) || ((basename($needle) === $haystack) && strstr($needle, NAMESPACE_ACTIVITY_SCHEMA)));
-}}
+}
 
 
 /**
@@ -913,9 +881,6 @@ function get_tags($string) {
 }
 
 
-//
-
-if (! function_exists('qp')) {
 /**
  * quick and dirty quoted_printable encoding
  *
@@ -924,9 +889,9 @@ if (! function_exists('qp')) {
  */
 function qp($s) {
        return str_replace("%", "=", rawurlencode($s));
-}}
+}
+
 
-if (! function_exists('contact_block')) {
 /**
  * Get html for contact block.
  *
@@ -938,15 +903,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`
@@ -958,10 +920,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 {
@@ -977,7 +939,7 @@ function contact_block() {
                                dbesc(NETWORK_DIASPORA),
                                intval($shown)
                );
-               if (dbm::is_result($r)) {
+               if (DBM::is_result($r)) {
                        $contacts = array();
                        foreach ($r AS $contact) {
                                $contacts[] = $contact["id"];
@@ -985,8 +947,8 @@ function contact_block() {
                        $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);
+                       if (DBM::is_result($r)) {
+                               $contacts = sprintf(tt('%d Contact','%d Contacts', $total),$total);
                                $micropro = Array();
                                foreach ($r as $rr) {
                                        $micropro[] = micropro($rr,true,'mpfriend');
@@ -1008,7 +970,8 @@ function contact_block() {
        call_hooks('contact_block_end', $arr);
        return $o;
 
-}}
+}
+
 
 /**
  * @brief Format contacts as picture links or as texxt links
@@ -1032,7 +995,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"];
        }
 
@@ -1041,7 +1004,6 @@ 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;
@@ -1058,7 +1020,7 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) {
        }
 
        return replace_macros(get_markup_template(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'),array(
-               '$click' => (($contact['click']) ? $contact['click'] : ''),
+               '$click' => defaults($contact, 'click', ''),
                '$class' => $class,
                '$url' => $url,
                '$photo' => proxy_url($contact['thumb'], false, PROXY_SIZE_THUMB),
@@ -1070,9 +1032,6 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) {
        ));
 }
 
-
-
-if (! function_exists('search')) {
 /**
  * search box
  *
@@ -1082,15 +1041,13 @@ if (! function_exists('search')) {
  * @param boolean $savedsearch show save search button
  */
 function search($s, $id = 'search-box', $url = 'search', $save = false, $aside = true) {
-       $a = get_app();
-
        $values = array(
                        '$s' => htmlspecialchars($s),
                        '$id' => $id,
                        '$action_url' => $url,
                        '$search_label' => t('Search'),
                        '$save_label' => t('Save'),
-                       '$savedsearch' => feature_enabled(local_user(),'savedsearch'),
+                       '$savedsearch' => Feature::isEnabled(local_user(),'savedsearch'),
                        '$search_hint' => t('@name, !forum, #tags, content'),
                );
 
@@ -1100,31 +1057,26 @@ function search($s, $id = 'search-box', $url = 'search', $save = false, $aside =
                                        t("Tags"),
                                        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
  *
@@ -1134,7 +1086,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;
-}}
+}
 
 
 /**
@@ -1150,72 +1102,52 @@ function get_poke_verbs() {
        // 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')),
+               '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')),
        );
        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() {
+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')),
+               $s);
 
-       $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'),
-       );
+       $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);
 
-       call_hooks('mood_verbs', $arr);
-       return $arr;
+       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(array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'),
+               array(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(array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov','Dec'),
+               array(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
  *
@@ -1225,11 +1157,9 @@ if (! function_exists('normalise_link')) {
 function normalise_link($url) {
        $ret = str_replace(array('https:', '//www.'), array('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
@@ -1243,7 +1173,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
@@ -1269,11 +1200,15 @@ function redir_private_images($a, &$item)
        }
 }
 
-function put_item_in_cache(&$item, $update = false) {
-
-       if (($item["rendered-hash"] != hash("md5", $item["body"])) || ($item["rendered-hash"] == "") ||
-               ($item["rendered-html"] == "") || 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"];
@@ -1292,13 +1227,9 @@ function put_item_in_cache(&$item, $update = 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
@@ -1318,7 +1249,14 @@ function prepare_body(&$item, $attach = false, $preview = false) {
        $hashtags = array();
        $mentions = array();
 
-       if (!get_config('system','suppress_tags')) {
+       // 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;
+       }
+
+       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));
 
@@ -1350,10 +1288,10 @@ function prepare_body(&$item, $attach = false, $preview = false) {
        $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
+       // Or update it if the current viewer is the intented viewer.
        if (($item["uid"] == local_user()) && ($item["uid"] != 0)) {
                $update = true;
        }
@@ -1366,7 +1304,7 @@ function prepare_body(&$item, $attach = false, $preview = false) {
        $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);
                return $s;
@@ -1379,7 +1317,7 @@ function prepare_body(&$item, $attach = false, $preview = false) {
                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];
@@ -1412,9 +1350,9 @@ function prepare_body(&$item, $attach = false, $preview = false) {
                                                ));
                                        }
 
-                                       $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';
@@ -1424,15 +1362,8 @@ function prepare_body(&$item, $attach = false, $preview = false) {
                                        $title = ((strlen(trim($mtch[4]))) ? escape_tags(trim($mtch[4])) : escape_tags($mtch[1]));
                                        $title .= ' ' . $mtch[2] . ' ' . t('bytes');
 
-                                       if (($filetype == 'image') AND ($item['network'] == NETWORK_OSTATUS)) {
-                                               /// @todo Respect the spoiler for mastodon
-                                               $icon = '<img class="attached" src="'.$the_url.'" alt="" title="'.$title.'">';
-                                               $s .= '<br><a href="' . strip_tags($the_url) . '" title="' . $title . '" class="attached" target="_blank" >' . $icon . '</a>';
-                                       } else {
-                                               $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>';
-                                       }
-
+                                       $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>';
                                }
                        }
                }
@@ -1441,19 +1372,19 @@ function prepare_body(&$item, $attach = false, $preview = false) {
                $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);
        }
@@ -1469,7 +1400,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)) {
@@ -1480,7 +1411,7 @@ 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);
@@ -1490,15 +1421,13 @@ function prepare_body(&$item, $attach = false, $preview = false) {
        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) {
 
@@ -1511,9 +1440,7 @@ function prepare_text($text) {
        }
 
        return trim($s);
-}}
-
-
+}
 
 /**
  * return array with details for categories and folders for an item
@@ -1542,9 +1469,8 @@ function prepare_text($text) {
  *       ]
  *  ]
  */
-function get_cats_and_terms($item) {
-
-       $a = get_app();
+function get_cats_and_terms($item)
+{
        $categories = array();
        $folders = array();
 
@@ -1593,7 +1519,7 @@ function get_cats_and_terms($item) {
        return array($categories, $folders);
 }
 
-if (! function_exists('get_plink')) {
+
 /**
  * get private link for item
  * @param array $item
@@ -1627,9 +1553,9 @@ function get_plink($item) {
        }
 
        return $ret;
-}}
+}
+
 
-if (! function_exists('unamp')) {
 /**
  * replace html amp entity with amp char
  * @param string $s
@@ -1637,23 +1563,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
@@ -1665,7 +1591,7 @@ 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);
@@ -1721,73 +1647,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
@@ -1843,7 +1702,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
@@ -1917,9 +1776,9 @@ function file_tag_decode($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) . "' ";
 }
@@ -1971,20 +1830,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;
@@ -2019,37 +1878,35 @@ 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))
+       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) . ']'),
@@ -2060,11 +1917,11 @@ function file_tag_save_file($uid, $item, $file) {
 
                create_files_from_item($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;
 }
@@ -2072,9 +1929,9 @@ function file_tag_save_file($uid, $item, $file) {
 function file_tag_unsave_file($uid, $item, $file, $cat = false) {
        require_once "include/files.php";
 
-       $result = false;
-       if (! intval($uid))
+       if (! intval($uid)) {
                return false;
+       }
 
        if ($cat == true) {
                $pattern = '<' . file_tag_encode($file) . '>' ;
@@ -2084,12 +1941,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;
        }
 
@@ -2105,11 +1961,11 @@ function file_tag_unsave_file($uid, $item, $file, $cat = false) {
                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;
@@ -2171,7 +2027,7 @@ function deindent($text, $chr = "[\t ]", $count = NULL) {
 }
 
 function formatBytes($bytes, $precision = 2) {
-        $units = array('B', 'KB', 'MB', 'GB', 'TB');
+       $units = array('B', 'KB', 'MB', 'GB', 'TB');
 
        $bytes = max($bytes, 0);
        $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
@@ -2193,16 +2049,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;
        }
-
 }
 
 /**