keyboard: load suggestions from file
This commit is contained in:
parent
271a1b2d29
commit
afb8099f66
|
@ -17,6 +17,9 @@ import logging
|
||||||
import re
|
import re
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
from subiquity.common.resources import resource_path
|
||||||
from subiquity.common.types import KeyboardSetting
|
from subiquity.common.types import KeyboardSetting
|
||||||
|
|
||||||
log = logging.getLogger("subiquity.models.keyboard")
|
log = logging.getLogger("subiquity.models.keyboard")
|
||||||
|
@ -35,40 +38,6 @@ XKBOPTIONS="{options}"
|
||||||
BACKSPACE="guess"
|
BACKSPACE="guess"
|
||||||
"""
|
"""
|
||||||
|
|
||||||
layout_for_lang = {
|
|
||||||
# In the same order as the Welcome screen
|
|
||||||
# https://salsa.debian.org/installer-team/console-setup/-/blob/master/debian/keyboard-configuration.config
|
|
||||||
# None values indicate that this lang should use the default setting.
|
|
||||||
'ast_ES.UTF-8': KeyboardSetting(layout='es', variant='ast'),
|
|
||||||
'id_ID.UTF-8': None,
|
|
||||||
'ca_ES.UTF-8': KeyboardSetting(layout='es', variant='cat'),
|
|
||||||
'de_DE.UTF-8': KeyboardSetting(layout='de'),
|
|
||||||
'en_US.UTF-8': KeyboardSetting(layout='us'),
|
|
||||||
'en_GB.UTF-8': KeyboardSetting(layout='gb'),
|
|
||||||
'es_ES.UTF-8': KeyboardSetting(layout='es'),
|
|
||||||
'fr_FR.UTF-8': KeyboardSetting(layout='fr', variant='latin9'),
|
|
||||||
'hr_HR.UTF-8': KeyboardSetting(layout='hr'),
|
|
||||||
'lv_LV.UTF-8': KeyboardSetting(layout='lv'),
|
|
||||||
'lt_LT.UTF-8': KeyboardSetting(layout='lt'),
|
|
||||||
'hu_HU.UTF-8': KeyboardSetting(layout='hu'),
|
|
||||||
'nl_NL.UTF-8': KeyboardSetting(layout='us'),
|
|
||||||
'nb': KeyboardSetting(layout='no'),
|
|
||||||
'bo_IN': KeyboardSetting(layout='us,cn', variant=',tib'),
|
|
||||||
'pl_PL.UTF-8': KeyboardSetting(layout='pl'),
|
|
||||||
'fi_FI.UTF-8': KeyboardSetting(layout='fi'),
|
|
||||||
'sv_SE.UTF-8': KeyboardSetting(layout='se'),
|
|
||||||
'kab_DZ.UTF-8': KeyboardSetting(layout='dz', variant='la'),
|
|
||||||
'cs_CZ.UTF-8': KeyboardSetting(layout='cz'),
|
|
||||||
'el_GR.UTF-8': KeyboardSetting(layout='us,gr'),
|
|
||||||
'be_BY.UTF-8': KeyboardSetting(layout='us,by'),
|
|
||||||
'ru_RU.UTF-8': KeyboardSetting(layout='us,ru'),
|
|
||||||
'sr_RS': KeyboardSetting(layout='rs', variant='latin'),
|
|
||||||
'uk_UA.UTF-8': KeyboardSetting(layout='us,ua'),
|
|
||||||
'he_IL.UTF-8': KeyboardSetting(layout='us,il'),
|
|
||||||
'oc': None,
|
|
||||||
'zh_CN.UTF-8': KeyboardSetting(layout='cn'),
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
def from_config_file(config_file):
|
def from_config_file(config_file):
|
||||||
with open(config_file) as fp:
|
with open(config_file) as fp:
|
||||||
|
@ -97,10 +66,11 @@ class KeyboardModel:
|
||||||
def __init__(self, root):
|
def __init__(self, root):
|
||||||
self.config_path = os.path.join(
|
self.config_path = os.path.join(
|
||||||
root, 'etc', 'default', 'keyboard')
|
root, 'etc', 'default', 'keyboard')
|
||||||
|
self.layout_for_lang = self.load_layout_suggestions()
|
||||||
if os.path.exists(self.config_path):
|
if os.path.exists(self.config_path):
|
||||||
self.default_setting = from_config_file(self.config_path)
|
self.default_setting = from_config_file(self.config_path)
|
||||||
else:
|
else:
|
||||||
self.default_setting = layout_for_lang['en_US.UTF-8']
|
self.default_setting = self.layout_for_lang['en_US.UTF-8']
|
||||||
self._setting = None
|
self._setting = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -136,7 +106,19 @@ class KeyboardModel:
|
||||||
def setting_for_lang(self, lang):
|
def setting_for_lang(self, lang):
|
||||||
if self._setting is not None:
|
if self._setting is not None:
|
||||||
return self._setting
|
return self._setting
|
||||||
layout = layout_for_lang.get(lang, None)
|
layout = self.layout_for_lang.get(lang, None)
|
||||||
if layout is None:
|
if layout is None:
|
||||||
return self.default_setting
|
return self.default_setting
|
||||||
return layout
|
return layout
|
||||||
|
|
||||||
|
def load_layout_suggestions(self, path=None):
|
||||||
|
if path is None:
|
||||||
|
path = resource_path('kbds') + '/keyboard-configuration.yaml'
|
||||||
|
|
||||||
|
with open(path) as fp:
|
||||||
|
data = yaml.safe_load(fp)
|
||||||
|
|
||||||
|
ret = {}
|
||||||
|
for k, v in data.items():
|
||||||
|
ret[k] = KeyboardSetting(**v)
|
||||||
|
return ret
|
||||||
|
|
|
@ -18,10 +18,7 @@ from parameterized import parameterized
|
||||||
from subiquitycore.tests import SubiTestCase
|
from subiquitycore.tests import SubiTestCase
|
||||||
|
|
||||||
from subiquity.common.types import KeyboardSetting
|
from subiquity.common.types import KeyboardSetting
|
||||||
from subiquity.models.keyboard import (
|
from subiquity.models.keyboard import KeyboardModel
|
||||||
KeyboardModel,
|
|
||||||
layout_for_lang,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class TestKeyboardModel(SubiTestCase):
|
class TestKeyboardModel(SubiTestCase):
|
||||||
|
@ -56,4 +53,16 @@ class TestKeyboardModel(SubiTestCase):
|
||||||
for line in fp.readlines():
|
for line in fp.readlines():
|
||||||
tokens = line.split(':')
|
tokens = line.split(':')
|
||||||
locale = tokens[1]
|
locale = tokens[1]
|
||||||
self.assertIn(locale, layout_for_lang.keys())
|
self.assertIn(locale, self.model.layout_for_lang.keys())
|
||||||
|
|
||||||
|
def testLoadSuggestions(self):
|
||||||
|
data = self.tmp_path('kbd.yaml')
|
||||||
|
with open(data, 'w') as fp:
|
||||||
|
fp.write('''
|
||||||
|
aa_BB.UTF-8:
|
||||||
|
layout: aa
|
||||||
|
variant: cc
|
||||||
|
''')
|
||||||
|
actual = self.model.load_layout_suggestions(data)
|
||||||
|
expected = {'aa_BB.UTF-8': KeyboardSetting(layout='aa', variant='cc')}
|
||||||
|
self.assertEqual(expected, actual)
|
||||||
|
|
Loading…
Reference in New Issue