1be906b56SAndreas Gohr<?php 2be906b56SAndreas Gohr 3be906b56SAndreas Gohrnamespace dokuwiki\Parsing\ParserMode; 4be906b56SAndreas Gohr 5*71096e46SAndreas Gohruse dokuwiki\Parsing\Handler; 6*71096e46SAndreas 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, 18c8dd1b9dSAndreas Gohr ModeRegistry::CATEGORY_SUBSTITION, 19c8dd1b9dSAndreas Gohr ModeRegistry::CATEGORY_DISABLED, 20c8dd1b9dSAndreas Gohr ModeRegistry::CATEGORY_PROTECTED, 21c8dd1b9dSAndreas Gohr ]); 22be906b56SAndreas Gohr } 23be906b56SAndreas Gohr 24be906b56SAndreas Gohr /** @inheritdoc */ 25*71096e46SAndreas Gohr public function getSort() 26*71096e46SAndreas Gohr { 27*71096e46SAndreas Gohr return 60; 28*71096e46SAndreas Gohr } 29*71096e46SAndreas Gohr 30*71096e46SAndreas 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 */ 56*71096e46SAndreas Gohr public function handle($match, $state, $pos, Handler $handler) 57be906b56SAndreas Gohr { 58*71096e46SAndreas Gohr switch ($state) { 59*71096e46SAndreas Gohr case DOKU_LEXER_ENTER: 60*71096e46SAndreas Gohr $handler->setCallWriter(new TableHandler($handler->getCallWriter())); 61*71096e46SAndreas Gohr 62*71096e46SAndreas Gohr $handler->addCall('table_start', [$pos + 1], $pos); 63*71096e46SAndreas Gohr if (trim($match) == '^') { 64*71096e46SAndreas Gohr $handler->addCall('tableheader', [], $pos); 65*71096e46SAndreas Gohr } else { 66*71096e46SAndreas Gohr $handler->addCall('tablecell', [], $pos); 67*71096e46SAndreas Gohr } 68*71096e46SAndreas Gohr break; 69*71096e46SAndreas Gohr 70*71096e46SAndreas Gohr case DOKU_LEXER_EXIT: 71*71096e46SAndreas Gohr $handler->addCall('table_end', [$pos], $pos); 72*71096e46SAndreas Gohr /** @var TableHandler $reWriter */ 73*71096e46SAndreas Gohr $reWriter = $handler->getCallWriter(); 74*71096e46SAndreas Gohr $handler->setCallWriter($reWriter->process()); 75*71096e46SAndreas Gohr break; 76*71096e46SAndreas Gohr 77*71096e46SAndreas Gohr case DOKU_LEXER_UNMATCHED: 78*71096e46SAndreas Gohr if (trim($match) != '') { 79*71096e46SAndreas Gohr $handler->addCall('cdata', [$match], $pos); 80*71096e46SAndreas Gohr } 81*71096e46SAndreas Gohr break; 82*71096e46SAndreas Gohr 83*71096e46SAndreas Gohr case DOKU_LEXER_MATCHED: 84*71096e46SAndreas Gohr if ($match == ' ') { 85*71096e46SAndreas Gohr $handler->addCall('cdata', [$match], $pos); 86*71096e46SAndreas Gohr } elseif (preg_match('/:::/', $match)) { 87*71096e46SAndreas Gohr $handler->addCall('rowspan', [$match], $pos); 88*71096e46SAndreas Gohr } elseif (preg_match('/\t+/', $match)) { 89*71096e46SAndreas Gohr $handler->addCall('table_align', [$match], $pos); 90*71096e46SAndreas Gohr } elseif (preg_match('/ {2,}/', $match)) { 91*71096e46SAndreas Gohr $handler->addCall('table_align', [$match], $pos); 92*71096e46SAndreas Gohr } elseif ($match == "\n|") { 93*71096e46SAndreas Gohr $handler->addCall('table_row', [], $pos); 94*71096e46SAndreas Gohr $handler->addCall('tablecell', [], $pos); 95*71096e46SAndreas Gohr } elseif ($match == "\n^") { 96*71096e46SAndreas Gohr $handler->addCall('table_row', [], $pos); 97*71096e46SAndreas Gohr $handler->addCall('tableheader', [], $pos); 98*71096e46SAndreas Gohr } elseif ($match == '|') { 99*71096e46SAndreas Gohr $handler->addCall('tablecell', [], $pos); 100*71096e46SAndreas Gohr } elseif ($match == '^') { 101*71096e46SAndreas Gohr $handler->addCall('tableheader', [], $pos); 102*71096e46SAndreas Gohr } 103*71096e46SAndreas Gohr break; 104*71096e46SAndreas Gohr } 105*71096e46SAndreas Gohr return true; 106be906b56SAndreas Gohr } 107be906b56SAndreas Gohr} 108