xref: /plugin/strata/syntax/radar.php (revision ef93adcaff85d115bcf42dd9f0b7b2e05654c121)
1*ef93adcaSFKaag<?php
2*ef93adcaSFKaag/**
3*ef93adcaSFKaag * Strata Basic, table plugin
4*ef93adcaSFKaag *
5*ef93adcaSFKaag * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6*ef93adcaSFKaag * @author     François KAAG (francois.kaag@cardynal.fr)
7*ef93adcaSFKaag * Derived from the original table command
8*ef93adcaSFKaag */
9*ef93adcaSFKaag
10*ef93adcaSFKaagif (!defined('DOKU_INC')) die('Meh.');
11*ef93adcaSFKaag
12*ef93adcaSFKaag/**
13*ef93adcaSFKaag * Radar syntax for basic query handling.
14*ef93adcaSFKaag */
15*ef93adcaSFKaagclass syntax_plugin_strata_radar extends syntax_plugin_strata_select {
16*ef93adcaSFKaag    function connectTo($mode) {
17*ef93adcaSFKaag        $this->Lexer->addSpecialPattern('<radar'.$this->helper->fieldsShortPattern().'* *>\s*?\n.+?\n\s*?</radar>',$mode, 'plugin_strata_radar');
18*ef93adcaSFKaag    }
19*ef93adcaSFKaag
20*ef93adcaSFKaag    function getUISettingUI($hasUIBlock) {
21*ef93adcaSFKaag        return array('choices' => array('none' => array('none', 'no', 'n'), 'generic' => array('generic', 'g'), 'radar' => array('radar', 't')), 'default' => 'radar');
22*ef93adcaSFKaag    }
23*ef93adcaSFKaag
24*ef93adcaSFKaag    function handleHeader($header, &$result, &$typemap) {
25*ef93adcaSFKaag        return preg_replace('/(^<radar)|( *>$)/','',$header);
26*ef93adcaSFKaag    }
27*ef93adcaSFKaag
28*ef93adcaSFKaag    function render($mode, Doku_Renderer $R, $data) {
29*ef93adcaSFKaag        if($data == array() || isset($data['error'])) {
30*ef93adcaSFKaag            if($mode == 'xhtml' || $mode == 'odt') {
31*ef93adcaSFKaag                $R->table_open();
32*ef93adcaSFKaag                $R->tablerow_open();
33*ef93adcaSFKaag                $R->tablecell_open();
34*ef93adcaSFKaag                $this->displayError($mode, $R, $data);
35*ef93adcaSFKaag                $R->tablecell_close();
36*ef93adcaSFKaag                $R->tablerow_close();
37*ef93adcaSFKaag                $R->table_close();
38*ef93adcaSFKaag            }
39*ef93adcaSFKaag            return;
40*ef93adcaSFKaag        }
41*ef93adcaSFKaag
42*ef93adcaSFKaag        $query = $this->prepareQuery($data['query']);
43*ef93adcaSFKaag
44*ef93adcaSFKaag        // execute the query
45*ef93adcaSFKaag        $result = $this->triples->queryRelations($query);
46*ef93adcaSFKaag
47*ef93adcaSFKaag        // prepare all columns
48*ef93adcaSFKaag        foreach($data['fields'] as $meta) {
49*ef93adcaSFKaag            $fields[] = array(
50*ef93adcaSFKaag                'variable'=>$meta['variable'],
51*ef93adcaSFKaag                'caption'=>$meta['caption'],
52*ef93adcaSFKaag                'type'=>$this->util->loadType($meta['type']),
53*ef93adcaSFKaag                'typeName'=>$meta['type'],
54*ef93adcaSFKaag                'hint'=>$meta['hint'],
55*ef93adcaSFKaag                'aggregate'=>$this->util->loadAggregate($meta['aggregate']),
56*ef93adcaSFKaag                'aggregateHint'=>$meta['aggregateHint']
57*ef93adcaSFKaag            );
58*ef93adcaSFKaag        }
59*ef93adcaSFKaag
60*ef93adcaSFKaag        if($mode == 'xhtml' || $mode == 'odt') {
61*ef93adcaSFKaag			$labelSet=array_column($fields,'caption');
62*ef93adcaSFKaag			$labelSet[]=$labelSet[0];
63*ef93adcaSFKaag			$labels=json_encode($labelSet);
64*ef93adcaSFKaag            if($mode == 'xhtml') { $R->doc .= '</thead>'.DOKU_LF; }
65*ef93adcaSFKaag            if($result != false) {
66*ef93adcaSFKaag                // render each row
67*ef93adcaSFKaag                $itemcount = 0;
68*ef93adcaSFKaag                foreach($result as $row) {
69*ef93adcaSFKaag					$valueSet=[];
70*ef93adcaSFKaag                    foreach($fields as $f) {
71*ef93adcaSFKaag						$valueSet[]= intval($f['aggregate']->aggregate($row[$f['variable']],$f['aggregateHint'])[0]);
72*ef93adcaSFKaag                    }
73*ef93adcaSFKaag					$valueSet[]=$valueSet[0];
74*ef93adcaSFKaag					$values = json_encode($valueSet);
75*ef93adcaSFKaag           if($mode == 'xhtml') { $R->doc .= '</tbody>'.DOKU_LF; }
76*ef93adcaSFKaag                }
77*ef93adcaSFKaag                $result->closeCursor();
78*ef93adcaSFKaag            } else {
79*ef93adcaSFKaag				$R->table_open();
80*ef93adcaSFKaag                $R->tablerow_open();
81*ef93adcaSFKaag                $R->tablecell_open(count($fields));
82*ef93adcaSFKaag                $R->emphasis_open();
83*ef93adcaSFKaag                $R->cdata(sprintf($this->helper->getLang('content_error_explanation'),'Strata table'));
84*ef93adcaSFKaag                $R->emphasis_close();
85*ef93adcaSFKaag                $R->tablecell_close();
86*ef93adcaSFKaag                $R->tablerow_close();
87*ef93adcaSFKaag				$R->table_close();
88*ef93adcaSFKaag            }
89*ef93adcaSFKaag			$uid=uniqid();
90*ef93adcaSFKaag
91*ef93adcaSFKaag			$R->doc .= "
92*ef93adcaSFKaag<script>function draw() {
93*ef93adcaSFKaagdata = [{type: 'scatterpolar',r: ".$values.",theta: ".$labels.",fill: 'toself'}]
94*ef93adcaSFKaaglayout = {polar: {radialaxis: {visible: true,range: [0, 100]}},showlegend: false}
95*ef93adcaSFKaaggraph = document.getElementById('".$uid."');
96*ef93adcaSFKaagPlotly.newPlot(graph, data, layout)
97*ef93adcaSFKaag}
98*ef93adcaSFKaagwindow.onload=draw;
99*ef93adcaSFKaag</script>
100*ef93adcaSFKaag<style>svg {height : auto}</style>
101*ef93adcaSFKaag<div id='".$uid."'></div>";
102*ef93adcaSFKaag            return true;
103*ef93adcaSFKaag        } elseif($mode == 'metadata') {
104*ef93adcaSFKaag            if($result == false) return;
105*ef93adcaSFKaag
106*ef93adcaSFKaag            // render all rows in metadata mode to enable things like backlinks
107*ef93adcaSFKaag            foreach($result as $row) {
108*ef93adcaSFKaag                foreach($fields as $f) {
109*ef93adcaSFKaag                    $this->util->renderField($mode, $R, $this->triples, $f['aggregate']->aggregate($row[$f['variable']],$f['aggregateHint']), $f['typeName'], $f['hint'], $f['type'], $f['variable']);
110*ef93adcaSFKaag                }
111*ef93adcaSFKaag            }
112*ef93adcaSFKaag            $result->closeCursor();
113*ef93adcaSFKaag
114*ef93adcaSFKaag            return true;
115*ef93adcaSFKaag        }
116*ef93adcaSFKaag
117*ef93adcaSFKaag        return false;
118*ef93adcaSFKaag    }
119*ef93adcaSFKaag}
120