*/
class TagCloudController extends ShaarliController
{
- public function index(Request $request, Response $response): Response
+ /**
+ * Display the tag cloud through the template engine.
+ * This controller a few filters:
+ * - Visibility stored in the session for logged in users
+ * - `searchtags` query parameter: will return tags associated with filter in at least one bookmark
+ */
+ public function cloud(Request $request, Response $response): Response
{
if ($this->container->loginManager->isLoggedIn() === true) {
$visibility = $this->container->sessionManager->getSessionParameter('visibility');
$tags = $this->container->bookmarkService->bookmarksCountPerTag($filteringTags, $visibility ?? null);
- // We sort tags alphabetically, then choose a font size according to count.
- // First, find max value.
- $maxCount = 0;
- foreach ($tags as $count) {
- $maxCount = max($maxCount, $count);
- }
-
+ // TODO: the sorting should be handled by bookmarkService instead of the controller
alphabetical_sort($tags, false, true);
- $logMaxCount = $maxCount > 1 ? log($maxCount, 30) : 1;
- $tagList = [];
- foreach ($tags as $key => $value) {
- // Tag font size scaling:
- // default 15 and 30 logarithm bases affect scaling,
- // 2.2 and 0.8 are arbitrary font sizes in em.
- $size = log($value, 15) / $logMaxCount * 2.2 + 0.8;
- $tagList[$key] = [
- 'count' => $value,
- 'size' => number_format($size, 2, '.', ''),
- ];
- }
+ $tagList = $this->formatTagsForCloud($tags);
$searchTags = implode(' ', escape($filteringTags));
$data = [
$searchTags = !empty($searchTags) ? $searchTags .' - ' : '';
$this->assignView(
'pagetitle',
- $searchTags. t('Tag cloud') .' - '. $this->container->conf->get('general.title', 'Shaarli')
+ $searchTags . t('Tag cloud') .' - '. $this->container->conf->get('general.title', 'Shaarli')
);
return $response->write($this->render('tag.cloud'));
}
+ protected function formatTagsForCloud(array $tags): array
+ {
+ // We sort tags alphabetically, then choose a font size according to count.
+ // First, find max value.
+ $maxCount = count($tags) > 0 ? max($tags) : 0;
+ $logMaxCount = $maxCount > 1 ? log($maxCount, 30) : 1;
+ $tagList = [];
+ foreach ($tags as $key => $value) {
+ // Tag font size scaling:
+ // default 15 and 30 logarithm bases affect scaling,
+ // 2.2 and 0.8 are arbitrary font sizes in em.
+ $size = log($value, 15) / $logMaxCount * 2.2 + 0.8;
+ $tagList[$key] = [
+ 'count' => $value,
+ 'size' => number_format($size, 2, '.', ''),
+ ];
+ }
+
+ return $tagList;
+ }
+
/**
* @param mixed[] $data Template data
*