Răsfoiți Sursa

filter division expression with parentheses (fix #4838) (#4844)

* filter division expression with parentheses (fix #4838)

* verify also dot and square brackets

* missed a link check sorry for the useless commit

* added + - and _ support
Riccardo Causo 9 ani în urmă
părinte
comite
7259aefbe8

+ 1 - 1
src/compiler/parser/filter-parser.js

@@ -55,7 +55,7 @@ export function parseFilters (exp: string): string {
           p = exp.charAt(j)
           if (p !== ' ') break
         }
-        if (!p || !/[\w$]/.test(p)) {
+        if (!p || !/[\w).\]\+\-\_$]/.test(p)) {
           inRegex = true
         }
       }

+ 62 - 0
test/unit/features/filter/filter.spec.js

@@ -78,6 +78,68 @@ describe('Filters', () => {
     expect(vm.$el.textContent).toBe(String(1 / 4))
   })
 
+  it('handle division with parenthesis', () => {
+    const vm = new Vue({
+      data: { a: 20 },
+      template: `<div>{{ (a*2) / 5 | double }}</div>`,
+      filters: { double: v => v * 2 }
+    }).$mount()
+    expect(vm.$el.textContent).toBe(String(16))
+  })
+
+  it('handle division with dot', () => {
+    const vm = new Vue({
+      template: `<div>{{ 20. / 5 | double }}</div>`,
+      filters: { double: v => v * 2 }
+    }).$mount()
+    expect(vm.$el.textContent).toBe(String(8))
+  })
+
+  it('handle division with array values', () => {
+    const vm = new Vue({
+      data: { a: [20] },
+      template: `<div>{{ a[0] / 5 | double }}</div>`,
+      filters: { double: v => v * 2 }
+    }).$mount()
+    expect(vm.$el.textContent).toBe(String(8))
+  })
+
+  it('handle division with hash values', () => {
+    const vm = new Vue({
+      data: { a: { n: 20 }},
+      template: `<div>{{ a['n'] / 5 | double }}</div>`,
+      filters: { double: v => v * 2 }
+    }).$mount()
+    expect(vm.$el.textContent).toBe(String(8))
+  })
+
+  it('handle division with variable++', () => {
+    const vm = new Vue({
+      data: { a: 7 },
+      template: `<div>{{ a++ / 2 | double }}</div>`,
+      filters: { double: v => v * 2 }
+    }).$mount()
+    expect(vm.$el.textContent).toBe(String(7))
+  })
+
+  it('handle division with variable--', () => {
+    const vm = new Vue({
+      data: { a: 7 },
+      template: `<div>{{ a++ / 2 | double }}</div>`,
+      filters: { double: v => v * 2 }
+    }).$mount()
+    expect(vm.$el.textContent).toBe(String(7))
+  })
+
+  it('handle division with variable_', () => {
+    const vm = new Vue({
+      data: { a_: 8 },
+      template: `<div>{{ a_ / 2 | double }}</div>`,
+      filters: { double: v => v * 2 }
+    }).$mount()
+    expect(vm.$el.textContent).toBe(String(8))
+  })
+
   it('arguments', () => {
     const vm = new Vue({
       template: `<div>{{ msg | add(a, 3) }}</div>`,