@@ -19,7 +19,7 @@ PhpjsUtil._commentBlocks = function(code) {
19
19
raise = false ;
20
20
}
21
21
if ( ! commentBlocks [ cnt ] ) {
22
- commentBlocks [ cnt ] = { clean : [ ] , raw : [ ] , } ;
22
+ commentBlocks [ cnt ] = { clean : [ ] , raw : [ ] } ;
23
23
}
24
24
25
25
commentBlocks [ cnt ] . clean . push ( comment [ 2 ] . trim ( ) ) ;
@@ -30,7 +30,7 @@ PhpjsUtil._commentBlocks = function(code) {
30
30
}
31
31
32
32
return commentBlocks ;
33
- }
33
+ } ;
34
34
35
35
PhpjsUtil . _headKeys = function ( headLines ) {
36
36
var i ;
@@ -50,7 +50,7 @@ PhpjsUtil._headKeys = function(headLines) {
50
50
if ( ( dmatch = key . match ( / ^ ( \w + ) \s + ( \d + ) $ / ) ) ) {
51
51
// Things like examples and notes can be grouped
52
52
key = dmatch [ 1 ] ;
53
- num = dmatch [ 2 ] - 1 ;
53
+ num = dmatch [ 2 ] - 1 ;
54
54
55
55
if ( ! keys [ key ] ) {
56
56
keys [ key ] = [ ] ;
@@ -68,7 +68,39 @@ PhpjsUtil._headKeys = function(headLines) {
68
68
}
69
69
70
70
return keys ;
71
- }
71
+ } ;
72
+
73
+ PhpjsUtil . _loadDependencies = function ( headKeys , dependencies , cb ) {
74
+ var self = this ;
75
+
76
+ if ( ! headKeys [ 'depends on' ] || ! headKeys [ 'depends on' ] . length ) {
77
+ if ( cb ) {
78
+ cb ( null , { } ) ;
79
+ }
80
+ }
81
+
82
+ var i ;
83
+ var name ;
84
+ var loaded = 0 ;
85
+ for ( i in headKeys [ 'depends on' ] ) {
86
+ name = headKeys [ 'depends on' ] [ i ] ;
87
+
88
+ self . load ( name , function ( err , params ) {
89
+ if ( err ) {
90
+ return cb ( err ) ;
91
+ }
92
+
93
+ dependencies [ name ] = params ;
94
+ self . _loadDependencies ( params . headKeys , dependencies ) ;
95
+
96
+ loaded ++ ;
97
+
98
+ if ( cb && loaded === headKeys [ 'depends on' ] . length ) {
99
+ cb ( null , dependencies ) ;
100
+ }
101
+ } ) ;
102
+ }
103
+ } ;
72
104
73
105
PhpjsUtil . parse = function ( name , code , cb ) {
74
106
var commentBlocks = this . _commentBlocks ( code ) ;
@@ -78,31 +110,75 @@ PhpjsUtil.parse = function(name, code, cb) {
78
110
var headKeys = this . _headKeys ( commentBlocks [ 0 ] . clean ) ;
79
111
80
112
// @todo (kvz) If we add function signature, we can use
81
- // body to generate CommonJs compatible output
113
+ // body to generate CommonJs compatible output
82
114
// in the browser.
83
- cb ( null , {
84
- headKeys : headKeys ,
85
- body : body ,
86
- head : head ,
87
- name : name ,
88
- code : code ,
89
- commentBlocks : commentBlocks ,
115
+
116
+ this . _loadDependencies ( headKeys , { } , function ( err , dependencies ) {
117
+ if ( err ) {
118
+ return cb ( err ) ;
119
+ }
120
+ cb ( null , {
121
+ headKeys : headKeys ,
122
+ body : body ,
123
+ head : head ,
124
+ name : name ,
125
+ code : code ,
126
+ dependencies : dependencies ,
127
+ commentBlocks : commentBlocks
128
+ } ) ;
129
+ } ) ;
130
+ } ;
131
+
132
+ PhpjsUtil . opener = function ( name , cb ) {
133
+ return cb ( 'Please override with a method that can translate a function-name to code in your environment' ) ;
134
+ } ;
135
+
136
+ PhpjsUtil . load = function ( name , cb ) {
137
+ var self = this ;
138
+ self . opener ( name , function ( err , code ) {
139
+ if ( err ) {
140
+ return cb ( err ) ;
141
+ }
142
+
143
+ self . parse ( name , code , function ( err , params ) {
144
+ if ( err ) {
145
+ return cb ( err ) ;
146
+ }
147
+
148
+ return cb ( null , params ) ;
149
+ } ) ;
90
150
} ) ;
91
151
} ;
92
152
93
153
PhpjsUtil . test = function ( params , cb ) {
94
154
var i = 0 ;
95
155
var j = 0 ;
156
+ var d = 0 ;
157
+ var self = this ;
96
158
97
- // @todo (kvz)L if a function depends, we need to recursively
98
- // add those.. needs to be done with callbacks cause
99
- // getting code in browser / cli is very different..
100
- eval ( params [ 'code' ] ) ;
101
- for ( i in params [ 'headKeys' ] [ 'example' ] ) {
102
159
160
+ var codes = [ ] ;
161
+ // Push own code onto stack
162
+ codes . push ( params [ 'code' ] ) ;
163
+ // Push dependencies onto stack
164
+ for ( d in params [ 'dependencies' ] ) {
165
+ codes . push ( params [ 'dependencies' ] [ d ] [ 'code' ] ) ;
166
+ }
167
+
168
+ // Reverse stack so dependencies are loaded first
169
+ codes = codes . reverse ( ) ;
170
+
171
+ // console.log(codes);
172
+
173
+ // Load code
174
+ eval ( codes . join ( '\n' ) ) ;
175
+
176
+
177
+ // Run each example
178
+ for ( i in params [ 'headKeys' ] [ 'example' ] ) {
103
179
var test = {
104
180
example : params [ 'headKeys' ] [ 'example' ] [ i ] . join ( '\n' ) ,
105
- number : i ,
181
+ number : i
106
182
} ;
107
183
108
184
// Needs an eval so types are cast properly, also, expected may
@@ -114,13 +190,12 @@ PhpjsUtil.test = function(params, cb) {
114
190
eval ( 'test.result = ' + params [ 'headKeys' ] [ 'example' ] [ i ] [ j ] + '' ) ;
115
191
}
116
192
117
-
118
193
if ( test . expected !== test . result ) {
119
- var msg = 'Expected: ' + JSON . stringify ( test . expected , undefined , 2 ) +
194
+ var err = 'Expected: ' + JSON . stringify ( test . expected , undefined , 2 ) +
120
195
' but returned: ' + JSON . stringify ( test . result , undefined , 2 ) ;
121
- cb ( msg , test , params ) ;
196
+ cb ( err , test , params ) ;
122
197
} else {
123
- cb ( null , test , params )
198
+ cb ( null , test , params ) ;
124
199
}
125
200
}
126
201
} ;
0 commit comments