在EJS中输出下划线模板

问题描述 投票:2回答:2

我想在EJS模板中标记文本块,以使EJS在输出生成期间不会触及。该块包含“ EJS”标签,因为它是使用相同语法的underscore.js模板。

我可以在不更改任何模板引擎定界符的情况下执行此操作吗?

underscore.js templating ejs underscore.js-templating
2个回答
1
投票

不要那样做,当你将来的自己回到这个世界时,你会要求一个痛苦的世界。

[ejs]不会像您询问的那样转义,但是有一些替代方法。

  1. 使用String.replace设置自己的转义语法。
  2. 修改下划线定界符(可以一次性完成)。
  3. 将两个模板拆分成单独的关注点,以避免将模板嵌入模板中。

替换

var template = _.template('<%= $.a %> foo #%= something_else %>',
  null, {variable: '$'});
var ejs = template({a: 'bar'}).replace(/#%/g, '<%');

修改定界符

var template = _.template('{{ $.a }} foo <%= something_else %>',
  null, {
    variable: '$',
    interpolate: /\{\{(.+?)\}\}/g
  });
var ejs = template({a: 'bar'});

其他问题

var ejs_template = '<%= something_else %>';
var template = _.template('<%= $.a %> foo <%= $.ejs %>',
  null, {variable: '$'});
var ejs = template({
  a: 'bar',
  ejs: ejs_template
});

0
投票

我认为在无语境的情况下,该问题可以理解为以下内容。

“如何仅对受限项目逃避EJS模板代码分隔符标记?”

tl; dr:

使用<%# %>中断原始解析代码(例如<<%# %>%= done ? 'done' : '' %<%# %>>将执行以下未解析的代码<%= done ? 'done' : '' %>

详细说明

想象一下我决定使用%选项将?更改为{ delimiter: '?' }的情况。

很好,可以解决您的问题。现在想象一下,由于某种原因,您将使用模板系统生成XML。该XML将以<?xml version="1.0" encoding="UTF-8"?>开头。

您将再次遇到相同的问题。做什么?您将再次更改定界符吗?之后,您会再次改变吗?等等,为了准时转义,我们应该只是能够说“不将文档的这一部分解析为EJS”。

因此,一个技巧是避免EJS理解它是一个EJS分隔符解析器。因此,避免它(在我们当前的情况下)解析<?(或在原始情况下为<%)。

因此,只需添加<?# ?>来中断解析,您将不会添加任何内容(#项目用于EJS注释),并且将避免解析器理解<<?# ?>?xml version="1.0" encoding="UTF-8"?<?# ?>>。输出为<?xml version="1.0" encoding="UTF-8"?>

结论

为了避免EJS解析,在punctual中,您可以通过使用<%# %>作为定界符分隔符来欺骗解析器以产生所需的输出。

© www.soinside.com 2019 - 2024. All rights reserved.