xref: /plugin/avbarchart/syntax.php (revision eb29c98cab34c6af6ea6c02d14307de57de8f52a)
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='&nbsp;';
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