9

我有一些过滤器:

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你可以查看这个存储库中的代码——我正在使用 grunt 和 grunt-contrib-jade 插件,但是要强制 grunt-contrib-jade 使用过滤器,你应该编辑 ./node_modules/grunt-contrib-jade/tasks/ Jade.js 以反映来自此拉取请求的更改

PS2:我找到了绊脚石。当我render()在过滤器中使用方法时,我从本地翡翠实例调用它,它对过滤器一无所知,但全局翡翠实例(来自 Gruntfile.js)具有有关该过滤器的所有信息。这就是为什么主要问题是:如何将全局 Jade-instance 扔到带有过滤器的文件中?

PS3:我不知道如何为这种情况创建小提琴。但是您可以克隆我的Hampi 存储库从我的 PR 对 grunt-contrib-jade 进行更改,然后在开始运行npm i。要编译模板运行grunt jade. 注意body.jade中的这些行和过滤器中的注释部分

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


我愿意接受额外的答案,我会接受翡翠核心的修复(如果需要的话)。

4

2 回答 2

4

我们只需要将全局翡翠实例绑定到过滤器,如下所示:

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

  });
}

在这里查看实现——在这个提交中

于 2013-09-22T13:00:08.047 回答
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, '&#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];
};

在某些函数下嵌套可能会使音频函数超出范围。音频功能是否单独工作!?

虽然如果问题没有解决可能还有其他事情,请创建一个小提琴供您更好地理解。

于 2013-09-19T12:01:05.800 回答