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     Esther Brunner <esther@kaffeehaus.ch>
11 */
12class syntax_plugin_bbcode_olist extends SyntaxPlugin
13{
14    /** @inheritdoc */
15    public function getType()
16    {
17        return 'container';
18    }
19    /** @inheritdoc */
20    public function getPType()
21    {
22        return 'block';
23    }
24    /** @inheritdoc */
25    public function getAllowedTypes()
26    {
27        return ['formatting', 'substition', 'disabled', 'protected'];
28    }
29    /** @inheritdoc */
30    public function getSort()
31    {
32        return 105;
33    }
34    /** @inheritdoc */
35    public function connectTo($mode)
36    {
37        $this->Lexer->addEntryPattern('\[list=.*?\]\s*?\[\*\](?=.*?\x5B/list\x5D)', $mode, 'plugin_bbcode_olist');
38    }
39    /** @inheritdoc */
40    public function postConnect()
41    {
42        $this->Lexer->addExitPattern('\[/list\]', 'plugin_bbcode_olist');
43    }
44
45    /** @inheritdoc */
46    public function handle($match, $state, $pos, Handler $handler)
47    {
48        switch ($state) {
49            case DOKU_LEXER_ENTER:
50              // get the list type
51                $match = substr($match, 6, -4);
52                $match = explode(']', $match, 2);
53                return [$state, $match[0]];
54
55            case DOKU_LEXER_UNMATCHED:
56                return [$state, $match];
57
58            case DOKU_LEXER_EXIT:
59                return [$state, ''];
60        }
61        return [];
62    }
63
64    /** @inheritdoc */
65    public function render($format, Doku_Renderer $renderer, $data)
66    {
67        if ($format == 'xhtml') {
68            [$state, $match] = $data;
69            switch ($state) {
70                case DOKU_LEXER_ENTER:
71                    switch ($match) {
72                        case 'i':
73                            $type = 'lower-roman';
74                            break;
75                        case 'I':
76                            $type = 'upper-roman';
77                            break;
78                        case 'a':
79                            $type = 'lower-alpha';
80                            break;
81                        case 'A':
82                            $type = 'upper-alpha';
83                            break;
84                        default:
85                            $type = 'decimal';
86                    }
87                    $renderer->doc .= '<ol style="list-style-type:' . $type . '"><li class="level1"><div class="li">';
88                    break;
89
90                case DOKU_LEXER_UNMATCHED:
91                    $match = $renderer->_xmlEntities($match);
92                    $renderer->doc .= str_replace('[*]', '</div></li><li class="level1"><div class="li">', $match);
93                    break;
94
95                case DOKU_LEXER_EXIT:
96                    $renderer->doc .= '</div></li></ol>';
97                    break;
98            }
99            return true;
100        }
101        return false;
102    }
103}
104