我有一些过滤器:
var jade = require('jade');
jade.filters.Posts = function(block) {
return '{block:Posts}'+jade.render(block)+'{/block:Posts}';
};
jade.filters.Audio = function(block) {
return '{block:Audio}'+jade.render(block)+'{/block:Audio}';
};
jade.filters.Video = function(block) {
return '{block:Video}'+jade.render(block)+'{/block:Video}';
};
并有一些输入
:Posts
Posts
:Audio
| Audio
:Video
| Video
所以我有一个错误:
>> unknown filter ":Audio"
我能处理或解决这个问题吗?
PS 您可以查看此repository中的代码 - 我正在使用grunt和grunt-contrib-jade插件,但要强制grunt-contrib-jade使用过滤器应编辑./node_modules/grunt-contrib-jade/tasks/jade.js以反映此changes中的pull request。
PS2 :我找到了绊脚石。当我在filter中使用render()
方法时,我从本地jade实例调用它,它对过滤器一无所知,但是全局jade实例(来自Gruntfile.js)拥有关于过滤器的所有信息。这就是为什么主要问题是:如何将全局Jade-instance投放到带过滤器的文件?
PS3 :我不知道如何为这种情况创造小提琴。但您可以克隆我的Hampi repo,实施changes to grunt-contrib-jade from my PR to them,然后开始运行npm i
。要编译模板,请运行grunt jade
。请注意body.jade中的these line和过滤器中的commented section。
PS4。我找到原因并且它在不同的范围内。我用详细信息here对其进行了描述。你能解决这个问题吗?
我愿意接受其他答案,我会接受jade core中的修复(如果需要的话)。
答案 0 :(得分:4)
我们应该将全局jade实例绑定到这样的过滤器:
var jade = require('jade');
if (options.filters) {
// have custom filters
Object.keys(options.filters).forEach(function(filter) {
if (_.isFunction(data)) {
// have custom options
jade.filters[filter] = options.filters[filter].bind({jade: jade, locals: data()});
} else {
// have no custom options
jade.filters[filter] = options.filters[filter].bind({jade: jade });
}
});
}
请参阅此处的实施 - 在此commit
中答案 1 :(得分:1)
我认为你在问题所在地,问题出在filter.js
档案
位置jade/lib/filters.js
var transformers = require('transformers');
module.exports = filter;
function filter(name, str, options) {
if (typeof filter[name] === 'function') {
var res = filter[name](str, options);
} else if (transformers[name]) {
var res = transformers[name].renderSync(str, options);
if (transformers[name].outputFormat === 'js') {
res = '<script type="text/javascript">\n' + res + '</script>';
} else if (transformers[name].outputFormat === 'css') {
res = '<style type="text/css">' + res + '</style>';
} else if (transformers[name].outputFormat === 'xml') {
res = res.replace(/'/g, ''');
}
} else {
throw new Error('unknown filter ":' + name + '"');
}
return res; // returns RES that is not defined in scope of function.
}
filter.exists = function (name, str, options) {
return typeof filter[name] === 'function' || transformers[name];
};
在这里,我发现了一个可以纠正的缺陷,
var transformers = require('transformers');
module.exports = filter;
function filter(name, str, options) {
var res;//defined a variable which is global to the scope of function.
if (typeof filter[name] === 'function') {
res = filter[name](str, options);
} else if (transformers[name]) {
res = transformers[name].renderSync(str, options);
if (transformers[name].outputFormat === 'js') {
res = '<script type="text/javascript">\n' + res + '</script>';
} else if (transformers[name].outputFormat === 'css') {
res = '<style type="text/css">' + res + '</style>';
} else if (transformers[name].outputFormat === 'xml') {
res = res.replace(/'/g, ''');
}
} else {
throw new Error('unknown filter ":' + name + '"');
}
return res;
}
filter.exists = function (name, str, options) {
return typeof filter[name] === 'function' || transformers[name];
};
在某些功能下嵌套可能会使音频功能超出范围。音频功能是否单独工作!?
虽然如果问题没有解决可能还有其他问题,请为您提供一个小提琴,以便更好地理解。