zpt
Version:
Zenon Page Templates - JS (ZPT-JS)
147 lines (125 loc) • 4.91 kB
JavaScript
/*
trHelper singleton class
*/
;
var context = require( '../../context.js' );
var ExpressionTokenizer = require( '../expressionTokenizer.js' );
var i18nHelper = require( '../../i18n/i18nHelper.js' );
var evaluateHelper = require( '../evaluateHelper.js' );
var expressionsUtils = require( '../expressionsUtils.js' );
var VariableExpression = require( '../path/variableExpression.js' );
module.exports = (function() {
var build = function( string, tag, minElements, maxElements, useSubformat ) {
var expressionBuilder = require( '../expressionBuilder.js' );
if ( string.length === 0 ) {
throw tag + ' expression void.';
}
var segments = new ExpressionTokenizer(
string.trim(),
context.getConf().expressionDelimiter,
false );
// Check number of tokens
var count = segments.countTokens();
if ( count < minElements ) {
throw 'Too few elements in ' + tag + ' expression (minimum is ' + minElements
+ ', ' + count + ' present): ' + string.trim();
}
if ( count > maxElements ) {
throw 'Too many elements in ' + tag + ' expression (maximum is ' + maxElements
+ ', ' + count + ' present):' + string.trim();
}
// Get tokens
var subformat = useSubformat?
expressionBuilder.build( segments.nextToken() ):
undefined;
var expression = expressionBuilder.build(
segments.nextToken().trim() );
var argsSegment = segments.hasMoreTokens()?
segments.nextToken().trim():
undefined;
return {
expression: expression,
argsExpressions: buildI18nArgs( argsSegment ),
subformat: subformat
};
};
var buildI18nArgs = function( segment ){
var expressionBuilder = require( '../expressionBuilder.js' );
var args = {};
if ( ! segment ){
return args;
}
var tokens = new ExpressionTokenizer(
segment,
context.getConf().i18nOptionsDelimiter,
true
);
while ( tokens.hasMoreTokens() ) {
var token = tokens.nextToken().trim();
var argsTokens = new ExpressionTokenizer(
token,
context.getConf().inI18nOptionsDelimiter,
true
);
if ( argsTokens.countTokens() !== 2 ) {
throw '2 elements are needed in i18n expression.';
}
var argKey = argsTokens.nextToken().trim();
var argExpression = expressionBuilder.build(
argsTokens.nextToken().trim() );
args[ argKey ] = argExpression;
}
return args;
};
var evaluateI18nArgs = function( scope, i18nArgs ){
var values = {};
for ( var argKey in i18nArgs ) {
var argExpression = i18nArgs[ argKey ];
var argValue = evaluateHelper.evaluateToNotNull( scope, argExpression );
values[ argKey ] = argValue;
}
return values;
};
var evaluate = function( scope, valueExpression, argsExpressions, format, subformat ) {
var argValues = evaluateI18nArgs( scope, argsExpressions );
var subformatEvaluated =
subformat?
evaluateHelper.evaluateToNotNull( scope, subformat ):
undefined;
var valueEvaluated = evaluateHelper.evaluateToNotNull( scope, valueExpression );
var evaluated = translate(
scope,
valueEvaluated,
argValues,
format,
subformatEvaluated );
return evaluated;
};
var translate = function( scope, id, i18nArgs, format, subformat ){
var i18nList = scope.get( context.getConf().i18nDomainVarName );
var language = scope.get( context.getConf().i18nLanguageVarName );
return i18nHelper.tr(
i18nList,
id,
i18nArgs,
format,
subformat,
language
);
};
var dependsOn = function( depsDataItem, scope, expression, argsExpressions ){
return expressionsUtils.buildDependsOnList(
depsDataItem,
scope,
new VariableExpression( context.getConf().i18nDomainVarName ),
new VariableExpression( context.getConf().i18nLanguageVarName ),
expression,
argsExpressions
);
};
return {
build: build,
evaluate: evaluate,
dependsOn: dependsOn
};
})();