Class: Postsvg::Translation::PsRenderer

Inherits:
Object
  • Object
show all
Defined in:
lib/postsvg/translation/ps_renderer.rb

Overview

Top-level orchestrator: takes an Svg::Document, walks its element tree via a HandlerRegistry, and produces a Model::Program whose body the Serializer consumes.

Constant Summary collapse

DEFAULT_REGISTRY =
HandlerRegistry.new

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(document, eps:, registry:) ⇒ PsRenderer

Returns a new instance of PsRenderer.



54
55
56
57
58
# File 'lib/postsvg/translation/ps_renderer.rb', line 54

def initialize(document, eps:, registry:)
  @document = document
  @eps = eps
  @registry = registry
end

Class Attribute Details

.default_registeredObject (readonly)

Returns the value of attribute default_registered.



13
14
15
# File 'lib/postsvg/translation/ps_renderer.rb', line 13

def default_registered
  @default_registered
end

Instance Attribute Details

#documentObject (readonly)

Returns the value of attribute document.



52
53
54
# File 'lib/postsvg/translation/ps_renderer.rb', line 52

def document
  @document
end

#epsObject (readonly)

Returns the value of attribute eps.



52
53
54
# File 'lib/postsvg/translation/ps_renderer.rb', line 52

def eps
  @eps
end

#registryObject (readonly)

Returns the value of attribute registry.



52
53
54
# File 'lib/postsvg/translation/ps_renderer.rb', line 52

def registry
  @registry
end

Class Method Details

.call(document, eps: false, registry: nil) ⇒ Object



47
48
49
50
# File 'lib/postsvg/translation/ps_renderer.rb', line 47

def self.call(document, eps: false, registry: nil)
  registry ||= default_registry
  new(document, eps: eps, registry: registry).call
end

.default_registryObject

Public accessor: returns the default registry after ensuring handlers are registered. Use this in handlers instead of reaching for the constant directly.



41
42
43
44
# File 'lib/postsvg/translation/ps_renderer.rb', line 41

def default_registry
  register_default_handlers!
  DEFAULT_REGISTRY
end

.register_default_handlers!Object

Idempotent: only registers once. Called automatically by default_registry before each translate, so callers don't need to remember to invoke it.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/postsvg/translation/ps_renderer.rb', line 18

def register_default_handlers!
  return if @default_registered

  DEFAULT_REGISTRY.register(Svg::Elements::Svg, Handlers::SvgHandler)
  DEFAULT_REGISTRY.register(Svg::Elements::Group, Handlers::GroupHandler)
  DEFAULT_REGISTRY.register(Svg::Elements::Path, Handlers::PathHandler)
  DEFAULT_REGISTRY.register(Svg::Elements::Rect, Handlers::RectHandler)
  DEFAULT_REGISTRY.register(Svg::Elements::Circle, Handlers::CircleHandler)
  DEFAULT_REGISTRY.register(Svg::Elements::Ellipse, Handlers::EllipseHandler)
  DEFAULT_REGISTRY.register(Svg::Elements::Line, Handlers::LineHandler)
  DEFAULT_REGISTRY.register(Svg::Elements::Polyline, Handlers::PolylineHandler)
  DEFAULT_REGISTRY.register(Svg::Elements::Polygon, Handlers::PolygonHandler)
  DEFAULT_REGISTRY.register(Svg::Elements::Text, Handlers::TextHandler)
  DEFAULT_REGISTRY.register(Svg::Elements::Image, Handlers::ImageHandler)
  DEFAULT_REGISTRY.register(Svg::Elements::Defs, Handlers::DefsHandler)
  DEFAULT_REGISTRY.register(Svg::Elements::ClipPath, Handlers::ClipPathHandler)
  DEFAULT_REGISTRY.register(Svg::OpenElement, Handlers::OpenHandler)
  @default_registered = true
end

Instance Method Details

#callObject



60
61
62
63
64
65
66
67
68
69
# File 'lib/postsvg/translation/ps_renderer.rb', line 60

def call
  emitter = RecordEmitter.new
  bbox = compute_viewport_bbox
  context = Context.new(emitter: emitter,
                        bounding_box: bbox,
                        clip_path_registry: document.clip_paths,
                        options: { eps: eps })
  dispatch(document.root_element, context)
  build_program(emitter, context)
end