Class: Dommy::Selection

Inherits:
Object
  • Object
show all
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

Constructor Details

#initialize(document) ⇒ Selection

Returns a new instance of Selection.



482
483
484
485
# File 'lib/dommy/range.rb', line 482

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

Instance Method Details

#__js_call__(method, args) ⇒ Object



576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
# File 'lib/dommy/range.rb', line 576

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



557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
# File 'lib/dommy/range.rb', line 557

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



495
496
497
498
499
500
# File 'lib/dommy/range.rb', line 495

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



535
536
537
# File 'lib/dommy/range.rb', line 535

def anchor_node
  @ranges.first&.start_container
end

#anchor_offsetObject



539
540
541
# File 'lib/dommy/range.rb', line 539

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

#collapse(node, offset = 0) ⇒ Object



516
517
518
519
520
521
522
# File 'lib/dommy/range.rb', line 516

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



512
513
514
# File 'lib/dommy/range.rb', line 512

def empty
  remove_all_ranges
end

#focus_nodeObject



543
544
545
# File 'lib/dommy/range.rb', line 543

def focus_node
  @ranges.first&.end_container
end

#focus_offsetObject



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

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

#get_range_at(index) ⇒ Object



491
492
493
# File 'lib/dommy/range.rb', line 491

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

#is_collapsedObject Also known as: isCollapsed



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

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

#range_countObject



487
488
489
# File 'lib/dommy/range.rb', line 487

def range_count
  @ranges.length
end

#remove_all_rangesObject



507
508
509
510
# File 'lib/dommy/range.rb', line 507

def remove_all_ranges
  @ranges.clear
  nil
end

#remove_range(range) ⇒ Object



502
503
504
505
# File 'lib/dommy/range.rb', line 502

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

#select_all_children(node) ⇒ Object



524
525
526
527
528
529
# File 'lib/dommy/range.rb', line 524

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

#to_sObject



531
532
533
# File 'lib/dommy/range.rb', line 531

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