Jekyll - 从Liquid访问插件对象

时间:2017-04-10 16:11:06

标签: ruby jekyll liquid

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

但是,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)

1 个答案:

答案 0 :(得分:1)

从你描述插件的方式来看,我会说它能做到你想要的。插件从(照片?)返回一个特定属性并将其作为字符串返回。

但这听起来只是你想要它一次,并存储在其他地方。在这种情况下,您可能需要考虑做一些不同的事情。 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或类似的工具来生成一个数据文件。

如果我的问题出错了,请告诉我,我会相应地更新我的答案。