presentationmaker_js/src/rendertree/rtcalc.ts
2024-07-05 20:14:52 +02:00

67 lines
1.7 KiB
TypeScript

/**
* SPDX-FileCopyrightText: 2024 Sascha Nitsch (grumpydeveloper) https://contentnation.net/@grumpydevelop
* SPDX-License-Identifier: GPL-3.0-or-later
* @author Author: Sascha Nitsch (grumpydeveloper)
* @internal
**/
import { RTNode } from './rtnode';
import { RenderTree } from './rendertree';
import Formula from 'fparser';
/**
* calculate new defintions based on formula
*/
export class RTCalc extends RTNode {
/** name of the definition */
private target: string;
/** expression to calculate */
private expression: string;
/**
* clone function
* @return a copy of us
*/
clone(): RTCalc {
return new RTCalc(this.root, this.target, this.expression);
}
/**
* constructor
* @param root our parent RenderTree
* @param target name of the new definition
* @param expression expression to calculate
*/
constructor(root: RenderTree, target: string, expression: string) {
super(root);
this.target = target;
this.expression = expression;
}
/**
* create RTCalc from given node into given RenderTree
* @param root render tree to insert to
* @param node input node
* @returns new RTCalc node
*/
static fromElem(root: RenderTree, node: HTMLElement): RTCalc {
return new RTCalc(
root,
node.getAttribute('name') || '',
node.innerHTML
);
}
/**
* render our element into target
* @param target target to render into
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
render(target: HTMLElement): void {
const exp = this.resolveString(this.expression);
const fObj = new Formula(exp);
const result = fObj.evaluate({});
this.root.set(this.target, result.toString());
}
}