Module: Sevgi::Graphics::Document

Defined in:
lib/sevgi/graphics/document.rb,
lib/sevgi/graphics/document/base.rb,
lib/sevgi/graphics/document/html.rb,
lib/sevgi/graphics/document/default.rb,
lib/sevgi/graphics/document/minimal.rb,
lib/sevgi/graphics/document/inkscape.rb

Overview

SVG document profile factory.

Defined Under Namespace

Classes: Base, Default, HTML, Inkscape, Minimal, Proto

Constant Summary collapse

DEFAULTS =

Default render-time checks.

{lint: true, validate: true}.freeze

Class Method Summary collapse

Class Method Details

.call(document, canvas = Undefined, &block) ⇒ Sevgi::Graphics::Document::Proto

Builds a root SVG element from a document profile.

Parameters:

Returns:

Raises:

  • (Sevgi::ArgumentError)

    when the document profile is unknown



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/sevgi/graphics/document.rb', line 12

def self.call(document, canvas = Undefined, **, &block)
  klass = case document
  when ::Class
    document if document <= Proto
  else
    Profile[document]
  end

  ArgumentError.("Unknown document profile: #{document}") unless klass

  klass.root(**klass.attributes, **canvas_attributes(canvas), **, &block)
end

.define(name = Undefined, preambles: [], attributes: {}, overwrite: false) ⇒ Class

Defines or returns a document profile class.

Parameters:

  • name (Symbol, String, Sevgi::Undefined) (defaults to: Undefined)

    profile name, or Undefined for an anonymous profile

  • preambles (Array<String>, nil) (defaults to: [])

    document preamble lines

  • attributes (Hash) (defaults to: {})

    default root attributes

  • overwrite (Boolean) (defaults to: false)

    true to replace an existing profile

Returns:

  • (Class)

    document class

Raises:

  • (Sevgi::ArgumentError)

    when a named profile conflicts with an existing profile



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/sevgi/graphics/document.rb', line 45

def self.define(name = Undefined, preambles: [], attributes: {}, overwrite: false)
  return Class.new(Base) { document(name, preambles:, attributes:, register: false) } if name == Undefined

  profile = Profile.new(name, attributes:, preambles:)

  if (current = Profile[name])
    unless overwrite || current.profile == profile
      ArgumentError.("Document profile already defined differently: #{name}")
    end

    return current unless overwrite
  end

  Class.new(Base) { document(name, preambles:, attributes:, overwrite:) }
end