xref: /dokuwiki/inc/Parsing/ParserMode/Table.php (revision 47a02a102092be9e1e6f1ddaf158bdfffdb13d4f)
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