X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Futil.php;h=1da9cc3c17551e091c55350726bb45e33f9a3d35;hb=refs%2Fheads%2Fupstream-merges%2Fmaster;hp=64733986d3db8a7fc23d20fdf1090caba0b06637;hpb=3255e2e1b81ce6d8d867e924eeacff2c9e53d706;p=quix0rs-gnu-social.git diff --git a/lib/util.php b/lib/util.php index 64733986d3..1da9cc3c17 100644 --- a/lib/util.php +++ b/lib/util.php @@ -321,7 +321,7 @@ function common_set_user($user) return false; } - if ($user) { + if ($user instanceof User) { if (Event::handle('StartSetUser', array(&$user))) { if (!empty($user)) { if (!$user->hasRight(Right::WEBLOGIN)) { @@ -538,7 +538,7 @@ function common_user_cache_hash($user=false) if ($user === false) { $user = common_current_user(); } - if ($user) { + if ($user instanceof User) { return crc32($user->id . ':' . $user->nickname); } else { return '0'; @@ -606,14 +606,15 @@ function common_remove_unicode_formatting($text) /** * Partial notice markup rendering step: build links to !group references. * - * @param string $text partially rendered HTML - * @param Notice $notice in whose context we're working + * @param string $text partially rendered HTML + * @param Profile $author the Profile that is composing the current notice + * @param Notice $parent the Notice this is sent in reply to, if any * @return string partially rendered HTML */ -function common_render_content($text, Notice $notice) +function common_render_content($text, Profile $author, Notice $parent=null) { $text = common_render_text($text); - $text = common_linkify_mentions($text, $notice); + $text = common_linkify_mentions($text, $author, $parent); return $text; } @@ -623,13 +624,14 @@ function common_render_content($text, Notice $notice) * * Should generally not be called except from common_render_content(). * - * @param string $text partially-rendered HTML - * @param Notice $notice in-progress or complete Notice object for context + * @param string $text partially-rendered HTML + * @param Profile $author the Profile that is composing the current notice + * @param Notice $parent the Notice this is sent in reply to, if any * @return string partially-rendered HTML */ -function common_linkify_mentions($text, Notice $notice) +function common_linkify_mentions($text, Profile $author, Notice $parent=null) { - $mentions = common_find_mentions($text, $notice); + $mentions = common_find_mentions($text, $author, $parent); // We need to go through in reverse order by position, // so our positions stay valid despite our fudging with the @@ -648,7 +650,7 @@ function common_linkify_mentions($text, Notice $notice) $linkText = common_linkify_mention($mention); - $text = substr_replace($text, $linkText, $position, mb_strlen($mention['text'])); + $text = substr_replace($text, $linkText, $position, $mention['length']); } return $text; @@ -679,6 +681,23 @@ function common_linkify_mention(array $mention) return $output; } +function common_get_attentions($text, Profile $sender, Notice $parent=null) +{ + $mentions = common_find_mentions($text, $sender, $parent); + $atts = array(); + foreach ($mentions as $mention) { + foreach ($mention['mentioned'] as $mentioned) { + $atts[$mentioned->getUri()] = $mentioned->getObjectType(); + } + } + if ($parent instanceof Notice) { + $parentAuthor = $parent->getProfile(); + // afaik groups can't be authors + $atts[$parentAuthor->getUri()] = ActivityObject::PERSON; + } + return $atts; +} + /** * Find @-mentions in the given text, using the given notice object as context. * References will be resolved with common_relative_profile() against the user @@ -687,33 +706,25 @@ function common_linkify_mention(array $mention) * Note the return data format is internal, to be used for building links and * such. Should not be used directly; rather, call common_linkify_mentions(). * - * @param string $text - * @param Notice $notice notice in whose context we're building links + * @param string $text + * @param Profile $sender the Profile that is sending the current text + * @param Notice $parent the Notice this text is in reply to, if any * * @return array * * @access private */ -function common_find_mentions($text, Notice $notice) +function common_find_mentions($text, Profile $sender, Notice $parent=null) { - // The getProfile call throws NoProfileException on failure - $sender = $notice->getProfile(); - $mentions = array(); if (Event::handle('StartFindMentions', array($sender, $text, &$mentions))) { // Get the context of the original notice, if any - $origAuthor = null; - $origNotice = null; $origMentions = array(); - // Is it a reply? - - try { - $origNotice = $notice->getParent(); - $origAuthor = $origNotice->getProfile(); - - $ids = $origNotice->getReplies(); + // Does it have a parent notice for context? + if ($parent instanceof Notice) { + $ids = $parent->getReplies(); // replied-to _profile ids_ foreach ($ids as $id) { try { @@ -723,10 +734,6 @@ function common_find_mentions($text, Notice $notice) // continue foreach } } - } catch (NoParentNoticeException $e) { - // It wasn't a reply to anything, so we can't harvest nickname-relations. - } catch (NoResultException $e) { - // The parent notice was deleted. } $matches = common_find_mentions_raw($text); @@ -743,34 +750,33 @@ function common_find_mentions($text, Notice $notice) // Start with conversation context, then go to // sender context. - if ($origAuthor instanceof Profile && $origAuthor->nickname == $nickname) { - $mentioned = $origAuthor; + if ($parent instanceof Notice && $parent->getProfile()->getNickname() === $nickname) { + $mentioned = $parent->getProfile(); } else if (!empty($origMentions) && array_key_exists($nickname, $origMentions)) { $mentioned = $origMentions[$nickname]; } else { + // sets to null if no match $mentioned = common_relative_profile($sender, $nickname); } if ($mentioned instanceof Profile) { $user = User::getKV('id', $mentioned->id); - if ($user instanceof User) { - $url = common_local_url('userbyid', array('id' => $user->id)); - } else { - $url = $mentioned->profileurl; + try { + $url = $mentioned->getUrl(); + } catch (InvalidUrlException $e) { + $url = common_local_url('userbyid', array('id' => $mentioned->getID())); } $mention = array('mentioned' => array($mentioned), 'type' => 'mention', 'text' => $match[0], 'position' => $match[1], + 'length' => mb_strlen($match[0]), + 'title' => $mentioned->getFullname(), 'url' => $url); - if (!empty($mentioned->fullname)) { - $mention['title'] = $mentioned->fullname; - } - $mentions[] = $mention; } } @@ -781,7 +787,7 @@ function common_find_mentions($text, Notice $notice) $text, $hmatches, PREG_OFFSET_CAPTURE); foreach ($hmatches[1] as $hmatch) { $tag = common_canonical_tag($hmatch[0]); - $plist = Profile_list::getByTaggerAndTag($sender->id, $tag); + $plist = Profile_list::getByTaggerAndTag($sender->getID(), $tag); if (!$plist instanceof Profile_list || $plist->private) { continue; } @@ -795,6 +801,7 @@ function common_find_mentions($text, Notice $notice) 'type' => 'list', 'text' => $hmatch[0], 'position' => $hmatch[1], + 'length' => mb_strlen($hmatch[0]), 'url' => $url); } @@ -814,6 +821,7 @@ function common_find_mentions($text, Notice $notice) 'type' => 'group', 'text' => $hmatch[0], 'position' => $hmatch[1], + 'length' => mb_strlen($hmatch[0]), 'url' => $group->permalink(), 'title' => $group->getFancyName()); } @@ -877,7 +885,7 @@ function common_replace_urls_callback($text, $callback, $arg = null) { '(?:'. '(?:'. //Known protocols '(?:'. - '(?:(?:https?|ftps?|mms|rtsp|gopher|news|nntp|telnet|wais|file|prospero|webcal|irc)://)'. + '(?:(?:https?|ftps?|mms|rtsp|gopher|news|nntp|telnet|wais|file|prospero|webcal|ircs?)://)'. '|'. '(?:(?:mailto|aim|tel|xmpp):)'. ')'. @@ -987,23 +995,18 @@ function common_linkify($url) { $canon = "mailto:$url"; $longurl = "mailto:$url"; } else { - $canon = File_redirection::_canonUrl($url); - $longurl_data = File_redirection::where($canon, common_config('attachments', 'process_links')); - if (is_array($longurl_data)) { - $longurl = $longurl_data['url']; - } elseif (is_string($longurl_data)) { - $longurl = $longurl_data; + + if(isset($longurl_data->redir_url)) { + $longurl = $longurl_data->redir_url; } else { - // Unable to reach the server to verify contents, etc - // Just pass the link on through for now. - common_log(LOG_ERR, "Can't linkify url '$url'"); - $longurl = $url; + // e.g. local files + $longurl = $longurl_data->url; } } - - $attrs = array('href' => $canon, 'title' => $longurl); + + $attrs = array('href' => $longurl, 'title' => $longurl); $is_attachment = false; $attachment_id = null; @@ -1011,9 +1014,9 @@ function common_linkify($url) { // Check to see whether this is a known "attachment" URL. - $f = File::getKV('url', $longurl); - - if (!$f instanceof File) { + try { + $f = File::getByUrl($longurl); + } catch (NoResultException $e) { if (common_config('attachments', 'process_links')) { // XXX: this writes to the database. :< try { @@ -2375,7 +2378,7 @@ function common_perf_counter($key, $val=null) $_perfCounters[$key] = array($val); } if (common_config('site', 'logperf_detail')) { - common_log(LOG_DEBUG, "PERF COUNTER HIT: $key $val"); + common_debug("PERF COUNTER HIT: $key $val"); } } } @@ -2389,14 +2392,14 @@ function common_log_perf_counters() if (isset($_startTime)) { $endTime = microtime(true); $diff = round(($endTime - $_startTime) * 1000); - common_log(LOG_DEBUG, "PERF runtime: ${diff}ms"); + common_debug("PERF runtime: ${diff}ms"); } $counters = $_perfCounters; ksort($counters); foreach ($counters as $key => $values) { $count = count($values); $unique = count(array_unique($values)); - common_log(LOG_DEBUG, "PERF COUNTER: $key $count ($unique unique)"); + common_debug("PERF COUNTER: $key $count ($unique unique)"); } } }