@lan-ui/lan-ui
Version:
A fantastic mobile ui lib implement by Vue
51 lines (45 loc) • 1.62 kB
JavaScript
import { isFunc } from './util'
import { warn } from './debug'
import Locale from '../../modules/locale'
const stringRE = /\{\{((?:.|\n)+?)\}\}/g
const quoteRe = /['"]/g
const INVALID_INDEX = -1
function format (string, config = '') {
return string.replace(stringRE, (match, group1, index) => {
const helpersArr = group1.split('|').slice(1).map(_ => _.trim())
const hasHelpers = helpersArr.length
let result = config
if (hasHelpers) {
helpersArr.forEach((helperString) => {
let { fnName, args } = resolveHelperFnString(helperString)
args.unshift(result)
/* istanbul ignore else */
if (isFunc(Locale.helpers[fnName])) {
result = Locale.helpers[fnName].apply(null, args)
} else {
warn(`A helper function named "${fnName}" is not registered, ` +
`please register it by Validator.addHelper()`)
result = ''
}
})
}
return result
})
}
function resolveHelperFnString (helperString) {
const leftBracketsIndex = helperString.indexOf('(')
const rightBracketsIndex = helperString.indexOf(')')
let fnName = ''
let args = []
/* istanbul ignore if */
if (leftBracketsIndex === INVALID_INDEX) {
args = []
fnName = helperString
} else if (leftBracketsIndex !== INVALID_INDEX && rightBracketsIndex !== INVALID_INDEX) {
const argsStr = helperString.slice(leftBracketsIndex + 1, rightBracketsIndex)
args = argsStr.split(',').map(_ => _.trim().replace(quoteRe, ''))
fnName = helperString.slice(0, leftBracketsIndex)
}
return { fnName, args }
}
export default format