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
{
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');
@ -27,27 +33,10 @@ public function index(Request $request, Response $response): Response
$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 = [
@ -68,6 +57,27 @@ public function index(Request $request, Response $response): Response
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
*

View file

@ -1869,7 +1869,7 @@ function install($conf, $sessionManager, $loginManager)
$this->get('/login', '\Shaarli\Front\Controller\LoginController:index')->setName('login');
$this->get('/logout', '\Shaarli\Front\Controller\LogoutController:index')->setName('logout');
$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');
})->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('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('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('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">
{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>
{loop="$value.tag_plugin"}
{$value}

View file

@ -13,7 +13,7 @@
<div id="cloudtag">
{loop="$tags"}
<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"}
{$value}
{/loop}