X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Ftext.php;h=2099f88c106923b07cb4490deba8570600d7fda3;hb=35abc4bb64bbb461e6448beed10484c028b74340;hp=f1bc5123269be18a4bfc628f368fda19975e893b;hpb=e84c48b979ab265cd29ff3624e975e288c6755fc;p=friendica.git diff --git a/include/text.php b/include/text.php index f1bc512326..2099f88c10 100644 --- a/include/text.php +++ b/include/text.php @@ -12,17 +12,21 @@ use Friendica\Core\Addon; use Friendica\Core\Config; use Friendica\Core\L10n; use Friendica\Core\PConfig; +use Friendica\Core\Protocol; use Friendica\Core\System; -use Friendica\Database\DBM; +use Friendica\Database\DBA; use Friendica\Model\Contact; use Friendica\Model\Event; use Friendica\Model\Item; -use Friendica\Model\Profile; use Friendica\Render\FriendicaSmarty; use Friendica\Util\DateTimeFormat; use Friendica\Util\Map; +use Friendica\Util\Proxy as ProxyUtils; + +use Friendica\Core\Logger; +use Friendica\Core\Renderer; +use Friendica\Model\FileTag; -require_once "mod/proxy.php"; require_once "include/conversation.php"; /** @@ -33,26 +37,21 @@ require_once "include/conversation.php"; * @param array $r key value pairs (search => replace) * @return string substituted string */ -function replace_macros($s, $r) { - - $stamp1 = microtime(true); - - $a = get_app(); - - // pass $baseurl to all templates - $r['$baseurl'] = System::baseUrl(); - - $t = $a->template_engine(); - try { - $output = $t->replaceMacros($s, $r); - } catch (Exception $e) { - echo "
" . __FUNCTION__ . ": " . $e->getMessage() . "
"; - killme(); - } - - $a->save_timestamp($stamp1, "rendering"); +function replace_macros($s, $r) +{ + return Renderer::replaceMacros($s, $r); +} - return $output; +/** + * load template $s + * + * @param string $s + * @param string $root + * @return string + */ +function get_markup_template($s, $root = '') +{ + return Renderer::getMarkupTemplate($s, $root); } /** @@ -262,139 +261,13 @@ function unxmlify($s) { return $ret; } - -/** - * @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 minimal pager) - * @return Array data for pagination template - */ -function paginate_data(App $a, $count = null) { - $stripped = preg_replace('/([&?]page=[0-9]*)/', '', $a->query_string); - - $stripped = str_replace('q=', '', $stripped); - $stripped = trim($stripped, '/'); - $pagenum = $a->pager['page']; - - if (($a->page_offset != '') && !preg_match('/[?&].offset=/', $stripped)) { - $stripped .= '&offset=' . urlencode($a->page_offset); - } - - $url = $stripped; - $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] = ['url' => $url, 'text' => $text, 'class' => $class]; - } - - if (!is_null($count)) { - // minimal pager (newer / older) - $data['class'] = 'pager'; - _l($data, 'prev', $url . '&page=' . ($a->pager['page'] - 1), L10n::t('newer'), 'previous' . ($a->pager['page'] == 1 ? ' disabled' : '')); - _l($data, 'next', $url . '&page=' . ($a->pager['page'] + 1), L10n::t('older'), 'next' . ($count <= 0 ? ' disabled' : '')); - } else { - // 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', L10n::t('first'), $a->pager['page'] == 1 ? 'disabled' : ''); - _l($data, 'prev', $url . '&page=' . ($a->pager['page'] - 1), L10n::t('prev'), $a->pager['page'] == 1 ? 'disabled' : ''); - - $numpages = $a->pager['total'] / $a->pager['itemspage']; - - $numstart = 1; - $numstop = $numpages; - - // 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 = []; - - 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 active'); - } else { - _l($pages, $i, $url . '&page=' . $i, $i, 'n'); - } - } - - $data['pages'] = $pages; - - $lastpage = (($numpages > intval($numpages)) ? intval($numpages)+1 : $numpages); - _l($data, 'next', $url . '&page=' . ($a->pager['page'] + 1), L10n::t('next'), $a->pager['page'] == $lastpage ? 'disabled' : ''); - _l($data, 'last', $url . '&page=' . $lastpage, L10n::t('last'), $a->pager['page'] == $lastpage ? 'disabled' : ''); - } - } - - return $data; -} - - -/** - * Automatic pagination. - * - * To use, get the count of total items. - * Then call $a->set_pager_total($number_items); - * Optionally call $a->set_pager_itemspage($n) to the number of items to display on each page - * Then call paginate($a) after the end of the display loop to insert the pager block on the page - * (assuming there are enough items to paginate). - * When using with SQL, the setting LIMIT %d, %d => $a->pager['start'],$a->pager['itemspage'] - * will limit the results to the correct items for the current page. - * The actual page handling is then accomplished at the application layer. - * - * @param App $a App instance - * @return string html for pagination #FIXME remove html - */ -function paginate(App $a) { - - $data = paginate_data($a); - $tpl = get_markup_template("paginate.tpl"); - return replace_macros($tpl, ["pager" => $data]); - -} - - -/** - * Alternative pager - * @param App $a App instance - * @param int $i - * @return string html for pagination #FIXME remove html - */ -function alt_pager(App $a, $i) { - - $data = paginate_data($a, $i); - $tpl = get_markup_template("paginate.tpl"); - return replace_macros($tpl, ['pager' => $data]); - -} - - /** * Loader for infinite scrolling * @return string html for loader */ function scroll_loader() { - $tpl = get_markup_template("scroll_loader.tpl"); - return replace_macros($tpl, [ + $tpl = Renderer::getMarkupTemplate("scroll_loader.tpl"); + return Renderer::replaceMacros($tpl, [ 'wait' => L10n::t('Loading more entries...'), 'end' => L10n::t('The end') ]); @@ -462,110 +335,6 @@ function perms2str($p) { return $ret; } -/** - * @deprecated - * wrapper to load a view template, checking for alternate - * languages before falling back to the default - * - * @global string $lang - * @global App $a - * @param string $s view name - * @return string - */ -function load_view_file($s) { - global $lang, $a; - if (! isset($lang)) { - $lang = 'en'; - } - $b = basename($s); - $d = dirname($s); - if (file_exists("$d/$lang/$b")) { - $stamp1 = microtime(true); - $content = file_get_contents("$d/$lang/$b"); - $a->save_timestamp($stamp1, "file"); - return $content; - } - - $theme = $a->getCurrentTheme(); - - if (file_exists("$d/theme/$theme/$b")) { - $stamp1 = microtime(true); - $content = file_get_contents("$d/theme/$theme/$b"); - $a->save_timestamp($stamp1, "file"); - return $content; - } - - $stamp1 = microtime(true); - $content = file_get_contents($s); - $a->save_timestamp($stamp1, "file"); - return $content; -} - - -/** - * load a view template, checking for alternate - * languages before falling back to the default - * - * @global string $lang - * @param string $s view path - * @return string - */ -function get_intltext_template($s) { - global $lang; - - $a = get_app(); - $engine = ''; - if ($a->theme['template_engine'] === 'smarty3') { - $engine = "/smarty3"; - } - - if (! isset($lang)) { - $lang = 'en'; - } - - if (file_exists("view/lang/$lang$engine/$s")) { - $stamp1 = microtime(true); - $content = file_get_contents("view/lang/$lang$engine/$s"); - $a->save_timestamp($stamp1, "file"); - return $content; - } elseif (file_exists("view/lang/en$engine/$s")) { - $stamp1 = microtime(true); - $content = file_get_contents("view/lang/en$engine/$s"); - $a->save_timestamp($stamp1, "file"); - return $content; - } else { - $stamp1 = microtime(true); - $content = file_get_contents("view$engine/$s"); - $a->save_timestamp($stamp1, "file"); - return $content; - } -} - - -/** - * load template $s - * - * @param string $s - * @param string $root - * @return string - */ -function get_markup_template($s, $root = '') { - $stamp1 = microtime(true); - - $a = get_app(); - $t = $a->template_engine(); - try { - $template = $t->getTemplateFile($s, $root); - } catch (Exception $e) { - echo "
" . __FUNCTION__ . ": " . $e->getMessage() . "
"; - killme(); - } - - $a->save_timestamp($stamp1, "file"); - - return $template; -} - /** * for html,xml parsing - let's say you've got * an attribute foobar="class1 class2 class3" @@ -585,149 +354,6 @@ function attribute_contains($attr, $s) { return (count($a) && in_array($s,$a)); } - -/* setup int->string log level map */ -$LOGGER_LEVELS = []; - -/** - * @brief Logs the given message at the given log level - * - * log levels: - * LOGGER_NORMAL (default) - * LOGGER_TRACE - * LOGGER_DEBUG - * LOGGER_DATA - * LOGGER_ALL - * - * @global App $a - * @global array $LOGGER_LEVELS - * @param string $msg - * @param int $level - */ -function logger($msg, $level = 0) { - $a = get_app(); - global $LOGGER_LEVELS; - - // turn off logger in install mode - if ( - $a->mode == App::MODE_INSTALL - || !dba::$connected - ) { - return; - } - - $debugging = Config::get('system','debugging'); - $logfile = Config::get('system','logfile'); - $loglevel = intval(Config::get('system','loglevel')); - - if ( - ! $debugging - || ! $logfile - || $level > $loglevel - ) { - 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@%s\t[%s]:%s:%s:%s\t%s\n", - DateTimeFormat::utcNow(DateTimeFormat::ATOM), - $process_id, - $LOGGER_LEVELS[$level], - 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"); -} - -/** - * @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 array $LOGGER_LEVELS - * @param string $msg - * @param int $level - */ - -function dlogger($msg, $level = 0) { - $a = get_app(); - - // turn off logger in install mode - if ( - $a->mode == App::MODE_INSTALL - || !dba::$connected - ) { - return; - } - - $logfile = Config::get('system', 'dlogfile'); - if (! $logfile) { - return; - } - - $dlogip = Config::get('system', 'dlogip'); - if (!is_null($dlogip) && $_SERVER['REMOTE_ADDR'] != $dlogip) { - 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", - DateTimeFormat::utcNow(), - $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"); -} - - /** * Compare activity uri. Knows about activity namespace. * @@ -846,11 +472,11 @@ function contact_block() { 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) + DBA::escape(Protocol::DFRN), + DBA::escape(Protocol::OSTATUS), + DBA::escape(Protocol::DIASPORA) ); - if (DBM::is_result($r)) { + if (DBA::isResult($r)) { $total = intval($r[0]['total']); } if (!$total) { @@ -864,20 +490,20 @@ function contact_block() { AND `network` IN ('%s', '%s', '%s') ORDER BY RAND() LIMIT %d", intval($a->profile['uid']), - dbesc(NETWORK_DFRN), - dbesc(NETWORK_OSTATUS), - dbesc(NETWORK_DIASPORA), + DBA::escape(Protocol::DFRN), + DBA::escape(Protocol::OSTATUS), + DBA::escape(Protocol::DIASPORA), intval($shown) ); - if (DBM::is_result($r)) { + if (DBA::isResult($r)) { $contacts = []; foreach ($r AS $contact) { $contacts[] = $contact["id"]; } $r = q("SELECT `id`, `uid`, `addr`, `url`, `name`, `thumb`, `network` FROM `contact` WHERE `id` IN (%s)", - dbesc(implode(",", $contacts))); + DBA::escape(implode(",", $contacts))); - if (DBM::is_result($r)) { + if (DBA::isResult($r)) { $contacts = L10n::tt('%d Contact', '%d Contacts', $total); $micropro = []; foreach ($r as $rr) { @@ -887,8 +513,8 @@ function contact_block() { } } - $tpl = get_markup_template('contact_block.tpl'); - $o = replace_macros($tpl, [ + $tpl = Renderer::getMarkupTemplate('contact_block.tpl'); + $o = Renderer::replaceMacros($tpl, [ '$contacts' => $contacts, '$nickname' => $a->profile['nickname'], '$viewcontacts' => L10n::t('View Contacts'), @@ -945,11 +571,11 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) { $url = ''; } - return replace_macros(get_markup_template(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'),[ + return Renderer::replaceMacros(Renderer::getMarkupTemplate(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'),[ '$click' => defaults($contact, 'click', ''), '$class' => $class, '$url' => $url, - '$photo' => proxy_url($contact['thumb'], false, PROXY_SIZE_THUMB), + '$photo' => ProxyUtils::proxifyUrl($contact['thumb'], false, ProxyUtils::SIZE_THUMB), '$name' => $contact['name'], 'title' => $contact['name'] . ' [' . $contact['addr'] . ']', '$parkle' => $sparkle, @@ -1000,7 +626,7 @@ function search($s, $id = 'search-box', $url = 'search', $save = false, $aside = } } - return replace_macros(get_markup_template('searchbox.tpl'), $values); + return Renderer::replaceMacros(Renderer::getMarkupTemplate('searchbox.tpl'), $values); } /** @@ -1130,7 +756,7 @@ function redir_private_images($a, &$item) continue; } - if ((local_user() == $item['uid']) && ($item['private'] != 0) && ($item['contact-id'] != $a->contact['id']) && ($item['network'] == NETWORK_DFRN)) { + if ((local_user() == $item['uid']) && ($item['private'] == 1) && ($item['contact-id'] != $a->contact['id']) && ($item['network'] == Protocol::DFRN)) { $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']); } @@ -1156,7 +782,7 @@ function put_item_in_cache(&$item, $update = false) $rendered_html = defaults($item, 'rendered-html', ''); if ($rendered_hash == '' - || $item["rendered-html"] == "" + || $rendered_html == "" || $rendered_hash != hash("md5", $item["body"]) || Config::get("system", "ignore_cache") ) { @@ -1166,6 +792,12 @@ function put_item_in_cache(&$item, $update = false) $item["rendered-html"] = prepare_text($item["body"]); $item["rendered-hash"] = hash("md5", $item["body"]); + $hook_data = ['item' => $item, 'rendered-html' => $item['rendered-html'], 'rendered-hash' => $item['rendered-hash']]; + Addon::callHooks('put_item_in_cache', $hook_data); + $item['rendered-html'] = $hook_data['rendered-html']; + $item['rendered-hash'] = $hook_data['rendered-hash']; + unset($hook_data); + // Force an update if the generated values differ from the existing ones if ($rendered_hash != $item["rendered-hash"]) { $update = true; @@ -1176,7 +808,7 @@ function put_item_in_cache(&$item, $update = false) $update = true; } - if ($update && ($item["id"] > 0)) { + if ($update && !empty($item["id"])) { Item::update(['rendered-html' => $item["rendered-html"], 'rendered-hash' => $item["rendered-hash"]], ['id' => $item["id"]]); } @@ -1253,7 +885,7 @@ function prepare_body(array &$item, $attach = false, $is_preview = false) $s = $hook_data['html']; unset($hook_data); - if (! $attach) { + if (!$attach) { // Replace the blockquotes with quotes that are used in mails. $mailquote = '
'; $s = str_replace(['
', '
', '
'], [$mailquote, $mailquote, $mailquote], $s); @@ -1272,16 +904,14 @@ function prepare_body(array &$item, $attach = false, $is_preview = false) if (strpos($mime, 'video') !== false) { if (!$vhead) { $vhead = true; - $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'), [ + $a->page['htmlhead'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('videos_head.tpl'), [ '$baseurl' => System::baseUrl(), ]); } - $id = end(explode('/', $the_url)); - $as .= replace_macros(get_markup_template('video_top.tpl'), [ + $url_parts = explode('/', $the_url); + $id = end($url_parts); + $as .= Renderer::replaceMacros(Renderer::getMarkupTemplate('video_top.tpl'), [ '$video' => [ 'id' => $id, 'title' => L10n::t('View Video'), @@ -1376,8 +1006,8 @@ function prepare_body(array &$item, $attach = false, $is_preview = false) function apply_content_filter($html, array $reasons) { if (count($reasons)) { - $tpl = get_markup_template('wall/content_filter.tpl'); - $html = replace_macros($tpl, [ + $tpl = Renderer::getMarkupTemplate('wall/content_filter.tpl'); + $html = Renderer::replaceMacros($tpl, [ '$reasons' => $reasons, '$rnd' => random_string(8), '$openclose' => L10n::t('Click to open/close'), @@ -1442,9 +1072,9 @@ function get_cats_and_terms($item) if ($cnt) { foreach ($matches as $mtch) { $categories[] = [ - 'name' => xmlify(file_tag_decode($mtch[1])), + 'name' => xmlify(FileTag::decode($mtch[1])), 'url' => "#", - 'removeurl' => ((local_user() == $item['uid'])?'filerm/' . $item['id'] . '?f=&cat=' . xmlify(file_tag_decode($mtch[1])):""), + 'removeurl' => ((local_user() == $item['uid'])?'filerm/' . $item['id'] . '?f=&cat=' . xmlify(FileTag::decode($mtch[1])):""), 'first' => $first, 'last' => false ]; @@ -1463,9 +1093,9 @@ function get_cats_and_terms($item) if ($cnt) { foreach ($matches as $mtch) { $folders[] = [ - 'name' => xmlify(file_tag_decode($mtch[1])), + 'name' => xmlify(FileTag::decode($mtch[1])), 'url' => "#", - 'removeurl' => ((local_user() == $item['uid']) ? 'filerm/' . $item['id'] . '?f=&term=' . xmlify(file_tag_decode($mtch[1])) : ""), + 'removeurl' => ((local_user() == $item['uid']) ? 'filerm/' . $item['id'] . '?f=&term=' . xmlify(FileTag::decode($mtch[1])) : ""), 'first' => $first, 'last' => false ]; @@ -1500,7 +1130,7 @@ function get_plink($item) { ]; if (x($item, 'plink')) { - $ret["href"] = $a->remove_baseurl($item['plink']); + $ret["href"] = $a->removeBaseURL($item['plink']); $ret["title"] = L10n::t('link to source'); } @@ -1542,26 +1172,6 @@ function return_bytes($size_str) { } } - -/** - * @return string - */ -function generate_user_guid() { - $found = true; - do { - $guid = get_guid(32); - $x = q("SELECT `uid` FROM `user` WHERE `guid` = '%s' LIMIT 1", - dbesc($guid) - ); - if (! DBM::is_result($x)) { - $found = false; - } - } while ($found == true); - - return $guid; -} - - /** * @param string $s * @param boolean $strip_padding @@ -1585,7 +1195,7 @@ function base64url_encode($s, $strip_padding = false) { function base64url_decode($s) { if (is_array($s)) { - logger('base64url_decode: illegal input: ' . print_r(debug_backtrace(), true)); + Logger::log('base64url_decode: illegal input: ' . print_r(debug_backtrace(), true)); return $s; } @@ -1595,7 +1205,7 @@ function base64url_decode($s) { * // Uncomment if you find you need it. * * $l = strlen($s); - * if (! strpos($s,'=')) { + * if (!strpos($s,'=')) { * $m = $l % 4; * if ($m == 2) * $s .= '=='; @@ -1710,11 +1320,11 @@ function reltoabs($text, $base) { * @return string */ function item_post_type($item) { - if (intval($item['event-id'])) { + if (!empty($item['event-id'])) { return L10n::t('event'); - } elseif (strlen($item['resource-id'])) { + } elseif (!empty($item['resource-id'])) { return L10n::t('photo'); - } elseif (strlen($item['verb']) && $item['verb'] !== ACTIVITY_POST) { + } elseif (!empty($item['verb']) && $item['verb'] !== ACTIVITY_POST) { return L10n::t('activity'); } elseif ($item['id'] != $item['parent']) { return L10n::t('comment'); @@ -1723,205 +1333,6 @@ function item_post_type($item) { return L10n::t('post'); } -// post categories and "save to file" use the same item.file table for storage. -// We will differentiate the different uses by wrapping categories in angle brackets -// and save to file categories in square brackets. -// To do this we need to escape these characters if they appear in our tag. - -function file_tag_encode($s) { - return str_replace(['<','>','[',']'],['%3c','%3e','%5b','%5d'],$s); -} - -function file_tag_decode($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)) . ']'); - } else { - $str = preg_quote('<' . str_replace('%', '%%', file_tag_encode($s)) . '>'); - } - return " AND " . (($table) ? dbesc($table) . '.' : '') . "file regexp '" . dbesc($str) . "' "; -} - -// ex. given music,video return