Skip to content

Commit 88ebff6

Browse files
committed
split multiple expressions by unquoted commas
1 parent b9f62f7 commit 88ebff6

File tree

3 files changed

+75
-1
lines changed

3 files changed

+75
-1
lines changed

src/compiler.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ CompilerProto.compileNode = function (node) {
276276
while (i--) {
277277
attr = attrs[i]
278278
valid = false
279-
exps = attr.value.split(',')
279+
exps = Directive.split(attr.value)
280280
// loop through clauses (separated by ",")
281281
// inside each attribute
282282
j = exps.length

src/directive.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ var config = require('./config'),
44
filters = require('./filters'),
55

66
// Regexes!
7+
// regex to split multiple directive expressions
8+
SPLIT_RE = /(?:['"](?:\\.|[^'"])*['"]|\\.|[^,])+/g,
79
KEY_RE = /^[^\|]+/,
810
ARG_RE = /([^:]+):(.+)$/,
911
FILTERS_RE = /\|[^\|]+/g,
@@ -193,6 +195,16 @@ DirProto.unbind = function (update) {
193195
if (!update) this.vm = this.el = this.binding = this.compiler = null
194196
}
195197

198+
// exposed methods ------------------------------------------------------------
199+
200+
/**
201+
* split a unquoted-comma separated expression into
202+
* multiple clauses
203+
*/
204+
Directive.split = function (exp) {
205+
return exp.match(SPLIT_RE) || ['']
206+
}
207+
196208
/**
197209
* make sure the directive and expression is valid
198210
* before we create an instance

test/unit/specs/directive.js

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,68 @@ describe('UNIT: Directive', function () {
1111
}
1212
}
1313

14+
describe('.split()', function () {
15+
16+
it('should return array with one empty string for empty string', function () {
17+
var e = Directive.split('')
18+
assert.strictEqual(e.length, 1)
19+
assert.strictEqual(e[0], '')
20+
})
21+
22+
it('should return array with the string if it\'s a single clause', function () {
23+
var e,
24+
test1 = 'fsef',
25+
test2 = 'ffsef + "fse,fsef"',
26+
test3 = 'fsef + \'fesfsfe\'',
27+
test4 = '\"fsefsf,fsef,fsef\"'
28+
29+
e = Directive.split(test1)
30+
assert.strictEqual(e.length, 1)
31+
assert.strictEqual(e[0], test1)
32+
33+
e = Directive.split(test2)
34+
assert.strictEqual(e.length, 1)
35+
assert.strictEqual(e[0], test2)
36+
37+
e = Directive.split(test3)
38+
assert.strictEqual(e.length, 1)
39+
assert.strictEqual(e[0], test3)
40+
41+
e = Directive.split(test4)
42+
assert.strictEqual(e.length, 1)
43+
assert.strictEqual(e[0], test4)
44+
})
45+
46+
it('should return split multiple clauses correctly', function () {
47+
var e,
48+
test1 = ['fsef', 'fsf:fsefsef'],
49+
test2 = ['asf-fsef:fsf', '"efs,sefsf"'],
50+
test3 = ['\'fsef,sef\'', 'fse:fsf'],
51+
test4 = ['\"fsef,fsef\"', 'sefsef\'fesfsf']
52+
53+
e = Directive.split(test1.join(','))
54+
assert.strictEqual(e.length, 2)
55+
assert.strictEqual(e[0], test1[0])
56+
assert.strictEqual(e[1], test1[1])
57+
58+
e = Directive.split(test2.join(','))
59+
assert.strictEqual(e.length, 2)
60+
assert.strictEqual(e[0], test2[0])
61+
assert.strictEqual(e[1], test2[1])
62+
63+
e = Directive.split(test3.join(','))
64+
assert.strictEqual(e.length, 2)
65+
assert.strictEqual(e[0], test3[0])
66+
assert.strictEqual(e[1], test3[1])
67+
68+
e = Directive.split(test4.join(','))
69+
assert.strictEqual(e.length, 2)
70+
assert.strictEqual(e[0], test4[0])
71+
assert.strictEqual(e[1], test4[1])
72+
})
73+
74+
})
75+
1476
describe('.parse()', function () {
1577

1678
it('should return undefined if directive name does not have correct prefix', function () {

0 commit comments

Comments
 (0)