Class: Dommy::MediaList

Inherits:
Object
  • Object
show all
Includes:
Bridge::Methods
Defined in:
lib/dommy/css.rb

Overview

MediaList — the CSSOM list of comma-separated media queries behind CSSMediaRule#media (and <style>/<link>/CSSStyleSheet#media). Indexed, with mediaText/append/delete editing; on_change (optional) is called with the new media text after any mutation so the owner can persist it.

Instance Method Summary collapse

Methods included from Bridge::Methods

included

Constructor Details

#initialize(media_text = "", on_change: nil) ⇒ MediaList

Returns a new instance of MediaList.



631
632
633
634
# File 'lib/dommy/css.rb', line 631

def initialize(media_text = "", on_change: nil)
  @items = parse(media_text)
  @on_change = on_change
end

Instance Method Details

#__js_call__(method, args) ⇒ Object



693
694
695
696
697
698
699
700
# File 'lib/dommy/css.rb', line 693

def __js_call__(method, args)
  case method
  when "item" then item(args[0])
  when "appendMedium" then append_medium(args[0])
  when "deleteMedium" then delete_medium(args[0])
  when "toString" then to_s
  end
end

#__js_get__(key) ⇒ Object



674
675
676
677
678
679
680
681
# File 'lib/dommy/css.rb', line 674

def __js_get__(key)
  case key
  when "length" then length
  when "mediaText" then media_text
  else
    item(key.to_i) if key.is_a?(Integer) || key.to_s.match?(/\A\d+\z/)
  end
end

#__js_set__(key, value) ⇒ Object



683
684
685
686
687
688
689
# File 'lib/dommy/css.rb', line 683

def __js_set__(key, value)
  return Bridge::UNHANDLED unless key == "mediaText"

  # [LegacyNullToEmptyString]: `media.mediaText = null` clears it.
  self.media_text = value.nil? ? "" : value
  nil
end

#append_medium(medium) ⇒ Object

css-mediaqueries: appendMedium is a no-op when the medium is already present (case-insensitively); deleteMedium removes every match.



656
657
658
659
660
661
662
# File 'lib/dommy/css.rb', line 656

def append_medium(medium)
  medium = medium.to_s.strip
  return if medium.empty? || @items.any? { |existing| existing.casecmp(medium).zero? }

  @items << medium
  notify
end

#delete_medium(medium) ⇒ Object



664
665
666
667
668
# File 'lib/dommy/css.rb', line 664

def delete_medium(medium)
  medium = medium.to_s.strip
  @items.reject! { |existing| existing.casecmp(medium).zero? }
  notify
end

#item(index) ⇒ Object



640
641
642
643
# File 'lib/dommy/css.rb', line 640

def item(index)
  i = index.to_i
  i.negative? || i >= @items.length ? nil : @items[i]
end

#lengthObject



636
637
638
# File 'lib/dommy/css.rb', line 636

def length
  @items.length
end

#media_textObject



645
646
647
# File 'lib/dommy/css.rb', line 645

def media_text
  @items.join(", ")
end

#media_text=(text) ⇒ Object



649
650
651
652
# File 'lib/dommy/css.rb', line 649

def media_text=(text)
  @items = parse(text)
  notify
end

#to_sObject



670
671
672
# File 'lib/dommy/css.rb', line 670

def to_s
  media_text
end