Completed
Push — master ( 14c6e3...e2d752 )
by Nate
03:11
created

TriggerTokenParser::parseValueAttribute()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
dl 0
loc 13
ccs 0
cts 11
cp 0
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 8
nc 2
nop 0
crap 6
1
<?php
2
3
/**
4
 * @copyright  Copyright (c) Flipbox Digital Limited
5
 * @license    https://github.com/flipboxfactory/twig-trigger/blob/master/LICENSE.md
6
 * @link       https://github.com/flipboxfactory/twig-trigger
7
 */
8
9
namespace flipbox\twig\tokenparsers;
10
11
use flipbox\twig\nodes\TriggerNode;
12
use flipbox\twig\traits\PrefixTrait;
13
use Twig_Error_Syntax;
14
use Twig_Node_Text;
15
use Twig_Token;
16
17
/**
18
 * @author Flipbox Factory <[email protected]>
19
 * @since 1.0.0
20
 */
21
class TriggerTokenParser extends \Twig_TokenParser
22
{
23
    use PrefixTrait;
24
25
    /**
26
     * @param string|null $prefix
27
     */
28
    public function __construct(string $prefix = null)
29
    {
30
        $this->prefix = $prefix;
31
    }
32
33
    /**
34
     * @inheritdoc
35
     */
36
    public function getTag()
37
    {
38
        return $this->getPrefixTrigger();
39
    }
40
41
    /**
42
     * @inheritdoc
43
     */
44
    public function parse(Twig_Token $token)
45
    {
46
        $line = $token->getLine();
47
        $parser = $this->parser;
48
49
        $nodes = [
50
            'event' => $this->parser->getExpressionParser()->parseExpression()
51
        ];
52
53
        $variables = [
54
            'prefix' => $this->prefix,
55
            'capture' => true
56
        ];
57
58
        // Look for value as an attribute
59
        $this->parseValueAttribute();
60
61
        // Params 'with'
62
        $variables['params'] = $this->parseWith();
63
64
        // Close out opening tag
65
        $parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
66
67
        // Is there a closing tag?
68
        if ($variables['capture']) {
69
            $this->parseValueBetweenTags();
70
        }
71
72
        return new TriggerNode($nodes, $variables, $line, $this->getTag());
73
    }
74
75
    /**
76
     * @throws Twig_Error_Syntax
77
     */
78
    protected function parseValueAttribute()
79
    {
80
        $parser = $this->parser;
81
        $stream = $parser->getStream();
82
        $expressionParser = $this->parser->getExpressionParser();
83
84
        // Look for value as a param
85
        if ($stream->nextIf(Twig_Token::NAME_TYPE, 'value')) {
86
            $stream->expect(Twig_Token::OPERATOR_TYPE, '=');
87
            $variables['capture'] = false;
0 ignored issues
show
Coding Style Comprehensibility introduced by
$variables was never initialized. Although not strictly required by PHP, it is generally a good practice to add $variables = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
88
            $nodes['value'] = $expressionParser->parseExpression();
0 ignored issues
show
Coding Style Comprehensibility introduced by
$nodes was never initialized. Although not strictly required by PHP, it is generally a good practice to add $nodes = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
89
        }
90
    }
91
92
    /**
93
     * @throws Twig_Error_Syntax
94
     */
95
    protected function parseValueBetweenTags()
96
    {
97
        $parser = $this->parser;
98
        $stream = $parser->getStream();
99
100
        $nodes['value'] = $parser->subparse(array($this, 'decideBlockEnd'), true);
0 ignored issues
show
Coding Style Comprehensibility introduced by
$nodes was never initialized. Although not strictly required by PHP, it is generally a good practice to add $nodes = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
101
        $stream->expect(Twig_Token::BLOCK_END_TYPE);
102
    }
103
104
    /**
105
     * @return null|Twig_Node_Text
106
     * @throws Twig_Error_Syntax
107
     */
108
    protected function parseWith()
109
    {
110
        $stream = $this->parser->getStream();
111
        $expressionParser = $this->parser->getExpressionParser();
112
113
        // Is there an options param?
114
        if ($stream->test(Twig_Token::NAME_TYPE, 'with')) {
115
            $stream->next();
116
            return $expressionParser->parseExpression();
117
        }
118
119
        return null;
120
    }
121
122
    /**
123
     * @param Twig_Token $token
124
     *
125
     * @return bool
126
     */
127
    public function decideBlockEnd(Twig_Token $token): bool
128
    {
129
        return $token->test('end' . strtolower($this->getTag()));
130
    }
131
}
132