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.



391
392
393
394
395
396
397
# File 'lib/dommy/tree_walker.rb', line 391

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.



389
390
391
# File 'lib/dommy/tree_walker.rb', line 389

def filter
  @filter
end

#rootObject (readonly)

Returns the value of attribute root.



389
390
391
# File 'lib/dommy/tree_walker.rb', line 389

def root
  @root
end

#what_to_showObject (readonly)

Returns the value of attribute what_to_show.



389
390
391
# File 'lib/dommy/tree_walker.rb', line 389

def what_to_show
  @what_to_show
end

Instance Method Details

#__js_call__(method, _args) ⇒ Object



488
489
490
491
492
493
494
495
496
497
# File 'lib/dommy/tree_walker.rb', line 488

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

#__js_get__(key) ⇒ Object



469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
# File 'lib/dommy/tree_walker.rb', line 469

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
  else
    Bridge::ABSENT
  end
end

#detachObject



441
442
443
# File 'lib/dommy/tree_walker.rb', line 441

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.



402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
# File 'lib/dommy/tree_walker.rb', line 402

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).



447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
# File 'lib/dommy/tree_walker.rb', line 447

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).



422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
# File 'lib/dommy/tree_walker.rb', line 422

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