angular.js/src/markups.js

87 lines
2.7 KiB
JavaScript
Raw Normal View History

2010-03-23 21:57:11 +00:00
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;
2010-04-04 00:04:36 +00:00
}
2010-03-23 21:57:11 +00:00
function binding(string) {
var binding = string.replace(/\n/gm, ' ').match(/^\{\{(.*)\}\}$/);
return binding ? binding[1] : _null;
2010-04-04 00:04:36 +00:00
}
2010-03-23 21:57:11 +00:00
function hasBindings(bindings) {
return bindings.length > 1 || binding(bindings[0]) !== _null;
2010-04-04 00:04:36 +00:00
}
2010-03-23 21:57:11 +00:00
2010-03-25 21:43:05 +00:00
angularTextMarkup('{{}}', function(text, textNode, parentElement) {
2010-03-23 21:57:11 +00:00
var bindings = parseBindings(text),
self = this;
2010-03-25 21:43:05 +00:00
if (hasBindings(bindings)) {
if (isLeafNode(parentElement[0])) {
parentElement.attr('ng:bind-template', text);
2010-03-25 21:43:05 +00:00
} else {
var cursor = textNode, newElement;
foreach(parseBindings(text), function(text){
var exp = binding(text);
if (exp) {
newElement = self.element('span');
newElement.attr('ng:bind', exp);
2010-03-25 21:43:05 +00:00
} else {
newElement = self.text(text);
}
2010-04-20 00:02:46 +00:00
if (msie && text.charAt(0) == ' ') {
newElement = jqLite('<span>&nbsp;</span>');
var nbsp = newElement.html();
newElement.text(text.substr(1));
newElement.html(nbsp + newElement.html());
}
2010-03-25 21:43:05 +00:00
cursor.after(newElement);
cursor = newElement;
});
textNode.remove();
2010-03-25 21:43:05 +00:00
}
}
});
2010-04-01 21:10:28 +00:00
// TODO: this should be widget not a markup
2010-03-25 21:43:05 +00:00
angularTextMarkup('OPTION', function(text, textNode, parentElement){
2010-04-19 19:54:39 +00:00
if (nodeName(parentElement) == "OPTION") {
2010-03-25 21:43:05 +00:00
var select = document.createElement('select');
select.insertBefore(parentElement[0].cloneNode(true), _null);
2010-03-25 21:43:05 +00:00
if (!select.innerHTML.match(/<option(\s.*\s|\s)value\s*=\s*.*>.*<\/\s*option\s*>/gi)) {
parentElement.attr('value', text);
}
2010-03-23 21:57:11 +00:00
}
});
var NG_BIND_ATTR = 'ng:bind-attr';
2010-09-17 17:44:23 +00:00
var SPECIAL_ATTRS = {'ng:src': 'src', 'ng:href': 'href'};
2010-03-25 21:43:05 +00:00
angularAttrMarkup('{{}}', function(value, name, element){
// don't process existing attribute markup
if (angularDirective(name) || angularDirective("@" + name)) return;
if (msie && name == 'src')
value = decodeURI(value);
var bindings = parseBindings(value),
bindAttr;
if (hasBindings(bindings)) {
element.removeAttr(name);
bindAttr = fromJson(element.attr(NG_BIND_ATTR) || "{}");
2010-09-17 17:44:23 +00:00
bindAttr[SPECIAL_ATTRS[name] || name] = value;
element.attr(NG_BIND_ATTR, toJson(bindAttr));
2010-03-23 21:57:11 +00:00
}
});