libs.functions.compose.text_item
libs/functions/compose/text_item.py
1""" 2libs/functions/compose/text_item.py 3""" 4 5from typing import TYPE_CHECKING, Literal, Optional, cast 6 7import libs.global_value as g 8from cls.timekit import ExtendedDatetime as ExtDt 9 10if TYPE_CHECKING: 11 from libs.datamodels import GameInfo 12 13 14def remarks(headword=False) -> str | list: 15 """引数で指定された集計方法を注記にまとめる 16 17 Args: 18 headword (bool, optional): 見出しを付ける. Defaults to False. 19 20 Returns: 21 Union[list, str]: 22 - `headword` がない場合はリストで返す 23 - `headword` がある場合は文字列で返す 24 """ 25 26 remark_list: list = [] 27 28 if g.params.get("individual"): # 個人集計時のみ表示 29 if not g.params.get("unregistered_replace"): 30 remark_list.append("ゲスト置換なし(" + g.cfg.setting.guest_mark + ":未登録プレイヤー)") 31 if not g.params.get("guest_skip"): 32 remark_list.append("2ゲスト戦の結果を含む") 33 else: # チーム集計時 34 if g.params.get("friendly_fire"): 35 if g.params.get("game_results") and g.params.get("verbose"): 36 remark_list.append("チーム同卓時の結果を含む(" + g.cfg.setting.guest_mark + ")") 37 else: 38 remark_list.append("チーム同卓時の結果を含む") 39 if g.params["stipulated"] >= 2: 40 remark_list.append(f"規定打数 {g.params["stipulated"]} G以上") 41 if g.params.get("command") in ["ranking"]: 42 remark_list.append(f"{int(g.params.get("ranked", g.cfg.ranking.ranked))}位まで表示") 43 if g.params.get("rule_version") != g.cfg.mahjong.rule_version: 44 remark_list.append(f"集計対象ルール {g.params["rule_version"]}") 45 if g.params.get("mixed"): 46 remark_list.append("集計対象ルール すべて") 47 48 if headword: 49 if remark_list: 50 return f"特記事項:{"、".join(remark_list)}" 51 return "特記事項:なし" 52 53 return remark_list 54 55 56def search_word(headword=False) -> str: 57 """キーワード検索条件を返す 58 59 Args: 60 headword (bool, optional): 見出しを付ける. Defaults to False. 61 62 Returns: 63 str: 条件をまとめた文字列 64 """ 65 66 if (ret := str(g.params.get("search_word", "")).replace("%", "")): 67 # 集約条件 68 if g.params.get("group_length"): 69 ret += f"({g.params["group_length"]}文字集約)" 70 else: 71 ret = "" 72 73 if headword: 74 if ret: 75 return f"検索ワード:{ret}" 76 77 return ret 78 79 80def search_range(kind: Literal["str", "list"] = "str", time_pattern=None) -> list | str: 81 """検索範囲を返す(ヘッダ出力用) 82 83 Args: 84 kind (str): 返値のタイプ. Defaults to str. 85 time_pattern (str, optional): 表示させるフォーマットを選択. Defaults to None. 86 87 Returns: 88 Union[list, str]: 89 - `kind` にlistが指定されている場合はリスト 90 - `kind` にstrが指定されている場合は文字列 91 """ 92 93 starttime: str 94 endtime: str 95 96 match time_pattern: 97 case "day": 98 starttime = ExtDt(g.params["starttime"]).format("ts") 99 endtime = ExtDt(g.params["endtime"]).format("ts") 100 case "time": 101 starttime = ExtDt(g.params["starttime"]).format("ymdhm") 102 endtime = ExtDt(g.params["endtime"]).format("ymdhm") 103 case _: 104 starttime = ExtDt(g.params["starttime"]).format("ymdhms") 105 endtime = ExtDt(g.params["endtime"]).format("ymdhms") 106 107 match kind: 108 case "list": 109 return ([starttime, endtime]) 110 case "str": 111 return f"{starttime} ~ {endtime}" 112 113 114def aggregation_range( 115 game_info: "GameInfo", 116 kind: Literal["list", "str"] = "str", 117) -> list | str: 118 """集計範囲を返す(ヘッダ出力用) 119 120 Args: 121 game_info (GameInfo): 集計範囲のゲーム情報 122 kind (str): 表示させるフォーマットを選択. Defaults to str. 123 - list: リストで受け取る 124 - str: 文字列で受け取る 125 126 Returns: 127 Union[list, str]: 128 - `kind` にlistが指定されている場合はリストで返す 129 - `kind` にstrが指定されている場合は文字列で返す 130 """ 131 132 assert isinstance(game_info.first_game, ExtDt) 133 assert isinstance(game_info.last_game, ExtDt) 134 135 if g.params.get("search_word"): # コメント検索の場合はコメントで表示 136 first = game_info.first_comment 137 last = game_info.last_comment 138 else: 139 first = game_info.first_game.format("ymdhm") 140 last = game_info.last_game.format("ymdhm") 141 142 match kind: 143 case "list": 144 return ([first, last]) 145 case "str": 146 return f"{first} ~ {last}" 147 148 149def date_range( 150 kind: str, 151 prefix_a: Optional[str] = None, 152 prefix_b: Optional[str] = None, 153) -> str: 154 """日付範囲文字列 155 156 Args: 157 kind (str): ExtendedDatetimeのformatメソッドに渡す引数 158 - *_o: 表示にondayを使用 159 prefix_a (Optional[str], optional): 単独で返った時の接頭辞. Defaults to None. 160 prefix_b (Optional[str], optional): 範囲で返った時の接頭辞. Defaults to None. 161 162 Returns: 163 str: 生成文字列 164 """ 165 166 ret: str 167 str_st: str 168 str_et: str 169 st = ExtDt(g.params["starttime"]) 170 et = ExtDt(g.params["endtime"]) 171 ot = ExtDt(g.params["onday"]) 172 173 if kind.startswith("j"): 174 kind = kind.replace("j", "") 175 delimiter = "ja" 176 else: 177 delimiter = "slash" 178 179 if kind.endswith("_o"): 180 kind = kind.replace("_o", "") 181 str_st = st.format(cast(ExtDt.FormatType, kind), delimiter=cast(ExtDt.DelimiterStyle, delimiter)) 182 str_et = ot.format(cast(ExtDt.FormatType, kind), delimiter=cast(ExtDt.DelimiterStyle, delimiter)) 183 else: 184 str_st = st.format(cast(ExtDt.FormatType, kind), delimiter=cast(ExtDt.DelimiterStyle, delimiter)) 185 str_et = et.format(cast(ExtDt.FormatType, kind), delimiter=cast(ExtDt.DelimiterStyle, delimiter)) 186 187 if st.format(cast(ExtDt.FormatType, kind), delimiter="num") == ot.format(cast(ExtDt.FormatType, kind), delimiter="num"): 188 if prefix_a and prefix_b: 189 ret = f"{prefix_a} ({str_st})" 190 else: 191 ret = f"{str_st}" 192 else: 193 if prefix_a and prefix_b: 194 ret = f"{prefix_b} ({str_st} - {str_et})" 195 else: 196 ret = f"{str_st} - {str_et}" 197 198 return ret
def
remarks(headword=False) -> str | list:
15def remarks(headword=False) -> str | list: 16 """引数で指定された集計方法を注記にまとめる 17 18 Args: 19 headword (bool, optional): 見出しを付ける. Defaults to False. 20 21 Returns: 22 Union[list, str]: 23 - `headword` がない場合はリストで返す 24 - `headword` がある場合は文字列で返す 25 """ 26 27 remark_list: list = [] 28 29 if g.params.get("individual"): # 個人集計時のみ表示 30 if not g.params.get("unregistered_replace"): 31 remark_list.append("ゲスト置換なし(" + g.cfg.setting.guest_mark + ":未登録プレイヤー)") 32 if not g.params.get("guest_skip"): 33 remark_list.append("2ゲスト戦の結果を含む") 34 else: # チーム集計時 35 if g.params.get("friendly_fire"): 36 if g.params.get("game_results") and g.params.get("verbose"): 37 remark_list.append("チーム同卓時の結果を含む(" + g.cfg.setting.guest_mark + ")") 38 else: 39 remark_list.append("チーム同卓時の結果を含む") 40 if g.params["stipulated"] >= 2: 41 remark_list.append(f"規定打数 {g.params["stipulated"]} G以上") 42 if g.params.get("command") in ["ranking"]: 43 remark_list.append(f"{int(g.params.get("ranked", g.cfg.ranking.ranked))}位まで表示") 44 if g.params.get("rule_version") != g.cfg.mahjong.rule_version: 45 remark_list.append(f"集計対象ルール {g.params["rule_version"]}") 46 if g.params.get("mixed"): 47 remark_list.append("集計対象ルール すべて") 48 49 if headword: 50 if remark_list: 51 return f"特記事項:{"、".join(remark_list)}" 52 return "特記事項:なし" 53 54 return remark_list
引数で指定された集計方法を注記にまとめる
Arguments:
- headword (bool, optional): 見出しを付ける. Defaults to False.
Returns:
Union[list, str]:
headwordがない場合はリストで返すheadwordがある場合は文字列で返す
def
search_word(headword=False) -> str:
57def search_word(headword=False) -> str: 58 """キーワード検索条件を返す 59 60 Args: 61 headword (bool, optional): 見出しを付ける. Defaults to False. 62 63 Returns: 64 str: 条件をまとめた文字列 65 """ 66 67 if (ret := str(g.params.get("search_word", "")).replace("%", "")): 68 # 集約条件 69 if g.params.get("group_length"): 70 ret += f"({g.params["group_length"]}文字集約)" 71 else: 72 ret = "" 73 74 if headword: 75 if ret: 76 return f"検索ワード:{ret}" 77 78 return ret
キーワード検索条件を返す
Arguments:
- headword (bool, optional): 見出しを付ける. Defaults to False.
Returns:
str: 条件をまとめた文字列
def
search_range(kind: Literal['str', 'list'] = 'str', time_pattern=None) -> list | str:
81def search_range(kind: Literal["str", "list"] = "str", time_pattern=None) -> list | str: 82 """検索範囲を返す(ヘッダ出力用) 83 84 Args: 85 kind (str): 返値のタイプ. Defaults to str. 86 time_pattern (str, optional): 表示させるフォーマットを選択. Defaults to None. 87 88 Returns: 89 Union[list, str]: 90 - `kind` にlistが指定されている場合はリスト 91 - `kind` にstrが指定されている場合は文字列 92 """ 93 94 starttime: str 95 endtime: str 96 97 match time_pattern: 98 case "day": 99 starttime = ExtDt(g.params["starttime"]).format("ts") 100 endtime = ExtDt(g.params["endtime"]).format("ts") 101 case "time": 102 starttime = ExtDt(g.params["starttime"]).format("ymdhm") 103 endtime = ExtDt(g.params["endtime"]).format("ymdhm") 104 case _: 105 starttime = ExtDt(g.params["starttime"]).format("ymdhms") 106 endtime = ExtDt(g.params["endtime"]).format("ymdhms") 107 108 match kind: 109 case "list": 110 return ([starttime, endtime]) 111 case "str": 112 return f"{starttime} ~ {endtime}"
検索範囲を返す(ヘッダ出力用)
Arguments:
- kind (str): 返値のタイプ. Defaults to str.
- time_pattern (str, optional): 表示させるフォーマットを選択. Defaults to None.
Returns:
Union[list, str]:
kindにlistが指定されている場合はリストkindにstrが指定されている場合は文字列
def
aggregation_range( game_info: libs.datamodels.GameInfo, kind: Literal['list', 'str'] = 'str') -> list | str:
115def aggregation_range( 116 game_info: "GameInfo", 117 kind: Literal["list", "str"] = "str", 118) -> list | str: 119 """集計範囲を返す(ヘッダ出力用) 120 121 Args: 122 game_info (GameInfo): 集計範囲のゲーム情報 123 kind (str): 表示させるフォーマットを選択. Defaults to str. 124 - list: リストで受け取る 125 - str: 文字列で受け取る 126 127 Returns: 128 Union[list, str]: 129 - `kind` にlistが指定されている場合はリストで返す 130 - `kind` にstrが指定されている場合は文字列で返す 131 """ 132 133 assert isinstance(game_info.first_game, ExtDt) 134 assert isinstance(game_info.last_game, ExtDt) 135 136 if g.params.get("search_word"): # コメント検索の場合はコメントで表示 137 first = game_info.first_comment 138 last = game_info.last_comment 139 else: 140 first = game_info.first_game.format("ymdhm") 141 last = game_info.last_game.format("ymdhm") 142 143 match kind: 144 case "list": 145 return ([first, last]) 146 case "str": 147 return f"{first} ~ {last}"
集計範囲を返す(ヘッダ出力用)
Arguments:
- game_info (GameInfo): 集計範囲のゲーム情報
- kind (str): 表示させるフォーマットを選択. Defaults to str.
- list: リストで受け取る
- str: 文字列で受け取る
Returns:
Union[list, str]:
kindにlistが指定されている場合はリストで返すkindにstrが指定されている場合は文字列で返す
def
date_range( kind: str, prefix_a: Optional[str] = None, prefix_b: Optional[str] = None) -> str:
150def date_range( 151 kind: str, 152 prefix_a: Optional[str] = None, 153 prefix_b: Optional[str] = None, 154) -> str: 155 """日付範囲文字列 156 157 Args: 158 kind (str): ExtendedDatetimeのformatメソッドに渡す引数 159 - *_o: 表示にondayを使用 160 prefix_a (Optional[str], optional): 単独で返った時の接頭辞. Defaults to None. 161 prefix_b (Optional[str], optional): 範囲で返った時の接頭辞. Defaults to None. 162 163 Returns: 164 str: 生成文字列 165 """ 166 167 ret: str 168 str_st: str 169 str_et: str 170 st = ExtDt(g.params["starttime"]) 171 et = ExtDt(g.params["endtime"]) 172 ot = ExtDt(g.params["onday"]) 173 174 if kind.startswith("j"): 175 kind = kind.replace("j", "") 176 delimiter = "ja" 177 else: 178 delimiter = "slash" 179 180 if kind.endswith("_o"): 181 kind = kind.replace("_o", "") 182 str_st = st.format(cast(ExtDt.FormatType, kind), delimiter=cast(ExtDt.DelimiterStyle, delimiter)) 183 str_et = ot.format(cast(ExtDt.FormatType, kind), delimiter=cast(ExtDt.DelimiterStyle, delimiter)) 184 else: 185 str_st = st.format(cast(ExtDt.FormatType, kind), delimiter=cast(ExtDt.DelimiterStyle, delimiter)) 186 str_et = et.format(cast(ExtDt.FormatType, kind), delimiter=cast(ExtDt.DelimiterStyle, delimiter)) 187 188 if st.format(cast(ExtDt.FormatType, kind), delimiter="num") == ot.format(cast(ExtDt.FormatType, kind), delimiter="num"): 189 if prefix_a and prefix_b: 190 ret = f"{prefix_a} ({str_st})" 191 else: 192 ret = f"{str_st}" 193 else: 194 if prefix_a and prefix_b: 195 ret = f"{prefix_b} ({str_st} - {str_et})" 196 else: 197 ret = f"{str_st} - {str_et}" 198 199 return ret
日付範囲文字列
Arguments:
- kind (str): ExtendedDatetimeのformatメソッドに渡す引数
- *_o: 表示にondayを使用
- prefix_a (Optional[str], optional): 単独で返った時の接頭辞. Defaults to None.
- prefix_b (Optional[str], optional): 範囲で返った時の接頭辞. Defaults to None.
Returns:
str: 生成文字列