2017-04-10 65 views
0

我有一个图像列表,我运行mini_exiftool从图像中提取各种属性(EXIF & IPTC)。我已经成功创建了一个LiquidTag。它接受路径和我想要的EXIF属性,并返回(我认为是)字符串。Jekyll - 访问液体的插件对象

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

从你如何描述的插件,我会说它做你想要的。该插件从(照片?)返回特定属性并将其作为字符串返回。

但它听起来像你只想一次,并将它存储在别的地方。在这种情况下,你可能想考虑做一点不同。当你说酒店的阅读速度很慢时。

您可以在示例中使用生成器根据运行前的所有图像创建所需的数据。在发电机组详细信息: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或类似的工具来生成数据文件。

让我知道如果我把你的问题弄错了,我会相应地更新我的答案。

+0

感谢您的回复!我会阅读发电机,我认为这可能会解决我的问题。我更新了我的问题,这个问题有点不清楚,你在大多数账户上都猜到了。 ;-) – Henrik

+0

很高兴听到Henrik。如果您对Jekyll有更深的兴趣,我现在做一些无耻的自我推广,并将这个链接提供给我正在编写的书籍项目(当我有时间时:-)):https://www.jekyll.io – Christian

+0

由于我已经使用shell脚本来处理文件,因此我可以在exiftool中添加一个额外的调用并将其输出到JSON数据文件。如果我在jekyll运行时需要数据,我会用一个发生器去掉。现在我拥有了所有的数据和零开销。干杯! – Henrik