]> git.mxchange.org Git - friendica.git/blobdiff - include/text.php
Merge pull request #4243 from MrPetovan/task/switch-to-array-new-style
[friendica.git] / include / text.php
index 9dc3c871fb03be2b650c3e8cdcf9056e27a638d6..5ce0b850efdab64f3632782aab356d3c913d6a90 100644 (file)
@@ -1,18 +1,23 @@
 <?php
-
+/**
+ * @file include/text.php
+ */
 use Friendica\App;
+use Friendica\Content\ContactSelector;
+use Friendica\Content\Feature;
+use Friendica\Content\Smilies;
 use Friendica\Core\Config;
 use Friendica\Core\PConfig;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
+use Friendica\Model\Profile;
+use Friendica\Model\Term;
+use Friendica\Util\Map;
 
-require_once "include/template_processor.php";
 require_once "include/friendica_smarty.php";
-require_once "include/Smilies.php";
-require_once "include/map.php";
 require_once "mod/proxy.php";
+require_once "include/conversation.php";
 
-if (! function_exists('replace_macros')) {
 /**
  * This is our template processor
  *
@@ -32,7 +37,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();
@@ -41,24 +46,25 @@ function replace_macros($s, $r) {
        $a->save_timestamp($stamp1, "rendering");
 
        return $output;
-}}
+}
 
+/**
+ * @brief Generates a pseudo-random string of hexadecimal characters
+ *
+ * @param int $size
+ * @return string
+ */
+function random_string($size = 64)
+{
+       $byte_size = ceil($size / 2);
 
-// random string, there are 86 characters max in text mode, 128 for hex
-// output is urlsafe
+       $bytes = random_bytes($byte_size);
 
-define('RANDOM_STRING_HEX',  0x00 );
-define('RANDOM_STRING_TEXT', 0x01 );
+       $return = substr(bin2hex($bytes), 0, $size);
 
-if (! function_exists('random_string')) {
-function random_string($size = 64, $type = RANDOM_STRING_HEX) {
-       // generate a bit of entropy and run it through the whirlpool
-       $s = hash('whirlpool', (string) rand() . uniqid(rand(),true) . (string) rand(), (($type == RANDOM_STRING_TEXT) ? true : false));
-       $s = (($type == RANDOM_STRING_TEXT) ? str_replace("\n", "", base64url_encode($s,true)) : $s);
-       return(substr($s,0,$size));
-}}
+       return $return;
+}
 
-if (! function_exists('notags')) {
 /**
  * This is our primary input filter.
  *
@@ -77,15 +83,13 @@ if (! function_exists('notags')) {
  * @return string Filtered string
  */
 function notags($string) {
-       return str_replace(array("<", ">"), array('[', ']'), $string);
+       return str_replace(["<", ">"], ['[', ']'], $string);
 
 //  High-bit filter no longer used
-//     return(str_replace(array("<",">","\xBA","\xBC","\xBE"), array('[',']','','',''), $string));
-}}
-
+//     return str_replace(array("<",">","\xBA","\xBC","\xBE"), array('[',']','','',''), $string);
+}
 
 
-if (! function_exists('escape_tags')) {
 /**
  * use this on "body" or "content" input where angle chars shouldn't be removed,
  * and allow them to be safely displayed.
@@ -94,13 +98,9 @@ if (! function_exists('escape_tags')) {
  */
 function escape_tags($string) {
        return htmlspecialchars($string, ENT_COMPAT, 'UTF-8', false);
-}}
-
+}
 
-// generate a string that's random, but usually pronounceable.
-// used to generate initial passwords
 
