@plurid/programmatic-text
v0.0.0-1
Published
Client-Side Evaluation of User Text Based on User Code
Readme
Contents
About
programmatic text provides an evaluation context to allow users to input a text containing {variables} which will be replaced after evaluation with the results of the user-input code.
Considering the following user text input
simple {example} with one variableand the following user code input in javascript
const example = 'fake world example';
return {
example,
};will evaluate to the content
simple fake world example with one variableInstall
npm install @plurid/programmatic-textor
yarn add @plurid/programmatic-textUsage
The evaluation language of the code is by default javascript
import ProgrammaticText from '@plurid/programmatic-text';
const main = async () => {
const programmaticText = new ProgrammaticText();
const evaluated = await programmaticText.evaluate(
// text
'This happened {x} years ago, that means {y} days ago.',
// code
`
const x = new Date().getFullYear() - 2000;
const y = x * 365;
return {
x,
y,
};
`,
));
}and it can also be python
import ProgrammaticText from '@plurid/programmatic-text';
const main = async () => {
const programmaticText = new ProgrammaticText({
language: 'python',
});
const evaluated = await programmaticText.evaluate(
// text
'This happened {x} years ago, that means {y} days ago.',
// code
`
from datetime import date
x = date.today().year - 2000;
y = x * 365;
values = {
'x': x,
'y': y,
}
`,
));
}For javascript the code must simply return an object where the keys are the variable names from the text.
For python the code must contain a values dictionary which will be used to resolve the text.
For python, ProgrammaticText will load at the first evaluate request or at the preload call the pyodide package from a CDN script.
Setting usePyodideCDN: false requires pyodide to be preloaded on window.programmaticTextPyodide, otherwise ProgrammaticText will attempt to dynamically import the pyodide package from node_modules.
// preload pyodide before using ProgrammaticText
const pyodide = await loadPyodide();
window.programmaticTextPyodide = pyodide;
const programmaticText = new ProgrammaticText({
language: 'python',
usePyodideCDN: false,
});or
const programmaticText = new ProgrammaticText({
language: 'python',
usePyodideCDN: true, // default for `python`
});
await programmaticText.preload();Constructor Options
interface ProgrammaticTextOptions {
/**
* The evaluation language.
*/
language: 'javascript' | 'python';
/**
* The evaluation type when `language` is `javascript`.
*/
type: 'function' | 'variable';
/**
* Load `pyodide` for `python` from CDN.
*
* Default `true`
*/
usePyodideCDN: boolean;
/**
* Timeout for the code evaluation.
*/
timeout: number;
/**
* Replace undefined variables with a certain string.
*/
replaceUndefined: string | undefined;
/**
* Catch errors from the evaluation of the code.
*
* Default `__error__`
*/
errorKey: string;
logger: ((error: any) => void) | undefined;
}