@@ -26,16 +26,17 @@ public function parse($input)
26
26
27
27
$ this ->lexer ->moveNext ();
28
28
29
- $ prefiltered = $ this ->collectPreFiltered ($ input );
29
+ $ preFiltered = $ this ->collectPreFiltered ($ input );
30
30
31
31
$ filters = [];
32
32
while ($ this ->lexer ->isNextToken (BladeFilterLexer::T_PIPE )) {
33
- $ this ->lexer ->moveNext (); //skip pipe
34
- $ this ->Filters ($ filters );
33
+ $ this ->lexer ->moveNext (); // Skip pipe
34
+
35
+ $ this ->Filters ($ filters );
35
36
}
36
37
37
38
return [
38
- 'prefiltered ' => $ prefiltered ,
39
+ 'prefiltered ' => $ preFiltered ,
39
40
'filters ' => $ filters
40
41
];
41
42
}
@@ -54,25 +55,23 @@ private function collectPreFiltered(string $input)
54
55
return $ input ;
55
56
}
56
57
57
- $ prefiltered = trim ($ this ->lexer ->getInputUntilPosition ($ this ->lexer ->lookahead ['position ' ]));
58
- if ($ prefiltered && $ prefiltered [0 ] === '( ' ) {
59
- $ prefiltered = trim ($ prefiltered , '() ' );
58
+ $ preFiltered = trim ($ this ->lexer ->getInputUntilPosition ($ this ->lexer ->lookahead ['position ' ]));
59
+ if ($ preFiltered && $ preFiltered [0 ] === '( ' ) {
60
+ $ preFiltered = trim ($ preFiltered , '() ' );
60
61
}
61
62
62
- return $ prefiltered ;
63
+ return $ preFiltered ;
63
64
}
64
65
65
66
private function Filters (&$ filters )
66
67
{
67
- $ this ->lexer ->moveNext ();
68
-
69
- $ this ->syntaxErrorIf (null === $ this ->lexer ->token , sprintf ('No filter found ' ));
68
+ $ this ->syntaxErrorIf (null === $ this ->lexer ->lookahead , sprintf ('No filter found ' ));
69
+ $ this ->match (BladeFilterLexer::T_VARIABLE_NAME , sprintf ('Filter name is not valid, "%s" ' , $ this ->lexer ->lookahead ['value ' ]));
70
70
71
71
$ filter = [];
72
72
$ filter ['name ' ] = $ this ->lexer ->token ['value ' ];
73
73
$ filterArguments = [];
74
74
$ filter ['arguments ' ] = &$ filterArguments ;
75
-
76
75
$ filters [] = $ filter ;
77
76
78
77
$ next = $ this ->lexer ->lookahead ;
@@ -81,7 +80,7 @@ private function Filters(&$filters)
81
80
}
82
81
83
82
if ($ next ['type ' ] == BladeFilterLexer::T_COLON ) {
84
- $ this ->lexer ->moveNext ();
83
+ $ this ->lexer ->moveNext (); //Skip to colon
85
84
86
85
list ($ argName , $ argValue ) = $ this ->collectFilterArgument ();
87
86
$ filterArguments [$ argName ] = $ argValue ;
@@ -97,20 +96,20 @@ private function Filters(&$filters)
97
96
$ this ->Filters ($ filters );
98
97
} else if (null !== $ this ->lexer ->token ) {
99
98
$ this ->syntaxErrorIf (true ,
100
- sprintf ('It supposed to be another argument, or filter, but %s given ' , $ this ->lexer ->token ['value ' ],
99
+ sprintf ('It supposed to be another argument, or filter, but "%s" given ' , $ this ->lexer ->token ['value ' ],
101
100
)
102
101
);
103
102
}
104
103
105
104
$ this ->lexer ->moveNext ();
106
105
}
107
106
} else if ($ next ['type ' ] == BladeFilterLexer::T_PIPE ) {
108
- $ this ->lexer ->moveNext ();
107
+ $ this ->lexer ->moveNext (); //Skip to pipe
109
108
110
109
$ this ->Filters ($ filters );
111
110
} else if (null !== $ next ){
112
111
$ this ->syntaxErrorIf (true , sprintf (
113
- 'It supposed to be either arguments after filter or another filter, but %s given ' ,
112
+ 'It supposed to be either arguments after filter or another filter, but "%s" given ' ,
114
113
$ next ['value ' ]
115
114
));
116
115
}
@@ -123,47 +122,55 @@ private function Filters(&$filters)
123
122
*/
124
123
private function collectFilterArgument (): array
125
124
{
126
- $ this ->lexer ->moveNext ();
127
-
128
125
// Argument name
129
- $ token = $ this ->lexer ->token ;
130
- $ this ->syntaxErrorIf (null === $ token ,
131
- sprintf ('No arguments found after ":" ' )
126
+ $ next = $ this ->lexer ->lookahead ;
127
+ $ this ->syntaxErrorIf (null === $ next ,
128
+ sprintf ('No arguments found after %s ' , $ this -> lexer -> token [ ' value ' ] )
132
129
);
133
- $ this ->syntaxErrorIf (BladeFilterLexer::T_PIPE === $ token ['type ' ],
130
+ $ this ->syntaxErrorIf (BladeFilterLexer::T_PIPE === $ next ['type ' ],
134
131
sprintf ('No argument found ' )
135
132
);
136
- $ this ->syntaxErrorIf (BladeFilterLexer::T_LITERAL !== $ token ['type ' ],
137
- sprintf ('The argument name must be literal, however %s given, for filter %s ' ,
138
- $ token ['value ' ],
139
- $ this ->input ,
140
- )
133
+ $ this ->syntaxErrorIf (BladeFilterLexer::T_VARIABLE_NAME !== $ next ['type ' ],
134
+ sprintf ('The argument name must be literal, however "%s" given ' ,$ next ['value ' ])
141
135
);
142
- $ argumentName = $ token ['value ' ];
136
+
137
+ $ this ->lexer ->moveNext ();
138
+ $ argumentName = $ this ->lexer ->token ['value ' ];
143
139
144
140
// Equal sign
145
141
$ this ->match (
146
142
BladeFilterLexer::T_EQUALS ,
147
- sprintf ('No equal sign found after argument %s ' ,$ argumentName )
143
+ sprintf ('No equal sign found after argument "%s" ' ,$ argumentName )
148
144
);
149
145
150
146
// Argument value
151
- $ this ->lexer ->moveNext ();
152
- $ token = $ this ->lexer ->token ;
147
+ $ token = $ this ->lexer ->lookahead ;
153
148
$ this ->syntaxErrorIf (null === $ token ,
154
- sprintf ('No value specified for argument %s ' ,$ argumentName )
149
+ sprintf ('No value specified for argument "%s" ' ,$ argumentName )
155
150
);
156
- $ argumentValue = $ token ['value ' ];
151
+ $ isValidArgumentValue = $ this ->lexer ->isNextTokenAny ([
152
+ BladeFilterLexer::T_INTEGER ,
153
+ BladeFilterLexer::T_STRING ,
154
+ BladeFilterLexer::T_FLOAT ,
155
+ BladeFilterLexer::T_VARIABLE_EXPRESSION ,
156
+ ]);
157
+
158
+ $ this ->syntaxErrorIf (!$ isValidArgumentValue ,
159
+ sprintf (' The value of filter argument "%s" is not valid, it supposed to be string, integer, float or variable, got %s ' ,
160
+ $ argumentName ,
161
+ $ token ['value ' ]
162
+ ));
163
+ $ this ->lexer ->moveNext ();
157
164
158
- return [$ argumentName , $ argumentValue ];
165
+ return [$ argumentName , $ token [ ' value ' ] ];
159
166
}
160
167
161
168
private function syntaxErrorIf (bool $ predicate , string $ errMessage , ?array $ token = null )
162
169
{
163
170
$ errMessage = sprintf ('%s for filter "%s" ' , $ errMessage , $ this ->input );
164
171
165
172
if ($ token === null ) {
166
- $ token = $ this ->lexer ->token ;
173
+ $ token = $ this ->lexer ->lookahead ;
167
174
}
168
175
if (null !== $ token ) {
169
176
$ errMessage = sprintf ('%s at position %s ' ,$ errMessage , $ token ['position ' ] );
@@ -176,8 +183,8 @@ private function syntaxErrorIf(bool $predicate, string $errMessage, ?array $toke
176
183
177
184
private function match (int $ token , $ message ): bool
178
185
{
179
- if (! $ this ->lexer ->isNextToken ($ token )) {
180
- throw $ this ->syntaxErrorIf (true , $ this -> lexer -> getLiteral ( $ token ), $ message );
186
+ if (!$ this ->lexer ->isNextToken ($ token )) {
187
+ throw $ this ->syntaxErrorIf (true , $ message );
181
188
}
182
189
183
190
return $ this ->lexer ->moveNext ();
0 commit comments