Jekyll,Liquid,随机数

16

我想要一组链接

<li>
  <h2>Random Articles</h2>  
  <ul>
    <li><a href="#">Old article 1</a></li>
    <li><a href="#">Old article 1</a></li>
    <li><a href="#">Old article 1</a></li>
  </ul>
</li>

但我希望从我的随机帖子中生成链接。 我正在使用jekyll和liquid生成网站。 由于我在github上托管,因此必须使用jekyll的内置部分。 我不太确定从哪里开始。 关于这个主题的谷歌搜索毫无结果。

5个回答

21

这是从_data中随机选择一条引语的方法,但这个原则也适用于你的文章:

{% assign random = site.time | date: "%s%N" | modulo: site.data.inspirational-quotes.size %}

<blockquote>&ldquo;{{ site.data.inspirational-quotes[random].quote }}&rdquo; <cite>{{ site.data.inspirational-quotes[random].person }}</cite></blockquote>

3
这个更改是一直有效还是只有在重建整个网站时才有效? - eveevans
5
是的,Jekyll是一个静态网站生成器,因此在构建时以外的任何时间都无法进行动态操作。 - wjdp
3
我使用了 page.title.size 而不是时间/日期来实现在包含文件中的运行(因为每个页面的时间/日期都是相同的)。我利用它在文章/页面底部放置随机广告/消息。 - Ron
请问您能否给我们一个完整的示例(JSON格式,全局变量等),我无法让它工作... - Damjan Pavlica

13

我发现这篇文章对使用Liquid生成数字非常有用,虽然不是很简单,但它是生成具有最小/最大值的随机数的最优雅的方式。

以下示例生成介于65和80之间的数字。

{% assign min = 65 %}
{% assign max = 80 %}
{% assign diff = max | minus: min %}
{% assign randomNumber = "now" | date: "%N" | modulo: diff | plus: min %}

1
如何使数字在0和1之间,我觉得这种方法会返回整数而不是实数值。 - bachr

4
我曾经有一个类似的想法,为了解决这个问题,我写了一个插件(见下文)。正如Peter所指出的那样,随机选择将在生成时发生。因此,如果您正在寻找动态内容,您需要去其他地方查找。
无论如何,以下是我编写的插件(我将其放在_plugins目录中,例如.../_plugins/randomPage.rb):
# Outputs a random page link
#
# Usage:
#   {{ site.pages | random_page }}
#   {{ site.collection_name | random_page }}
#   {% assign myPage = site.collection_name | random_page %}
#   <a href="{{ myPage }}">{{myPage}}</a>
#   {% assign myPage = site.pages | random_page %}
#   <a href="{{ myPage }}">{{myPage}}</a>

module RandomPageSelector
    def random_page( input )
        index = rand(0...input.length)
        "#{input[index].url}"
    end
end

Liquid::Template.register_filter(RandomPageSelector)

3
我有类似的想法,开始定义一个自定义的Liquid标签(请参见http://github.com/mojombo/jekyll/wiki/Plugins),通过context.registers访问文章并随机选择其中一些,但请注意,一旦Jekyll生成您的网站,该随机选择将保持静态状态,直到重新生成网站。我建议采用另一种选项:让Jekyll将所有这些文章链接写入JavaScript数组(内联包含在布局中),然后对其进行洗牌,并在页面上显示前三个链接。您甚至可以增强此功能,使这三个链接与数组中的其他链接轮换,使用setInterval()调用。这不是最优雅的解决方案,但动态生成随机内容似乎与Jekyll的设计哲学不太相符。

1

我编写了一个小型的Jekyll插件,可以生成任意长度的随机十六进制字符串。插件已经记录在案,连同我的其他Jekyll插件一起。以下是源代码:

require 'securerandom'

module RandomNumber
    def random_hex_string(n)
      SecureRandom.hex(n)
    end
end

Liquid::Template.register_filter(RandomNumber)

使用示例

这将生成一个随机的十六进制字符串,长度为6个字符,并将结果存储在名为id的Liquid变量中。 由于此插件是作为过滤器实现的,因此首先写入要生成的十六进制字符数(6),然后是管道符号(竖线),接着是过滤器的名称(random)。

{% assign id = 6 | random_hex_string %}

生成的6个字符可能是:51e2160d4bdf

安装

  1. 将上述代码另存为random_hex.rb并将文件放置在_plugins目录中。
  2. 重新启动Jekyll。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接