Sha256: 3c0e474bc45e88983b9e7f8b48c4917ab01eac693e77641ec35542e7c09d4a64

Contents?: true

Size: 1.89 KB

Versions: 32

Compression:

Stored size: 1.89 KB

Contents

module Wunderbar
  # 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.
  class CssProxy < BasicObject
    def initialize(builder, node)
      @builder = builder
      @node = node
    end

    def node?
      @node
    end

  private

    # Adds attributes to an element.  Bang methods set the :id attribute.
    # Other methods add to the :class attribute.
    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
  end
end

Version data entries

32 entries across 32 versions & 1 rubygems

Version Path
wunderbar-1.6.0 lib/wunderbar/cssproxy.rb
wunderbar-1.5.1 lib/wunderbar/cssproxy.rb
wunderbar-1.5.0 lib/wunderbar/cssproxy.rb
wunderbar-1.4.5 lib/wunderbar/cssproxy.rb
wunderbar-1.4.2 lib/wunderbar/cssproxy.rb
wunderbar-1.4.1 lib/wunderbar/cssproxy.rb
wunderbar-1.4.0 lib/wunderbar/cssproxy.rb
wunderbar-1.3.4 lib/wunderbar/cssproxy.rb
wunderbar-1.3.3 lib/wunderbar/cssproxy.rb
wunderbar-1.3.2 lib/wunderbar/cssproxy.rb
wunderbar-1.3.1 lib/wunderbar/cssproxy.rb
wunderbar-1.3.0 lib/wunderbar/cssproxy.rb
wunderbar-1.2.10 lib/wunderbar/cssproxy.rb
wunderbar-1.2.9 lib/wunderbar/cssproxy.rb
wunderbar-1.2.8 lib/wunderbar/cssproxy.rb
wunderbar-1.2.7 lib/wunderbar/cssproxy.rb
wunderbar-1.2.6 lib/wunderbar/cssproxy.rb
wunderbar-1.2.5 lib/wunderbar/cssproxy.rb
wunderbar-1.2.4 lib/wunderbar/cssproxy.rb
wunderbar-1.2.3 lib/wunderbar/cssproxy.rb