1<?php
2
3/**
4 * DokuWiki Plugin randomtable pick (Syntax Component)
5 *
6 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
7 * @author  Oscar Merida <oscar@oscarm.org>
8 */
9class syntax_plugin_randomtables_pick extends \dokuwiki\Extension\SyntaxPlugin
10{
11    /** @inheritDoc */
12    public function getType(): string
13    {
14        return 'protected';
15    }
16
17    /** @inheritDoc */
18    public function getPType(): string
19    {
20        return 'block';
21    }
22
23    /** @inheritDoc */
24    public function getSort(): int
25    {
26        return 201;
27    }
28
29    /** @inheritDoc */
30    public function connectTo($mode): void
31    {
32        $this->Lexer->addEntryPattern('\<ROLL_PICK\s+', $mode, 'plugin_randomtables_pick');
33    }
34
35    /** @inheritDoc */
36    public function postConnect(): void
37    {
38        $this->Lexer->addExitPattern('>', 'plugin_randomtables_pick');
39    }
40
41    /** @inheritDoc */
42    public function handle($match, $state, $pos, Doku_Handler $handler): array
43    {
44        switch ($state) {
45            case DOKU_LEXER_UNMATCHED:
46                return [$state, $match];
47            case DOKU_LEXER_EXIT:
48                return [$state, ''];
49            case DOKU_LEXER_ENTER:
50            default:
51                return [$state, $match];
52        }
53    }
54
55    /** @inheritDoc */
56    public function render($mode, Doku_Renderer $renderer, $data): bool
57    {
58        if ($mode !== 'xhtml') {
59            return false;
60        }
61        [$state, $match] = $data;
62
63        switch ($state) {
64            case DOKU_LEXER_ENTER:
65                $renderer->doc .= '<div class="randomtable-well">' . PHP_EOL;
66                break;
67            case DOKU_LEXER_UNMATCHED:
68                $id = md5(serialize($data));
69
70                $renderer->doc .= '<div><select class="randomtable-pick" id="' . $id. '">';
71                $renderer->doc .= '<option value="">Select Table</option>';
72
73                $tables = preg_split('/[\r\n]+/', $match);
74                $tables = array_filter($tables);
75                foreach ($tables as $table) {
76                    if (str_contains($table, ':')) {
77                        [$ident, $label] = explode(':', $table,2);
78                    } else {
79                        $ident = $label = $table;
80                    }
81
82                    $ident =  $renderer->_xmlEntities(trim($ident));
83                    $label =  $renderer->_xmlEntities(trim($label));
84                    $renderer->doc .= "<option value=\"{$ident}\">{$label}</option>";
85                }
86                $renderer->doc .= '</select>';
87
88                $renderer->doc .= '<button class="randomtable" data-pick="' . $id . '" data-target="results-'
89                    . $id . '">Roll</button></div><div id="results-' . $id . '" class="results"></div>';
90                break;
91            case DOKU_LEXER_EXIT:
92                $renderer->doc .= '</div>' . PHP_EOL;
93                break;
94        }
95        return true;
96    }
97}
98