blob: ad34b6e6a5f29a9ab8c61f3cfaa082117f060359 [file] [log] [blame]
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
part of template_binding;
class _InstanceBindingMap {
final List bindings;
List<_InstanceBindingMap> children;
DocumentFragment content;
bool get isTemplate => false;
_InstanceBindingMap(this.bindings);
_InstanceBindingMap getChild(int index) {
if (children == null || index >= children.length) return null;
return children[index];
}
}
class _TemplateBindingMap extends _InstanceBindingMap {
bool get isTemplate => true;
MustacheTokens _if, _bind, _repeat;
_TemplateBindingMap(List bindings) : super(bindings);
}
_InstanceBindingMap _createInstanceBindingMap(Node node,
BindingDelegate delegate) {
_InstanceBindingMap map = _getBindings(node, delegate);
if (map == null) map = new _InstanceBindingMap([]);
List children = null;
int index = 0;
for (var c = node.firstChild; c != null; c = c.nextNode, index++) {
var childMap = _createInstanceBindingMap(c, delegate);
if (childMap == null) continue;
// TODO(jmesserly): use a sparse map instead?
if (children == null) children = new List(node.nodes.length);
children[index] = childMap;
}
map.children = children;
return map;
}
Node _cloneAndBindInstance(Node node, Node parent, Document stagingDocument,
_InstanceBindingMap bindings, model, BindingDelegate delegate,
List instanceBindings, [TemplateInstance instanceRecord]) {
var clone = parent.append(stagingDocument.importNode(node, false));
int i = 0;
for (var c = node.firstChild; c != null; c = c.nextNode, i++) {
var childMap = bindings != null ? bindings.getChild(i) : null;
_cloneAndBindInstance(c, clone, stagingDocument, childMap, model, delegate,
instanceBindings);
}
if (bindings.isTemplate) {
TemplateBindExtension.decorate(clone, node);
if (delegate != null) {
templateBindFallback(clone).bindingDelegate = delegate;
}
}
_processBindings(clone, bindings, model, instanceBindings);
return clone;
}