use Friendica\Util\Proxy as ProxyUtils;
use Friendica\Core\Logger;
+use Friendica\Core\Renderer;
+use Friendica\Model\FileTag;
+use Friendica\Util\XML;
+use Friendica\Content\Text\HTML;
require_once "include/conversation.php";
-/**
- * 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) {
-
- $stamp1 = microtime(true);
-
- $a = get_app();
-
- // pass $baseurl to all templates
- $r['$baseurl'] = System::baseUrl();
-
- $t = $a->getTemplateEngine();
- try {
- $output = $t->replaceMacros($s, $r);
- } catch (Exception $e) {
- echo "<pre><b>" . __FUNCTION__ . "</b>: " . $e->getMessage() . "</pre>";
- killme();
- }
-
- $a->saveTimestamp($stamp1, "rendering");
-
- return $output;
-}
-
/**
* @brief Generates a pseudo-random string of hexadecimal characters
*
return $word;
}
-
-/**
- * escape text ($str) for XML transport
- * @param string $str
- * @return string Escaped text.
- */
-function xmlify($str) {
- /// @TODO deprecated code found?
-/* $buffer = '';
-
- $len = mb_strlen($str);
- for ($x = 0; $x < $len; $x ++) {
- $char = mb_substr($str,$x,1);
-
- switch($char) {
-
- case "\r" :
- break;
- case "&" :
- $buffer .= '&';
- break;
- case "'" :
- $buffer .= ''';
- break;
- case "\"" :
- $buffer .= '"';
- break;
- case '<' :
- $buffer .= '<';
- break;
- case '>' :
- $buffer .= '>';
- break;
- case "\n" :
- $buffer .= "\n";
- break;
- default :
- $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 = htmlspecialchars($str, ENT_QUOTES, "UTF-8");
- $buffer = trim($buffer);
-
- return $buffer;
-}
-
-
-/**
- * undo an xmlify
- * @param string $s xml escaped text
- * @return string unescaped text
- */
-function unxmlify($s) {
- /// @TODO deprecated code found?
-// $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);
- */
- $ret = htmlspecialchars_decode($s, ENT_QUOTES);
- return $ret;
-}
-
-/**
- * Loader for infinite scrolling
- * @return string html for loader
- */
-function scroll_loader() {
- $tpl = get_markup_template("scroll_loader.tpl");
- return replace_macros($tpl, [
- 'wait' => L10n::t('Loading more entries...'),
- 'end' => L10n::t('The end')
- ]);
-}
-
-
/**
* Turn user/group ACLs stored as angle bracketed text into arrays
*
return $ret;
}
-/**
- * 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->getTemplateEngine();
- try {
- $template = $t->getTemplateFile($s, $root);
- } catch (Exception $e) {
- echo "<pre><b>" . __FUNCTION__ . "</b>: " . $e->getMessage() . "</pre>";
- killme();
- }
-
- $a->saveTimestamp($stamp1, "file");
-
- return $template;
-}
-
/**
* for html,xml parsing - let's say you've got
* an attribute foobar="class1 class2 class3"
return (count($a) && in_array($s,$a));
}
-
-/**
- * @brief Logs the given message at the given log level
- *
- * log levels:
- * LOGGER_WARNING
- * LOGGER_INFO (default)
- * LOGGER_TRACE
- * LOGGER_DEBUG
- * LOGGER_DATA
- * LOGGER_ALL
- *
- * @global array $LOGGER_LEVELS
- * @param string $msg
- * @param int $level
- */
-function logger($msg, $level = LOGGER_INFO)
-{
- Logger::log($msg, $level);
-}
-
-/**
- * @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_WARNING
- * LOGGER_INFO (default)
- * LOGGER_TRACE
- * LOGGER_DEBUG
- * LOGGER_DATA
- * LOGGER_ALL
- *
- * @global array $LOGGER_LEVELS
- * @param string $msg
- * @param int $level
- */
-function dlogger($msg, $level = LOGGER_INFO)
-{
- Logger::devLog($msg, $level);
-}
-
-
/**
* Compare activity uri. Knows about activity namespace.
*
return str_replace("%", "=", rawurlencode($s));
}
-
-/**
- * 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();
-
- $shown = PConfig::get($a->profile['uid'], 'system', 'display_friend_count', 24);
- if ($shown == 0) {
- return;
- }
-
- if (!is_array($a->profile) || $a->profile['hide-friends']) {
- return $o;
- }
- $r = q("SELECT COUNT(*) AS `total` FROM `contact`
- WHERE `uid` = %d AND NOT `self` AND NOT `blocked`
- AND NOT `pending` AND NOT `hidden` AND NOT `archive`
- AND `network` IN ('%s', '%s', '%s')",
- intval($a->profile['uid']),
- DBA::escape(Protocol::DFRN),
- DBA::escape(Protocol::OSTATUS),
- DBA::escape(Protocol::DIASPORA)
- );
- if (DBA::isResult($r)) {
- $total = intval($r[0]['total']);
- }
- if (!$total) {
- $contacts = L10n::t('No contacts');
- $micropro = null;
- } else {
- // 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 `pending` AND NOT `hidden` AND NOT `archive`
- AND `network` IN ('%s', '%s', '%s')
- ORDER BY RAND() LIMIT %d",
- intval($a->profile['uid']),
- DBA::escape(Protocol::DFRN),
- DBA::escape(Protocol::OSTATUS),
- DBA::escape(Protocol::DIASPORA),
- intval($shown)
- );
- 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)",
- DBA::escape(implode(",", $contacts)));
-
- if (DBA::isResult($r)) {
- $contacts = L10n::tt('%d Contact', '%d Contacts', $total);
- $micropro = [];
- foreach ($r as $rr) {
- $micropro[] = micropro($rr, true, 'mpfriend');
- }
- }
- }
- }
-
- $tpl = get_markup_template('contact_block.tpl');
- $o = replace_macros($tpl, [
- '$contacts' => $contacts,
- '$nickname' => $a->profile['nickname'],
- '$viewcontacts' => L10n::t('View Contacts'),
- '$micropro' => $micropro,
- ]);
-
- $arr = ['contacts' => $r, 'output' => $o];
-
- Addon::callHooks('contact_block_end', $arr);
- return $o;
-
-}
-
-
-/**
- * @brief Format contacts as picture links or as texxt links
- *
- * @param array $contact Array with contacts which contains an array with
- * int 'id' => The ID of the contact
- * int 'uid' => The user ID of the user who owns this data
- * string 'name' => The name of the contact
- * string 'url' => The url to the profile page of the contact
- * string 'addr' => The webbie of the contact (e.g.) username@friendica.com
- * string 'network' => The network to which the contact belongs to
- * string 'thumb' => The contact picture
- * string 'click' => js code which is performed when clicking on the contact
- * @param boolean $redirect If true try to use the redir url if it's possible
- * @param string $class CSS class for the
- * @param boolean $textmode If true display the contacts as text links
- * if false display the contacts as picture links
-
- * @return string Formatted html
- */
-function micropro($contact, $redirect = false, $class = '', $textmode = false) {
-
- // Use the contact URL if no address is available
- if (!x($contact, "addr")) {
- $contact["addr"] = $contact["url"];
- }
-
- $url = $contact['url'];
- $sparkle = '';
- $redir = false;
-
- if ($redirect) {
- $url = Contact::magicLink($contact['url']);
- if (strpos($url, 'redir/') === 0) {
- $sparkle = ' sparkle';
- }
- }
-
- // If there is some js available we don't need the url
- if (x($contact, 'click')) {
- $url = '';
- }
-
- return replace_macros(get_markup_template(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'),[
- '$click' => defaults($contact, 'click', ''),
- '$class' => $class,
- '$url' => $url,
- '$photo' => ProxyUtils::proxifyUrl($contact['thumb'], false, ProxyUtils::SIZE_THUMB),
- '$name' => $contact['name'],
- 'title' => $contact['name'] . ' [' . $contact['addr'] . ']',
- '$parkle' => $sparkle,
- '$redir' => $redir,
-
- ]);
-}
-
-/**
- * Search box.
- *
- * @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)
-{
- $mode = 'text';
-
- if (strpos($s, '#') === 0) {
- $mode = 'tag';
- }
- $save_label = $mode === 'text' ? L10n::t('Save') : L10n::t('Follow');
-
- $values = [
- '$s' => htmlspecialchars($s),
- '$id' => $id,
- '$action_url' => $url,
- '$search_label' => L10n::t('Search'),
- '$save_label' => $save_label,
- '$savedsearch' => local_user() && Feature::isEnabled(local_user(),'savedsearch'),
- '$search_hint' => L10n::t('@name, !forum, #tags, content'),
- '$mode' => $mode
- ];
-
- if (!$aside) {
- $values['$searchoption'] = [
- L10n::t("Full Text"),
- L10n::t("Tags"),
- L10n::t("Contacts")];
-
- if (Config::get('system','poco_local_search')) {
- $values['$searchoption'][] = L10n::t("Forums");
- }
- }
-
- return replace_macros(get_markup_template('searchbox.tpl'), $values);
-}
-
/**
* @brief Check for a valid email string
*
return preg_match('/^[_a-zA-Z0-9\-\+]+(\.[_a-zA-Z0-9\-\+]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/', $email_address);
}
-
-/**
- * Replace naked text hyperlink with HTML formatted hyperlink
- *
- * @param string $s
- */
-function linkify($s) {
- $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\'\%\$\!\+]*)/", ' <a href="$1" target="_blank">$1</a>', $s);
- $s = preg_replace("/\<(.*?)(src|href)=(.*?)\&\;(.*?)\>/ism",'<$1$2=$3&$4>',$s);
- return $s;
-}
-
-
-/**
- * Load poke verbs
- *
- * @return array index is present tense verb
- * value is array containing past tense verb, translation of present, translation of past
- * @hook poke_verbs pokes array
- */
-function get_poke_verbs() {
-
- // index is present tense verb
- // value is array containing past tense verb, translation of present, translation of past
-
- $arr = [
- 'poke' => ['poked', L10n::t('poke'), L10n::t('poked')],
- 'ping' => ['pinged', L10n::t('ping'), L10n::t('pinged')],
- 'prod' => ['prodded', L10n::t('prod'), L10n::t('prodded')],
- 'slap' => ['slapped', L10n::t('slap'), L10n::t('slapped')],
- 'finger' => ['fingered', L10n::t('finger'), L10n::t('fingered')],
- 'rebuff' => ['rebuffed', L10n::t('rebuff'), L10n::t('rebuffed')],
- ];
- Addon::callHooks('poke_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(['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'],
- [L10n::t('Monday'), L10n::t('Tuesday'), L10n::t('Wednesday'), L10n::t('Thursday'), L10n::t('Friday'), L10n::t('Saturday'), L10n::t('Sunday')],
- $s);
-
- $ret = str_replace(['January','February','March','April','May','June','July','August','September','October','November','December'],
- [L10n::t('January'), L10n::t('February'), L10n::t('March'), L10n::t('April'), L10n::t('May'), L10n::t('June'), L10n::t('July'), L10n::t('August'), L10n::t('September'), L10n::t('October'), L10n::t('November'), L10n::t('December')],
- $ret);
-
- return $ret;
-}
-
-/**
- * @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(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
- [L10n::t('Mon'), L10n::t('Tue'), L10n::t('Wed'), L10n::t('Thu'), L10n::t('Fri'), L10n::t('Sat'), L10n::t('Sun')],
- $s);
- $ret = str_replace(['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov','Dec'],
- [L10n::t('Jan'), L10n::t('Feb'), L10n::t('Mar'), L10n::t('Apr'), L10n::t('May'), ('Jun'), L10n::t('Jul'), L10n::t('Aug'), L10n::t('Sep'), L10n::t('Oct'), L10n::t('Nov'), L10n::t('Dec')],
- $ret);
- return $ret;
-}
-
-
/**
* Normalize url
*
if (strpos($mime, 'video') !== false) {
if (!$vhead) {
$vhead = true;
- $a->page['htmlhead'] .= replace_macros(get_markup_template('videos_head.tpl'), [
+ $a->page['htmlhead'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('videos_head.tpl'), [
'$baseurl' => System::baseUrl(),
]);
}
$url_parts = explode('/', $the_url);
$id = end($url_parts);
- $as .= replace_macros(get_markup_template('video_top.tpl'), [
+ $as .= Renderer::replaceMacros(Renderer::getMarkupTemplate('video_top.tpl'), [
'$video' => [
'id' => $id,
'title' => L10n::t('View Video'),
$s = preg_replace('|(<img[^>]+src="[^"]+/photo/[0-9a-f]+)-[0-9]|', "$1-" . $ps, $s);
}
- $s = apply_content_filter($s, $filter_reasons);
+ $s = HTML::applyContentFilter($s, $filter_reasons);
$hook_data = ['item' => $item, 'html' => $s];
Addon::callHooks('prepare_body_final', $hook_data);
return $hook_data['html'];
}
-/**
- * Given a HTML text and a set of filtering reasons, adds a content hiding header with the provided reasons
- *
- * Reasons are expected to have been translated already.
- *
- * @param string $html
- * @param array $reasons
- * @return string
- */
-function apply_content_filter($html, array $reasons)
-{
- if (count($reasons)) {
- $tpl = get_markup_template('wall/content_filter.tpl');
- $html = replace_macros($tpl, [
- '$reasons' => $reasons,
- '$rnd' => random_string(8),
- '$openclose' => L10n::t('Click to open/close'),
- '$html' => $html
- ]);
- }
-
- return $html;
-}
-
/**
* @brief Given a text string, convert from bbcode to html and add smilie icons.
*
if ($cnt) {
foreach ($matches as $mtch) {
$categories[] = [
- 'name' => xmlify(file_tag_decode($mtch[1])),
+ 'name' => XML::escape(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=' . XML::escape(FileTag::decode($mtch[1])):""),
'first' => $first,
'last' => false
];
if ($cnt) {
foreach ($matches as $mtch) {
$folders[] = [
- 'name' => xmlify(file_tag_decode($mtch[1])),
+ 'name' => XML::escape(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=' . XML::escape(FileTag::decode($mtch[1])) : ""),
'first' => $first,
'last' => false
];
return $ret;
}
-
-/**
- * replace html amp entity with amp char
- * @param string $s
- * @return string
- */
-function unamp($s) {
- return str_replace('&', '&', $s);
-}
-
-
/**
* return number of bytes in size (K, M, G)
* @param string $size_str
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;
}
}
-/**
- * return div element with class 'clear'
- * @return string
- * @deprecated
- */
-function cleardiv() {
- return '<div class="clear"></div>';
-}
-
-
function bb_translate_video($s) {
$matches = null;
return $s;
}
-function html2bb_video($s) {
-
- $s = preg_replace('#<object[^>]+>(.*?)https?://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+)(.*?)</object>#ism',
- '[youtube]$2[/youtube]', $s);
-
- $s = preg_replace('#<iframe[^>](.*?)https?://www.youtube.com/embed/([A-Za-z0-9\-_=]+)(.*?)</iframe>#ism',
- '[youtube]$2[/youtube]', $s);
-
- $s = preg_replace('#<iframe[^>](.*?)https?://player.vimeo.com/video/([0-9]+)(.*?)</iframe>#ism',
- '[vimeo]$2[/vimeo]', $s);
-
- return $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";
- } elseif (is_array($val)) {
- return array_map('array_xmlify', $val);
- }
- return xmlify((string) $val);
-}
-
-
-/**
- * transform 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)) {
- return $text;
- }
-
- $base = rtrim($base,'/');
-
- $base2 = $base . "/";
-
- // Replace links
- $pattern = "/<a([^>]*) href=\"(?!http|https|\/)([^\"]*)\"/";
- $replace = "<a\${1} href=\"" . $base2 . "\${2}\"";
- $text = preg_replace($pattern, $replace, $text);
-
- $pattern = "/<a([^>]*) href=\"(?!http|https)([^\"]*)\"/";
- $replace = "<a\${1} href=\"" . $base . "\${2}\"";
- $text = preg_replace($pattern, $replace, $text);
-
- // Replace images
- $pattern = "/<img([^>]*) src=\"(?!http|https|\/)([^\"]*)\"/";
- $replace = "<img\${1} src=\"" . $base2 . "\${2}\"";
- $text = preg_replace($pattern, $replace, $text);
-
- $pattern = "/<img([^>]*) src=\"(?!http|https)([^\"]*)\"/";
- $replace = "<img\${1} src=\"" . $base . "\${2}\"";
- $text = preg_replace($pattern, $replace, $text);
-
-
- // Done
- return $text;
-}
-
/**
* get translated item type
*
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) ? DBA::escape($table) . '.' : '') . "file regexp '" . DBA::escape($str) . "' ";
-}
-
-// ex. given music,video return <music><video> or [music][video]
-function file_tag_list_to_file($list, $type = 'file') {
- $tag_list = '';
- if (strlen($list)) {
- $list_array = explode(",",$list);
- if ($type == 'file') {
- $lbracket = '[';
- $rbracket = ']';
- } else {
- $lbracket = '<';
- $rbracket = '>';
- }
-
- foreach ($list_array as $item) {
- if (strlen($item)) {
- $tag_list .= $lbracket . file_tag_encode(trim($item)) . $rbracket;
- }
- }
- }
- return $tag_list;
-}
-
-// ex. given <music><video>[friends], return music,video or friends
-function file_tag_file_to_list($file, $type = 'file') {
- $matches = false;
- $list = '';
- if ($type == 'file') {
- $cnt = preg_match_all('/\[(.*?)\]/', $file, $matches, PREG_SET_ORDER);
- } else {
- $cnt = preg_match_all('/<(.*?)>/', $file, $matches, PREG_SET_ORDER);
- }
- if ($cnt) {
- foreach ($matches as $mtch) {
- if (strlen($list)) {
- $list .= ',';
- }
- $list .= file_tag_decode($mtch[1]);
- }
- }
-
- return $list;
-}
-
-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)) {
- return false;
- } elseif ($file_old == $file_new) {
- return true;
- }
-
- $saved = PConfig::get($uid, 'system', 'filetags');
- if (strlen($saved)) {
- if ($type == 'file') {
- $lbracket = '[';
- $rbracket = ']';
- $termtype = TERM_FILE;
- } else {
- $lbracket = '<';
- $rbracket = '>';
- $termtype = TERM_CATEGORY;
- }
-
- $filetags_updated = $saved;
-
- // check for new tags to be added as filetags in pconfig
- $new_tags = [];
- $check_new_tags = explode(",",file_tag_file_to_list($file_new,$type));
-
- foreach ($check_new_tags as $tag) {
- if (!stristr($saved,$lbracket . file_tag_encode($tag) . $rbracket)) {
- $new_tags[] = $tag;
- }
- }
-
- $filetags_updated .= file_tag_list_to_file(implode(",",$new_tags),$type);
-
- // check for deleted tags to be removed from filetags in pconfig
- $deleted_tags = [];
- $check_deleted_tags = explode(",",file_tag_file_to_list($file_old,$type));
-
- foreach ($check_deleted_tags as $tag) {
- if (!stristr($file_new,$lbracket . file_tag_encode($tag) . $rbracket)) {
- $deleted_tags[] = $tag;
- }
- }
-
- foreach ($deleted_tags as $key => $tag) {
- $r = q("SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d",
- DBA::escape($tag),
- intval(TERM_OBJ_POST),
- intval($termtype),
- intval($uid));
-
- if (DBA::isResult($r)) {
- unset($deleted_tags[$key]);
- } else {
- $filetags_updated = str_replace($lbracket . file_tag_encode($tag) . $rbracket,'',$filetags_updated);
- }
- }
-
- if ($saved != $filetags_updated) {
- PConfig::set($uid, 'system', 'filetags', $filetags_updated);
- }
- return true;
- } elseif (strlen($file_new)) {
- PConfig::set($uid, 'system', 'filetags', $file_new);
- }
- return true;
-}
-
-function file_tag_save_file($uid, $item_id, $file)
-{
- if (!intval($uid)) {
- return false;
- }
-
- $item = Item::selectFirst(['file'], ['id' => $item_id, 'uid' => $uid]);
- if (DBA::isResult($item)) {
- if (!stristr($item['file'],'[' . file_tag_encode($file) . ']')) {
- $fields = ['file' => $item['file'] . '[' . file_tag_encode($file) . ']'];
- Item::update($fields, ['id' => $item_id]);
- }
- $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(L10n::t('Item filed'));
- }
- return true;
-}
-
-function file_tag_unsave_file($uid, $item_id, $file, $cat = false)
-{
- if (!intval($uid)) {
- return false;
- }
-
- if ($cat == true) {
- $pattern = '<' . file_tag_encode($file) . '>' ;
- $termtype = TERM_CATEGORY;
- } else {
- $pattern = '[' . file_tag_encode($file) . ']' ;
- $termtype = TERM_FILE;
- }
-
- $item = Item::selectFirst(['file'], ['id' => $item_id, 'uid' => $uid]);
- if (!DBA::isResult($item)) {
- return false;
- }
-
- $fields = ['file' => str_replace($pattern,'',$item['file'])];
- Item::update($fields, ['id' => $item_id]);
-
- $r = q("SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d",
- DBA::escape($file),
- intval(TERM_OBJ_POST),
- intval($termtype),
- intval($uid)
- );
- if (!DBA::isResult($r)) {
- $saved = PConfig::get($uid, 'system', 'filetags');
- PConfig::set($uid, 'system', 'filetags', str_replace($pattern, '', $saved));
- }
-
- return true;
-}
-
function normalise_openid($s) {
return trim(str_replace(['http://', 'https://'], ['', ''], $s), '/');
}