]> git.mxchange.org Git - friendica.git/blobdiff - src/Content/Widget/TagCloud.php
Copy functions from include/tags to src
[friendica.git] / src / Content / Widget / TagCloud.php
diff --git a/src/Content/Widget/TagCloud.php b/src/Content/Widget/TagCloud.php
new file mode 100644 (file)
index 0000000..a80c2e8
--- /dev/null
@@ -0,0 +1,162 @@
+<?php\r
+\r
+/*\r
+ * @file src/Content/Widget/TagCloud.php\r
+ */\r
+\r
+namespace Friendica\Content\Widget;\r
+\r
+use dba;\r
+use Friendica\Core\L10n;\r
+use Friendica\Core\System;\r
+use Friendica\Database\DBM;\r
+\r
+require_once 'include/dba.php';\r
+require_once 'include/security.php';\r
+\r
+/**\r
+ * TagCloud widget\r
+ *\r
+ * @author Rabuzarus\r
+ */\r
+class TagCloud\r
+{\r
+       /**\r
+        * Construct a tag/term cloud block for an user.\r
+        *\r
+        * @brief Construct a tag/term cloud block for an user.\r
+        * @param int $uid      The user ID.\r
+        * @param int $count    Max number of displayed tags/terms.\r
+        * @param int $owner_id The contact ID of the owner of the tagged items.\r
+        * @param string $flags Special item flags.\r
+        * @param int $type     The tag/term type.\r
+        *\r
+        * @return string       HTML formatted output.\r
+        */\r
+       public static function getHTML($uid, $count = 0, $owner_id = 0, $flags = '', $type = TERM_HASHTAG)\r
+       {\r
+               $o = '';\r
+               $r = self::tagadelic($uid, $count, $owner_id, $flags, $type);\r
+               if (count($r)) {\r
+                       $contact = dba::selectFirst('contact', ['url'], ['id' => $uid]);\r
+                       $url = System::removedBaseUrl($contact['url']);\r
+\r
+                       foreach ($r as $rr) {\r
+                               $tag['level'] = $rr[2];\r
+                               $tag['url'] = $url . '?tag=' . urlencode($rr[0]);\r
+                               $tag['name'] = $rr[0];\r
+\r
+                               $tags[] = $tag;\r
+                       }\r
+\r
+                       $tpl = get_markup_template('tagblock_widget.tpl');\r
+                       $o = replace_macros($tpl, [\r
+                               '$title' => L10n::t('Tags'),\r
+                               '$tags' => $tags\r
+                       ]);\r
+               }\r
+               return $o;\r
+       }\r
+\r
+       /**\r
+        * Get alphabetical sorted array of used tags/terms of an user including\r
+        * a weighting by frequency of use.\r
+        *\r
+        * @brief Get alphabetical sorted array of used tags/terms of an user including\r
+        * a weighting by frequency of use.\r
+        * @param int $uid      The user ID.\r
+        * @param int $count    Max number of displayed tags/terms.\r
+        * @param int $owner_id The contact id of the owner of the tagged items.\r
+        * @param string $flags Special item flags.\r
+        * @param int $type     The tag/term type.\r
+        *\r
+        * @return arr          Alphabetical sorted array of used tags of an user.\r
+        */\r
+       private static function tagadelic($uid, $count = 0, $owner_id = 0, $flags = '', $type = TERM_HASHTAG)\r
+       {\r
+               $item_condition = item_condition();\r
+               $sql_options = item_permissions_sql($uid);\r
+               $limit = $count ? sprintf('LIMIT %d', intval($count)) : '';\r
+\r
+               if ($flags) {\r
+                       if ($flags === 'wall') {\r
+                               $sql_options .= ' AND `item`.`wall` ';\r
+                       }\r
+               }\r
+\r
+               if ($owner_id) {\r
+                       $sql_options .= ' AND `item`.`owner-id` = ' . intval($owner_id) . ' ';\r
+               }\r
+\r
+               // Fetch tags\r
+               $r = dba::p("SELECT `term`, COUNT(`term`) AS `total` FROM `term`\r
+                       LEFT JOIN `item` ON `term`.`oid` = `item`.`id`\r
+                       WHERE `term`.`uid` = ? AND `term`.`type` = ?\r
+                       AND `term`.`otype` = ?\r
+                       AND $item_condition $sql_options\r
+                       GROUP BY `term` ORDER BY `total` DESC $limit",\r
+                       $uid,\r
+                       $type,\r
+                       TERM_OBJ_POST\r
+               );\r
+               if (!DBM::is_result($r)) {\r
+                       return [];\r
+               }\r
+\r
+               return self::tagCalc($r);\r
+       }\r
+\r
+       /**\r
+        * Calculate weighting of tags according to the frequency of use.\r
+        *\r
+        * @brief Calculate weighting of tags according to the frequency of use.\r
+        * @param array $arr Array of tags/terms with tag/term name and total count of use.\r
+        * @return array     Alphabetical sorted array of used tags/terms of an user.\r
+        */\r
+       private static function tagCalc($arr)\r
+       {\r
+               $tags = [];\r
+               $min = 1e9;\r
+               $max = -1e9;\r
+               $x = 0;\r
+\r
+               if (!$arr) {\r
+                       return [];\r
+               }\r
+\r
+               foreach ($arr as $rr) {\r
+                       $tags[$x][0] = $rr['term'];\r
+                       $tags[$x][1] = log($rr['total']);\r
+                       $tags[$x][2] = 0;\r
+                       $min = min($min, $tags[$x][1]);\r
+                       $max = max($max, $tags[$x][1]);\r
+                       $x ++;\r
+               }\r
+\r
+               usort($tags, 'self::tagsSort');\r
+               $range = max(.01, $max - $min) * 1.0001;\r
+\r
+               for ($x = 0; $x < count($tags); $x ++) {\r
+                       $tags[$x][2] = 1 + floor(9 * ($tags[$x][1] - $min) / $range);\r
+               }\r
+\r
+               return $tags;\r
+       }\r
+\r
+       /**\r
+        * Compare function to sort tags/terms alphabetically.\r
+        *\r
+        * @brief Compare function to sort tags/terms alphabetically.\r
+        * @param type $a\r
+        * @param type $b\r
+        *\r
+        * @return int\r
+        */\r
+       private static function tagsSort($a, $b)\r
+       {\r
+               if (strtolower($a[0]) == strtolower($b[0])) {\r
+                       return 0;\r
+               }\r
+               return ((strtolower($a[0]) < strtolower($b[0])) ? -1 : 1);\r
+       }\r
+}\r