1be906b56SAndreas Gohr<?php 2be906b56SAndreas Gohr 3be906b56SAndreas Gohrnamespace dokuwiki\Parsing\ParserMode; 4be906b56SAndreas Gohr 5*71096e46SAndreas Gohruse dokuwiki\Parsing\Handler; 6*71096e46SAndreas Gohruse dokuwiki\Parsing\Handler\Preformatted as PreformattedHandler; 77958e698SAndreas Gohruse dokuwiki\Parsing\ModeRegistry; 87958e698SAndreas Gohr 9be906b56SAndreas Gohrclass Preformatted extends AbstractMode 10be906b56SAndreas Gohr{ 11be906b56SAndreas Gohr /** @inheritdoc */ 12*71096e46SAndreas Gohr public function getSort() 13*71096e46SAndreas Gohr { 14*71096e46SAndreas Gohr return 20; 15*71096e46SAndreas Gohr } 16*71096e46SAndreas Gohr 17*71096e46SAndreas 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 26be906b56SAndreas Gohr // How to effect a sub pattern with the Lexer! 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 */ 38*71096e46SAndreas Gohr public function handle($match, $state, $pos, Handler $handler) 39be906b56SAndreas Gohr { 40*71096e46SAndreas Gohr switch ($state) { 41*71096e46SAndreas Gohr case DOKU_LEXER_ENTER: 42*71096e46SAndreas Gohr $handler->setCallWriter(new PreformattedHandler($handler->getCallWriter())); 43*71096e46SAndreas Gohr $handler->addCall('preformatted_start', [], $pos); 44*71096e46SAndreas Gohr break; 45*71096e46SAndreas Gohr case DOKU_LEXER_EXIT: 46*71096e46SAndreas Gohr $handler->addCall('preformatted_end', [], $pos); 47*71096e46SAndreas Gohr /** @var PreformattedHandler $reWriter */ 48*71096e46SAndreas Gohr $reWriter = $handler->getCallWriter(); 49*71096e46SAndreas Gohr $handler->setCallWriter($reWriter->process()); 50*71096e46SAndreas Gohr break; 51*71096e46SAndreas Gohr case DOKU_LEXER_MATCHED: 52*71096e46SAndreas Gohr $handler->addCall('preformatted_newline', [], $pos); 53*71096e46SAndreas Gohr break; 54*71096e46SAndreas Gohr case DOKU_LEXER_UNMATCHED: 55*71096e46SAndreas Gohr $handler->addCall('preformatted_content', [$match], $pos); 56*71096e46SAndreas Gohr break; 57*71096e46SAndreas Gohr } 58*71096e46SAndreas Gohr 59*71096e46SAndreas Gohr return true; 60be906b56SAndreas Gohr } 61be906b56SAndreas Gohr} 62