--- /dev/null
+<?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