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