adding a simple tag cloud


After having my blog running with harpjs for about a week and having pushed the basic structure to github for everybody to use as they wish (if they wish to…), I found it would be great to organize my tags in a tag cloud rather than showing them in an unhandy list - as the amount of tags used grows, this list view is not useful at all to anybody (unless you are searching the page with the browsers built-in search functionality). I still have the list style active on my archived blog in German if you like to see an example.

Getting inspired by the great posting on creating a sitemap by Kevin Saliou, I thought it should not be too hard doing something similar to create a tag cloud. This is the first (and current) solution I came up with:

(As I am still pretty new to javascript, there probably are a lot of things that can be done better or more elegant - even in these few lines of code. Sorry for this…)

public/tags/index.jade
h2 tag cloud
- var data = public.posts.data;
- var tags = {};
- for (var name in data) {
-		if (name[0] != '_') {
-			var ts = data[name].tags;
-			for (var i in ts) {
-				tags[ts[i]] = tags[ts[i]] === undefined ? 1 : tags[ts[i]] += 1;
-			}
-		}
- }

- var sortedTags = {};
- var helperArray = [];
- var maxAppearances = 0;
- for (var i in tags) {
- 	helperArray.push(i);
- }

- helperArray.sort(function randOrd(){
-		return (Math.round(Math.random())-0.5);
-	});
- for (var i in helperArray) {
- 	sortedTags[helperArray[i]] = tags[helperArray[i]];
- 	maxAppearances = maxAppearances < tags[helperArray[i]] ? tags[helperArray[i]] : maxAppearances;
- }
#tcloud
	each index, tag in sortedTags
		- var fontSize = (1.6 * ((index - minimum_apearances_for_tagcloud_greater_than)/(maxAppearances - minimum_apearances_for_tagcloud_greater_than)));
		if (fontSize > 0)
			- var tagClass = "tc" + fontSize.toFixed(1).replace('.', '');
			a(href='/tags/' + tag.toLowerCase().replace(/ /g,''), title='#{ index }', class='#{ tagClass }') #{ tag } 

I simply iterated over the tags defined in my _data.json-file for each post and sum them up in a new object. Next I am pushing the content to an array and use a small function to randomize the order of tags for displaying. Before doing a standard calculation for retrieving the target style of a tag in the tag cloud, the (randomly sorted) array content is pushed to a new object. As you can see, using three collections to perform this task is not ideal. It is - as I wrote before - my first take on solving this ‘issue’.

I have declared some style definitions in my less-file to make the visual differentiation according to the count of appearances of tags. Also, I set up the global harp variable minimum_apearances_for_tagcloud_greater_than to be able to easily adjust the minimum number of usages of a tag to be included in the cloud as the overall count of tags goes up.

This is how the result looks like (for the tags used on my German blog):

tag cloud