@@ -4,12 +4,16 @@ import { removeQuotes } from '../utils/strings';
4
4
import { LanguageId } from './embeddedSupport' ;
5
5
6
6
export type RegionType = 'template' | 'script' | 'style' | 'custom' ;
7
+ export type RegionAttrKey = 'setup' | 'module' | 'scoped' | 'lang' ;
8
+
9
+ export type RegionAttrs = Partial < Record < RegionAttrKey , boolean | string > > & Partial < Record < string , boolean | string > > ;
7
10
8
11
export interface EmbeddedRegion {
9
12
languageId : LanguageId ;
10
13
start : number ;
11
14
end : number ;
12
15
type : RegionType ;
16
+ attrs : RegionAttrs ;
13
17
}
14
18
15
19
const defaultScriptLang = 'javascript' ;
@@ -22,6 +26,7 @@ export function parseVueDocumentRegions(document: TextDocument) {
22
26
let lastTagName = '' ;
23
27
let lastAttributeName = '' ;
24
28
let languageIdFromType : LanguageId | '' = '' ;
29
+ let attrs : Partial < Record < string , boolean | string > > = { } ;
25
30
const importedScripts : string [ ] = [ ] ;
26
31
let stakes = 0 ;
27
32
@@ -35,7 +40,8 @@ export function parseVueDocumentRegions(document: TextDocument) {
35
40
: defaultCSSLang ,
36
41
start : scanner . getTokenOffset ( ) ,
37
42
end : scanner . getTokenEnd ( ) ,
38
- type : 'style'
43
+ type : 'style' ,
44
+ attrs
39
45
} ) ;
40
46
languageIdFromType = '' ;
41
47
break ;
@@ -44,7 +50,8 @@ export function parseVueDocumentRegions(document: TextDocument) {
44
50
languageId : languageIdFromType ? languageIdFromType : defaultScriptLang ,
45
51
start : scanner . getTokenOffset ( ) ,
46
52
end : scanner . getTokenEnd ( ) ,
47
- type : 'script'
53
+ type : 'script' ,
54
+ attrs
48
55
} ) ;
49
56
languageIdFromType = '' ;
50
57
break ;
@@ -67,23 +74,24 @@ export function parseVueDocumentRegions(document: TextDocument) {
67
74
break ;
68
75
case HtmlTokenType . AttributeName :
69
76
lastAttributeName = scanner . getTokenText ( ) ;
77
+ attrs [ lastAttributeName ] = true ;
70
78
break ;
71
79
case HtmlTokenType . AttributeValue :
80
+ const attrValue = removeQuotes ( scanner . getTokenText ( ) ) ;
72
81
if ( lastAttributeName === 'lang' ) {
73
- languageIdFromType = getLanguageIdFromLangAttr ( scanner . getTokenText ( ) ) ;
82
+ languageIdFromType = getLanguageIdFromLangAttr ( attrValue ) ;
74
83
} else {
75
84
if ( lastAttributeName === 'src' && lastTagName . toLowerCase ( ) === 'script' ) {
76
- let value = scanner . getTokenText ( ) ;
77
- if ( value [ 0 ] === "'" || value [ 0 ] === '"' ) {
78
- value = value . slice ( 1 , value . length - 1 ) ;
79
- }
85
+ const value = attrValue ;
80
86
importedScripts . push ( value ) ;
81
87
}
82
88
}
89
+ attrs [ lastAttributeName ] = attrValue ;
83
90
lastAttributeName = '' ;
84
91
break ;
85
92
case HtmlTokenType . StartTagSelfClose :
86
93
case HtmlTokenType . EndTagClose :
94
+ attrs = { } ;
87
95
stakes -- ;
88
96
lastAttributeName = '' ;
89
97
languageIdFromType = '' ;
@@ -104,6 +112,7 @@ function scanTemplateRegion(scanner: Scanner, text: string): EmbeddedRegion | nu
104
112
let token = - 1 ;
105
113
let start = 0 ;
106
114
let end : number ;
115
+ const attrs : Partial < Record < string , boolean | string > > = { } ;
107
116
108
117
// Scan until finding matching template EndTag
109
118
// Also record immediate next StartTagClose to find start
@@ -138,9 +147,14 @@ function scanTemplateRegion(scanner: Scanner, text: string): EmbeddedRegion | nu
138
147
if ( start === 0 ) {
139
148
if ( token === HtmlTokenType . AttributeName ) {
140
149
lastAttributeName = scanner . getTokenText ( ) ;
150
+ attrs [ lastAttributeName ] = true ;
141
151
} else if ( token === HtmlTokenType . AttributeValue ) {
152
+ const attrValue = removeQuotes ( scanner . getTokenText ( ) ) ;
142
153
if ( lastAttributeName === 'lang' ) {
143
- languageId = getLanguageIdFromLangAttr ( scanner . getTokenText ( ) ) ;
154
+ languageId = getLanguageIdFromLangAttr ( attrValue ) ;
155
+ }
156
+ if ( lastAttributeName ) {
157
+ attrs [ lastAttributeName ] = attrValue ;
144
158
}
145
159
lastAttributeName = null ;
146
160
} else if ( token === HtmlTokenType . StartTagClose ) {
@@ -168,7 +182,8 @@ function scanTemplateRegion(scanner: Scanner, text: string): EmbeddedRegion | nu
168
182
languageId,
169
183
start,
170
184
end : offset ,
171
- type : 'template'
185
+ type : 'template' ,
186
+ attrs
172
187
} ;
173
188
}
174
189
}
@@ -185,7 +200,8 @@ function scanTemplateRegion(scanner: Scanner, text: string): EmbeddedRegion | nu
185
200
languageId,
186
201
start,
187
202
end,
188
- type : 'template'
203
+ type : 'template' ,
204
+ attrs
189
205
} ;
190
206
}
191
207
@@ -195,11 +211,12 @@ function scanCustomRegion(tagName: string, scanner: Scanner, text: string): Embe
195
211
let token = - 1 ;
196
212
let start = 0 ;
197
213
let end : number ;
214
+ const attrs : Partial < Record < string , boolean | string > > = { } ;
198
215
199
216
// Scan until finding matching template EndTag
200
217
// Also record immediate next StartTagClose to find start
201
218
let unClosedTag = 1 ;
202
- let lastAttributeName = null ;
219
+ let lastAttributeName : string | null = null ;
203
220
while ( unClosedTag !== 0 ) {
204
221
token = scanner . scan ( ) ;
205
222
@@ -210,9 +227,14 @@ function scanCustomRegion(tagName: string, scanner: Scanner, text: string): Embe
210
227
if ( start === 0 ) {
211
228
if ( token === HtmlTokenType . AttributeName ) {
212
229
lastAttributeName = scanner . getTokenText ( ) ;
230
+ attrs [ lastAttributeName ] = true ;
213
231
} else if ( token === HtmlTokenType . AttributeValue ) {
232
+ const attrValue = removeQuotes ( scanner . getTokenText ( ) ) ;
214
233
if ( lastAttributeName === 'lang' ) {
215
- languageId = getLanguageIdFromLangAttr ( scanner . getTokenText ( ) ) ;
234
+ languageId = getLanguageIdFromLangAttr ( attrValue ) ;
235
+ }
236
+ if ( lastAttributeName ) {
237
+ attrs [ lastAttributeName ] = attrValue ;
216
238
}
217
239
lastAttributeName = null ;
218
240
} else if ( token === HtmlTokenType . StartTagClose ) {
@@ -240,7 +262,8 @@ function scanCustomRegion(tagName: string, scanner: Scanner, text: string): Embe
240
262
languageId,
241
263
start,
242
264
end : offset ,
243
- type : 'custom'
265
+ type : 'custom' ,
266
+ attrs
244
267
} ;
245
268
}
246
269
}
@@ -257,12 +280,12 @@ function scanCustomRegion(tagName: string, scanner: Scanner, text: string): Embe
257
280
languageId,
258
281
start,
259
282
end,
260
- type : 'custom'
283
+ type : 'custom' ,
284
+ attrs
261
285
} ;
262
286
}
263
287
264
- function getLanguageIdFromLangAttr ( lang : string ) : LanguageId {
265
- let languageIdFromType = removeQuotes ( lang ) ;
288
+ function getLanguageIdFromLangAttr ( languageIdFromType : string ) : LanguageId {
266
289
if ( languageIdFromType === 'jade' ) {
267
290
languageIdFromType = 'pug' ;
268
291
}
0 commit comments