Class: Arrolio::Engine::CrossReferenceRegistry
- Inherits:
-
Object
- Object
- Arrolio::Engine::CrossReferenceRegistry
- 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
-
#entries ⇒ Object
readonly
Returns the value of attribute entries.
Instance Method Summary collapse
- #count ⇒ Object
- #empty? ⇒ Boolean
-
#entry_for(target_id) ⇒ Object
Resolves a cross-reference target to its full entry.
-
#initialize ⇒ CrossReferenceRegistry
constructor
A new instance of CrossReferenceRegistry.
-
#page_number_for(target_id) ⇒ Object
Resolves a cross-reference target to a page number.
-
#record(id:, number:, title:, level:, page_number:) ⇒ Object
Records a heading during layout pass 1.
-
#toc_entries(max_level: nil) ⇒ Object
All entries, suitable for ToC generation.
Constructor Details
#initialize ⇒ CrossReferenceRegistry
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
#entries ⇒ Object (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
#count ⇒ Object
64 65 66 |
# File 'lib/arrolio/engine/cross_reference_registry.rb', line 64 def count @entries.length end |
#empty? ⇒ 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 |