]> git.mxchange.org Git - friendica.git/commitdiff
port tag cloud widget from hubzilla
authorrabuzarus <>
Wed, 22 Nov 2017 20:29:07 +0000 (21:29 +0100)
committerrabuzarus <>
Wed, 22 Nov 2017 20:29:07 +0000 (21:29 +0100)
include/features.php
include/identity.php
include/tags.php
mod/profile.php
view/global.css
view/templates/tagblock_widget.tpl [new file with mode: 0644]
view/theme/frio/css/style.css

index 9895fd6f77453943433ba1f1b0b23d8163ab3e58..340394ecea36f275860877378e9c01ed74593886 100644 (file)
@@ -114,6 +114,7 @@ function get_features($filtered = true) {
                'advanced_profile' => array(
                        t('Advanced Profile Settings'),
                        array('forumlist_profile', t('List Forums'),                    t('Show visitors public community forums at the Advanced Profile Page'), false, Config::get('feature_lock','forumlist_profile')),
+                       array('tagadelic',      t('Tag Cloud'),                         t('Provide a personal tag cloud on your profile page'), false, Config::get('feature_lock', 'tagadelic')),
                ),
        );
 
index b8f4727ad8ac53ce28b1691470c386a8b2953ac8..2e6327d987368a7e9b9358c332ea202fccf1d1ef 100644 (file)
@@ -169,7 +169,7 @@ function get_profiledata_by_nick($nickname, $uid = 0, $profile = 0)
                        "SELECT `contact`.`id` AS `contact_id`, `contact`.`photo` AS `contact_photo`,
                                `contact`.`thumb` AS `contact_thumb`, `contact`.`micro` AS `contact_micro`,
                                `profile`.`uid` AS `profile_uid`, `profile`.*,
-                               `contact`.`avatar-date` AS picdate, `contact`.`addr`, `user`.*
+                               `contact`.`avatar-date` AS picdate, `contact`.`addr`, `contact`.`url`, `user`.*
                        FROM `profile`
                        INNER JOIN `contact` on `contact`.`uid` = `profile`.`uid` AND `contact`.`self`
                        INNER JOIN `user` ON `profile`.`uid` = `user`.`uid`
@@ -183,7 +183,7 @@ function get_profiledata_by_nick($nickname, $uid = 0, $profile = 0)
                        "SELECT `contact`.`id` AS `contact_id`, `contact`.`photo` as `contact_photo`,
                                `contact`.`thumb` AS `contact_thumb`, `contact`.`micro` AS `contact_micro`,
                                `profile`.`uid` AS `profile_uid`, `profile`.*,
-                               `contact`.`avatar-date` AS picdate, `contact`.`addr`, `user`.*
+                               `contact`.`avatar-date` AS picdate, `contact`.`addr`, `contact`.`url`, `user`.*
                        FROM `profile`
                        INNER JOIN `contact` ON `contact`.`uid` = `profile`.`uid` AND `contact`.`self`
                        INNER JOIN `user` ON `profile`.`uid` = `user`.`uid`
index 8720367fae995ff78b7bd5a543705151b5410003..bae3e77ea4dd3dfe2220723d8ba69c4208596dbb 100644 (file)
@@ -2,6 +2,8 @@
 
 use Friendica\App;
 use Friendica\Core\System;
