var openChar = '{', endChar = '}', ESCAPE_RE = /[-.*+?^${}()|[\]\/\\]/g, BINDING_RE = buildInterpolationRegex(), // lazy require Directive function buildInterpolationRegex () { var open = escapeRegex(openChar), end = escapeRegex(endChar) return new RegExp(open + open + open + '?(.+?)' + end + '?' + end + end) } function escapeRegex (str) { return str.replace(ESCAPE_RE, '\\$&') } function setDelimiters (delimiters) { exports.delimiters = delimiters openChar = delimiters[0] endChar = delimiters[1] BINDING_RE = buildInterpolationRegex() } /** * Parse a piece of text, return an array of tokens * token types: * 1. plain string * 2. object with key = binding key * 3. object with key & html = true */ function parse (text) { if (!BINDING_RE.test(text)) return null var m, i, token, match, tokens = [] /* jshint boss: true */ while (m = text.match(BINDING_RE)) { i = m.index if (i > 0) tokens.push(text.slice(0, i)) token = { key: m[1].trim() } match = m[0] token.html = match.charAt(2) === openChar && match.charAt(match.length - 3) === endChar tokens.push(token) text = text.slice(i + m[0].length) } if (text.length) tokens.push(text) return tokens } /** * Parse an attribute value with possible interpolation tags * return a Directive-friendly expression * * e.g. a {{b}} c => "a " + b + " c" */ function parseAttr (attr) { Directive = Directive || require('./directive') var tokens = parse(attr) if (!tokens) return null if (tokens.length === 1) return tokens[0].key var res = [], token for (var i = 0, l = tokens.length; i < l; i++) { token = tokens[i] res.push( token.key ? inlineFilters(token.key) : ('"' + token + '"') ) } return res.join('+') } /** * Inlines any possible filters in a binding * so that we can combine everything into a huge expression */ function inlineFilters (key) { if (key.indexOf('|') > -1) { var dirs = Directive.parse(key), dir = dirs && dirs[0] if (dir && dir.filters) { key = Directive.inlineFilters( dir.key, dir.filters ) } } return '(' + key + ')' } exports.parse = parse exports.parseAttr = parseAttr exports.setDelimiters = setDelimiters exports.delimiters = [openChar, endChar]