Newscoop 4 Cookbook

Tag clouds using topics

A tag cloud is a collection of words in one place, a depiction of the text content of your publication. Normally, tags are listed alphabetically, and the importance of each tag is shown with font size or colour. To make a tag cloud in Newscoop, we can use topics and sub-topics. First, you will need to create a list of Newscoop sub-topics, having the parent topic 'tagcloud':

Then, you will just need to attach the required sub-topics to an article:

Then, you need to create a Tag Cloud template. Please note that this template will be doing a lot of listings, so it might be a good idea to put it a cron job to produce the output, and place the result in a file for further inclusion from other templates.

The first thing to do will be to list all sub-topics (tags) of the main topic 'tagcloud' and get minimum and maximum numbers of articles having each topic. Also, we need to set up font-size ranges for the output:

{{ local }} {{ unset_issue }} {{ unset_section }} {{ unset_article }} {{ unset_topic }} {{ set_topic name="tagcloud:en" }} {{ assign var="first_good_tag" value=true }} {{ list_subtopics }}     {{ assign var="posts_count" value="0" }}     {{ list_articles ignore_issue="true" }}         {{ assign var="posts_count" value=$gimme->current_list->count }}     {{ /list_articles }}     {{ if $posts_count > 0 }}         {{ if $first_good_tag }}             {{ assign var="min" value=$posts_count }}             {{ assign var="max" value=$posts_count }}             {{ assign var="first_good_tag" value=false }}         {{ /if }}         {{ if $posts_count > $max }}             {{ assign var="max" value=$posts_count }}         {{ /if }}         {{ if $posts_count < $min }}             {{ assign var="min" value=$posts_count }}         {{ /if }}     {{ /if }} {{ /list_subtopics }}  {{ assign var="minSize" value="90" }} {{ assign var="maxSize" value="240" }}  {{ assign var="diff_max_min" value="`$max-$min`" }} {{ assign var="diff_maxSize_minSize" value="`$maxSize-$minSize`" }} 

Next, we create the actual output. List sub-topics, get articles having each sub-topic, and assign the number of times the sub-topic was used:

<ul class="tag-cloud"> {{ list_subtopics }}     {{ assign var="posts_count" value="0" }}     {{ list_articles ignore_issue="true" }}         {{ assign var="posts_count" value=$gimme->current_list->count }}         {{ assign var="tag_name" value=$gimme->topic->name }}     {{ /list_articles }} 

Then we calculate font size for the sub-topic in the tag cloud:

{{ if $posts_count > 0 }}     {{ if $min == $max }}         {{ assign var="fontSize" value="`$diff_maxSize_minSize/2+$minSize`" }}     {{ else }}     {{ assign var="a" value="`$posts_count-$min`" }}     {{ assign var="b" value="`$a/$diff_max_min`" }}     {{ assign var="fontSize" value="`$b*$diff_maxSize_minSize+$minSize`" }} {{ /if }} 

And finally output the result:

    <li>         <span style="}}%"><a href="/?tpl=special_template_to_list_articles_based_on_topic.tpl&tag={{ $tag_name }}" title="{{ $posts_count }} articles having topic {{ $tag_name }}">{{ $tag_name }}</a></span>     </li> {{ /if }} {{ /list_subtopics }} </ul> {{ /local }} 

As a result, you should get a Tag Cloud like the following screenshot:

Tag cloud created using topics