aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/AngularPublic.js1
-rw-r--r--src/directives.js39
-rw-r--r--src/markups.js28
-rw-r--r--src/service/interpolate.js82
4 files changed, 83 insertions, 67 deletions
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;
+}