aboutsummaryrefslogtreecommitdiffstats
path: root/src/markup.js
blob: add7ce03e49978d60ff17b94490b4db59820a489 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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 || Binder.binding(bindings[0]) !== null;
};

angularTextMarkup(function(text, textNode, parentElement) {
  var bindings = parseBindings(text),
      self = this;
  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();
});

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));
    }
  }
});