Jelajahi Sumber

fix filter parsing for divisions (fix #4415)

Evan You 9 tahun lalu
induk
melakukan
b141c6930d

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

@@ -40,7 +40,6 @@ export function parseFilters (exp: string): string {
         case 0x22: inDouble = true; break         // "
         case 0x27: inSingle = true; break         // '
         case 0x60: inTemplateString = true; break // `
-        case 0x2f: inRegex = true; break          // /
         case 0x28: paren++; break                 // (
         case 0x29: paren--; break                 // )
         case 0x5B: square++; break                // [
@@ -48,6 +47,18 @@ export function parseFilters (exp: string): string {
         case 0x7B: curly++; break                 // {
         case 0x7D: curly--; break                 // }
       }
+      if (c === 0x2f) { // /
+        let j = i - 1
+        let p
+        // find first non-whitespace prev char
+        for (; j >= 0; j--) {
+          p = exp.charAt(j)
+          if (p !== ' ') break
+        }
+        if (!p || !/[\w$]/.test(p)) {
+          inRegex = true
+        }
+      }
     }
   }
 

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

@@ -69,6 +69,15 @@ describe('Filters', () => {
     expect(vm.$refs.test.pattern.toString()).toBe('/a|b\\//')
   })
 
+  it('handle division', () => {
+    const vm = new Vue({
+      data: { a: 2 },
+      template: `<div>{{ 1/a / 4 | double }}</div>`,
+      filters: { double: v => v * 2 }
+    }).$mount()
+    expect(vm.$el.textContent).toBe(String(1 / 4))
+  })
+
   it('arguments', () => {
     const vm = new Vue({
       template: `<div>{{ msg | add(a, 3) }}</div>`,