1<?php
2
3use dokuwiki\Extension\SyntaxPlugin;
4
5/**
6 * BBCode plugin: allows BBCode markup familiar from forum software
7 *
8 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
9 * @author     Luis Machuca Bezzaza <luis.machuca@gulix.cl>
10 */
11class syntax_plugin_bbcode_versalitas extends SyntaxPlugin
12{
13    /** @inheritdoc */
14    public function getType()
15    {
16        return 'formatting';
17    }
18    /** @inheritdoc */
19    public function getAllowedTypes()
20    {
21        return ['formatting', 'substition', 'disabled'];
22    }
23    /** @inheritdoc */
24    public function getSort()
25    {
26        return 105;
27    }
28    /** @inheritdoc */
29    public function connectTo($mode)
30    {
31        $this->Lexer->addEntryPattern('\[c\](?=.*?\x5B/c\x5D)', $mode, 'plugin_bbcode_versalitas');
32    }
33    /** @inheritdoc */
34    public function postConnect()
35    {
36        $this->Lexer->addExitPattern('\[/c\]', 'plugin_bbcode_versalitas');
37    }
38
39    /** @inheritdoc */
40    public function handle($match, $state, $pos, Doku_Handler $handler)
41    {
42        switch ($state) {
43            case DOKU_LEXER_ENTER:
44                $match = substr($match, 3, -1);
45                return [$state, $match];
46
47            case DOKU_LEXER_UNMATCHED:
48                return [$state, $match];
49
50            case DOKU_LEXER_EXIT:
51                return [$state, ''];
52        }
53        return [];
54    }
55
56    /** @inheritdoc */
57    public function render($format, Doku_Renderer $renderer, $data)
58    {
59        if ($format == 'xhtml') {
60            [$state, $match] = $data;
61            switch ($state) {
62                case DOKU_LEXER_ENTER:
63                    $renderer->doc .= '<span style="font-variant:small-caps;">';
64                    break;
65
66                case DOKU_LEXER_UNMATCHED:
67                    $renderer->doc .= $renderer->_xmlEntities($match);
68                    break;
69
70                case DOKU_LEXER_EXIT:
71                    $renderer->doc .= '</span>';
72                    break;
73            }
74            return true;
75        }
76        return false;
77    }
78}
79