diff options
Diffstat (limited to 'modules/Visualization/Cloud.php')
-rw-r--r-- | modules/Visualization/Cloud.php | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/modules/Visualization/Cloud.php b/modules/Visualization/Cloud.php new file mode 100644 index 0000000000..efbed67cb0 --- /dev/null +++ b/modules/Visualization/Cloud.php @@ -0,0 +1,150 @@ +<?php +// inspired from Derek Harvey (www.derekharvey.co.uk) +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}'> {$wordTruncated} </span>"; + } +// print( $word ."=".$percent."<br>"); + } + } + return $return; + } +} + |