From a1e849caea31c93ef286e42dcc093f812caceeec Mon Sep 17 00:00:00 2001 From: amzxyz Date: Wed, 24 Dec 2025 10:20:04 +0800 Subject: [PATCH] =?UTF-8?q?fix(shijian.lua):=20=E6=96=B0=E5=A2=9E/rc?= =?UTF-8?q?=E6=97=A5=E6=9C=9F=E5=B7=AE=E6=A8=A1=E5=BC=8F=EF=BC=8C=E5=8F=AF?= =?UTF-8?q?=E9=80=9A=E8=BF=87/rc\d+[-=3D+op]=E6=9D=A5=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=BD=93=E5=89=8D=E6=97=B6=E9=97=B4=E4=BB=8E=E5=89=8D=E4=B8=8E?= =?UTF-8?q?=E6=9C=AA=E6=9D=A5=E7=9A=84=E6=97=A5=E6=9C=9F=EF=BC=8C=3D+p?= =?UTF-8?q?=E9=83=BD=E4=BB=A3=E8=A1=A8=E6=9C=AA=E6=9D=A5=EF=BC=8C-o?= =?UTF-8?q?=E9=83=BD=E4=BB=A3=E8=A1=A8=E4=BB=8E=E5=89=8D=E3=80=82=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E8=BF=98=E6=94=AF=E6=8C=81/utc=E7=83=AD=E9=97=A8?= =?UTF-8?q?=E4=B8=96=E7=95=8C=E6=97=B6=E9=92=9F=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scripts/generate-release-note.sh | 2 +- custom/wanxiang_pro.schema.yaml | 1 + lua/shijian.lua | 194 ++++++++++++++++-- wanxiang.schema.yaml | 3 + 4 files changed, 184 insertions(+), 16 deletions(-) diff --git a/.github/workflows/scripts/generate-release-note.sh b/.github/workflows/scripts/generate-release-note.sh index bd6975c..f97faad 100644 --- a/.github/workflows/scripts/generate-release-note.sh +++ b/.github/workflows/scripts/generate-release-note.sh @@ -63,7 +63,7 @@ CHANGES=$( echo "" echo "3. **语法模型需单独下载**,并放入输入法用户目录根目录(与方案文件放一起),**无需配置**。" echo "" - echo "4. **可采用万象提供的更新器完成更新操作[点击跳转下载](https://github.com/amzxyz/RIME-LMDG/releases/tag/tool)" + echo "4. **可采用万象提供的更新器完成更新操作[点击跳转下载](https://github.com/amzxyz/RIME-LMDG/releases/tag/tool)**" echo "" echo "5. 💾 飞机盘下载地址(最快更新):[点击访问](https://share.feijipan.com/s/xiGvXdKz)" echo "" diff --git a/custom/wanxiang_pro.schema.yaml b/custom/wanxiang_pro.schema.yaml index b985f80..62dc82e 100644 --- a/custom/wanxiang_pro.schema.yaml +++ b/custom/wanxiang_pro.schema.yaml @@ -462,6 +462,7 @@ recognizer: add_user_dict: "^``[A-Za-z/`']*$" #自造词 unicode: "^U[a-f0-9]+" # 脚本将自动获取第 2 个字符 U 作为触发前缀,响应 lua_translator@unicode,输出 Unicode 字符 number: "^R[0-9]+[.]?[0-9]*" # 脚本将自动获取第 2 个字符 R 作为触发前缀,响应 lua_translator@number_translator,数字金额大写 + sjc: "^.rc\\d+[-+=op]?$" yr1: "^N0[1-9]?0?[1-9]?" yr2: "^N1[02]?0?[1-9]?" yr3: "^N0[1-9]?[1-2]?[1-9]?" diff --git a/lua/shijian.lua b/lua/shijian.lua index 06eac7e..b50e1c0 100644 --- a/lua/shijian.lua +++ b/lua/shijian.lua @@ -6,7 +6,7 @@ ------http://98wb.ys168.com/-------- -----万象新增节日候选,格式化问候语,重写农历倒计 -- *******农历节气计算部分 --- ========角度变换=============== +--=====角度变换=============== local rad = 180 * 3600 / math.pi -- 每弧度的角秒数 local RAD = 180 / math.pi -- 每弧度的角度数 function int2(v) -- 取整数部分 @@ -80,7 +80,7 @@ function rad2str(d, tim) -- 将弧度转为字串 return s end --- ================日历计算=============== +--=============日历计算=============== local J2000 = 2451545 -- 2000年前儒略日数(2000-1-1 12:00:00格林威治平时) local JDate = { -- 日期元件 @@ -270,7 +270,7 @@ local JDate = { -- 日期元件 end end } --- =========黄赤交角及黄赤坐标变换=========== +--======黄赤交角及黄赤坐标变换=========== local hcjjB = { 84381.448, -46.8150, -0.00059, 0.001813 } -- 黄赤交角系数表 local preceB = { 0, 50287.92262, 111.24406, 0.07699, -0.23479, -0.00178, 0.00018, 0.00001 } -- Date黄道上的岁差p @@ -305,7 +305,7 @@ function addPrece(jd, zb) -- 补岁差 zb[1] = rad2mrad(zb[1] + (v + 2.9965 * t1) / rad) end --- ===============光行差================== +--============光行差================== local GXC_e = { 0.016708634, -0.000042037, -0.0000001267 } -- 离心率 local GXC_p = { 102.93735 / RAD, 1.71946 / RAD, 0.00046 / RAD } -- 近点 local GXC_l = { 280.4664567 / RAD, 36000.76982779 / RAD, 0.0003032028 / RAD, 1 / 49931000 / RAD, -1 / 153000000 / RAD } -- 太平黄经 @@ -327,7 +327,7 @@ function addGxc(t, zb) zb[1] = rad2mrad(zb[1]) end --- ===============章动计算================== +--============章动计算================== local nutB = { -- 章动表 2.1824391966, -33.757045954, 0.0000362262, 3.7340E-08, -2.8793E-10, -171996, -1742, 92025, 89, 3.5069406862, 1256.663930738, 0.0000105845, 6.9813E-10, -2.2815E-10, -13187, -16, 5736, -31, 1.3375032491, 16799.418221925, @@ -374,7 +374,7 @@ function nutationRaDec(t, zb) -- 本函数计算赤经章动及赤纬章动 zb[1] = rad2mrad(zb[1]) end --- =================以下是月球及地球运动参数表=================== +--==============以下是月球及地球运动参数表=================== --[[*************************************** * 如果用记事本查看此代码,请在"格式"菜单中去除"自动换行" * E10是关于地球的,格式如下: @@ -629,7 +629,7 @@ local M31 = { 0.5139500, 12.0108556517, 14914.4523349355, -6.3524240E-05, 6.3330 local M1n = { 3.81034392032, 8.39968473021E+03, -3.31919929753E-05, -- 月球平黄经系数 3.20170955005E-08, -1.53637455544E-10 } --- ==================日位置计算=================== +--===============日位置计算=================== local EnnT = 0 -- 调用Enn前先设置EnnT时间变量 function Enn(F) -- 计算E10,E11,E20等,即:某一组周期项或泊松项算出,计算前先设置EnnT时间 local i @@ -671,7 +671,7 @@ function sunCal2(jd) -- 传回jd时刻太阳的地心视黄经及黄纬 return sun -- 返回太阳视位置 end --- ==================月位置计算=================== +--===============月位置计算=================== local MnnT = 0 -- 调用Mnn前先设置MnnT时间变量 function Mnn(F) -- 计算M10,M11,M20等,计算前先设置MnnT时间 local i @@ -717,7 +717,7 @@ function moonCal3(jd) -- 传回月球的地心视赤经及视赤纬 return moon end --- ==================地心坐标中的日月位置计算=================== +--===============地心坐标中的日月位置计算=================== function jiaoCai(lx, t, jiao) -- lx=1时计算t时刻日月角距与jiao的差, lx=0计算t时刻太阳黄经与jiao的差 local sun = earCal(t) -- 计算太阳真位置(先算出日心坐标中地球的位置) @@ -734,7 +734,7 @@ function jiaoCai(lx, t, jiao) return rad2mrad(jiao - (moon[1] - sun[1])) end --- ==================已知位置反求时间=================== +--===============已知位置反求时间=================== function jiaoCal(t1, jiao, lx) -- t1是J2000起算儒略日数 -- 已知角度(jiao)求时间(t) -- lx=0是太阳黄经达某角度的时刻计算(用于节气计算) @@ -781,7 +781,7 @@ function jiaoCal(t1, jiao, lx) -- t1是J2000起算儒略日数 return t end --- ==================节气计算=================== +--===============节气计算=================== local jqB = { -- 节气表 "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至", "小寒", "大寒", "立春", "雨水", "惊蛰" } @@ -856,7 +856,7 @@ function getYearJQ(y) return jq end --- =================定朔弦望计算======================== +--==============定朔弦望计算======================== function dingSuo(y, arc) -- 这是个测试函数 local i, jd = 365.2422 * (y - 2000), q, s1, s2 log.info("月份:世界时 原子时
") @@ -870,7 +870,7 @@ function dingSuo(y, arc) -- 这是个测试函数 end end --- =================农历计算======================== +--==============农历计算======================== --[[***** 1.冬至所在的UTC日期保存在A[0],根据"规定1"得知在A[0]之前(含A[0])的那个UTC朔日定为年首日期 冬至之后的中气分保存在A[1],A[2],A[3]...A[13],其中A[12]又回到了冬至,共计算13次中气 @@ -1154,7 +1154,7 @@ function GanZhiLi:getShiZhi() return self:calR2(idx, 12) end --- ====================以下是测试代码============= +--=================以下是测试代码============= local jqB = { -- 节气表 "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", @@ -1848,7 +1848,7 @@ local function QueryLunarInfo(env, date) else -- 使用默认格式 result = { - -- ===== 公历格式 ===== + -- ==公历格式== { dateRQ, "" }, { string.sub(str, 1, 4) .. "." .. string.sub(str, 5, 6) .. "." .. string.sub(str, 7, 8), "" }, { string.sub(str, 1, 4) .. "-" .. string.sub(str, 5, 6) .. "-" .. string.sub(str, 7, 8), "" }, @@ -2628,6 +2628,89 @@ local function translator(input, seg, env) return end + -- 1. 纯 rc (今天) + -- 2. rc + 数字 (输入中) + -- 3. rc + 数字 + 符号 (完成,支持 - + = o p) + local is_today = (command == "rc") + local pending_num = string.match(command, "^rc(%d+)$") + local finished_num, sign = string.match(command, "^rc(%d+)([-+=op])$") + + if is_today or pending_num or finished_num then + segment.tags = segment.tags + Set({ "shijian" }) + context:set_property("sequence_adjustment_code", "/rc") + + -- 状态 1:正在输入数字 + if pending_num then + local hint = string.format("差值%s天 (从前按 -/o,未来按 +/p/=)", pending_num) + generate_candidates("date", seg, { { hint, "等待输入..." } }) + return + end + + -- 状态 2 & 3:计算并显示日期 + local offset = 0 + if finished_num then + local num = tonumber(finished_num) + if sign == "+" or sign == "=" or sign == "p" then + offset = num + else + offset = -num + end + end + + -- 计算目标时间戳 + local now_ts = os.time() + local target_ts = now_ts + (offset * 24 * 3600) + + -- 生成目标时间对象 + local today = os.date("*t", target_ts) + local ymd = os.date("%Y%m%d", target_ts) + local ymdh = os.date("%Y%m%d%H", target_ts) + local num_year = string.format(" 〔%03d/%d〕", today.yday, IsLeap(today.year)) + + -- 格式生成逻辑 + local date_variants = {} + local custom_formats = config:get_list("date_formats") + + if custom_formats and custom_formats.size > 0 then + for i = 1, custom_formats.size do + local format_str = custom_formats:get_value_at(i-1):get_string() + local formatted_date = format_dt(today, format_str) + if formatted_date and formatted_date ~= "" then + table.insert(date_variants, { formatted_date, "" }) + end + end + else + -- 默认格式 + date_variants = { + { os.date("%Y年%m月%d日", target_ts), "" }, + { os.date("%Y.%m.%d", target_ts), "" }, + { os.date("%Y-%m-%d", target_ts), "" }, + { os.date("%Y/%m/%d", target_ts), "" }, + { os.date("%Y%m%d", target_ts), "" }, + { os.date("%y年%m月%d日", target_ts), "" }, + { os.date("%y%m%d", target_ts), "" }, + { string.format("%d年%d月%d日", today.year, today.month, today.day), "" }, + { string.format("%d年%d月%d日", today.year % 100, today.month, today.day), "" }, + { string.format("%d月%d日", today.month, today.day), "" }, + } + end + + -- 农历部分 + local lunar_variants = { + { CnDate_translator(ymd), "" }, + { lunarJzl(ymdh), "" }, + { Date2LunarDate(ymd) .. JQtest(ymd), "" }, + { Date2LunarDate(ymd) .. GetLunarSichen(os.date("%H", target_ts), 1), "" } + } + + for _, variant in ipairs(lunar_variants) do + table.insert(date_variants, variant) + end + + generate_candidates("date", seg, date_variants) + set_prompt_if_invalid(context, num_year) + return + end -- **时间候选项** if (command == "sj" or command == "uj") then --- 设置手动排序的排序编码,以启用手动排序支持 @@ -2665,6 +2748,87 @@ local function translator(input, seg, env) set_prompt_if_invalid(context, time_discrpt) return end + -- 世界时钟功能 (/utc) + if command == "utc" then + segment.tags = segment.tags + Set({ "shijian" }) + context:set_property("sequence_adjustment_code", "/utc") + + local now = os.time() -- 当前时间戳(UTC) + + -- 1. 构造 UTC 和 本地时间 + local utc_tab = os.date("!*t", now) + local utc_str = string.format("%02d:%02d", utc_tab.hour, utc_tab.min) + + local local_tab = os.date("*t", now) + local local_str = string.format("%02d:%02d", local_tab.hour, local_tab.min) + + -- 计算本地时区 + local local_offset_sec = os.difftime(os.time(local_tab), os.time(utc_tab)) + local local_offset_hr = math.floor((local_offset_sec + 1800) / 3600) + local local_sign = local_offset_hr >= 0 and "+" or "" + + local candidates = {} + + -- 置顶:UTC 和 本地时间 + table.insert(candidates, { utc_str, "UTC (世界标准时间)" }) + table.insert(candidates, { local_str, "Local (UTC"..local_sign..local_offset_hr..") [北京]" }) + + -- 2. 热门城市列表 (直接按书写顺序显示) + -- 请在这里调整您想要的显示顺序 + local zones_data = { + { name="北京", offset=8 }, -- 基准 + { name="伦敦", offset=0 }, -- 英国 + { name="纽约", offset=-5 }, -- 美东 (夏令时-4) + { name="东京", offset=9 }, -- 日本 + { name="洛杉矶", offset=-8 },-- 美西 (夏令时-7) + { name="香港", offset=8 }, + { name="新加坡", offset=8 }, + { name="巴黎", offset=1 }, -- 法国 (夏令时+2) + { name="柏林", offset=1 }, -- 德国 (夏令时+2) + { name="悉尼", offset=10 }, -- 澳洲 (夏令时+11) + { name="首尔", offset=9 }, + { name="莫斯科", offset=3 }, + { name="旧金山", offset=-8 }, + { name="多伦多", offset=-5 }, + { name="芝加哥", offset=-6 }, + { name="迪拜", offset=4 }, + { name="孟买", offset=5.5 }, + { name="温哥华", offset=-8 }, + { name="曼谷", offset=7 }, + } + + -- 3. 遍历生成候选直接按上面顺序输出 + local bj_ts = now + (8 * 3600) + local bj_date = os.date("!*t", bj_ts) + + for _, z in ipairs(zones_data) do + -- 计算目标时间 + local target_ts = now + (z.offset * 3600) + local target_str = os.date("!%H:%M", target_ts) + + -- 计算相对北京时差 + local diff = z.offset - 8 + local diff_str = "" + if diff > 0 then diff_str = "北京+"..diff + elseif diff == 0 then diff_str = "同频" + else diff_str = "北京"..diff end + + -- 计算日期差异 + local target_date = os.date("!*t", target_ts) + local day_hint = "" + if target_date.day ~= bj_date.day then + if diff < 0 then day_hint = " [昨天]" + elseif diff > 0 then day_hint = " [明天]" end + end + + -- 格式化输出 + local comment = string.format("%s (%s)%s", z.name, diff_str, day_hint) + table.insert(candidates, { target_str, comment }) + end + + generate_candidates("time", seg, candidates) + return + end -- **日期+时间(/dt,别名)** if (command == "dt") then context:set_property("sequence_adjustment_code", "/dt") diff --git a/wanxiang.schema.yaml b/wanxiang.schema.yaml index 63e0fe1..ba54b16 100644 --- a/wanxiang.schema.yaml +++ b/wanxiang.schema.yaml @@ -460,6 +460,7 @@ recognizer: #add_user_dict: "^ac[A-Za-z/`']*$" #引导式造词 unicode: "^U[a-f0-9]+" # U 作为触发前缀,响应 lua_translator@unicode,输出 Unicode 字符 number: "^R[0-9]+[.]?[0-9]*" # R 作为触发前缀, 响应 lua_translator@number_translator,数字金额大写 + sjc: "^.rc\\d+[-+=op]?$" yr1: "^N0[1-9]?0?[1-9]?" yr2: "^N1[02]?0?[1-9]?" yr3: "^N0[1-9]?[1-2]?[1-9]?" @@ -489,6 +490,8 @@ kp_number: - "^U[%da-f]+$" # R模式 - "^R[0-9]+%.?[0-9]*$" + # 时间差 + - "^.rc%d+[-+=op]?$" # N模式 # Lua 不支持 {1,8},改成等价写法:N 后 1~8 个数字 - "^N0[1-9]?0?[1-9]?$"