/*@flow*/Exportfunctionparsefilters (exp:string): string {let Insingle=falseLet indouble=falseLet intemplatestring=falseLet Inregex=falseLet Curly= 0Let square= 0Let paren= 0Let lastfilterindex= 0Let c, prev, I, expression, filters for(i = 0; i < exp.length; i++) {prev=C c=exp.charcodeat (i)if(insingle) {if(c = = 0x27 && prev!== 0x5C) Insingle =false } Else if(indouble) {if(c = = 0x22 && prev!== 0x5C) indouble =false } Else if(intemplatestring) {if(c = = 0x60 && prev!== 0x5C) intemplatestring =false } Else if(Inregex) {if(c = = 0x2f && prev!== 0x5C) Inregex =false } Else if(c= = = 0x7C &&//PipeExp.charcodeat (i + 1)!== 0x7C &&Exp.charcodeat (i-1)!== 0x7C &&!curly &&!square &&!paren) { if(expression = = =undefined) { //First filter, end of expressionLastfilterindex = i + 1expression= Exp.slice (0, i). Trim ()}Else{pushfilter ()}}Else { Switch(c) { Case0x22:indouble =true; Break // " Case0x27:insingle =true; Break //' Case0x60:intemplatestring =true; Break // ` Case0x2f:inregex =true; Break // / Case0x28:paren++; Break // ( Case0x29:paren--; Break // ) Case0x5b:square++; Break // [ Case0x5d:square--; Break // ] Case0x7b:curly++; Break // { Case0x7d:curly--; Break // } } } } if(expression = = =undefined) {Expression= Exp.slice (0, i). Trim ()}Else if(Lastfilterindex!== 0) {pushfilter ()}functionPushfilter () {(Filters|| (Filters =[]). Push (Exp.slice (Lastfilterindex, i). Trim ()) Lastfilterindex= i + 1 } if(filters) { for(i = 0; i < filters.length; i++) {expression=wrapfilter (expression, Filters[i])}} returnexpression}functionWrapfilter (exp:string, filter:string): string {const I= Filter.indexof (' (')) if(I < 0) { //_f:resolvefilter return' _f ("${filter}") (${exp}) '}Else{const name= Filter.slice (0, i) const args= Filter.slice (i + 1) return' _f ("${name}") (${exp},${args} '}}
Vue.js Source Code Learning Note-----fillter-parse.js