在EJS中输出下划线模板

时间:2014-03-20 11:20:52

标签: underscore.js templating ejs underscore.js-templating

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

我是否可以在不更改任何一个模板引擎的分隔符的情况下执行此操作?

2 个答案:

答案 0 :(得分:1)

不要这样做,当你未来的自我回归时,你会要求一个受伤的世界。

像你的要求一样,“ejs”没有逃脱,但有一些接近的选择。

  1. 使用String.replace制作自己的转义语法。
  2. 修改下划线分隔符(可以一次性完成)。
  3. 将两个模板拆分为单独的问题,以避免在模板中嵌入模板。
  4. 替换

    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
    });
    

答案 1 :(得分: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解析,在准时的必要性下,您可以使用<%# %>作为分隔符来欺骗解析器以产生所需的输出。