Completed
Push — stable ( b83837...3c8749 )
by
unknown
08:20 queued 05:46
created

Quote::writeCall()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace dokuwiki\Parsing\Handler;
4
5
class Quote extends AbstractRewriter
6
{
7
    protected $quoteCalls = array();
8
9
    /** @inheritdoc */
10
    public function finalise()
11
    {
12
        $last_call = end($this->calls);
13
        $this->writeCall(array('quote_end',array(), $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[] = array('quote_open',array(),$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[] = array('quote_open',array(),$call[2]);
40
                        }
41
                    } elseif ($quoteLength < $quoteDepth) {
42
                        $quoteDiff = $quoteDepth - $quoteLength;
43
                        for ($i = 1; $i <= $quoteDiff; $i++) {
44
                            $this->quoteCalls[] = array('quote_close',array(),$call[2]);
45
                        }
46
                    } else {
47
                        if ($call[0] != 'quote_start') $this->quoteCalls[] = array('linebreak',array(),$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[] = array('quote_close',array(),$call[2]);
59
                        }
60
                    }
61
62
                    $this->quoteCalls[] = array('quote_close',array(),$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