xref: /dokuwiki/inc/Parsing/ParserMode/Listblock.php (revision 8a34b0d87864546b9e35ee6a4621d30bf4cd6475)
1<?php
2
3namespace dokuwiki\Parsing\ParserMode;
4
5use dokuwiki\Parsing\Handler;
6use dokuwiki\Parsing\Handler\Lists;
7use dokuwiki\Parsing\ModeRegistry;
8
9class Listblock extends AbstractMode
10{
11    /**
12     * Listblock constructor.
13     */
14    public function __construct()
15    {
16        $this->allowedModes = ModeRegistry::getInstance()->getModesForCategories([
17            ModeRegistry::CATEGORY_FORMATTING,
18            ModeRegistry::CATEGORY_SUBSTITUTION,
19            ModeRegistry::CATEGORY_DISABLED,
20            ModeRegistry::CATEGORY_PROTECTED,
21        ]);
22    }
23
24    /** @inheritdoc */
25    public function getSort()
26    {
27        return 10;
28    }
29
30    /** @inheritdoc */
31    public function preConnect()
32    {
33        ModeRegistry::getInstance()->registerBlockEolMode('listblock');
34    }
35
36    /** @inheritdoc */
37    public function connectTo($mode)
38    {
39        $this->Lexer->addEntryPattern('[ \t]*\n {2,}[\-\*]', $mode, 'listblock');
40        $this->Lexer->addEntryPattern('[ \t]*\n\t{1,}[\-\*]', $mode, 'listblock');
41
42        $this->Lexer->addPattern('\n {2,}[\-\*]', 'listblock');
43        $this->Lexer->addPattern('\n\t{1,}[\-\*]', 'listblock');
44    }
45
46    /** @inheritdoc */
47    public function postConnect()
48    {
49        $this->Lexer->addExitPattern('\n', 'listblock');
50    }
51
52    /** @inheritdoc */
53    public function handle($match, $state, $pos, Handler $handler)
54    {
55        switch ($state) {
56            case DOKU_LEXER_ENTER:
57                $handler->setCallWriter(new Lists($handler->getCallWriter()));
58                $handler->addCall('list_open', [$match], $pos);
59                break;
60            case DOKU_LEXER_EXIT:
61                $handler->addCall('list_close', [], $pos);
62                /** @var Lists $reWriter */
63                $reWriter = $handler->getCallWriter();
64                $handler->setCallWriter($reWriter->process());
65                break;
66            case DOKU_LEXER_MATCHED:
67                $handler->addCall('list_item', [$match], $pos);
68                break;
69            case DOKU_LEXER_UNMATCHED:
70                $handler->addCall('cdata', [$match], $pos);
71                break;
72        }
73        return true;
74    }
75}
76