Class: Arrolio::Engine::CrossReferenceRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/arrolio/engine/cross_reference_registry.rb

Overview

Collects heading → page-number mappings during layout and resolves cross-references for ToC, page citations, and internal links. The engine records entries during pass 1; after layout is complete, the registry provides resolved references for deferred rendering (e.g., ToC page that appears at the front of the document but needs page numbers from the body).

This implements the "deferred rendering" pattern: the ToC section is rendered last (from the registry's resolved data) but appears first in the document. The engine's existing FlowContext#heading_entries feeds into this registry.

Defined Under Namespace

Classes: Entry

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeCrossReferenceRegistry

Returns a new instance of CrossReferenceRegistry.



23
24
25
26
# File 'lib/arrolio/engine/cross_reference_registry.rb', line 23

def initialize
  @entries = []
  @by_id = {}
end

Instance Attribute Details

#entriesObject (readonly)

Returns the value of attribute entries.



21
22
23
# File 'lib/arrolio/engine/cross_reference_registry.rb', line 21

def entries
  @entries
end

Instance Method Details

#countObject



64
65
66
# File 'lib/arrolio/engine/cross_reference_registry.rb', line 64

def count
  @entries.length
end

#empty?Boolean

Returns:

  • (Boolean)


60
61
62
# File 'lib/arrolio/engine/cross_reference_registry.rb', line 60

def empty?
  @entries.empty?
end

#entry_for(target_id) ⇒ Object

Resolves a cross-reference target to its full entry.



46
47
48
# File 'lib/arrolio/engine/cross_reference_registry.rb', line 46

def entry_for(target_id)
  @by_id[target_id.to_s]
end

#page_number_for(target_id) ⇒ Object

Resolves a cross-reference target to a page number. Returns nil if the target hasn't been recorded.



41
42
43
# File 'lib/arrolio/engine/cross_reference_registry.rb', line 41

def page_number_for(target_id)
  @by_id[target_id.to_s]&.page_number
end

#record(id:, number:, title:, level:, page_number:) ⇒ Object

Records a heading during layout pass 1.



29
30
31
32
33
34
35
36
37
# File 'lib/arrolio/engine/cross_reference_registry.rb', line 29

def record(id:, number:, title:, level:, page_number:)
  entry = Entry.new(
    id: id, number: number, title: title,
    level: level, page_number: page_number
  )
  @entries << entry
  @by_id[id.to_s] = entry if id
  entry
end

#toc_entries(max_level: nil) ⇒ Object

All entries, suitable for ToC generation. Entries are in document order (the order they were recorded). Pass max_level: to filter to a maximum heading level (e.g., only levels 1-2 for a compact ToC).



54
55
56
57
58
# File 'lib/arrolio/engine/cross_reference_registry.rb', line 54

def toc_entries(max_level: nil)
  return @entries.dup if max_level.nil?

  @entries.select { |e| e.level <= max_level }
end