Sha256: 7eef9d7a0512aa67fa8a1e1446504c6f38516097d177d6417be8ef0154c5004f

Contents?: true

Size: 1.71 KB

Versions: 83

Compression:

Stored size: 1.71 KB

Contents

# frozen_string_literal: true

module Bridgetown
  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

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

      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

83 entries across 83 versions & 1 rubygems

Version Path
bridgetown-core-0.16.0.beta2 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.16.0.beta1 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.15.0 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.15.0.beta4 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.15.0.beta3 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.15.0.beta2 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.15.0.beta1 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.14.1 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.14.0 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.13.0 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.12.1 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.12.0 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.11.2 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.11.1 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.11.0 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.10.2 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.10.1 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.10.0 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.9.0 lib/bridgetown-core/filters/grouping_filters.rb
bridgetown-core-0.8.1 lib/bridgetown-core/filters/grouping_filters.rb