module Rbem

Constants

VERSION

Public Instance Methods

b(*args, &block) click to toggle source
# File lib/rbem.rb, line 10
def b(*args, &block)
  _args = parse_args(args)

  @block_name = _args[:name]
  @block_mods = _args[:mods]

  block_type  = _args[:type]
  block_opts  = _args[:options]

  block_opts[:class] = collect_bem_class(@block_name, @block_mods, block_opts, type: :block)

  content_tag(block_type, block_given? ? capture(&block) : nil, block_opts)
end
e(*args, &block) click to toggle source
# File lib/rbem.rb, line 24
def e(*args, &block)
  _args = parse_args(args)

  el_name = _args[:name]
  el_mods = _args[:mods]

  el_type = _args[:type]
  el_opts = _args[:options]

  el_opts[:class] = collect_bem_class(el_name,
                                      el_mods,
                                      el_opts,
                                      type: :element,
                                      inherit_names: _args[:i_names],
                                      inherit_mods: _args[:i_mods] )

  content_tag(el_type, block_given? ? capture(&block) : nil, el_opts)
end

Private Instance Methods

collect_bem_class(name, mods, options, type: nil, inherit_names: nil, inherit_mods: nil) click to toggle source
# File lib/rbem.rb, line 73
def collect_bem_class(name, mods, options, type: nil, inherit_names: nil, inherit_mods: nil)
  _separ = @@notation
  _separ = '_' unless _separ.is_a?(String)

  _class = []

  if type === :block
    _class << "#{name}"
    if mods
      for mod in mods
        _class << "#{name}#{_separ}#{mod}"
      end
    end
  end

  if type === :element

    # block__element
    _class << "#{@block_name}__#{name}"

    # block__element_mod
    if mods
      for mod in mods
        mod = mod.split(':')[0].sub('&','')
        _class << "#{@block_name}__#{name}#{_separ}#{mod}"
      end
    end

    # block_mod__element
    if inherit_names and @block_mods.present?
      for inherit_name in inherit_names
        _class << "#{@block_name}#{_separ}#{inherit_name}__#{name}"
      end
    end

    # block_mod__element_mod
    if inherit_mods and mods and @block_mods.present?
      for i_mod in inherit_mods
        el_mod = i_mod.split(':')[0].sub('&','')
        block_mods = i_mod.split(':')
        block_mods.shift
        if block_mods.empty?
          block_mods = @block_mods
        end
        for block_mod in block_mods
          _class << "#{@block_name}#{_separ}#{block_mod}__#{name}#{_separ}#{el_mod}"
        end
      end
    end
  end

  if options and options.has_key?(:class)
    _extra_class = options[:class].split(' ')
  else
    _extra_class = []
  end

  _class.concat(_extra_class).flatten.join(' ')
end
parse_args(args) click to toggle source
# File lib/rbem.rb, line 45
def parse_args(args)
  _name_mod   = args.select{ |e| e.is_a?(String) }
  _type       = args.select{ |e| e.is_a?(Symbol) }
  _options    = args.select{ |e| e.is_a?(Hash) }
  _return     = {}

  if _name_mod[0].present?
    _return[:name]    = _name_mod[0].sub('&','').split(':')[0]
    if _name_mod[0].start_with?('&')
      _names = _name_mod[0].split(':')
      _names.shift
      if _names.empty?
        _names = @block_mods
      end
      _return[:i_names] = _names
    end
  end

  if _name_mod[1].present?
    _return[:mods]    = _name_mod[1].split.map { |e| e.sub('&','') }
    _return[:i_mods]  = _name_mod[1].split.select { |e| e.start_with?('&') }
  end

  _return[:type]      = _type[0] || :div
  _return[:options]   = _options[0] || {}
  _return
end