Sha256: c3fd7cdaefddbb697c54629714df14349cb934777f7e2617ca5f4efe4f28200f

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'
require 'active_support/core_ext/hash/indifferent_access'

module Bemer
  class ModifierList
    def initialize(block, element, mods)
      @bem_class = Bemer.bem_class(block, element)
      @modifiers = nil
      @mods      = mods
    end

    def to_a
      @mods_as_array ||= to_h.map { |name, value| build_css_class(name, value) }
    end

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

    def to_h
      modifiers.nil? ? build_modifiers : modifiers
    end

    protected

    attr_reader :modifiers

    def build_modifiers
      @modifiers = ActiveSupport::HashWithIndifferentAccess.new

      return modifiers if @mods.blank? || @bem_class.blank?

      Array(@mods).each do |mods|
        next if mods.blank?

        mods.is_a?(Hash) ? mods.each { |attrs| add_modifier(attrs) } : add_modifier(mods)
      end

      modifiers
    end

    def add_modifier(attrs)
      name, value = normalize(attrs)

      return if name.blank? || value.blank?

      modifiers[name] = value
    end

    def normalize(attrs)
      name, value = *attrs, true

      value = Bemer.css_class(value) unless [TrueClass, FalseClass, NilClass].include?(value.class)

      [Bemer.css_class(name), value]
    end

    def build_css_class(name, value)
      # rubocop:disable Metrics/LineLength
      modifier = value.instance_of?(TrueClass) ? name : [name, value].join(Bemer.modifier_value_separator)
      # rubocop:enable Metrics/LineLength

      [@bem_class, modifier].join(Bemer.modifier_name_separator)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

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