我已经使用 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-designers和 liquid-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/