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 /** @inheritdoc */ 12 protected function allowedCategories(): array 13 { 14 return [ 15 ModeRegistry::CATEGORY_FORMATTING, 16 ModeRegistry::CATEGORY_SUBSTITUTION, 17 ModeRegistry::CATEGORY_DISABLED, 18 ModeRegistry::CATEGORY_PROTECTED, 19 ]; 20 } 21 22 /** @inheritdoc */ 23 public function getSort() 24 { 25 return 10; 26 } 27 28 /** @inheritdoc */ 29 public function preConnect() 30 { 31 $this->registry->registerBlockEolMode('listblock'); 32 } 33 34 /** @inheritdoc */ 35 public function connectTo($mode) 36 { 37 $this->Lexer->addEntryPattern('[ \t]*\n {2,}[\-\*]', $mode, 'listblock'); 38 $this->Lexer->addEntryPattern('[ \t]*\n\t{1,}[\-\*]', $mode, 'listblock'); 39 40 $this->Lexer->addPattern('\n {2,}[\-\*]', 'listblock'); 41 $this->Lexer->addPattern('\n\t{1,}[\-\*]', 'listblock'); 42 } 43 44 /** @inheritdoc */ 45 public function postConnect() 46 { 47 $this->Lexer->addExitPattern('\n', 'listblock'); 48 } 49 50 /** @inheritdoc */ 51 public function handle($match, $state, $pos, Handler $handler) 52 { 53 switch ($state) { 54 case DOKU_LEXER_ENTER: 55 $handler->setCallWriter(new Lists($handler->getCallWriter())); 56 $handler->addCall('list_open', [$match], $pos); 57 break; 58 case DOKU_LEXER_EXIT: 59 $handler->addCall('list_close', [], $pos); 60 /** @var Lists $reWriter */ 61 $reWriter = $handler->getCallWriter(); 62 $handler->setCallWriter($reWriter->process()); 63 break; 64 case DOKU_LEXER_MATCHED: 65 $handler->addCall('list_item', [$match], $pos); 66 break; 67 case DOKU_LEXER_UNMATCHED: 68 $handler->addCall('cdata', [$match], $pos); 69 break; 70 } 71 return true; 72 } 73} 74