aboutsummaryrefslogtreecommitdiffstats
path: root/src/ng/parse.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/ng/parse.js')
-rw-r--r--src/ng/parse.js32
1 files changed, 29 insertions, 3 deletions
diff --git a/src/ng/parse.js b/src/ng/parse.js
index 26c41a90..4616d15d 100644
--- a/src/ng/parse.js
+++ b/src/ng/parse.js
@@ -58,7 +58,7 @@ function lex(text, csp){
(token=tokens[tokens.length-1])) {
token.json = token.text.indexOf('.') == -1;
}
- } else if (is('(){}[].,;:')) {
+ } else if (is('(){}[].,;:?')) {
tokens.push({
index:index,
text:ch,
@@ -359,6 +359,14 @@ function parser(text, json, $filter, csp){
});
}
+ function ternaryFn(left, middle, right){
+ return extend(function(self, locals){
+ return left(self, locals) ? middle(self, locals) : right(self, locals);
+ }, {
+ constant: left.constant && middle.constant && right.constant
+ });
+ }
+
function binaryFn(left, fn, right) {
return extend(function(self, locals) {
return fn(self, locals, left, right);
@@ -429,7 +437,7 @@ function parser(text, json, $filter, csp){
}
function _assignment() {
- var left = logicalOR();
+ var left = ternary();
var right;
var token;
if ((token = expect('='))) {
@@ -437,7 +445,7 @@ function parser(text, json, $filter, csp){
throwError("implies assignment but [" +
text.substring(0, token.index) + "] can not be assigned to", token);
}
- right = logicalOR();
+ right = ternary();
return function(scope, locals){
return left.assign(scope, right(scope, locals), locals);
};
@@ -446,6 +454,24 @@ function parser(text, json, $filter, csp){
}
}
+ function ternary() {
+ var left = logicalOR();
+ var middle;
+ var token;
+ if((token = expect('?'))){
+ middle = ternary();
+ if((token = expect(':'))){
+ return ternaryFn(left, middle, ternary());
+ }
+ else {
+ throwError('expected :', token);
+ }
+ }
+ else {
+ return left;
+ }
+ }
+
function logicalOR() {
var left = logicalAND();
var token;