diff options
-rw-r--r-- | application/front/controllers/TagCloudController.php | 52 | ||||
-rw-r--r-- | index.php | 2 | ||||
-rw-r--r-- | tests/front/controller/TagCloudControllerTest.php | 6 | ||||
-rw-r--r-- | tpl/default/tag.cloud.html | 2 | ||||
-rw-r--r-- | tpl/vintage/tag.cloud.html | 2 |
5 files changed, 37 insertions, 27 deletions
diff --git a/application/front/controllers/TagCloudController.php b/application/front/controllers/TagCloudController.php index 9389c2b0..93e3ae27 100644 --- a/application/front/controllers/TagCloudController.php +++ b/application/front/controllers/TagCloudController.php | |||
@@ -16,7 +16,13 @@ use Slim\Http\Response; | |||
16 | */ | 16 | */ |
17 | class TagCloudController extends ShaarliController | 17 | class TagCloudController extends ShaarliController |
18 | { | 18 | { |
19 | public function index(Request $request, Response $response): Response | 19 | /** |
20 | * Display the tag cloud through the template engine. | ||
21 | * This controller a few filters: | ||
22 | * - Visibility stored in the session for logged in users | ||
23 | * - `searchtags` query parameter: will return tags associated with filter in at least one bookmark | ||
24 | */ | ||
25 | public function cloud(Request $request, Response $response): Response | ||
20 | { | 26 | { |
21 | if ($this->container->loginManager->isLoggedIn() === true) { | 27 | if ($this->container->loginManager->isLoggedIn() === true) { |
22 | $visibility = $this->container->sessionManager->getSessionParameter('visibility'); | 28 | $visibility = $this->container->sessionManager->getSessionParameter('visibility'); |
@@ -27,27 +33,10 @@ class TagCloudController extends ShaarliController | |||
27 | 33 | ||
28 | $tags = $this->container->bookmarkService->bookmarksCountPerTag($filteringTags, $visibility ?? null); | 34 | $tags = $this->container->bookmarkService->bookmarksCountPerTag($filteringTags, $visibility ?? null); |
29 | 35 | ||
30 | // We sort tags alphabetically, then choose a font size according to count. | 36 | // TODO: the sorting should be handled by bookmarkService instead of the controller |
31 | // First, find max value. | ||
32 | $maxCount = 0; | ||
33 | foreach ($tags as $count) { | ||
34 | $maxCount = max($maxCount, $count); | ||
35 | } | ||
36 | |||
37 | alphabetical_sort($tags, false, true); | 37 | alphabetical_sort($tags, false, true); |
38 | 38 | ||
39 | $logMaxCount = $maxCount > 1 ? log($maxCount, 30) : 1; | 39 | $tagList = $this->formatTagsForCloud($tags); |
40 | $tagList = []; | ||
41 | foreach ($tags as $key => $value) { | ||
42 | // Tag font size scaling: | ||
43 | // default 15 and 30 logarithm bases affect scaling, | ||
44 | // 2.2 and 0.8 are arbitrary font sizes in em. | ||
45 | $size = log($value, 15) / $logMaxCount * 2.2 + 0.8; | ||
46 | $tagList[$key] = [ | ||
47 | 'count' => $value, | ||
48 | 'size' => number_format($size, 2, '.', ''), | ||
49 | ]; | ||
50 | } | ||
51 | 40 | ||
52 | $searchTags = implode(' ', escape($filteringTags)); | 41 | $searchTags = implode(' ', escape($filteringTags)); |
53 | $data = [ | 42 | $data = [ |
@@ -62,12 +51,33 @@ class TagCloudController extends ShaarliController | |||
62 | $searchTags = !empty($searchTags) ? $searchTags .' - ' : ''; | 51 | $searchTags = !empty($searchTags) ? $searchTags .' - ' : ''; |
63 | $this->assignView( | 52 | $this->assignView( |
64 | 'pagetitle', | 53 | 'pagetitle', |
65 | $searchTags. t('Tag cloud') .' - '. $this->container->conf->get('general.title', 'Shaarli') | 54 | $searchTags . t('Tag cloud') .' - '. $this->container->conf->get('general.title', 'Shaarli') |
66 | ); | 55 | ); |
67 | 56 | ||
68 | return $response->write($this->render('tag.cloud')); | 57 | return $response->write($this->render('tag.cloud')); |
69 | } | 58 | } |
70 | 59 | ||
60 | protected function formatTagsForCloud(array $tags): array | ||
61 | { | ||
62 | // We sort tags alphabetically, then choose a font size according to count. | ||
63 | // First, find max value. | ||
64 | $maxCount = count($tags) > 0 ? max($tags) : 0; | ||
65 | $logMaxCount = $maxCount > 1 ? log($maxCount, 30) : 1; | ||
66 | $tagList = []; | ||
67 | foreach ($tags as $key => $value) { | ||
68 | // Tag font size scaling: | ||
69 | // default 15 and 30 logarithm bases affect scaling, | ||
70 | // 2.2 and 0.8 are arbitrary font sizes in em. | ||
71 | $size = log($value, 15) / $logMaxCount * 2.2 + 0.8; | ||
72 | $tagList[$key] = [ | ||
73 | 'count' => $value, | ||
74 | 'size' => number_format($size, 2, '.', ''), | ||
75 | ]; | ||
76 | } | ||
77 | |||
78 | return $tagList; | ||
79 | } | ||
80 | |||
71 | /** | 81 | /** |
72 | * @param mixed[] $data Template data | 82 | * @param mixed[] $data Template data |
73 | * | 83 | * |
@@ -1869,7 +1869,7 @@ $app->group('', function () { | |||
1869 | $this->get('/login', '\Shaarli\Front\Controller\LoginController:index')->setName('login'); | 1869 | $this->get('/login', '\Shaarli\Front\Controller\LoginController:index')->setName('login'); |
1870 | $this->get('/logout', '\Shaarli\Front\Controller\LogoutController:index')->setName('logout'); | 1870 | $this->get('/logout', '\Shaarli\Front\Controller\LogoutController:index')->setName('logout'); |
1871 | $this->get('/picture-wall', '\Shaarli\Front\Controller\PictureWallController:index')->setName('picwall'); | 1871 | $this->get('/picture-wall', '\Shaarli\Front\Controller\PictureWallController:index')->setName('picwall'); |
1872 | $this->get('/tag-cloud', '\Shaarli\Front\Controller\TagCloudController:index')->setName('tagcloud'); | 1872 | $this->get('/tag-cloud', '\Shaarli\Front\Controller\TagCloudController:cloud')->setName('tagcloud'); |
1873 | $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag'); | 1873 | $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag'); |
1874 | })->add('\Shaarli\Front\ShaarliMiddleware'); | 1874 | })->add('\Shaarli\Front\ShaarliMiddleware'); |
1875 | 1875 | ||
diff --git a/tests/front/controller/TagCloudControllerTest.php b/tests/front/controller/TagCloudControllerTest.php index 5cbf06a9..352bdee2 100644 --- a/tests/front/controller/TagCloudControllerTest.php +++ b/tests/front/controller/TagCloudControllerTest.php | |||
@@ -73,7 +73,7 @@ class TagCloudControllerTest extends TestCase | |||
73 | }) | 73 | }) |
74 | ; | 74 | ; |
75 | 75 | ||
76 | $result = $this->controller->index($request, $response); | 76 | $result = $this->controller->cloud($request, $response); |
77 | 77 | ||
78 | static::assertSame(200, $result->getStatusCode()); | 78 | static::assertSame(200, $result->getStatusCode()); |
79 | static::assertSame('tag.cloud', (string) $result->getBody()); | 79 | static::assertSame('tag.cloud', (string) $result->getBody()); |
@@ -147,7 +147,7 @@ class TagCloudControllerTest extends TestCase | |||
147 | }) | 147 | }) |
148 | ; | 148 | ; |
149 | 149 | ||
150 | $result = $this->controller->index($request, $response); | 150 | $result = $this->controller->cloud($request, $response); |
151 | 151 | ||
152 | static::assertSame(200, $result->getStatusCode()); | 152 | static::assertSame(200, $result->getStatusCode()); |
153 | static::assertSame('tag.cloud', (string) $result->getBody()); | 153 | static::assertSame('tag.cloud', (string) $result->getBody()); |
@@ -198,7 +198,7 @@ class TagCloudControllerTest extends TestCase | |||
198 | }) | 198 | }) |
199 | ; | 199 | ; |
200 | 200 | ||
201 | $result = $this->controller->index($request, $response); | 201 | $result = $this->controller->cloud($request, $response); |
202 | 202 | ||
203 | static::assertSame(200, $result->getStatusCode()); | 203 | static::assertSame(200, $result->getStatusCode()); |
204 | static::assertSame('tag.cloud', (string) $result->getBody()); | 204 | static::assertSame('tag.cloud', (string) $result->getBody()); |
diff --git a/tpl/default/tag.cloud.html b/tpl/default/tag.cloud.html index 547d5018..bf543357 100644 --- a/tpl/default/tag.cloud.html +++ b/tpl/default/tag.cloud.html | |||
@@ -48,7 +48,7 @@ | |||
48 | 48 | ||
49 | <div id="cloudtag" class="cloudtag-container"> | 49 | <div id="cloudtag" class="cloudtag-container"> |
50 | {loop="tags"} | 50 | {loop="tags"} |
51 | <a href="?searchtags={$key|urlencode} {$search_tags|urlencode}" style="font-size:{$value.size}em;">{$key}</a | 51 | <a href="./?searchtags={$key|urlencode} {$search_tags|urlencode}" style="font-size:{$value.size}em;">{$key}</a |
52 | ><a href="./add-tag/{$key|urlencode}" title="{'Filter by tag'|t}" class="count">{$value.count}</a> | 52 | ><a href="./add-tag/{$key|urlencode}" title="{'Filter by tag'|t}" class="count">{$value.count}</a> |
53 | {loop="$value.tag_plugin"} | 53 | {loop="$value.tag_plugin"} |
54 | {$value} | 54 | {$value} |
diff --git a/tpl/vintage/tag.cloud.html b/tpl/vintage/tag.cloud.html index 23aa381e..4bc4bf88 100644 --- a/tpl/vintage/tag.cloud.html +++ b/tpl/vintage/tag.cloud.html | |||
@@ -13,7 +13,7 @@ | |||
13 | <div id="cloudtag"> | 13 | <div id="cloudtag"> |
14 | {loop="$tags"} | 14 | {loop="$tags"} |
15 | <a href="./add-tag/{$key|urlencode}" class="count">{$value.count}</a><a | 15 | <a href="./add-tag/{$key|urlencode}" class="count">{$value.count}</a><a |
16 | href="?searchtags={$key|urlencode}" style="font-size:{$value.size}em;">{$key}</a> | 16 | href="./?searchtags={$key|urlencode}" style="font-size:{$value.size}em;">{$key}</a> |
17 | {loop="$value.tag_plugin"} | 17 | {loop="$value.tag_plugin"} |
18 | {$value} | 18 | {$value} |
19 | {/loop} | 19 | {/loop} |