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_SUBSTITION, 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 $registry = ModeRegistry::getInstance(); 34 $registry->registerBlockEolMode('listblock'); 35 $registry->registerLineStartMarkers('listblock', ['\\*', '\\-']); 36 } 37 38 /** @inheritdoc */ 39 public function connectTo($mode) 40 { 41 $this->Lexer->addEntryPattern('[ \t]*\n {2,}[\-\*]', $mode, 'listblock'); 42 $this->Lexer->addEntryPattern('[ \t]*\n\t{1,}[\-\*]', $mode, 'listblock'); 43 44 $this->Lexer->addPattern('\n {2,}[\-\*]', 'listblock'); 45 $this->Lexer->addPattern('\n\t{1,}[\-\*]', 'listblock'); 46 } 47 48 /** @inheritdoc */ 49 public function postConnect() 50 { 51 $this->Lexer->addExitPattern('\n', 'listblock'); 52 } 53 54 /** @inheritdoc */ 55 public function handle($match, $state, $pos, Handler $handler) 56 { 57 switch ($state) { 58 case DOKU_LEXER_ENTER: 59 $handler->setCallWriter(new Lists($handler->getCallWriter())); 60 $handler->addCall('list_open', [$match], $pos); 61 break; 62 case DOKU_LEXER_EXIT: 63 $handler->addCall('list_close', [], $pos); 64 /** @var Lists $reWriter */ 65 $reWriter = $handler->getCallWriter(); 66 $handler->setCallWriter($reWriter->process()); 67 break; 68 case DOKU_LEXER_MATCHED: 69 $handler->addCall('list_item', [$match], $pos); 70 break; 71 case DOKU_LEXER_UNMATCHED: 72 $handler->addCall('cdata', [$match], $pos); 73 break; 74 } 75 return true; 76 } 77} 78