This commit is contained in:
9856
assets/old_font/symtable.csv
Normal file
9856
assets/old_font/symtable.csv
Normal file
File diff suppressed because it is too large
Load Diff
@ -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"])
|
||||||
|
|||||||
45
konabot/plugins/hanzi/er_data.py
Normal file
45
konabot/plugins/hanzi/er_data.py
Normal 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()
|
||||||
Reference in New Issue
Block a user