Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion simple_typing_application/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
typing_game,
)

__version__ = '0.2.0'
__version__ = "0.2.0"

__all__ = [
const.__name__,
Expand Down
1 change: 1 addition & 0 deletions simple_typing_application/__main__.py
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
from .main import main

main()
25 changes: 13 additions & 12 deletions simple_typing_application/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ def load_config(
path: str,
logger: Logger = getLogger(__name__),
) -> ConfigModel: # noqa
'''Load config file.
"""Load config file.

Args:
path (str): path to config file.
Expand All @@ -19,22 +19,23 @@ def load_config(

Returns:
ConfigModel: config model.
''' # noqa
logger.debug(f'load config from {path}')
""" # noqa
logger.debug(f"load config from {path}")

# load config
if os.path.splitext(path)[1] == '.json':
logger.debug('load json config')
if os.path.splitext(path)[1] == ".json":
logger.debug("load json config")
try:
config = ConfigModel(**json.load(open(path, 'r', encoding='utf-8'))) # type: ignore # noqa
with open(path, "r", encoding="utf-8") as f:
config = ConfigModel(**json.load(f)) # type: ignore # noqa
except FileNotFoundError:
logger.warning(f'config file not found: {path}. So use default config.') # noqa
logger.warning(f"config file not found: {path}. So use default config.") # noqa
config = ConfigModel()
elif os.path.splitext(path)[1] in ['.yaml', '.yml']:
logger.debug('load yaml config')
raise NotImplementedError('yaml is not supported yet.')
elif os.path.splitext(path)[1] in [".yaml", ".yml"]:
logger.debug("load yaml config")
raise NotImplementedError("yaml is not supported yet.")
else:
raise ValueError(f'Unsupported file type: {os.path.splitext(path)[1]}')
raise ValueError(f"Unsupported file type: {os.path.splitext(path)[1]}")

logger.debug(f'config: {config}')
logger.debug(f"config: {config}")
return config
4 changes: 2 additions & 2 deletions simple_typing_application/const/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@
)


ASCII_CHARS: str = ''.join(
ASCII_CHARS: str = "".join(
chr(i)
for i in range(0x0021, 0x007E + 1)
# 0x0021 - 0x007E
)


__all__ = [
'ASCII_CHARS',
"ASCII_CHARS",
color.__name__,
hiragana_katakana_map.__name__,
hiragana_romaji_map.__name__,
Expand Down
22 changes: 11 additions & 11 deletions simple_typing_application/const/color.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@ class EColor(Enum):


ecolor2terminalcolor_map: dict[EColor, str] = {
EColor.BLACK: '\033[30m',
EColor.RED: '\033[31m',
EColor.GREEN: '\033[32m',
EColor.YELLOW: '\033[33m',
EColor.BLUE: '\033[34m',
EColor.PURPLE: '\033[35m',
EColor.CYAN: '\033[36m',
EColor.WHITE: '\033[37m',
EColor.END: '\033[0m',
EColor.BOLD: '\038[1m',
EColor.DEFAULT: '\033[0m',
EColor.BLACK: "\033[30m",
EColor.RED: "\033[31m",
EColor.GREEN: "\033[32m",
EColor.YELLOW: "\033[33m",
EColor.BLUE: "\033[34m",
EColor.PURPLE: "\033[35m",
EColor.CYAN: "\033[36m",
EColor.WHITE: "\033[37m",
EColor.END: "\033[0m",
EColor.BOLD: "\038[1m",
EColor.DEFAULT: "\033[0m",
}
262 changes: 215 additions & 47 deletions simple_typing_application/const/hiragana_romaji_map.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,52 +6,222 @@

HIRA2ROMA_MAP: dict[str, list[str | None]] = {
# 50-on 50音
"あ": ["a"], "い": ["i", "yi"], "う": ["u", "wu", "whu"], "え": ["e"], "お": ["o"], # noqa
"か": ["ka", "ca"], "き": ["ki"], "く": ["ku", "cu", "qu"], "け": ["ke"], "こ": ["ko", "co"], # noqa
"さ": ["sa"], "し": ["si", "shi", "ci"], "す": ["su"], "せ": ["se", "ce"], "そ": ["so"], # noqa
"た": ["ta"], "ち": ["ti", "chi"], "つ": ["tu", "tsu"], "て": ["te"], "と": ["to"], # noqa
"な": ["na"], "に": ["ni"], "ぬ": ["nu"], "ね": ["ne"], "の": ["no"], # noqa
"は": ["ha"], "ひ": ["hi"], "ふ": ["fu", "hu"], "へ": ["he"], "ほ": ["ho"], # noqa
"ま": ["ma"], "み": ["mi"], "む": ["mu"], "め": ["me"], "も": ["mo"], # noqa
"や": ["ya"], "ゆ": ["yu"], "いぇ": ["ye"], "よ": ["yo"], # noqa
"ら": ["ra"], "り": ["ri"], "る": ["ru"], "れ": ["re"], "ろ": ["ro"], # noqa
"わ": ["wa"], "を": ["wo"], "ん": ["nn", "n", "n'", "xn"], # NOTE: "n" is valid for 'ん' when the next character is not in "a", "i", "u", "e", "o", "n", "y". # noqa
"あ": ["a"],
"い": ["i", "yi"],
"う": ["u", "wu", "whu"],
"え": ["e"],
"お": ["o"], # noqa
"か": ["ka", "ca"],
"き": ["ki"],
"く": ["ku", "cu", "qu"],
"け": ["ke"],
"こ": ["ko", "co"], # noqa
"さ": ["sa"],
"し": ["si", "shi", "ci"],
"す": ["su"],
"せ": ["se", "ce"],
"そ": ["so"], # noqa
"た": ["ta"],
"ち": ["ti", "chi"],
"つ": ["tu", "tsu"],
"て": ["te"],
"と": ["to"], # noqa
"な": ["na"],
"に": ["ni"],
"ぬ": ["nu"],
"ね": ["ne"],
"の": ["no"], # noqa
"は": ["ha"],
"ひ": ["hi"],
"ふ": ["fu", "hu"],
"へ": ["he"],
"ほ": ["ho"], # noqa
"ま": ["ma"],
"み": ["mi"],
"む": ["mu"],
"め": ["me"],
"も": ["mo"], # noqa
"や": ["ya"],
"ゆ": ["yu"],
"いぇ": ["ye"],
"よ": ["yo"], # noqa
"ら": ["ra"],
"り": ["ri"],
"る": ["ru"],
"れ": ["re"],
"ろ": ["ro"], # noqa
"わ": ["wa"],
"を": ["wo"],
"ん": [
"nn",
"n",
"n'",
"xn",
], # NOTE: "n" is valid for 'ん' when the next character is not in "a", "i", "u", "e", "o", "n", "y". # noqa
# Dakuon/Handakuon 濁音/半濁音
"ゔ": ["vu"], # noqa
"が": ["ga"], "ぎ": ["gi"], "ぐ": ["gu"], "げ": ["ge"], "ご": ["go"], # noqa
"ざ": ["za"], "じ": ["zi", "ji"], "ず": ["zu"], "ぜ": ["ze"], "ぞ": ["zo"], # noqa
"だ": ["da"], "ぢ": ["di"], "づ": ["du"], "で": ["de"], "ど": ["do"], # noqa
"ば": ["ba"], "び": ["bi"], "ぶ": ["bu"], "べ": ["be"], "ぼ": ["bo"], # noqa
"ぱ": ["pa"], "ぴ": ["pi"], "ぷ": ["pu"], "ぺ": ["pe"], "ぽ": ["po"], # noqa
"が": ["ga"],
"ぎ": ["gi"],
"ぐ": ["gu"],
"げ": ["ge"],
"ご": ["go"], # noqa
"ざ": ["za"],
"じ": ["zi", "ji"],
"ず": ["zu"],
"ぜ": ["ze"],
"ぞ": ["zo"], # noqa
"だ": ["da"],
"ぢ": ["di"],
"づ": ["du"],
"で": ["de"],
"ど": ["do"], # noqa
"ば": ["ba"],
"び": ["bi"],
"ぶ": ["bu"],
"べ": ["be"],
"ぼ": ["bo"], # noqa
"ぱ": ["pa"],
"ぴ": ["pi"],
"ぷ": ["pu"],
"ぺ": ["pe"],
"ぽ": ["po"], # noqa
# Yohon/拗音
"うぁ": ["wha"], "うぃ": ["wi", "whi"], "うぇ": ["we", "whe"], "うぉ": ["who"], # noqa
"ゔぁ": ["va"], "ゔぃ": ["vi"], "ゔぇ": ["ve"], "ゔぉ": ["vo"], # noqa
"きゃ": ["kya"], "きぃ": ["kyi"], "きゅ": ["kyu"], "きぇ": ["kye"], "きょ": ["kyo"], # noqa
"ぎゃ": ["gya"], "ぎぃ": ["gyi"], "ぎゅ": ["gyu"], "ぎぇ": ["gye"], "ぎょ": ["gyo"], # noqa
"くぁ": ["qa", "qwa", "kwa"], "くぃ": ["qi", "qwi"], "くぅ": ["qu", "qwu"], "くぇ": ["qe", "qwe"], "くぉ": ["qo", "qwo"], # noqa
"ぐぁ": ["gwa"], "ぐぃ": ["gwi"], "ぐぅ": ["gwu"], "ぐぇ": ["gwe"], "ぐぉ": ["gwo"], # noqa
"くゃ": ["qya"], "くゅ": ["qyu"], "くょ": ["qyo"], # noqa
"しゃ": ["sya", "sha"], "しぃ": ["syi"], "しゅ": ["syu", "shu"], "しぇ": ["sye", "she"], "しょ": ["syo", "sho"], # noqa
"じゃ": ["ja", "zya", "jya"], "じぃ": ["zyi", "jyi"], "じゅ": ["ju", "zyu", "jyu"], "じぇ": ["je", "zye", "jye"], "じょ": ["jo", "zyo", "jyo"], # noqa
"すぁ": ["swa"], "すぃ": ["swi"], "すぅ": ["swu"], "すぇ": ["swe"], "すぉ": ["swo"], # noqa
"ちゃ": ["tya", "cya", "cha"], "ちぃ": ["tyi", "cyi"], "ちゅ": ["tyu", "cyu", "chu"], "ちぇ": ["tye", "cye", "che"], "ちょ": ["tyo", "cyo", "cho"], # noqa
"ぢゃ": ["dya"], "ぢぃ": ["dyi"], "ぢゅ": ["dyu"], "ぢぇ": ["dye"], "ぢょ": ["dyo"], # noqa
"つぁ": ["tsa"], "つぃ": ["tsi"], "つぇ": ["tse"], "つぉ": ["tso"], # noqa
"てゃ": ["tha"], "てぃ": ["thi"], "てゅ": ["thu"], "てぇ": ["the"], "てょ": ["tho"], # noqa
"でゃ": ["dha"], "でぃ": ["dhi"], "でゅ": ["dhu"], "でぇ": ["dhe"], "でょ": ["dho"], # noqa
"とぁ": ["twa"], "とぃ": ["twi"], "とぅ": ["twu"], "とぇ": ["twe"], "とぉ": ["two"], # noqa
"どぁ": ["dwa"], "どぃ": ["dwi"], "どぅ": ["dwu"], "どぇ": ["dwe"], "どぉ": ["dwo"], # noqa
"にゃ": ["nya"], "にぃ": ["nyi"], "にゅ": ["nyu"], "にぇ": ["nye"], "にょ": ["nyo"], # noqa
"ひゃ": ["hya"], "ひぃ": ["hyi"], "ひゅ": ["hyu"], "ひぇ": ["hye"], "ひょ": ["hyo"], # noqa
"びゃ": ["bya"], "びぃ": ["byi"], "びゅ": ["byu"], "びぇ": ["bye"], "びょ": ["byo"], # noqa
"ぴゃ": ["pya"], "ぴぃ": ["pyi"], "ぴゅ": ["pyu"], "ぴぇ": ["pye"], "ぴょ": ["pyo"], # noqa
"ふぁ": ["fa"], "ふぃ": ["fi"], "ふぅ": ["fu"], "ふぇ": ["fe"], "ふぉ": ["fo"], "ふゃ": ["fya"], "ふゅ": ["fyu"], "ふょ": ["fyo"], # noqa
"ぶぁ": ["bwa"], "ぶぃ": ["bwi"], "ぶぅ": ["bwu"], "ぶぇ": ["bwe"], "ぶぉ": ["bwo"], # noqa
"ぷぁ": ["pwa"], "ぷぃ": ["pwi"], "ぷぅ": ["pwu"], "ぷぇ": ["pwe"], "ぷぉ": ["pwo"], # noqa
"みゃ": ["mya"], "みぃ": ["myi"], "みゅ": ["myu"], "みぇ": ["mye"], "みょ": ["myo"], # noqa
"りゃ": ["rya"], "りぃ": ["ryi"], "りゅ": ["ryu"], "りぇ": ["rye"], "りょ": ["ryo"], # noqa
"うぁ": ["wha"],
"うぃ": ["wi", "whi"],
"うぇ": ["we", "whe"],
"うぉ": ["who"], # noqa
"ゔぁ": ["va"],
"ゔぃ": ["vi"],
"ゔぇ": ["ve"],
"ゔぉ": ["vo"], # noqa
"きゃ": ["kya"],
"きぃ": ["kyi"],
"きゅ": ["kyu"],
"きぇ": ["kye"],
"きょ": ["kyo"], # noqa
"ぎゃ": ["gya"],
"ぎぃ": ["gyi"],
"ぎゅ": ["gyu"],
"ぎぇ": ["gye"],
"ぎょ": ["gyo"], # noqa
"くぁ": ["qa", "qwa", "kwa"],
"くぃ": ["qi", "qwi"],
"くぅ": ["qu", "qwu"],
"くぇ": ["qe", "qwe"],
"くぉ": ["qo", "qwo"], # noqa
"ぐぁ": ["gwa"],
"ぐぃ": ["gwi"],
"ぐぅ": ["gwu"],
"ぐぇ": ["gwe"],
"ぐぉ": ["gwo"], # noqa
"くゃ": ["qya"],
"くゅ": ["qyu"],
"くょ": ["qyo"], # noqa
"しゃ": ["sya", "sha"],
"しぃ": ["syi"],
"しゅ": ["syu", "shu"],
"しぇ": ["sye", "she"],
"しょ": ["syo", "sho"], # noqa
"じゃ": ["ja", "zya", "jya"],
"じぃ": ["zyi", "jyi"],
"じゅ": ["ju", "zyu", "jyu"],
"じぇ": ["je", "zye", "jye"],
"じょ": ["jo", "zyo", "jyo"], # noqa
"すぁ": ["swa"],
"すぃ": ["swi"],
"すぅ": ["swu"],
"すぇ": ["swe"],
"すぉ": ["swo"], # noqa
"ちゃ": ["tya", "cya", "cha"],
"ちぃ": ["tyi", "cyi"],
"ちゅ": ["tyu", "cyu", "chu"],
"ちぇ": ["tye", "cye", "che"],
"ちょ": ["tyo", "cyo", "cho"], # noqa
"ぢゃ": ["dya"],
"ぢぃ": ["dyi"],
"ぢゅ": ["dyu"],
"ぢぇ": ["dye"],
"ぢょ": ["dyo"], # noqa
"つぁ": ["tsa"],
"つぃ": ["tsi"],
"つぇ": ["tse"],
"つぉ": ["tso"], # noqa
"てゃ": ["tha"],
"てぃ": ["thi"],
"てゅ": ["thu"],
"てぇ": ["the"],
"てょ": ["tho"], # noqa
"でゃ": ["dha"],
"でぃ": ["dhi"],
"でゅ": ["dhu"],
"でぇ": ["dhe"],
"でょ": ["dho"], # noqa
"とぁ": ["twa"],
"とぃ": ["twi"],
"とぅ": ["twu"],
"とぇ": ["twe"],
"とぉ": ["two"], # noqa
"どぁ": ["dwa"],
"どぃ": ["dwi"],
"どぅ": ["dwu"],
"どぇ": ["dwe"],
"どぉ": ["dwo"], # noqa
"にゃ": ["nya"],
"にぃ": ["nyi"],
"にゅ": ["nyu"],
"にぇ": ["nye"],
"にょ": ["nyo"], # noqa
"ひゃ": ["hya"],
"ひぃ": ["hyi"],
"ひゅ": ["hyu"],
"ひぇ": ["hye"],
"ひょ": ["hyo"], # noqa
"びゃ": ["bya"],
"びぃ": ["byi"],
"びゅ": ["byu"],
"びぇ": ["bye"],
"びょ": ["byo"], # noqa
"ぴゃ": ["pya"],
"ぴぃ": ["pyi"],
"ぴゅ": ["pyu"],
"ぴぇ": ["pye"],
"ぴょ": ["pyo"], # noqa
"ふぁ": ["fa"],
"ふぃ": ["fi"],
"ふぅ": ["fu"],
"ふぇ": ["fe"],
"ふぉ": ["fo"],
"ふゃ": ["fya"],
"ふゅ": ["fyu"],
"ふょ": ["fyo"], # noqa
"ぶぁ": ["bwa"],
"ぶぃ": ["bwi"],
"ぶぅ": ["bwu"],
"ぶぇ": ["bwe"],
"ぶぉ": ["bwo"], # noqa
"ぷぁ": ["pwa"],
"ぷぃ": ["pwi"],
"ぷぅ": ["pwu"],
"ぷぇ": ["pwe"],
"ぷぉ": ["pwo"], # noqa
"みゃ": ["mya"],
"みぃ": ["myi"],
"みゅ": ["myu"],
"みぇ": ["mye"],
"みょ": ["myo"], # noqa
"りゃ": ["rya"],
"りぃ": ["ryi"],
"りゅ": ["ryu"],
"りぇ": ["rye"],
"りょ": ["ryo"], # noqa
# Sokuon 促音
"っ": [None, "xtu", "xtsu", "ltu", "ltsu"], # NOTE: None represents the next character except for "a", "i", "u", "e", "o", "n". # noqa
"っ": [
None,
"xtu",
"xtsu",
"ltu",
"ltsu",
], # NOTE: None represents the next character except for "a", "i", "u", "e", "o", "n". # noqa
}


Expand All @@ -72,8 +242,6 @@
for k in HIRA2ROMA_MAP.keys():
if s_hira in k:
# NOTE: Assume that k is a combination of a single capital hinagana and a single small hiragana # noqa
HIRA2ROMA_MAP[k].extend([
v1+v2
for v1, v2 in product(HIRA2ROMA_MAP[k[0]], s_romas)
if v1 is not None and v2 is not None
])
HIRA2ROMA_MAP[k].extend(
[v1 + v2 for v1, v2 in product(HIRA2ROMA_MAP[k[0]], s_romas) if v1 is not None and v2 is not None]
)
4 changes: 2 additions & 2 deletions simple_typing_application/const/key_monitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@


class EKeyMonitorType(Enum):
SSHKEYBOARD = 'SSHKEYBOARD'
PYNPUT = 'PYNPUT'
SSHKEYBOARD = "SSHKEYBOARD"
PYNPUT = "PYNPUT"
5 changes: 2 additions & 3 deletions simple_typing_application/const/keys.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,5 @@


class EMetaKey(Enum):

ESC = 'ESC'
TAB = 'TAB'
ESC = "ESC"
TAB = "TAB"
Loading
Loading