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_SUBSTITUTION, 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