如何获得传递给ejs.render的函数的当前文件名?

时间:2019-06-18 23:15:48

标签: ejs

我将stringify函数传递到EJS模板中。它就像include一样,将所有内容都吸收到一行中,因此很容易从JSON和XML等复杂数据中创建字符串。 EJS模板可能看起来像这样

{
  "body": "<%- stringify('users.xml') %>"
}

在该示例中,我希望相对于进行stringify调用的文件考虑'users.xml'。这与EJS includes一致。

问题是我找不到任何方法来获取正在调用stringify的文件的上下文(以下代码中的CALLING_FILE):

function stringify (filename) {
    const resolvedPath = path.join(path.dirname(CALLING_FILE), filename),
        contents = fs.readFileSync(resolvedPath, 'utf8'),
        rendered = ejs.render(contents, { stringify }),
        jsonString = JSON.stringify(rendered.trim());

    // get rid of the surrounding quotes
    return jsonString.substring(1, jsonString.length - 1);
}

此问题在嵌套的include上体现出来:a.ejs包括subdir/b.ejs,并且subdir/b.ejs调用stringify上的c.ejs。文件c.ejs应该自动解析为subdir中的文件,因为它是从subdir/b.ejs中调用的。

我可以覆盖ejs.fileLoader,并使用一些正则表达式魔术来构建传递给stringify的所有文件名文字值和调用它的文件的映射,但是至少在两种情况下会崩溃:

  1. 当用户创建JavaScript块并初始化变量时,将变量传递给stringify,然后
  2. 当两个不同目录中的两个不同文件都使用相同的文件名调用stringify时。例如,包含的文件subdir1 / b.ejs在c.ejs上调用stringify,包含的文件subdir2 / d.ejs在c.ejs上调用stringify。在这种情况下,应该有两个单独的c.ejs文件,一个在subdir1中,一个在subdir2中。由于在stringify调用的上下文中,我只能将映射键设置为c.ejs,因此我将无法确定要使用的路径。

还有其他方法来获取调用文件的文件路径吗?

0 个答案:

没有答案