3

我今天花了一些时间尝试用 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”...

有任何想法吗?

谢谢

4

2 回答 2

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 %}
         ...
于 2012-07-10T10:38:48.633 回答
3

现在可以使用Jekyll “sample”过滤器来实现。

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

{% assign posts = site.posts | sample:3 %}
{% for post in posts %}
...
{% endfor %}
于 2016-11-23T13:19:48.020 回答