Procházet zdrojové kódy

support es6 template strings in filter parser

Evan You před 9 roky
rodič
revize
30f890cf3c

+ 13 - 8
src/compiler/parser/filter-parser.js

@@ -3,6 +3,7 @@
 export function parseFilters (exp: string): string {
   let inSingle = false
   let inDouble = false
+  let inTemplateString = false
   let curly = 0
   let square = 0
   let paren = 0
@@ -18,6 +19,9 @@ export function parseFilters (exp: string): string {
     } else if (inDouble) {
       // check double quote
       if (c === 0x22 && prev !== 0x5C) inDouble = !inDouble
+    } else if (inTemplateString) {
+      // check template literal
+      if (c === 0x60 && prev !== 0x5C) inTemplateString = !inTemplateString
     } else if (
       c === 0x7C && // pipe
       exp.charCodeAt(i + 1) !== 0x7C &&
@@ -33,14 +37,15 @@ export function parseFilters (exp: string): string {
       }
     } else {
       switch (c) {
-        case 0x22: inDouble = true; break // "
-        case 0x27: inSingle = true; break // '
-        case 0x28: paren++; break         // (
-        case 0x29: paren--; break         // )
-        case 0x5B: square++; break        // [
-        case 0x5D: square--; break        // ]
-        case 0x7B: curly++; break         // {
-        case 0x7D: curly--; break         // }
+        case 0x22: inDouble = true; break         // "
+        case 0x27: inSingle = true; break         // '
+        case 0x60: inTemplateString = true; break // `
+        case 0x28: paren++; break                 // (
+        case 0x29: paren--; break                 // )
+        case 0x5B: square++; break                // [
+        case 0x5D: square--; break                // ]
+        case 0x7B: curly++; break                 // {
+        case 0x7D: curly--; break                 // }
       }
     }
   }

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

@@ -1,4 +1,5 @@
 import Vue from 'vue'
+import { parseFilters } from 'compiler/parser/filter-parser'
 
 describe('Filters', () => {
   it('basic usage', () => {
@@ -96,4 +97,8 @@ describe('Filters', () => {
     }).$mount()
     expect('Failed to resolve filter: upper').toHaveBeenWarned()
   })
+
+  it('support template string', () => {
+    expect(parseFilters('`a | ${b}c` | d')).toBe('_f("d")(`a | ${b}c`)')
+  })
 })