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{ 11be906b56SAndreas Gohr /** 12be906b56SAndreas Gohr * Table constructor. 13be906b56SAndreas Gohr */ 14be906b56SAndreas Gohr public function __construct() 15be906b56SAndreas Gohr { 16c8dd1b9dSAndreas Gohr $this->allowedModes = ModeRegistry::getInstance()->getModesForCategories([ 17c8dd1b9dSAndreas Gohr ModeRegistry::CATEGORY_FORMATTING, 18*56c730b5SAndreas Gohr ModeRegistry::CATEGORY_SUBSTITUTION, 19c8dd1b9dSAndreas Gohr ModeRegistry::CATEGORY_DISABLED, 20c8dd1b9dSAndreas Gohr ModeRegistry::CATEGORY_PROTECTED, 21c8dd1b9dSAndreas Gohr ]); 22be906b56SAndreas Gohr } 23be906b56SAndreas Gohr 24be906b56SAndreas Gohr /** @inheritdoc */ 2571096e46SAndreas Gohr public function getSort() 2671096e46SAndreas Gohr { 2771096e46SAndreas Gohr return 60; 2871096e46SAndreas Gohr } 2971096e46SAndreas Gohr 3071096e46SAndreas Gohr /** @inheritdoc */ 317958e698SAndreas Gohr public function preConnect() 327958e698SAndreas Gohr { 337958e698SAndreas Gohr ModeRegistry::getInstance()->registerBlockEolMode('table'); 347958e698SAndreas Gohr } 357958e698SAndreas Gohr 367958e698SAndreas Gohr /** @inheritdoc */ 37be906b56SAndreas Gohr public function connectTo($mode) 38be906b56SAndreas Gohr { 39be906b56SAndreas Gohr $this->Lexer->addEntryPattern('[\t ]*\n\^', $mode, 'table'); 40be906b56SAndreas Gohr $this->Lexer->addEntryPattern('[\t ]*\n\|', $mode, 'table'); 41be906b56SAndreas Gohr } 42be906b56SAndreas Gohr 43be906b56SAndreas Gohr /** @inheritdoc */ 44be906b56SAndreas Gohr public function postConnect() 45be906b56SAndreas Gohr { 46be906b56SAndreas Gohr $this->Lexer->addPattern('\n\^', 'table'); 47be906b56SAndreas Gohr $this->Lexer->addPattern('\n\|', 'table'); 48be906b56SAndreas Gohr $this->Lexer->addPattern('[\t ]*:::[\t ]*(?=[\|\^])', 'table'); 49be906b56SAndreas Gohr $this->Lexer->addPattern('[\t ]+', 'table'); 50be906b56SAndreas Gohr $this->Lexer->addPattern('\^', 'table'); 51be906b56SAndreas Gohr $this->Lexer->addPattern('\|', 'table'); 52be906b56SAndreas Gohr $this->Lexer->addExitPattern('\n', 'table'); 53be906b56SAndreas Gohr } 54be906b56SAndreas Gohr 55be906b56SAndreas Gohr /** @inheritdoc */ 5671096e46SAndreas Gohr public function handle($match, $state, $pos, Handler $handler) 57be906b56SAndreas Gohr { 5871096e46SAndreas Gohr switch ($state) { 5971096e46SAndreas Gohr case DOKU_LEXER_ENTER: 6071096e46SAndreas Gohr $handler->setCallWriter(new TableHandler($handler->getCallWriter())); 6171096e46SAndreas Gohr 6271096e46SAndreas Gohr $handler->addCall('table_start', [$pos + 1], $pos); 6371096e46SAndreas Gohr if (trim($match) == '^') { 6471096e46SAndreas Gohr $handler->addCall('tableheader', [], $pos); 6571096e46SAndreas Gohr } else { 6671096e46SAndreas Gohr $handler->addCall('tablecell', [], $pos); 6771096e46SAndreas Gohr } 6871096e46SAndreas Gohr break; 6971096e46SAndreas Gohr 7071096e46SAndreas Gohr case DOKU_LEXER_EXIT: 7171096e46SAndreas Gohr $handler->addCall('table_end', [$pos], $pos); 7271096e46SAndreas Gohr /** @var TableHandler $reWriter */ 7371096e46SAndreas Gohr $reWriter = $handler->getCallWriter(); 7471096e46SAndreas Gohr $handler->setCallWriter($reWriter->process()); 7571096e46SAndreas Gohr break; 7671096e46SAndreas Gohr 7771096e46SAndreas Gohr case DOKU_LEXER_UNMATCHED: 7871096e46SAndreas Gohr if (trim($match) != '') { 7971096e46SAndreas Gohr $handler->addCall('cdata', [$match], $pos); 8071096e46SAndreas Gohr } 8171096e46SAndreas Gohr break; 8271096e46SAndreas Gohr 8371096e46SAndreas Gohr case DOKU_LEXER_MATCHED: 8471096e46SAndreas Gohr if ($match == ' ') { 8571096e46SAndreas Gohr $handler->addCall('cdata', [$match], $pos); 8671096e46SAndreas Gohr } elseif (preg_match('/:::/', $match)) { 8771096e46SAndreas Gohr $handler->addCall('rowspan', [$match], $pos); 8871096e46SAndreas Gohr } elseif (preg_match('/\t+/', $match)) { 8971096e46SAndreas Gohr $handler->addCall('table_align', [$match], $pos); 9071096e46SAndreas Gohr } elseif (preg_match('/ {2,}/', $match)) { 9171096e46SAndreas Gohr $handler->addCall('table_align', [$match], $pos); 9271096e46SAndreas Gohr } elseif ($match == "\n|") { 9371096e46SAndreas Gohr $handler->addCall('table_row', [], $pos); 9471096e46SAndreas Gohr $handler->addCall('tablecell', [], $pos); 9571096e46SAndreas Gohr } elseif ($match == "\n^") { 9671096e46SAndreas Gohr $handler->addCall('table_row', [], $pos); 9771096e46SAndreas Gohr $handler->addCall('tableheader', [], $pos); 9871096e46SAndreas Gohr } elseif ($match == '|') { 9971096e46SAndreas Gohr $handler->addCall('tablecell', [], $pos); 10071096e46SAndreas Gohr } elseif ($match == '^') { 10171096e46SAndreas Gohr $handler->addCall('tableheader', [], $pos); 10271096e46SAndreas Gohr } 10371096e46SAndreas Gohr break; 10471096e46SAndreas Gohr } 10571096e46SAndreas Gohr return true; 106be906b56SAndreas Gohr } 107be906b56SAndreas Gohr} 108