in src/Clients/Web/winjs/js/winjs.js [19582:19752]
compile: function (bodyTemplate, replacements, supportDelayBindings) {
if (this._stage > Stage.compile) {
throw "Illegal: once we have moved past compile we cannot revist it";
}
this._stage = Stage.compile;
var that = this;
this._returnedElement = this._extractChild ? "container.firstElementChild" : "container";
var control_processing = this._controls.map(function (control) {
var constructionFormatString;
if (control.async) {
constructionFormatString = "{target}.winControl = {target}.winControl || new {SafeConstructor}({target}, {options}, controlDone)";
} else {
constructionFormatString = "{target}.winControl = {target}.winControl || new {SafeConstructor}({target}, {options})";
}
var construction = that.formatCode(
constructionFormatString,
{
target: control.elementCapture,
SafeConstructor: control.SafeConstructor,
options: that.generateOptionsLiteral(control.optionsParsed, control.elementCapture),
}
);
if (control.isDeclarativeControlContainer && typeof control.isDeclarativeControlContainer.imported === "function") {
var result = [construction];
result.push(that.formatCode(
"{isDeclarativeControlContainer}({target}.winControl, {delayedControlProcessing})",
{
target: control.elementCapture,
isDeclarativeControlContainer: control.isDeclarativeControlContainer,
delayedControlProcessing: that._staticVariables.ui_processAll
}
));
result.push(that.formatCode(
"{isDeclarativeControlContainer}({target}.winControl, {delayedBindingProcessing}(data, {templateDefaultInitializer}))",
{
target: control.elementCapture,
isDeclarativeControlContainer: control.isDeclarativeControlContainer,
delayedBindingProcessing: that._staticVariables.delayedBindingProcessing,
templateDefaultInitializer: that._staticVariables.templateDefaultInitializer || literal(null),
}
));
return result.join(";\n");
} else {
return construction;
}
});
var all_binding_processing = this._bindings.map(function (binding) {
switch (binding.kind) {
case BindingKind.template:
return that.formatCode(
"({nestedTemplates}[{nestedTemplate}] = {template}.render({path}, {dest}))",
{
nestedTemplates: that._nestedTemplates,
nestedTemplate: literal(binding.nestedTemplate),
template: binding.template,
path: binding.pathExpression,
dest: binding.elementCapture,
}
);
case BindingKind.initializer:
var formatString;
if (binding.initialValue) {
formatString = "({bindTokens}[{bindToken}] = {initializer}(data, {sourceProperties}, {dest}, {destProperties}, {initialValue}))";
} else {
formatString = "({bindTokens}[{bindToken}] = {initializer}(data, {sourceProperties}, {dest}, {destProperties}))";
}
return that.formatCode(
formatString,
{
bindTokens: that._bindTokens,
bindToken: literal(binding.bindToken),
initializer: binding.initializer,
sourceProperties: literal(binding.source),
destProperties: literal(binding.destination),
dest: binding.elementCapture,
initialValue: binding.initialValue,
}
);
case BindingKind.tree:
return binding.definition();
case BindingKind.text:
// do nothing, text bindings are taken care of seperately
break;
case BindingKind.error:
// do nothing, errors are reported and ignored
break;
default:
throw "NYI";
}
});
var binding_processing, delayed_binding_processing;
if (supportDelayBindings) {
binding_processing = all_binding_processing.filter(function (unused, index) {
return !that._bindings[index].delayable;
});
delayed_binding_processing = all_binding_processing.filter(function (unused, index) {
return that._bindings[index].delayable;
});
} else {
binding_processing = all_binding_processing;
delayed_binding_processing = [];
}
var instances = values(this._instanceVariables);
var instanceDefinitions = instances
.filter(function (instance) { return instance.kind === InstanceKind.variable; })
.map(function (variable) { return variable.definition(); });
var captures = this._captureCSE.definitions();
var globals = this._globalCSE.definitions();
var data = this._dataCSE.definitions();
var set_msParentSelectorScope = this._children.map(function (child) {
return that.formatCodeN("{0}.msParentSelectorScope = true", child);
});
var suffix = this._suffix.map(function (statement) {
return statement();
});
var renderComplete = "";
if (supportDelayBindings && delayed_binding_processing.length) {
renderComplete = that.formatCode(
renderItemImplRenderCompleteTemplate,
{
delayed_binding_processing: statements(delayed_binding_processing)
}
);
}
var result = that.formatCode(
bodyTemplate,
mergeAll([
this._staticVariables,
replacements || {},
{
profilerMarkIdentifierStart: literal("WinJS.Binding.Template:render" + this._profilerMarkIdentifier + ",StartTM"),
profilerMarkIdentifierStop: literal("WinJS.Binding.Template:render" + this._profilerMarkIdentifier + ",StopTM"),
html: this._html(),
tagName: literal(this._templateElement.tagName),
instance_variable_declarations: declarationList(instances),
global_definitions: statements(globals),
data_definitions: statements(data),
instance_variable_definitions: statements(instanceDefinitions),
capture_definitions: statements(captures),
set_msParentSelectorScope: statements(set_msParentSelectorScope),
debug_break: this.generateDebugBreak(),
control_processing: statements(control_processing),
control_counter: this._controlCounter,
binding_processing: statements(binding_processing),
renderComplete: renderComplete,
suffix_statements: statements(suffix),
nestedTemplates: this._nestedTemplates,
returnedElement: this._returnedElement,
},
])
);
return this.prettify(result);
},