string-template.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import { isFunc } from './util'
  2. import { warn } from './debug'
  3. import Locale from '../../modules/locale'
  4. const stringRE = /\{\{((?:.|\n)+?)\}\}/g
  5. const quoteRe = /['"]/g
  6. const INVALID_INDEX = -1
  7. function format (string, config = '') {
  8. return string.replace(stringRE, (match, group1, index) => {
  9. const helpersArr = group1.split('|').slice(1).map(_ => _.trim())
  10. const hasHelpers = helpersArr.length
  11. let result = config
  12. if (hasHelpers) {
  13. helpersArr.forEach((helperString) => {
  14. let { fnName, args } = resolveHelperFnString(helperString)
  15. args.unshift(result)
  16. /* istanbul ignore else */
  17. if (isFunc(Locale.helpers[fnName])) {
  18. result = Locale.helpers[fnName].apply(null, args)
  19. } else {
  20. warn(`A helper function named "${fnName}" is not registered, ` +
  21. `please register it by Validator.addHelper()`)
  22. result = ''
  23. }
  24. })
  25. }
  26. return result
  27. })
  28. }
  29. function resolveHelperFnString (helperString) {
  30. const leftBracketsIndex = helperString.indexOf('(')
  31. const rightBracketsIndex = helperString.indexOf(')')
  32. let fnName = ''
  33. let args = []
  34. /* istanbul ignore if */
  35. if (leftBracketsIndex === INVALID_INDEX) {
  36. args = []
  37. fnName = helperString
  38. } else if (leftBracketsIndex !== INVALID_INDEX && rightBracketsIndex !== INVALID_INDEX) {
  39. const argsStr = helperString.slice(leftBracketsIndex + 1, rightBracketsIndex)
  40. args = argsStr.split(',').map(_ => _.trim().replace(quoteRe, ''))
  41. fnName = helperString.slice(0, leftBracketsIndex)
  42. }
  43. return { fnName, args }
  44. }
  45. export default format