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/service/interpolate.js | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/service/interpolate.js (limited to 'src/service') 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