1*eb29c98cSSyntaxseed<?php 2*eb29c98cSSyntaxseed/** 3*eb29c98cSSyntaxseed * Plugin AVBarChart: Generates a very simple CSS/HTML bar chart 4*eb29c98cSSyntaxseed * 5*eb29c98cSSyntaxseed * USAGE: <barchart>MAXVAL|Label1:#,Label2:#,Label3:#</barchart> 6*eb29c98cSSyntaxseed * 7*eb29c98cSSyntaxseed * EXAMPLE: <barchart>100|A:55,B:5,C:23,D:38</barchart> 8*eb29c98cSSyntaxseed * 9*eb29c98cSSyntaxseed * With Colored Bars: <barchart>100|A:55:#FFCCCC,B:5,C:23#00FF00,D:38</barchart> 10*eb29c98cSSyntaxseed * 11*eb29c98cSSyntaxseed * @license MIT (https://opensource.org/licenses/MIT) 12*eb29c98cSSyntaxseed * @author Sherri W. (http://syntaxseed.com) 13*eb29c98cSSyntaxseed */ 14*eb29c98cSSyntaxseed 15*eb29c98cSSyntaxseedif (!defined('DOKU_INC')) { 16*eb29c98cSSyntaxseed define('DOKU_INC', realpath(dirname(__FILE__).'/../../').'/'); 17*eb29c98cSSyntaxseed} 18*eb29c98cSSyntaxseedif (!defined('DOKU_PLUGIN')) { 19*eb29c98cSSyntaxseed define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/'); 20*eb29c98cSSyntaxseed} 21*eb29c98cSSyntaxseedrequire_once(DOKU_PLUGIN.'syntax.php'); 22*eb29c98cSSyntaxseed 23*eb29c98cSSyntaxseed/** 24*eb29c98cSSyntaxseed * All DokuWiki plugins to extend the parser/rendering mechanism 25*eb29c98cSSyntaxseed * need to inherit from this class 26*eb29c98cSSyntaxseed */ 27*eb29c98cSSyntaxseedclass syntax_plugin_avbarchart extends DokuWiki_Syntax_Plugin 28*eb29c98cSSyntaxseed{ 29*eb29c98cSSyntaxseed // ********* CHART CONFIG SETTINGS ************* 30*eb29c98cSSyntaxseed public $barWidth = 25; // Pixel width of chart bars. 31*eb29c98cSSyntaxseed public $barColor = "#ccccff"; // Default color of graph bars. 32*eb29c98cSSyntaxseed public $fontSize = "8pt;"; // Font size of labels and values. 33*eb29c98cSSyntaxseed public $maxPxHeight = "200"; // Maximum height of the chart in pixels. 34*eb29c98cSSyntaxseed // ********************************************* 35*eb29c98cSSyntaxseed 36*eb29c98cSSyntaxseed 37*eb29c98cSSyntaxseed /** 38*eb29c98cSSyntaxseed * return some info about the plugin 39*eb29c98cSSyntaxseed */ 40*eb29c98cSSyntaxseed public function getInfo() 41*eb29c98cSSyntaxseed { 42*eb29c98cSSyntaxseed return array( 43*eb29c98cSSyntaxseed 'author' => 'Sherri Wheeler', 44*eb29c98cSSyntaxseed 'email' => 'Use my website: http://syntaxseed.com', 45*eb29c98cSSyntaxseed 'date' => '2020-02-07', 46*eb29c98cSSyntaxseed 'name' => 'AV Bar Chart', 47*eb29c98cSSyntaxseed 'desc' => 'Generates a very simple CSS/HTML bar chart. Supports colored bars.', 48*eb29c98cSSyntaxseed 'url' => 'https://www.dokuwiki.org/plugin:avbarchart', 49*eb29c98cSSyntaxseed ); 50*eb29c98cSSyntaxseed } 51*eb29c98cSSyntaxseed 52*eb29c98cSSyntaxseed /** 53*eb29c98cSSyntaxseed * What kind of syntax are we? 54*eb29c98cSSyntaxseed */ 55*eb29c98cSSyntaxseed public function getType() 56*eb29c98cSSyntaxseed { 57*eb29c98cSSyntaxseed return 'substition'; 58*eb29c98cSSyntaxseed } 59*eb29c98cSSyntaxseed 60*eb29c98cSSyntaxseed /** 61*eb29c98cSSyntaxseed * Where to sort in? 62*eb29c98cSSyntaxseed */ 63*eb29c98cSSyntaxseed public function getSort() 64*eb29c98cSSyntaxseed { 65*eb29c98cSSyntaxseed return 999; 66*eb29c98cSSyntaxseed } 67*eb29c98cSSyntaxseed 68*eb29c98cSSyntaxseed 69*eb29c98cSSyntaxseed /** 70*eb29c98cSSyntaxseed * Connect pattern to lexer 71*eb29c98cSSyntaxseed */ 72*eb29c98cSSyntaxseed public function connectTo($mode) 73*eb29c98cSSyntaxseed { 74*eb29c98cSSyntaxseed $this->Lexer->addEntryPattern('\<barchart\>', $mode, 'plugin_avbarchart'); 75*eb29c98cSSyntaxseed } 76*eb29c98cSSyntaxseed 77*eb29c98cSSyntaxseed public function postConnect() 78*eb29c98cSSyntaxseed { 79*eb29c98cSSyntaxseed $this->Lexer->addExitPattern('\</barchart\>', 'plugin_avbarchart'); 80*eb29c98cSSyntaxseed } 81*eb29c98cSSyntaxseed 82*eb29c98cSSyntaxseed 83*eb29c98cSSyntaxseed /** 84*eb29c98cSSyntaxseed * Handle the match 85*eb29c98cSSyntaxseed */ 86*eb29c98cSSyntaxseed public function handle($match, $state, $pos, Doku_Handler $handler) 87*eb29c98cSSyntaxseed { 88*eb29c98cSSyntaxseed switch ($state) { 89*eb29c98cSSyntaxseed case DOKU_LEXER_ENTER: 90*eb29c98cSSyntaxseed return array($state, ''); 91*eb29c98cSSyntaxseed case DOKU_LEXER_MATCHED: 92*eb29c98cSSyntaxseed break; 93*eb29c98cSSyntaxseed case DOKU_LEXER_UNMATCHED: 94*eb29c98cSSyntaxseed 95*eb29c98cSSyntaxseed $chart = ""; 96*eb29c98cSSyntaxseed list($maxRange, $data1) = split("\|", $match); 97*eb29c98cSSyntaxseed $maxRange = floatval($maxRange); 98*eb29c98cSSyntaxseed 99*eb29c98cSSyntaxseed if ($maxRange > 0 && !empty($data1)) { 100*eb29c98cSSyntaxseed $values = split(",", $data1); 101*eb29c98cSSyntaxseed 102*eb29c98cSSyntaxseed $chart = ""; 103*eb29c98cSSyntaxseed foreach ($values as $col) { 104*eb29c98cSSyntaxseed if (!empty($col)) { 105*eb29c98cSSyntaxseed list($label, $amount, $color) = split(":", $col); 106*eb29c98cSSyntaxseed $amount = floatval($amount); 107*eb29c98cSSyntaxseed if (empty($label)) { 108*eb29c98cSSyntaxseed $label=' '; 109*eb29c98cSSyntaxseed } 110*eb29c98cSSyntaxseed if (empty($color)) { 111*eb29c98cSSyntaxseed $color = $this->barColor; 112*eb29c98cSSyntaxseed } 113*eb29c98cSSyntaxseed if ($amount >= 0) { 114*eb29c98cSSyntaxseed $height = round(($amount/$maxRange*$this->maxPxHeight)); 115*eb29c98cSSyntaxseed $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>"; 116*eb29c98cSSyntaxseed } 117*eb29c98cSSyntaxseed } 118*eb29c98cSSyntaxseed } 119*eb29c98cSSyntaxseed } 120*eb29c98cSSyntaxseed 121*eb29c98cSSyntaxseed $match = $chart; 122*eb29c98cSSyntaxseed return array($state, $match); 123*eb29c98cSSyntaxseed 124*eb29c98cSSyntaxseed case DOKU_LEXER_EXIT: 125*eb29c98cSSyntaxseed return array($state, ''); 126*eb29c98cSSyntaxseed case DOKU_LEXER_SPECIAL: 127*eb29c98cSSyntaxseed break; 128*eb29c98cSSyntaxseed } 129*eb29c98cSSyntaxseed return array(); 130*eb29c98cSSyntaxseed } 131*eb29c98cSSyntaxseed 132*eb29c98cSSyntaxseed 133*eb29c98cSSyntaxseed /** 134*eb29c98cSSyntaxseed * Create output 135*eb29c98cSSyntaxseed */ 136*eb29c98cSSyntaxseed public function render($mode, &$renderer, $data) 137*eb29c98cSSyntaxseed { 138*eb29c98cSSyntaxseed if ($mode == 'xhtml') { 139*eb29c98cSSyntaxseed list($state, $match) = $data; 140*eb29c98cSSyntaxseed 141*eb29c98cSSyntaxseed switch ($state) { 142*eb29c98cSSyntaxseed case DOKU_LEXER_ENTER: 143*eb29c98cSSyntaxseed $renderer->doc .= "<table border='0' cellspacing='2' style='border:0;'><tr>"; 144*eb29c98cSSyntaxseed break; 145*eb29c98cSSyntaxseed 146*eb29c98cSSyntaxseed case DOKU_LEXER_MATCHED: 147*eb29c98cSSyntaxseed break; 148*eb29c98cSSyntaxseed 149*eb29c98cSSyntaxseed case DOKU_LEXER_UNMATCHED: 150*eb29c98cSSyntaxseed 151*eb29c98cSSyntaxseed $renderer->doc .= $match; break; 152*eb29c98cSSyntaxseed 153*eb29c98cSSyntaxseed case DOKU_LEXER_EXIT: 154*eb29c98cSSyntaxseed $renderer->doc .= "</tr></table>"; 155*eb29c98cSSyntaxseed break; 156*eb29c98cSSyntaxseed 157*eb29c98cSSyntaxseed case DOKU_LEXER_SPECIAL: 158*eb29c98cSSyntaxseed break; 159*eb29c98cSSyntaxseed } 160*eb29c98cSSyntaxseed return true; 161*eb29c98cSSyntaxseed } 162*eb29c98cSSyntaxseed return false; 163*eb29c98cSSyntaxseed } 164*eb29c98cSSyntaxseed} // End class 165