Sha256: 2704bac273d14d6040c955032317778b9b07a1de3196857097624542a2f0ab21

Contents?: true

Size: 1.89 KB

Versions: 28

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

28 entries across 28 versions & 1 rubygems

Version Path
wunderbar-1.0.21 lib/wunderbar/cssproxy.rb
wunderbar-1.0.20 lib/wunderbar/cssproxy.rb
wunderbar-1.0.19 lib/wunderbar/cssproxy.rb
wunderbar-1.0.18 lib/wunderbar/cssproxy.rb
wunderbar-1.0.17 lib/wunderbar/cssproxy.rb
wunderbar-1.0.16 lib/wunderbar/cssproxy.rb
wunderbar-1.0.15 lib/wunderbar/cssproxy.rb
wunderbar-1.0.14 lib/wunderbar/cssproxy.rb
wunderbar-1.0.13 lib/wunderbar/cssproxy.rb
wunderbar-1.0.12 lib/wunderbar/cssproxy.rb
wunderbar-1.0.11 lib/wunderbar/cssproxy.rb
wunderbar-1.0.10 lib/wunderbar/cssproxy.rb
wunderbar-1.0.9 lib/wunderbar/cssproxy.rb
wunderbar-1.0.8 lib/wunderbar/cssproxy.rb
wunderbar-1.0.7 lib/wunderbar/cssproxy.rb
wunderbar-1.0.6 lib/wunderbar/cssproxy.rb
wunderbar-1.0.5 lib/wunderbar/cssproxy.rb
wunderbar-1.0.4 lib/wunderbar/cssproxy.rb
wunderbar-1.0.3 lib/wunderbar/cssproxy.rb
wunderbar-1.0.2 lib/wunderbar/cssproxy.rb