Class: SvgConform::Validation::StructuralInvalidityTracker

Inherits:
Object
  • Object
show all
Defined in:
lib/svg_conform/validation/structural_invalidity_tracker.rb

Overview

Tracks structurally invalid nodes during validation Separated from ValidationContext for better separation of concerns

Instance Method Summary collapse

Constructor Details

#initialize(node_id_generator:) ⇒ StructuralInvalidityTracker

Returns a new instance of StructuralInvalidityTracker.



10
11
12
13
# File 'lib/svg_conform/validation/structural_invalidity_tracker.rb', line 10

def initialize(node_id_generator:)
  @structurally_invalid_node_ids = Set.new
  @node_id_generator = node_id_generator
end

Instance Method Details

#clearObject

Clear all tracked invalid nodes



53
54
55
# File 'lib/svg_conform/validation/structural_invalidity_tracker.rb', line 53

def clear
  @structurally_invalid_node_ids.clear
end

#countObject

Get the count of structurally invalid nodes



58
59
60
# File 'lib/svg_conform/validation/structural_invalidity_tracker.rb', line 58

def count
  @structurally_invalid_node_ids.size
end

#mark_descendants_invalid(node) ⇒ Object

Mark all descendants of a node as structurally invalid



29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/svg_conform/validation/structural_invalidity_tracker.rb', line 29

def mark_descendants_invalid(node)
  # In SAX mode, ElementProxy doesn't have children yet
  # Children will be validated individually and will check parent validity
  return unless node.respond_to?(:children) && node.children

  node.children.each do |child|
    child_id = @node_id_generator.call(child)
    next if child_id.nil? # Skip if can't generate ID

    @structurally_invalid_node_ids.add(child_id)
    # Recursively mark descendants
    mark_descendants_invalid(child)
  end
end

#mark_node_structurally_invalid(node) ⇒ Object

Mark a node as structurally invalid (e.g., invalid parent-child relationship) Other requirements should skip attribute validation on these nodes Also marks all descendants as invalid since they'll be removed with the parent



18
19
20
21
22
23
24
25
26
# File 'lib/svg_conform/validation/structural_invalidity_tracker.rb', line 18

def mark_node_structurally_invalid(node)
  node_id = @node_id_generator.call(node)
  return if node_id.nil? # Safety check

  @structurally_invalid_node_ids.add(node_id)

  # Mark all descendants as invalid too
  mark_descendants_invalid(node)
end

#node_structurally_invalid?(node) ⇒ Boolean

Check if a node is structurally invalid

Returns:

  • (Boolean)


45
46
47
48
49
50
# File 'lib/svg_conform/validation/structural_invalidity_tracker.rb', line 45

def node_structurally_invalid?(node)
  node_id = @node_id_generator.call(node)
  return false if node_id.nil? # Safety check

  @structurally_invalid_node_ids.include?(node_id)
end