Files
DataBackup/Rime/tools/util.py

136 lines
4.3 KiB
Python
Raw Normal View History

2025-04-19 20:17:58 +08:00
def deduplicate(src_file, dest_file):
lines_seen = set()
output_lines = []
with open(src_file, "r", encoding="utf-8") as file:
for line in file:
stripped_line = line.strip()
if (
stripped_line == ""
or stripped_line.startswith("#")
or stripped_line not in lines_seen
):
output_lines.append(line)
if stripped_line != "":
lines_seen.add(stripped_line)
with open(dest_file, "w", encoding="utf-8", newline="\n") as file:
file.writelines(output_lines)
def get_info(src_file):
with open(src_file, "r", encoding="utf-8") as f:
lines = f.readlines()
info = []
flag_continue = False
for line in lines:
if line == "\n" or line.startswith("#"):
info.append(line)
elif line == "---\n":
info.append(line)
flag_continue = True
elif flag_continue:
info.append(line)
if line == "...\n":
flag_continue = False
else:
break
return info
def sort(src_file, dest_file):
info = get_info(src_file)
# 跳过处理 THUOCL 词库
if "thuocl" in src_file:
return
with open(src_file, "r", encoding="utf-8") as f:
lines = f.readlines()[len(info) :]
format_type = len(lines[0].split("\t"))
# format_type == 2 时,排序「字 zi」此类,规则是按拼音排序
# format_type == 3 时,排序「字 zi 1」此类,规则是按拼音+字频排序
# 暂时不支持混排
if format_type == 2:
wait_to_write = []
part_to_sort = []
for line in lines:
if line.startswith("#") or line == "\n":
if part_to_sort:
sorted_lines = sorted(
part_to_sort,
key=lambda x: x.split("\t")[1]
if len(x.split("\t")) > 1
else "",
)
wait_to_write += sorted_lines
part_to_sort.clear()
wait_to_write.append(line)
continue
part_to_sort.append(line)
if part_to_sort:
wait_to_write += sorted(
part_to_sort,
key=lambda x: x.split("\t")[1] if len(x.split("\t")) > 1 else "",
)
with open(dest_file, "w", encoding="utf-8", newline="\n") as f:
f.writelines(info + wait_to_write)
elif format_type == 3:
wait_to_write = []
part_to_sort = []
for line in lines:
if line.startswith("#") or line == "\n":
if part_to_sort:
sorted_lines = sorted(
part_to_sort,
key=lambda x: (
x.split("\t")[1] if len(x.split("\t")) > 1 else "",
int(x.split("\t")[2])
if len(x.split("\t")) > 2 and x.split("\t")[2].isdigit()
else 0,
),
)
wait_to_write += sorted_lines
part_to_sort.clear()
wait_to_write.append(line)
continue
part_to_sort.append(line)
if part_to_sort:
wait_to_write += sorted(
part_to_sort,
key=lambda x: (
x.split("\t")[1] if len(x.split("\t")) > 1 else "",
int(x.split("\t")[2])
if len(x.split("\t")) > 2 and x.split("\t")[2].isdigit()
else 0,
),
)
with open(dest_file, "w", encoding="utf-8", newline="\n") as f:
f.writelines(info + wait_to_write)
if __name__ == "__main__":
import os
import sys
dicts_dir = os.path.join(os.path.abspath(os.path.dirname(sys.path[0])), "dicts")
for root, _, files in os.walk(dicts_dir):
for file in files:
if file.endswith(".yaml"):
file_path = os.path.join(root, file)
print(f"Processing {file_path}")
deduplicate(file_path, file_path)
sort(file_path, file_path)
print("Processing completed")