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