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_ulist 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_ulist');
38    }
39    /** @inheritdoc */
40    public function postConnect()
41    {
42        $this->Lexer->addExitPattern('\[/list\]', 'plugin_bbcode_ulist');
43    }
44
45    /** @inheritdoc */
46    public function handle($match, $state, $pos, Handler $handler)
47    {
48        switch ($state) {
49            case DOKU_LEXER_ENTER:
50            case DOKU_LEXER_EXIT:
51                return [$state, ''];
52            case DOKU_LEXER_UNMATCHED:
53                return [$state, $match];
54        }
55        return [];
56    }
57
58    /** @inheritdoc */
59    public function render($format, Doku_Renderer $renderer, $data)
60    {
61        if ($format == 'xhtml') {
62            [$state, $match] = $data;
63            switch ($state) {
64                case DOKU_LEXER_ENTER:
65                    $renderer->doc .= '<ul><li class="level1"><div class="li">';
66                    break;
67
68                case DOKU_LEXER_UNMATCHED:
69                    $match = $renderer->_xmlEntities($match);
70                    $renderer->doc .= str_replace('[*]', '</div></li><li class="level1"><div class="li">', $match);
71                    break;
72
73                case DOKU_LEXER_EXIT:
74                    $renderer->doc .= '</div></li></ul>';
75                    break;
76            }
77            return true;
78        }
79        return false;
80    }
81}
82