在液体中串联阵列

Concatenate arrays in liquid

我试图在 liquid/jekyll 中连接三个数组,但在最终数组(出版物)中我只得到第一个数组(论文)的元素

{% assign papers = (site.publications | where:"type","paper" | sort: 'date') | reverse %}
{% assign posters = (site.publications | where:"type","poster" | sort: 'date') | reverse %}
{% assign abstracts = (site.publications | where:"type","abstract" | sort: 'date') | reverse %}
{% assign publications = papers | concat: posters | concat: abstracts %}

我错过了什么?

新答案

Jekyll 现在使用 Liquid 4.x。所以我们可以使用 concat 过滤器 !

旧答案

concat 过滤器不是当前液体的一部分 gem (3.0.6) 由 jekyll 3.2.1 使用。

它只会以液体 4 (https://github.com/Shopify/liquid/blob/v4.0.0.rc3/lib/liquid/standardfilters.rb#L218) 的形式提供。

我可能会在 Jekyll 4 上可用。

与此同时,这个插件可以完成这项工作:

=begin
  Jekyll filter to concatenate arrays
  Usage:
    {% assign result = array-1 | concatArray: array-2 %}
=end
module Jekyll
  module ConcatArrays

    # copied from https://github.com/Shopify/liquid/blob/v4.0.0.rc3/lib/liquid/standardfilters.rb
    def concat(input, array)
      unless array.respond_to?(:to_ary)
        raise ArgumentError.new("concat filter requires an array argument")
      end
      InputIterator.new(input).concat(array)
    end

   class InputIterator
      include Enumerable

      def initialize(input)
        @input = if input.is_a?(Array)
          input.flatten
        elsif input.is_a?(Hash)
          [input]
        elsif input.is_a?(Enumerable)
          input
        else
          Array(input)
        end
      end

      def concat(args)
        to_a.concat(args)
      end

      def each
        @input.each do |e|
          yield(e.respond_to?(:to_liquid) ? e.to_liquid : e)
        end
      end
    end

  end
end

Liquid::Template.register_filter(Jekyll::ConcatArrays)