Few optimizations and code readability for tag cloud controller
This commit is contained in:
parent
c79473bd84
commit
3772298ee7
5 changed files with 37 additions and 27 deletions
|
@ -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
|
||||
*
|
||||
|
|
|
@ -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');
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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}
|
||||
|
|
Loading…
Reference in a new issue