1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
<?php
/**
* Piwik - Open source web analytics
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*
* @category Piwik
* @package Piwik
*/
/**
* 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
* @subpackage Piwik_Visualization
*/
class Piwik_Visualization_Cloud implements Piwik_View_Interface
{
/** Used by integration tests to make sure output is consistent. */
public static $debugDisableShuffle = false;
protected $wordsArray = array();
public $truncatingLimit = 50;
/**
* Assign word to array
* @param string $word
* @param int $value
* @return string
*/
function addWord($word, $value = 1)
{
if (isset($this->wordsArray[$word]))
{
$this->wordsArray[$word] += $value;
}
else
{
$this->wordsArray[$word] = $value;
}
}
public function render()
{
$this->shuffleCloud();
$return = array();
if(empty($this->wordsArray)) {
return array();
}
$maxValue = max($this->wordsArray);
foreach ($this->wordsArray as $word => $popularity)
{
$wordTruncated = $word;
if(Piwik_Common::mb_strlen($word) > $this->truncatingLimit)
{
$wordTruncated = Piwik_Common::mb_substr($word, 0, $this->truncatingLimit - 3).'...';
}
// case hideFutureHoursWhenToday=1 shows hours with no visits
if($maxValue == 0)
{
$percent = 0;
}
else
{
$percent = ($popularity / $maxValue) * 100;
}
// CSS style value
$sizeRange = $this->getClassFromPercent($percent);
$return[$word] = array(
'word' => $word,
'wordTruncated' => $wordTruncated,
'value' => $popularity,
'size' => $sizeRange,
'percent' => $percent,
);
}
return $return;
}
/**
* Shuffle associated names in array
*/
protected function shuffleCloud()
{
if (self::$debugDisableShuffle)
{
return;
}
$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];
}
}
/**
* Get the class range using a percentage
*
* @return int $class
*/
protected function getClassFromPercent($percent)
{
$mapping = array(95, 70, 50, 30, 15, 5, 0);
foreach($mapping as $key => $value)
{
if($percent >= $value)
{
return $key;
}
}
}
}
|