Class: Coradoc::Markdown::Serializer::Runner

Inherits:
Object
  • Object
show all
Defined in:
lib/coradoc/markdown/serializer/runner.rb

Overview

Stateful runner: holds a frozen Config + Registry, exposes ‘#call`. Each top-level `call` creates a fresh Context (per-document mutable state) so the same runner can serialize multiple documents without cross-document leakage.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config:, registry:) ⇒ Runner

Returns a new instance of Runner.



15
16
17
18
# File 'lib/coradoc/markdown/serializer/runner.rb', line 15

def initialize(config:, registry:)
  @config = config
  @registry = registry
end

Instance Attribute Details

#configObject (readonly)

Returns the value of attribute config.



13
14
15
# File 'lib/coradoc/markdown/serializer/runner.rb', line 13

def config
  @config
end

#registryObject (readonly)

Returns the value of attribute registry.



13
14
15
# File 'lib/coradoc/markdown/serializer/runner.rb', line 13

def registry
  @registry
end

Instance Method Details

#call(element) ⇒ Object



20
21
22
23
24
25
# File 'lib/coradoc/markdown/serializer/runner.rb', line 20

def call(element)
  ctx = Context.new(config: config, registry: registry, runner: self)
  result = serialize(element, ctx)
  result = append_link_refs(result, ctx)
  append_footnote_defs(result, ctx).to_s
end

#serialize(element, ctx = nil) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/coradoc/markdown/serializer/runner.rb', line 27

def serialize(element, ctx = nil)
  ctx ||= Context.new(config: config, registry: registry, runner: self)
  case element
  when String
    element
  when nil
    ''
  when Array
    element.map { |e| serialize(e, ctx) }.join
  else
    serializer = registry.lookup(element)
    if serializer
      serializer.call(element, ctx)
    else
      raise ArgumentError,
            "Unknown element type for serialization: #{element.class}. " \
              'Expected a known Markdown model type.'
    end
  end
end

#serialize_inline(element, ctx) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/coradoc/markdown/serializer/runner.rb', line 48

def serialize_inline(element, ctx)
  case element
  when String
    element
  when nil
    ''
  when ::Coradoc::Markdown::Base, ::Coradoc::Markdown::Document
    serialize(element, ctx)
  when Array
    element.map { |e| serialize_inline(e, ctx) }.join
  else
    raise ArgumentError,
          "Cannot serialize inline content of type #{element.class}. " \
          'Expected String, known inline model, or Base subclass.'
  end
end