diff options
| author | Misko Hevery | 2010-03-26 16:27:18 -0700 | 
|---|---|---|
| committer | Misko Hevery | 2010-03-26 16:27:18 -0700 | 
| commit | 258ca5f16581f0e8befa493644225a02ae2fc002 (patch) | |
| tree | a7d67c586fb5c870619664ca84e17996f6dd2e6d /src/markups.js | |
| parent | 1990cbbf2817e04657ccd616da1d9d6b78cc2949 (diff) | |
| download | angular.js-258ca5f16581f0e8befa493644225a02ae2fc002.tar.bz2 | |
moved all uneeded files out, widgets.html works, tests horribly broken
Diffstat (limited to 'src/markups.js')
| -rw-r--r-- | src/markups.js | 76 | 
1 files changed, 76 insertions, 0 deletions
| diff --git a/src/markups.js b/src/markups.js new file mode 100644 index 00000000..6bc27c85 --- /dev/null +++ b/src/markups.js @@ -0,0 +1,76 @@ +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), +      self = this; +  if (hasBindings(bindings)) { +    if (isLeafNode(parentElement[0])) { +      parentElement.attr('ng-bind-template', text); +    } 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); +        } else { +          newElement = self.text(text); +        } +        cursor.after(newElement); +        cursor = newElement; +      }); +    } +    textNode.remove(); +  } +}); + +angularTextMarkup('OPTION', function(text, textNode, parentElement){ +  if (parentElement[0].nodeName == "OPTION") { +    var select = document.createElement('select'); +    select.insertBefore(parentElement[0].cloneNode(true), null); +    if (!select.innerHTML.match(/<option(\s.*\s|\s)value\s*=\s*.*>.*<\/\s*option\s*>/gi)) { +      parentElement.attr('value', text); +    } +  } +}); + +var NG_BIND_ATTR = 'ng-bind-attr'; +angularAttrMarkup('{{}}', function(value, name, element){ +  if (name.substr(0, 3) != 'ng-') { +    var bindings = parseBindings(value), +        bindAttr; +    if (hasBindings(bindings)) { +      element.removeAttr(name); +      bindAttr = fromJson(element.attr(NG_BIND_ATTR) || "{}"); +      bindAttr[name] = value; +      element.attr(NG_BIND_ATTR, toJson(bindAttr)); +    } +  } +}); | 
