xref: /dokuwiki/inc/Parsing/ParserMode/Quote.php (revision 71096e46fcbfaeaa808667aba794e77fe2780169)
1<?php
2
3namespace dokuwiki\Parsing\ParserMode;
4
5use dokuwiki\Parsing\Handler;
6use dokuwiki\Parsing\Handler\Quote as QuoteHandler;
7use dokuwiki\Parsing\ModeRegistry;
8
9class Quote extends AbstractMode
10{
11    /**
12     * Quote 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 220;
28    }
29
30    /** @inheritdoc */
31    public function connectTo($mode)
32    {
33        $this->Lexer->addEntryPattern('\n>{1,}', $mode, 'quote');
34    }
35
36    /** @inheritdoc */
37    public function postConnect()
38    {
39        $this->Lexer->addPattern('\n>{1,}', 'quote');
40        $this->Lexer->addExitPattern('\n', 'quote');
41    }
42
43    /** @inheritdoc */
44    public function handle($match, $state, $pos, Handler $handler)
45    {
46        switch ($state) {
47            case DOKU_LEXER_ENTER:
48                $handler->setCallWriter(new QuoteHandler($handler->getCallWriter()));
49                $handler->addCall('quote_start', [$match], $pos);
50                break;
51
52            case DOKU_LEXER_EXIT:
53                $handler->addCall('quote_end', [], $pos);
54                /** @var QuoteHandler $reWriter */
55                $reWriter = $handler->getCallWriter();
56                $handler->setCallWriter($reWriter->process());
57                break;
58
59            case DOKU_LEXER_MATCHED:
60                $handler->addCall('quote_newline', [$match], $pos);
61                break;
62
63            case DOKU_LEXER_UNMATCHED:
64                $handler->addCall('cdata', [$match], $pos);
65                break;
66        }
67
68        return true;
69    }
70}
71