]> git.mxchange.org Git - friendica.git/blobdiff - include/text.php
Split the name in the hcard
[friendica.git] / include / text.php
index 71a2564405714659f472904c2f1cf1850edd13c4..cbba8d0c5b501065c3ff451e14706be4ec9704a9 100644 (file)
@@ -1,14 +1,20 @@
 <?php
-
+/**
+ * @file include/text.php
+ */
 use Friendica\App;
+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
  *
@@ -24,11 +30,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 +43,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.
  *
@@ -76,12 +83,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.
@@ -90,13 +95,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
@@ -176,13 +177,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 +193,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 +230,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 +251,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);
-}}
+}
 
 
 /**
@@ -360,7 +339,7 @@ function paginate_data(App $a, $count = null) {
        return $data;
 }
 
-if (! function_exists('paginate')) {
+
 /**
  * Automatic pagination.
  *
@@ -382,9 +361,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
@@ -397,9 +376,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
@@ -410,9 +389,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
  *
@@ -434,9 +413,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 +426,9 @@ function sanitise_acl(&$item) {
        } else {
                unset($item);
        }
-}}
+}
 
 
-if (! function_exists('perms2str')) {
 /**
  * Convert an ACL array to a storable string
  *
@@ -473,10 +451,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 +465,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 +474,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', array('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 +496,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 +542,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 +582,9 @@ function get_intltext_template($s) {
                $a->save_timestamp($stamp1, "file");
                return $content;
        }
-}}
+}
+
 
-if (! function_exists('get_markup_template')) {
 /**
  * load template $s
  *
@@ -631,7 +598,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 +607,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 +636,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,9 +656,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();
 
@@ -707,27 +673,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 +717,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 +729,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 +745,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 +752,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 +796,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 +806,7 @@ if (! function_exists('activity_match')) {
  */
 function activity_match($haystack,$needle) {
        return (($haystack === $needle) || ((basename($needle) === $haystack) && strstr($needle, NAMESPACE_ACTIVITY_SCHEMA)));
-}}
+}
 
 
 /**
@@ -918,9 +880,6 @@ function get_tags($string) {
 }
 
 
-//
-
-if (! function_exists('qp')) {
 /**
  * quick and dirty quoted_printable encoding
  *
@@ -929,9 +888,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 +902,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 +919,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,7 +938,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"];
@@ -990,8 +946,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');
@@ -1013,7 +969,8 @@ function contact_block() {
        call_hooks('contact_block_end', $arr);
        return $o;
 
-}}
+}
+
 
 /**
  * @brief Format contacts as picture links or as texxt links
@@ -1075,9 +1032,6 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) {
        ));
 }
 
-
-
-if (! function_exists('search')) {
 /**
  * search box
  *
@@ -1095,7 +1049,7 @@ function search($s, $id = 'search-box', $url = 'search', $save = false, $aside =
                        '$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'),
                );
 
@@ -1105,31 +1059,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
  *
@@ -1139,7 +1088,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;
-}}
+}
 
 
 /**
@@ -1155,72 +1104,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
  *
@@ -1230,11 +1159,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
@@ -1248,7 +1175,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
@@ -1277,7 +1205,7 @@ 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")) {
+               ($item["rendered-html"] == "") || 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.
@@ -1290,20 +1218,16 @@ function put_item_in_cache(&$item, $update = false) {
                $item["rendered-hash"] = hash("md5", $item["body"]);
                $item["body"] = $body;
 
-               if ($update && ($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', array('rendered-html' => $item["rendered-html"], 'rendered-hash' => $item["rendered-hash"]),
+                                       array('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 +1241,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();
 
-       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,16 +1279,17 @@ 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
+       // Or update it if the current viewer is the intented viewer.
        if (($item["uid"] == local_user()) && ($item["uid"] != 0)) {
                $update = true;
        }
@@ -1364,7 +1302,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;
@@ -1377,7 +1315,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];
@@ -1392,10 +1330,10 @@ function prepare_body(&$item, $attach = false, $preview = false) {
                                                if (!$vhead) {
                                                        $vhead = true;
                                                        $a->page['htmlhead'] .= replace_macros(get_markup_template('videos_head.tpl'), array(
-                                                               '$baseurl' => z_root(),
+                                                               '$baseurl' => System::baseUrl(),
                                                        ));
                                                        $a->page['end'] .= replace_macros(get_markup_template('videos_end.tpl'), array(
-                                                               '$baseurl' => z_root(),
+                                                               '$baseurl' => System::baseUrl(),
                                                        ));
                                                }
 
@@ -1410,9 +1348,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';
@@ -1422,14 +1360,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)) {
-                                               $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>';
                                }
                        }
                }
@@ -1438,19 +1370,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);
        }
@@ -1466,7 +1398,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)) {
@@ -1477,7 +1409,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);
@@ -1487,15 +1419,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) {
 
@@ -1508,9 +1438,7 @@ function prepare_text($text) {
        }
 
        return trim($s);
-}}
-
-
+}
 
 /**
  * return array with details for categories and folders for an item
@@ -1590,7 +1518,7 @@ function get_cats_and_terms($item) {
        return array($categories, $folders);
 }
 
-if (! function_exists('get_plink')) {
+
 /**
  * get private link for item
  * @param array $item
@@ -1624,9 +1552,9 @@ function get_plink($item) {
        }
 
        return $ret;
-}}
+}
+
 
-if (! function_exists('unamp')) {
 /**
  * replace html amp entity with amp char
  * @param string $s
@@ -1634,23 +1562,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
@@ -1662,10 +1590,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;
 }
@@ -1718,73 +1646,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
@@ -1840,7 +1701,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
@@ -1914,9 +1775,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) . "' ";
 }
@@ -1968,20 +1829,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;
@@ -2016,24 +1877,21 @@ 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) {
@@ -2046,7 +1904,7 @@ function file_tag_save_file($uid, $item, $file) {
                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) . ']'),
@@ -2057,11 +1915,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;
 }
@@ -2086,7 +1944,7 @@ function file_tag_unsave_file($uid, $item, $file, $cat = false) {
                intval($item),
                intval($uid)
        );
-       if (! dbm::is_result($r)) {
+       if (! DBM::is_result($r)) {
                return false;
        }
 
@@ -2104,9 +1962,9 @@ function file_tag_unsave_file($uid, $item, $file, $cat = false) {
                intval($termtype),
                intval($uid));
 
-       if (! dbm::is_result($r)) {
-               $saved = get_pconfig($uid,'system','filetags');
-               set_pconfig($uid, 'system', 'filetags', str_replace($pattern, '', $saved));
+       if (!DBM::is_result($r)) {
+               $saved = PConfig::get($uid, 'system', 'filetags');
+               PConfig::set($uid, 'system', 'filetags', str_replace($pattern, '', $saved));
        }
 
        return true;