@@ -24,6 +24,37 @@ function readGrammarFile(filename, significantScopeLast) {
2424 when we generate schema for SublimeText.
2525 */
2626
27+ function _apply ( obj ) {
28+ if ( obj instanceof Array ) {
29+ for ( var i = 0 ; i < obj . length ; i ++ ) {
30+ _apply ( obj [ i ] ) ;
31+ }
32+ }
33+ else if ( obj && typeof obj == 'object' ) {
34+ if ( obj . $apply && obj . $apply instanceof Array ) {
35+ var specs = obj . $apply ;
36+ for ( var i = 0 ; i < specs . length ; i ++ ) {
37+ var spec = specs [ i ] ;
38+
39+ var inner = read ( path . join ( path . dirname ( filename ) ,
40+ spec . file ) ,
41+ spec . vars ) ;
42+ var inner_keys = Object . keys ( inner ) ;
43+ for ( var j = 0 ; j < inner_keys . length ; j ++ ) {
44+ obj [ inner_keys [ j ] ] = inner [ inner_keys [ j ] ] ;
45+ }
46+ }
47+ delete obj [ '$apply' ] ;
48+ }
49+ else {
50+ var keys = Object . keys ( obj ) ;
51+ for ( var i = 0 ; i < keys . length ; i ++ ) {
52+ _apply ( obj [ keys [ i ] ] ) ;
53+ }
54+ }
55+ }
56+ }
57+
2758 function read ( filename , vars ) {
2859 var yamlSource = fs . readFileSync ( filename , 'utf8' ) ,
2960 hop = Object . prototype . hasOwnProperty ;
@@ -41,25 +72,7 @@ function readGrammarFile(filename, significantScopeLast) {
4172 }
4273
4374 var schema = yaml . safeLoad ( yamlSource ) ;
44-
45- if ( schema . repository
46- && schema . repository . $apply
47- && schema . repository . $apply instanceof Array )
48- {
49- var specs = schema . repository . $apply ;
50- for ( var i = 0 ; i < specs . length ; i ++ ) {
51- var spec = specs [ i ] ;
52-
53- var inner = read ( path . join ( path . dirname ( filename ) ,
54- spec . file ) ,
55- spec . vars ) ;
56-
57- _ . extend ( schema . repository , inner . repository ) ;
58- }
59-
60- delete schema . repository . $apply ;
61- }
62-
75+ _apply ( schema ) ;
6376 return schema ;
6477 }
6578
0 commit comments