1eb29c98cSSyntaxseed<?php 230703f5fSSyntaxseed 3eb29c98cSSyntaxseed/** 4eb29c98cSSyntaxseed * Plugin AVBarChart: Generates a very simple CSS/HTML bar chart 5eb29c98cSSyntaxseed * 6eb29c98cSSyntaxseed * USAGE: <barchart>MAXVAL|Label1:#,Label2:#,Label3:#</barchart> 7eb29c98cSSyntaxseed * 8eb29c98cSSyntaxseed * EXAMPLE: <barchart>100|A:55,B:5,C:23,D:38</barchart> 9eb29c98cSSyntaxseed * 10eb29c98cSSyntaxseed * With Colored Bars: <barchart>100|A:55:#FFCCCC,B:5,C:23#00FF00,D:38</barchart> 11eb29c98cSSyntaxseed * 1230703f5fSSyntaxseed * @license GPL-2.0 (https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) 13eb29c98cSSyntaxseed * @author Sherri W. (http://syntaxseed.com) 14eb29c98cSSyntaxseed */ 15eb29c98cSSyntaxseed 16eb29c98cSSyntaxseedif (!defined('DOKU_INC')) { 17eb29c98cSSyntaxseed define('DOKU_INC', realpath(dirname(__FILE__) . '/../../') . '/'); 18eb29c98cSSyntaxseed} 19eb29c98cSSyntaxseedif (!defined('DOKU_PLUGIN')) { 20eb29c98cSSyntaxseed define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/'); 21eb29c98cSSyntaxseed} 223e1b754eSSyntaxseed 23eb29c98cSSyntaxseed 24eb29c98cSSyntaxseed/** 25eb29c98cSSyntaxseed * All DokuWiki plugins to extend the parser/rendering mechanism 26eb29c98cSSyntaxseed * need to inherit from this class 27eb29c98cSSyntaxseed */ 28eb29c98cSSyntaxseedclass syntax_plugin_avbarchart extends DokuWiki_Syntax_Plugin 29eb29c98cSSyntaxseed{ 30eb29c98cSSyntaxseed // ********* CHART CONFIG SETTINGS ************* 31eb29c98cSSyntaxseed public $barWidth = 25; // Pixel width of chart bars. 32eb29c98cSSyntaxseed public $barColor = "#ccccff"; // Default color of graph bars. 33eb29c98cSSyntaxseed public $fontSize = "8pt;"; // Font size of labels and values. 34eb29c98cSSyntaxseed public $maxPxHeight = "200"; // Maximum height of the chart in pixels. 35eb29c98cSSyntaxseed // ********************************************* 36eb29c98cSSyntaxseed 37eb29c98cSSyntaxseed /** 38eb29c98cSSyntaxseed * What kind of syntax are we? 39eb29c98cSSyntaxseed */ 40eb29c98cSSyntaxseed public function getType() 41eb29c98cSSyntaxseed { 42eb29c98cSSyntaxseed return 'substition'; 43eb29c98cSSyntaxseed } 44eb29c98cSSyntaxseed 45eb29c98cSSyntaxseed /** 46eb29c98cSSyntaxseed * Where to sort in? 47eb29c98cSSyntaxseed */ 48eb29c98cSSyntaxseed public function getSort() 49eb29c98cSSyntaxseed { 50eb29c98cSSyntaxseed return 999; 51eb29c98cSSyntaxseed } 52eb29c98cSSyntaxseed 53eb29c98cSSyntaxseed 54eb29c98cSSyntaxseed /** 55eb29c98cSSyntaxseed * Connect pattern to lexer 56eb29c98cSSyntaxseed */ 57eb29c98cSSyntaxseed public function connectTo($mode) 58eb29c98cSSyntaxseed { 59eb29c98cSSyntaxseed $this->Lexer->addEntryPattern('\<barchart\>', $mode, 'plugin_avbarchart'); 60eb29c98cSSyntaxseed } 61eb29c98cSSyntaxseed 62eb29c98cSSyntaxseed public function postConnect() 63eb29c98cSSyntaxseed { 64eb29c98cSSyntaxseed $this->Lexer->addExitPattern('\</barchart\>', 'plugin_avbarchart'); 65eb29c98cSSyntaxseed } 66eb29c98cSSyntaxseed 67eb29c98cSSyntaxseed 68eb29c98cSSyntaxseed /** 69eb29c98cSSyntaxseed * Handle the match 70eb29c98cSSyntaxseed */ 71eb29c98cSSyntaxseed public function handle($match, $state, $pos, Doku_Handler $handler) 72eb29c98cSSyntaxseed { 73eb29c98cSSyntaxseed switch ($state) { 74eb29c98cSSyntaxseed case DOKU_LEXER_ENTER: 75eb29c98cSSyntaxseed return array($state, ''); 76eb29c98cSSyntaxseed case DOKU_LEXER_MATCHED: 77eb29c98cSSyntaxseed break; 78eb29c98cSSyntaxseed case DOKU_LEXER_UNMATCHED: 79eb29c98cSSyntaxseed 80eb29c98cSSyntaxseed $chart = ""; 81870fee77SSyntaxseed list($maxRange, $data1) = preg_split("/\|/", $match); 82eb29c98cSSyntaxseed $maxRange = floatval($maxRange); 83eb29c98cSSyntaxseed 84eb29c98cSSyntaxseed if ($maxRange > 0 && !empty($data1)) { 85e7a24605SSyntaxseed $values = preg_split("/,/", $data1); 86eb29c98cSSyntaxseed 87eb29c98cSSyntaxseed $chart = ""; 88eb29c98cSSyntaxseed foreach ($values as $col) { 89eb29c98cSSyntaxseed if (!empty($col)) { 904bfcdbd6SSyntaxseed $inColumn = preg_split("/:/", $col); 914bfcdbd6SSyntaxseed $label = $inColumn[0] ?? ''; 924bfcdbd6SSyntaxseed $amount = $inColumn[1] ?? 0; 934bfcdbd6SSyntaxseed $color = $inColumn[2] ?? null; 944bfcdbd6SSyntaxseed 95eb29c98cSSyntaxseed $amount = floatval($amount); 96*4d2a0317SSyntaxseed 97eb29c98cSSyntaxseed if (empty($label)) { 98eb29c98cSSyntaxseed $label = ' '; 99*4d2a0317SSyntaxseed } else { 100*4d2a0317SSyntaxseed $label = hsc($label); 101eb29c98cSSyntaxseed } 102*4d2a0317SSyntaxseed 103eb29c98cSSyntaxseed if (empty($color)) { 104eb29c98cSSyntaxseed $color = $this->barColor; 105*4d2a0317SSyntaxseed } else { 106*4d2a0317SSyntaxseed $color = hsc($color); 107eb29c98cSSyntaxseed } 108*4d2a0317SSyntaxseed 109eb29c98cSSyntaxseed if ($amount >= 0) { 110eb29c98cSSyntaxseed $height = round(($amount / $maxRange * $this->maxPxHeight)); 111eb29c98cSSyntaxseed $chart .= "<td valign='bottom' style='border:0;vertical-align:bottom;text-align:center;' align='center'><span style='font-size:" . $this->fontSize . ";'>" . $amount . "</span><br clear='all' /><table style='display:inline;border:0;' cellpadding='1' cellspacing='0'><tr><td height='" . $height . "' width='" . $this->barWidth . "' bgcolor='" . $color . "' valign='bottom'></td></tr></table><br clear='all' /><span style='font-size:" . $this->fontSize . ";'><b>" . $label . "</b></span></td>"; 112eb29c98cSSyntaxseed } 113eb29c98cSSyntaxseed } 114eb29c98cSSyntaxseed } 115eb29c98cSSyntaxseed } 116eb29c98cSSyntaxseed 117eb29c98cSSyntaxseed $match = $chart; 118eb29c98cSSyntaxseed return array($state, $match); 119eb29c98cSSyntaxseed 120eb29c98cSSyntaxseed case DOKU_LEXER_EXIT: 121eb29c98cSSyntaxseed return array($state, ''); 122eb29c98cSSyntaxseed case DOKU_LEXER_SPECIAL: 123eb29c98cSSyntaxseed break; 124eb29c98cSSyntaxseed } 125eb29c98cSSyntaxseed return array(); 126eb29c98cSSyntaxseed } 127eb29c98cSSyntaxseed 128eb29c98cSSyntaxseed 129eb29c98cSSyntaxseed /** 130eb29c98cSSyntaxseed * Create output 131eb29c98cSSyntaxseed */ 1321fba6d15SSyntaxseed public function render($mode, Doku_Renderer $renderer, $data) 133eb29c98cSSyntaxseed { 134eb29c98cSSyntaxseed if ($mode == 'xhtml') { 135eb29c98cSSyntaxseed list($state, $match) = $data; 136eb29c98cSSyntaxseed 137eb29c98cSSyntaxseed switch ($state) { 138eb29c98cSSyntaxseed case DOKU_LEXER_ENTER: 139eb29c98cSSyntaxseed $renderer->doc .= "<table border='0' cellspacing='2' style='border:0;'><tr>"; 140eb29c98cSSyntaxseed break; 141eb29c98cSSyntaxseed 142eb29c98cSSyntaxseed case DOKU_LEXER_MATCHED: 143eb29c98cSSyntaxseed break; 144eb29c98cSSyntaxseed 145eb29c98cSSyntaxseed case DOKU_LEXER_UNMATCHED: 146eb29c98cSSyntaxseed 147*4d2a0317SSyntaxseed $renderer->doc .= $match; 148*4d2a0317SSyntaxseed break; 149eb29c98cSSyntaxseed 150eb29c98cSSyntaxseed case DOKU_LEXER_EXIT: 151eb29c98cSSyntaxseed $renderer->doc .= "</tr></table>"; 152eb29c98cSSyntaxseed break; 153eb29c98cSSyntaxseed 154eb29c98cSSyntaxseed case DOKU_LEXER_SPECIAL: 155eb29c98cSSyntaxseed break; 156eb29c98cSSyntaxseed } 157eb29c98cSSyntaxseed return true; 158eb29c98cSSyntaxseed } 159eb29c98cSSyntaxseed return false; 160eb29c98cSSyntaxseed } 161eb29c98cSSyntaxseed} // End class 162