Class: RedQuilt::FootnoteRegistry

Inherits:
Object
  • Object
show all
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

Constructor Details

#initializeFootnoteRegistry

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

Returns:

  • (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

Returns:

  • (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_labelsObject

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