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
|
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
|
||||||
*
|
*
|
||||||
|
|
|
@ -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');
|
||||||
|
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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}
|
||||||
|
|
Loading…
Reference in a new issue