all files / parser/ interpolate.js

100% Statements 26/26
83.33% Branches 10/12
100% Functions 1/1
100% Lines 26/26
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40    192× 192× 192× 192× 252× 252× 252× 252× 72×   252× 252× 239× 239× 239× 239×     239× 239×   239×   239×     192×          
import { avalon, config } from '../seed/core'
import { addScope } from './index'
var rimprovePriority = /[+-\?]/
var rinnerValue = /__value__\)$/
export function parseInterpolate(dir) {
    var rlineSp = /\n\r?/g
    var str = dir.nodeValue.trim().replace(rlineSp, '')
    var tokens = []
    do {//aaa{{@bbb}}ccc
        var index = str.indexOf(config.openTag)
        index = index === -1 ? str.length : index
        var value = str.slice(0, index)
        if (/\S/.test(value)) {
            tokens.push(avalon.quote(avalon._decode(value)))
        }
        str = str.slice(index + config.openTag.length)
        if (str) {
            index = str.indexOf(config.closeTag)
            var value = str.slice(0, index)
            var expr = avalon.unescapeHTML(value)
            if (/\|\s*\w/.test(expr)) {//如果存在过滤器,优化干掉
                var arr = addScope(expr, 'expr')
                Eif (arr[1]) {
                    expr = arr[1].replace(rinnerValue, arr[0]+')')
                }
            }
            Eif(rimprovePriority){
                expr = '('+expr+')'
            }
            tokens.push(expr)
 
            str = str.slice(index + config.closeTag.length)
        }
    } while (str.length)
    return [{
        expr: tokens.join('+'),
        name: 'expr',
        type: 'expr'
    }]
}