Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

170 lines (148 sloc) 3.214 kb
<?php
/**
* Piwik - Open source web analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html Gpl v3 or later
* @version $Id: Cloud.php 444 2008-04-11 13:38:22Z johmathe $
*
* @package Piwik_Visualization
*/
/**
* Generates a tag cloud from a given data array.
* The generated tag cloud can be in PHP format, or in HTML.
*
* Inspired from Derek Harvey (www.derekharvey.co.uk)
*
* @package Piwik_Visualization
*/
class Piwik_Visualization_Cloud
{
protected $wordsArray = array();
public $truncatingLimit = 30;
/**
* @param array array( word => 10, word2 => 50, word3 => 1)
*/
function __construct($words = false)
{
if ($words !== false && is_array($words))
{
foreach ($words as $word => $value)
{
$this->addWord($word, $value);
}
}
}
/*
* Assign word to array
*
* @param string $word
* @return string
*/
function addWord($word, $value = 1)
{
// $word = strtolower($word);
if (isset($this->wordsArray[$word]))
{
$this->wordsArray[$word] += $value;
}
else
{
$this->wordsArray[$word] = $value;
}
}
/*
* Shuffle associated names in array
*/
function shuffleCloud()
{
$keys = array_keys($this->wordsArray);
shuffle($keys);
if (count($keys) && is_array($keys))
{
$tmpArray = $this->wordsArray;
$this->wordsArray = array();
foreach ($keys as $key => $value)
$this->wordsArray[$value] = $tmpArray[$value];
}
}
/*
* Calculate size of words array
*/
function getCloudSize()
{
return array_sum($this->wordsArray);
}
/*
* Get the class range using a percentage
*
* @returns int $class
*/
function getClassFromPercent($percent)
{
$mapping = array(
95,
70,
50,
30,
15,
5,
0
);
foreach($mapping as $key => $value)
{
if($percent >= $value)
{
return $key;
}
}
}
/*
* Create the HTML code for each word and apply font size.
*
* @returns string $spans
*/
function render($returnType = "html")
{
$this->shuffleCloud();
if($returnType == "html")
{
$return = '';
}
else
{
$return = array();
}
if (count($this->wordsArray) > 0)
{
$this->max = max($this->wordsArray);
$return = ($returnType == "html" ? "" : ($returnType == "array" ? array() : ""));
foreach ($this->wordsArray as $word => $popularity)
{
// truncating the word
$wordTruncated = $word;
if(strlen($word) > $this->truncatingLimit)
{
$wordTruncated = substr($word, 0, $this->truncatingLimit - 3).'...';
}
// computing the percentage
$percent = ($popularity / $this->max) * 100;
// and the CSS style value
$sizeRange = $this->getClassFromPercent($percent);
if ($returnType == "array")
{
$return[$word]['word'] = $word;
$return[$word]['wordTruncated'] = $wordTruncated;
$return[$word]['size'] = $sizeRange;
$return[$word]['percent'] = $percent;
}
else if ($returnType == "html")
{
$return .= "\n<span title='".$word."' class='word size{$sizeRange}'> &nbsp; {$wordTruncated} &nbsp; </span>";
}
// print( $word ."=".$percent."<br>");
}
}
return $return;
}
}
Jump to Line
Something went wrong with that request. Please try again.