UNPKG

zpt

Version:

Zenon Page Templates - JS (ZPT-JS)

138 lines (113 loc) 4.21 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Custom expressions</title> <script type="module" src="../js/zpt.js"></script> <script type="text/javascript" src="../lib/syntaxHighlighter/lib.js"></script> <link rel="stylesheet" type="text/css" href="../docs.css"> <link rel="stylesheet" type="text/css" href="../lib/syntaxHighlighter/theme.css"> </head> <body> <div data-use-macro="'page@templates.html'"> <div data-fill-slot="'page-header'"> <h1>ZPT-JS tutorial - Custom expressions</h1> </div> <article data-fill-slot="'article'"> <p> ZPT-JS makes it easy to register custom expression managers. For example, we want to develop an expression manager that returns the arithmetic average of the values in the expression. </p> <p> First we must implement the class (<em>averageExpression.js</em> file): </p> <pre class="brush: js"> import { zpt } from './zpt-esm.js'; var context = zpt.context; var evaluateHelper = zpt.evaluateHelper; var ExpressionTokenizer = zpt.ExpressionTokenizer; var expressionBuilder = zpt.expressionBuilder; var AverageExpression = function( _string, _expressionList ) { var string = _string; var expressionList = _expressionList; var evaluate = function( scope ){ // Evaluate segments var result = 0; var c = 0; for ( var i = 0; i &lt; expressionList.length; i++ ) { var expression = expressionList[ i ]; var evaluated = expression.evaluate( scope ); if ( ! Array.isArray( evaluated ) ){ // Process numeric value result = processInteger( c++, evaluated, result, expression ); } else { // Process array of numeric for ( var j = 0; j &lt; evaluated.length; j++ ) { result = processInteger( c++, evaluated[ j ], result, expression ); } } } if ( c &lt; 2 ) { throw 'Error in expression "' + string + '". Only one element in evaluation of Average ' + ' expression, please add at least one more.'; } return result / c; }; var processInteger = function( c, value, result, expression ){ if ( ! evaluateHelper.isNumber( value ) ) { throw "Error trying to do math operation, value '" + value + "' is not a valid number in average expression '" + expression + "'"; } return c == 0? Number( value ): result + Number( value ); }; var toString = function(){ return string; }; return { evaluate: evaluate, toString: toString }; }; AverageExpression.removePrefix = true; AverageExpression.getPrefix = function() { return 'avg' + context.getConf().expressionSuffix; }; AverageExpression.getId = AverageExpression.getPrefix; AverageExpression.build = function( string ) { if ( string.length == 0 ) { throw AverageExpression.getPrefix + " expression void."; } var segments = new ExpressionTokenizer( string, context.getConf().expressionDelimiter, false ); return new AverageExpression( string, expressionBuilder.buildList( segments ) ); } module.exports = AverageExpression; </pre> <p> Don't forget to register that class! </p> <pre class="brush: js"> import { zpt } from './zpt-esm.js'; var expressionBuilder = zpt.expressionBuilder; var AverageExpression = require( './averageExpression.js' ); expressionBuilder.register( AverageExpression ); </pre> </article> </div> </body> </html>