如何在自定义玉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代码,比如
buf
,block
,以及任何传递给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代码。