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