in Canvas/CanvasSimple/lib/winjs-4.0.1/js/base.js [21910:22047]
optimize: function () {
if (this._stage > Stage.optimze) {
throw "Illegal: once we have moved past link we cannot revist it";
}
this._stage = Stage.optimze;
// Identify all bindings which can be turned into tree bindings, in some cases this consists
// of simply changing their type and providing a definition, in other cases it involves
// adding a new tree binding to complement the other binding
//
for (var i = 0; i < this._bindings.length; i++) {
var binding = this._bindings[i];
if (binding.template) {
continue;
}
switch (binding.initializer.imported) {
case init_defaultBind:
// Add a new tree binding for one-time binding and mark the defaultBind as delayable
var newBinding = merge(binding, {
kind: BindingKind.tree,
initializer: this.importFunctionSafe("init_oneTime", init_oneTime),
original: binding,
});
newBinding.elementCapture.refCount++;
this.oneTimeTreeBinding(newBinding);
this._bindings.splice(i, 0, newBinding);
binding.delayable = true;
i++;
break;
case init_setAttribute:
// Add a new tree binding for one-time setAttribute and mark the setAttribute as delayable
var newBinding = merge(binding, {
kind: BindingKind.tree,
initializer: this.importFunctionSafe("init_setAttributeOneTime", init_setAttributeOneTime),
original: binding,
});
newBinding.elementCapture.refCount++;
this.setAttributeOneTimeTreeBinding(newBinding);
this._bindings.splice(i, 0, newBinding);
binding.delayable = true;
i++;
break;
case init_oneTime:
this.oneTimeTreeBinding(binding);
break;
case init_setAttributeOneTime:
this.setAttributeOneTimeTreeBinding(binding);
break;
case init_addClassOneTime:
this.addClassOneTimeTreeBinding(binding);
break;
default:
if (binding.initializer) {
binding.delayable = !!binding.initializer.imported.delayable;
}
break;
}
}
if (this._optimizeTextBindings) {
// Identifiy all potential text bindings and generate text replacement expressions
//
var textBindings = {};
for (var i = 0; i < this._bindings.length; i++) {
var binding = this._bindings[i];
if (binding.template) {
continue;
}
if (binding.kind === BindingKind.error) {
continue;
}
switch (binding.initializer.imported) {
case init_oneTime:
this.oneTimeTextBinding(binding);
break;
case init_setAttributeOneTime:
this.setAttributeOneTimeTextBinding(binding);
break;
case init_addClassOneTime:
this.addClassOneTimeTextBinding(binding);
break;
default:
break;
}
if (binding.textBindingId) {
textBindings[binding.textBindingId] = binding;
}
}
if (Object.keys(textBindings).length) {
var newHtml = this._templateContent.innerHTML;
// Perform any adjustments to the HTML that are needed for things like styles and
// boolean attributes
//
newHtml = this._htmlProcessors.reduce(
function (html, replacer) {
return replacer(html);
},
newHtml
);
// All the even indexes are content and all the odds are replacements
//
// NOTE: this regular expression is
var parts = newHtml.split(this._textBindingRegex);
for (var i = 1; i < parts.length; i += 2) {
var binding = textBindings[parts[i]];
parts[i] = binding.definition;
}
// Generate the function which will code-gen the HTML replacements.
//
this._html = function () {
var result = parts.map(function (p) {
// the strings are the literal parts of the HTML that came directly from the DOM
// the functions are the definitions for string replacements
return typeof p === "string" ? literal(p) : p();
}).join(" + ");
return multiline(result);
};
}
}
},