class Wunderbar::CssProxy

Class inspired by Markaby to store element options. Methods called against the CssProxy object are added as element classes or IDs.

See the README for examples.

Public Class Methods

new(builder, node) click to toggle source
# File lib/wunderbar/cssproxy.rb, line 7
def initialize(builder, node)
  @builder = builder
  @node = node
end

Public Instance Methods

node?() click to toggle source
# File lib/wunderbar/cssproxy.rb, line 12
def node?
  @node
end

Private Instance Methods

method_missing(id_or_class, *args, &block) click to toggle source

Adds attributes to an element. Bang methods set the :id attribute. Other methods add to the :class attribute.

# File lib/wunderbar/cssproxy.rb, line 20
def method_missing(id_or_class, *args, &block)
  empty = args.empty?
  attrs = @node.attrs
  id_or_class = id_or_class.to_s.gsub('_', '-')

  if id_or_class =~ /(.*)!$/
    attrs[:id] = $1
  elsif attrs[:class]
    attrs[:class] = "#{attrs[:class]} #{id_or_class}"
  else
    attrs[:class] = id_or_class
  end

  iterable = block && block.arity != 0
  if args.last.respond_to? :to_hash and not iterable
    hash = args.pop.to_hash 
    if attrs[:class] and hash[:class]
      hash[:class] = "#{attrs[:class]} #{hash[:class]}"
    end
    attrs.merge! hash
  end
  args.push(attrs)

  @node.parent.children.delete(@node)

  if empty and not block
    proxy = @builder.proxiable_tag! @node.name, *args
    class << proxy.node?; include SpacedNode; end  if SpacedNode  === @node
    class << proxy.node?; include CompactNode; end if CompactNode === @node
    proxy
  else
    name = @node.name.to_s.gsub('-', '_')
    if CompactNode === @node and @node.name != :pre
      if SpacedNode === @node
        @builder.__send__ "_#{name}_!", *args, &block
      else
        @builder.__send__ "_#{name}!", *args, &block
      end
    elsif SpacedNode === @node
      @builder.__send__ "_#{name}_", *args, &block
    else
      @builder.__send__ "_#{name}", *args, &block
    end
  end
end