二简字
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2025-12-29 22:11:27 +08:00
parent 6e86a6987f
commit f18d94670e
3 changed files with 9944 additions and 9 deletions

9856
assets/old_font/symtable.csv Normal file

File diff suppressed because it is too large Load Diff

View File

@ -12,6 +12,10 @@ from nonebot_plugin_alconna import (
on_alconna, on_alconna,
) )
from konabot.common.web_render import konaweb
from konabot.common.web_render.core import WebRenderer
from konabot.plugins.hanzi.er_data import ErFontData
convert_type = ["","","","","",""] convert_type = ["","","","","",""]
compiled_str = "|".join([f"{a}{mid}{b}" for mid in ["","",""] for a in convert_type for b in convert_type if a != b]) compiled_str = "|".join([f"{a}{mid}{b}" for mid in ["","",""] for a in convert_type for b in convert_type if a != b])
@ -24,6 +28,7 @@ def hanzi_to_abbr(hanzi: str) -> str:
"": "t", "": "t",
"": "hk", "": "hk",
"": "jp", "": "jp",
"": "er",
} }
return mapping.get(hanzi, "") return mapping.get(hanzi, "")
@ -34,6 +39,9 @@ def check_valid_convert_type(convert_type: str) -> bool:
return False return False
def convert(source, src_abbr, dst_abbr): def convert(source, src_abbr, dst_abbr):
if dst_abbr == "er":
# 直接转换为二简
return ErFontData.convert_text(source)
convert_type_key = f"{src_abbr}2{dst_abbr}" convert_type_key = f"{src_abbr}2{dst_abbr}"
if not check_valid_convert_type(convert_type_key): if not check_valid_convert_type(convert_type_key):
# 先转为繁体,再转为目标 # 先转为繁体,再转为目标
@ -97,12 +105,11 @@ async def _(msg: UniMsg, event: BaseEvent, source: Optional[str] = None):
converted = convert(to_convert, src_abbr, dst_abbr) converted = convert(to_convert, src_abbr, dst_abbr)
converted_prefix = convert("转换结果", "s", dst_abbr) converted_prefix = convert("转换结果", "s", dst_abbr)
await evt.send(await UniMessage().text(f"{converted_prefix}{converted}").export()) await evt.send(await UniMessage().text(f"{converted_prefix}{converted}").export())
shuo = ["",""] shuo = ["",""]
full_name_type = ["简体","簡體","繁體","繁体","正體","正体","港話","港话","日文"] full_name_type = ["简体","簡體","繁體","繁体","正體","正体","港話","港话","日文","二简","二簡"]
combined_list = [f"{a}{b}" for a in shuo for b in full_name_type] combined_list = [f"{a}{b}" for a in shuo for b in full_name_type]
@ -150,20 +157,47 @@ async def _(msg: UniMsg, event: BaseEvent, source: Optional[str] = None):
dst = "" dst = ""
case "說日文" | "说日文": case "說日文" | "说日文":
dst = "" dst = ""
case "說二簡" | "说二简" | "說二簡" | "说二簡":
dst = ""
dst_abbr = hanzi_to_abbr(dst) dst_abbr = hanzi_to_abbr(dst)
if not dst_abbr: if not dst_abbr:
notice = "不支持的转换类型,请使用“简体”、“繁體”、“正體”、“港話”、“日文”等。" notice = "不支持的转换类型,请使用“简体”、“繁體”、“正體”、“港話”、“日文”、“二简”等。"
await evt.send(await UniMessage().text(notice).export()) await evt.send(await UniMessage().text(notice).export())
return return
# 循环,将源语言一次次转换为目标语言 # 如果是二简,直接转换
current_text = to_convert if dst_abbr == "er":
for src_abbr in ["s","hk","jp","tw","t"]: current_text = ErFontData.convert_text(to_convert)
if src_abbr != dst_abbr: else:
current_text = convert(current_text, src_abbr, dst_abbr) # 循环,将源语言一次次转换为目标语言
current_text = to_convert
for src_abbr in ["s","hk","jp","tw","t"]:
if src_abbr != dst_abbr:
current_text = convert(current_text, src_abbr, dst_abbr)
converted_prefix = convert("转换结果", "s", dst_abbr) converted_prefix = convert("转换结果", "s", dst_abbr)
await evt.send(await UniMessage().text(f"{converted_prefix}{current_text}").export()) if "span" in current_text:
# 改为网页渲染
render_result = await render_with_web_renderer(current_text)
await evt.send(await UniMessage().image(raw=render_result).export())
else:
await evt.send(await UniMessage().text(f"{converted_prefix}{current_text}").export())
async def render_with_web_renderer(text: str) -> bytes:
async def page_function(page):
# 找到id为content的文本框
await page.wait_for_selector('textarea[name=content]')
# 填入文本
await page.locator('textarea[name=content]').fill(text)
out = await WebRenderer.render_with_persistent_page(
"markdown_renderer",
konaweb('old_font'),
target='#main',
other_function=page_function,
)
return out
def random_char(char: str) -> str: def random_char(char: str) -> str:
dst_abbr = random.choice(["s","t","hk","jp","tw"]) dst_abbr = random.choice(["s","t","hk","jp","tw"])

View File

@ -0,0 +1,45 @@
import csv
from nonebot import logger
from nonebot_plugin_apscheduler import driver
from konabot.common.path import ASSETS_PATH
FONT_ASSETS_PATH = ASSETS_PATH / "old_font"
class ErFontData:
data = {}
temp_featured_fonts = {}
@classmethod
def init(cls):
logger.info("加载二简字体数据...")
path = FONT_ASSETS_PATH / "symtable.csv"
if not path.exists():
return
with open(path, "r", encoding="utf-8-sig") as f:
reader = csv.DictReader(f)
for row in reader:
if len(row["ss05"]) > 0:
cls.data[row["trad"]] = {"char": row["ss05"][0], "type": "ss05", "render": False}
if "er" in row["ss05"]:
cls.data[row["trad"]]["render"] = True
elif len(row["ss06"]) > 0:
cls.data[row["trad"]] = {"char": row["ss06"][0], "type": "ss06", "render": False}
if "er" in row["ss06"]:
cls.data[row["trad"]]["render"] = True
logger.info(f"二简字体数据加载完成,包含 {len(cls.data)} 个字。")
@classmethod
def get(cls, char: str) -> str:
if char not in cls.data:
return char
if cls.data[char]["render"]:
return f"<span class={cls.data[char]['type']}>{cls.data[char]['char']}</span>"
return cls.data[char]["char"]
@classmethod
def convert_text(cls, text: str) -> str:
return "".join([cls.get(c) for c in text])
@driver.on_startup
async def load_er_font_data():
ErFontData.init()