Skip to content

Commit 533dd4d

Browse files
committed
bug #175 Fixes for PHP attribute parsing (wouterj)
This PR was squashed before being merged into the main branch. Discussion ---------- Fixes for PHP attribute parsing - No longer wrap the entire attribute in a span, but only wrap `#[Route` and `]` in spans (fixes #174) - `@javiereguiluz` for consistency with the real PHP highlight.js file, I've renamed `php-attributes` to `meta`. Is it OK for you to update the CSS on symfony.com to style `.hljs-meta` instead of `.hljs-php-attributes`? - Fixed not parsing attributes in parameters, see e.g. https://symfony.com/doc/current/controller.html#mapping-the-whole-query-string Commits ------- de706b5 Fixes for PHP attribute parsing
2 parents 81e707a + de706b5 commit 533dd4d

File tree

3 files changed

+87
-36
lines changed

3 files changed

+87
-36
lines changed

src/Templates/highlight.php/php.json

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,30 @@
1111
"keywords": "and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try match switch continue endfor endif declare unset true false goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",
1212
"contains": [
1313
{
14-
"className": "php-attribute",
15-
"begin": "#\\[\\s*(\\\\?[A-Z][A-Za-z0-9_\\x7f-\\xff]+|\\\\?[A-Z]+(?=[A-Z][a-z0-9_\\x7f-\\xff])){1,}(?![A-Za-z0-9])(?![$])",
14+
"className": "meta",
15+
"begin": "#\\[\\s*(\\\\?[A-Z][A-Za-z0-9_\\x7f-\\xff]+)+\\]"
16+
},
17+
{
18+
"begin": "#\\[\\s*(\\\\?[A-Z][A-Za-z0-9_\\x7f-\\xff]+)+(?![A-Za-z0-9])(?![$])",
1619
"end": "]",
20+
"returnBegin": true,
1721
"contains": [
22+
{
23+
"className": "meta",
24+
"begin": "#\\[\\s*(\\\\?[A-Z][A-Za-z0-9_\\x7f-\\xff]+)+(?![A-Za-z0-9])(?![$])"
25+
},
1826
{
1927
"begin": "\\(",
2028
"end": "\\)",
2129
"keywords": "true false null new array",
2230
"contains": {
23-
"$ref": "#contains.10.contains.1.contains"
31+
"$ref": "#contains.11.contains.1.contains"
2432
}
33+
},
34+
{
35+
"className": "meta",
36+
"begin": "]",
37+
"endsParent": true
2538
}
2639
]
2740
},
@@ -50,7 +63,7 @@
5063
"begin": "<\\?(php)?|\\?>"
5164
},
5265
{
53-
"$ref": "#contains.1.contains.0"
66+
"$ref": "#contains.2.contains.0"
5467
},
5568
{
5669
"className": "doctag",
@@ -69,7 +82,7 @@
6982
"begin": "@[A-Za-z]+"
7083
},
7184
{
72-
"$ref": "#contains.1.contains.0"
85+
"$ref": "#contains.2.contains.0"
7386
},
7487
{
7588
"className": "doctag",
@@ -84,7 +97,7 @@
8497
"end": false,
8598
"contains": [
8699
{
87-
"$ref": "#contains.1.contains.0"
100+
"$ref": "#contains.2.contains.0"
88101
},
89102
{
90103
"className": "doctag",
@@ -120,7 +133,7 @@
120133
]
121134
},
122135
{
123-
"$ref": "#contains.2.contains.0"
136+
"$ref": "#contains.3.contains.0"
124137
},
125138
{
126139
"className": "variable",
@@ -156,15 +169,15 @@
156169
"contains": [
157170
"self",
158171
{
159-
"$ref": "#contains.8"
172+
"$ref": "#contains.9"
160173
},
161174
{
162175
"className": "comment",
163176
"begin": "/\\*",
164177
"end": "\\*/",
165178
"contains": [
166179
{
167-
"$ref": "#contains.1.contains.0"
180+
"$ref": "#contains.2.contains.0"
168181
},
169182
{
170183
"className": "doctag",
@@ -177,10 +190,10 @@
177190
"className": "string",
178191
"contains": [
179192
{
180-
"$ref": "#contains.5.contains.0"
193+
"$ref": "#contains.6.contains.0"
181194
},
182195
{
183-
"$ref": "#contains.2.contains.0"
196+
"$ref": "#contains.3.contains.0"
184197
}
185198
],
186199
"variants": [
@@ -199,7 +212,7 @@
199212
"illegal": null,
200213
"contains": [
201214
{
202-
"$ref": "#contains.5.contains.0"
215+
"$ref": "#contains.6.contains.0"
203216
}
204217
]
205218
},
@@ -210,7 +223,7 @@
210223
"illegal": null,
211224
"contains": [
212225
{
213-
"$ref": "#contains.5.contains.0"
226+
"$ref": "#contains.6.contains.0"
214227
},
215228
{
216229
"className": "subst",
@@ -239,6 +252,12 @@
239252
"relevance": 0
240253
}
241254
]
255+
},
256+
{
257+
"$ref": "#contains.0"
258+
},
259+
{
260+
"$ref": "#contains.1"
242261
}
243262
]
244263
}
@@ -255,7 +274,7 @@
255274
"beginKeywords": "extends implements"
256275
},
257276
{
258-
"$ref": "#contains.10.contains.0"
277+
"$ref": "#contains.11.contains.0"
259278
}
260279
]
261280
},
@@ -265,7 +284,7 @@
265284
"illegal": "[\\.']",
266285
"contains": [
267286
{
268-
"$ref": "#contains.10.contains.0"
287+
"$ref": "#contains.11.contains.0"
269288
}
270289
]
271290
},
@@ -274,18 +293,18 @@
274293
"end": ";",
275294
"contains": [
276295
{
277-
"$ref": "#contains.10.contains.0"
296+
"$ref": "#contains.11.contains.0"
278297
}
279298
]
280299
},
281300
{
282301
"begin": "=>"
283302
},
284303
{
285-
"$ref": "#contains.10.contains.1.contains.3"
304+
"$ref": "#contains.11.contains.1.contains.3"
286305
},
287306
{
288-
"$ref": "#contains.10.contains.1.contains.4"
307+
"$ref": "#contains.11.contains.1.contains.4"
289308
}
290309
]
291310
}

