簡體   English   中英

Jade中的過濾器嵌套失敗

[英]Filter nesting failed in Jade

我有一些過濾器:

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 :我找到了絆腳石 當我在filter中使用render()方法時,我從本地jade實例調用它,它對過濾器一無所知,但是全局jade實例(來自Gruntfile.js)具有關於該過濾器的所有信息。 這就是為什么主要的問題是: 如何將全局Jade實例與過濾器一起發送到文件?

PS3 :我不知道如何為這種情況創造小提琴。 但你可以克隆我的Hampi倉庫從我的PR到他們實施grunt-contrib-jade的更改 ,然后在開始運行npm i 要編譯模板,請運行grunt jade 注意過濾器中body.jade和注釋部分中的這些行

PS4。 我找到原因並且它在不同的范圍內。 在這里詳細描述它。 你能解決這個問題嗎?


我願意接受其他答案,我會接受玉核心的修復(如果需要的話)。

我們應該將全局jade實例綁定到這樣的過濾器:

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文件中

location 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];
};

在某些功能下嵌套可能會使音頻功能超出范圍。 音頻功能是否單獨工作!?

雖然如果問題沒有解決可能還有其他問題,請為您提供更好的理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM