Class: Kotoshu::Keyboard::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/kotoshu/keyboard/registry.rb

Overview

Registry for keyboard layouts

The registry provides a centralized way to access keyboard layouts and automatically selects the appropriate layout for a given language.

Examples:

Getting layout for a language

layout = Keyboard::Registry.layout_for('de')
layout.name  # => "QWERTZ"

Getting layout by name

layout = Keyboard::Registry.layout_by_name('Dvorak')
layout.name  # => "Dvorak"

Listing all available layouts

Keyboard::Registry.available_layouts.each do |layout|
  puts "#{layout.name}: #{layout.language_codes.join(', ')}"
end

Class Method Summary collapse

Class Method Details

.available_layoutsArray<Layout>

Get all available layouts

Returns:

  • (Array<Layout>)

    list of all registered layouts



78
79
80
# File 'lib/kotoshu/keyboard/registry.rb', line 78

def available_layouts
  layouts.values
end

.clear!void

This method returns an undefined value.

Clear all registered layouts (mainly for testing)



107
108
109
110
# File 'lib/kotoshu/keyboard/registry.rb', line 107

def clear!
  @layouts = nil
  @default_layout_name = nil
end

.layout_by_name(name) ⇒ Layout

Get layout by name

Parameters:

  • name (String, Symbol)

    the layout name (e.g., ‘QWERTY’, ‘Dvorak’)

Returns:

  • (Layout)

    the layout, or QWERTY as fallback if not found



64
65
66
67
68
69
70
71
72
73
# File 'lib/kotoshu/keyboard/registry.rb', line 64

def layout_by_name(name)
  name_str = name.to_s
  result = layouts.values.find do |layout|
    layout.name == name_str ||
    layout.class.name.end_with?("::#{name_str}")
  end

  # Return QWERTY as fallback (not default_layout to avoid recursion)
  result || layouts['Kotoshu::Keyboard::Layouts::QWERTY']
end

.layout_for(language_code) ⇒ Layout

Get layout for a specific language code

Searches for a layout that supports the given language code. Returns QWERTY as fallback if no matching layout is found.

Parameters:

  • language_code (String)

    the language code (e.g., ‘en’, ‘de’, ‘fr’, ‘ru’)

Returns:

  • (Layout)

    the keyboard layout for the language



47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/kotoshu/keyboard/registry.rb', line 47

def layout_for(language_code)
  # Try exact match first
  layout = layouts.values.find { |l| l.supports_language?(language_code) }

  # Try base language if variant (e.g., 'en-GB' -> 'en')
  unless layout
    base_lang = language_code.to_s.split('-').first
    layout = layouts.values.find { |l| l.supports_language?(base_lang) }
  end

  layout || default_layout
end

.register(layout_class) ⇒ Layout

Register a keyboard layout

Parameters:

  • layout_class (Class<Layout>)

    the layout class to register

Returns:

  • (Layout)

    the instantiated layout



36
37
38
# File 'lib/kotoshu/keyboard/registry.rb', line 36

def register(layout_class)
  layouts[layout_class.name] = layout_class.new
end

.register_default(layout_name) ⇒ Object

Set the default layout

Parameters:

  • layout_name (String, Symbol)

    the name of the layout to use as default



92
93
94
# File 'lib/kotoshu/keyboard/registry.rb', line 92

def register_default(layout_name)
  @default_layout_name = layout_name
end

.supported_languagesArray<String>

Get all supported language codes

Returns:

  • (Array<String>)

    list of all language codes across all layouts



85
86
87
# File 'lib/kotoshu/keyboard/registry.rb', line 85

def supported_languages
  layouts.values.flat_map(&:language_codes).uniq.sort
end

.supports_language?(language_code) ⇒ Boolean

Check if a language is supported

Parameters:

  • language_code (String)

    the language code to check

Returns:

  • (Boolean)

    true if the language is supported by any layout



100
101
102
# File 'lib/kotoshu/keyboard/registry.rb', line 100

def supports_language?(language_code)
  layouts.values.any? { |l| l.supports_language?(language_code) }
end