Perl 的 Text::Template 是否有 Javascript 替代品用于文本模板处理和替换?



我想根据对象的属性动态填充(非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 %>'

最新更新