libs.utils.textutil

libs/utils/textutil.py

 1"""
 2libs/utils/textutil.py
 3"""
 4
 5import unicodedata
 6from typing import Literal
 7
 8
 9def len_count(text: str) -> int:
10    """文字数をカウント(全角文字は2)
11
12    Args:
13        text (str): 判定文字列
14
15    Returns:
16        int: 文字数
17    """
18
19    count = 0
20    for c in text:
21        if unicodedata.east_asian_width(c) in "FWA":
22            count += 2
23        else:
24            count += 1
25
26    return count
27
28
29def str_conv(text: str, kind: Literal["h2z", "z2h", "h2k", "k2h"]) -> str:
30    """文字列変換
31
32    Args:
33        text (str): 変換対象文字列
34        kind (str): 変換種類
35        - h2z: 半角文字を全角文字に変換(数字のみ)
36        - z2h: 全角文字を半角文字に変換(数字のみ)
37        - h2k: ひらがなをカタカナに変換
38        - k2h: カタカナをひらがなに変換
39
40    Returns:
41        str: 変換後の文字列
42    """
43
44    zen = "".join(chr(0xff10 + i) for i in range(10))
45    han = "".join(chr(0x30 + i) for i in range(10))
46    hira = "".join(chr(0x3041 + i) for i in range(86))
47    kana = "".join(chr(0x30a1 + i) for i in range(86))
48
49    match kind:
50        case "h2z":  # 半角文字を全角文字に変換(数字のみ)
51            trans_table = str.maketrans(han, zen)
52        case "z2h":  # 全角文字を半角文字に変換(数字のみ)
53            trans_table = str.maketrans(zen, han)
54        case "h2k":  # ひらがなをカタカナに変換
55            trans_table = str.maketrans(hira, kana)
56        case "k2h":  # カタカナをひらがなに変換
57            trans_table = str.maketrans(kana, hira)
58        case _:
59            return text
60
61    return text.translate(trans_table)
62
63
64def count_padding(data):
65    """プレイヤー名一覧の中の最も長い名前の文字数を返す
66
67    Args:
68        data (list, dict): 対象プレイヤー名の一覧
69
70    Returns:
71        int: 文字数
72    """
73
74    name_list = []
75
76    if isinstance(data, list):
77        name_list = data
78
79    if isinstance(data, dict):
80        for i in data.keys():
81            for name in [data[i][x]["name"] for x in ("東家", "南家", "西家", "北家")]:
82                if name not in name_list:
83                    name_list.append(name)
84
85    if name_list:
86        return max(len_count(x) for x in name_list)
87    return 0
def len_count(text: str) -> int:
10def len_count(text: str) -> int:
11    """文字数をカウント(全角文字は2)
12
13    Args:
14        text (str): 判定文字列
15
16    Returns:
17        int: 文字数
18    """
19
20    count = 0
21    for c in text:
22        if unicodedata.east_asian_width(c) in "FWA":
23            count += 2
24        else:
25            count += 1
26
27    return count

文字数をカウント(全角文字は2)

Arguments:
  • text (str): 判定文字列
Returns:

int: 文字数

def str_conv(text: str, kind: Literal['h2z', 'z2h', 'h2k', 'k2h']) -> str:
30def str_conv(text: str, kind: Literal["h2z", "z2h", "h2k", "k2h"]) -> str:
31    """文字列変換
32
33    Args:
34        text (str): 変換対象文字列
35        kind (str): 変換種類
36        - h2z: 半角文字を全角文字に変換(数字のみ)
37        - z2h: 全角文字を半角文字に変換(数字のみ)
38        - h2k: ひらがなをカタカナに変換
39        - k2h: カタカナをひらがなに変換
40
41    Returns:
42        str: 変換後の文字列
43    """
44
45    zen = "".join(chr(0xff10 + i) for i in range(10))
46    han = "".join(chr(0x30 + i) for i in range(10))
47    hira = "".join(chr(0x3041 + i) for i in range(86))
48    kana = "".join(chr(0x30a1 + i) for i in range(86))
49
50    match kind:
51        case "h2z":  # 半角文字を全角文字に変換(数字のみ)
52            trans_table = str.maketrans(han, zen)
53        case "z2h":  # 全角文字を半角文字に変換(数字のみ)
54            trans_table = str.maketrans(zen, han)
55        case "h2k":  # ひらがなをカタカナに変換
56            trans_table = str.maketrans(hira, kana)
57        case "k2h":  # カタカナをひらがなに変換
58            trans_table = str.maketrans(kana, hira)
59        case _:
60            return text
61
62    return text.translate(trans_table)

文字列変換

Arguments:
  • text (str): 変換対象文字列
  • kind (str): 変換種類
  • - h2z: 半角文字を全角文字に変換(数字のみ)
  • - z2h: 全角文字を半角文字に変換(数字のみ)
  • - h2k: ひらがなをカタカナに変換
  • - k2h: カタカナをひらがなに変換
Returns:

str: 変換後の文字列

def count_padding(data):
65def count_padding(data):
66    """プレイヤー名一覧の中の最も長い名前の文字数を返す
67
68    Args:
69        data (list, dict): 対象プレイヤー名の一覧
70
71    Returns:
72        int: 文字数
73    """
74
75    name_list = []
76
77    if isinstance(data, list):
78        name_list = data
79
80    if isinstance(data, dict):
81        for i in data.keys():
82            for name in [data[i][x]["name"] for x in ("東家", "南家", "西家", "北家")]:
83                if name not in name_list:
84                    name_list.append(name)
85
86    if name_list:
87        return max(len_count(x) for x in name_list)
88    return 0

プレイヤー名一覧の中の最も長い名前の文字数を返す

Arguments:
  • data (list, dict): 対象プレイヤー名の一覧
Returns:

int: 文字数