diff --git a/src/lib/annotations/annotations.html b/src/lib/annotations/annotations.html index dcc2fd6a80..a5f3486c07 100644 --- a/src/lib/annotations/annotations.html +++ b/src/lib/annotations/annotations.html @@ -101,7 +101,7 @@ '(?:' + ARGUMENTS + '?' + ')' + '\\)\\s*' + ')'; var BINDING = '(' + IDENT + '\\s*' + ARGUMENT_LIST + '?' + ')'; // Group 3 - var OPEN_BRACKET = '(\\[\\[|{{)' + '\\s*'; + var OPEN_BRACKET = '(\\[\\[\\\\*|{{\\\\*)' + '\\s*'; var CLOSE_BRACKET = '(?:]]|}})'; var NEGATE = '(?:(!)\\s*)?'; // Group 2 var EXPRESSION = OPEN_BRACKET + NEGATE + BINDING + CLOSE_BRACKET; @@ -123,31 +123,48 @@ // m[1]: '{{' '[[' // m[2]: '' '!' // m[3]: 'prop' 'compute(foo,bar)' + // Example: "literal1{{\prop}}literal2[[\!compute(foo,bar)]]final" + // Regex matches: + // Iteration 1: Iteration 2: + // m[1]: '{{\' '[[\' + // m[2]: '' '!' + // m[3]: 'prop' 'compute(foo,bar)' while ((m = re.exec(text)) !== null) { // Add literal part if (m.index > lastIndex) { parts.push({literal: text.slice(lastIndex, m.index)}); } - // Add binding part - // Mode (one-way or two) - var mode = m[1][0]; - var negate = Boolean(m[2]); - var value = m[3].trim(); - var customEvent, notifyEvent, colon; - if (mode == '{' && (colon = value.indexOf('::')) > 0) { - notifyEvent = value.substring(colon + 2); - value = value.substring(0, colon); - customEvent = true; + // Check if the expression inside brackets must be treated as literal + var treatAsLiteral = m[1][2] === '\\'; + if (!treatAsLiteral) { + // Add binding part + // Mode (one-way or two) + var mode = m[1][0]; + var negate = Boolean(m[2]); + var value = m[3].trim(); + var customEvent, notifyEvent, colon; + if (mode == '{' && (colon = value.indexOf('::')) > 0) { + notifyEvent = value.substring(colon + 2); + value = value.substring(0, colon); + customEvent = true; + } + parts.push({ + compoundIndex: parts.length, + value: value, + mode: mode, + negate: negate, + event: notifyEvent, + customEvent: customEvent + }); + lastIndex = re.lastIndex; + } else { + // Add expression as literal + var literalExpression = text.slice(m.index, re.lastIndex); + // Remove a slash + literalExpression = literalExpression.slice(0, 2) + literalExpression.slice(3); + parts.push({literal: literalExpression}); + lastIndex = re.lastIndex; } - parts.push({ - compoundIndex: parts.length, - value: value, - mode: mode, - negate: negate, - event: notifyEvent, - customEvent: customEvent - }); - lastIndex = re.lastIndex; } // Add a final literal part if (lastIndex && lastIndex < text.length) {