Skip to content

Commit 26a3965

Browse files
committed
support highlighting embedded expressions inside vue directives
1 parent 6e787b5 commit 26a3965

File tree

2 files changed

+168
-36
lines changed

2 files changed

+168
-36
lines changed

vue.YAML-tmLanguage

+38-7
Original file line numberDiff line numberDiff line change
@@ -240,17 +240,13 @@ patterns:
240240

241241
repository:
242242

243-
string-entities:
243+
entities:
244244
patterns:
245245
- name: constant.character.entity.html
246246
match: (&)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)
247247
captures:
248248
'1': {name: punctuation.definition.entity.html}
249249
'3': {name: punctuation.definition.entity.html}
250-
251-
entities:
252-
patterns:
253-
- include: '#string-entities'
254250
- name: invalid.illegal.bad-ampersand.html
255251
match: '&'
256252

@@ -263,7 +259,7 @@ repository:
263259
endCaptures:
264260
'0': {name: punctuation.definition.string.end.html}
265261
patterns:
266-
- include: '#string-entities'
262+
- include: '#entities'
267263

268264
string-single-quoted:
269265
name: string.quoted.single.html
@@ -274,7 +270,38 @@ repository:
274270
endCaptures:
275271
'0': {name: punctuation.definition.string.end.html}
276272
patterns:
277-
- include: '#string-entities'
273+
- include: '#entities'
274+
275+
vue-directive:
276+
name: meta.directive.vue
277+
begin: (?:\b(v-)|(:|@))([a-zA-Z\-]+)(?:\:([a-zA-Z\-]+))?(?:\.([a-zA-Z\-]+))*\s*(=)
278+
end: (?<='|")
279+
captures:
280+
'1': {name: entity.other.attribute-name.html}
281+
'2': {name: punctuation.separator.key-value.html}
282+
'3': {name: entity.other.attribute-name.html}
283+
'4': {name: entity.other.attribute-name.html}
284+
'5': {name: entity.other.attribute-name.html}
285+
'6': {name: punctuation.separator.key-value.html}
286+
patterns:
287+
- name: source.directive.vue
288+
begin: '"'
289+
beginCaptures:
290+
'0': {name: punctuation.definition.string.begin.html}
291+
end: '"'
292+
endCaptures:
293+
'0': {name: punctuation.definition.string.end.html}
294+
patterns:
295+
- include: source.js
296+
- name: source.directive.vue
297+
begin: ''''
298+
beginCaptures:
299+
'0': {name: punctuation.definition.string.begin.html}
300+
end: ''''
301+
endCaptures:
302+
'0': {name: punctuation.definition.string.end.html}
303+
patterns:
304+
- include: source.js
278305

279306
tag-generic-attribute:
280307
name: entity.other.attribute-name.html
@@ -311,10 +338,12 @@ repository:
311338

312339
tag-stuff:
313340
patterns:
341+
- include: '#vue-directive'
314342
- include: '#tag-id-attribute'
315343
- include: '#tag-generic-attribute'
316344
- include: '#string-double-quoted'
317345
- include: '#string-single-quoted'
346+
318347
foldingStartMarker: |-
319348
(?x)
320349
(<(?i:head|body|table|thead|tbody|tfoot|tr|div|select|fieldset|style|script|ul|ol|li|form|dl)\b.*?>
@@ -324,6 +353,7 @@ foldingStartMarker: |-
324353
|\{\{?(if|foreach|capture|literal|foreach|php|section|strip)
325354
|\{\s*($|\?>\s*$|//|/\*(.*\*/\s*$|(?!.*?\*/)))
326355
)
356+
327357
foldingStopMarker: |-
328358
(?x)
329359
(</(?i:head|body|table|thead|tbody|tfoot|tr|div|select|fieldset|style|script|ul|ol|li|form|dl)>
@@ -333,4 +363,5 @@ foldingStopMarker: |-
333363
|\{\{?/(if|foreach|capture|literal|foreach|php|section|strip)
334364
|^[^{]*\}
335365
)
366+
336367
keyEquivalent: ^~H

vue.tmLanguage

+130-29
Original file line numberDiff line numberDiff line change
@@ -797,8 +797,23 @@
797797
<key>patterns</key>
798798
<array>
799799
<dict>
800-
<key>include</key>
801-
<string>#string-entities</string>
800+
<key>captures</key>
801+
<dict>
802+
<key>1</key>
803+
<dict>
804+
<key>name</key>
805+
<string>punctuation.definition.entity.html</string>
806+
</dict>
807+
<key>3</key>
808+
<dict>
809+
<key>name</key>
810+
<string>punctuation.definition.entity.html</string>
811+
</dict>
812+
</dict>
813+
<key>match</key>
814+
<string>(&amp;)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)</string>
815+
<key>name</key>
816+
<string>constant.character.entity.html</string>
802817
</dict>
803818
<dict>
804819
<key>match</key>
@@ -836,32 +851,7 @@
836851
<array>
837852
<dict>
838853
<key>include</key>
839-
<string>#string-entities</string>
840-
</dict>
841-
</array>
842-
</dict>
843-
<key>string-entities</key>
844-
<dict>
845-
<key>patterns</key>
846-
<array>
847-
<dict>
848-
<key>captures</key>
849-
<dict>
850-
<key>1</key>
851-
<dict>
852-
<key>name</key>
853-
<string>punctuation.definition.entity.html</string>
854-
</dict>
855-
<key>3</key>
856-
<dict>
857-
<key>name</key>
858-
<string>punctuation.definition.entity.html</string>
859-
</dict>
860-
</dict>
861-
<key>match</key>
862-
<string>(&amp;)([a-zA-Z0-9]+|#[0-9]+|#x[0-9a-fA-F]+)(;)</string>
863-
<key>name</key>
864-
<string>constant.character.entity.html</string>
854+
<string>#entities</string>
865855
</dict>
866856
</array>
867857
</dict>
@@ -893,7 +883,7 @@
893883
<array>
894884
<dict>
895885
<key>include</key>
896-
<string>#string-entities</string>
886+
<string>#entities</string>
897887
</dict>
898888
</array>
899889
</dict>
@@ -999,6 +989,10 @@
999989
<dict>
1000990
<key>patterns</key>
1001991
<array>
992+
<dict>
993+
<key>include</key>
994+
<string>#vue-directive</string>
995+
</dict>
1002996
<dict>
1003997
<key>include</key>
1004998
<string>#tag-id-attribute</string>
@@ -1017,6 +1011,113 @@
10171011
</dict>
10181012
</array>
10191013
</dict>
1014+
<key>vue-directive</key>
1015+
<dict>
1016+
<key>begin</key>
1017+
<string>(?:\b(v-)|(:|@))([a-zA-Z\-]+)(?:\:([a-zA-Z\-]+))?(?:\.([a-zA-Z\-]+))*\s*(=)</string>
1018+
<key>captures</key>
1019+
<dict>
1020+
<key>1</key>
1021+
<dict>
1022+
<key>name</key>
1023+
<string>entity.other.attribute-name.html</string>
1024+
</dict>
1025+
<key>2</key>
1026+
<dict>
1027+
<key>name</key>
1028+
<string>punctuation.separator.key-value.html</string>
1029+
</dict>
1030+
<key>3</key>
1031+
<dict>
1032+
<key>name</key>
1033+
<string>entity.other.attribute-name.html</string>
1034+
</dict>
1035+
<key>4</key>
1036+
<dict>
1037+
<key>name</key>
1038+
<string>entity.other.attribute-name.html</string>
1039+
</dict>
1040+
<key>5</key>
1041+
<dict>
1042+
<key>name</key>
1043+
<string>entity.other.attribute-name.html</string>
1044+
</dict>
1045+
<key>6</key>
1046+
<dict>
1047+
<key>name</key>
1048+
<string>punctuation.separator.key-value.html</string>
1049+
</dict>
1050+
</dict>
1051+
<key>end</key>
1052+
<string>(?&lt;='|")</string>
1053+
<key>name</key>
1054+
<string>meta.directive.vue</string>
1055+
<key>patterns</key>
1056+
<array>
1057+
<dict>
1058+
<key>begin</key>
1059+
<string>"</string>
1060+
<key>beginCaptures</key>
1061+
<dict>
1062+
<key>0</key>
1063+
<dict>
1064+
<key>name</key>
1065+
<string>punctuation.definition.string.begin.html</string>
1066+
</dict>
1067+
</dict>
1068+
<key>end</key>
1069+
<string>"</string>
1070+
<key>endCaptures</key>
1071+
<dict>
1072+
<key>0</key>
1073+
<dict>
1074+
<key>name</key>
1075+
<string>punctuation.definition.string.end.html</string>
1076+
</dict>
1077+
</dict>
1078+
<key>name</key>
1079+
<string>source.directive.vue</string>
1080+
<key>patterns</key>
1081+
<array>
1082+
<dict>
1083+
<key>include</key>
1084+
<string>source.js</string>
1085+
</dict>
1086+
</array>
1087+
</dict>
1088+
<dict>
1089+
<key>begin</key>
1090+
<string>'</string>
1091+
<key>beginCaptures</key>
1092+
<dict>
1093+
<key>0</key>
1094+
<dict>
1095+
<key>name</key>
1096+
<string>punctuation.definition.string.begin.html</string>
1097+
</dict>
1098+
</dict>
1099+
<key>end</key>
1100+
<string>'</string>
1101+
<key>endCaptures</key>
1102+
<dict>
1103+
<key>0</key>
1104+
<dict>
1105+
<key>name</key>
1106+
<string>punctuation.definition.string.end.html</string>
1107+
</dict>
1108+
</dict>
1109+
<key>name</key>
1110+
<string>source.directive.vue</string>
1111+
<key>patterns</key>
1112+
<array>
1113+
<dict>
1114+
<key>include</key>
1115+
<string>source.js</string>
1116+
</dict>
1117+
</array>
1118+
</dict>
1119+
</array>
1120+
</dict>
10201121
</dict>
10211122
<key>scopeName</key>
10221123
<string>text.html.vue</string>

0 commit comments

Comments
 (0)