tests/fixtures/expected/blocks/code-blocks/php-attributes.html

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div translate="no" data-loc="54" class="notranslate codeblock codeblock-length-md codeblock-php-attributes codeblock-php">
1+
<div translate="no" data-loc="65" class="notranslate codeblock codeblock-length-md codeblock-php-attributes codeblock-php">
22
<div class="codeblock-scroll">
33
<pre class="codeblock-lines">1
44
2
@@ -53,7 +53,18 @@
5353
51
5454
52
5555
53
56-
54</pre>
56+
54
57+
55
58+
56
59+
57
60+
58
61+
59
62+
60
63+
61
64+
62
65+
63
66+
64
67+
65</pre>
5768
<pre class="codeblock-code">
5869
<code>
5970
<span class="hljs-comment">// src/SomePath/SomeClass.php</span>
@@ -64,77 +75,87 @@
6475
<span class="hljs-title">SomeClass</span>
6576
</span>
6677
{
67-
<span class="hljs-php-attribute">#[AttributeName]</span>
78+
<span class="hljs-meta">#[AttributeName]</span>
6879
<span class="hljs-keyword">private</span>
6980
<span class="hljs-variable">
7081
<span class="hljs-variable-other-marker">$</span> property1</span>
7182
;
72-
<span class="hljs-php-attribute">#[AttributeName()]</span>
83+
<span class="hljs-meta">#[AttributeName</span>()<span class="hljs-meta">]</span>
7384
<span class="hljs-keyword">private</span>
7485
<span class="hljs-variable">
7586
<span class="hljs-variable-other-marker">$</span> property2</span>
7687
;
77-
<span class="hljs-php-attribute">#[AttributeName(<span class="hljs-string">'value'</span>)]</span>
88+
<span class="hljs-meta">#[AttributeName</span>(<span class="hljs-string">'value'</span>)<span class="hljs-meta">]</span>
7889
<span class="hljs-keyword">private</span>
7990
<span class="hljs-variable">
8091
<span class="hljs-variable-other-marker">$</span> property3</span>
8192
;
82-
<span class="hljs-php-attribute">#[AttributeName(<span class="hljs-string">'value'</span>, option: <span class="hljs-string">'value'</span>)]</span>
93+
<span class="hljs-meta">#[AttributeName</span>(<span class="hljs-string">'value'</span>, option: <span class="hljs-string">'value'</span>)<span class="hljs-meta">]</span>
8394
<span class="hljs-keyword">private</span>
8495
<span class="hljs-variable">
8596
<span class="hljs-variable-other-marker">$</span> property4</span>
8697
;
87-
<span class="hljs-php-attribute">#[AttributeName([<span class="hljs-string">'value'</span> =&gt; <span class="hljs-string">'value'</span>])]</span>
98+
<span class="hljs-meta">#[AttributeName</span>([<span class="hljs-string">'value'</span> =&gt; <span class="hljs-string">'value'</span>])<span class="hljs-meta">]</span>
8899
<span class="hljs-keyword">private</span>
89100
<span class="hljs-variable">
90101
<span class="hljs-variable-other-marker">$</span> property5</span>
91102
;
92-
<span class="hljs-php-attribute">#[AttributeName(
103+
<span class="hljs-meta">#[AttributeName</span>(
93104
<span class="hljs-string">'value'</span>,
94105
option: <span class="hljs-string">'value'</span>
95-
)]</span>
106+
)<span class="hljs-meta">]</span>
96107
<span class="hljs-keyword">private</span>
97108
<span class="hljs-variable">
98109
<span class="hljs-variable-other-marker">$</span> property6</span>
99110
;
100-
<span class="hljs-php-attribute">#[Assert\AttributeName(<span class="hljs-string">'value'</span>)]</span>
111+
<span class="hljs-meta">#[Assert\AttributeName</span>(<span class="hljs-string">'value'</span>)<span class="hljs-meta">]</span>
101112
<span class="hljs-keyword">private</span>
102113
<span class="hljs-variable">
103114
<span class="hljs-variable-other-marker">$</span> property7</span>
104115
;
105-
<span class="hljs-php-attribute">#[Assert\AttributeName(
116+
<span class="hljs-meta">#[Assert\AttributeName</span>(
106117
<span class="hljs-string">'value'</span>,
107118
option: <span class="hljs-string">'value'</span>
108-
)]</span>
119+
)<span class="hljs-meta">]</span>
109120
<span class="hljs-keyword">private</span>
110121
<span class="hljs-variable">
111122
<span class="hljs-variable-other-marker">$</span> property8</span>
112123
;
113-
<span class="hljs-php-attribute">#[Route(<span class="hljs-string">'/blog/{page&lt;\d+&gt;}'</span>, name: <span class="hljs-string">'blog_list'</span>)]</span>
124+
<span class="hljs-meta">#[Route</span>(<span class="hljs-string">'/blog/{page&lt;\d+&gt;}'</span>, name: <span class="hljs-string">'blog_list'</span>)<span class="hljs-meta">]</span>
114125
<span class="hljs-keyword">private</span>
115126
<span class="hljs-variable">
116127
<span class="hljs-variable-other-marker">$</span> property9</span>
117128
;
118-
<span class="hljs-php-attribute">#[Assert\GreaterThanOrEqual(
129+
<span class="hljs-meta">#[Assert\GreaterThanOrEqual</span>(
119130
value: <span class="hljs-number">18</span>,
120-
)]</span>
131+
)<span class="hljs-meta">]</span>
121132
<span class="hljs-keyword">private</span>
122133
<span class="hljs-variable">
123134
<span class="hljs-variable-other-marker">$</span> property10</span>
124135
;
125-
<span class="hljs-php-attribute">#[ORM\CustomIdGenerator(class: <span class="hljs-string">'doctrine.uuid_generator'</span>)]</span>
136+
<span class="hljs-meta">#[ORM\CustomIdGenerator</span>(class: <span class="hljs-string">'doctrine.uuid_generator'</span>)<span class="hljs-meta">]</span>
126137
<span class="hljs-keyword">private</span>
127138
<span class="hljs-variable">
128139
<span class="hljs-variable-other-marker">$</span> property11</span>
129140
;
130-
<span class="hljs-php-attribute">#[Assert\AtLeastOneOf([
141+
<span class="hljs-meta">#[Assert\AtLeastOneOf</span>([
131142
<span class="hljs-keyword">new</span> Assert\Regex(<span class="hljs-string">'/#/'</span>),
132143
<span class="hljs-keyword">new</span> Assert\Length(min: <span class="hljs-number">10</span>),
133-
])]</span>
144+
])<span class="hljs-meta">]</span>
134145
<span class="hljs-keyword">private</span>
135146
<span class="hljs-variable">
136147
<span class="hljs-variable-other-marker">$</span> property12</span>
137148
;
149+
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span><span class="hljs-params">(
150+
<span class="hljs-meta">#[TaggedIterator</span>(<span class="hljs-string">'app.handlers'</span>)<span class="hljs-meta">]</span>
151+
iterable <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>handlers</span>,
152+
)</span></span>{
153+
}
154+
155+
<span class="hljs-meta">#[AsController]</span>
156+
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-title">someAction</span><span class="hljs-params">(<span class="hljs-meta">#[CurrentUser]</span> User <span class="hljs-variable"><span class="hljs-variable-other-marker">$</span>user</span>)</span></span>
157+
{
158+
}
138159
}</code></pre>
139160
</div>
140161
</div>

tests/fixtures/source/blocks/code-blocks/php-attributes.rst

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,15 @@
5353
new Assert\Length(min: 10),
5454
])]
5555
private $property12;
56+
57+
public function __construct(
58+
#[TaggedIterator('app.handlers')]
59+
iterable $handlers,
60+
) {
61+
}
62+
63+
#[AsController]
64+
public function someAction(#[CurrentUser] User $user)
65+
{
66+
}
5667
}

0 commit comments

Comments
 (0)