. * * @category Public * @package StatusNet * @author Mike Cochrane * @author Evan Prodromou * @copyright 2008 Mike Cochrane * @copyright 2008-2009 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } define('TAGS_PER_PAGE', 100); /** * Public tag cloud for notices * * @category Personal * @package StatusNet * @author Mike Cochrane * @author Evan Prodromou * @copyright 2008 Mike Cochrane * @copyright 2008-2009 StatusNet, Inc. * @link http://status.net/ */ class PublicpeopletagcloudAction extends Action { function isReadOnly($args) { return true; } function title() { // TRANS: Title for page with public list cloud. return _('Public list cloud'); } function showPageNotice() { $this->element('p', 'instructions', // TRANS: Page notice for page with public list cloud. // TRANS: %s is a StatusNet sitename. sprintf(_('These are largest lists on %s'), common_config('site', 'name'))); } function showEmptyList() { // TRANS: Empty list message on page with public list cloud. // TRANS: This message contains Markdown links in the form [description](link). $message = _('No one has [listed](%%doc.tags%%) anyone yet.') . ' '; if (common_logged_in()) { // TRANS: Additional empty list message on page with public list cloud for logged in users. $message .= _('Be the first to list someone!'); } else { // TRANS: Additional empty list message on page with public list cloud for anonymous users. // TRANS: This message contains Markdown links in the form [description](link). $message .= _('Why not [register an account](%%action.register%%) and be the first to list someone!'); } $this->elementStart('div', 'guide'); $this->raw(common_markup_to_html($message)); $this->elementEnd('div'); } function showLocalNav() { $nav = new PublicGroupNav($this); $nav->show(); } function handle($args) { parent::handle($args); $this->showPage(); } function showContent() { // XXX: cache this $tags = new Profile_tag(); $plist = new Profile_list(); $plist->private = false; $tags->joinAdd($plist); $tags->selectAdd(); $tags->selectAdd('profile_tag.tag'); $tags->selectAdd('count(profile_tag.tag) as weight'); $tags->groupBy('profile_tag.tag'); $tags->orderBy('weight DESC'); $tags->limit(TAGS_PER_PAGE); $cnt = $tags->find(); if ($cnt > 0) { $this->elementStart('div', array('id' => 'tagcloud', 'class' => 'section')); $tw = array(); $sum = 0; while ($tags->fetch()) { $tw[$tags->tag] = $tags->weight; $sum += $tags->weight; } ksort($tw); $this->elementStart('dl'); // TRANS: DT element on on page with public list cloud. $this->element('dt', null, _('List cloud')); $this->elementStart('dd'); $this->elementStart('ul', 'tags xoxo tag-cloud'); foreach ($tw as $tag => $weight) { if ($sum) { $weightedSum = $weight/$sum; } else { $weightedSum = 0.5; } $this->showTag($tag, $weight, $weightedSum); } $this->elementEnd('ul'); $this->elementEnd('dd'); $this->elementEnd('dl'); $this->elementEnd('div'); } else { $this->showEmptyList(); } } function showTag($tag, $weight, $relative) { if ($relative > 0.1) { $rel = 'tag-cloud-7'; } else if ($relative > 0.05) { $rel = 'tag-cloud-6'; } else if ($relative > 0.02) { $rel = 'tag-cloud-5'; } else if ($relative > 0.01) { $rel = 'tag-cloud-4'; } else if ($relative > 0.005) { $rel = 'tag-cloud-3'; } else if ($relative > 0.002) { $rel = 'tag-cloud-2'; } else { $rel = 'tag-cloud-1'; } $this->elementStart('li', $rel); // TRANS: Link title for number of listed people. %d is the number of listed people. $title = sprintf(_m('1 person listed','%d people listed',$weight),$weight); $this->element('a', array('href' => common_local_url('peopletag', array('tag' => $tag)), 'title' => $title), $tag); $this->elementEnd('li'); } }