Making a Tag Cloud
Sometimes you decide that you just need a tag (and category)
cloud. The top search result was
from SuperDevResources
by Kanishk
Kunal, which worked pretty well, but I didn't like the sizes,
and wanted to have fun colours. Here's my version:
<section id="tag-cloud">
<h2>Web Tech Blog Tag Cloud</h2>
<nav>
{% assign sortedCats = site.categories | sort %}
{% for category in sortedCats %}
{% assign cat = category[0] %}
{%- unless cat == "blog" -%}
<a class="category-cloud" href="{{ site.blogPath }}categories/{{ cat | slugify: 'pretty' }}"
style="color: hsl({{ "now" | date: "%N" | divided_by: 400 }}, 100%, 40%); font-size: {{ category | last | size | logn }}em">
{{ cat }}</a>
{% endunless -%}
{% endfor %}
{% assign taglist = site.tags | sort %}
{% for tagitem in taglist %}
{% assign tag = tagitem[0] %}
<a class="tag-cloud" href="{{ site.blogPath }}tags/{{ tag | slugify: 'pretty' }}"
style="color: hsl({{ "now" | date: "%N" | divided_by: 400 }}, 100%, 40%); font-size: {{ tagitem | last | size | logn }}em">
{{ tag }}</a>
{% endfor %}
</nav>
</section>
The code is very close to the same except
that site.blogPath
is something I defined for my stuff
that won't exist for you. Since everything is in
the blog
category, there didn't seem to be any point to
including it in the cloud.
For fun, I set the colour with HSL with a random hue. Since the hue defaults to a number that represents a degree between 0-360 but larger numbers just act as more circuits around the circle, big numbers just add to the randomness. So, I made a pseudorandom number generator by taking the current time in seconds and dividing by 400 and rounding to an integer. It works well enough for me. ¯\_(ツ)_/¯.
For the font sizes, I wanted more size variation, but with a size
cap. Obviously, I needed logarithmic math, so I had to make a
filter like so:
module Jekyll
module LogFilter
def logn(input)
sprintf("%.2f", 1 + Math.log(input, 3))
end
end
end
Liquid::Template.register_filter(Jekyll::LogFilter)
For style, I borrowed the basic layout
from Alvaro Montoro
on DEV
Community like so:
#tag-cloud h2{
text-align: center;
margin-top: 2em;
margin-bottom: 0;
}
#tag-cloud nav {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: center;
}
#tag-cloud a {
display: block;
padding: 0.125rem 0.25rem;
text-decoration: none;
position: relative;
}