145 lines
2.5 KiB
JavaScript
145 lines
2.5 KiB
JavaScript
|
|
var VnObject = require ('./object');
|
|
|
|
var regex = /{{\s*[\w_]+\s*(\.\s*[\w_]+\s*)?}}/g;
|
|
|
|
/**
|
|
* Replaces all ocurrences of {{value}} by it's corresponding value in the
|
|
* scope lot.
|
|
*/
|
|
module.exports = new Class
|
|
({
|
|
Extends: VnObject
|
|
|
|
,_lots: {}
|
|
,_links: []
|
|
|
|
,initialize: function (builder)
|
|
{
|
|
this._builder = builder;
|
|
this.parent ();
|
|
}
|
|
|
|
,compile: function (objContext, data, string)
|
|
{
|
|
var matchs = string.match (regex);
|
|
|
|
if (!matchs)
|
|
return null;
|
|
|
|
var lots = this._lots;
|
|
var links = this._links;
|
|
|
|
var regLots = {};
|
|
var params = [];
|
|
|
|
var context = {
|
|
objContext: objContext,
|
|
data: data,
|
|
string: string,
|
|
params: params
|
|
};
|
|
|
|
for (var i = 0; i < matchs.length; i++)
|
|
{
|
|
var match = matchs[i];
|
|
match = matchs[i].substr (2, match.length - 4);
|
|
match = match.split ('.');
|
|
|
|
var lotId;
|
|
var name;
|
|
|
|
if (match.length > 1)
|
|
{
|
|
lotId = match[0].trim ();
|
|
name = match[1].trim ();
|
|
}
|
|
else
|
|
{
|
|
lotId = null;
|
|
name = match[0].trim ();
|
|
}
|
|
|
|
params.push ({
|
|
lotId: lotId,
|
|
name: name
|
|
});
|
|
|
|
if (regLots[lotId] === undefined)
|
|
{
|
|
if (!lots[lotId])
|
|
lots[lotId] = [];
|
|
|
|
lots[lotId].push (context);
|
|
regLots[lotId] = 1;
|
|
}
|
|
}
|
|
|
|
links.push (context);
|
|
return context;
|
|
}
|
|
|
|
,interpolate: function (link, scope)
|
|
{
|
|
var i = 0;
|
|
var params = link.params;
|
|
var $ = scope.$;
|
|
|
|
return link.string.replace (regex, function () {
|
|
var param = params[i++];
|
|
var lotId = param.lotId;
|
|
var lot = lotId ? $[lotId] : scope.lot;
|
|
var value = lot ? lot.$[param.name] : null;
|
|
return value != null ? value : '';
|
|
});
|
|
}
|
|
|
|
,preLink: function (scope)
|
|
{
|
|
this._link (this._links, scope);
|
|
}
|
|
|
|
,_link: function (links, scope)
|
|
{
|
|
for (var i = 0; i < links.length; i++)
|
|
{
|
|
var link = links[i];
|
|
var string = this.interpolate (link, scope);
|
|
var object = scope.objects[link.objContext.id];
|
|
link.objContext.compiler.setProperty (object, link.data, string);
|
|
}
|
|
}
|
|
|
|
,getLot: function (lotId, scope)
|
|
{
|
|
return lotId == 'null' ? scope.lot : scope.$[lotId];
|
|
}
|
|
|
|
,postLink: function (scope)
|
|
{
|
|
for (var lotId in this._lots)
|
|
{
|
|
var lot = this.getLot (lotId, scope);
|
|
|
|
if (lot)
|
|
lot.on ('change', this.onLotChange.bind (this, lotId, scope), scope);
|
|
}
|
|
}
|
|
|
|
,free: function (scope)
|
|
{
|
|
for (var lotId in this._lots)
|
|
{
|
|
var lot = this.getLot (lotId, scope);
|
|
|
|
if (lot)
|
|
lot.disconnectByInstance (scope);
|
|
}
|
|
}
|
|
|
|
,onLotChange: function (lotId, scope)
|
|
{
|
|
this._link (this._lots[lotId], scope);
|
|
}
|
|
});
|