]> git.mxchange.org Git - friendica.git/blobdiff - include/text.php
Merge pull request #3463 from friendica/develop
[friendica.git] / include / text.php
index f45dd6391cade75154ed85ed0e285cabe63507cf..c9babba940f8f06e31770f638407bb5a3839b169 100644 (file)
@@ -1,12 +1,13 @@
 <?php
 
+use Friendica\App;
+
 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");
 
-
 if(! function_exists('replace_macros')) {
 /**
  * This is our template processor
@@ -23,7 +24,7 @@ function replace_macros($s,$r) {
        $a = get_app();
 
        // pass $baseurl to all templates
-       $r['$baseurl'] = $a->get_baseurl();
+       $r['$baseurl'] = App::get_baseurl();
 
 
        $t = $a->template_engine();
@@ -268,90 +269,90 @@ function hex2bin($s) {
 }}
 
 
-if(! function_exists('paginate_data')) {
 /**
- * Automatica pagination data.
+ * @brief Paginator function. Pushes relevant links in a pager array structure.
+ *
+ * Links are generated depending on the current page and the total number of items.
+ * Inactive links (like "first" and "prev" on page 1) are given the "disabled" class.
+ * Current page link is given the "active" CSS class
  *
  * @param App $a App instance
- * @param int $count [optional] item count (used with alt pager)
+ * @param int $count [optional] item count (used with minimal pager)
  * @return Array data for pagination template
  */
-function paginate_data(&$a, $count=null) {
-       $stripped = preg_replace('/([&?]page=[0-9]*)/','',$a->query_string);
+function paginate_data(App $a, $count = null) {
+       $stripped = preg_replace('/([&?]page=[0-9]*)/', '', $a->query_string);
 
-       $stripped = str_replace('q=','',$stripped);
-       $stripped = trim($stripped,'/');
+       $stripped = str_replace('q=', '', $stripped);
+       $stripped = trim($stripped, '/');
        $pagenum = $a->pager['page'];
 
-       if (($a->page_offset != "") AND !preg_match('/[?&].offset=/', $stripped))
-               $stripped .= "&offset=".urlencode($a->page_offset);
+       if (($a->page_offset != '') AND !preg_match('/[?&].offset=/', $stripped)) {
+               $stripped .= '&offset=' . urlencode($a->page_offset);
+       }
 
        $url = $stripped;
-
        $data = array();
-       function _l(&$d, $name, $url, $text, $class="") {
-               if (!strpos($url, "?")) {
-                       if ($pos = strpos($url, "&"))
-                               $url = substr($url, 0, $pos)."?".substr($url, $pos + 1);
+
+       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] = array('url' => $url, 'text' => $text, 'class' => $class);
        }
 
-       if (!is_null($count)){
-               // alt pager
-               if($a->pager['page']>1)
-                       _l($data,  "prev", $url.'&page='.($a->pager['page'] - 1), t('newer'));
-               if($count>0)
-                       _l($data,  "next", $url.'&page='.($a->pager['page'] + 1), t('older'));
+       if (!is_null($count)) {
+               // minimal pager (newer / older)
+               $data['class'] = 'pager';
+               _l($data, 'prev', $url . '&page=' . ($a->pager['page'] - 1), t('newer'), 'previous' . ($a->pager['page'] == 1 ? ' disabled' : ''));
+               _l($data, 'next', $url . '&page=' . ($a->pager['page'] + 1), t('older'), 'next' . ($count <= 0 ? ' disabled' : ''));
        } else {
-               // full pager
-               if($a->pager['total'] > $a->pager['itemspage']) {
-                       if($a->pager['page'] != 1)
-                               _l($data,  "prev", $url.'&page='.($a->pager['page'] - 1), t('prev'));
-
-                       _l($data, "first", $url."&page=1",  t('first'));
-
+               // full pager (first / prev / 1 / 2 / ... / 14 / 15 / next / last)
+               $data['class'] = 'pagination';
+               if ($a->pager['total'] > $a->pager['itemspage']) {
+                       _l($data, 'first', $url . '&page=1',  t('first'), $a->pager['page'] == 1 ? 'disabled' : '');
+                       _l($data, 'prev', $url . '&page=' . ($a->pager['page'] - 1), t('prev'), $a->pager['page'] == 1 ? 'disabled' : '');
 
                        $numpages = $a->pager['total'] / $a->pager['itemspage'];
 
                        $numstart = 1;
                        $numstop = $numpages;
 
-                       if($numpages > 14) {
-                               $numstart = (($pagenum > 7) ? ($pagenum - 7) : 1);
-                               $numstop = (($pagenum > ($numpages - 7)) ? $numpages : ($numstart + 14));
+                       // Limit the number of displayed page number buttons.
+                       if ($numpages > 8) {
+                               $numstart = (($pagenum > 4) ? ($pagenum - 4) : 1);
+                               $numstop = (($pagenum > ($numpages - 7)) ? $numpages : ($numstart + 8));
                        }
 
                        $pages = array();
 
-                       for($i = $numstart; $i <= $numstop; $i++){
-                               if($i == $a->pager['page'])
-                                       _l($pages, $i, "#",  $i, "current");
-                               else
-                                       _l($pages, $i, $url."&page=$i", $i, "n");
+                       for ($i = $numstart; $i <= $numstop; $i++) {
+                               if ($i == $a->pager['page']) {
+                                       _l($pages, $i, '#',  $i, 'current active');
+                               } else {
+                                       _l($pages, $i, $url . '&page='. $i, $i, 'n');
+                               }
                        }
 
-                       if(($a->pager['total'] % $a->pager['itemspage']) != 0) {
-                               if($i == $a->pager['page'])
-                                       _l($pages, $i, "#",  $i, "current");
-                               else
-                                       _l($pages, $i, $url."&page=$i", $i, "n");
+                       if (($a->pager['total'] % $a->pager['itemspage']) != 0) {
+                               if ($i == $a->pager['page']) {
+                                       _l($pages, $i, '#',  $i, 'current active');
+                               } else {
+                                       _l($pages, $i, $url . '&page=' . $i, $i, 'n');
+                               }
                        }
 
                        $data['pages'] = $pages;
 
                        $lastpage = (($numpages > intval($numpages)) ? intval($numpages)+1 : $numpages);
-                       _l($data, "last", $url."&page=$lastpage", t('last'));
-
-                       if(($a->pager['total'] - ($a->pager['itemspage'] * $a->pager['page'])) > 0)
-                               _l($data, "next", $url."&page=".($a->pager['page'] + 1), t('next'));
-
+                       _l($data, 'next', $url . '&page=' . ($a->pager['page'] + 1), t('next'), $a->pager['page'] == $lastpage ? 'disabled' : '');
+                       _l($data, 'last', $url . '&page=' . $lastpage, t('last'), $a->pager['page'] == $lastpage ? 'disabled' : '');
                }
        }
-       return $data;
 
-}}
+       return $data;
+}
 
 if(! function_exists('paginate')) {
 /**
@@ -369,7 +370,7 @@ if(! function_exists('paginate')) {
  * @param App $a App instance
  * @return string html for pagination #FIXME remove html
  */
-function paginate(&$a) {
+function paginate(App $a) {
 
        $data = paginate_data($a);
        $tpl = get_markup_template("paginate.tpl");
@@ -384,7 +385,7 @@ if(! function_exists('alt_pager')) {
  * @param int $i
  * @return string html for pagination #FIXME remove html
  */
-function alt_pager(&$a, $i) {
+function alt_pager(App $a, $i) {
 
        $data = paginate_data($a, $i);
        $tpl = get_markup_template("paginate.tpl");
@@ -491,7 +492,7 @@ function item_new_uri($hostname,$uid, $guid = "") {
 
                $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1",
                        dbesc($uri));
-               if(count($r))
+               if (dbm::is_result($r))
                        $dups = true;
        } while($dups == true);
        return $uri;
@@ -515,7 +516,7 @@ function photo_new_resource() {
                $r = q("SELECT `id` FROM `photo` WHERE `resource-id` = '%s' LIMIT 1",
                        dbesc($resource)
                );
-               if(count($r))
+               if (dbm::is_result($r))
                        $found = true;
        } while($found == true);
        return $resource;
@@ -699,7 +700,7 @@ $LOGGER_LEVELS = array();
  * @param int $level
  */
 function logger($msg, $level = 0) {
-       global $a;
+       $a = get_app();
        global $db;
        global $LOGGER_LEVELS;
 
@@ -753,6 +754,72 @@ function logger($msg, $level = 0) {
        $a->save_timestamp($stamp1, "file");
 }}
 
+/**
+ * @brief An alternative logger for development.
+ * Works largely as logger() but allows developers
+ * to isolate particular elements they are targetting
+ * personally without background noise
+ *
+ * log levels:
+ * LOGGER_NORMAL (default)
+ * LOGGER_TRACE
+ * LOGGER_DEBUG
+ * LOGGER_DATA
+ * LOGGER_ALL
+ *
+ * @global App $a
+ * @global dba $db
+ * @global array $LOGGER_LEVELS
+ * @param string $msg
+ * @param int $level
+ */
+
+function dlogger($msg, $level = 0) {
+       $a = get_app();
+       global $db;
+
+       // turn off logger in install mode
+       if (
+               $a->module == 'install'
+               || ! ($db && $db->connected)
+       ) {
+               return;
+       }
+
+       $logfile = get_config('system','dlogfile');
+
+       if (! $logfile) {
+               return;
+       }
+
+       if (count($LOGGER_LEVELS) == 0) {
+               foreach (get_defined_constants() as $k => $v) {
+                       if (substr($k, 0, 7) == "LOGGER_") {
+                               $LOGGER_LEVELS[$v] = substr($k, 7, 7);
+                       }
+               }
+       }
+
+       $process_id = session_id();
+
+       if ($process_id == '') {
+               $process_id = get_app()->process_id;
+       }
+
+       $callers = debug_backtrace();
+       $logline = sprintf("%s@\t%s:\t%s:\t%s\t%s\t%s\n",
+                       datetime_convert(),
+                       $process_id,
+                       basename($callers[0]['file']),
+                       $callers[0]['line'],
+                       $callers[1]['function'],
+                       $msg
+               );
+
+       $stamp1 = microtime(true);
+       @file_put_contents($logfile, $logline, FILE_APPEND);
+       $a->save_timestamp($stamp1, "file");
+}
 
 if(! function_exists('activity_match')) {
 /**
@@ -875,14 +942,14 @@ function contact_block() {
                return $o;
        $r = q("SELECT COUNT(*) AS `total` FROM `contact`
                        WHERE `uid` = %d AND NOT `self` AND NOT `blocked`
-                               AND NOT `hidden` AND NOT `archive`
+                               AND NOT `pending` AND NOT `hidden` AND NOT `archive`
                                AND `network` IN ('%s', '%s', '%s')",
                        intval($a->profile['uid']),
                        dbesc(NETWORK_DFRN),
                        dbesc(NETWORK_OSTATUS),
                        dbesc(NETWORK_DIASPORA)
        );
-       if(count($r)) {
+       if (dbm::is_result($r)) {
                $total = intval($r[0]['total']);
        }
        if(! $total) {
@@ -893,25 +960,27 @@ function contact_block() {
                // Splitting the query in two parts makes it much faster
                $r = q("SELECT `id` FROM `contact`
                                WHERE `uid` = %d AND NOT `self` AND NOT `blocked`
-                                       AND NOT `hidden` AND NOT `archive`
-                               AND `network` IN ('%s', '%s', '%s') ORDER BY RAND() LIMIT %d",
+                                       AND NOT `pending` AND NOT `hidden` AND NOT `archive`
+                                       AND `network` IN ('%s', '%s', '%s')
+                               ORDER BY RAND() LIMIT %d",
                                intval($a->profile['uid']),
                                dbesc(NETWORK_DFRN),
                                dbesc(NETWORK_OSTATUS),
                                dbesc(NETWORK_DIASPORA),
                                intval($shown)
                );
-               if ($r) {
-                       $contacts = "";
-                       foreach ($r AS $contact)
+               if (dbm::is_result($r)) {
+                       $contacts = array();
+                       foreach ($r AS $contact) {
                                $contacts[] = $contact["id"];
-
+                       }
                        $r = q("SELECT `id`, `uid`, `addr`, `url`, `name`, `thumb`, `network` FROM `contact` WHERE `id` IN (%s)",
                                dbesc(implode(",", $contacts)));
-                       if(count($r)) {
+
+                       if (dbm::is_result($r)) {
                                $contacts = sprintf( tt('%d Contact','%d Contacts', $total),$total);
                                $micropro = Array();
-                               foreach($r as $rr) {
+                               foreach ($r as $rr) {
                                        $micropro[] = micropro($rr,true,'mpfriend');
                                }
                        }
@@ -1182,12 +1251,12 @@ function redir_private_images($a, &$item)
        $cnt = preg_match_all('|\[img\](http[^\[]*?/photo/[a-fA-F0-9]+?(-[0-9]\.[\w]+?)?)\[\/img\]|', $item['body'], $matches, PREG_SET_ORDER);
        if ($cnt) {
                foreach ($matches as $mtch) {
-                       if(strpos($mtch[1], '/redir') !== false) {
+                       if (strpos($mtch[1], '/redir') !== false) {
                                continue;
                        }
 
                        if ((local_user() == $item['uid']) && ($item['private'] != 0) && ($item['contact-id'] != $a->contact['id']) && ($item['network'] == NETWORK_DFRN)) {
-                               $img_url = '/redir?f=1&quiet=1&url=' . urlencode($mtch[1]) . '&conurl=' . urlencode($item['author-link']);
+                               $img_url = 'redir?f=1&quiet=1&url=' . urlencode($mtch[1]) . '&conurl=' . urlencode($item['author-link']);
                                $item['body'] = str_replace($mtch[0], '[img]' . $img_url . '[/img]', $item['body']);
                        }
                }
@@ -1366,7 +1435,7 @@ function prepare_body(&$item,$attach = false, $preview = false) {
        // map
        if(strpos($s,'<div class="map">') !== false && $item['coord']) {
                $x = generate_map(trim($item['coord']));
-               if($x) {
+               if ($x) {
                        $s = preg_replace('/\<div class\=\"map\"\>/','$0' . $x,$s);
                }
        }
@@ -1716,7 +1785,7 @@ function bb_translate_video($s) {
 
        $matches = null;
        $r = preg_match_all("/\[video\](.*?)\[\/video\]/ism",$s,$matches,PREG_SET_ORDER);
-       if($r) {
+       if ($r) {
                foreach($matches as $mtch) {
                        if((stristr($mtch[1],'youtube')) || (stristr($mtch[1],'youtu.be')))
                                $s = str_replace($mtch[0],'[youtube]' . $mtch[1] . '[/youtube]',$s);
@@ -1931,7 +2000,7 @@ function file_tag_update_pconfig($uid,$file_old,$file_new,$type = 'file') {
                        //      intval($uid)
                        //);
 
-                       if(count($r)) {
+                       if (dbm::is_result($r)) {
                                unset($deleted_tags[$key]);
                        }
                        else {
@@ -1961,7 +2030,7 @@ function file_tag_save_file($uid,$item,$file) {
                intval($item),
                intval($uid)
        );
-       if(count($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) . ']'),
@@ -1999,8 +2068,9 @@ function file_tag_unsave_file($uid,$item,$file,$cat = false) {
                intval($item),
                intval($uid)
        );
-       if(! count($r))
+       if (! dbm::is_result($r)) {
                return false;
+       }
 
        q("UPDATE `item` SET `file` = '%s' WHERE `id` = %d AND `uid` = %d",
                dbesc(str_replace($pattern,'',$r[0]['file'])),
@@ -2019,11 +2089,11 @@ function file_tag_unsave_file($uid,$item,$file,$cat = false) {
        //$r = q("select file from item where uid = %d and deleted = 0 " . file_tag_file_query('item',$file,(($cat) ? 'category' : 'file')),
        //);
 
-       if(! count($r)) {
+       if (! dbm::is_result($r)) {
                $saved = get_pconfig($uid,'system','filetags');
                set_pconfig($uid,'system','filetags',str_replace($pattern,'',$saved));
-
        }
+
        return true;
 }
 
@@ -2043,13 +2113,6 @@ function undo_post_tagging($s) {
        return $s;
 }
 
-function fix_mce_lf($s) {
-       $s = str_replace("\r\n","\n",$s);
-//     $s = str_replace("\n\n","\n",$s);
-       return $s;
-}
-
-
 function protect_sprintf($s) {
        return(str_replace('%','%%',$s));
 }
@@ -2071,17 +2134,19 @@ function is_a_date_arg($s) {
 /**
  * remove intentation from a text
  */
-function deindent($text, $chr="[\t ]", $count=NULL) {
-       $text = fix_mce_lf($text);
+function deindent($text, $chr = "[\t ]", $count = NULL) {
        $lines = explode("\n", $text);
        if (is_null($count)) {
                $m = array();
-               $k=0; while($k<count($lines) && strlen($lines[$k])==0) $k++;
-               preg_match("|^".$chr."*|", $lines[$k], $m);
+               $k = 0;
+               while ($k < count($lines) && strlen($lines[$k]) == 0) {
+                       $k++;
+               }
+               preg_match("|^" . $chr . "*|", $lines[$k], $m);
                $count = strlen($m[0]);
        }
-       for ($k=0; $k<count($lines); $k++){
-               $lines[$k] = preg_replace("|^".$chr."{".$count."}|", "", $lines[$k]);
+       for ($k=0; $k < count($lines); $k++) {
+               $lines[$k] = preg_replace("|^" . $chr . "{" . $count . "}|", "", $lines[$k]);
        }
 
        return implode("\n", $lines);
@@ -2127,47 +2192,48 @@ function format_network_name($network, $url = 0) {
  * @param string $lang Programming language
  * @return string Formated html
  */
-function text_highlight($s,$lang) {
-       if($lang === 'js')
+function text_highlight($s, $lang) {
+       if ($lang === 'js') {
                $lang = 'javascript';
-
-       if(! strpos('Text_Highlighter',get_include_path())) {
-               set_include_path(get_include_path() . PATH_SEPARATOR . 'library/Text_Highlighter');
        }
 
-       require_once('library/Text_Highlighter/Text/Highlighter.php');
-       require_once('library/Text_Highlighter/Text/Highlighter/Renderer/Html.php');
+       // @TODO: Replace Text_Highlighter_Renderer_Html by scrivo/highlight.php
+
+       // Autoload the library to make constants available
+       class_exists('Text_Highlighter_Renderer_Html');
+
        $options = array(
                'numbers' => HL_NUMBERS_LI,
                'tabsize' => 4,
-               );
+       );
 
        $tag_added = false;
-       $s = trim(html_entity_decode($s,ENT_COMPAT));
-       $s = str_replace("    ","\t",$s);
+       $s = trim(html_entity_decode($s, ENT_COMPAT));
+       $s = str_replace('    ', "\t", $s);
 
        // The highlighter library insists on an opening php tag for php code blocks. If
        // it isn't present, nothing is highlighted. So we're going to see if it's present.
        // If not, we'll add it, and then quietly remove it after we get the processed output back.
 
-       if($lang === 'php') {
-               if(strpos('<?php',$s) !== 0) {
+       if ($lang === 'php') {
+               if (strpos($s, '<?php') !== 0) {
                        $s = '<?php' . "\n" . $s;
                        $tag_added = true;
                }
        }
 
-       $renderer = new Text_Highlighter_Renderer_HTML($options);
+       $renderer = new Text_Highlighter_Renderer_Html($options);
        $hl = Text_Highlighter::factory($lang);
        $hl->setRenderer($renderer);
        $o = $hl->highlight($s);
-       $o = str_replace(["    ","\n"],["&nbsp;&nbsp;&nbsp;&nbsp;",''],$o);
+       $o = str_replace("\n", '', $o);
+
 
-       if($tag_added) {
-               $b = substr($o,0,strpos($o,'<li>'));
-               $e = substr($o,strpos($o,'</li>'));
+       if ($tag_added) {
+               $b = substr($o, 0, strpos($o, '<li>'));
+               $e = substr($o, strpos($o, '</li>'));
                $o = $b . $e;
        }
 
-       return('<code>' . $o . '</code>');
+       return '<code>' . $o . '</code>';
 }