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