xref: /plugin/vegalite/syntax.php (revision e66c86a29c7c323e0ed804145202ccc8d1c27d79)
1*e66c86a2SRobert Weinmeister<?php
2*e66c86a2SRobert Weinmeister
3*e66c86a2SRobert Weinmeister/**
4*e66c86a2SRobert Weinmeister * DokuWiki Plugin VegaLite (Syntax Component)
5*e66c86a2SRobert Weinmeister *
6*e66c86a2SRobert Weinmeister * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
7*e66c86a2SRobert Weinmeister * @author  Robert Weinmeister <develop@weinmeister.org>
8*e66c86a2SRobert Weinmeister */
9*e66c86a2SRobert Weinmeister
10*e66c86a2SRobert Weinmeisterdeclare(strict_types=1);
11*e66c86a2SRobert Weinmeister
12*e66c86a2SRobert Weinmeisterif (!defined('DOKU_INC'))
13*e66c86a2SRobert Weinmeister{
14*e66c86a2SRobert Weinmeister    die();
15*e66c86a2SRobert Weinmeister}
16*e66c86a2SRobert Weinmeister
17*e66c86a2SRobert Weinmeisteruse dokuwiki\Parsing\Parser;
18*e66c86a2SRobert Weinmeister
19*e66c86a2SRobert Weinmeisterclass syntax_plugin_vegalite extends \dokuwiki\Extension\SyntaxPlugin
20*e66c86a2SRobert Weinmeister{
21*e66c86a2SRobert Weinmeister    /** @inheritDoc */
22*e66c86a2SRobert Weinmeister    function getType(): string {
23*e66c86a2SRobert Weinmeister        return 'container';
24*e66c86a2SRobert Weinmeister    }
25*e66c86a2SRobert Weinmeister
26*e66c86a2SRobert Weinmeister    /** @inheritDoc */
27*e66c86a2SRobert Weinmeister    function getSort(): int {
28*e66c86a2SRobert Weinmeister        return 150;
29*e66c86a2SRobert Weinmeister    }
30*e66c86a2SRobert Weinmeister
31*e66c86a2SRobert Weinmeister    /**
32*e66c86a2SRobert Weinmeister    * Entry pattern for Vega-Lite
33*e66c86a2SRobert Weinmeister    *
34*e66c86a2SRobert Weinmeister    * @param string $mode Parser mode
35*e66c86a2SRobert Weinmeister    * @return void
36*e66c86a2SRobert Weinmeister    */
37*e66c86a2SRobert Weinmeister    public function connectTo($mode): void {
38*e66c86a2SRobert Weinmeister        $this->Lexer->addEntryPattern(
39*e66c86a2SRobert Weinmeister            '<vegalite.*?>(?=.*?</vegalite>)',
40*e66c86a2SRobert Weinmeister            $mode,
41*e66c86a2SRobert Weinmeister            'plugin_vegalite');
42*e66c86a2SRobert Weinmeister    }
43*e66c86a2SRobert Weinmeister
44*e66c86a2SRobert Weinmeister    /**
45*e66c86a2SRobert Weinmeister     * Exit pattern for Vega-Lite
46*e66c86a2SRobert Weinmeister     *
47*e66c86a2SRobert Weinmeister     * @return void
48*e66c86a2SRobert Weinmeister     */
49*e66c86a2SRobert Weinmeister    function postConnect(): void {
50*e66c86a2SRobert Weinmeister        $this->Lexer->addExitPattern(
51*e66c86a2SRobert Weinmeister            '</vegalite>',
52*e66c86a2SRobert Weinmeister            'plugin_vegalite'
53*e66c86a2SRobert Weinmeister        );
54*e66c86a2SRobert Weinmeister    }
55*e66c86a2SRobert Weinmeister
56*e66c86a2SRobert Weinmeister    /**
57*e66c86a2SRobert Weinmeister     * Handles the matched text based on the lexer state
58*e66c86a2SRobert Weinmeister     *
59*e66c86a2SRobert Weinmeister     * @param string $match Matched text from the lexer
60*e66c86a2SRobert Weinmeister     * @param int $state Current lexer state (DOKU_LEXER_ENTER, DOKU_LEXER_UNMATCHED, DOKU_LEXER_EXIT)
61*e66c86a2SRobert Weinmeister     * @param Doku_Handler $handler DokuWiki handler instance
62*e66c86a2SRobert Weinmeister     * @return array Array with the state and processed match
63*e66c86a2SRobert Weinmeister     */
64*e66c86a2SRobert Weinmeister    function handle($match, $state, $pos, Doku_Handler $handler): array {
65*e66c86a2SRobert Weinmeister        return [$state, $match];
66*e66c86a2SRobert Weinmeister    }
67*e66c86a2SRobert Weinmeister
68*e66c86a2SRobert Weinmeister    /**
69*e66c86a2SRobert Weinmeister    * Render xhtml output or metadata
70*e66c86a2SRobert Weinmeister    */
71*e66c86a2SRobert Weinmeister    function render($mode, Doku_Renderer $renderer, $indata)
72*e66c86a2SRobert Weinmeister    {
73*e66c86a2SRobert Weinmeister        if($mode == 'xhtml'){
74*e66c86a2SRobert Weinmeister            list($state, $match) = $indata;
75*e66c86a2SRobert Weinmeister            switch ($state) {
76*e66c86a2SRobert Weinmeister                case DOKU_LEXER_ENTER:
77*e66c86a2SRobert Weinmeister                    $values = explode(" ", $match);
78*e66c86a2SRobert Weinmeister                    $divwidth = count($values) < 2 ? 'auto' : $values[1];
79*e66c86a2SRobert Weinmeister                    $divheight = count($values) < 3 ? 'auto' : substr($values[2], 0, -1);
80*e66c86a2SRobert Weinmeister
81*e66c86a2SRobert Weinmeister                    $this->vegaliteContent .= '<div id="vegalite" class="vegalite" style="position: relative; width:'.$divwidth.'; height:'.$divheight.'"></div>' . "\r\n";
82*e66c86a2SRobert Weinmeister                break;
83*e66c86a2SRobert Weinmeister                case DOKU_LEXER_UNMATCHED:
84*e66c86a2SRobert Weinmeister                    $this->vegaliteContent .=
85*e66c86a2SRobert Weinmeister'<script type="text/javascript">
86*e66c86a2SRobert Weinmeister    var yourVlSpec = ' . $match . ";
87*e66c86a2SRobert Weinmeister    vegaEmbed('#vegalite', yourVlSpec);
88*e66c86a2SRobert Weinmeister</script>";
89*e66c86a2SRobert Weinmeister                break;
90*e66c86a2SRobert Weinmeister                case DOKU_LEXER_EXIT:
91*e66c86a2SRobert Weinmeister                    $this->vegaliteContent .= "";
92*e66c86a2SRobert Weinmeister
93*e66c86a2SRobert Weinmeister                    $renderer->doc .= $this->vegaliteContent;
94*e66c86a2SRobert Weinmeister                    $this->vegaliteContent = '';
95*e66c86a2SRobert Weinmeister                break;
96*e66c86a2SRobert Weinmeister            }
97*e66c86a2SRobert Weinmeister            return true;
98*e66c86a2SRobert Weinmeister        }
99*e66c86a2SRobert Weinmeister        return false;
100*e66c86a2SRobert Weinmeister    }
101*e66c86a2SRobert Weinmeister}