-if (! function_exists('autoname')) {
 /**
  * generate a string that's random, but usually pronounceable.
  * used to generate initial passwords
@@ -113,12 +113,12 @@ function autoname($len) {
                return '';
        }
 
-       $vowels = array('a','a','ai','au','e','e','e','ee','ea','i','ie','o','ou','u');
+       $vowels = ['a','a','ai','au','e','e','e','ee','ea','i','ie','o','ou','u'];
        if (mt_rand(0, 5) == 4) {
                $vowels[] = 'y';
        }
 
-       $cons = array(
+       $cons = [
                        'b','bl','br',
                        'c','ch','cl','cr',
                        'd','dr',
@@ -139,13 +139,13 @@ function autoname($len) {
                        'w','wh',
                        'x',
                        'z','zh'
-                       );
+                       ];
 
-       $midcons = array('ck','ct','gn','ld','lf','lm','lt','mb','mm', 'mn','mp',
-                               'nd','ng','nk','nt','rn','rp','rt');
+       $midcons = ['ck','ct','gn','ld','lf','lm','lt','mb','mm', 'mn','mp',
+                               'nd','ng','nk','nt','rn','rp','rt'];
 
-       $noend = array('bl', 'br', 'cl','cr','dr','fl','fr','gl','gr',
-                               'kh', 'kl','kr','mn','pl','pr','rh','tr','qu','wh');
+       $noend = ['bl', 'br', 'cl','cr','dr','fl','fr','gl','gr',
+                               'kh', 'kl','kr','mn','pl','pr','rh','tr','qu','wh'];
 
        $start = mt_rand(0,2);
        if ($start == 0) {
@@ -180,13 +180,9 @@ function autoname($len) {
                $word = substr($word, 0, -1);
        }
        return $word;
-}}
-
+}
 
-// escape text ($str) for XML transport
-// returns escaped text.
 
-if (! function_exists('xmlify')) {
 /**
  * escape text ($str) for XML transport
  * @param string $str
@@ -200,7 +196,7 @@ function xmlify($str) {
        for ($x = 0; $x < $len; $x ++) {
                $char = mb_substr($str,$x,1);
 
-               switch( $char ) {
+               switch($char) {
 
                        case "\r" :
                                break;
@@ -237,10 +233,10 @@ function xmlify($str) {
        $buffer = htmlspecialchars($str, ENT_QUOTES, "UTF-8");
        $buffer = trim($buffer);
 
-       return($buffer);
-}}
+       return $buffer;
+}
+
 
-if (! function_exists('unxmlify')) {
 /**
  * undo an xmlify
  * @param string $s xml escaped text
@@ -258,25 +254,7 @@ function unxmlify($s) {
        */
        $ret = htmlspecialchars_decode($s, ENT_QUOTES);
        return $ret;
-}}
-
-if (! function_exists('hex2bin')) {
-/**
- * convenience wrapper, reverse the operation "bin2hex"
- * @param string $s
- * @return number
- */
-function hex2bin($s) {
-       if (! (is_string($s) && strlen($s))) {
-               return '';
-       }
-
-       if (! ctype_xdigit($s)) {
-               return $s;
-       }
-
-       return pack("H*",$s);
-}}
+}
 
 
 /**
@@ -302,14 +280,14 @@ function paginate_data(App $a, $count = null) {
        }
 
        $url = $stripped;
-       $data = array();
+       $data = [];
 
        function _l(&$d, $name, $url, $text, $class = '') {
                if (strpos($url, '?') === false && ($pos = strpos($url, '&')) !== false) {
                        $url = substr($url, 0, $pos) . '?' . substr($url, $pos + 1);
                }
 
-               $d[$name] = array('url' => $url, 'text' => $text, 'class' => $class);
+               $d[$name] = ['url' => $url, 'text' => $text, 'class' => $class];
        }
 
        if (!is_null($count)) {
@@ -335,7 +313,7 @@ function paginate_data(App $a, $count = null) {
                                $numstop = (($pagenum > ($numpages - 7)) ? $numpages : ($numstart + 8));
                        }
 
-                       $pages = array();
+                       $pages = [];
 
                        for ($i = $numstart; $i <= $numstop; $i++) {
                                if ($i == $a->pager['page']) {
@@ -364,7 +342,7 @@ function paginate_data(App $a, $count = null) {
        return $data;
 }
 
-if (! function_exists('paginate')) {
+
 /**
  * Automatic pagination.
  *
@@ -384,11 +362,11 @@ function paginate(App $a) {
 
        $data = paginate_data($a);
        $tpl = get_markup_template("paginate.tpl");
-       return replace_macros($tpl, array("pager" => $data));
+       return replace_macros($tpl, ["pager" => $data]);
+
+}
 
-}}
 
-if (! function_exists('alt_pager')) {
 /**
  * Alternative pager
  * @param App $a App instance
@@ -399,24 +377,24 @@ function alt_pager(App $a, $i) {
 
        $data = paginate_data($a, $i);
        $tpl = get_markup_template("paginate.tpl");
-       return replace_macros($tpl, array('pager' => $data));
+       return replace_macros($tpl, ['pager' => $data]);
+
+}
 
-}}
 
-if (! function_exists('scroll_loader')) {
 /**
  * Loader for infinite scrolling
  * @return string html for loader
  */
 function scroll_loader() {
        $tpl = get_markup_template("scroll_loader.tpl");
-       return replace_macros($tpl, array(
+       return replace_macros($tpl, [
                'wait' => t('Loading more entries...'),
                'end' => t('The end')
-       ));
-}}
+       ]);
+}
+
 
