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: チームリスト