+use Friendica\Database\DBM;
+use Friendica\Object\Contact;
 
 function create_tags_from_item($itemid) {
        $profile_base = System::baseUrl();
@@ -148,3 +150,123 @@ function update_items() {
 
        dba::close($messages);
 }
+
+// Tag cloud functions - need to be adpated to this database format
+function tagadelic($uid, $count = 0, $authors = '', $owner = '', $flags = 0, $type = TERM_HASHTAG) {
+       require_once('include/security.php');
+
+       $item_condition = item_condition();
+       $sql_options = item_permissions_sql($uid);
+       $count = intval($count);
+       if ($flags) {
+               if ($flags === 'wall') {
+                       $sql_options .= " AND `item`.`wall` ";
+               }
+       }
+       if ($authors) {
+               if (!is_array($authors)) {
+                       $authors = array($authors);
+               }
+               $sql_options .= " AND `item`.`author-id` IN (".implode(',', $authors).") ";
+       }
+       if ($owner) {
+               $sql_options .= " AND `item`.`owner-id` = ".intval($owner)." ";
+       }
+
+       // Fetch tags
+       $r = q("SELECT `term`, COUNT(`term`) AS `total` FROM `term`
+               LEFT JOIN `item` ON `term`.`oid` = `item`.`id`
+               WHERE `term`.`uid` = %d AND `term`.`type` = %d
+               AND `term`.`otype` = %d AND `item`.`private` = 0
+               $sql_options AND $item_condition
+               GROUP BY `term` ORDER BY `total` DESC %s",
+               intval($uid),
+               intval($type),
+               intval(TERM_OBJ_POST),
+               ((intval($count)) ? "LIMIT $count" : '')
+       );
+       if(!DBM::is_result($r)) {
+               return array();
+       }
+               
+       return tag_calc($r);
+}
+
+function wtagblock($uid, $count = 0, $authors = '', $owner = '', $flags = 0, $type = TERM_HASHTAG) {
+       $o = '';
+       $r = tagadelic($uid, $count, $authors, $owner, $flags, $type);
+       if($r) {
+               foreach ($r as $rr) {
+                       $tag['level'] = $rr[2];
+                       $tag['url'] = urlencode($rr[0]);
+                       $tag['name'] = $rr[0];
+
+                       $tags[] = $tag;
+               }
+
+               $tpl = get_markup_template("tagblock_widget.tpl");
+               $o = replace_macros($tpl, array(
+                       '$title' => t('Tags'),
+                       '$tags'  => $tags
+               ));
+
+       }
+       return $o;
+}
+
+function tag_calc($arr) {
+       $tags = array();
+       $min = 1e9;
+       $max = -1e9;
+       $x = 0;
+
+       if (!$arr) {
+               return array();
+       }
+
+       foreach ($arr as $rr) {
+               $tags[$x][0] = $rr['term'];
+               $tags[$x][1] = log($rr['total']);
+               $tags[$x][2] = 0;
+               $min = min($min, $tags[$x][1]);
+               $max = max($max, $tags[$x][1]);
+               $x ++;
+       }
+
+       usort($tags, 'self::tags_sort');
+       $range = max(.01, $max - $min) * 1.0001;
+
+       for ($x = 0; $x < count($tags); $x ++) {
+               $tags[$x][2] = 1 + floor(9 * ($tags[$x][1] - $min) / $range);
+       }
+
+       return $tags;
+}
+
+function tags_sort($a,$b) {
+       if (strtolower($a[0]) == strtolower($b[0])) {
+               return 0;
+       }
+       return((strtolower($a[0]) < strtolower($b[0])) ? -1 : 1);
+}
+
+
+function tagcloud_wall_widget($arr = array()) {
+       $a = get_app();
+
+       if(!$a->profile['profile_uid'] || !$a->profile['url']) {
+               return "";
+       }
+
+       $limit = ((array_key_exists('limit', $arr)) ? intval($arr['limit']) : 50);
+       if(feature_enabled($a->profile['profile_uid'], 'tagadelic')) {
+               $owner_id = Contact::getIdForURL($a->profile['url']);
+               logger("public contact id: ".$owner_id);
+               if(!$owner_id) {
+                       return "";
+               }
+               return wtagblock($a->profile['profile_uid'], $limit, '', $owner_id, 'wall');
+       }
+
+       return "";
+}
index 8a9b8b66664d21805ac6145f901b5c3d24cc40f6..9ad24ccd1779d2f8c155e54da11ee5141e6b8c0c 100644 (file)
@@ -185,6 +185,7 @@ function profile_content(App $a, $update = 0) {
 
                $a->page['aside'] .= posted_date_widget(System::baseUrl(true) . '/profile/' . $a->profile['nickname'],$a->profile['profile_uid'],true);
                $a->page['aside'] .= categories_widget(System::baseUrl(true) . '/profile/' . $a->profile['nickname'],(x($category) ? xmlify($category) : ''));
+               $a->page['aside'] .= tagcloud_wall_widget();
 
                if (can_write_wall($a,$a->profile['profile_uid'])) {
 
index e990060943fb6f269ccc13c006cae89ab1ad35a1..cf8ad8d4e2637dacc1002f1ad009ed3f61fd0bba 100644 (file)
@@ -522,3 +522,49 @@ td.pendingnote > p > span {
 .invalid-src:after,
 .invalid-href:after { content: '⚠️'}
 img.invalid-src:after { vertical-align: top;}
+
+/* Tag cloud */
+.tag1, .tag1:hover {
+  font-size: 0.9em ;
+  color: DarkGray;
+}
+.tag2, .tag2:hover {
+  font-size: 1.0em;
+  color: LawnGreen;
+}
+.tag3, .tag3:hover {
+  font-size: 1.1em;
+  color: DarkOrange;
+}
+.tag4, .tag4:hover {
+  font-size: 1.2em;
+  color: Red;
+}
+.tag5, .tag5:hover {
+  font-size: 1.3em;
+  color: Gold;
+}
+.tag6, .tag6:hover {
+  font-size: 1.4em;
+  color: Teal;
+}
+.tag7, .tag7:hover {
+  font-size: 1.5em;
+  color: DarkMagenta;
+}
+.tag8, .tag8:hover {
+  font-size: 1.6em;
+  color: DarkGoldenRod;
+}
+.tag9, .tag9:hover {
+  font-size: 1.7em;
+  color: DarkBlue;
+}
+.tag10 .tag10:hover {
+  font-size: 1.8em;
+  color: DeepPink;
+}
+.tag1:hover, .tag2:hover, .tag3:hover, .tag4:hover, .tag5:hover,
+.tag6:hover, .tag7:hover, .tag8:hover, .tag9:hover, .tag10:hover {
+  text-decoration: underline;
+}
\ No newline at end of file
diff --git a/view/templates/tagblock_widget.tpl b/view/templates/tagblock_widget.tpl
new file mode 100644 (file)
index 0000000..3317d66
--- /dev/null
@@ -0,0 +1,11 @@
+
+<div class="tagblock widget">
+       <h3>{{$title}}</h3>
+
+       <div class="tags">
+               {{foreach $tags as $tag}}
+                       <span class="tag{{$tag.level}}">#</span>
+                       <a href="search?f=&tag={{$tag.url}}" class="tag{{$tag.level}}">{{$tag.name}}</a>
+               {{/foreach}}
+       </div>
+</div>
index ab8e3d5a53bb842642869f5ed049d2680562f736..a606f0629626ee786e641738ad82668b255a9e2f 100644 (file)
@@ -1238,6 +1238,11 @@ aside #group-sidebar li .group-edit-tool:first-child {
     width: 75px;
     border-radius: 4px;
 }
+
+/* Tag cloud widget */
+.tagblock.widget > .tags {
+    text-align: center;
+}
 /* Section */
 section ul.tabs {
     display: none !important;