zpt
Version:
Zenon Page Templates - JS (ZPT-JS)
113 lines (86 loc) • 3.45 kB
JavaScript
/*
FormatExpression class
*/
import { utils } from '../utils.js';
import { context } from '../context.js';
import { ExpressionTokenizer } from './expressionTokenizer.js';
import { expressionsUtils } from './expressionsUtils.js';
import { evaluateHelper } from './evaluateHelper.js';
import { expressionBuilder } from './expressionBuilder.js';
export const FormatExpression = function( stringToApply, formatterExpressionToApply, argsExpressionsToApply ) {
var string = stringToApply;
var formatterExpression = formatterExpressionToApply;
var argsExpressions = argsExpressionsToApply;
var evaluate = function( scope ){
// Get formatter
var formatter = evaluateFormatter( scope, formatterExpression );
// Get arguments
var args = evaluateHelper.evaluateExpressionList( argsExpressions, scope );
return formatter.apply( formatter, args );
};
var evaluateFormatter = function( scope, expression ) {
// Try to get a built-in formatter
var formatter = context.getFormatter( expression );
// Try to get a function with a name
if ( ! isValidFormatter( formatter ) ){
formatter = scope.get( expression );
}
// Try to get a function evaluating the expression
if ( ! isValidFormatter( formatter ) ){
try {
var formatterExpression = expressionBuilder.build( expression );
var value = formatterExpression.evaluate( scope );
return evaluateFormatter( scope, value );
} catch( e ){
// Nothing to do
}
}
// Return the formatter only if it is valid
if ( isValidFormatter( formatter ) ){
return formatter;
}
throw 'No valid formatter found: ' + string;
};
var isValidFormatter = function( formatter ){
return formatter && utils.isFunction( formatter );
};
var dependsOn = function( depsDataItem, scope ){
return expressionsUtils.buildDependsOnList( depsDataItem, scope, formatterExpression, argsExpressions );
};
var toString = function(){
return string;
};
return {
evaluate: evaluate,
dependsOn: dependsOn,
toString: toString
};
};
FormatExpression.removePrefix = true;
FormatExpression.getPrefix = function() {
return context.getConf().formatExpression;
};
FormatExpression.getId = FormatExpression.getPrefix;
FormatExpression.build = function( s ) {
var string = s.trim();
if ( string.length === 0 ) {
throw 'Format expression void.';
}
var segments = new ExpressionTokenizer(
string,
context.getConf().expressionDelimiter,
false );
var numberOfTokens = segments.countTokens();
if ( numberOfTokens === 1 ) {
throw 'Only one element in format expression: "' + string + '". Please add at least one more.';
}
// Get formatter
var formatter = segments.nextToken().trim();
// Get arguments
var argsExpressions = [];
while ( segments.hasMoreTokens() ) {
var argExpression = expressionBuilder.build( segments.nextToken() );
argsExpressions.push( argExpression );
}
return new FormatExpression( string, formatter, argsExpressions );
};