zpt
Version:
Zenon Page Templates - JS (ZPT-JS)
138 lines (113 loc) • 4.21 kB
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 < 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 < evaluated.length; j++ ) {
result = processInteger(
c++,
evaluated[ j ],
result,
expression
);
}
}
}
if ( c < 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>