UNPKG

zpt

Version:

Zenon Page Templates - JS (ZPT-JS)

204 lines (173 loc) 7.18 kB
/* expressionBuilder singleton class */ module.exports = (function() { "use strict"; var context = require( '../context.js' ); var ExpressionTokenizer = require( './expressionTokenizer.js' ); var PathExpression = require( './path/pathExpression.js' ); var expressionCache = require( '../cache/expressionCache.js' ); /*var log = require( '../logHelper.js' );*/ var expressionManagers = {}; var withoutPrefixExpressionManagers = {}; var DEFAULT_ID = PathExpression.getId(); /* Register expression managers */ var register = function( expressionsManager, id ) { expressionManagers[ id || expressionsManager.getPrefix() || expressionsManager.getId() ] = expressionsManager; if ( ! expressionsManager.removePrefix && expressionsManager.getPrefix() ){ withoutPrefixExpressionManagers[ expressionsManager.getPrefix() ] = expressionsManager; } }; var unregister = function( expressionsManager, id ) { delete expressionManagers[ id || expressionsManager.getPrefix() || expressionsManager.getId() ]; }; var registerGeneralPurpose = function(){ register( require( './existsExpression.js' ) ); register( require( './formatExpression.js' ) ); register( require( './stringExpression.js' ) ); register( require( './path/pathExpression.js' ) ); }; var registerComparison = function(){ register( require( './comparison/equalsExpression.js' ) ); register( require( './comparison/greaterExpression.js' ) ); register( require( './comparison/lowerExpression.js' ) ); register( require( './comparison/inExpression.js' ) ); }; var registerArithmetic = function(){ register( require( './arithmethic/addExpression.js' ) ); register( require( './arithmethic/substractExpression.js' ) ); register( require( './arithmethic/multiplyExpression.js' ) ); register( require( './arithmethic/divideExpression.js' ) ); register( require( './arithmethic/modExpression.js' ) ); }; var registerLogical = function(){ register( require( './bool/andExpression.js' ) ); register( require( './bool/condExpression.js' ) ); register( require( './bool/notExpression.js' ) ); register( require( './bool/orExpression.js' ) ); }; var registerI18n = function(){ register( require( './i18n/trCurrencyExpression.js' ) ); register( require( './i18n/trDateTimeExpression.js' ) ); register( require( './i18n/trNumberExpression.js' ) ); register( require( './i18n/trStringExpression.js' ) ); }; var registerScripting = function(){ register( require( './scripting/javascriptExpression.js' ) ); register( require( './scripting/queryExpression.js' ) ); }; var registerAll = function(){ registerGeneralPurpose(); registerComparison(); registerArithmetic(); registerLogical(); registerI18n(); registerScripting(); }(); /* End Register expression managers */ var build = function( string, force ) { return expressionCache.get( string, function(){ return forceBuild( string ); }, force ); }; var forceBuild = function( string ) { var effectiveString = removeParenthesisIfAny( string.trim() ); var index = effectiveString.indexOf( context.getConf().expressionSuffix ); var id = undefined; var isDefault = false; // Is the default expression type? Is registered? if ( index !== -1 ){ id = effectiveString.substring( 0, index ) + ':'; // If the id is not resistered must be a path isDefault = ! expressionManagers.hasOwnProperty( id ); } else { isDefault = true; } // Remove prefix and set id if it is default expression type var removePrefix = false; var expressionManager = undefined; if ( isDefault ){ /*id = DEFAULT_ID;*/ expressionManager = getWithoutPrefixExpressionManager( effectiveString ); } else { removePrefix = true; } // Get the expression manager and build the expression expressionManager = expressionManager || expressionManagers[ id ]; var finalString = undefined; if ( removePrefix && expressionManager.removePrefix ){ finalString = effectiveString.substr( id.length ); } else { finalString = effectiveString; } return expressionManager.build( finalString ); }; var getWithoutPrefixExpressionManager = function( string ){ for ( var prefix in withoutPrefixExpressionManagers ) { if ( string.indexOf( prefix ) === 0 ) { return withoutPrefixExpressionManagers[ prefix ]; } } return expressionManagers[ DEFAULT_ID ]; }; var buildList = function( segments ) { var list = []; while ( segments.hasMoreTokens() ) { list.push( build( segments.nextToken().trim() ) ); } return list; }; var removePrefix = function( string, prefix ) { return string.substr( prefix.length ); }; var removePrefixAndBuild = function( string, prefix ) { return build( string.substr( prefix.length )); }; var removeParenthesisIfAny = function( token ){ var effectiveToken = token.trim(); if ( effectiveToken == '' ){ return effectiveToken; } if ( effectiveToken.charAt( 0 ) === '(' ){ return removeParenthesisIfAny( effectiveToken.substring( 1, effectiveToken.lastIndexOf( ')' ) ).trim() ); } return effectiveToken; }; var endsWith = function( str, suffix ) { return str.indexOf( suffix, str.length - suffix.length ) !== -1; }; var getArgumentsFromString = function( string ) { // Parse and evaluate arguments; then push them to an array var tokens = new ExpressionTokenizer( string, context.getConf().argumentsDelimiter, true ); var args = []; while ( tokens.hasMoreTokens() ) { var currentString = tokens.nextToken().trim(); args.push( build( currentString ) ); } return args; }; return { register: register, unregister: unregister, registerAll: registerAll, build: build, buildList: buildList, removePrefix: removePrefix, removePrefixAndBuild: removePrefixAndBuild, removeParenthesisIfAny: removeParenthesisIfAny, endsWith: endsWith, getArgumentsFromString: getArgumentsFromString }; })();