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