change tag output to a tag cloud
darcs-hash:20080729193533-84dde-1e7deeb0c7d7fb7686653be17d197e871aded8be.gz
This commit is contained in:
parent
2843e2ed9a
commit
7d43f211c0
|
@ -20,7 +20,8 @@
|
|||
if (!defined('LACONICA')) { exit(1); }
|
||||
|
||||
require_once(INSTALLDIR.'/actions/showstream.php');
|
||||
define('TAGS_PER_PAGE', 20);
|
||||
define('TAGS_PER_PAGE', 100);
|
||||
define('AGE_FACTOR', 864000.0);
|
||||
|
||||
class TagAction extends StreamAction {
|
||||
|
||||
|
@ -86,65 +87,53 @@ class TagAction extends StreamAction {
|
|||
|
||||
function show_tags()
|
||||
{
|
||||
# This should probably be cached rather than recalculated
|
||||
$tags = DB_DataObject::factory('Notice_tag');
|
||||
$tags->selectAdd('count(1) as num');
|
||||
$tags->selectAdd('max(notice_id) as last_notice_id');
|
||||
$tags->selectAdd(sprintf('sum(exp(-(now() - created)/%f)) as weight', AGE_FACTOR));
|
||||
$tags->groupBy('tag');
|
||||
$tags->orderBy('num DESC, last_notice_id DESC');
|
||||
$tags->whereAdd('created > "' . strftime('%Y-%m-%d %H:%M:%S', strtotime('-1 WEEK')) . '"');
|
||||
$tags->orderBy('weight DESC');
|
||||
|
||||
$page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
|
||||
# $tags->whereAdd('created > "' . strftime('%Y-%m-%d %H:%M:%S', strtotime('-1 MONTH')) . '"');
|
||||
|
||||
$tags->limit((($page-1)*TAGS_PER_PAGE), TAGS_PER_PAGE + 1);
|
||||
$tags->limit(TAGS_PER_PAGE);
|
||||
|
||||
$cnt = $tags->find();
|
||||
|
||||
if ($cnt > 0) {
|
||||
common_element_start('ul', array('id' => 'notices'));
|
||||
for ($i = 0; $i < min($cnt, TAGS_PER_PAGE); $i++) {
|
||||
if ($tags->fetch()) {
|
||||
TagAction::show_tag($tags);
|
||||
} else {
|
||||
// shouldn't happen!
|
||||
break;
|
||||
}
|
||||
common_element_start('p', 'tagcloud');
|
||||
|
||||
$tw = array();
|
||||
$sum = 0;
|
||||
while ($tags->fetch()) {
|
||||
$tw[$tags->tag] = $tags->weight;
|
||||
$sum += $tags->weight;
|
||||
}
|
||||
common_element_end('ul');
|
||||
}
|
||||
|
||||
common_pagination($page > 1, $cnt > TAGS_PER_PAGE,
|
||||
$page, 'tags');
|
||||
}
|
||||
foreach ($tw as $tag => $weight) {
|
||||
$this->show_tag($tag, $weight/$sum);
|
||||
}
|
||||
|
||||
private static function show_tag($tag) {
|
||||
common_element_start('li', array('class' => 'notice_single'));
|
||||
common_element_start('a', array(
|
||||
'class' => 'nickname',
|
||||
'href' => common_local_url('tag', array('tag' => $tag->tag)),
|
||||
'title' => sprintf(_("Notices tagged with %s"), $tag->tag)));
|
||||
common_text('#' . $tag->tag);
|
||||
common_element_end('a');
|
||||
common_text(sprintf(_('%s Notices recently tagged with %s'), $tag->num, $tag->tag));
|
||||
|
||||
$notice = Notice::staticGet($tag->last_notice_id);
|
||||
if ($notice) {
|
||||
$noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
|
||||
common_element_start('p', 'time');
|
||||
common_text(_('Last message posted: '));
|
||||
common_element('a', array('class' => 'permalink',
|
||||
'href' => $noticeurl,
|
||||
'title' => common_exact_date($notice->created)),
|
||||
common_date_string($notice->created));
|
||||
|
||||
common_text(_(' by '));
|
||||
$profile = $notice->getProfile();
|
||||
common_element('a', array('href' => $profile->profileurl),
|
||||
$profile->nickname);
|
||||
common_element_end('p');
|
||||
}
|
||||
common_element_end('li');
|
||||
}
|
||||
|
||||
function show_tag($tag, $relative) {
|
||||
|
||||
# XXX: these should probably tune to the size of the site
|
||||
$cls = ($relative > 0.1) ? 'largest' :
|
||||
($relative > 0.05) ? 'verylarge' :
|
||||
($relative > 0.02) ? 'large' :
|
||||
($relative > 0.01) ? 'medium' :
|
||||
($relative > 0.005) ? 'small' :
|
||||
($relative > 0.002) ? 'verysmall' :
|
||||
'smallest';
|
||||
|
||||
common_element('a', array('class' => $cls,
|
||||
'href' => common_local_url('tag', array('tag' => $tag))),
|
||||
$tag);
|
||||
common_text(' ');
|
||||
}
|
||||
|
||||
function show_notices($tag) {
|
||||
|
||||
|
|
|
@ -646,3 +646,32 @@ input#openid_url {
|
|||
}
|
||||
|
||||
/* ===== End Forms Styling ===== */
|
||||
|
||||
/* ===== Tag Cloud Styling ===== */
|
||||
|
||||
p#tagcloud largest {
|
||||
font-size: xx-large;
|
||||
}
|
||||
p#tagcloud verylarge {
|
||||
font-size: x-large;
|
||||
}
|
||||
|
||||
p#tagcloud large {
|
||||
font-size: large;
|
||||
}
|
||||
|
||||
p#tagcloud medium {
|
||||
font-size: medium;
|
||||
}
|
||||
|
||||
p#tagcloud small {
|
||||
font-size: small;
|
||||
}
|
||||
|
||||
p#tagcloud verysmall {
|
||||
font-size: x-small;
|
||||
}
|
||||
|
||||
p#tagcloud smallest {
|
||||
font-size: xx-small;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user