X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Ftext.php;h=ee152902293f6e5a9c4be1802676d5d3a862d5ae;hb=c52973f9565af70c8562806e8b87257a3aa7ca7d;hp=83639ce85cde0eeaa58317b9e79ebc373b05001a;hpb=fdee002f73bce767c364b58daafeccc8eff5927e;p=friendica.git diff --git a/include/text.php b/include/text.php index 83639ce85c..ee15290229 100644 --- a/include/text.php +++ b/include/text.php @@ -12,36 +12,28 @@ require_once("include/template_processor.php"); require_once("include/friendica_smarty.php"); if(! function_exists('replace_macros')) { +/** + * This is our template processor + * + * @param string|FriendicaSmarty $s the string requiring macro substitution, + * or an instance of FriendicaSmarty + * @param array $r key value pairs (search => replace) + * @return string substituted string + */ function replace_macros($s,$r) { - global $t; $stamp1 = microtime(true); $a = get_app(); - if($a->theme['template_engine'] === 'smarty3') { - $template = ''; - if(gettype($s) === 'string') { - $template = $s; - $s = new FriendicaSmarty(); - } - foreach($r as $key=>$value) { - if($key[0] === '$') { - $key = substr($key, 1); - } - $s->assign($key, $value); - } - $output = $s->parsed($template); + $t = $a->template_engine(); + try { + $output = $t->replace_macros($s,$r); + } catch (Exception $e) { + echo "
".__function__.": ".$e->getMessage().""; killme(); } - else { - $r = $t->replace($s,$r); - $output = template_unescape($r); - } - $a = get_app(); - $stamp2 = microtime(true); - $duration = (float)($stamp2-$stamp1); - $a->performance["rendering"] += (float)$duration; + $a->save_timestamp($stamp1, "rendering"); return $output; }} @@ -61,8 +53,9 @@ function random_string($size = 64,$type = RANDOM_STRING_HEX) { return(substr($s,0,$size)); }} +if(! function_exists('notags')) { /** - * This is our primary input filter. + * This is our primary input filter. * * The high bit hack only involved some old IE browser, forget which (IE5/Mac?) * that had an XSS attack vector due to stripping the high-bit on an 8-bit character @@ -75,9 +68,9 @@ function random_string($size = 64,$type = RANDOM_STRING_HEX) { * They will be replaced with safer brackets. This may be filtered further * if these are not allowed either. * + * @param string $string Input string + * @return string Filtered string */ - -if(! function_exists('notags')) { function notags($string) { return(str_replace(array("<",">"), array('[',']'), $string)); @@ -86,10 +79,15 @@ function notags($string) { // return(str_replace(array("<",">","\xBA","\xBC","\xBE"), array('[',']','','',''), $string)); }} -// use this on "body" or "content" input where angle chars shouldn't be removed, -// and allow them to be safely displayed. + 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. + * @param string $string + * @return string + */ function escape_tags($string) { return(htmlspecialchars($string, ENT_COMPAT, 'UTF-8', false)); @@ -100,6 +98,12 @@ function escape_tags($string) { // used to generate initial passwords if(! function_exists('autoname')) { +/** + * generate a string that's random, but usually pronounceable. + * used to generate initial passwords + * @param int $len + * @return string + */ function autoname($len) { if($len <= 0) @@ -175,11 +179,17 @@ function autoname($len) { // returns escaped text. if(! function_exists('xmlify')) { +/** + * escape text ($str) for XML transport + * @param string $str + * @return string Escaped text. + */ function xmlify($str) { - $buffer = ''; +/* $buffer = ''; - for($x = 0; $x < mb_strlen($str); $x ++) { - $char = $str[$x]; + $len = mb_strlen($str); + for($x = 0; $x < $len; $x ++) { + $char = mb_substr($str,$x,1); switch( $char ) { @@ -207,24 +217,41 @@ function xmlify($str) { $buffer .= $char; break; } - } + }*/ + + $buffer = mb_ereg_replace("&", "&", $str); + $buffer = mb_ereg_replace("'", "'", $buffer); + $buffer = mb_ereg_replace("\"", """, $buffer); + $buffer = mb_ereg_replace("<", "<", $buffer); + $buffer = mb_ereg_replace(">", ">", $buffer); + $buffer = trim($buffer); return($buffer); }} -// undo an xmlify -// pass xml escaped text ($s), returns unescaped text - if(! function_exists('unxmlify')) { +/** + * undo an xmlify + * @param string $s xml escaped text + * @return string unescaped text + */ function unxmlify($s) { - $ret = str_replace('&','&', $s); - $ret = str_replace(array('<','>','"','''),array('<','>','"',"'"),$ret); +// $ret = str_replace('&','&', $s); +// $ret = str_replace(array('<','>','"','''),array('<','>','"',"'"),$ret); + $ret = mb_ereg_replace('&', '&', $s); + $ret = mb_ereg_replace(''', "'", $ret); + $ret = mb_ereg_replace('"', '"', $ret); + $ret = mb_ereg_replace('<', "<", $ret); + $ret = mb_ereg_replace('>', ">", $ret); return $ret; }} -// convenience wrapper, reverse the operation "bin2hex" - 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 ''; @@ -236,100 +263,139 @@ function hex2bin($s) { return(pack("H*",$s)); }} -// 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. -if(! function_exists('paginate')) { -function paginate(&$a) { - $o = ''; +if(! function_exists('paginate_data')) { +/** + * Automatica pagination data. + * + * @param App $a App instance + * @param int $count [optional] item count (used with alt pager) + * @return Array data for pagination template + */ +function paginate_data(&$a, $count=null) { $stripped = preg_replace('/(&page=[0-9]*)/','',$a->query_string); -// $stripped = preg_replace('/&zrl=(.*?)([\?&]|$)/ism','',$stripped); - $stripped = str_replace('q=','',$stripped); $stripped = trim($stripped,'/'); $pagenum = $a->pager['page']; + + if (($a->page_offset != "") AND !strstr($stripped, "&offset=")) + $stripped .= "&offset=".urlencode($a->page_offset); + if (!strpos($stripped, "?")) { + if ($pos = strpos($stripped, "&")) + $stripped = substr($stripped, 0, $pos)."?".substr($stripped, $pos + 1); + } + $url = $a->get_baseurl() . '/' . $stripped; + $data = array(); + function _l(&$d, $name, $url, $text, $class="") { - if($a->pager['total'] > $a->pager['itemspage']) { - $o .= '
".__function__.": ".$e->getMessage().""; killme(); } + + $a->save_timestamp($stamp1, "file"); + + return $template; }} if(! function_exists("get_template_file")) { +/** + * + * @param App $a + * @param string $filename + * @param string $root + * @return string + */ function get_template_file($a, $filename, $root = '') { $theme = current_theme(); @@ -519,6 +620,8 @@ function get_template_file($a, $filename, $root = '') { $template_file = "{$root}view/theme/$theme/$filename"; elseif (x($a->theme_info,"extends") && file_exists("{$root}view/theme/{$a->theme_info["extends"]}/$filename")) $template_file = "{$root}view/theme/{$a->theme_info["extends"]}/$filename"; + elseif (file_exists("{$root}/$filename")) + $template_file = "{$root}/$filename"; else $template_file = "{$root}view/$filename"; @@ -529,16 +632,23 @@ function get_template_file($a, $filename, $root = '') { -// for html,xml parsing - let's say you've got -// an attribute foobar="class1 class2 class3" -// and you want to find out if it contains 'class3'. -// you can't use a normal sub string search because you -// might match 'notclass3' and a regex to do the job is -// possible but a bit complicated. -// pass the attribute string as $attr and the attribute you -// are looking for as $s - returns true if found, otherwise false + if(! function_exists('attribute_contains')) { +/** + * for html,xml parsing - let's say you've got + * an attribute foobar="class1 class2 class3" + * and you want to find out if it contains 'class3'. + * you can't use a normal sub string search because you + * might match 'notclass3' and a regex to do the job is + * possible but a bit complicated. + * pass the attribute string as $attr and the attribute you + * are looking for as $s - returns true if found, otherwise false + * + * @param string $attr attribute value + * @param string $s string to search + * @return boolean True if found, False otherwise + */ function attribute_contains($attr,$s) { $a = explode(' ', $attr); if(count($a) && in_array($s,$a)) @@ -547,6 +657,19 @@ function attribute_contains($attr,$s) { }} if(! function_exists('logger')) { +/** + * log levels: + * LOGGER_NORMAL (default) + * LOGGER_TRACE + * LOGGER_DEBUG + * LOGGER_DATA + * LOGGER_ALL + * + * @global App $a + * @global dba $db + * @param string $msg + * @param int $level + */ function logger($msg,$level = 0) { // turn off logger in install mode global $a; @@ -569,6 +692,13 @@ function logger($msg,$level = 0) { if(! function_exists('activity_match')) { +/** + * Compare activity uri. Knows about activity namespace. + * + * @param string $haystack + * @param string $needle + * @return boolean + */ function activity_match($haystack,$needle) { if(($haystack === $needle) || ((basename($needle) === $haystack) && strstr($needle,NAMESPACE_ACTIVITY_SCHEMA))) return true; @@ -576,15 +706,18 @@ function activity_match($haystack,$needle) { }} -// Pull out all #hashtags and @person tags from $s; -// We also get @person@domain.com - which would make -// the regex quite complicated as tags can also -// end a sentence. So we'll run through our results -// and strip the period from any tags which end with one. -// Returns array of tags found, or empty array. - - if(! function_exists('get_tags')) { +/** + * Pull out all #hashtags and @person tags from $s; + * We also get @person@domain.com - which would make + * the regex quite complicated as tags can also + * end a sentence. So we'll run through our results + * and strip the period from any tags which end with one. + * Returns array of tags found, or empty array. + * + * @param string $s + * @return array + */ function get_tags($s) { $ret = array(); @@ -637,9 +770,15 @@ function get_tags($s) { }} -// quick and dirty quoted_printable encoding +// if(! function_exists('qp')) { +/** + * quick and dirty quoted_printable encoding + * + * @param string $s + * @return string + */ function qp($s) { return str_replace ("%","=",rawurlencode($s)); }} @@ -647,6 +786,10 @@ return str_replace ("%","=",rawurlencode($s)); if(! function_exists('get_mentions')) { +/** + * @param array $item + * @return string html for mentions #FIXME: remove html + */ function get_mentions($item) { $o = ''; if(! strlen($item['tag'])) @@ -664,6 +807,13 @@ function get_mentions($item) { }} if(! function_exists('contact_block')) { +/** + * Get html for contact block. + * + * @template contact_block.tpl + * @hook contact_block_end (contacts=>array, output=>string) + * @return string + */ function contact_block() { $o = ''; $a = get_app(); @@ -716,6 +866,14 @@ function contact_block() { }} if(! function_exists('micropro')) { +/** + * + * @param array $contact + * @param boolean $redirect + * @param string $class + * @param boolean $textmode + * @return string #FIXME: remove html + */ function micropro($contact, $redirect = false, $class = '', $textmode = false) { if($class) @@ -760,6 +918,15 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) { if(! function_exists('search')) { +/** + * search box + * + * @param string $s search query + * @param string $id html id + * @param string $url search url + * @param boolean $save show save search button + * @return string html for search box #FIXME: remove html + */ function search($s,$id='search-box',$url='/search',$save = false) { $a = get_app(); $o = '