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