hedera-web/js/vn/compiler-interpolable.js

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