X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Ftext.php;h=f408e0df6977df32d1b4c59dabb078ec4b96a4e7;hb=b64ddcce96ccf15c51c6755afeff3b1918ecd94f;hp=376ac473de28fab45394501bd45ca15e813f7ffe;hpb=b1dacd6d838ecf75fe828279e57c2e7a866be22f;p=friendica.git
diff --git a/include/text.php b/include/text.php
index 376ac473de..3b35c0b767 100644
--- a/include/text.php
+++ b/include/text.php
@@ -6,22 +6,36 @@
// returns substituted string.
// WARNING: this is pretty basic, and doesn't properly handle search strings that are substrings of each other.
// For instance if 'test' => "foo" and 'testing' => "bar", testing could become either bar or fooing,
-// depending on the order in which they were declared in the array.
+// depending on the order in which they were declared in the array.
require_once("include/template_processor.php");
+require_once("include/friendica_smarty.php");
-if(! function_exists('replace_macros')) {
+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;
-
- //$ts = microtime();
- $r = $t->replace($s,$r);
- //$tt = microtime() - $ts;
-
- //$a = get_app();
- //$a->page['debug'] .= "$tt
\n";
- return template_unescape($r);
+ $stamp1 = microtime(true);
+
+ $a = get_app();
+
+ $t = $a->template_engine();
+ try {
+ $output = $t->replace_macros($s,$r);
+ } catch (Exception $e) {
+ echo "
".__function__.": ".$e->getMessage().""; killme(); + } + + $a->save_timestamp($stamp1, "rendering"); + + return $output; }} @@ -39,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 @@ -53,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)); @@ -64,13 +79,18 @@ 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)); + return(htmlspecialchars($string, ENT_COMPAT, 'UTF-8', false)); }} @@ -78,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) @@ -153,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 ) { @@ -185,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 ''; @@ -214,75 +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="") { + + $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')); + } 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')); - if($a->pager['total'] > $a->pager['itemspage']) { - $o .= '
".__function__.": ".$e->getMessage().""; killme(); + } - if(file_exists("view/theme/$theme/$s")) - return file_get_contents("view/theme/$theme/$s"); - elseif (x($a->theme_info,"extends") && file_exists("view/theme/".$a->theme_info["extends"]."/$s")) - return file_get_contents("view/theme/".$a->theme_info["extends"]."/$s"); + $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(); + + // Make sure $root ends with a slash / + if($root !== '' && $root[strlen($root)-1] !== '/') + $root = $root . '/'; + + if(file_exists("{$root}view/theme/$theme/$filename")) + $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 - return file_get_contents("view/$s"); + $template_file = "{$root}view/$filename"; + return $template_file; }} -// 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)) @@ -436,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; @@ -449,13 +683,22 @@ function logger($msg,$level = 0) { if((! $debugging) || (! $logfile) || ($level > $loglevel)) return; - + + $stamp1 = microtime(true); @file_put_contents($logfile, datetime_convert() . ':' . session_id() . ' ' . $msg . "\n", FILE_APPEND); + $a->save_timestamp($stamp1, "file"); return; }} 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; @@ -463,22 +706,30 @@ 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(); // ignore anything in a code block - $s = preg_replace('/\[code\](.*?)\[\/code\]/sm','',$s); + // Force line feeds at bbtags + $s = str_replace(array("[", "]"), array("\n[", "]\n"), $s); + + // ignore anything in a bbtag + $s = preg_replace('/\[(.*?)\]/sm','',$s); + // Match full names against @tags including the space between first and last // We will look these up afterward to see if they are full names or not recognisable. @@ -498,7 +749,7 @@ function get_tags($s) { // Otherwise pull out single word tags. These can be @nickname, @first_last // and #hash tags. - if(preg_match_all('/([@#][^ \x0D\x0A,;:?]+)([ \x0D\x0A,;:?]|$)/',$s,$match)) { + if(preg_match_all('/([!#@][^ \x0D\x0A,;:?]+)([ \x0D\x0A,;:?]|$)/',$s,$match)) { foreach($match[1] as $mtch) { if(strstr($mtch,"]")) { // we might be inside a bbcode color tag - leave it alone @@ -519,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)); }} @@ -529,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'])) @@ -546,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(); @@ -598,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) @@ -642,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 = '
'; + $s = str_replace(array('', '', ''), array($mailquote, $mailquote, $mailquote), $s); return $s; } - $arr = explode(',',$item['attach']); + $as = ''; + $vhead = false; + $arr = explode('[/attach],',$item['attach']); if(count($arr)) { - $s .= ''; + $as .= ''; } - $matches = false; - $cnt = preg_match_all('/<(.*?)>/',$item['file'],$matches,PREG_SET_ORDER); - if($cnt) { -// logger('prepare_text: categories: ' . print_r($matches,true), LOGGER_DEBUG); - foreach($matches as $mtch) { - if(strlen($x)) - $x .= ','; - $x .= xmlify(file_tag_decode($mtch[1])) - . ((local_user() == $item['uid']) ? ' ' . t('[remove]') . '' : ''); - } - if(strlen($x)) - $s .= ' '; + $s = $s . $as; - } - $matches = false; - $x = ''; - $cnt = preg_match_all('/\[(.*?)\]/',$item['file'],$matches,PREG_SET_ORDER); - if($cnt) { -// logger('prepare_text: filed_under: ' . print_r($matches,true), LOGGER_DEBUG); - foreach($matches as $mtch) { - if(strlen($x)) - $x .= ' '; - $x .= xmlify(file_tag_decode($mtch[1])) . ' ' . t('[remove]') . ''; - } - if(strlen($x) && (local_user() == $item['uid'])) - $s .= ' '; - } - // Look for spoiler $spoilersearch = ''; foreach($arr as $r) { $matches = false; $icon = ''; - $cnt = preg_match_all('|\[attach\]href=\"(.*?)\" length=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"\[\/attach\]|',$r,$matches, PREG_SET_ORDER); + $cnt = preg_match_all('|\[attach\]href=\"(.*?)\" length=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"|',$r,$matches, PREG_SET_ORDER); if($cnt) { foreach($matches as $mtch) { - $icontype = strtolower(substr($mtch[3],0,strpos($mtch[3],'/'))); + $mime = $mtch[3]; + + if((local_user() == $item['uid']) && ($item['contact-id'] != $a->contact['id']) && ($item['network'] == NETWORK_DFRN)) + $the_url = $a->get_baseurl() . '/redir/' . $item['contact-id'] . '?f=1&url=' . $mtch[1]; + else + $the_url = $mtch[1]; + + if(strpos($mime, 'video') !== false) { + if(!$vhead) { + $vhead = true; + $a->page['htmlhead'] .= replace_macros(get_markup_template('videos_head.tpl'), array( + '$baseurl' => $a->get_baseurl(), + )); + $a->page['end'] .= replace_macros(get_markup_template('videos_end.tpl'), array( + '$baseurl' => $a->get_baseurl(), + )); + } + + $id = end(explode('/', $the_url)); + $as .= replace_macros(get_markup_template('video_top.tpl'), array( + '$video' => array( + 'id' => $id, + 'title' => t('View Video'), + 'src' => $the_url, + 'mime' => $mime, + ), + )); + } + + $filetype = strtolower(substr( $mime, 0, strpos($mime,'/') )); + if($filetype) { + $filesubtype = strtolower(substr( $mime, strpos($mime,'/') + 1 )); + $filesubtype = str_replace('.', '-', $filesubtype); + } + else { + $filetype = 'unkn'; + $filesubtype = 'unkn'; + } + + $icon = ''; + /*$icontype = strtolower(substr($mtch[3],0,strpos($mtch[3],'/'))); switch($icontype) { case 'video': case 'audio': @@ -919,49 +1409,20 @@ function prepare_body($item,$attach = false) { default: $icon = ''; break; - } + }*/ + $title = ((strlen(trim($mtch[4]))) ? escape_tags(trim($mtch[4])) : escape_tags($mtch[1])); $title .= ' ' . $mtch[2] . ' ' . t('bytes'); - if((local_user() == $item['uid']) && $item['contact-id'] != $a->contact['id']) - $the_url = $a->get_baseurl() . '/redir/' . $item['contact-id'] . '?f=1&url=' . $mtch[1]; - else - $the_url = $mtch[1]; - $s .= '' . $icon . ''; + $as .= '' . $icon . ''; } } } - $s .= ''; + $as .= ''; @@ -999,9 +1460,13 @@ function prepare_body($item,$attach = false) { }} -// Given a text string, convert from bbcode to html and add smilie icons. - if(! function_exists('prepare_text')) { +/** + * Given a text string, convert from bbcode to html and add smilie icons. + * + * @param string $text + * @return string + */ function prepare_text($text) { require_once('include/bbcode.php'); @@ -1015,13 +1480,88 @@ function prepare_text($text) { }} + /** - * return atom link elements for all of our hubs + * return array with details for categories and folders for an item + * + * @param array $item + * @return array + * + * [ + * [ // categories array + * { + * 'name': 'category name', + * 'removeurl': 'url to remove this category', + * 'first': 'is the first in this array? true/false', + * 'last': 'is the last in this array? true/false', + * } , + * .... + * ], + * [ //folders array + * { + * 'name': 'folder name', + * 'removeurl': 'url to remove this folder', + * 'first': 'is the first in this array? true/false', + * 'last': 'is the last in this array? true/false', + * } , + * .... + * ] + * ] */ +function get_cats_and_terms($item) { + + $a = get_app(); + $categories = array(); + $folders = array(); + + $matches = false; $first = true; + $cnt = preg_match_all('/<(.*?)>/',$item['file'],$matches,PREG_SET_ORDER); + if($cnt) { + foreach($matches as $mtch) { + $categories[] = array( + 'name' => xmlify(file_tag_decode($mtch[1])), + 'url' => "#", + 'removeurl' => ((local_user() == $item['uid'])?$a->get_baseurl() . '/filerm/' . $item['id'] . '?f=&cat=' . xmlify(file_tag_decode($mtch[1])):""), + 'first' => $first, + 'last' => false + ); + $first = false; + } + } + if (count($categories)) $categories[count($categories)-1]['last'] = true; + + + if(local_user() == $item['uid']) { + $matches = false; $first = true; + $cnt = preg_match_all('/\[(.*?)\]/',$item['file'],$matches,PREG_SET_ORDER); + if($cnt) { + foreach($matches as $mtch) { + $folders[] = array( + 'name' => xmlify(file_tag_decode($mtch[1])), + 'url' => "#", + 'removeurl' => ((local_user() == $item['uid'])?$a->get_baseurl() . '/filerm/' . $item['id'] . '?f=&term=' . xmlify(file_tag_decode($mtch[1])):""), + 'first' => $first, + 'last' => false + ); + $first = false; + } + } + } + + if (count($folders)) $folders[count($folders)-1]['last'] = true; + + return array($categories, $folders); +} + + if(! function_exists('feed_hublinks')) { +/** + * return atom link elements for all of our hubs + * @return string hub link xml elements + */ function feed_hublinks() { - + $a = get_app(); $hub = get_config('system','huburl'); $hubxml = ''; @@ -1032,6 +1572,8 @@ function feed_hublinks() { $h = trim($h); if(! strlen($h)) continue; + if ($h === '[internal]') + $h = $a->get_baseurl() . '/pubsubhubbub'; $hubxml .= '' . "\n" ; } } @@ -1039,9 +1581,13 @@ function feed_hublinks() { return $hubxml; }} -/* return atom link elements for salmon endpoints */ if(! function_exists('feed_salmonlinks')) { +/** + * return atom link elements for salmon endpoints + * @param string $nick user nickname + * @return string salmon link xml elements + */ function feed_salmonlinks($nick) { $a = get_app(); @@ -1056,19 +1602,44 @@ function feed_salmonlinks($nick) { }} if(! function_exists('get_plink')) { +/** + * get private link for item + * @param array $item + * @return boolean|array False if item has not plink, otherwise array('href'=>plink url, 'title'=>translated title) + */ function get_plink($item) { - $a = get_app(); - if (x($item,'plink') && (! $item['private'])){ - return array( - 'href' => $item['plink'], - 'title' => t('link to source'), - ); - } else { - return false; - } + $a = get_app(); + + if ($a->user['nickname'] != "") { + $ret = array( + 'href' => $a->get_baseurl()."/display/".$a->user['nickname']."/".$item['id'], + 'title' => t('link to source'), + ); + $ret["orig"] = $ret["href"]; + + if (x($item,'plink')) + $ret["href"] = $item['plink']; + + } elseif (x($item,'plink') && ($item['private'] != 1)) + $ret = array( + 'href' => $item['plink'], + 'orig' => $item['plink'], + 'title' => t('link to source'), + ); + else + $ret = array(); + + //if (x($item,'plink') && ($item['private'] != 1)) + + return($ret); }} if(! function_exists('unamp')) { +/** + * replace html amp entity with amp char + * @param string $s + * @return string + */ function unamp($s) { return str_replace('&', '&', $s); }} @@ -1077,6 +1648,12 @@ function unamp($s) { if(! function_exists('lang_selector')) { +/** + * get html for language selector + * @global string $lang + * @return string + * @template lang_selector.tpl + */ function lang_selector() { global $lang; @@ -1113,6 +1690,11 @@ function lang_selector() { 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) { switch (substr ($size_str, -1)) { @@ -1123,6 +1705,9 @@ function return_bytes ($size_str) { } }} +/** + * @return string + */ function generate_user_guid() { $found = true; do { @@ -1137,7 +1722,11 @@ function generate_user_guid() { } - +/** + * @param string $s + * @param boolean $strip_padding + * @return string + */ function base64url_encode($s, $strip_padding = false) { $s = strtr(base64_encode($s),'+/','-_'); @@ -1148,6 +1737,10 @@ function base64url_encode($s, $strip_padding = false) { return $s; } +/** + * @param string $s + * @return string + */ function base64url_decode($s) { if(is_array($s)) { @@ -1176,6 +1769,16 @@ 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(); @@ -1232,6 +1835,11 @@ if (!function_exists('str_getcsv')) { } } +/** + * return div element with class 'clear' + * @return string + * @deprecated + */ function cleardiv() { return ''; } @@ -1254,13 +1862,13 @@ function bb_translate_video($s) { function html2bb_video($s) { - $s = preg_replace('##ism', + $s = preg_replace('##ism', '[youtube]$2[/youtube]', $s); - $s = preg_replace('##ism', + $s = preg_replace('##ism', '[youtube]$2[/youtube]', $s); - $s = preg_replace('##ism', + $s = preg_replace('##ism', '[vimeo]$2[/vimeo]', $s); return $s; @@ -1268,6 +1876,8 @@ function html2bb_video($s) { /** * apply xmlify() to all values of array $val, recursively + * @param array $val + * @return array */ function array_xmlify($val){ if (is_bool($val)) return $val?"true":"false"; @@ -1276,6 +1886,13 @@ function array_xmlify($val){ } +/** + * transorm link href and img src from relative to absolute + * + * @param string $text + * @param string $base base url + * @return string + */ function reltoabs($text, $base) { if (empty($base)) @@ -1308,6 +1925,12 @@ function reltoabs($text, $base) return $text; } +/** + * get translated item type + * + * @param array $itme + * @return string + */ function item_post_type($item) { if(intval($item['event-id'])) return t('event'); @@ -1401,10 +2024,12 @@ function file_tag_update_pconfig($uid,$file_old,$file_new,$type = 'file') { if($type == 'file') { $lbracket = '['; $rbracket = ']'; + $termtype = TERM_FILE; } else { $lbracket = '<'; $rbracket = '>'; + $termtype = TERM_CATEGORY; } $filetags_updated = $saved; @@ -1430,9 +2055,15 @@ function file_tag_update_pconfig($uid,$file_old,$file_new,$type = 'file') { } foreach($deleted_tags as $key => $tag) { - $r = q("select file from item where uid = %d " . file_tag_file_query('item',$tag,$type), - intval($uid) - ); + $r = q("SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d", + dbesc($tag), + intval(TERM_OBJ_POST), + intval($termtype), + intval($uid)); + + //$r = q("select file from item where uid = %d " . file_tag_file_query('item',$tag,$type), + // intval($uid) + //); if(count($r)) { unset($deleted_tags[$key]); @@ -1455,6 +2086,8 @@ function file_tag_update_pconfig($uid,$file_old,$file_new,$type = 'file') { } function file_tag_save_file($uid,$item,$file) { + require_once("include/files.php"); + $result = false; if(! intval($uid)) return false; @@ -1464,11 +2097,14 @@ function file_tag_save_file($uid,$item,$file) { ); if(count($r)) { if(! stristr($r[0]['file'],'[' . file_tag_encode($file) . ']')) - q("update item set file = '%s' where id = %d and uid = %d limit 1", + q("update item set file = '%s' where id = %d and uid = %d", dbesc($r[0]['file'] . '[' . file_tag_encode($file) . ']'), intval($item), intval($uid) ); + + create_files_from_item($item); + $saved = get_pconfig($uid,'system','filetags'); if((! strlen($saved)) || (! stristr($saved,'[' . file_tag_encode($file) . ']'))) set_pconfig($uid,'system','filetags',$saved . '[' . file_tag_encode($file) . ']'); @@ -1478,14 +2114,19 @@ function file_tag_save_file($uid,$item,$file) { } function file_tag_unsave_file($uid,$item,$file,$cat = false) { + require_once("include/files.php"); + $result = false; if(! intval($uid)) return false; - if($cat == true) + if($cat == true) { $pattern = '<' . file_tag_encode($file) . '>' ; - else + $termtype = TERM_CATEGORY; + } else { $pattern = '[' . file_tag_encode($file) . ']' ; + $termtype = TERM_FILE; + } $r = q("select file from item where id = %d and uid = %d limit 1", @@ -1495,15 +2136,22 @@ function file_tag_unsave_file($uid,$item,$file,$cat = false) { if(! count($r)) return false; - q("update item set file = '%s' where id = %d and uid = %d limit 1", + q("update item set file = '%s' where id = %d and uid = %d", dbesc(str_replace($pattern,'',$r[0]['file'])), intval($item), intval($uid) ); - $r = q("select file from item where uid = %d and deleted = 0 " . file_tag_file_query('item',$file,(($cat) ? 'category' : 'file')), - intval($uid) - ); + create_files_from_item($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)); + + //$r = q("select file from item where uid = %d and deleted = 0 " . file_tag_file_query('item',$file,(($cat) ? 'category' : 'file')), + //); if(! count($r)) { $saved = get_pconfig($uid,'system','filetags'); @@ -1520,7 +2168,7 @@ function normalise_openid($s) { function undo_post_tagging($s) { $matches = null; - $cnt = preg_match_all('/([@#])\[url=(.*?)\](.*?)\[\/url\]/ism',$s,$matches,PREG_SET_ORDER); + $cnt = preg_match_all('/([!#@])\[url=(.*?)\](.*?)\[\/url\]/ism',$s,$matches,PREG_SET_ORDER); if($cnt) { foreach($matches as $mtch) { $s = str_replace($mtch[0], $mtch[1] . $mtch[3],$s); @@ -1531,7 +2179,7 @@ function undo_post_tagging($s) { function fix_mce_lf($s) { $s = str_replace("\r\n","\n",$s); - $s = str_replace("\n\n","\n",$s); +// $s = str_replace("\n\n","\n",$s); return $s; } @@ -1540,3 +2188,16 @@ function protect_sprintf($s) { return(str_replace('%','%%',$s)); } + +function is_a_date_arg($s) { + $i = intval($s); + if($i > 1900) { + $y = date('Y'); + if($i <= $y+1 && strpos($s,'-') == 4) { + $m = intval(substr($s,5)); + if($m > 0 && $m <= 12) + return true; + } + } + return false; +}