Few optimizations and code readability for tag cloud controller

This commit is contained in:
ArthurHoaro 2020-05-16 13:33:39 +02:00
parent c79473bd84
commit 3772298ee7
5 changed files with 37 additions and 27 deletions

View file

@ -16,7 +16,13 @@
*/ */
class TagCloudController extends ShaarliController 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) { if ($this->container->loginManager->isLoggedIn() === true) {
$visibility = $this->container->sessionManager->getSessionParameter('visibility'); $visibility = $this->container->sessionManager->getSessionParameter('visibility');
@ -27,27 +33,10 @@ public function index(Request $request, Response $response): Response
$tags = $this->container->bookmarkService->bookmarksCountPerTag($filteringTags, $visibility ?? null); $tags = $this->container->bookmarkService->bookmarksCountPerTag($filteringTags, $visibility ?? null);
// We sort tags alphabetically, then choose a font size according to count. // TODO: the sorting should be handled by bookmarkService instead of the controller
// First, find max value.
$maxCount = 0;
foreach ($tags as $count) {
$maxCount = max($maxCount, $count);
}
alphabetical_sort($tags, false, true); alphabetical_sort($tags, false, true);
$logMaxCount = $maxCount > 1 ? log($maxCount, 30) : 1; $tagList = $this->formatTagsForCloud($tags);
$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, '.', ''),
];
}
$searchTags = implode(' ', escape($filteringTags)); $searchTags = implode(' ', escape($filteringTags));
$data = [ $data = [
@ -68,6 +57,27 @@ public function index(Request $request, Response $response): Response
return $response->write($this->render('tag.cloud')); 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 * @param mixed[] $data Template data
* *

View file

@ -1869,7 +1869,7 @@ function install($conf, $sessionManager, $loginManager)
$this->get('/login', '\Shaarli\Front\Controller\LoginController:index')->setName('login'); $this->get('/login', '\Shaarli\Front\Controller\LoginController:index')->setName('login');
$this->get('/logout', '\Shaarli\Front\Controller\LogoutController:index')->setName('logout'); $this->get('/logout', '\Shaarli\Front\Controller\LogoutController:index')->setName('logout');
$this->get('/picture-wall', '\Shaarli\Front\Controller\PictureWallController:index')->setName('picwall'); $this->get('/picture-wall', '\Shaarli\Front\Controller\PictureWallController:index')->setName('picwall');
$this->get('/tag-cloud', '\Shaarli\Front\Controller\TagCloudController:index')->setName('tagcloud'); $this->get('/tag-cloud', '\Shaarli\Front\Controller\TagCloudController:cloud')->setName('tagcloud');
$this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag'); $this->get('/add-tag/{newTag}', '\Shaarli\Front\Controller\TagController:addTag')->setName('add-tag');
})->add('\Shaarli\Front\ShaarliMiddleware'); })->add('\Shaarli\Front\ShaarliMiddleware');

View file

@ -73,7 +73,7 @@ public function testValidCloudControllerInvokeDefault(): void
}) })
; ;
$result = $this->controller->index($request, $response); $result = $this->controller->cloud($request, $response);
static::assertSame(200, $result->getStatusCode()); static::assertSame(200, $result->getStatusCode());
static::assertSame('tag.cloud', (string) $result->getBody()); static::assertSame('tag.cloud', (string) $result->getBody());
@ -147,7 +147,7 @@ public function testValidCloudControllerInvokeWithParameters(): void
}) })
; ;
$result = $this->controller->index($request, $response); $result = $this->controller->cloud($request, $response);
static::assertSame(200, $result->getStatusCode()); static::assertSame(200, $result->getStatusCode());
static::assertSame('tag.cloud', (string) $result->getBody()); static::assertSame('tag.cloud', (string) $result->getBody());
@ -198,7 +198,7 @@ public function testEmptyCloud(): void
}) })
; ;
$result = $this->controller->index($request, $response); $result = $this->controller->cloud($request, $response);
static::assertSame(200, $result->getStatusCode()); static::assertSame(200, $result->getStatusCode());
static::assertSame('tag.cloud', (string) $result->getBody()); static::assertSame('tag.cloud', (string) $result->getBody());

View file

@ -48,7 +48,7 @@ <h2 class="window-title">{'Tag cloud'|t} - {$countTags} {'tags'|t}</h2>
<div id="cloudtag" class="cloudtag-container"> <div id="cloudtag" class="cloudtag-container">
{loop="tags"} {loop="tags"}
<a href="?searchtags={$key|urlencode} {$search_tags|urlencode}" style="font-size:{$value.size}em;">{$key}</a <a href="./?searchtags={$key|urlencode} {$search_tags|urlencode}" style="font-size:{$value.size}em;">{$key}</a
><a href="./add-tag/{$key|urlencode}" title="{'Filter by tag'|t}" class="count">{$value.count}</a> ><a href="./add-tag/{$key|urlencode}" title="{'Filter by tag'|t}" class="count">{$value.count}</a>
{loop="$value.tag_plugin"} {loop="$value.tag_plugin"}
{$value} {$value}

View file

@ -13,7 +13,7 @@
<div id="cloudtag"> <div id="cloudtag">
{loop="$tags"} {loop="$tags"}
<a href="./add-tag/{$key|urlencode}" class="count">{$value.count}</a><a <a href="./add-tag/{$key|urlencode}" class="count">{$value.count}</a><a
href="?searchtags={$key|urlencode}" style="font-size:{$value.size}em;">{$key}</a> href="./?searchtags={$key|urlencode}" style="font-size:{$value.size}em;">{$key}</a>
{loop="$value.tag_plugin"} {loop="$value.tag_plugin"}
{$value} {$value}
{/loop} {/loop}