Class: Dommy::NodeIterator

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

Overview

NodeIterator — flat-list traversal. Same filter semantics as TreeWalker but no sibling/parent navigation, just ‘next_node` / `previous_node` over a depth-first sequence anchored to `root`.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Bridge::Methods

included

Constructor Details

#initialize(root, what_to_show = NodeFilter::SHOW_ALL, filter = nil) ⇒ NodeIterator

Returns a new instance of NodeIterator.



403
404
405
406
407
408
409
# File 'lib/dommy/tree_walker.rb', line 403

def initialize(root, what_to_show = NodeFilter::SHOW_ALL, filter = nil)
  @root = root
  @what_to_show = what_to_show.to_i
  @filter = filter
  @reference_node = root
  @pointer_before_reference = true
end

Instance Attribute Details

#filterObject (readonly)

Returns the value of attribute filter.



401
402
403
# File 'lib/dommy/tree_walker.rb', line 401

def filter
  @filter
end

#rootObject (readonly)

Returns the value of attribute root.



401
402
403
# File 'lib/dommy/tree_walker.rb', line 401

def root
  @root
end

#what_to_showObject (readonly)

Returns the value of attribute what_to_show.



401
402
403
# File 'lib/dommy/tree_walker.rb', line 401

def what_to_show
  @what_to_show
end

Instance Method Details

#__js_call__(method, _args) ⇒ Object



498
499
500
501
502
503
504
505
506
507
# File 'lib/dommy/tree_walker.rb', line 498

def __js_call__(method, _args)
  case method
  when "nextNode"
    next_node
  when "previousNode"
    previous_node
  when "detach"
    detach
  end
end

#__js_get__(key) ⇒ Object



481
482
483
484
485
486
487
488
489
490
491
492
493
494
# File 'lib/dommy/tree_walker.rb', line 481

def __js_get__(key)
  case key
  when "root"
    @root
  when "whatToShow"
    @what_to_show
  when "filter"
    @filter
  when "referenceNode"
    @reference_node
  when "pointerBeforeReferenceNode"
    @pointer_before_reference
  end
end

#detachObject



453
454
455
# File 'lib/dommy/tree_walker.rb', line 453

def detach
  nil
end

#next_nodeObject

WHATWG “traverse” (direction=next). referenceNode / pointerBeforeReferenceNode are committed only when a node is accepted; if no node matches we return null and leave the iterator’s position untouched.



414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
# File 'lib/dommy/tree_walker.rb', line 414

def next_node
  node = @reference_node
  before = @pointer_before_reference
  loop do
    if before
      before = false
    else
      node = next_in_document_order(node)
      return nil unless node
    end

    next unless accept(node) == NodeFilter::FILTER_ACCEPT

    @reference_node = node
    @pointer_before_reference = before
    return node
  end
end

#pre_remove(removed) ⇒ Object

WHATWG “NodeIterator pre-removing steps”. ‘removed` is the wrapped node about to be detached (still attached when this runs).



459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
# File 'lib/dommy/tree_walker.rb', line 459

def pre_remove(removed)
  # Terminate unless `removed` is in this iterator's collection and an
  # inclusive ancestor of the reference node: skip if it is an inclusive
  # ancestor of root (never in the collection) or not one of referenceNode.
  return if inclusive_ancestor?(removed, @root)
  return unless inclusive_ancestor?(removed, @reference_node)

  unless @pointer_before_reference
    @reference_node = tree_preceding(removed)
    return
  end

  following = tree_next_descendants(removed)
  if following
    @reference_node = following
    return
  end

  @reference_node = tree_preceding(removed)
  @pointer_before_reference = false
end

#previous_nodeObject

WHATWG “traverse” (direction=previous).



434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
# File 'lib/dommy/tree_walker.rb', line 434

def previous_node
  node = @reference_node
  before = @pointer_before_reference
  loop do
    if before
      node = previous_in_document_order(node)
      return nil unless node
    else
      before = true
    end

    next unless accept(node) == NodeFilter::FILTER_ACCEPT

    @reference_node = node
    @pointer_before_reference = before
    return node
  end
end