Jekyll - 从 Liquid 访问插件对象

Jekyll - access plugin object from Liquid

我有一个图像列表,我在其中 运行 mini_exiftool 从图像(EXIF 和 IPTC)中提取各种属性。我已经成功创建了一个 LiquidTag。它接受我想要的 pathEXIF 属性,并且 returns 作为(我假设的)a字符串。

但是,mini_exiftool 。目前我在每张图片中多次插入标签。我想 运行 每个图像一次并将所有数据(数组?对象?)存储在一个变量中。小免责声明 - 我几乎不知道任何 Ruby,除了我在试图理解这个问题时学到的东西。

我是这样使用插件的:

{% exif path, title %}
{% exif path, lens %}

这是插件,网上找到的猜测和代码的大杂烩:

require 'mini_exiftool'

module Jekyll
  class Exif < Liquid::Tag
    def initialize(tag_name, params, token)
      super
      args = params.split(",").map(&:strip)
      @filename = args[0]
      @property = args[1]
    end
    def lookup(context, name)
      lookup = context
      name.split(".").each { |value| lookup = lookup[value] }
      lookup
    end
    def render(context)
      path = lookup(context, @filename)
      exif = MiniExiftool.new(path)
      return exif[@property]
    end
  end
end

Liquid::Template.register_tag('exif', Jekyll::Exif)

根据您对插件的描述,我认为它可以满足您的需求。插件 returns 来自(一张照片?)的特定 属性 和 returns 它作为一个字符串。

但听起来您只想使用一次并将其存储在其他地方。在这种情况下,您可能需要考虑做一些不同的事情。 Esp 当你说 属性 读数很慢时。

例如,您可以使用生成器根据 运行 之前的所有图像创建所需的数据。生成器详情:http://jekyllrb.com/docs/plugins/#generators

您可以使用与我类似的方法对语言进行排序:

class Generator < Jekyll::Generator
    def generate(site)

      site.data['news-en'] = Array.new
      # Do something with exif and push a value object:
      site.data['news-en'].push(p)

数据随后在您的站点数据对象中可用。可以这样访问:

{% for post in site.data['news-en'] %}

请在此处查看数据文件文档:http://jekyllrb.com/docs/datafiles/

但是,如果您真的不是经常添加大量照片而是定期更新您的其他文本帖子,您甚至可能想要离开 Jekyll 并使用 Gulp/Grunt 或类似工具生成数据文件。

如果我的问题有误,请告诉我,我会相应地更新我的答案。