Class: Dommy::StyleDeclaration

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/dommy/element.rb

Constant Summary collapse

JS_METHOD_NAMES =

Methods routed through js_call (keep in sync with its when-arms).

%w[setProperty removeProperty getPropertyValue item].freeze

Instance Method Summary collapse

Constructor Details

#initialize(element) ⇒ StyleDeclaration

Returns a new instance of StyleDeclaration.



671
672
673
# File 'lib/dommy/element.rb', line 671

def initialize(element)
  @element = element
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args) ⇒ Object

camelCase JS property accessors → kebab-case CSS property name. ‘style.backgroundColor = “red”` becomes `background-color: red`.



718
719
720
721
722
723
724
725
726
727
# File 'lib/dommy/element.rb', line 718

def method_missing(name, *args)
  key = method_to_css_name(name)
  if name.to_s.end_with?("=")
    set_property(key, args.first)
  elsif properties.key?(key)
    properties[key]
  else
    ""
  end
end

Instance Method Details

#[](key) ⇒ Object

style` returns the property name at that index (matches `style.item(i)` in real DOM). String key form (`style`) is a convenience shortcut for `getPropertyValue`.



700
701
702
703
704
705
706
# File 'lib/dommy/element.rb', line 700

def [](key)
  if key.is_a?(Integer)
    properties.keys[key]
  else
    properties[key.to_s]
  end
end

#[]=(name, value) ⇒ Object



708
709
710
# File 'lib/dommy/element.rb', line 708

def []=(name, value)
  set_property(name, value)
end

#__js_call__(method, args) ⇒ Object



765
766
767
768
769
770
771
772
773
774
775
776
777
778
# File 'lib/dommy/element.rb', line 765

def __js_call__(method, args)
  case method
  when "setProperty"
    set_property(args[0], args[1])
  when "removeProperty"
    remove_property(args[0])
  when "getPropertyValue"
    properties[args[0].to_s]
  when "item"
    properties.keys[args[0].to_i]
  else
    nil
  end
end

#__js_get__(key) ⇒ Object



733
734
735
736
737
738
739
740
741
742
743
744
745
746
# File 'lib/dommy/element.rb', line 733

def __js_get__(key)
  case key
  when "cssText"
    css_text
  when "length"
    length
  else
    if key.is_a?(Integer) || key.to_s.match?(/\A-?\d+\z/)
      self[key.to_i]
    else
      properties[method_to_css_name(key)]
    end
  end
end

#__js_method_names__Object



761
762
763
# File 'lib/dommy/element.rb', line 761

def __js_method_names__
  JS_METHOD_NAMES
end

#__js_set__(key, value) ⇒ Object



748
749
750
751
752
753
754
755
756
757
# File 'lib/dommy/element.rb', line 748

def __js_set__(key, value)
  case key
  when "cssText"
    self.css_text = value
  else
    set_property(method_to_css_name(key), value)
  end

  nil
end

#css_textObject

CSSStyleDeclaration interface: cssText round-trips the full ‘style` attribute. Setter parses semicolon-separated entries.



677
678
679
# File 'lib/dommy/element.rb', line 677

def css_text
  properties.map { |k, v| "#{k}:#{v}" }.join(";")
end

#css_text=(value) ⇒ Object



681
682
683
684
685
686
687
688
689
690
691
# File 'lib/dommy/element.rb', line 681

def css_text=(value)
  props = {}
  value.to_s.split(";").each do |entry|
    key, val = entry.split(":", 2)
    next unless key && val

    props[key.strip] = val.strip
  end

  write_properties(props)
end

#each(&blk) ⇒ Object



712
713
714
# File 'lib/dommy/element.rb', line 712

def each(&blk)
  properties.keys.each(&blk)
end

#lengthObject



693
694
695
# File 'lib/dommy/element.rb', line 693

def length
  properties.size
end

#respond_to_missing?(_name, _include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


729
730
731
# File 'lib/dommy/element.rb', line 729

def respond_to_missing?(_name, _include_private = false)
  true
end