如何在自定义玉filter中呈现块?

我有两个玉模板:

# base_template block do_something :custom_filter block do_something_main 

 extends base_template block do_something_main h1 Hello There! 

我已经定义了自定义filter,如下所示:

 var jade = require("jade"); jade.filters.custom_filter = function(html, options) { var output = jade.render(html, {filename: options.filename}); // modify the output return "<h1>AWESOME RACCOONS!</h1>" + output; } 

但是,调用jade.render(...)无法呈现do_something_main块。 一切工作正常,如果我没有定义我的自定义filter内的另一个块。

例如,使base_template不定义do_something_main块将正确呈现内容,但它不是我想要的行为或inheritance模式:

 # base_template block do_something :custom_filter .awesome_class HELLO THERE 

如何获得jade.render(...)在自定义filter中呈现块?

我遇到了同样的问题,我认为不可能用当前版本的Jade以干净的方式来完成。

在parsing器源代码: https : //github.com/visionmedia/jade/blob/master/lib/compiler.js#L488filter的内容被传递到filter函数不变。

不过可以破解Jade来做,但是没有保证它可以在未来的版本上运行:

  • Jade将一些variables暴露给已编译的mixin代码,比如bufblock ,以及任何传递给Jade的其他数据。

  • block是一个渲染包含块的函数。 可悲的是,函数不返回任何值,因为它直接影响缓冲区。

根据这些调查结果,我能够创build一个hacky解决方法:

 mixin example() - var prevBuf = buf; - buf = [] - block() - var blockResult = buf.join(''); - buf = prevBuf; = myFilter(blockResult) div +example() | **Hello** world! 

为了使其工作,您需要将myFilter函数传递给Jade编译。 如果您手动运行Jade,请将该信息传递给jade.render

 jade.render(src, {myFilter: function (txt) {...}}); 

如果你用咕噜声运行Jade,把它传入数据选项(参见https://github.com/gruntjs/grunt-contrib-jade#data )。 在filters中传递它不起作用,因为在当前的Jade版本中,filter没有公开生成的mixin代码。