diff --git a/utaupy/otoini.py b/utaupy/otoini.py index b902831..dcea2f6 100644 --- a/utaupy/otoini.py +++ b/utaupy/otoini.py @@ -8,6 +8,7 @@ # TODO: setParam用のコメントファイルを扱えるようにする。 + def main(): """ 直接実行されたときの挙動 @@ -49,6 +50,81 @@ def replace_aliases(self, before, after): oto.alias = oto.alias.replace(before, after) return self + def apply_regex(self, func, *args, pattern=None): + """ + エイリアスが正規表現に完全一致したら、その行で関数を実行する。 + + Parameters: + func (function): 対象行に実行する関数名。 + *args (Tuple): funcの引数。複数可能。 + pattern (str): 対象行の正規表現のパターン。完全一致。省略時は全行に実行。 + """ + # 正規表現がNone以外なら、正規表現に完全一致した行をフィルタリング + if pattern is not None: + regex = re.compile(rf"{pattern}") + filtered_otos = [oto for oto in self if regex.fullmatch(oto.alias)] + # 違えば全行をフィルタリング + else: + filtered_otos = [oto for oto in self] + + # フィルタリングした行に関数を実行 + list(map(lambda oto: func(oto, *args), filtered_otos)) + return self + + def replace_regexp_alias(self, before, after=None, pattern=None): + """ + エイリアスを置換する。(正規表現対応) + + Parameters: + before (str): 置換する文字列。 + after (str): 置換後の文字列。省略時は空文字。 + pattern (str): 対象行の正規表現のパターン。完全一致。省略時は全行に実行。 + """ + # 入力を取得 or デフォルト値を設定 + before = str(before or "") + after = str(after or "") + + # 一致した行 or 全行で置換 + def replace_func(oto, before, after): + oto.alias = oto.alias.replace(before, after) + return self.apply_regex(replace_func, before, after, pattern=pattern) + + def add_alias(self, prefix=None, suffix=None, pattern=None): + """ + エイリアスに接頭辞と接尾辞を追加する。 + + Parameters: + prefix (str): 追加する接頭辞。省略時は追加しない。 + suffix (str): 追加する接尾辞。省略時は追加しない。 + pattern (str): 対象行の正規表現のパターン。完全一致。省略時は全行に実行。 + """ + # 入力を取得 or デフォルト値を設定 + prefix = str(prefix or "") + suffix = str(suffix or "") + + # 一致した行 or 全行に追加 + def add_alias_func(oto): + oto.alias = (prefix or "") + oto.alias + (suffix or "") + return self.apply_regex(add_alias_func, pattern=pattern) + + def trim_alias(self, prefix_len=None, suffix_len=None, pattern=None): + """ + エイリアスの前後から指定した文字数を削除する。 + + Parameters: + prefix (int): 語頭から削除する桁数。省略時は削除しない。 + suffix (int): 語尾から削除する桁数。省略時は削除しない。 + pattern (str): 対象行の正規表現のパターン。完全一致。省略時は全行に実行。 + """ + # 入力を整数として取得 or デフォルト値を設定 + prefix_len = int(prefix_len or 0) + suffix_len = int(suffix_len or 0) + + # 一致した行 or 全行から削除 + def trim_func(oto): + oto.alias = oto.alias[prefix_len:len(oto.alias)-suffix_len] + return self.apply_regex(trim_func, pattern=pattern) + def is_mono(self): """ モノフォン形式のエイリアスになっているか判定する。