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