publicpeopletagcloud.php 5.77 KB
Newer Older
Shashi Gowda's avatar
Shashi Gowda committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
<?php
/**
 * StatusNet, the distributed open-source microblogging tool
 *
 * Public tag cloud for notices
 *
 * PHP version 5
 *
 * LICENCE: This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * @category  Public
 * @package   StatusNet
 * @author    Mike Cochrane <mikec@mikenz.geek.nz>
 * @author    Evan Prodromou <evan@status.net>
 * @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 <mikec@mikenz.geek.nz>
 * @author    Evan Prodromou <evan@status.net>
 * @copyright 2008 Mike Cochrane
 * @copyright 2008-2009 StatusNet, Inc.
 * @link     http://status.net/
 */
class PublicpeopletagcloudAction extends Action
{
    function isReadOnly($args)
    {
        return true;
    }

    function title()
    {
56 57
        // TRANS: Title for page with public list cloud.
        return _('Public list cloud');
Shashi Gowda's avatar
Shashi Gowda committed
58 59 60 61 62
    }

    function showPageNotice()
    {
        $this->element('p', 'instructions',
63
                       // TRANS: Page notice for page with public list cloud.
64
                       // TRANS: %s is a StatusNet sitename.
65
                       sprintf(_('These are largest lists on %s'),
Shashi Gowda's avatar
Shashi Gowda committed
66 67 68 69 70
                               common_config('site', 'name')));
    }

    function showEmptyList()
    {
71
        // TRANS: Empty list message on page with public list cloud.
72
        // TRANS: This message contains Markdown links in the form [description](link).
73
        $message = _('No one has [listed](%%doc.tags%%) anyone yet.') . ' ';
Shashi Gowda's avatar
Shashi Gowda committed
74 75

        if (common_logged_in()) {
76 77
            // TRANS: Additional empty list message on page with public list cloud for logged in users.
            $message .= _('Be the first to list someone!');
Shashi Gowda's avatar
Shashi Gowda committed
78 79
        }
        else {
80
            // TRANS: Additional empty list message on page with public list cloud for anonymous users.
81
        // TRANS: This message contains Markdown links in the form [description](link).
82
            $message .= _('Why not [register an account](%%action.register%%) and be the first to list someone!');
Shashi Gowda's avatar
Shashi Gowda committed
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
        }

        $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');
135 136
            // TRANS: DT element on on page with public list cloud.
            $this->element('dt', null, _('List cloud'));
Shashi Gowda's avatar
Shashi Gowda committed
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
            $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);

176 177
        // 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);
Shashi Gowda's avatar
Shashi Gowda committed
178
        $this->element('a', array('href'  => common_local_url('peopletag', array('tag' => $tag)),
179
                                  'title' => $title), $tag);
Shashi Gowda's avatar
Shashi Gowda committed
180 181 182
        $this->elementEnd('li');
    }
}