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