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