1be906b56SAndreas Gohr<?php 2be906b56SAndreas Gohr 3be906b56SAndreas Gohrnamespace dokuwiki\Parsing\ParserMode; 4be906b56SAndreas Gohr 571096e46SAndreas Gohruse dokuwiki\Parsing\Handler; 671096e46SAndreas Gohruse dokuwiki\Parsing\Handler\Table as TableHandler; 7c8dd1b9dSAndreas Gohruse dokuwiki\Parsing\ModeRegistry; 8c8dd1b9dSAndreas Gohr 9be906b56SAndreas Gohrclass Table extends AbstractMode 10be906b56SAndreas Gohr{ 11*47a02a10SAndreas Gohr /** @inheritdoc */ 12*47a02a10SAndreas Gohr protected function allowedCategories(): array 13be906b56SAndreas Gohr { 14*47a02a10SAndreas Gohr return [ 15c8dd1b9dSAndreas Gohr ModeRegistry::CATEGORY_FORMATTING, 1656c730b5SAndreas Gohr ModeRegistry::CATEGORY_SUBSTITUTION, 17c8dd1b9dSAndreas Gohr ModeRegistry::CATEGORY_DISABLED, 18c8dd1b9dSAndreas Gohr ModeRegistry::CATEGORY_PROTECTED, 19*47a02a10SAndreas Gohr ]; 20be906b56SAndreas Gohr } 21be906b56SAndreas Gohr 22be906b56SAndreas Gohr /** @inheritdoc */ 2371096e46SAndreas Gohr public function getSort() 2471096e46SAndreas Gohr { 2571096e46SAndreas Gohr return 60; 2671096e46SAndreas Gohr } 2771096e46SAndreas Gohr 2871096e46SAndreas Gohr /** @inheritdoc */ 297958e698SAndreas Gohr public function preConnect() 307958e698SAndreas Gohr { 31*47a02a10SAndreas Gohr $this->registry->registerBlockEolMode('table'); 327958e698SAndreas Gohr } 337958e698SAndreas Gohr 347958e698SAndreas Gohr /** @inheritdoc */ 35be906b56SAndreas Gohr public function connectTo($mode) 36be906b56SAndreas Gohr { 37be906b56SAndreas Gohr $this->Lexer->addEntryPattern('[\t ]*\n\^', $mode, 'table'); 38be906b56SAndreas Gohr $this->Lexer->addEntryPattern('[\t ]*\n\|', $mode, 'table'); 39be906b56SAndreas Gohr } 40be906b56SAndreas Gohr 41be906b56SAndreas Gohr /** @inheritdoc */ 42be906b56SAndreas Gohr public function postConnect() 43be906b56SAndreas Gohr { 44be906b56SAndreas Gohr $this->Lexer->addPattern('\n\^', 'table'); 45be906b56SAndreas Gohr $this->Lexer->addPattern('\n\|', 'table'); 46be906b56SAndreas Gohr $this->Lexer->addPattern('[\t ]*:::[\t ]*(?=[\|\^])', 'table'); 47be906b56SAndreas Gohr $this->Lexer->addPattern('[\t ]+', 'table'); 48be906b56SAndreas Gohr $this->Lexer->addPattern('\^', 'table'); 49be906b56SAndreas Gohr $this->Lexer->addPattern('\|', 'table'); 50be906b56SAndreas Gohr $this->Lexer->addExitPattern('\n', 'table'); 51be906b56SAndreas Gohr } 52be906b56SAndreas Gohr 53be906b56SAndreas Gohr /** @inheritdoc */ 5471096e46SAndreas Gohr public function handle($match, $state, $pos, Handler $handler) 55be906b56SAndreas Gohr { 5671096e46SAndreas Gohr switch ($state) { 5771096e46SAndreas Gohr case DOKU_LEXER_ENTER: 5871096e46SAndreas Gohr $handler->setCallWriter(new TableHandler($handler->getCallWriter())); 5971096e46SAndreas Gohr 6071096e46SAndreas Gohr $handler->addCall('table_start', [$pos + 1], $pos); 6171096e46SAndreas Gohr if (trim($match) == '^') { 6271096e46SAndreas Gohr $handler->addCall('tableheader', [], $pos); 6371096e46SAndreas Gohr } else { 6471096e46SAndreas Gohr $handler->addCall('tablecell', [], $pos); 6571096e46SAndreas Gohr } 6671096e46SAndreas Gohr break; 6771096e46SAndreas Gohr 6871096e46SAndreas Gohr case DOKU_LEXER_EXIT: 6971096e46SAndreas Gohr $handler->addCall('table_end', [$pos], $pos); 7071096e46SAndreas Gohr /** @var TableHandler $reWriter */ 7171096e46SAndreas Gohr $reWriter = $handler->getCallWriter(); 7271096e46SAndreas Gohr $handler->setCallWriter($reWriter->process()); 7371096e46SAndreas Gohr break; 7471096e46SAndreas Gohr 7571096e46SAndreas Gohr case DOKU_LEXER_UNMATCHED: 7671096e46SAndreas Gohr if (trim($match) != '') { 7771096e46SAndreas Gohr $handler->addCall('cdata', [$match], $pos); 7871096e46SAndreas Gohr } 7971096e46SAndreas Gohr break; 8071096e46SAndreas Gohr 8171096e46SAndreas Gohr case DOKU_LEXER_MATCHED: 8271096e46SAndreas Gohr if ($match == ' ') { 8371096e46SAndreas Gohr $handler->addCall('cdata', [$match], $pos); 8471096e46SAndreas Gohr } elseif (preg_match('/:::/', $match)) { 8571096e46SAndreas Gohr $handler->addCall('rowspan', [$match], $pos); 8671096e46SAndreas Gohr } elseif (preg_match('/\t+/', $match)) { 8771096e46SAndreas Gohr $handler->addCall('table_align', [$match], $pos); 8871096e46SAndreas Gohr } elseif (preg_match('/ {2,}/', $match)) { 8971096e46SAndreas Gohr $handler->addCall('table_align', [$match], $pos); 9071096e46SAndreas Gohr } elseif ($match == "\n|") { 9171096e46SAndreas Gohr $handler->addCall('table_row', [], $pos); 9271096e46SAndreas Gohr $handler->addCall('tablecell', [], $pos); 9371096e46SAndreas Gohr } elseif ($match == "\n^") { 9471096e46SAndreas Gohr $handler->addCall('table_row', [], $pos); 9571096e46SAndreas Gohr $handler->addCall('tableheader', [], $pos); 9671096e46SAndreas Gohr } elseif ($match == '|') { 9771096e46SAndreas Gohr $handler->addCall('tablecell', [], $pos); 9871096e46SAndreas Gohr } elseif ($match == '^') { 9971096e46SAndreas Gohr $handler->addCall('tableheader', [], $pos); 10071096e46SAndreas Gohr } 10171096e46SAndreas Gohr break; 10271096e46SAndreas Gohr } 10371096e46SAndreas Gohr return true; 104be906b56SAndreas Gohr } 105be906b56SAndreas Gohr} 106