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