Sha256: ef38be8ed3698896af5d419a16c6a6602a7931bd89d9f577eea28a17d06161d0

Contents?: true

Size: 1.57 KB

Versions: 1

Compression:

Stored size: 1.57 KB

Contents

# frozen_string_literal: true

require 'active_support/core_ext/object/blank'

module Bemer
  class MixinList
    def initialize(mix)
      @mix    = mix
      @mixins = nil
    end

    def to_a
      build_mixins
    end

    def to_s
      @mix_as_string ||= to_a.join(' ')
    end

    protected

    attr_reader :mixins

    def build_mixins
      return mixins unless mixins.nil?

      mix = @mix.instance_of?(Hash) ? build_mixins_from_hash : build_mixins_from_array

      @mixins = mix.flatten.reject(&:blank?).uniq
    end

    def build_mixin(mixin)
      return mixin.split if mixin.instance_of?(String)

      case mixin
      when Symbol then Bemer.bem_class(mixin)
      when Array  then build_mixin_from_array(mixin)
      when Hash   then build_mixin_from_hash(mixin)
      end
    end

    def build_mixin_from_hash(mixin)
      mixin.map do |block, element|
        next Bemer.bem_class(block, element) unless element.instance_of?(Array)

        element.map { |elem| Bemer.bem_class(block, elem) }
      end
    end

    def build_mixin_from_array(mixin)
      block, element = *mixin

      return Bemer.bem_class(block, element) unless element.instance_of?(Array)

      element.map { |elem| Bemer.bem_class(block, elem) }
    end

    def build_mixins_from_hash
      @mix.map do |mixin|
        next if mixin.blank?

        build_mixin(mixin)
      end
    end

    def build_mixins_from_array
      Array(@mix).map do |mixin|
        next if mixin.blank?

        mixin.instance_of?(Array) ? mixin.map { |mix| build_mixin(mix) } : build_mixin(mixin)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
bemer-0.1.0 lib/bemer/mixin_list.rb