Class: RedQuilt::FootnoteRegistry
- Inherits:
-
Object
- Object
- RedQuilt::FootnoteRegistry
- Defined in:
- lib/red_quilt/footnote_registry.rb
Overview
Shared state for the footnotes extension, created once per parse when ‘footnotes: true` and threaded (by reference) through the block parser, the inline builders, the FootnotePass, and the renderer. A single shared object is required because the inline pass builds a fresh Builder per materialized target, so the first-reference numbering counter cannot live on a Builder instance.
‘nil` is used in place of a registry when footnotes are disabled, so the collectors/resolvers can cheaply opt out.
Instance Method Summary collapse
- #any_referenced? ⇒ Boolean
-
#define(label, node_id) ⇒ Object
Records a definition node for a label during block parsing.
- #defined?(label) ⇒ Boolean
- #definition_node(label) ⇒ Object
-
#initialize ⇒ FootnoteRegistry
constructor
A new instance of FootnoteRegistry.
- #number(label) ⇒ Object
- #occurrences(label) ⇒ Object
-
#reference(label) ⇒ Object
Records an inline reference to a label.
-
#referenced_labels ⇒ Object
Referenced labels in first-reference order (the render order).
Constructor Details
#initialize ⇒ FootnoteRegistry
Returns a new instance of FootnoteRegistry.
14 15 16 17 18 19 |
# File 'lib/red_quilt/footnote_registry.rb', line 14 def initialize @definitions = {} # normalized label => FOOTNOTE_DEFINITION node id @numbers = {} # normalized label => footnote number @occurrences = Hash.new(0) # normalized label => reference count @order = [] # normalized labels in first-reference order end |
Instance Method Details
#any_referenced? ⇒ Boolean
64 65 66 |
# File 'lib/red_quilt/footnote_registry.rb', line 64 def any_referenced? !@order.empty? end |
#define(label, node_id) ⇒ Object
Records a definition node for a label during block parsing. Returns false when the label is already defined (duplicate), true otherwise.
23 24 25 26 27 28 |
# File 'lib/red_quilt/footnote_registry.rb', line 23 def define(label, node_id) return false if @definitions.key?(label) @definitions[label] = node_id true end |
#defined?(label) ⇒ Boolean
30 31 32 |
# File 'lib/red_quilt/footnote_registry.rb', line 30 def defined?(label) @definitions.key?(label) end |
#definition_node(label) ⇒ Object
34 35 36 |
# File 'lib/red_quilt/footnote_registry.rb', line 34 def definition_node(label) @definitions[label] end |
#number(label) ⇒ Object
51 52 53 |
# File 'lib/red_quilt/footnote_registry.rb', line 51 def number(label) @numbers[label] end |
#occurrences(label) ⇒ Object
55 56 57 |
# File 'lib/red_quilt/footnote_registry.rb', line 55 def occurrences(label) @occurrences[label] end |
#reference(label) ⇒ Object
Records an inline reference to a label. Returns [number, occurrence] (assigning the number on first reference, in encounter order), or nil when the label has no definition.
41 42 43 44 45 46 47 48 49 |
# File 'lib/red_quilt/footnote_registry.rb', line 41 def reference(label) return nil unless @definitions.key?(label) unless @numbers.key?(label) @order << label @numbers[label] = @order.length end [@numbers[label], @occurrences[label] += 1] end |
#referenced_labels ⇒ Object
Referenced labels in first-reference order (the render order).
60 61 62 |
# File 'lib/red_quilt/footnote_registry.rb', line 60 def referenced_labels @order end |