ruby-on-rails - 在 Jekyll 中使用插件

标签 ruby-on-rails ruby jekyll

我已经使用 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 插件的小项目。

最佳答案

正如您所猜测的,您不能使用 <% 在 html 中调用任意 ruby​​ 命令。相反,您想要编写一个定义液体过滤器的插件。在上面的 html 中,您将使用 Liquid 标签来获取页面的内容。您可能想温习一下 liquid-for-designersliquid-for-programmers以及 Jekyll notes on writing liquid extensions在我们深入之前,我会尝试解释一下。

首先,我们需要使用 Jekyll 过滤器来获取页面内容,并将其传递给插件进行分析。上面有一个@article.body这对于 Ruby on Rails 网站来说可能意味着一些东西,但对于 Jekyll 来说却没有任何意义。正如您在布局文件的中心看到的,页面的内容简称为 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)

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

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

关于ruby-on-rails - 在 Jekyll 中使用插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13734896/

相关文章:

ruby - 在 Ruby 中迭代数组时如何修改它?

ruby - 安装 jekyll 失败 - Windows

jekyll - 如果类别中没有 Jekyll 帖子,如何创建 IF ELSE 语句?

javascript - 在 Rails 3 中使用 AJAX 删除记录

ruby-on-rails - 如何在 TextMate 中重新格式化文本

ruby - Ruby 项目在什么时候变成了 gem?

javascript - 使用 Ruby on Rails 进行 HTML5 文件拖放上传

javascript - 使用 ajax 的 Formspree 联系表单不起作用

ruby-on-rails - Rails Dysfunctional,需要 Rack 1.3.5,有 1.4.0 但无法安装 1.3.5

javascript - 预加载器不会忽略 websocket - pace js