it4life - Portal de Informática

jfrosorio


junkie user
93 posts

Boas,

Tenho uma página que carrega registos dinamicamente e preciso de gerar uma tag cloud, de acordo com o conteúdo de cada registo. Alguém sabe se existe algum plugin para fazer isto, ou é preciso fazer isto "à unha"? Tenho pesquisado na net e encontrei alguns plugins que fazem a cloud, mas temos de dar as palavras previamente. Ou seja, os plugins que vi não descobrem quais os termos mais recorrentes para gerar a cloud, que é no fundo aquilo que se pretende.

Alguém pode dar uma ajuda?


A prática vale muito, mas é a vontade de ir mais longe que garante o sucesso.

decoder


1.0 user
17 posts

Se optares por Javascript, podes desenvolver um método que apanhe o html do elemento que contém o texto para a cloud. Depois, deves fazer um tratamento para remover as tags e caracteres como vírgulas, pontos, etc. Depois disso colocas todas as palavras num array, defines um mínimo de length (aconselho a considerares palavras com 3 ou + caracteres). Por fim, tens de determinar o número de ocorrências de cada expressão e usares isso para controlares o tamanho da letra.


jfrosorio


junkie user
93 posts

Obrigado pela ajuda decoder. Na realidade, já desenvolvi a seguinte solução para resolver o problema:

function createTags(el, minlength, words_limit) {
	var $pane = $('div.tags_pane');
	minlength = minlength ? minlength : 3;
	words_limit = words_limit ? words_limit : 20;
	 
	// strip HTML and empty lines
	var tokens = [], words = [];
	$.each($(el), function() {
		words = $(this).html().replace(/(<([^>]+)>)/ig, ' ').replace(/([;,.!?]+)/ig, ' ').split(' ');
		$.each(words, function(i, val){
			val = val.trim();
			val && val.length >= minlength && tokens.push(val.trim());
		});
	});
	 
	// create tag list and entry count
	var tags = {};
	$.each(tokens, function(index, value){
		if(!tags[value])tags[value] = 1;
		else tags[value] += 1;
	});
	 
	// sort the tags by greater hit to lower hit
	var sorted = [];
	for(var tag in tags)
		sorted.push([tag, tags[tag]])
	 
	sorted.sort(function(a, b){return b[1] - a[1]});
	sorted = sorted.slice(0, words_limit);
	sorted.sort(function() { return 0.5 - Math.random() });
	 
	for(var i = 0; i < sorted.length; i++){
		size = (sorted[i][1] + 6) * 2.6;
		$pane.append('<span style="font-size:' + size + 'px;">' + sorted[i][0] + '</span> ');
	}
}

A prática vale muito, mas é a vontade de ir mais longe que garante o sucesso.

Segue-nos nas redes sociais