xref: /dokuwiki/inc/Parsing/ParserMode/Listblock.php (revision 71096e46fcbfaeaa808667aba794e77fe2780169)
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_SUBSTITION,
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        $registry = ModeRegistry::getInstance();
34        $registry->registerBlockEolMode('listblock');
35        $registry->registerLineStartMarkers('listblock', ['\\*', '\\-']);
36    }
37
38    /** @inheritdoc */
39    public function connectTo($mode)
40    {
41        $this->Lexer->addEntryPattern('[ \t]*\n {2,}[\-\*]', $mode, 'listblock');
42        $this->Lexer->addEntryPattern('[ \t]*\n\t{1,}[\-\*]', $mode, 'listblock');
43
44        $this->Lexer->addPattern('\n {2,}[\-\*]', 'listblock');
45        $this->Lexer->addPattern('\n\t{1,}[\-\*]', 'listblock');
46    }
47
48    /** @inheritdoc */
49    public function postConnect()
50    {
51        $this->Lexer->addExitPattern('\n', 'listblock');
52    }
53
54    /** @inheritdoc */
55    public function handle($match, $state, $pos, Handler $handler)
56    {
57        switch ($state) {
58            case DOKU_LEXER_ENTER:
59                $handler->setCallWriter(new Lists($handler->getCallWriter()));
60                $handler->addCall('list_open', [$match], $pos);
61                break;
62            case DOKU_LEXER_EXIT:
63                $handler->addCall('list_close', [], $pos);
64                /** @var Lists $reWriter */
65                $reWriter = $handler->getCallWriter();
66                $handler->setCallWriter($reWriter->process());
67                break;
68            case DOKU_LEXER_MATCHED:
69                $handler->addCall('list_item', [$match], $pos);
70                break;
71            case DOKU_LEXER_UNMATCHED:
72                $handler->addCall('cdata', [$match], $pos);
73                break;
74        }
75        return true;
76    }
77}
78