2

我已经使用 Jekyll 一两个月了,我也是 Ruby 新手,所以每天都在学习。

在我的网站中,我想添加博客文章的阅读时间,我找到了这个 ruby​​ gem,它可以让我做到这一点

https://github.com/garethrees/readingtime

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

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

---
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>

现在我对它不起作用并不感到震惊,但我的问题是如何安装 gem 以便我可以在我的 Jekyll 文件中访问它?我需要创建一个_plugin目录并从那里调用它吗?或者它不会因为它不是一个 jekyll 插件而工作?在那种情况下,我可能有一个小项目来编写我自己的 Ruby Jekyll 插件。

4

1 回答 1

5

正如您所推测的,您不能在 html 中使用<%. 相反,您想编写一个定义 Liquid 过滤器的插件。在上面的 html 中,您将使用液体标签来获取页面的内容。在我们深入研究之前,您可能想复习一下liquid-for-designersliquid-for-programmers以及Jekyll 关于编写液体扩展的注释,但我会尝试解释一下。

首先,我们需要使用 Jekyll 过滤器来抓取页面的内容,然后将其传递给我们的插件进行分析。上面你有一个@article.body可能对 ruby​​ on rails 网站有意义,但对 Jekyll 没有任何意义。正如您在布局文件的中心看到的那样,页面的内容被简单地称为content. 它通过 Liquid 输出被拉入,由 . 指示{{ }}

代替线

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

我们想要一行来抓取内容并将其传递给我们的插件:

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

垂直条是一个过滤器,表示content函数readingtime的管道并包含输出。现在我们需要编写插件本身。在_plugins目录中,我们按照 Liquid 过滤器的标准模板创建一个 ruby​​ 脚本:

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

并将上述内容保存为类似readingtime.rbin 的内容_plugins。这有点不言自明,但是您会看到这告诉 ruby​​ 加载 gem,并定义一个过滤器,该过滤器接受其输入并将reading_time函数应用于该字符串。

一点注意:content将拉入内容的 HTML 版本,而不是纯文本字符串。我不知道阅读时间 gem 是否需要纯文本字符串,但您当然可以使用一些额外的 ruby​​ 代码在它们之间进行转换。如有必要,这将作为练习留给读者(尽管可能会有所帮助)。

于 2012-12-13T02:01:17.307 回答