1<?php
2
3namespace dokuwiki\Parsing\Handler;
4
5class Quote extends AbstractRewriter
6{
7    protected $quoteCalls = [];
8
9    /** @inheritdoc */
10    public function finalise()
11    {
12        $last_call = end($this->calls);
13        $this->writeCall(['quote_end', [], $last_call[2]]);
14
15        $this->process();
16        $this->callWriter->finalise();
17        unset($this->callWriter);
18    }
19
20    /** @inheritdoc */
21    public function process()
22    {
23
24        $quoteDepth = 1;
25
26        foreach ($this->calls as $call) {
27            switch ($call[0]) {
28
29                /** @noinspection PhpMissingBreakStatementInspection */
30                case 'quote_start':
31                    $this->quoteCalls[] = ['quote_open', [], $call[2]];
32                    // fallthrough
33                case 'quote_newline':
34                    $quoteLength = $this->getDepth($call[1][0]);
35
36                    if ($quoteLength > $quoteDepth) {
37                        $quoteDiff = $quoteLength - $quoteDepth;
38                        for ($i = 1; $i <= $quoteDiff; $i++) {
39                            $this->quoteCalls[] = ['quote_open', [], $call[2]];
40                        }
41                    } elseif ($quoteLength < $quoteDepth) {
42                        $quoteDiff = $quoteDepth - $quoteLength;
43                        for ($i = 1; $i <= $quoteDiff; $i++) {
44                            $this->quoteCalls[] = ['quote_close', [], $call[2]];
45                        }
46                    } elseif ($call[0] != 'quote_start') {
47                        $this->quoteCalls[] = ['linebreak', [], $call[2]];
48                    }
49
50                    $quoteDepth = $quoteLength;
51
52                    break;
53
54                case 'quote_end':
55                    if ($quoteDepth > 1) {
56                        $quoteDiff = $quoteDepth - 1;
57                        for ($i = 1; $i <= $quoteDiff; $i++) {
58                            $this->quoteCalls[] = ['quote_close', [], $call[2]];
59                        }
60                    }
61
62                    $this->quoteCalls[] = ['quote_close', [], $call[2]];
63
64                    $this->callWriter->writeCalls($this->quoteCalls);
65                    break;
66
67                default:
68                    $this->quoteCalls[] = $call;
69                    break;
70            }
71        }
72
73        return $this->callWriter;
74    }
75
76    /**
77     * @param string $marker
78     * @return int
79     */
80    protected function getDepth($marker)
81    {
82        preg_match('/>{1,}/', $marker, $matches);
83        $quoteLength = strlen($matches[0]);
84        return $quoteLength;
85    }
86}
87