Class: Dommy::Selection

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

Overview

‘Selection` — represents user-selected ranges in the document. Always at most one range in Dommy’s stub implementation (matching common browser behavior).

Spec: www.w3.org/TR/selection-api/

Instance Method Summary collapse

Methods included from Bridge::Methods

included

Constructor Details

#initialize(document) ⇒ Selection

Returns a new instance of Selection.



547
548
549
550
# File 'lib/dommy/range.rb', line 547

def initialize(document)
  @document = document
  @ranges = []
end

Instance Method Details

#__js_call__(method, args) ⇒ Object



645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
# File 'lib/dommy/range.rb', line 645

def __js_call__(method, args)
  case method
  when "getRangeAt"
    get_range_at(args[0])
  when "addRange"
    add_range(args[0])
  when "removeRange"
    remove_range(args[0])
  when "removeAllRanges"
    remove_all_ranges
  when "empty"
    empty
  when "collapse"
    collapse(args[0], args[1] || 0)
  when "selectAllChildren"
    select_all_children(args[0])
  when "toString"
    to_s
  end
end

#__js_get__(key) ⇒ Object



622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
# File 'lib/dommy/range.rb', line 622

def __js_get__(key)
  case key
  when "rangeCount"
    range_count
  when "anchorNode"
    anchor_node
  when "anchorOffset"
    anchor_offset
  when "focusNode"
    focus_node
  when "focusOffset"
    focus_offset
  when "isCollapsed"
    is_collapsed
  when "type"
    is_collapsed ? "Caret" : "Range"
  end
end

#add_range(range) ⇒ Object



560
561
562
563
564
565
# File 'lib/dommy/range.rb', line 560

def add_range(range)
  # Spec says modern browsers ignore add_range if a range already
  # exists; we keep the behavior simple and replace.
  @ranges = [range]
  nil
end

#anchor_nodeObject



600
601
602
# File 'lib/dommy/range.rb', line 600

def anchor_node
  @ranges.first&.start_container
end

#anchor_offsetObject



604
605
606
# File 'lib/dommy/range.rb', line 604

def anchor_offset
  @ranges.first&.start_offset || 0
end

#collapse(node, offset = 0) ⇒ Object



581
582
583
584
585
586
587
# File 'lib/dommy/range.rb', line 581

def collapse(node, offset = 0)
  range = Range.new(@document)
  range.set_start(node, offset)
  range.set_end(node, offset)
  add_range(range)
  nil
end

#emptyObject



577
578
579
# File 'lib/dommy/range.rb', line 577

def empty
  remove_all_ranges
end

#focus_nodeObject



608
609
610
# File 'lib/dommy/range.rb', line 608

def focus_node
  @ranges.first&.end_container
end

#focus_offsetObject



612
613
614
# File 'lib/dommy/range.rb', line 612

def focus_offset
  @ranges.first&.end_offset || 0
end

#get_range_at(index) ⇒ Object



556
557
558
# File 'lib/dommy/range.rb', line 556

def get_range_at(index)
  @ranges[index.to_i]
end

#is_collapsedObject Also known as: isCollapsed



616
617
618
# File 'lib/dommy/range.rb', line 616

def is_collapsed
  @ranges.empty? || @ranges.first.collapsed?
end

#range_countObject



552
553
554
# File 'lib/dommy/range.rb', line 552

def range_count
  @ranges.length
end

#remove_all_rangesObject



572
573
574
575
# File 'lib/dommy/range.rb', line 572

def remove_all_ranges
  @ranges.clear
  nil
end

#remove_range(range) ⇒ Object



567
568
569
570
# File 'lib/dommy/range.rb', line 567

def remove_range(range)
  @ranges.delete(range)
  nil
end

#select_all_children(node) ⇒ Object



589
590
591
592
593
594
# File 'lib/dommy/range.rb', line 589

def select_all_children(node)
  range = Range.new(@document)
  range.select_node_contents(node)
  add_range(range)
  nil
end

#to_sObject



596
597
598
# File 'lib/dommy/range.rb', line 596

def to_s
  @ranges.map(&:to_s).join
end