我想根据对象的属性动态填充(非HTML(文本模板,甚至调用getter函数以获取这些对象以检索数据。请参见下面的代码示例。可选地,执行任何任意JavaScript(类似于Perl的Text ::模板(将是一个奖励。
这是为RPG游戏生成文本的。我不需要生成任何HTML标记。不会有任何(不安全/不信任的(用户输入预期。
文本替换的工作如下:
// In file text.js
export const texts = [
'Name: {level.name}, danger: {level.getDanger()}, val: {value}'
];
// In file fill.js
import {texts} from './text';
const template = new TextTemplate(texts[0]); // What I don't currently have
const myLevel = {
name: 'test level', getDanger: () => 5
};
const textFilled = template.fill_in({level: myLevel, value: 123});
console.log(textFilled); // prints 'Name: test level, danger: 5, val: 123'
在这种情况下, js自己的模板文字不起作用,因为用于替换的对象/变量不在text.js
中的范围内。我研究了标记的模板,但无法找到一种替代的方法。我对实施此类文本处理的任何库/函数感兴趣。
大多数html模板库(不是诸如react或angular之类的UI框架(实际上并不理解HTML。他们只是在字符串上操作。
在前两个纯字符串模板库中是车把(也有其他语言(和EJS
车把:
const template = Handlebars.compile(texts[0]);
console.log(template(variables));
车把故意不完整,并且强烈地劝阻模板中的逻辑,以防止业务逻辑蔓延到您的意见中。因此,您无法将功能传递给其执行。但是,您可以实现助手,这些助手是可以添加到车把解析器以执行自己的功能的关键字。
EJS:
console.log(ejs.render(texts[0], variables));
ejs具有与车把的完全相反的哲学。它将JavaScript本身用作模板语言。您可以将所有JavaScript代码插入以进行评估的字符串中。实际上,它的行为有点像PHP。您的EJ中的字符串看起来像:
'Name: <%= level.name %>, danger: <%= level.getDanger() %>, val: <%= value %>'