| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- 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]
|