优先级如何" Jekyll插件中的标志应该可以工作吗?

时间:2016-06-30 14:49:53

标签: jekyll jekyll-extensions

我目前正在尝试为Jekyll开发一个插件,它可以帮助Cloudinary使用响应式图像。当前的来源是in my Github repo,如果它有效,我将在以后制作它。

此插件有两个功能:

  • 用于定义Cloudinary图像的Liquid标签,例如{% cloudinary [preset] path/to/img.jpg [attr="value"] %}
  • 转换为optionnaly自动将图像的标准Markdown / Kramdown语法转换为此Liquid标签:![alt text](path/to/img.jpg){:caption="caption text"}变为{% cloudinary path/to/img.jpg alt="alt text" caption="caption text" %}

目前,这两个功能都按预期工作,但它们并未连接#34;。如果我在Markdown中使用Liquid标签,则会对其进行评估。如果我放置标准的Markdown图像,它会转换为{% cloudinary … %} Liquid标签,但不评估此标签。

我怀疑这两个功能没有以正确的顺序运行,所以我想确保在评估Liquid标签之前执行Converter。

但我还没有理解如何使用priority flag

如果我取消注释the priority :normal line in my plugin并运行bundle exec jekyll serve,我会收到此错误:

$ bundle exec jekyll serve
Configuration file: /Users/nhoizey/Dropbox/Personnel/Devs/nicolas-hoizey.com/_config.yml
jekyll 3.1.6 | Error:  undefined method `priority' for Jekyll::CloudinaryTag:Class
Did you mean?  print

有什么想法吗?

编辑(7月11日):

我现在把它分成了插件。

转换器仍在我网站的_plugins文件夹中:https://github.com/nhoizey/nicolas-hoizey.com/blob/52c92a38410e133890eea6044a033cb20344b971/_plugins/cloudinaryfy.rb#L26

Jekyll并没有抱怨这个"优先级"标志。

Liquid标签现在是一个名为jekyll-cloudinary的真正自主插件宝石:https://nhoizey.github.io/jekyll-cloudinary/

如果我把"优先级"在这个插件中标记,我仍然得到错误:

$ bundle exec jekyll serve                                                                                 bundler: failed to load command: jekyll (/usr/local/bin/jekyll)
Bundler::GemRequireError: There was an error while trying to load the gem 'jekyll-cloudinary'.
Gem Load Error is: undefined method `priority' for Jekyll::Cloudinary::CloudinaryTag:Class
Did you mean?  print
Backtrace for gem load error is:
/usr/local/lib/ruby/gems/2.3.0/gems/jekyll-cloudinary-1.2.2/lib/jekyll/cloudinary.rb:5:in `<class:CloudinaryTag>'
/usr/local/lib/ruby/gems/2.3.0/gems/jekyll-cloudinary-1.2.2/lib/jekyll/cloudinary.rb:4:in `<module:Cloudinary>'
/usr/local/lib/ruby/gems/2.3.0/gems/jekyll-cloudinary-1.2.2/lib/jekyll/cloudinary.rb:2:in `<module:Jekyll>'
/usr/local/lib/ruby/gems/2.3.0/gems/jekyll-cloudinary-1.2.2/lib/jekyll/cloudinary.rb:1:in `<top (required)>'
/usr/local/lib/ruby/gems/2.3.0/gems/jekyll-cloudinary-1.2.2/lib/jekyll-cloudinary.rb:1:in `require'
/usr/local/lib/ruby/gems/2.3.0/gems/jekyll-cloudinary-1.2.2/lib/jekyll-cloudinary.rb:1:in `<top (required)>'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/runtime.rb:86:in `require'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/runtime.rb:86:in `block (2 levels) in require'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/runtime.rb:81:in `each'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/runtime.rb:81:in `block in require'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/runtime.rb:70:in `each'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/runtime.rb:70:in `require'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler.rb:102:in `require'
/usr/local/lib/ruby/gems/2.3.0/gems/jekyll-3.1.6/lib/jekyll/plugin_manager.rb:34:in `require_from_bundler'
/usr/local/lib/ruby/gems/2.3.0/gems/jekyll-3.1.6/bin/jekyll:9:in `<top (required)>'
/usr/local/bin/jekyll:22:in `load'
/usr/local/bin/jekyll:22:in `<top (required)>'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/cli/exec.rb:63:in `load'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/cli/exec.rb:63:in `kernel_load'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/cli/exec.rb:24:in `run'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/cli.rb:304:in `exec'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/vendor/thor/lib/thor/invocation.rb:126:in `invoke_command'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/vendor/thor/lib/thor.rb:359:in `dispatch'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/vendor/thor/lib/thor/base.rb:440:in `start'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/cli.rb:11:in `start'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/exe/bundle:27:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/friendly_errors.rb:98:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/exe/bundle:19:in `<top (required)>'
/usr/local/bin/bundle:22:in `load'
/usr/local/bin/bundle:22:in `<main>'
Bundler Error Backtrace:

  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/runtime.rb:89:in `rescue in block (2 levels) in require'
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/runtime.rb:85:in `block (2 levels) in require'
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/runtime.rb:81:in `each'
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/runtime.rb:81:in `block in require'
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/runtime.rb:70:in `each'
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler/runtime.rb:70:in `require'
  /usr/local/lib/ruby/gems/2.3.0/gems/bundler-1.12.5/lib/bundler.rb:102:in `require'
  /usr/local/lib/ruby/gems/2.3.0/gems/jekyll-3.1.6/lib/jekyll/plugin_manager.rb:34:in `require_from_bundler'
  /usr/local/lib/ruby/gems/2.3.0/gems/jekyll-3.1.6/bin/jekyll:9:in `<top (required)>'
  /usr/local/bin/jekyll:22:in `load'
  /usr/local/bin/jekyll:22:in `<top (required)>'

为什么它适用于一个插件但不适用于另一个插件?

如何在解释cloudinarify Liquid标签之前确保jekyll-cloudinary转换器插件运行?

1 个答案:

答案 0 :(得分:3)

priority的子类引入了Jekyll::Plugin标志,以便让插件作者能够明确地向Jekyll提供订购信息。当实例化新的Jekyll::Site时,插件子类被实例化并按优先级排序。如果您希望{/ 1>}插件在之前运行 另一个插件之后,您可以修改其优先级,以便它在处理方面优先于其他插件。

这仅适用于cloudfoundry的子类,其中包括Jekyll::PluginJekyll::Converter。这就是为什么它适用于您的转换器,但不适用于您的Jekyll::Generator - 液体标签没有优先级的想法,因为它们没有竞争。

例如,以具有类别生成器插件站点地图插件的网站为例。站点地图插件作者希望确保站点地图中存在任何生成的页面(所有内容都应该在站点地图中!),因此它设置Liquid::Tag。类别生成器插件作者可能希望确保它在任何其他生成器(例如站点地图生成器)之前运行,因此它设置priority :low。这样可以确保在sitemap插件之前运行类别生成器插件,以便编译的站点地图中包含类别页面。

默认优先级为priority :high。按优先级的降序排列:

  • :normal
  • :highest
  • :high
  • :normal
  • :low