@@ -31,6 +31,24 @@ for (var i = 0; i < 4; i++) {
31
31
}
32
32
var startsWithToken = new RegExp ( '^' + TOKEN ) ;
33
33
34
+ function matchAll ( s , r ) {
35
+ var origIndex = r . lastIndex ;
36
+
37
+ var matches = [ ] ;
38
+ var matchObj ;
39
+
40
+ while ( ( matchObj = r . exec ( s ) ) ) {
41
+ matches . push ( matchObj ) ;
42
+ if ( r . lastIndex === matchObj . index ) {
43
+ r . lastIndex += 1 ;
44
+ }
45
+ }
46
+
47
+ r . lastIndex = origIndex ;
48
+
49
+ return matches ;
50
+ }
51
+
34
52
function parseInternal ( string , env , opts ) {
35
53
if ( ! opts ) {
36
54
opts = { } ;
@@ -43,9 +61,9 @@ function parseInternal(string, env, opts) {
43
61
'(' + BAREWORD + '|' + SINGLE_QUOTE + '|' + DOUBLE_QUOTE + ')+'
44
62
] . join ( '|' ) , 'g' ) ;
45
63
46
- var matches = string . match ( chunker ) ;
64
+ var matches = matchAll ( string , chunker ) ;
47
65
48
- if ( ! matches ) {
66
+ if ( matches . length === 0 ) {
49
67
return [ ] ;
50
68
}
51
69
if ( ! env ) {
@@ -68,8 +86,9 @@ function parseInternal(string, env, opts) {
68
86
return pre + r ;
69
87
}
70
88
71
- return matches . filter ( Boolean ) . map ( function ( s , j , match ) {
72
- if ( commented ) {
89
+ return matches . map ( function ( match ) {
90
+ var s = match [ 0 ] ;
91
+ if ( ! s || commented ) {
73
92
return void undefined ;
74
93
}
75
94
if ( controlRE . test ( s ) ) {
@@ -157,7 +176,7 @@ function parseInternal(string, env, opts) {
157
176
return { op : s } ;
158
177
} else if ( hash . test ( c ) ) {
159
178
commented = true ;
160
- var commentObj = { comment : s . slice ( i + 1 ) + match . slice ( j + 1 ) . join ( ' ' ) } ;
179
+ var commentObj = { comment : string . slice ( match . index + i + 1 ) } ;
161
180
if ( out . length ) {
162
181
return [ out , commentObj ] ;
163
182
}
@@ -177,6 +196,7 @@ function parseInternal(string, env, opts) {
177
196
178
197
return out ;
179
198
} ) . reduce ( function ( prev , arg ) { // finalize parsed arguments
199
+ // TODO: replace this whole reduce with a concat
180
200
return typeof arg === 'undefined' ? prev : prev . concat ( arg ) ;
181
201
} , [ ] ) ;
182
202
}
0 commit comments