翡翠filter嵌套失败

我有一些filter:

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

并有一些input

 :Posts Posts :Audio | Audio :Video | Video 

所以我有一个错误:

  >> unknown filter ":Audio" 

我可以处理或解决这个问题吗?

PS你可以看看这个仓库中的代码 – 我使用的是grunt和grunt-contrib-jade插件,但是强制grunt-contrib-jade与你应该编辑的filter一起工作./node_modules/grunt-contrib-jade/tasks/ jade.js来反映这个拉取请求的 变化 。

PS2 :我find了绊脚石 。 当我在filter中使用render()方法时,我从本地的jade实例中调用它,它不知道任何关于filter的信息,但是全局的jade实例(来自Gruntfile.js)拥有关于这个filter的所有信息。 这就是为什么主要问题是: 我怎样才能把全局的Jade实例抛出使用filter?

PS3 :我不知道如何为这种情况创build小提琴。 但是,你可以克隆我的亨比回购 ,实施从我的PR到他们的grunt-contrib-jade的变化 ,然后在开始运行npm i 。 编译模板运行grunt jade 。 注意body.jade中的这些行和filter中的注释部分 。

PS4。 我在不同的范围内find原因。 我在这里详细描述它。 你能解决这个问题吗?


我打开额外的答案,我会接受修复玉芯(如果需要)。

       

网上收集的解决方案 "翡翠filter嵌套失败"

我们只要将全局的jade实例绑定到这样的filter:

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

看到这里的实现 – 在这个提交

我认为你是在问题的地方,问题是在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, '&#39;'); } } 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, '&#39;'); } } else { throw new Error('unknown filter ":' + name + '"'); } return res; } filter.exists = function (name, str, options) { return typeof filter[name] === 'function' || transformers[name]; }; 

在某些function下嵌套可能会使audiofunction超出范围。 audiofunction是否独立工作?

虽然如果问题没有解决,可能还有其他的东西,请为了更好的理解而创build一个小提琴。