2012-12-06 37 views
1

我一直在使用杰基尔了一两个月,现在,我也是新来的Ruby所以每天的学习。使用插件在杰基尔

在我的地盘我要添加博客文章的阅读时间,我发现这个红宝石的宝石,这将让我做

https://github.com/garethrees/readingtime

我安装它以正常的方式进入我的网站的根并添加所需的代码,但没有任何反应。这并不令人震惊,因为我的网站根目录中没有实际的链接。

所以我的网站看起来像这个网站明智

--- 
layout: default 
--- 

<div class="twelve columns"> 
     <h3>{{ page.title }}</h3> 
     <span class="date">Wrote by Josh Hornby</span> 
<span class="date">Estimated reading time – <%= @article.body.reading_time %> </span> 
     <br /> <br /> 
     <%= @article.body %> 
     {{ content }} 
     </article> 

     <a href="https://twitter.com/intent/tweet?text=Check out this blog by @joshua_hornby - www.joshhornby.co.uk"> <div class="twitter_button"> <img src="/images/twitter.png" alt="twitter-logo" width="50" height="50" /> </div> </a> 
    </div> 

    <div class="four columns"> 
     <h3>Recent Posts</h3> 
     <p>Find out what else I've been talking about:</p> 
      {% for post in site.related_posts limit: 10 %} 
     <ul class="square"> 
      <li><a class="title" style="text-decoration:none;" href="{{post.url}}"><strong>{{ post.title }}</strong></a> 
      {% endfor %} 
     </ul> 
    </div> 

现在,我不感到震惊,它不工作,但我的问题是如何将安装宝石,所以我可以在我的化身文件访问呢?我需要创建一个_plugin目录并从那里打电话吗?或者它不会工作,因为它不是一个jekyll插件?在这种情况下,我可能会有一个项目编写我自己的Ruby Jekyll插件。

回答

4

正如你已经猜到,你不能使用<%调用在HTML任意红宝石命令。相反,你想写一个定义了液体过滤器的插件。在上面的html中,您将使用液体标签来抓取页面的内容。你可能想刷上liquid-for-designersliquid-for-programmers,以及我们在潜水前Jekyll notes on writing liquid extensions,但我会试着解释。

首先,我们需要使用杰基尔过滤器抓取的页面,我们将通过我们的分析插件的内容。你上面有一个@article.body这可能意味着东西在轨道站点红宝石,但并不意味着什么化身。正如您在布局文件的中心所看到的那样,该页面的内容简称为content。它通过液体输出被拉入,由{{}}指示。

代替线

<span class="date">Estimated reading time – <%= @article.body.reading_time %> </span> 

我们希望,抓住内容,并把它传递给我们的插件线:

<span class="date">Estimated reading time – {{ content | readingtime }} </span> 

竖线是一个过滤器,这意味着管content到功能readingtime并包括输出。现在我们需要编写插件本身。在_plugins目录中,我们创建以下的液体过滤器的标准模板的Ruby脚本:

require 'readingtime' 
module TextFilter 
    def readingtime(input) 
    input.reading_time 
    end 
end 
Liquid::Template.register_filter(TextFilter) 

和上面保存为像在_pluginsreadingtime.rb。这有点不言自明,但你会发现这会告诉ruby加载gem,并定义一个过滤器来接受它的输入并将reading_time函数应用于该字符串。

小记:content将拉入HTML版本的内容,而不是纯文本字符串。我不知道阅读时间宝石是否需要一个纯文本字符串,但你当然可以使用一些额外的ruby代码在它们之间进行转换。如果有必要,这留给练习读者(尽管this可能有帮助)。