杰基尔随机排序集合

时间:2012-07-09 14:35:10

标签: html jekyll liquid

我今天花了很多时间尝试用Jekyll为http://bitcoin.org/clients.html

做一些简单的事情

我们有一个比特币软件列表,每隔一段时间该页面就会被重新生成。如果客户的订单被随机化以获得相同的曝光,那将是件好事。

{% random page.clients %}
{% for client in page.clients %}
  ...

我确信这很简单:

class Random < Liquid::Tag
  def initialize(tag_name, collection_name, tokens)
    @collection_name = collection_name.to_s
    super
  end

  def render(context)
    collection = context[@collection_name]
    collection = collection.sort_by{rand}
    context[@collection_name] = collection
    super
  end
end

Liquid::Template.register_tag('random', Random)

为什么不起作用?我看到绝对没有变化。

我假设我没有正确分配给page.clients,因为如果我尝试:

context[:foo] = collection

{% random page.clients %}
{% for client in page.clients %}
  ...

然后我得到一个空白页面。但是打印@collection_name会显示“page.clients”...

有什么想法吗?

由于

2 个答案:

答案 0 :(得分:3)

class Random < Liquid::Tag
  Syntax = /(\w+[.]?\w+)\s+(\w+)/o

  def initialize(tag_name, markup, tokens)
    if markup =~ Syntax
      @collection_name = $1
      @randomized_name = $2
    else
      raise SyntaxError.new("Syntax Error in 'random' - Valid syntax: random [source] [var]")
    end
    super
  end

  def render(context)
    collection = context[@collection_name]
    collection = collection.sort_by{rand}
    context[@randomized_name] = collection
    return
  end
end

Liquid::Template.register_tag('random', Random)

      {% random page.clients clients %}
      {% for client in clients %}
         ...

答案 1 :(得分:2)

现在可以使用Jekyll "sample" filter ..

来实现

例如,随机获得3个帖子......

{% assign posts = site.posts | sample:3 %}
{% for post in posts %}
...
{% endfor %}