Class: Coradoc::Html::Theme::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/coradoc/html/theme/registry.rb

Overview

Theme registry for managing and retrieving theme renderers

The registry maintains a collection of available themes and provides methods for registration, lookup, and validation.

Examples:

Registering a custom theme

class MyCustomTheme < Coradoc::Html::Theme::Base
  def render
    "<h1>Custom HTML</h1>"
  end
end

Coradoc::Html::Theme::Registry.register(:my_custom, MyCustomTheme)

Using a theme

renderer = Coradoc::Html::Theme::Registry.find(:my_custom)
renderer.new(document, options).render

Class Method Summary collapse

Class Method Details

.all_theme_namesArray<Symbol>

Get all registered theme names

Examples:

List all themes

Registry.all_theme_names # => [:classic, :modern]

Returns:

  • (Array<Symbol>)

    List of registered theme names



79
80
81
# File 'lib/coradoc/html/theme/registry.rb', line 79

def all_theme_names
  themes.keys.sort
end

.auto_register(renderer_class) ⇒ Object

Auto-register a theme class

This method is called by theme classes when they are loaded. It extracts the theme name from the class name and registers it.

Examples:

Auto-register from within a theme class

class ModernTheme < Coradoc::Output::Html::Theme::Base
  Coradoc::Output::Html::Theme::Registry.auto_register(self)
end

Parameters:

  • renderer_class (Class)

    Theme renderer class



125
126
127
128
129
130
131
132
133
134
135
136
137
138
# File 'lib/coradoc/html/theme/registry.rb', line 125

def auto_register(renderer_class)
  # Extract theme name from class name
  # e.g., ModernRenderer -> :modern, ClassicRenderer -> :classic
  class_name = renderer_class.name.split('::').last

  # Remove "Renderer" suffix if present
  theme_name = class_name.sub(/Renderer$/, '')
                         .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
                         .gsub(/([a-z\d])([A-Z])/, '\1_\2')
                         .downcase
                         .to_sym

  register(theme_name, renderer_class)
end

.clearvoid

This method returns an undefined value.

Clear all registered themes (mainly for testing)

Examples:

Clear registry

Registry.clear


146
147
148
# File 'lib/coradoc/html/theme/registry.rb', line 146

def clear
  @themes = {}
end

.default_themeSymbol

Get default theme name

Returns:

  • (Symbol)

    Default theme name



86
87
88
# File 'lib/coradoc/html/theme/registry.rb', line 86

def default_theme
  :classic
end

.find(name) ⇒ Class?

Find a theme renderer by name

Examples:

Find a theme

renderer = Registry.find(:modern)

Parameters:

  • name (Symbol)

    Theme name

Returns:

  • (Class, nil)

    Theme renderer class or nil if not found



58
59
60
# File 'lib/coradoc/html/theme/registry.rb', line 58

def find(name)
  themes[name]
end

.register(name, renderer_class) ⇒ Object

Register a theme renderer

Examples:

Register a theme

Registry.register(:my_theme, MyThemeRenderer)

Parameters:

  • name (Symbol)

    Theme name (e.g., :classic, :modern)

  • renderer_class (Class)

    Theme renderer class

Raises:

  • (ArgumentError)

    if renderer_class is not a Theme::Base subclass



40
41
42
43
44
45
46
47
48
49
# File 'lib/coradoc/html/theme/registry.rb', line 40

def register(name, renderer_class)
  unless renderer_class.is_a?(Class) &&
         renderer_class <= Coradoc::Html::Theme::Base
    raise ArgumentError,
          'Theme renderer must be a subclass of Coradoc::Html::Theme::Base, ' \
          "got: #{renderer_class}"
  end

  themes[name] = renderer_class
end

.registered?(name) ⇒ Boolean

Check if a theme is registered

Examples:

Check theme existence

Registry.registered?(:modern) # => true

Parameters:

  • name (Symbol)

    Theme name

Returns:

  • (Boolean)

    true if theme is registered



69
70
71
# File 'lib/coradoc/html/theme/registry.rb', line 69

def registered?(name)
  themes.key?(name)
end

.resolve_from_options(options = {}) ⇒ Class

Resolve theme from options

Returns the theme renderer class based on the provided options. Falls back to default theme if not specified or if theme not found.

Examples:

Resolve theme from options

renderer = Registry.resolve_from_options(theme: :modern)

Parameters:

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

    Rendering options

Returns:

  • (Class)

    Theme renderer class



100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/coradoc/html/theme/registry.rb', line 100

def resolve_from_options(options = {})
  theme_name = options.fetch(:theme, default_theme)

  renderer_class = find(theme_name)
  return renderer_class if renderer_class

  # Theme not found, fall back to default
  Coradoc::Logger.warn(
    "Theme '#{theme_name}' not found, falling back to '#{default_theme}'"
  )

  find(default_theme) || raise("Default theme '#{default_theme}' not registered")
end

.themesHash

Registered themes mapping

Returns:

  • (Hash)

    Theme name to renderer class mapping



28
29
30
# File 'lib/coradoc/html/theme/registry.rb', line 28

def themes
  @themes ||= {}
end