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 6 7from table2ascii import Alignment, PresetStyle, table2ascii 8 9import libs.global_value as g 10from libs.utils.timekit import Delimiter, Format 11from libs.utils.timekit import ExtendedDatetime as ExtDt 12 13if TYPE_CHECKING: 14 from libs.domain.datamodels import GameInfo 15 16 17def remarks(headword: bool = False) -> str | list[str]: 18 """ 19 引数で指定された集計方法を注記にまとめる 20 21 Args: 22 headword (bool, optional): 見出しを付ける. Defaults to False. 23 24 Returns: 25 Union[list, str]: 26 - `headword` がない場合はリストで返す 27 - `headword` がある場合は文字列で返す 28 29 """ 30 remark_list: list[str] = [] 31 32 if g.params.individual: # 個人集計時のみ表示 33 if not g.params.unregistered_replace: 34 remark_list.append("ゲスト置換なし(" + g.cfg.setting.guest_mark + ":未登録プレイヤー)") 35 if not g.params.guest_skip: 36 remark_list.append("2ゲスト戦の結果を含む") 37 else: # チーム集計時 38 if g.params.friendly_fire: 39 if g.params.game_results and g.params.verbose: 40 remark_list.append("チーム同卓時の結果を含む(" + g.cfg.setting.guest_mark + ")") 41 else: 42 remark_list.append("チーム同卓時の結果を含む") 43 44 if g.params.stipulated >= 2: 45 remark_list.append(f"規定打数 {g.params.stipulated} G以上") 46 if g.params.command in ["ranking"]: 47 remark_list.append(f"{g.params.ranked}位まで表示") 48 49 # 集計ルール 50 if g.params.mixed: 51 match g.params.target_mode: 52 case 3: 53 remark_list.append("集計対象ルール すべて(三人打)") 54 case 4: 55 remark_list.append("集計対象ルール すべて(四人打)") 56 case _: 57 remark_list.append("集計対象ルール すべて") 58 elif len(g.params.rule_list) > 1: 59 remark_list.append(f"集計対象ルール {'、'.join(g.params.rule_list)}") 60 elif g.params.rule_version != g.params.default_rule: 61 remark_list.append(f"集計対象ルール {'、'.join(g.params.rule_list)}") 62 63 if headword: 64 if remark_list: 65 return f"特記事項:{'、'.join(remark_list)}" 66 return "特記事項:なし" 67 68 return remark_list 69 70 71def search_word(headword: bool = False) -> str: 72 """ 73 キーワード検索条件を返す 74 75 Args: 76 headword (bool, optional): 見出しを付ける. Defaults to False. 77 78 Returns: 79 str: 条件をまとめた文字列 80 81 """ 82 if ret := g.params.search_word.replace("%", ""): 83 # 集約条件 84 if g.params.group_length: 85 ret += f"({g.params.group_length}文字集約)" 86 else: 87 ret = "" 88 89 if headword: 90 if ret: 91 return f"検索ワード:{ret}" 92 93 return ret 94 95 96def search_range(kind: Literal["str", "list"] = "str", time_pattern: Optional[str] = None) -> list[str] | str: 97 """ 98 検索範囲を返す(ヘッダ出力用) 99 100 Args: 101 kind (str): 返値のタイプ. Defaults to str. 102 time_pattern (str, optional): 表示させるフォーマットを選択. Defaults to None. 103 104 Returns: 105 Union[list, str]: 106 - `kind` にlistが指定されている場合はリスト 107 - `kind` にstrが指定されている場合は文字列 108 109 """ 110 starttime: str 111 endtime: str 112 113 match time_pattern: 114 case "day": 115 starttime = ExtDt(g.params.starttime).format(Format.TS) 116 endtime = ExtDt(g.params.endtime).format(Format.TS) 117 case "time": 118 starttime = ExtDt(g.params.starttime).format(Format.YMDHM) 119 endtime = ExtDt(g.params.endtime).format(Format.YMDHM) 120 case _: 121 starttime = ExtDt(g.params.starttime).format(Format.YMDHMS) 122 endtime = ExtDt(g.params.endtime).format(Format.YMDHMS) 123 124 match kind: 125 case "list": 126 return [starttime, endtime] 127 case "str": 128 return f"{starttime} ~ {endtime}" 129 130 131def aggregation_range( 132 game_info: "GameInfo", 133 kind: Literal["list", "str"] = "str", 134) -> list[Optional[str]] | str: 135 """ 136 集計範囲を返す(ヘッダ出力用) 137 138 Args: 139 game_info (GameInfo): 集計範囲のゲーム情報 140 kind (str): 表示させるフォーマットを選択. Defaults to str. 141 - list: リストで受け取る 142 - str: 文字列で受け取る 143 144 Returns: 145 Union[list, str]: 146 - `kind` にlistが指定されている場合はリストで返す 147 - `kind` にstrが指定されている場合は文字列で返す 148 149 """ 150 assert isinstance(game_info.first_game, ExtDt) 151 assert isinstance(game_info.last_game, ExtDt) 152 153 if g.params.search_word: # コメント検索の場合はコメントで表示 154 first = game_info.first_comment 155 last = game_info.last_comment 156 else: 157 first = game_info.first_game.format(Format.YMDHM) 158 last = game_info.last_game.format(Format.YMDHM) 159 160 match kind: 161 case "list": 162 return [first, last] 163 case "str": 164 return f"{first} ~ {last}" 165 166 167def date_range( 168 kind: Format, 169 prefix_a: Optional[str] = None, 170 prefix_b: Optional[str] = None, 171) -> str: 172 """ 173 日付範囲文字列 174 175 Args: 176 kind (Format): ExtendedDatetimeのformatメソッドに渡す引数 177 prefix_a (Optional[str], optional): 単独で返った時の接頭辞. Defaults to None. 178 prefix_b (Optional[str], optional): 範囲で返った時の接頭辞. Defaults to None. 179 180 Returns: 181 str: 生成文字列 182 183 """ 184 ret: str 185 str_st: str 186 str_et: str 187 st = ExtDt(g.params.starttime) 188 et = ExtDt(g.params.endtime) 189 ot = ExtDt(g.params.onday) 190 191 if kind.name.endswith("_O"): 192 str_st = st.format(kind) 193 str_et = ot.format(kind) 194 else: 195 str_st = st.format(kind) 196 str_et = et.format(kind) 197 198 if st.format(kind, Delimiter.NUMBER) == ot.format(kind, Delimiter.NUMBER): 199 if prefix_a and prefix_b: 200 ret = f"{prefix_a} ({str_st})" 201 else: 202 ret = f"{str_st}" 203 else: 204 if prefix_a and prefix_b: 205 ret = f"{prefix_b} ({str_st} - {str_et})" 206 else: 207 ret = f"{str_st} - {str_et}" 208 209 return ret 210 211 212def get_members_list() -> str: 213 """ 214 登録済みのメンバー一覧を取得する 215 216 Returns: 217 str: メンバーリスト 218 219 """ 220 name_list: list[list[str]] = [] 221 for pname in g.cfg.member.lists: 222 name_list.append([pname, ", ".join(g.cfg.member.alias(pname))]) 223 224 if name_list: 225 output = table2ascii( 226 header=["表示名", "登録されている名前"], 227 body=name_list, 228 alignments=[Alignment.LEFT, Alignment.LEFT], 229 style=PresetStyle.ascii_borderless, 230 ) 231 else: 232 output = "メンバーは登録されていません。" 233 234 return output 235 236 237def get_team_list() -> str: 238 """ 239 チームの登録状況を取得する 240 241 Returns: 242 str: チームリスト 243 244 """ 245 team_list: list[list[str]] = [] 246 for team_name in g.cfg.team.lists: 247 if member := ", ".join(g.cfg.team.member(team_name)): 248 team_list.append([team_name, member]) 249 else: 250 team_list.append([team_name, "未エントリー"]) 251 252 if team_list: 253 output = table2ascii( 254 header=["チーム名", "所属メンバー"], 255 body=team_list, 256 alignments=[Alignment.LEFT, Alignment.LEFT], 257 style=PresetStyle.ascii_borderless, 258 ) 259 else: 260 output = "チームは登録されていません。" 261 262 return output
def
remarks(headword: bool = False) -> str | list[str]:
18def remarks(headword: bool = False) -> str | list[str]: 19 """ 20 引数で指定された集計方法を注記にまとめる 21 22 Args: 23 headword (bool, optional): 見出しを付ける. Defaults to False. 24 25 Returns: 26 Union[list, str]: 27 - `headword` がない場合はリストで返す 28 - `headword` がある場合は文字列で返す 29 30 """ 31 remark_list: list[str] = [] 32 33 if g.params.individual: # 個人集計時のみ表示 34 if not g.params.unregistered_replace: 35 remark_list.append("ゲスト置換なし(" + g.cfg.setting.guest_mark + ":未登録プレイヤー)") 36 if not g.params.guest_skip: 37 remark_list.append("2ゲスト戦の結果を含む") 38 else: # チーム集計時 39 if g.params.friendly_fire: 40 if g.params.game_results and g.params.verbose: 41 remark_list.append("チーム同卓時の結果を含む(" + g.cfg.setting.guest_mark + ")") 42 else: 43 remark_list.append("チーム同卓時の結果を含む") 44 45 if g.params.stipulated >= 2: 46 remark_list.append(f"規定打数 {g.params.stipulated} G以上") 47 if g.params.command in ["ranking"]: 48 remark_list.append(f"{g.params.ranked}位まで表示") 49 50 # 集計ルール 51 if g.params.mixed: 52 match g.params.target_mode: 53 case 3: 54 remark_list.append("集計対象ルール すべて(三人打)") 55 case 4: 56 remark_list.append("集計対象ルール すべて(四人打)") 57 case _: 58 remark_list.append("集計対象ルール すべて") 59 elif len(g.params.rule_list) > 1: 60 remark_list.append(f"集計対象ルール {'、'.join(g.params.rule_list)}") 61 elif g.params.rule_version != g.params.default_rule: 62 remark_list.append(f"集計対象ルール {'、'.join(g.params.rule_list)}") 63 64 if headword: 65 if remark_list: 66 return f"特記事項:{'、'.join(remark_list)}" 67 return "特記事項:なし" 68 69 return remark_list
引数で指定された集計方法を注記にまとめる
Arguments:
- headword (bool, optional): 見出しを付ける. Defaults to False.
Returns:
Union[list, str]:
headwordがない場合はリストで返すheadwordがある場合は文字列で返す
def
search_word(headword: bool = False) -> str:
72def search_word(headword: bool = False) -> str: 73 """ 74 キーワード検索条件を返す 75 76 Args: 77 headword (bool, optional): 見出しを付ける. Defaults to False. 78 79 Returns: 80 str: 条件をまとめた文字列 81 82 """ 83 if ret := g.params.search_word.replace("%", ""): 84 # 集約条件 85 if g.params.group_length: 86 ret += f"({g.params.group_length}文字集約)" 87 else: 88 ret = "" 89 90 if headword: 91 if ret: 92 return f"検索ワード:{ret}" 93 94 return ret
キーワード検索条件を返す
Arguments:
- headword (bool, optional): 見出しを付ける. Defaults to False.
Returns:
str: 条件をまとめた文字列
def
search_range( kind: Literal['str', 'list'] = 'str', time_pattern: str | None = None) -> list[str] | str:
97def search_range(kind: Literal["str", "list"] = "str", time_pattern: Optional[str] = None) -> list[str] | str: 98 """ 99 検索範囲を返す(ヘッダ出力用) 100 101 Args: 102 kind (str): 返値のタイプ. Defaults to str. 103 time_pattern (str, optional): 表示させるフォーマットを選択. Defaults to None. 104 105 Returns: 106 Union[list, str]: 107 - `kind` にlistが指定されている場合はリスト 108 - `kind` にstrが指定されている場合は文字列 109 110 """ 111 starttime: str 112 endtime: str 113 114 match time_pattern: 115 case "day": 116 starttime = ExtDt(g.params.starttime).format(Format.TS) 117 endtime = ExtDt(g.params.endtime).format(Format.TS) 118 case "time": 119 starttime = ExtDt(g.params.starttime).format(Format.YMDHM) 120 endtime = ExtDt(g.params.endtime).format(Format.YMDHM) 121 case _: 122 starttime = ExtDt(g.params.starttime).format(Format.YMDHMS) 123 endtime = ExtDt(g.params.endtime).format(Format.YMDHMS) 124 125 match kind: 126 case "list": 127 return [starttime, endtime] 128 case "str": 129 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.domain.datamodels.GameInfo, kind: Literal['list', 'str'] = 'str') -> list[str | None] | str:
132def aggregation_range( 133 game_info: "GameInfo", 134 kind: Literal["list", "str"] = "str", 135) -> list[Optional[str]] | str: 136 """ 137 集計範囲を返す(ヘッダ出力用) 138 139 Args: 140 game_info (GameInfo): 集計範囲のゲーム情報 141 kind (str): 表示させるフォーマットを選択. Defaults to str. 142 - list: リストで受け取る 143 - str: 文字列で受け取る 144 145 Returns: 146 Union[list, str]: 147 - `kind` にlistが指定されている場合はリストで返す 148 - `kind` にstrが指定されている場合は文字列で返す 149 150 """ 151 assert isinstance(game_info.first_game, ExtDt) 152 assert isinstance(game_info.last_game, ExtDt) 153 154 if g.params.search_word: # コメント検索の場合はコメントで表示 155 first = game_info.first_comment 156 last = game_info.last_comment 157 else: 158 first = game_info.first_game.format(Format.YMDHM) 159 last = game_info.last_game.format(Format.YMDHM) 160 161 match kind: 162 case "list": 163 return [first, last] 164 case "str": 165 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: libs.utils.timekit.Format, prefix_a: str | None = None, prefix_b: str | None = None) -> str:
168def date_range( 169 kind: Format, 170 prefix_a: Optional[str] = None, 171 prefix_b: Optional[str] = None, 172) -> str: 173 """ 174 日付範囲文字列 175 176 Args: 177 kind (Format): ExtendedDatetimeのformatメソッドに渡す引数 178 prefix_a (Optional[str], optional): 単独で返った時の接頭辞. Defaults to None. 179 prefix_b (Optional[str], optional): 範囲で返った時の接頭辞. Defaults to None. 180 181 Returns: 182 str: 生成文字列 183 184 """ 185 ret: str 186 str_st: str 187 str_et: str 188 st = ExtDt(g.params.starttime) 189 et = ExtDt(g.params.endtime) 190 ot = ExtDt(g.params.onday) 191 192 if kind.name.endswith("_O"): 193 str_st = st.format(kind) 194 str_et = ot.format(kind) 195 else: 196 str_st = st.format(kind) 197 str_et = et.format(kind) 198 199 if st.format(kind, Delimiter.NUMBER) == ot.format(kind, Delimiter.NUMBER): 200 if prefix_a and prefix_b: 201 ret = f"{prefix_a} ({str_st})" 202 else: 203 ret = f"{str_st}" 204 else: 205 if prefix_a and prefix_b: 206 ret = f"{prefix_b} ({str_st} - {str_et})" 207 else: 208 ret = f"{str_st} - {str_et}" 209 210 return ret
日付範囲文字列
Arguments:
- kind (Format): ExtendedDatetimeのformatメソッドに渡す引数
- prefix_a (Optional[str], optional): 単独で返った時の接頭辞. Defaults to None.
- prefix_b (Optional[str], optional): 範囲で返った時の接頭辞. Defaults to None.
Returns:
str: 生成文字列
def
get_members_list() -> str:
213def get_members_list() -> str: 214 """ 215 登録済みのメンバー一覧を取得する 216 217 Returns: 218 str: メンバーリスト 219 220 """ 221 name_list: list[list[str]] = [] 222 for pname in g.cfg.member.lists: 223 name_list.append([pname, ", ".join(g.cfg.member.alias(pname))]) 224 225 if name_list: 226 output = table2ascii( 227 header=["表示名", "登録されている名前"], 228 body=name_list, 229 alignments=[Alignment.LEFT, Alignment.LEFT], 230 style=PresetStyle.ascii_borderless, 231 ) 232 else: 233 output = "メンバーは登録されていません。" 234 235 return output
登録済みのメンバー一覧を取得する
Returns:
str: メンバーリスト
def
get_team_list() -> str:
238def get_team_list() -> str: 239 """ 240 チームの登録状況を取得する 241 242 Returns: 243 str: チームリスト 244 245 """ 246 team_list: list[list[str]] = [] 247 for team_name in g.cfg.team.lists: 248 if member := ", ".join(g.cfg.team.member(team_name)): 249 team_list.append([team_name, member]) 250 else: 251 team_list.append([team_name, "未エントリー"]) 252 253 if team_list: 254 output = table2ascii( 255 header=["チーム名", "所属メンバー"], 256 body=team_list, 257 alignments=[Alignment.LEFT, Alignment.LEFT], 258 style=PresetStyle.ascii_borderless, 259 ) 260 else: 261 output = "チームは登録されていません。" 262 263 return output
チームの登録状況を取得する
Returns:
str: チームリスト