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: 生成文字列