xref: /dokuwiki/inc/Parsing/ParserMode/Preformatted.php (revision 259e91d9cbe9e692d758265730a1b3b4f8e3f356)
1be906b56SAndreas Gohr<?php
2be906b56SAndreas Gohr
3be906b56SAndreas Gohrnamespace dokuwiki\Parsing\ParserMode;
4be906b56SAndreas Gohr
571096e46SAndreas Gohruse dokuwiki\Parsing\Handler;
671096e46SAndreas Gohruse dokuwiki\Parsing\Handler\Preformatted as PreformattedHandler;
77958e698SAndreas Gohruse dokuwiki\Parsing\ModeRegistry;
87958e698SAndreas Gohr
9be906b56SAndreas Gohrclass Preformatted extends AbstractMode
10be906b56SAndreas Gohr{
11be906b56SAndreas Gohr    /** @inheritdoc */
1271096e46SAndreas Gohr    public function getSort()
1371096e46SAndreas Gohr    {
1471096e46SAndreas Gohr        return 20;
1571096e46SAndreas Gohr    }
1671096e46SAndreas Gohr
1771096e46SAndreas Gohr    /** @inheritdoc */
18be906b56SAndreas Gohr    public function connectTo($mode)
19be906b56SAndreas Gohr    {
207958e698SAndreas Gohr        $markers = ModeRegistry::getInstance()->getLineStartMarkers();
217958e698SAndreas Gohr        $lookahead = $markers ? '(?![' . implode('', $markers) . '])' : '';
227958e698SAndreas Gohr
237958e698SAndreas Gohr        $this->Lexer->addEntryPattern('\n  ' . $lookahead, $mode, 'preformatted');
247958e698SAndreas Gohr        $this->Lexer->addEntryPattern('\n\t' . $lookahead, $mode, 'preformatted');
25be906b56SAndreas Gohr
26*259e91d9SAndreas Gohr        // match continuation lines inside the preformatted block
27be906b56SAndreas Gohr        $this->Lexer->addPattern('\n  ', 'preformatted');
28be906b56SAndreas Gohr        $this->Lexer->addPattern('\n\t', 'preformatted');
29be906b56SAndreas Gohr    }
30be906b56SAndreas Gohr
31be906b56SAndreas Gohr    /** @inheritdoc */
32be906b56SAndreas Gohr    public function postConnect()
33be906b56SAndreas Gohr    {
34be906b56SAndreas Gohr        $this->Lexer->addExitPattern('\n', 'preformatted');
35be906b56SAndreas Gohr    }
36be906b56SAndreas Gohr
37be906b56SAndreas Gohr    /** @inheritdoc */
3871096e46SAndreas Gohr    public function handle($match, $state, $pos, Handler $handler)
39be906b56SAndreas Gohr    {
4071096e46SAndreas Gohr        switch ($state) {
4171096e46SAndreas Gohr            case DOKU_LEXER_ENTER:
4271096e46SAndreas Gohr                $handler->setCallWriter(new PreformattedHandler($handler->getCallWriter()));
4371096e46SAndreas Gohr                $handler->addCall('preformatted_start', [], $pos);
4471096e46SAndreas Gohr                break;
4571096e46SAndreas Gohr            case DOKU_LEXER_EXIT:
4671096e46SAndreas Gohr                $handler->addCall('preformatted_end', [], $pos);
4771096e46SAndreas Gohr                /** @var PreformattedHandler $reWriter */
4871096e46SAndreas Gohr                $reWriter = $handler->getCallWriter();
4971096e46SAndreas Gohr                $handler->setCallWriter($reWriter->process());
5071096e46SAndreas Gohr                break;
5171096e46SAndreas Gohr            case DOKU_LEXER_MATCHED:
5271096e46SAndreas Gohr                $handler->addCall('preformatted_newline', [], $pos);
5371096e46SAndreas Gohr                break;
5471096e46SAndreas Gohr            case DOKU_LEXER_UNMATCHED:
5571096e46SAndreas Gohr                $handler->addCall('preformatted_content', [$match], $pos);
5671096e46SAndreas Gohr                break;
5771096e46SAndreas Gohr        }
5871096e46SAndreas Gohr
5971096e46SAndreas Gohr        return true;
60be906b56SAndreas Gohr    }
61be906b56SAndreas Gohr}
62