tagcloudsection.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <?php
  2. /**
  3. * StatusNet, the distributed open-source microblogging tool
  4. *
  5. * Base class for sections showing tag clouds
  6. *
  7. * PHP version 5
  8. *
  9. * LICENCE: This program is free software: you can redistribute it and/or modify
  10. * it under the terms of the GNU Affero General Public License as published by
  11. * the Free Software Foundation, either version 3 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU Affero General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Affero General Public License
  20. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  21. *
  22. * @category Widget
  23. * @package StatusNet
  24. * @author Evan Prodromou <evan@status.net>
  25. * @copyright 2009 StatusNet, Inc.
  26. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
  27. * @link http://status.net/
  28. */
  29. if (!defined('STATUSNET') && !defined('LACONICA')) {
  30. exit(1);
  31. }
  32. define('TAGS_PER_SECTION', 10);
  33. /**
  34. * Base class for sections
  35. *
  36. * These are the widgets that show interesting data about a person
  37. * group, or site.
  38. *
  39. * @category Widget
  40. * @package StatusNet
  41. * @author Evan Prodromou <evan@status.net>
  42. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
  43. * @link http://status.net/
  44. */
  45. class TagCloudSection extends Section
  46. {
  47. function showContent()
  48. {
  49. $tags = $this->getTags();
  50. if (!$tags) {
  51. // TRANS: Content displayed in a tag cloud section if there are no tags.
  52. $this->out->element('p', null, _m('NOTAGS','None'));
  53. return false;
  54. }
  55. $cnt = 0;
  56. $tw = array();
  57. $sum = 0;
  58. while ($tags->fetch() && ++$cnt <= TAGS_PER_SECTION) {
  59. $tw[$tags->tag] = $tags->weight;
  60. $sum += $tags->weight;
  61. }
  62. if ($cnt == 0) {
  63. // TRANS: Content displayed in a tag cloud section if there are no tags.
  64. $this->out->element('p', null, _m('NOTAGS','None'));
  65. return false;
  66. }
  67. ksort($tw);
  68. $this->out->elementStart('ul', 'tags xoxo tag-cloud');
  69. foreach ($tw as $tag => $weight) {
  70. $this->showTag($tag, $weight, ($sum == 0) ? 0 : $weight/$sum);
  71. }
  72. $this->out->elementEnd('ul');
  73. return ($cnt > TAGS_PER_SECTION);
  74. }
  75. function getTags()
  76. {
  77. return null;
  78. }
  79. function showTag($tag, $weight, $relative)
  80. {
  81. if ($relative > 0.1) {
  82. $rel = 'tag-cloud-7';
  83. } else if ($relative > 0.05) {
  84. $rel = 'tag-cloud-6';
  85. } else if ($relative > 0.02) {
  86. $rel = 'tag-cloud-5';
  87. } else if ($relative > 0.01) {
  88. $rel = 'tag-cloud-4';
  89. } else if ($relative > 0.005) {
  90. $rel = 'tag-cloud-3';
  91. } else if ($relative > 0.002) {
  92. $rel = 'tag-cloud-2';
  93. } else {
  94. $rel = 'tag-cloud-1';
  95. }
  96. $this->out->elementStart('li', $rel);
  97. $this->out->element('a', array('href' => $this->tagUrl($tag)),
  98. $tag);
  99. $this->out->elementEnd('li');
  100. }
  101. function tagUrl($tag)
  102. {
  103. if ($this->out instanceof ShowstreamAction) {
  104. return common_local_url('showstream', array('nickname' => $this->out->getTarget()->getNickname(), 'tag' => $tag));
  105. }
  106. return common_local_url('tag', array('tag' => $tag));
  107. }
  108. function divId()
  109. {
  110. return 'tagcloud';
  111. }
  112. }