xref: /plugin/struct/meta/AggregationCloud.php (revision ba7f5789bbbcab95d7a655f6ec50a97b731b40d5)
1fa04b28cSMichael Grosse<?php
25282d027SMichael Grosse
3fa04b28cSMichael Grossenamespace dokuwiki\plugin\struct\meta;
45282d027SMichael Grosse
5d90aa848SAndreas Gohrclass AggregationCloud extends Aggregation
6d6d97f60SAnna Dabrowska{
7d90aa848SAndreas Gohr    /** @var int */
8d90aa848SAndreas Gohr    protected $max;
95282d027SMichael Grosse
10d90aa848SAndreas Gohr    /** @var int */
11d90aa848SAndreas Gohr    protected $min;
125282d027SMichael Grosse
13d90aa848SAndreas Gohr    /** @inheritdoc */
14d90aa848SAndreas Gohr    public function render($showNotFound = false)
15d6d97f60SAnna Dabrowska    {
16*ba7f5789SAnna Dabrowska
17*ba7f5789SAnna Dabrowska        if ($this->mode !== 'xhtml') return;
18*ba7f5789SAnna Dabrowska
19*ba7f5789SAnna Dabrowska        $rows = $this->searchConfig->getRows();
20*ba7f5789SAnna Dabrowska        $this->max = $rows[0]['count'];
21*ba7f5789SAnna Dabrowska        $this->min = end($rows)['count'];
22*ba7f5789SAnna Dabrowska
23*ba7f5789SAnna Dabrowska        $this->sortResults($rows);
24c7dd6b6aSMichael Grosse        $this->startList();
25*ba7f5789SAnna Dabrowska        foreach ($rows as $result) {
2633bd00e9SMichael Grosse            $this->renderTag($result);
27fa04b28cSMichael Grosse        }
28c7dd6b6aSMichael Grosse        $this->finishList();
29fa04b28cSMichael Grosse    }
30aafac1c1SMichael Grosse
3133bd00e9SMichael Grosse    /**
3233bd00e9SMichael Grosse     * Render a tag of the cloud
3333bd00e9SMichael Grosse     *
3433bd00e9SMichael Grosse     * @param ['tag' => Value, 'count' => int] $result
3533bd00e9SMichael Grosse     */
36d6d97f60SAnna Dabrowska    protected function renderTag($result)
37d6d97f60SAnna Dabrowska    {
38fa04b28cSMichael Grosse        /**
39fa04b28cSMichael Grosse         * @var Value $value
40fa04b28cSMichael Grosse         */
41fa04b28cSMichael Grosse        $value = $result['tag'];
42fa04b28cSMichael Grosse        $count = $result['count'];
43fa04b28cSMichael Grosse        if ($value->isEmpty()) {
44fa04b28cSMichael Grosse            return;
45fa04b28cSMichael Grosse        }
46fa04b28cSMichael Grosse
47c7dd6b6aSMichael Grosse        $type = strtolower($value->getColumn()->getType()->getClass());
48c7dd6b6aSMichael Grosse        $weight = $this->getWeight($count, $this->min, $this->max);
498e54e6f4SMichael Grosse
5085edf4f2SMichael Grosse        if (!empty($this->data['target'])) {
5185edf4f2SMichael Grosse            $target = $this->data['target'];
5285edf4f2SMichael Grosse        } else {
5385edf4f2SMichael Grosse            global $INFO;
5485edf4f2SMichael Grosse            $target = $INFO['id'];
5585edf4f2SMichael Grosse        }
568e54e6f4SMichael Grosse
57ce8676aeSMichael Grosse        $tagValue = $value->getDisplayValue();
58ce8676aeSMichael Grosse        if (is_array($tagValue)) {
59ce8676aeSMichael Grosse            $tagValue = $tagValue[0];
60fa04b28cSMichael Grosse        }
6157775e30SSzymon Olewniczak        $key = $value->getColumn()->getFullQualifiedLabel() . '=';
6243d76406SSzymon Olewniczak        $filter = SearchConfigParameters::$PARAM_FILTER . '[' . urlencode($key) . ']=' . urlencode($tagValue);
63c7dd6b6aSMichael Grosse
64da11327aSMichael Grosse        $this->renderer->listitem_open(1);
65da11327aSMichael Grosse        $this->renderer->listcontent_open();
66da11327aSMichael Grosse
67262c0fc6SMichael Grosse        if ($this->mode == 'xhtml') {
6817a3a578SAndreas Gohr            $this->renderer->doc .=
6917a3a578SAndreas Gohr                "<div style='font-size:$weight%' data-count='$count' class='cloudtag struct_$type'>";
708e54e6f4SMichael Grosse        }
718e54e6f4SMichael Grosse
72bfb78ce3SAnna Dabrowska        $showCount = $this->searchConfig->getConf()['summarize'] ? $count : 0;
73bfb78ce3SAnna Dabrowska        $value->renderAsTagCloudLink($this->renderer, $this->mode, $target, $filter, $weight, $showCount);
74262c0fc6SMichael Grosse
75262c0fc6SMichael Grosse        if ($this->mode == 'xhtml') {
76c7dd6b6aSMichael Grosse            $this->renderer->doc .= '</div>';
77fa04b28cSMichael Grosse        }
78da11327aSMichael Grosse
79da11327aSMichael Grosse        $this->renderer->listcontent_close();
80da11327aSMichael Grosse        $this->renderer->listitem_close();
81262c0fc6SMichael Grosse    }
82aafac1c1SMichael Grosse
83aafac1c1SMichael Grosse    /**
84aafac1c1SMichael Grosse     * This interpolates the weight between 70 and 150 based on $min, $max and $current
85aafac1c1SMichael Grosse     *
86aafac1c1SMichael Grosse     * @param int $current
87aafac1c1SMichael Grosse     * @param int $min
88aafac1c1SMichael Grosse     * @param int $max
898e54e6f4SMichael Grosse     * @return int
90aafac1c1SMichael Grosse     */
91d6d97f60SAnna Dabrowska    protected function getWeight($current, $min, $max)
92d6d97f60SAnna Dabrowska    {
93aafac1c1SMichael Grosse        if ($min == $max) {
94aafac1c1SMichael Grosse            return 100;
95aafac1c1SMichael Grosse        }
968e54e6f4SMichael Grosse        return round(($current - $min) / ($max - $min) * 80 + 70);
97aafac1c1SMichael Grosse    }
988b4531cfSMichael Grosse
998b4531cfSMichael Grosse    /**
1008b4531cfSMichael Grosse     * Sort the list of results
1018b4531cfSMichael Grosse     */
102*ba7f5789SAnna Dabrowska    protected function sortResults(&$rows)
103d6d97f60SAnna Dabrowska    {
104*ba7f5789SAnna Dabrowska        usort($rows, function ($a, $b) {
105d560ea13SMichael Grosse            $asort = $a['tag']->getColumn()->getType()->getSortString($a['tag']);
106d560ea13SMichael Grosse            $bsort = $b['tag']->getColumn()->getType()->getSortString($b['tag']);
107d560ea13SMichael Grosse            if ($asort < $bsort) {
1088b4531cfSMichael Grosse                return -1;
1098b4531cfSMichael Grosse            }
110d560ea13SMichael Grosse            if ($asort > $bsort) {
1118b4531cfSMichael Grosse                return 1;
1128b4531cfSMichael Grosse            }
1138b4531cfSMichael Grosse            return 0;
1148b4531cfSMichael Grosse        });
1158b4531cfSMichael Grosse    }
1168b4531cfSMichael Grosse
117d6d97f60SAnna Dabrowska    protected function startList()
118d6d97f60SAnna Dabrowska    {
119c7dd6b6aSMichael Grosse        $this->renderer->listu_open();
120c7dd6b6aSMichael Grosse    }
121c7dd6b6aSMichael Grosse
122d6d97f60SAnna Dabrowska    protected function finishList()
123d6d97f60SAnna Dabrowska    {
124c7dd6b6aSMichael Grosse        $this->renderer->listu_close();
125c7dd6b6aSMichael Grosse    }
126fa04b28cSMichael Grosse}
127