11import {
22 languages ,
33 Range ,
4+ workspace ,
45 ExtensionContext ,
56 CompletionItemProvider ,
67 TextDocument ,
@@ -27,16 +28,34 @@ class ClassCompletionItemProvider implements CompletionItemProvider {
2728 readonly findLinkRel = / r e l \s * = \s * ( [ " ' ] ) ( (?: (? ! \1) .) + ) \1/ si;
2829 readonly findLinkHref = / h r e f \s * = \s * ( [ " ' ] ) ( (?: (? ! \1) .) + ) \1/ si;
2930
31+ remoteStyles : string [ ] = [ ] ;
32+
33+ constructor ( context : ExtensionContext ) {
34+ this . parseRemoteConfig ( ) ;
35+
36+ context . subscriptions . push ( workspace . onDidChangeConfiguration ( e => this . parseRemoteConfig ( ) ) ) ;
37+ }
38+
39+ parseRemoteConfig ( ) {
40+ const config = workspace . getConfiguration ( 'css' ) ;
41+ const hrefs = config . get ( 'remoteStyleSheets' ) as string [ ] ;
42+
43+ if ( hrefs ) {
44+ this . remoteStyles = hrefs ;
45+ }
46+ }
47+
3048 fetchRemoteStyleSheet ( href : string ) : Thenable < Map < string , CompletionItem > > {
31- return new Promise ( ( resolve ) => {
49+
50+ return new Promise ( resolve => {
3251 const selectors = this . cache . get ( href ) ;
3352
3453 if ( selectors ) {
3554 resolve ( selectors ) ;
3655 } else {
3756 const selectors = new Map < string , CompletionItem > ( ) ;
3857
39- fetch ( href ) . then ( res => {
58+ fetch ( href ) . then ( res => {
4059 if ( res . status === 200 ) {
4160 res . text ( ) . then ( text => {
4261 walk ( parse ( text ) , ( node ) => {
@@ -57,8 +76,8 @@ class ClassCompletionItemProvider implements CompletionItemProvider {
5776 } ) ;
5877 }
5978
60- findRemoteStyleSheets ( text : string ) : Thenable < Map < string , CompletionItem > > {
61- return new Promise ( ( resolve ) => {
79+ findDocumentLinks ( text : string ) : Thenable < Map < string , CompletionItem > > {
80+ return new Promise ( resolve => {
6281 const links = new Map < string , CompletionItem > ( ) ;
6382 const findLinks = / < l i n k ( [ ^ > ] + ) > / gi;
6483 const promises = [ ] ;
@@ -83,6 +102,21 @@ class ClassCompletionItemProvider implements CompletionItemProvider {
83102 } ) ;
84103 }
85104
105+ findRemoteStyles ( ) : Thenable < Map < string , CompletionItem > > {
106+ return new Promise ( resolve => {
107+ const links = new Map < string , CompletionItem > ( ) ;
108+ const promises = [ ] ;
109+
110+ for ( let i = 0 ; i < this . remoteStyles . length ; i ++ ) {
111+ promises . push ( this . fetchRemoteStyleSheet ( this . remoteStyles [ i ] ) . then ( items => {
112+ items . forEach ( ( value , key ) => links . set ( key , value ) ) ;
113+ } ) ) ;
114+ }
115+
116+ Promise . all ( promises ) . then ( ( ) => resolve ( links ) ) ;
117+ } ) ;
118+ }
119+
86120 provideCompletionItems (
87121 document : TextDocument ,
88122 position : Position ,
@@ -108,9 +142,13 @@ class ClassCompletionItemProvider implements CompletionItemProvider {
108142 } ) ;
109143 }
110144
111- this . findRemoteStyleSheets ( text ) . then ( links => {
145+ this . findDocumentLinks ( text ) . then ( links => {
112146 styles . forEach ( ( value , key ) => links . set ( key , value ) ) ;
113- resolve ( [ ...links . values ( ) ] ) ;
147+
148+ this . findRemoteStyles ( ) . then ( styles => {
149+ styles . forEach ( ( value , key ) => links . set ( key , value ) ) ;
150+ resolve ( [ ...links . values ( ) ] ) ;
151+ } ) ;
114152 } ) ;
115153 } else {
116154 reject ( ) ;
@@ -122,7 +160,7 @@ class ClassCompletionItemProvider implements CompletionItemProvider {
122160export function activate ( context : ExtensionContext ) {
123161 context . subscriptions . push (
124162 languages . registerCompletionItemProvider ( "html" ,
125- new ClassCompletionItemProvider ( ) , "\"" , "'" ) ) ;
163+ new ClassCompletionItemProvider ( context ) , "\"" , "'" ) ) ;
126164}
127165
128166export function deactivate ( ) { }
0 commit comments