过滤器

过滤器允许你在 Pug 模板中使用其他语言。它们将一段纯文本作为输入。

要将选项传递给过滤器,请在过滤器名称后面用括号将它们添加进去(就像你对标签属性所做的那样)::less(ieCompat=false)

所有JSTransformer 模块都可以用作 Pug 过滤器。流行的过滤器包括 :babel:uglify-js:scss:markdown-it。查看 JSTransformer 的文档,了解特定过滤器支持的选项。

如果你找不到适合你用例的过滤器,你可以编写自己的自定义过滤器

例如,如果你想在 Pug 模板中使用 CoffeeScript 和 Markdown(使用 Markdown-it 渲染器),你首先要确保安装了这些功能

$ npm install --save jstransformer-coffee-script
$ npm install --save jstransformer-markdown-it

现在,你应该能够渲染以下模板

警告

过滤器在编译时渲染。这使得它们很快,但也意味着它们无法支持动态内容或选项。

默认情况下,浏览器中的编译无法访问基于 JSTransformer 的过滤器,除非 JSTransformer 模块已明确打包并通过 CommonJS 平台(例如 Browserify 或 Webpack)提供。事实上,你现在正在阅读的页面使用 Browserify 在浏览器中提供过滤器。

在服务器上预编译的模板没有此限制。

内联语法

如果过滤器的内容很短,甚至可以使用过滤器,就像它们是标签一样

过滤包含

你还可以使用 包含语法 对外部文件应用过滤器。

嵌套过滤器

你可以在同一文本块上应用多个过滤器。要做到这一点,只需在同一行上指定过滤器即可。

过滤器按相反的顺序应用。文本首先传递给最后一个过滤器;然后,结果传递给倒数第二个过滤器,依此类推。

在以下示例中,脚本首先由 babel 转换,然后由 cdata-js 转换。

自定义过滤器

你可以通过 filters 选项 将你自己的过滤器添加到 Pug。

options.filters = {
  'my-own-filter': function (text, options) {
    if (options.addStart) text = 'Start\n' + text;
    if (options.addEnd)   text = text + '\nEnd';
    return text;
  }
};
p
  :my-own-filter(addStart addEnd)
    Filter
    Body
<p>
  Start
  Filter
  Body
  End
</p>