我将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
的所有文件名文字值和调用它的文件的映射,但是至少在两种情况下会崩溃:
stringify
,然后stringify
时。例如,包含的文件subdir1 / b.ejs在c.ejs上调用stringify,包含的文件subdir2 / d.ejs在c.ejs上调用stringify。在这种情况下,应该有两个单独的c.ejs文件,一个在subdir1中,一个在subdir2中。由于在stringify
调用的上下文中,我只能将映射键设置为c.ejs,因此我将无法确定要使用的路径。还有其他方法来获取调用文件的文件路径吗?