Skip to content

Commit b141c69

Browse files
committed
fix filter parsing for divisions (fix vuejs#4415)
1 parent 58949bd commit b141c69

File tree

2 files changed

+21
-1
lines changed

2 files changed

+21
-1
lines changed

src/compiler/parser/filter-parser.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,25 @@ export function parseFilters (exp: string): string {
4040
case 0x22: inDouble = true; break // "
4141
case 0x27: inSingle = true; break // '
4242
case 0x60: inTemplateString = true; break // `
43-
case 0x2f: inRegex = true; break // /
4443
case 0x28: paren++; break // (
4544
case 0x29: paren--; break // )
4645
case 0x5B: square++; break // [
4746
case 0x5D: square--; break // ]
4847
case 0x7B: curly++; break // {
4948
case 0x7D: curly--; break // }
5049
}
50+
if (c === 0x2f) { // /
51+
let j = i - 1
52+
let p
53+
// find first non-whitespace prev char
54+
for (; j >= 0; j--) {
55+
p = exp.charAt(j)
56+
if (p !== ' ') break
57+
}
58+
if (!p || !/[\w$]/.test(p)) {
59+
inRegex = true
60+
}
61+
}
5162
}
5263
}
5364

test/unit/features/filter/filter.spec.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,15 @@ describe('Filters', () => {
6969
expect(vm.$refs.test.pattern.toString()).toBe('/a|b\\//')
7070
})
7171

72+
it('handle division', () => {
73+
const vm = new Vue({
74+
data: { a: 2 },
75+
template: `<div>{{ 1/a / 4 | double }}</div>`,
76+
filters: { double: v => v * 2 }
77+
}).$mount()
78+
expect(vm.$el.textContent).toBe(String(1 / 4))
79+
})
80+
7281
it('arguments', () => {
7382
const vm = new Vue({
7483
template: `<div>{{ msg | add(a, 3) }}</div>`,

0 commit comments

Comments
 (0)