Sha256: 0f2b2ba6e9456ee032c8ac9729584a39cf40f67673b1417eedaaf6694f2551bc

Contents?: true

Size: 1.73 KB

Versions: 31

Compression:

Stored size: 1.73 KB

Contents

# frozen_string_literal: true

module Jekyll
  module Filters
    module GroupingFilters
      # Group an array of items by a property
      #
      # input - the inputted Enumerable
      # property - the property
      #
      # Returns an array of Hashes, each looking something like this:
      #  {"name"  => "larry"
      #   "items" => [...] } # all the items where `property` == "larry"
      def group_by(input, property)
        if groupable?(input)
          groups = input.group_by { |item| item_property(item, property).to_s }
          grouped_array(groups)
        else
          input
        end
      end

      # Group an array of items by an expression
      #
      # input - the object array
      # variable - the variable to assign each item to in the expression
      # expression -a Liquid comparison expression passed in as a string
      #
      # Returns the filtered array of objects
      def group_by_exp(input, variable, expression)
        return input unless groupable?(input)

        parsed_expr = parse_expression(expression)
        @context.stack do
          groups = input.group_by do |item|
            @context[variable] = item
            parsed_expr.render(@context)
          end
          grouped_array(groups)
        end
      end

      private
      def parse_expression(str)
        Liquid::Variable.new(str, Liquid::ParseContext.new)
      end

      private
      def groupable?(element)
        element.respond_to?(:group_by)
      end

      private
      def grouped_array(groups)
        groups.each_with_object([]) do |item, array|
          array << {
            "name"  => item.first,
            "items" => item.last,
            "size"  => item.last.size,
          }
        end
      end
    end
  end
end

Version data entries

31 entries across 31 versions & 3 rubygems

Version Path
jekyll-3.10.0 lib/jekyll/filters/grouping_filters.rb
jekyll-3.9.5 lib/jekyll/filters/grouping_filters.rb
jekyll-3.9.4 lib/jekyll/filters/grouping_filters.rb
jekyll-3.9.3 lib/jekyll/filters/grouping_filters.rb
jekyll-3.9.2 lib/jekyll/filters/grouping_filters.rb
liquidoc-0.12.1.pre.rc1 lib/liquid/filters/grouping_filters.rb
liquidoc-0.12.0 lib/liquid/filters/grouping_filters.rb
liquidoc-0.12.0.pre.rc6 lib/liquid/filters/grouping_filters.rb
jekyll-3.9.1 lib/jekyll/filters/grouping_filters.rb
jekyll-3.9.0 lib/jekyll/filters/grouping_filters.rb
jekyll-3.8.7 lib/jekyll/filters/grouping_filters.rb
jekyll-3.8.6 lib/jekyll/filters/grouping_filters.rb
jekyll-3.8.5 lib/jekyll/filters/grouping_filters.rb
jekyll-3.6.3 lib/jekyll/filters/grouping_filters.rb
jekyll-3.8.4 lib/jekyll/filters/grouping_filters.rb
jekyll-3.7.4 lib/jekyll/filters/grouping_filters.rb
jekyll-3.8.3 lib/jekyll/filters/grouping_filters.rb
jekyll-3.8.2 lib/jekyll/filters/grouping_filters.rb
jekyll-3.8.1 lib/jekyll/filters/grouping_filters.rb
jekyll-3.8.0 lib/jekyll/filters/grouping_filters.rb