From 0e1fa2aefe34fe9ba5c957efde9ae4a82df54e11 Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Thu, 17 Nov 2011 12:49:15 -0800 Subject: feat($interpolate): string interpolation function --- src/AngularPublic.js | 1 + src/directives.js | 39 ---------------------- src/markups.js | 28 ---------------- src/service/interpolate.js | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 67 deletions(-) create mode 100644 src/service/interpolate.js (limited to 'src') diff --git a/src/AngularPublic.js b/src/AngularPublic.js index 7839ea63..e5c70a8b 100644 --- a/src/AngularPublic.js +++ b/src/AngularPublic.js @@ -76,6 +76,7 @@ function ngModule($provide, $injector) { $provide.service('$document', $DocumentProvider); $provide.service('$exceptionHandler', $ExceptionHandlerProvider); $provide.service('$filter', $FilterProvider); + $provide.service('$interpolate', $InterpolateProvider); $provide.service('$formFactory', $FormFactoryProvider); $provide.service('$http', $HttpProvider); $provide.service('$httpBackend', $HttpBackendProvider); diff --git a/src/directives.js b/src/directives.js index 41fbac16..ea09fc06 100644 --- a/src/directives.js +++ b/src/directives.js @@ -282,45 +282,6 @@ angularDirective("ng:bind", function(expression, element){ }]; }); -var bindTemplateCache = {}; -function compileBindTemplate(template){ - var fn = bindTemplateCache[template]; - if (!fn) { - var bindings = []; - forEach(parseBindings(template), function(text){ - var exp = binding(text); - bindings.push(exp - ? function(scope, element) { return scope.$eval(exp); } - : function() { return text; }); - }); - bindTemplateCache[template] = fn = function(scope, element, prettyPrintJson) { - var parts = [], - hadOwnElement = scope.hasOwnProperty('$element'), - oldElement = scope.$element; - - // TODO(misko): get rid of $element - scope.$element = element; - try { - for (var i = 0; i < bindings.length; i++) { - var value = bindings[i](scope, element); - if (isElement(value)) - value = ''; - else if (isObject(value)) - value = toJson(value, prettyPrintJson); - parts.push(value); - } - return parts.join(''); - } finally { - if (hadOwnElement) { - scope.$element = oldElement; - } else { - delete scope.$element; - } - } - }; - } - return fn; -} /** * @ngdoc directive diff --git a/src/markups.js b/src/markups.js index b7761857..f6f2143a 100644 --- a/src/markups.js +++ b/src/markups.js @@ -51,34 +51,6 @@ * Understanding Angular Markup} in the Angular Developer Guide. */ -function parseBindings(string) { - var results = []; - var lastIndex = 0; - var index; - while((index = string.indexOf('{{', lastIndex)) > -1) { - if (lastIndex < index) - results.push(string.substr(lastIndex, index - lastIndex)); - lastIndex = index; - - index = string.indexOf('}}', index); - index = index < 0 ? string.length : index + 2; - - results.push(string.substr(lastIndex, index - lastIndex)); - lastIndex = index; - } - if (lastIndex != string.length) - results.push(string.substr(lastIndex, string.length - lastIndex)); - return results.length === 0 ? [ string ] : results; -} - -function binding(string) { - var binding = string.replace(/\n/gm, ' ').match(/^\{\{(.*)\}\}$/); - return binding ? binding[1] : null; -} - -function hasBindings(bindings) { - return bindings.length > 1 || binding(bindings[0]) !== null; -} angularTextMarkup('{{}}', function(text, textNode, parentElement) { var bindings = parseBindings(text), diff --git a/src/service/interpolate.js b/src/service/interpolate.js new file mode 100644 index 00000000..03692824 --- /dev/null +++ b/src/service/interpolate.js @@ -0,0 +1,82 @@ +'use strict'; + +function $InterpolateProvider(){ + this.$get = ['$parse', function($parse){ + return function(text, templateOnly) { + var bindings = parseBindings(text); + if (hasBindings(bindings) || !templateOnly) { + return compileBindTemplate(text); + } + }; + }]; +} + +var bindTemplateCache = {}; +function compileBindTemplate(template){ + var fn = bindTemplateCache[template]; + if (!fn) { + var bindings = []; + forEach(parseBindings(template), function(text){ + var exp = binding(text); + bindings.push(exp + ? function(scope, element) { return scope.$eval(exp); } + : function() { return text; }); + }); + bindTemplateCache[template] = fn = function(scope, element, prettyPrintJson) { + var parts = [], + hadOwnElement = scope.hasOwnProperty('$element'), + oldElement = scope.$element; + + // TODO(misko): get rid of $element + scope.$element = element; + try { + for (var i = 0; i < bindings.length; i++) { + var value = bindings[i](scope, element); + if (isElement(value)) + value = ''; + else if (isObject(value)) + value = toJson(value, prettyPrintJson); + parts.push(value); + } + return parts.join(''); + } finally { + if (hadOwnElement) { + scope.$element = oldElement; + } else { + delete scope.$element; + } + } + }; + } + return fn; +} + + +function parseBindings(string) { + var results = []; + var lastIndex = 0; + var index; + while((index = string.indexOf('{{', lastIndex)) > -1) { + if (lastIndex < index) + results.push(string.substr(lastIndex, index - lastIndex)); + lastIndex = index; + + index = string.indexOf('}}', index); + index = index < 0 ? string.length : index + 2; + + results.push(string.substr(lastIndex, index - lastIndex)); + lastIndex = index; + } + if (lastIndex != string.length) + results.push(string.substr(lastIndex, string.length - lastIndex)); + return results.length === 0 ? [ string ] : results; +} + +function binding(string) { + var binding = string.replace(/\n/gm, ' ').match(/^\{\{(.*)\}\}$/); + return binding ? binding[1] : null; +} + +function hasBindings(bindings) { + return bindings.length > 1 || binding(bindings[0]) !== null; +} -- cgit v1.2.3