Skip to content

Commit 38b8cfd

Browse files
committed
handle regex with pipes in filter parser
1 parent 27009bc commit 38b8cfd

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

src/compiler/parser/filter-parser.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export function parseFilters (exp: string): string {
44
let inSingle = false
55
let inDouble = false
66
let inTemplateString = false
7+
let inRegex = false
78
let curly = 0
89
let square = 0
910
let paren = 0
@@ -14,14 +15,13 @@ export function parseFilters (exp: string): string {
1415
prev = c
1516
c = exp.charCodeAt(i)
1617
if (inSingle) {
17-
// check single quote
18-
if (c === 0x27 && prev !== 0x5C) inSingle = !inSingle
18+
if (c === 0x27 && prev !== 0x5C) inSingle = false
1919
} else if (inDouble) {
20-
// check double quote
21-
if (c === 0x22 && prev !== 0x5C) inDouble = !inDouble
20+
if (c === 0x22 && prev !== 0x5C) inDouble = false
2221
} else if (inTemplateString) {
23-
// check template literal
24-
if (c === 0x60 && prev !== 0x5C) inTemplateString = !inTemplateString
22+
if (c === 0x60 && prev !== 0x5C) inTemplateString = false
23+
} else if (inRegex) {
24+
if (c === 0x2f && prev !== 0x5C) inRegex = false
2525
} else if (
2626
c === 0x7C && // pipe
2727
exp.charCodeAt(i + 1) !== 0x7C &&
@@ -40,6 +40,7 @@ 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 // /
4344
case 0x28: paren++; break // (
4445
case 0x29: paren--; break // )
4546
case 0x5B: square++; break // [

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,21 @@ describe('Filters', () => {
5454
expect(vm.$refs.bar).toBe(vm.$el)
5555
})
5656

57+
it('handle regex with pipe', () => {
58+
const vm = new Vue({
59+
template: `<test ref="test" :pattern="/a|b\\// | identity"></test>`,
60+
filters: { identity: v => v },
61+
components: {
62+
test: {
63+
props: ['pattern'],
64+
template: '<div></div>'
65+
}
66+
}
67+
}).$mount()
68+
expect(vm.$refs.test.pattern instanceof RegExp).toBe(true)
69+
expect(vm.$refs.test.pattern.toString()).toBe('/a|b\\//')
70+
})
71+
5772
it('arguments', () => {
5873
const vm = new Vue({
5974
template: `<div>{{ msg | add(a, 3) }}</div>`,

0 commit comments

Comments
 (0)