-if (! function_exists('expand_acl')) {
 /**
  * Turn user/group ACLs stored as angle bracketed text into arrays
  *
@@ -426,7 +404,7 @@ if (! function_exists('expand_acl')) {
 function expand_acl($s) {
        // turn string array of angle-bracketed elements into numeric array
        // e.g. "<1><2><3>" => array(1,2,3);
-       $ret = array();
+       $ret = [];
 
        if (strlen($s)) {
                $t = str_replace('<', '', $s);
@@ -438,9 +416,9 @@ function expand_acl($s) {
                }
        }
        return $ret;
-}}
+}
+
 
-if (! function_exists('sanitise_acl')) {
 /**
  * Wrap ACL elements in angle brackets for storage
  * @param string $item
@@ -451,10 +429,9 @@ function sanitise_acl(&$item) {
        } else {
                unset($item);
        }
-}}
+}
 
 
-if (! function_exists('perms2str')) {
 /**
  * Convert an ACL array to a storable string
  *
@@ -477,10 +454,9 @@ function perms2str($p) {
                $ret = implode('', $tmp);
        }
        return $ret;
-}}
+}
 
 
-if (! function_exists('item_new_uri')) {
 /**
  * generate a guaranteed unique (for this domain) item ID for ATOM
  * safe from birthday paradox
@@ -501,16 +477,13 @@ function item_new_uri($hostname, $uid, $guid = "") {
 
                $uri = "urn:X-dfrn:" . $hostname . ':' . $uid . ':' . $hash;
 
-               $dups = dba::exists('item', array('uri' => $uri));
+               $dups = dba::exists('item', ['uri' => $uri]);
        } while ($dups == true);
 
        return $uri;
-}}
+}
 
-// Generate a guaranteed unique photo ID.
-// safe from birthday paradox
 
-if (! function_exists('photo_new_resource')) {
 /**
  * Generate a guaranteed unique photo ID.
  * safe from birthday paradox
@@ -532,10 +505,9 @@ function photo_new_resource() {
        } while ($found == true);
 
        return $resource;
-}}
+}
 
 
-if (! function_exists('load_view_file')) {
 /**
  * @deprecated
  * wrapper to load a view template, checking for alternate
@@ -573,9 +545,9 @@ function load_view_file($s) {
        $content = file_get_contents($s);
        $a->save_timestamp($stamp1, "file");
        return $content;
-}}
+}
+
 
-if (! function_exists('get_intltext_template')) {
 /**
  * load a view template, checking for alternate
  * languages before falling back to the default
@@ -613,9 +585,9 @@ function get_intltext_template($s) {
                $a->save_timestamp($stamp1, "file");
                return $content;
        }
-}}
+}
+
 
-if (! function_exists('get_markup_template')) {
 /**
  * load template $s
  *
@@ -629,7 +601,7 @@ function get_markup_template($s, $root = '') {
        $a = get_app();
        $t = $a->template_engine();
        try {
-               $template = $t->get_template_file($s, $root);
+               $template = $t->getTemplateFile($s, $root);
        } catch (Exception $e) {
                echo "<pre><b>" . __FUNCTION__ . "</b>: " . $e->getMessage() . "</pre>";
                killme();
@@ -638,9 +610,9 @@ function get_markup_template($s, $root = '') {
        $a->save_timestamp($stamp1, "file");
 
        return $template;
-}}
+}
+
 
-if (! function_exists("get_template_file")) {
 /**
  *
  * @param App $a
@@ -667,10 +639,9 @@ function get_template_file($a, $filename, $root = '') {
        }
 
        return $template_file;
-}}
+}
 
 
-if (! function_exists('attribute_contains')) {
 /**
  *  for html,xml parsing - let's say you've got
  *  an attribute foobar="class1 class2 class3"
@@ -688,11 +659,11 @@ if (! function_exists('attribute_contains')) {
 function attribute_contains($attr, $s) {
        $a = explode(' ', $attr);
        return (count($a) && in_array($s,$a));
-}}
+}
+
 
-if (! function_exists('logger')) {
 /* setup int->string log level map */
-$LOGGER_LEVELS = array();
+$LOGGER_LEVELS = [];
 
 /**
  * @brief Logs the given message at the given log level
@@ -761,7 +732,7 @@ function logger($msg, $level = 0) {
        $stamp1 = microtime(true);
        @file_put_contents($logfile, $logline, FILE_APPEND);
        $a->save_timestamp($stamp1, "file");
-}}
+}
 
 /**
  * @brief An alternative logger for development.
@@ -828,7 +799,7 @@ function dlogger($msg, $level = 0) {
        $a->save_timestamp($stamp1, "file");
 }
 
-if (! function_exists('activity_match')) {
+
 /**
  * Compare activity uri. Knows about activity namespace.
  *
@@ -838,7 +809,7 @@ if (! function_exists('activity_match')) {
  */
 function activity_match($haystack,$needle) {
        return (($haystack === $needle) || ((basename($needle) === $haystack) && strstr($needle, NAMESPACE_ACTIVITY_SCHEMA)));
-}}
+}
 
 
 /**
@@ -854,7 +825,7 @@ function activity_match($haystack,$needle) {
  * @return array List of tag and person names
  */
 function get_tags($string) {
-       $ret = array();
+       $ret = [];
 
        // Convert hashtag links to hashtags
        $string = preg_replace('/#\[url\=([^\[\]]*)\](.*?)\[\/url\]/ism', '#$2', $string);
@@ -863,7 +834,7 @@ function get_tags($string) {
        $string = preg_replace('/\[code\](.*?)\[\/code\]/sm', '', $string);
 
        // Force line feeds at bbtags
-       $string = str_replace(array('[', ']'), array("\n[", "]\n"), $string);
+       $string = str_replace(['[', ']'], ["\n[", "]\n"], $string);
 
        // ignore anything in a bbtag
        $string = preg_replace('/\[(.*?)\]/sm', '', $string);
@@ -912,9 +883,6 @@ function get_tags($string) {
 }
 
 
-//
-
-if (! function_exists('qp')) {
 /**
  * quick and dirty quoted_printable encoding
  *
@@ -923,9 +891,9 @@ if (! function_exists('qp')) {
  */
 function qp($s) {
        return str_replace("%", "=", rawurlencode($s));
-}}
+}
+
 
-if (! function_exists('contact_block')) {
 /**
  * Get html for contact block.
  *
@@ -937,15 +905,12 @@ function contact_block() {
        $o = '';
        $a = get_app();
 
-       $shown = PConfig::get($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`
@@ -960,7 +925,7 @@ function contact_block() {
        if (DBM::is_result($r)) {
                $total = intval($r[0]['total']);
        }
-       if (! $total) {
+       if (!$total) {
                $contacts = t('No contacts');
                $micropro = null;
        } else {
@@ -977,7 +942,7 @@ function contact_block() {
                                intval($shown)
                );
                if (DBM::is_result($r)) {
-                       $contacts = array();
+                       $contacts = [];
                        foreach ($r AS $contact) {
                                $contacts[] = $contact["id"];
                        }
@@ -985,8 +950,8 @@ function contact_block() {
                                dbesc(implode(",", $contacts)));
 
                        if (DBM::is_result($r)) {
-                               $contacts = sprintf( tt('%d Contact','%d Contacts', $total),$total);
-                               $micropro = Array();
+                               $contacts = sprintf(tt('%d Contact','%d Contacts', $total),$total);
+                               $micropro = [];
                                foreach ($r as $rr) {
                                        $micropro[] = micropro($rr,true,'mpfriend');
                                }
@@ -995,19 +960,20 @@ function contact_block() {
        }
 
        $tpl = get_markup_template('contact_block.tpl');
-       $o = replace_macros($tpl, array(
+       $o = replace_macros($tpl, [
                '$contacts' => $contacts,
                '$nickname' => $a->profile['nickname'],
                '$viewcontacts' => t('View Contacts'),
                '$micropro' => $micropro,
-       ));
+       ]);
 
-       $arr = array('contacts' => $r, 'output' => $o);
+       $arr = ['contacts' => $r, 'output' => $o];
 
        call_hooks('contact_block_end', $arr);
        return $o;
 
-}}
+}
+
 
 /**
  * @brief Format contacts as picture links or as texxt links
@@ -1031,7 +997,7 @@ function contact_block() {
 function micropro($contact, $redirect = false, $class = '', $textmode = false) {
 
        // Use the contact URL if no address is available
-       if ($contact["addr"] == "") {
+       if (!x($contact, "addr")) {
                $contact["addr"] = $contact["url"];
        }
 
@@ -1040,14 +1006,13 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) {
        $redir = false;
 
        if ($redirect) {
-               $a = get_app();
                $redirect_url = 'redir/' . $contact['id'];
                if (local_user() && ($contact['uid'] == local_user()) && ($contact['network'] === NETWORK_DFRN)) {
                        $redir = true;
                        $url = $redirect_url;
                        $sparkle = ' sparkle';
                } else {
-                       $url = zrl($url);
+                       $url = Profile::zrl($url);
                }
        }
 
@@ -1056,8 +1021,8 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) {
                $url = '';
        }
 
-       return replace_macros(get_markup_template(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'),array(
-               '$click' => (($contact['click']) ? $contact['click'] : ''),
+       return replace_macros(get_markup_template(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'),[
+               '$click' => defaults($contact, 'click', ''),
                '$class' => $class,
                '$url' => $url,
                '$photo' => proxy_url($contact['thumb'], false, PROXY_SIZE_THUMB),
@@ -1066,38 +1031,45 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) {
                '$parkle' => $sparkle,
                '$redir' => $redir,
 
-       ));
+       ]);
 }
 
-
-
-if (! function_exists('search')) {
 /**
- * search box
+ * Search box.
  *
- * @param string $s search query
- * @param string $id html id
- * @param string $url search url
- * @param boolean $savedsearch show save search button
+ * @param string $s     Search query.
+ * @param string $id    HTML id
+ * @param string $url   Search url.
+ * @param bool   $save  Show save search button.
+ * @param bool   $aside Display the search widgit aside.
+ *
+ * @return string Formatted HTML.
  */
-function search($s, $id = 'search-box', $url = 'search', $save = false, $aside = true) {
-       $a = get_app();
+function search($s, $id = 'search-box', $url = 'search', $save = false, $aside = true)
+{
+       $mode = 'text';
+
+       if (strpos($s, '#') === 0) {
+               $mode = 'tag';
+       }
+       $save_label = $mode === 'text' ? t('Save') : t('Follow');
 
-       $values = array(
+       $values = [
                        '$s' => htmlspecialchars($s),
                        '$id' => $id,
                        '$action_url' => $url,
                        '$search_label' => t('Search'),
-                       '$save_label' => t('Save'),
-                       '$savedsearch' => feature_enabled(local_user(),'savedsearch'),
+                       '$save_label' => $save_label,
+                       '$savedsearch' => Feature::isEnabled(local_user(),'savedsearch'),
                        '$search_hint' => t('@name, !forum, #tags, content'),
-               );
+                       '$mode' => $mode
+               ];
 
        if (!$aside) {
-               $values['$searchoption'] = array(
+               $values['$searchoption'] = [
                                        t("Full Text"),
                                        t("Tags"),
-                                       t("Contacts"));
+                                       t("Contacts")];
 
                if (Config::get('system','poco_local_search')) {
                        $values['$searchoption'][] = t("Forums");
@@ -1105,25 +1077,20 @@ function search($s, $id = 'search-box', $url = 'search', $save = false, $aside =
        }
 
        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 (Config::get('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
  *
@@ -1133,7 +1100,7 @@ function linkify($s) {
        $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\'\%\$\!\+]*)/", ' <a href="$1" target="_blank">$1</a>', $s);
        $s = preg_replace("/\<(.*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism",'<$1$2=$3&$4>',$s);
        return $s;
-}}
+}
 
 
 /**
@@ -1148,65 +1115,31 @@ function get_poke_verbs() {
        // index is present tense verb
        // value is array containing past tense verb, translation of present, translation of past
 
-       $arr = array(
-               'poke' => array( 'poked', t('poke'), t('poked')),
-               'ping' => array( 'pinged', t('ping'), t('pinged')),
-               'prod' => array( 'prodded', t('prod'), t('prodded')),
-               'slap' => array( 'slapped', t('slap'), t('slapped')),
-               'finger' => array( 'fingered', t('finger'), t('fingered')),
-               'rebuff' => array( 'rebuffed', t('rebuff'), t('rebuffed')),
-       );
+       $arr = [
+               'poke' => ['poked', t('poke'), t('poked')],
+               'ping' => ['pinged', t('ping'), t('pinged')],
+               'prod' => ['prodded', t('prod'), t('prodded')],
+               'slap' => ['slapped', t('slap'), t('slapped')],
+               'finger' => ['fingered', t('finger'), t('fingered')],
+               'rebuff' => ['rebuffed', t('rebuff'), t('rebuffed')],
+       ];
        call_hooks('poke_verbs', $arr);
        return $arr;
 }
 
-/**
- * Load moods
- * @return array index is mood, value is translated mood
- * @hook mood_verbs moods array
- */
-function get_mood_verbs() {
-
-       $arr = array(
-               'happy'      => t('happy'),
-               'sad'        => t('sad'),
-               'mellow'     => t('mellow'),
-               'tired'      => t('tired'),
-               'perky'      => t('perky'),
-               'angry'      => t('angry'),
-               'stupefied'  => t('stupified'),
-               'puzzled'    => t('puzzled'),
-               'interested' => t('interested'),
-               'bitter'     => t('bitter'),
-               'cheerful'   => t('cheerful'),
-               'alive'      => t('alive'),
-               'annoyed'    => t('annoyed'),
-               'anxious'    => t('anxious'),
-               'cranky'     => t('cranky'),
-               'disturbed'  => t('disturbed'),
-               'frustrated' => t('frustrated'),
-               'motivated'  => t('motivated'),
-               'relaxed'    => t('relaxed'),
-               'surprised'  => t('surprised'),
-       );
-
-       call_hooks('mood_verbs', $arr);
-       return $arr;
-}
-
 /**
  * @brief Translate days and months names.
- * 
+ *
  * @param string $s String with 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')),
+       $ret = str_replace(['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'],
+               [t('Monday'), t('Tuesday'), t('Wednesday'), t('Thursday'), t('Friday'), t('Saturday'), t('Sunday')],
                $s);
 
-       $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(['January','February','March','April','May','June','July','August','September','October','November','December'],
+               [t('January'), t('February'), t('March'), t('April'), t('May'), t('June'), t('July'), t('August'), t('September'), t('October'), t('November'), t('December')],
                $ret);
 
        return $ret;
@@ -1214,21 +1147,21 @@ function day_translate($s) {
 
 /**
  * @brief Translate short days and months names.
- * 
+ *
  * @param string $s String with short day or month name.
  * @return string Translated string.
  */
 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('Sund')),
+       $ret = str_replace(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
+               [t('Mon'), t('Tue'), t('Wed'), t('Thu'), t('Fri'), t('Sat'), t('Sun')],
                $s);
-       $ret = str_replace(array('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 = str_replace(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov','Dec'],
+               [t('Jan'), t('Feb'), t('Mar'), t('Apr'), t('May'), ('Jun'), t('Jul'), t('Aug'), t('Sep'), t('Oct'), t('Nov'), t('Dec')],
                $ret);
        return $ret;
 }
 
-if (! function_exists('normalise_link')) {
+
 /**
  * Normalize url
  *
@@ -1236,13 +1169,11 @@ if (! function_exists('normalise_link')) {
  * @return string
  */
 function normalise_link($url) {
-       $ret = str_replace(array('https:', '//www.'), array('http:', '//'), $url);
+       $ret = str_replace(['https:', '//www.'], ['http:', '//'], $url);
        return rtrim($ret,'/');
-}}
-
+}
 
 
-if (! function_exists('link_compare')) {
 /**
  * Compare two URLs to see if they are the same, but ignore
  * slight but hopefully insignificant differences such as if one
@@ -1256,7 +1187,8 @@ if (! function_exists('link_compare')) {
  */
 function link_compare($a, $b) {
        return (strcasecmp(normalise_link($a), normalise_link($b)) === 0);
-}}
+}
+
 
 /**
  * @brief Find any non-embedded images in private items and add redir links to them
@@ -1282,11 +1214,15 @@ function redir_private_images($a, &$item)
        }
 }
 
-function put_item_in_cache(&$item, $update = false) {
-
-       if (($item["rendered-hash"] != hash("md5", $item["body"])) || ($item["rendered-hash"] == "") ||
-               ($item["rendered-html"] == "") || Config::get("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"];
@@ -1299,8 +1235,8 @@ function put_item_in_cache(&$item, $update = false) {
                $item["body"] = $body;
 
                if ($update && ($item["id"] > 0)) {
-                       dba::update('item', array('rendered-html' => $item["rendered-html"], 'rendered-hash' => $item["rendered-hash"]),
-                                       array('id' => $item["id"]), false);
+                       dba::update('item', ['rendered-html' => $item["rendered-html"], 'rendered-hash' => $item["rendered-hash"]],
+                                       ['id' => $item["id"]], false);
                }
        }
 }
@@ -1323,9 +1259,9 @@ function prepare_body(&$item, $attach = false, $preview = false) {
 
        $searchpath = System::baseUrl() . "/search?tag=";
 
-       $tags = array();
-       $hashtags = array();
-       $mentions = array();
+       $tags = [];
+       $hashtags = [];
+       $mentions = [];
 
        // In order to provide theme developers more possibilities, event items
        // are treated differently.
@@ -1377,14 +1313,14 @@ function prepare_body(&$item, $attach = false, $preview = false) {
        put_item_in_cache($item, $update);
        $s = $item["rendered-html"];
 
-       $prep_arr = array('item' => $item, 'html' => $s, 'preview' => $preview);
+       $prep_arr = ['item' => $item, 'html' => $s, 'preview' => $preview];
        call_hooks('prepare_body', $prep_arr);
        $s = $prep_arr['html'];
 
        if (! $attach) {
                // Replace the blockquotes with quotes that are used in mails.
                $mailquote = '<blockquote type="cite" class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">';
-               $s = str_replace(array('<blockquote>', '<blockquote class="spoiler">', '<blockquote class="author">'), array($mailquote, $mailquote, $mailquote), $s);
+               $s = str_replace(['<blockquote>', '<blockquote class="spoiler">', '<blockquote class="author">'], [$mailquote, $mailquote, $mailquote], $s);
                return $s;
        }
 
@@ -1409,23 +1345,23 @@ function prepare_body(&$item, $attach = false, $preview = false) {
                                        if (strpos($mime, 'video') !== false) {
                                                if (!$vhead) {
                                                        $vhead = true;
-                                                       $a->page['htmlhead'] .= replace_macros(get_markup_template('videos_head.tpl'), array(
+                                                       $a->page['htmlhead'] .= replace_macros(get_markup_template('videos_head.tpl'), [
                                                                '$baseurl' => System::baseUrl(),
-                                                       ));
-                                                       $a->page['end'] .= replace_macros(get_markup_template('videos_end.tpl'), array(
+                                                       ]);
+                                                       $a->page['end'] .= replace_macros(get_markup_template('videos_end.tpl'), [
                                                                '$baseurl' => System::baseUrl(),
-                                                       ));
+                                                       ]);
                                                }
 
                                                $id = end(explode('/', $the_url));
-                                               $as .= replace_macros(get_markup_template('video_top.tpl'), array(
-                                                       '$video' => array(
+                                               $as .= replace_macros(get_markup_template('video_top.tpl'), [
+                                                       '$video' => [
                                                                'id'     => $id,
                                                                'title'  => t('View Video'),
                                                                'src'    => $the_url,
                                                                'mime'   => $mime,
-                                                       ),
-                                               ));
+                                                       ],
+                                               ]);
                                        }
 
                                        $filetype = strtolower(substr($mime, 0, strpos($mime, '/')));
@@ -1452,7 +1388,7 @@ function prepare_body(&$item, $attach = false, $preview = false) {
 
        // 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);
                }
@@ -1495,7 +1431,7 @@ function prepare_body(&$item, $attach = false, $preview = false) {
                $s = preg_replace('|(<img[^>]+src="[^"]+/photo/[0-9a-f]+)-[0-9]|', "$1-" . $ps, $s);
        }
 
-       $prep_arr = array('item' => $item, 'html' => $s);
+       $prep_arr = ['item' => $item, 'html' => $s];
        call_hooks('prepare_body_final', $prep_arr);
 
        return $prep_arr['html'];
@@ -1547,24 +1483,23 @@ function prepare_text($text) {
  *       ]
  *  ]
  */
-function get_cats_and_terms($item) {
-
-       $a = get_app();
-       $categories = array();
-       $folders = array();
+function get_cats_and_terms($item)
+{
+       $categories = [];
+       $folders = [];
 
        $matches = false;
        $first = true;
        $cnt = preg_match_all('/<(.*?)>/', $item['file'], $matches, PREG_SET_ORDER);
        if ($cnt) {
                foreach ($matches as $mtch) {
-                       $categories[] = array(
+                       $categories[] = [
                                'name' => xmlify(file_tag_decode($mtch[1])),
                                'url' =>  "#",
                                'removeurl' => ((local_user() == $item['uid'])?'filerm/' . $item['id'] . '?f=&cat=' . xmlify(file_tag_decode($mtch[1])):""),
                                'first' => $first,
                                'last' => false
-                       );
+                       ];
                        $first = false;
                }
        }
@@ -1579,13 +1514,13 @@ function get_cats_and_terms($item) {
                $cnt = preg_match_all('/\[(.*?)\]/', $item['file'], $matches, PREG_SET_ORDER);
                if ($cnt) {
                        foreach ($matches as $mtch) {
-                               $folders[] = array(
+                               $folders[] = [
                                        'name' => xmlify(file_tag_decode($mtch[1])),
                                        'url' =>  "#",
                                        'removeurl' => ((local_user() == $item['uid']) ? 'filerm/' . $item['id'] . '?f=&term=' . xmlify(file_tag_decode($mtch[1])) : ""),
                                        'first' => $first,
                                        'last' => false
-                               );
+                               ];
                                $first = false;
                        }
                }
@@ -1595,10 +1530,10 @@ function get_cats_and_terms($item) {
                $folders[count($folders) - 1]['last'] = true;
        }
 
-       return array($categories, $folders);
+       return [$categories, $folders];
 }
 
-if (! function_exists('get_plink')) {
+
 /**
  * get private link for item
  * @param array $item
@@ -1608,13 +1543,13 @@ function get_plink($item) {
        $a = get_app();
 
        if ($a->user['nickname'] != "") {
-               $ret = array(
+               $ret = [
                                //'href' => "display/" . $a->user['nickname'] . "/" . $item['id'],
                                'href' => "display/" . $item['guid'],
                                'orig' => "display/" . $item['guid'],
                                'title' => t('View on separate page'),
                                'orig_title' => t('view on separate page'),
-                       );
+                       ];
 
                if (x($item, 'plink')) {
                        $ret["href"] = $a->remove_baseurl($item['plink']);
@@ -1622,19 +1557,19 @@ function get_plink($item) {
                }
 
        } elseif (x($item, 'plink') && ($item['private'] != 1)) {
-               $ret = array(
+               $ret = [
                                'href' => $item['plink'],
                                'orig' => $item['plink'],
                                'title' => t('link to source'),
-                       );
+                       ];
        } else {
-               $ret = array();
+               $ret = [];
        }
 
        return $ret;
-}}
+}
+
 
-if (! function_exists('unamp')) {
 /**
  * replace html amp entity with amp char
  * @param string $s
@@ -1642,23 +1577,23 @@ if (! function_exists('unamp')) {
  */
 function unamp($s) {
        return str_replace('&amp;', '&', $s);
-}}
+}
 
 
-if (! function_exists('return_bytes')) {
 /**
  * return number of bytes in size (K, M, G)
  * @param string $size_str
  * @return number
  */
-function return_bytes ($size_str) {
+function return_bytes($size_str) {
        switch (substr ($size_str, -1)) {
                case 'M': case 'm': return (int)$size_str * 1048576;
                case 'K': case 'k': return (int)$size_str * 1024;
                case 'G': case 'g': return (int)$size_str * 1073741824;
                default: return $size_str;
        }
-}}
+}
+
 
 /**
  * @return string
@@ -1726,73 +1661,6 @@ function base64url_decode($s) {
 }
 
 
-if (!function_exists('str_getcsv')) {
-       /**
-        * Parse csv string
-        *
-        * @param string $input
-        * @param string $delimiter
-        * @param string $enclosure
-        * @param string $escape
-        * @param string $eol
-        * @return boolean|array False on error, otherwise array[row][column]
-        */
-function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\', $eol = '\n') {
-       if (is_string($input) && !empty($input)) {
-               $output = array();
-               $tmp    = preg_split("/".$eol."/",$input);
-               if (is_array($tmp) && !empty($tmp)) {
-                       while (list($line_num, $line) = each($tmp)) {
-                               if (preg_match("/".$escape.$enclosure."/",$line)) {
-                                       while ($strlen = strlen($line)) {
-                                               $pos_delimiter       = strpos($line,$delimiter);
-                                               $pos_enclosure_start = strpos($line,$enclosure);
-                                               if (
-                                                       is_int($pos_delimiter) && is_int($pos_enclosure_start)
-                                                       && ($pos_enclosure_start < $pos_delimiter)
-                                                       ) {
-                                                       $enclosed_str = substr($line,1);
-                                                       $pos_enclosure_end = strpos($enclosed_str,$enclosure);
-                                                       $enclosed_str = substr($enclosed_str,0,$pos_enclosure_end);
-                                                       $output[$line_num][] = $enclosed_str;
-                                                       $offset = $pos_enclosure_end+3;
-                                               } else {
-                                                       if (empty($pos_delimiter) && empty($pos_enclosure_start)) {
-                                                               $output[$line_num][] = substr($line,0);
-                                                               $offset = strlen($line);
-                                                       } else {
-                                                               $output[$line_num][] = substr($line,0,$pos_delimiter);
-                                                               $offset = (
-                                                                       !empty($pos_enclosure_start)
-                                                                       && ($pos_enclosure_start < $pos_delimiter)
-                                                                       )
-                                                                       ?$pos_enclosure_start
-                                                                       :$pos_delimiter+1;
-                                                       }
-                                               }
-                                               $line = substr($line,$offset);
-                                       }
-                               } else {
-                                       $line = preg_split("/".$delimiter."/",$line);
-
-                                       /*
-                                        * Validating against pesky extra line breaks creating false rows.
-                                        */
-                                       if (is_array($line) && !empty($line[0])) {
-                                               $output[$line_num] = $line;
-                               }
-                               }
-                       }
-                       return $output;
-               } else {
-               return false;
-               }
-       } else {
-               return false;
-       }
-}
-}
-
 /**
  * return div element with class 'clear'
  * @return string
@@ -1848,7 +1716,7 @@ function array_xmlify($val){
 
 
 /**
- * transorm link href and img src from relative to absolute
+ * transform link href and img src from relative to absolute
  *
  * @param string $text
  * @param string $base base url
@@ -1912,19 +1780,19 @@ function item_post_type($item) {
 // To do this we need to escape these characters if they appear in our tag.
 
 function file_tag_encode($s) {
-       return str_replace(array('<','>','[',']'),array('%3c','%3e','%5b','%5d'),$s);
+       return str_replace(['<','>','[',']'],['%3c','%3e','%5b','%5d'],$s);
 }
 
 function file_tag_decode($s) {
-       return str_replace(array('%3c', '%3e', '%5b', '%5d'), array('<', '>', '[', ']'), $s);
+       return str_replace(['%3c', '%3e', '%5b', '%5d'], ['<', '>', '[', ']'], $s);
 }
 
 function file_tag_file_query($table,$s,$type = 'file') {
 
        if ($type == 'file') {
-               $str = preg_quote( '[' . str_replace('%', '%%', file_tag_encode($s)) . ']' );
+               $str = preg_quote('[' . str_replace('%', '%%', file_tag_encode($s)) . ']');
        } else {
-               $str = preg_quote( '<' . str_replace('%', '%%', file_tag_encode($s)) . '>' );
+               $str = preg_quote('<' . str_replace('%', '%%', file_tag_encode($s)) . '>');
        }
        return " AND " . (($table) ? dbesc($table) . '.' : '') . "file regexp '" . dbesc($str) . "' ";
 }
@@ -1976,20 +1844,20 @@ function file_tag_update_pconfig($uid, $file_old, $file_new, $type = 'file') {
        // $file_old - categories previously associated with an item
        // $file_new - new list of categories for an item
 
-       if (! intval($uid))
+       if (!intval($uid)) {
                return false;
-
-       if ($file_old == $file_new)
+       }
+       if ($file_old == $file_new) {
                return true;
+       }
 
-       $saved = PConfig::get($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;
@@ -1998,7 +1866,7 @@ function file_tag_update_pconfig($uid, $file_old, $file_new, $type = 'file') {
                $filetags_updated = $saved;
 
                // check for new tags to be added as filetags in pconfig
-               $new_tags = array();
+               $new_tags = [];
                $check_new_tags = explode(",",file_tag_file_to_list($file_new,$type));
 
                foreach ($check_new_tags as $tag) {
@@ -2009,7 +1877,7 @@ function file_tag_update_pconfig($uid, $file_old, $file_new, $type = 'file') {
                $filetags_updated .= file_tag_list_to_file(implode(",",$new_tags),$type);
 
                // check for deleted tags to be removed from filetags in pconfig
-               $deleted_tags = array();
+               $deleted_tags = [];
                $check_deleted_tags = explode(",",file_tag_file_to_list($file_old,$type));
 
                foreach ($check_deleted_tags as $tag) {
@@ -2026,8 +1894,7 @@ function file_tag_update_pconfig($uid, $file_old, $file_new, $type = 'file') {
 
                        if (DBM::is_result($r)) {
                                unset($deleted_tags[$key]);
-                       }
-                       else {
+                       } else {
                                $filetags_updated = str_replace($lbracket . file_tag_encode($tag) . $rbracket,'',$filetags_updated);
                        }
                }
@@ -2036,20 +1903,18 @@ function file_tag_update_pconfig($uid, $file_old, $file_new, $type = 'file') {
                        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)) {
-                       PConfig::set($uid, 'system', 'filetags', $file_new);
-               }
-               return true;
+       return true;
 }
 
-function file_tag_save_file($uid, $item, $file) {
-       require_once "include/files.php";
-
-       $result = false;
-       if (! intval($uid))
+function file_tag_save_file($uid, $item, $file)
+{
+       if (! intval($uid)) {
                return false;
+       }
+
        $r = q("SELECT `file` FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
                intval($item),
                intval($uid)
@@ -2063,23 +1928,22 @@ function file_tag_save_file($uid, $item, $file) {
                        );
                }
 
-               create_files_from_item($item);
+               Term::createFromItem($item);
 
-               $saved = PConfig::get($uid,'system','filetags');
-               if ((! strlen($saved)) || (! stristr($saved, '[' . file_tag_encode($file) . ']'))) {
+               $saved = PConfig::get($uid, 'system', 'filetags');
+               if (!strlen($saved) || !stristr($saved, '[' . file_tag_encode($file) . ']')) {
                        PConfig::set($uid, 'system', 'filetags', $saved . '[' . file_tag_encode($file) . ']');
                }
-               info( t('Item filed') );
+               info(t('Item filed'));
        }
        return true;
 }
 
-function file_tag_unsave_file($uid, $item, $file, $cat = false) {
-       require_once "include/files.php";
-
-       $result = false;
-       if (! intval($uid))
+function file_tag_unsave_file($uid, $item, $file, $cat = false)
+{
+       if (! intval($uid)) {
                return false;
+       }
 
        if ($cat == true) {
                $pattern = '<' . file_tag_encode($file) . '>' ;
@@ -2089,7 +1953,6 @@ 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)
@@ -2104,16 +1967,16 @@ function file_tag_unsave_file($uid, $item, $file, $cat = false) {
                intval($uid)
        );
 
-       create_files_from_item($item);
+       Term::createFromItem($item);
 
        $r = q("SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d",
                dbesc($file),
                intval(TERM_OBJ_POST),
                intval($termtype),
-               intval($uid));
-
-       if (! DBM::is_result($r)) {
-               $saved = PConfig::get($uid,'system','filetags');
+               intval($uid)
+       );
+       if (!DBM::is_result($r)) {
+               $saved = PConfig::get($uid, 'system', 'filetags');
                PConfig::set($uid, 'system', 'filetags', str_replace($pattern, '', $saved));
        }
 
@@ -2121,7 +1984,7 @@ function file_tag_unsave_file($uid, $item, $file, $cat = false) {
 }
 
 function normalise_openid($s) {
-       return trim(str_replace(array('http://', 'https://'), array('', ''), $s), '/');
+       return trim(str_replace(['http://', 'https://'], ['', ''], $s), '/');
 }
 
 
@@ -2160,7 +2023,7 @@ function is_a_date_arg($s) {
 function deindent($text, $chr = "[\t ]", $count = NULL) {
        $lines = explode("\n", $text);
        if (is_null($count)) {
-               $m = array();
+               $m = [];
                $k = 0;
                while ($k < count($lines) && strlen($lines[$k]) == 0) {
                        $k++;
@@ -2176,7 +2039,7 @@ function deindent($text, $chr = "[\t ]", $count = NULL) {
 }
 
 function formatBytes($bytes, $precision = 2) {
-        $units = array('B', 'KB', 'MB', 'GB', 'TB');
+       $units = ['B', 'KB', 'MB', 'GB', 'TB'];
 
        $bytes = max($bytes, 0);
        $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
@@ -2198,16 +2061,14 @@ function formatBytes($bytes, $precision = 2) {
  */
 function format_network_name($network, $url = 0) {
        if ($network != "") {
-               require_once 'include/contact_selectors.php';
                if ($url != "") {
-                       $network_name = '<a href="'.$url.'">'.network_to_name($network, $url)."</a>";
+                       $network_name = '<a href="'.$url.'">'.ContactSelector::networkToName($network, $url)."</a>";
                } else {
-                       $network_name = network_to_name($network);
+                       $network_name = ContactSelector::networkToName($network);
                }
 
                return $network_name;
        }
-
 }
 
 /**
@@ -2226,10 +2087,10 @@ function text_highlight($s, $lang) {
        // Autoload the library to make constants available
        class_exists('Text_Highlighter_Renderer_Html');
 
-       $options = array(
+       $options = [
                'numbers' => HL_NUMBERS_LI,
                'tabsize' => 4,
-       );
+       ];
 
        $tag_added = false;
        $s = trim(html_entity_decode($s, ENT_COMPAT));
@@ -2246,7 +2107,8 @@ function text_highlight($s, $lang) {
        }
 
        $renderer = new Text_Highlighter_Renderer_Html($options);
-       $hl = Text_Highlighter::factory($lang);
+       $factory = new Text_Highlighter();
+       $hl = $factory->factory($lang);
        $hl->setRenderer($renderer);
        $o = $hl->highlight($s);
        $o = str_replace("\n", '', $o);