lookatstudy-mobile 0.17.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/install-termux.sh +109 -26
- package/package.json +1 -1
- package/server.cjs +165 -2
- package/web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/web/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/web/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/web/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/web/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/web/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/web/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/web/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/web/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/web/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/web/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/web/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/web/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/web/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/web/assets/{abnfDiagram-N423BO3Z-DEPbDjND.js → abnfDiagram-N423BO3Z-DRLqlsQe.js} +1 -1
- package/web/assets/{arc-BdnEbtZD.js → arc-DX37qc14.js} +1 -1
- package/web/assets/{architectureDiagram-T3A2C74G-2LUkfdBV.js → architectureDiagram-T3A2C74G-4mH-M23W.js} +1 -1
- package/web/assets/{blockDiagram-VBNYF7ZC-CCe1iJWW.js → blockDiagram-VBNYF7ZC-CfFl91r9.js} +1 -1
- package/web/assets/{c4Diagram-5PPSVZJV-BRjp2_ep.js → c4Diagram-5PPSVZJV-CoYqbpkG.js} +1 -1
- package/web/assets/channel-DwTlw7UU.js +1 -0
- package/web/assets/{chunk-2GRJ4B5K-D3jR_gkO.js → chunk-2GRJ4B5K-DdZFJzXx.js} +1 -1
- package/web/assets/{chunk-2Q5K7J3B-BYL8Mj1H.js → chunk-2Q5K7J3B-CjvT22rq.js} +1 -1
- package/web/assets/{chunk-5RXB4S5H-BmdtCOUM.js → chunk-5RXB4S5H-BO3dLHxP.js} +1 -1
- package/web/assets/{chunk-5VM5RSS4-BElAuyeD.js → chunk-5VM5RSS4-BRWuBMF-.js} +1 -1
- package/web/assets/{chunk-6Q2QTUOP-DD5GiOn2.js → chunk-6Q2QTUOP-BBL9yZr5.js} +1 -1
- package/web/assets/{chunk-GF5L2VYU-DEXR2XHl.js → chunk-GF5L2VYU-BzgRNoMK.js} +1 -1
- package/web/assets/{chunk-JWPE2WC7-BnQRJatb.js → chunk-JWPE2WC7-Rx7velok.js} +1 -1
- package/web/assets/{chunk-KBJHAD2P-DWr3zlUn.js → chunk-KBJHAD2P-BUmqDQFS.js} +1 -1
- package/web/assets/{chunk-RYQCIY6F-DEwEVB-X.js → chunk-RYQCIY6F-DiWSKlNj.js} +1 -1
- package/web/assets/{chunk-XXDRQBXY-fSX2AkEZ.js → chunk-XXDRQBXY-BaIS0itG.js} +1 -1
- package/web/assets/classDiagram-JCYQIIEL-CoMu7USw.js +1 -0
- package/web/assets/classDiagram-v2-OCEON4UE-CoMu7USw.js +1 -0
- package/web/assets/{cose-bilkent-JH36ORCC-CzFzhaR6.js → cose-bilkent-JH36ORCC-BbQclxlG.js} +1 -1
- package/web/assets/{cynefin-VYW2F7L2-DkGVzNSQ.js → cynefin-VYW2F7L2-BoAEtYBt.js} +1 -1
- package/web/assets/{cynefinDiagram-MW4NZA55-DsCoCXNB.js → cynefinDiagram-MW4NZA55-1NTeoXpW.js} +1 -1
- package/web/assets/{dagre-VZM6K2ZE-5iQ0Vlad.js → dagre-VZM6K2ZE-D1IJUP3L.js} +1 -1
- package/web/assets/{diagram-7IWD3JNH-BNse2wL1.js → diagram-7IWD3JNH-Bq4zahZs.js} +1 -1
- package/web/assets/{diagram-B4RE2ZJO-otdSZlNZ.js → diagram-B4RE2ZJO-DwR-n08L.js} +1 -1
- package/web/assets/{diagram-LBJQPF4R-Cu9AIxYr.js → diagram-LBJQPF4R-x8ddz6fv.js} +1 -1
- package/web/assets/{diagram-Q27KOJAE-BDy_SsNa.js → diagram-Q27KOJAE-BQvPuANj.js} +1 -1
- package/web/assets/{diagram-UB23O5K3-Dj9VK1f8.js → diagram-UB23O5K3-2HRRnPaM.js} +1 -1
- package/web/assets/{ebnfDiagram-BXEA7PRR-B86BfBHU.js → ebnfDiagram-BXEA7PRR-C6w-Hol8.js} +1 -1
- package/web/assets/{erDiagram-JOGREHBK-BYPttEDR.js → erDiagram-JOGREHBK-D0B9HX21.js} +1 -1
- package/web/assets/{flowDiagram-UKHOOZJN-BiQj7CX4.js → flowDiagram-UKHOOZJN-BAFPos1j.js} +1 -1
- package/web/assets/{ganttDiagram-PKOTCBZU-BHHFGprI.js → ganttDiagram-PKOTCBZU-cEfBlMbu.js} +1 -1
- package/web/assets/{gitGraphDiagram-DS77QQ5N-CMV6VrQV.js → gitGraphDiagram-DS77QQ5N-kEgMAveq.js} +1 -1
- package/web/assets/index-D8iAKGNi.css +1 -0
- package/web/assets/index-DFfbtrtQ.js +53 -0
- package/web/assets/{infoDiagram-6WML65LV-a_LG2_IJ.js → infoDiagram-6WML65LV-B3O-sBT9.js} +1 -1
- package/web/assets/{ishikawaDiagram-WSZJBQD7-DNaQdaG3.js → ishikawaDiagram-WSZJBQD7-Lltvy9NV.js} +1 -1
- package/web/assets/{journeyDiagram-NVQOT4AX-DnlltTZa.js → journeyDiagram-NVQOT4AX-CoTpdbQG.js} +1 -1
- package/web/assets/{kanban-definition-27J2QSJJ-fRW60JCZ.js → kanban-definition-27J2QSJJ-C6MlEhKf.js} +1 -1
- package/web/assets/{linear-DivBiqV_.js → linear-BOCC78Hx.js} +1 -1
- package/web/assets/main-BXa7WYYr.css +1 -0
- package/web/assets/main-_hK--hbF.js +792 -0
- package/web/assets/{mermaid.core-BhIcHd-X.js → mermaid.core-BnzH2M4g.js} +4 -4
- package/web/assets/{mindmap-definition-FAOFIHXS-wFGzI1GW.js → mindmap-definition-FAOFIHXS-2aXmimCX.js} +1 -1
- package/web/assets/{pegDiagram-VL7TDLO6-g8lPC9jo.js → pegDiagram-VL7TDLO6-BUgOGs18.js} +1 -1
- package/web/assets/{pet-auCGJOK0.js → pet-a4xGZJ4o.js} +1 -1
- package/web/assets/{pieDiagram-7S7Q4E2Y-C5VJiY2V.js → pieDiagram-7S7Q4E2Y-QH3MSwJC.js} +1 -1
- package/web/assets/{quadrantDiagram-CIZ2JOQS-BUCplORK.js → quadrantDiagram-CIZ2JOQS-BHgzjRDJ.js} +1 -1
- package/web/assets/{railroadDiagram-AXF67PYL-CXOqC1jS.js → railroadDiagram-AXF67PYL-eT-6KI97.js} +1 -1
- package/web/assets/{requirementDiagram-LRYGKXZP-D77Fdqkd.js → requirementDiagram-LRYGKXZP-SCqCciaJ.js} +1 -1
- package/web/assets/{sankeyDiagram-W5VNT64P-DCRQPRof.js → sankeyDiagram-W5VNT64P-X7ftmy-X.js} +1 -1
- package/web/assets/{sequenceDiagram-SI44F4Z6-CKFv7rwK.js → sequenceDiagram-SI44F4Z6-CJiMe-ST.js} +1 -1
- package/web/assets/{sizeCapture-X5ZJPWSS-DkXWYyxk.js → sizeCapture-X5ZJPWSS-D0BOwnXt.js} +1 -1
- package/web/assets/{stateDiagram-OKZ733FA-BT3rvlSZ.js → stateDiagram-OKZ733FA-BiPOcNEG.js} +1 -1
- package/web/assets/stateDiagram-v2-UEYNNEHI-URZ9UNRl.js +1 -0
- package/web/assets/swimlanes-SLNWSIFB-CtLG2CHX.js +2 -0
- package/web/assets/swimlanesDiagram-ULZ7WXOC-CdA8x7iG.js +8 -0
- package/web/assets/{timeline-definition-Z64GVDOM-Byr_G_qH.js → timeline-definition-Z64GVDOM-NOUkxoIk.js} +1 -1
- package/web/assets/{vennDiagram-T6HMQDX7-cJwjkqtI.js → vennDiagram-T6HMQDX7-jIX0UihP.js} +1 -1
- package/web/assets/{wardleyDiagram-T6FBY63Y-2mUDEXFT.js → wardleyDiagram-T6FBY63Y-BWfUG4_t.js} +1 -1
- package/web/assets/{xychartDiagram-ELKLHX3M-CweyVwyd.js → xychartDiagram-ELKLHX3M-CVZ-lb3j.js} +1 -1
- package/web/index.html +4 -3
- package/web/pet.html +3 -3
- package/web/assets/channel-DXyVa_LM.js +0 -1
- package/web/assets/classDiagram-JCYQIIEL-D93mjgH9.js +0 -1
- package/web/assets/classDiagram-v2-OCEON4UE-D93mjgH9.js +0 -1
- package/web/assets/index-BKXGqAJP.js +0 -53
- package/web/assets/index-C0z4TGfi.css +0 -1
- package/web/assets/main-XmO4BzRy.js +0 -518
- package/web/assets/stateDiagram-v2-UEYNNEHI-BgeHQ9bA.js +0 -1
- package/web/assets/swimlanes-SLNWSIFB-CzxJLsll.js +0 -2
- package/web/assets/swimlanesDiagram-ULZ7WXOC-BQOu93XJ.js +0 -8
package/install-termux.sh
CHANGED
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
# bash ~/lookatstudy/stop.sh # 停止
|
|
6
6
|
# bash ~/lookatstudy/status.sh # 状态 + 访问链接
|
|
7
7
|
# bash ~/lookatstudy/update.sh # 更新便携包并重启
|
|
8
|
-
# 不在本机跑 npm
|
|
8
|
+
# 不在本机跑 npm。安装与升级(update.sh)走同一条下载链:
|
|
9
|
+
# npmmirror 主源(+滞后守卫) → npm 官方源 → GitHub Release 直连 → gh 代理链。
|
|
10
|
+
# update.sh 的函数体与本文件逐字同源(verify-termux-voice T7 守链序与两份同步)。
|
|
9
11
|
set -euo pipefail
|
|
10
12
|
|
|
11
13
|
PORT="${LOOKATSTUDY_PORT:-17890}"
|
|
@@ -18,24 +20,34 @@ DL_PREFIXES=("" "https://gh-proxy.com/" "https://ghproxy.net/" "https://ghfast.t
|
|
|
18
20
|
|
|
19
21
|
# npmmirror(阿里,自动同步 npm)解析包的 latest tarball 地址;空输出=未同步/网络失败。
|
|
20
22
|
# 同步滞后守卫:刚发版的头几分钟镜像 latest 可能还指向上一个版本,静默拿到旧包
|
|
21
|
-
# —— 版本落后于 GitHub 最新 release 时按"未命中"
|
|
22
|
-
# releases/latest/download 永远指向最新版)。GitHub 版本探测失败(网络)
|
|
23
|
-
#
|
|
23
|
+
# —— 版本落后于 GitHub 最新 release 时按"未命中"处理,让位 npm 官方源/GitHub 链
|
|
24
|
+
# (GitHub 的 releases/latest/download 永远指向最新版)。GitHub 版本探测失败(网络)
|
|
25
|
+
# 则信任镜像,不因 GitHub 不可达惩罚国内直连的镜像主源。
|
|
26
|
+
# 契约:恒 exit 0,空输出=未命中 —— 调用方都是 tb=$(npm_tarball …) 裸赋值,老写法
|
|
27
|
+
# miss 返回 1 会把 set -e 的脚本整个静默杀掉(eeeada1 的滞后守卫实际从未走到回退链的根因)。
|
|
24
28
|
npm_tarball() {
|
|
25
29
|
local json ver gh
|
|
26
30
|
json=$(curl -sfL --connect-timeout 8 --max-time 20 "https://registry.npmmirror.com/$1/latest" || true)
|
|
27
|
-
[ -n "$json" ] || return
|
|
31
|
+
[ -n "$json" ] || return 0
|
|
28
32
|
ver=$(printf '%s' "$json" | sed -n 's/.*"version":"\([^"]*\)".*/\1/p')
|
|
29
33
|
if [ -n "$ver" ]; then
|
|
30
34
|
gh=$(gh_latest_version)
|
|
31
35
|
if [ -n "$gh" ] && ! ver_ge "$ver" "$gh"; then
|
|
32
|
-
info "npm 镜像同步滞后(镜像 v${ver} < GitHub v${gh})
|
|
33
|
-
return
|
|
36
|
+
info "npm 镜像同步滞后(镜像 v${ver} < GitHub v${gh}),换 npm 官方源…"
|
|
37
|
+
return 0
|
|
34
38
|
fi
|
|
35
39
|
fi
|
|
36
40
|
printf '%s' "$json" | sed -n 's/.*"tarball":"\([^"]*\)".*/\1/p'
|
|
37
41
|
}
|
|
38
42
|
|
|
43
|
+
# npm 官方源(权威、零同步滞后):镜像未命中/滞后时的第一兜底,先于 GitHub 链。
|
|
44
|
+
# 同一契约:恒 exit 0,空输出=未命中。
|
|
45
|
+
npm_tarball_official() {
|
|
46
|
+
local json
|
|
47
|
+
json=$(curl -sfL --connect-timeout 8 --max-time 20 "https://registry.npmjs.org/$1/latest" || true)
|
|
48
|
+
printf '%s' "$json" | sed -n 's/.*"tarball":"\([^"]*\)".*/\1/p'
|
|
49
|
+
}
|
|
50
|
+
|
|
39
51
|
# GitHub 最新 release 版本号(仅数字串;空=探测失败)。releases/latest/download 会 302 到
|
|
40
52
|
# 带 tag 的最终资产 URL,HEAD 一次读 url_effective 即得,不用碰 api.github.com。
|
|
41
53
|
gh_latest_version() {
|
|
@@ -115,7 +127,15 @@ download_bundle() {
|
|
|
115
127
|
ok "便携包就位(npm 镜像): $APP_DIR"
|
|
116
128
|
return 0
|
|
117
129
|
fi
|
|
118
|
-
|
|
130
|
+
# 次选:npm 官方源(权威零滞后,接住镜像同步窗口)
|
|
131
|
+
tb=$(npm_tarball_official lookatstudy-mobile)
|
|
132
|
+
if [ -n "$tb" ] && curl -fL --connect-timeout 10 --retry 2 -o mobile.tgz "$tb"; then
|
|
133
|
+
tar -xzf mobile.tgz --strip-components=1
|
|
134
|
+
rm -f mobile.tgz
|
|
135
|
+
ok "便携包就位(npm 官方源): $APP_DIR"
|
|
136
|
+
return 0
|
|
137
|
+
fi
|
|
138
|
+
info "npm 源未命中,回退 GitHub 直连+代理链..."
|
|
119
139
|
local dl_ok=0 p=""
|
|
120
140
|
for p in "${DL_PREFIXES[@]}"; do
|
|
121
141
|
if curl -fL --connect-timeout 10 --retry 2 -o ls.zip "${p}${GH_ASSET}"; then
|
|
@@ -147,7 +167,15 @@ install_voice() {
|
|
|
147
167
|
info "装完模型重启服务生效: bash ~/lookatstudy/start.sh"
|
|
148
168
|
return 0
|
|
149
169
|
fi
|
|
150
|
-
|
|
170
|
+
# 次选:npm 官方源(权威零滞后,接住镜像同步窗口)
|
|
171
|
+
tb=$(npm_tarball_official lookatstudy-termux-voice)
|
|
172
|
+
if [ -n "$tb" ] && curl -fL --connect-timeout 10 --retry 2 -o voice.tgz "$tb"; then
|
|
173
|
+
tar -xzf voice.tgz --strip-components=1 -C "$APP_DIR/node_modules"
|
|
174
|
+
rm -f voice.tgz
|
|
175
|
+
ok "语音引擎就位(npm 官方源): $APP_DIR/node_modules/sherpa-onnx-node"
|
|
176
|
+
return 0
|
|
177
|
+
fi
|
|
178
|
+
info "npm 源未命中,回退 GitHub 直连+代理链..."
|
|
151
179
|
local dl_ok=0 p=""
|
|
152
180
|
for p in "${DL_PREFIXES[@]}"; do
|
|
153
181
|
if curl -fL --connect-timeout 10 --retry 2 -o voice.tar.gz "${p}${GH_VOICE}"; then
|
|
@@ -253,27 +281,82 @@ fi
|
|
|
253
281
|
exit 0
|
|
254
282
|
EOS
|
|
255
283
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
#
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
284
|
+
# update.sh 与安装器同一条下载链(npmmirror+滞后守卫 → npm 官方 → GitHub 直连 → gh 代理):
|
|
285
|
+
# 头部三行配置用 printf %q 烤入;函数体放引号 heredoc —— 零转义、与上面定义逐字同源,
|
|
286
|
+
# 改链时两处一起改(verify-termux-voice T7 守链序与两份同步)。
|
|
287
|
+
{
|
|
288
|
+
printf '#!/data/data/com.termux/files/usr/bin/bash\n'
|
|
289
|
+
printf 'set -euo pipefail\n'
|
|
290
|
+
printf 'APP_DIR=%q PORT=%q GH_ASSET=%q\n\n' "$APP_DIR" "$PORT" "$GH_ASSET"
|
|
291
|
+
cat <<'UPDATE_EOF'
|
|
292
|
+
# 更新便携包并重启(下载链与 install-termux.sh 同源:npmmirror+滞后守卫 → npm 官方 → GitHub 直连 → gh 代理)
|
|
293
|
+
info() { printf '\033[1m[*]\033[0m %s\n' "$*"; }
|
|
294
|
+
|
|
295
|
+
# ↓↓ 与 install-termux.sh 逐字同源的四个函数(契约:恒 exit 0,空输出=未命中)↓↓
|
|
296
|
+
npm_tarball() {
|
|
297
|
+
local json ver gh
|
|
298
|
+
json=$(curl -sfL --connect-timeout 8 --max-time 20 "https://registry.npmmirror.com/$1/latest" || true)
|
|
299
|
+
[ -n "$json" ] || return 0
|
|
300
|
+
ver=$(printf '%s' "$json" | sed -n 's/.*"version":"\([^"]*\)".*/\1/p')
|
|
301
|
+
if [ -n "$ver" ]; then
|
|
302
|
+
gh=$(gh_latest_version)
|
|
303
|
+
if [ -n "$gh" ] && ! ver_ge "$ver" "$gh"; then
|
|
304
|
+
info "npm 镜像同步滞后(镜像 v${ver} < GitHub v${gh}),换 npm 官方源…"
|
|
305
|
+
return 0
|
|
306
|
+
fi
|
|
307
|
+
fi
|
|
308
|
+
printf '%s' "$json" | sed -n 's/.*"tarball":"\([^"]*\)".*/\1/p'
|
|
309
|
+
}
|
|
310
|
+
npm_tarball_official() {
|
|
311
|
+
local json
|
|
312
|
+
json=$(curl -sfL --connect-timeout 8 --max-time 20 "https://registry.npmjs.org/$1/latest" || true)
|
|
313
|
+
printf '%s' "$json" | sed -n 's/.*"tarball":"\([^"]*\)".*/\1/p'
|
|
314
|
+
}
|
|
315
|
+
gh_latest_version() {
|
|
316
|
+
local final
|
|
317
|
+
final=$(curl -sIL --connect-timeout 8 --max-time 20 -o /dev/null -w '%{url_effective}' \
|
|
318
|
+
"https://github.com/Kaiji-Z/LookatStudy/releases/latest/download/probe" 2>/dev/null || true)
|
|
319
|
+
printf '%s' "$final" | sed -n 's#.*/download/v\([0-9][0-9.]*\)/.*#\1#p'
|
|
320
|
+
}
|
|
321
|
+
ver_ge() {
|
|
322
|
+
local a b
|
|
323
|
+
a=$(printf '%s' "$1" | tr -d 'v' | awk -F. '{printf "%02d%02d%02d", $1, $2, $3}')
|
|
324
|
+
b=$(printf '%s' "$2" | tr -d 'v' | awk -F. '{printf "%02d%02d%02d", $1, $2, $3}')
|
|
325
|
+
[ -n "$a" ] && [ -n "$b" ] && [ "$a" -ge "$b" ] 2>/dev/null
|
|
326
|
+
}
|
|
327
|
+
# ↑↑ 同源函数区结束 ↑↑
|
|
328
|
+
|
|
329
|
+
cd "$APP_DIR"
|
|
263
330
|
echo "==> 停止旧服务..."
|
|
264
|
-
pkill -f "server.cjs --port $
|
|
331
|
+
pkill -f "server.cjs --port $PORT" 2>/dev/null || true
|
|
265
332
|
sleep 1
|
|
266
333
|
echo "==> 下载最新便携包..."
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
334
|
+
src=""
|
|
335
|
+
tb=$(npm_tarball lookatstudy-mobile)
|
|
336
|
+
if [ -n "$tb" ] && curl -fL --connect-timeout 10 --retry 2 -o mobile.tgz "$tb"; then
|
|
337
|
+
src="npm 镜像"
|
|
338
|
+
else
|
|
339
|
+
tb=$(npm_tarball_official lookatstudy-mobile)
|
|
340
|
+
if [ -n "$tb" ] && curl -fL --connect-timeout 10 --retry 2 -o mobile.tgz "$tb"; then
|
|
341
|
+
src="npm 官方源"
|
|
342
|
+
fi
|
|
343
|
+
fi
|
|
344
|
+
if [ -n "$src" ]; then
|
|
345
|
+
tar -xzf mobile.tgz --strip-components=1 && rm -f mobile.tgz
|
|
346
|
+
echo "[✓] 已更新($src)"
|
|
347
|
+
else
|
|
348
|
+
dl_ok=0
|
|
349
|
+
for p in "" "https://gh-proxy.com/" "https://ghproxy.net/" "https://ghfast.top/"; do
|
|
350
|
+
if curl -fL --connect-timeout 10 --retry 2 -o ls.zip "${p}${GH_ASSET}"; then dl_ok=1; break; fi
|
|
351
|
+
echo " ${p:-GitHub 直连}失败,换下一个源..."
|
|
352
|
+
done
|
|
353
|
+
[ "$dl_ok" = 1 ] || { echo "下载失败,保持原版本。"; exit 1; }
|
|
354
|
+
unzip -o ls.zip && rm -f ls.zip
|
|
355
|
+
fi
|
|
274
356
|
echo "==> 重启..."
|
|
275
|
-
exec bash "
|
|
276
|
-
|
|
357
|
+
exec bash "$APP_DIR/start.sh"
|
|
358
|
+
UPDATE_EOF
|
|
359
|
+
} > "$APP_DIR/update.sh"
|
|
277
360
|
|
|
278
361
|
chmod 755 "$APP_DIR"/{start,stop,status,update}.sh
|
|
279
362
|
ok "常用脚本就位: ~/lookatstudy/{start,stop,status,update}.sh"
|
package/package.json
CHANGED
package/server.cjs
CHANGED
|
@@ -517676,6 +517676,16 @@ function htmlToMarkdown(html, opts = {}) {
|
|
|
517676
517676
|
if (!document2.body || document2.body.childNodes.length === 0) {
|
|
517677
517677
|
document2 = parseHTML(`<html><body>${html}</body></html>`).document;
|
|
517678
517678
|
}
|
|
517679
|
+
for (const el of Array.from(document2.querySelectorAll("script[type='math/tex']"))) {
|
|
517680
|
+
const tex = (el.textContent ?? "").trim();
|
|
517681
|
+
if (tex)
|
|
517682
|
+
el.replaceWith(document2.createTextNode(tex.includes("\n") ? `$$${tex}$$` : `$${tex}$`));
|
|
517683
|
+
}
|
|
517684
|
+
for (const el of Array.from(document2.querySelectorAll(".katex"))) {
|
|
517685
|
+
const tex = (el.querySelector("annotation")?.textContent ?? "").trim();
|
|
517686
|
+
if (tex)
|
|
517687
|
+
el.replaceWith(document2.createTextNode(tex.includes("\n") ? `$$${tex}$$` : `$${tex}$`));
|
|
517688
|
+
}
|
|
517679
517689
|
for (const tag of ["script", "style", "head"]) {
|
|
517680
517690
|
for (const el of document2.querySelectorAll(tag))
|
|
517681
517691
|
el.remove();
|
|
@@ -526237,6 +526247,153 @@ function splitSentences(text3, opts = {}) {
|
|
|
526237
526247
|
return { sentences: out, rest: flush ? "" : rest };
|
|
526238
526248
|
}
|
|
526239
526249
|
|
|
526250
|
+
// shared/math-speech.ts
|
|
526251
|
+
var SYMBOLS = [
|
|
526252
|
+
["\\leq", "\u5C0F\u4E8E\u7B49\u4E8E"],
|
|
526253
|
+
["\\le", "\u5C0F\u4E8E\u7B49\u4E8E"],
|
|
526254
|
+
["\\geq", "\u5927\u4E8E\u7B49\u4E8E"],
|
|
526255
|
+
["\\ge", "\u5927\u4E8E\u7B49\u4E8E"],
|
|
526256
|
+
["\\neq", "\u4E0D\u7B49\u4E8E"],
|
|
526257
|
+
["\\ne", "\u4E0D\u7B49\u4E8E"],
|
|
526258
|
+
["\\approx", "\u7EA6\u7B49\u4E8E"],
|
|
526259
|
+
["\\equiv", "\u6052\u7B49\u4E8E"],
|
|
526260
|
+
["\\pm", "\u6B63\u8D1F"],
|
|
526261
|
+
["\\times", "\u4E58\u4EE5"],
|
|
526262
|
+
["\\cdot", "\u70B9\u4E58"],
|
|
526263
|
+
["\\div", "\u9664\u4EE5"],
|
|
526264
|
+
["\\to", "\u8D8B\u4E8E"],
|
|
526265
|
+
["\\rightarrow", "\u8D8B\u4E8E"],
|
|
526266
|
+
["\\Rightarrow", "\u63A8\u51FA"],
|
|
526267
|
+
["\\infty", "\u65E0\u7A77"],
|
|
526268
|
+
["\\sum", "\u6C42\u548C"],
|
|
526269
|
+
["\\prod", "\u8FDE\u4E58"],
|
|
526270
|
+
["\\int", "\u79EF\u5206"],
|
|
526271
|
+
["\\lim", "\u6781\u9650"],
|
|
526272
|
+
["\\log", "\u5BF9\u6570"],
|
|
526273
|
+
["\\ln", "\u81EA\u7136\u5BF9\u6570"],
|
|
526274
|
+
["\\exp", "\u6307\u6570"],
|
|
526275
|
+
["\\in", "\u5C5E\u4E8E"],
|
|
526276
|
+
["\\subset", "\u5305\u542B\u4E8E"],
|
|
526277
|
+
["\\cup", "\u5E76"],
|
|
526278
|
+
["\\cap", "\u4EA4"],
|
|
526279
|
+
["\\forall", "\u4EFB\u610F"],
|
|
526280
|
+
["\\exists", "\u5B58\u5728"],
|
|
526281
|
+
["\\partial", "\u504F\u5BFC"],
|
|
526282
|
+
["\\nabla", "\u68AF\u5EA6"],
|
|
526283
|
+
["\\angle", "\u89D2"],
|
|
526284
|
+
["\\degree", "\u5EA6"],
|
|
526285
|
+
["\\cdots", "\u70B9\u70B9\u70B9"],
|
|
526286
|
+
["\\ldots", "\u70B9\u70B9\u70B9"]
|
|
526287
|
+
];
|
|
526288
|
+
var GREEK = {
|
|
526289
|
+
alpha: "\u963F\u5C14\u6CD5",
|
|
526290
|
+
beta: "\u8D1D\u5854",
|
|
526291
|
+
gamma: "\u4F3D\u9A6C",
|
|
526292
|
+
delta: "\u5FB7\u5C14\u5854",
|
|
526293
|
+
epsilon: "\u827E\u666E\u897F\u9686",
|
|
526294
|
+
zeta: "\u6CFD\u5854",
|
|
526295
|
+
eta: "\u4F0A\u5854",
|
|
526296
|
+
theta: "\u897F\u5854",
|
|
526297
|
+
iota: "\u7EA6\u5854",
|
|
526298
|
+
kappa: "\u5361\u5E15",
|
|
526299
|
+
lambda: "\u62C9\u59C6\u8FBE",
|
|
526300
|
+
mu: "\u7F2A",
|
|
526301
|
+
nu: "\u7EBD",
|
|
526302
|
+
xi: "\u514B\u897F",
|
|
526303
|
+
pi: "\u6D3E",
|
|
526304
|
+
rho: "\u67D4",
|
|
526305
|
+
sigma: "\u897F\u683C\u9A6C",
|
|
526306
|
+
tau: "\u9676",
|
|
526307
|
+
phi: "\u6590",
|
|
526308
|
+
chi: "\u51EF",
|
|
526309
|
+
psi: "\u666E\u897F",
|
|
526310
|
+
omega: "\u6B27\u7C73\u4F3D"
|
|
526311
|
+
};
|
|
526312
|
+
function readGroup(s, i) {
|
|
526313
|
+
if (s[i] !== "{")
|
|
526314
|
+
return null;
|
|
526315
|
+
let depth = 0;
|
|
526316
|
+
for (let j = i; j < s.length; j++) {
|
|
526317
|
+
if (s[j] === "{")
|
|
526318
|
+
depth++;
|
|
526319
|
+
else if (s[j] === "}") {
|
|
526320
|
+
depth--;
|
|
526321
|
+
if (depth === 0)
|
|
526322
|
+
return { body: s.slice(i + 1, j), end: j + 1 };
|
|
526323
|
+
}
|
|
526324
|
+
}
|
|
526325
|
+
return null;
|
|
526326
|
+
}
|
|
526327
|
+
function readAtom(s, i) {
|
|
526328
|
+
const g = readGroup(s, i);
|
|
526329
|
+
if (g)
|
|
526330
|
+
return g;
|
|
526331
|
+
return { body: s[i] ?? "", end: i + 1 };
|
|
526332
|
+
}
|
|
526333
|
+
function mathToSpokenZH(tex) {
|
|
526334
|
+
let s = tex;
|
|
526335
|
+
s = s.replace(/\\(?:left|right|displaystyle|limits)\b/g, " ");
|
|
526336
|
+
s = s.replace(/\\[,;!\s]|\\quad|\\qquad|~/g, " ");
|
|
526337
|
+
for (let guard = 0; guard < 12; guard++) {
|
|
526338
|
+
let next = s;
|
|
526339
|
+
next = next.replace(/\\[dt]?frac(?![A-Za-z])/g, "\\frac");
|
|
526340
|
+
{
|
|
526341
|
+
let i;
|
|
526342
|
+
while ((i = next.indexOf("\\frac")) >= 0) {
|
|
526343
|
+
const a = readAtom(next, i + 5);
|
|
526344
|
+
const b = readAtom(next, a.end);
|
|
526345
|
+
next = next.slice(0, i) + `${a.body} \u5206\u4E4B ${b.body} ` + next.slice(b.end);
|
|
526346
|
+
}
|
|
526347
|
+
}
|
|
526348
|
+
{
|
|
526349
|
+
let i;
|
|
526350
|
+
while ((i = next.indexOf("\\binom")) >= 0) {
|
|
526351
|
+
const a = readAtom(next, i + 6);
|
|
526352
|
+
const b = readAtom(next, a.end);
|
|
526353
|
+
next = next.slice(0, i) + `${a.body} \u53D6 ${b.body} ` + next.slice(b.end);
|
|
526354
|
+
}
|
|
526355
|
+
}
|
|
526356
|
+
next = next.replace(/\\sqrt\s*\[( {[^{}]*} |[^\s\\]+)\s*\]\s*/g, (_m, n) => `${n.trim()} \u6B21\u6839\u53F7 `);
|
|
526357
|
+
{
|
|
526358
|
+
let i;
|
|
526359
|
+
while ((i = next.indexOf("\\sqrt")) >= 0) {
|
|
526360
|
+
const a = readAtom(next, i + 5);
|
|
526361
|
+
next = next.slice(0, i) + `\u6839\u53F7 ${a.body} ` + next.slice(a.end);
|
|
526362
|
+
}
|
|
526363
|
+
}
|
|
526364
|
+
next = next.replace(/\\(?:mathbf|mathbb|mathrm|mathit|boldsymbol|text|operatorname)\s*/g, (m) => m.startsWith("\\text") ? "" : " ");
|
|
526365
|
+
if (next === s) {
|
|
526366
|
+
s = next;
|
|
526367
|
+
break;
|
|
526368
|
+
}
|
|
526369
|
+
s = next;
|
|
526370
|
+
}
|
|
526371
|
+
for (let guard = 0; guard < 8; guard++) {
|
|
526372
|
+
const next = s.replace(
|
|
526373
|
+
/(\\frac|[\w)\]}]|\s)\s*\^\s*(\{[^{}]*\}|[^\s])|(\\frac|[\w)\]}]| )\s*_\s*(\{[^{}]*\}|[^\s])/g,
|
|
526374
|
+
(_m, base1, sup, base2, sub) => {
|
|
526375
|
+
if (sup !== void 0)
|
|
526376
|
+
return `${base1} \u7684 ${sup.replace(/[{}]/g, "")} \u6B21\u65B9`;
|
|
526377
|
+
return `${base2} \u4E0B\u6807 ${sub.replace(/[{}]/g, "")}`;
|
|
526378
|
+
}
|
|
526379
|
+
);
|
|
526380
|
+
if (next === s)
|
|
526381
|
+
break;
|
|
526382
|
+
s = next;
|
|
526383
|
+
}
|
|
526384
|
+
for (const [cmd, zh2] of SYMBOLS)
|
|
526385
|
+
s = s.split(cmd).join(` ${zh2} `);
|
|
526386
|
+
s = s.replace(/\\([A-Za-z]+)\b/g, (_m, name18) => ` ${GREEK[name18] ?? name18} `);
|
|
526387
|
+
s = s.replace(/[{}]/g, " ");
|
|
526388
|
+
return s.replace(/\s+/g, " ").trim();
|
|
526389
|
+
}
|
|
526390
|
+
function speakMathInSentence(sentence) {
|
|
526391
|
+
return sentence.replace(/\$\$([^$]+)\$\$|\$([^$]+)\$/g, (_m, block, inline) => {
|
|
526392
|
+
const spoken = mathToSpokenZH(block ?? inline ?? "");
|
|
526393
|
+
return spoken ? ` ${spoken} ` : "";
|
|
526394
|
+
});
|
|
526395
|
+
}
|
|
526396
|
+
|
|
526240
526397
|
// src/main/services/speech/tts-service.ts
|
|
526241
526398
|
init_speech_model_manifest();
|
|
526242
526399
|
init_speech_model_service();
|
|
@@ -550884,13 +551041,14 @@ function speedToRatePercent(speed) {
|
|
|
550884
551041
|
function resolveTtsTier(settings2) {
|
|
550885
551042
|
const engineRaw = settings2.tts_engine?.trim() ?? "";
|
|
550886
551043
|
const isCustom = engineRaw.startsWith("custom-");
|
|
550887
|
-
const engine = isCustom || engineRaw === "azure" || engineRaw === "local" || engineRaw === "edge" ? isCustom ? "custom" : engineRaw : DEFAULT_TTS_ENGINE;
|
|
551044
|
+
const engine = isCustom || engineRaw === "azure" || engineRaw === "local" || engineRaw === "edge" || engineRaw === "system" ? isCustom ? "custom" : engineRaw : DEFAULT_TTS_ENGINE;
|
|
550888
551045
|
const voice = engine === "azure" ? settings2.azure_tts_voice?.trim() || DEFAULT_AZURE_TTS_VOICE : settings2.tts_voice_edge?.trim() || DEFAULT_EDGE_VOICE;
|
|
550889
551046
|
return {
|
|
550890
551047
|
engine,
|
|
550891
551048
|
customProviderId: isCustom ? engineRaw : null,
|
|
550892
551049
|
voice,
|
|
550893
551050
|
customVoice: settings2.tts_custom_voice?.trim() || null,
|
|
551051
|
+
systemVoice: settings2.tts_system_voice?.trim() || null,
|
|
550894
551052
|
speed: clampSpeed(settings2.tts_speed),
|
|
550895
551053
|
azureKey: settings2.azure_tts_api_key?.trim() || null,
|
|
550896
551054
|
azureRegion: settings2.azure_tts_region?.trim() || null
|
|
@@ -551106,6 +551264,9 @@ async function speakMessage(emit2, dataDir, settings2, messageId, rawText, deps
|
|
|
551106
551264
|
const sid = parseSid(settings2.tts_sid_local);
|
|
551107
551265
|
const synth = deps.synth ?? synthSentence;
|
|
551108
551266
|
const isLocalReady = deps.localReady ?? localModelReady;
|
|
551267
|
+
if (cfg.engine === "system") {
|
|
551268
|
+
return { ok: false, reason: "engine-unavailable" };
|
|
551269
|
+
}
|
|
551109
551270
|
if (cfg.engine === "local") {
|
|
551110
551271
|
if (!isSpeechEngineLoadable())
|
|
551111
551272
|
return { ok: false, reason: "engine-unavailable" };
|
|
@@ -551137,7 +551298,7 @@ async function speakMessage(emit2, dataDir, settings2, messageId, rawText, deps
|
|
|
551137
551298
|
if (running)
|
|
551138
551299
|
return running;
|
|
551139
551300
|
const sentence = sentences[i];
|
|
551140
|
-
const p = synth(dataDir, cfg, engine, sentence, {
|
|
551301
|
+
const p = synth(dataDir, cfg, engine, speakMathInSentence(sentence), {
|
|
551141
551302
|
sid,
|
|
551142
551303
|
onChunk: () => !mine.stopped && active === mine,
|
|
551143
551304
|
custom: deps.custom ?? void 0
|
|
@@ -554380,6 +554541,7 @@ function buildGenerationPrompt(title, content, type, outLang) {
|
|
|
554380
554541
|
``,
|
|
554381
554542
|
`\u51FA\u9898\u7EA2\u7EBF:`,
|
|
554382
554543
|
`- \u7B54\u6848\u5FC5\u987B\u5728\u63D0\u4F9B\u7684\u5B66\u4E60\u5185\u5BB9\u4E2D\u6709\u4F9D\u636E\uFF0C\u4E0D\u53EF\u7F16\u9020\u5185\u5BB9\u91CC\u6CA1\u6709\u7684\u77E5\u8BC6`,
|
|
554544
|
+
`- \u6570\u5B66\u8868\u8FBE\u5F0F\u7528\u884C\u5185 $..$ \u6216\u884C\u95F4 $$..$$ \u7684 LaTeX \u8BB0\u6CD5\u4E66\u5199\uFF0C\u4E0D\u8981\u7528\u7EAF\u6587\u672C\u8FD1\u4F3C\uFF08\u754C\u9762\u4F1A\u6E32\u67D3\u6210\u516C\u5F0F\uFF09`,
|
|
554383
554545
|
questionLanguageLine(outLang),
|
|
554384
554546
|
`- \u5E72\u6270\u9879 plausible \u4F46 definitely wrong\uFF08\u4E0D\u80FD\u6709\u4E89\u8BAE\uFF09`,
|
|
554385
554547
|
``,
|
|
@@ -554897,6 +555059,7 @@ ${l.content || "(\u8BFE\u65F6\u65E0\u6B63\u6587)"}`
|
|
|
554897
555059
|
`- \u9898\u5E72\u8003"\u7406\u89E3"\u548C"\u5E94\u7528",\u4E0D\u8981\u51FA\u6B7B\u8BB0\u786C\u80CC\u7684\u5B9A\u4E49\u9898`,
|
|
554898
555060
|
`- \u5E72\u6270\u9879 plausible \u4F46 definitely wrong(\u57FA\u4E8E\u5B66\u4E60\u8005\u5E38\u72AF\u7684\u771F\u5B9E\u8BEF\u89E3)`,
|
|
554899
555061
|
`- \u7B54\u6848\u5FC5\u987B\u5728\u63D0\u4F9B\u7684\u8BFE\u7A0B\u5185\u5BB9\u4E2D\u6709\u4F9D\u636E`,
|
|
555062
|
+
`- \u6570\u5B66\u8868\u8FBE\u5F0F\u7528\u884C\u5185 $..$ \u6216\u884C\u95F4 $$..$$ \u7684 LaTeX \u8BB0\u6CD5\u4E66\u5199,\u4E0D\u8981\u7528\u7EAF\u6587\u672C\u8FD1\u4F3C(\u754C\u9762\u4F1A\u6E32\u67D3\u6210\u516C\u5F0F)`,
|
|
554900
555063
|
questionLanguageLine(outLang),
|
|
554901
555064
|
``,
|
|
554902
555065
|
`\u4E25\u683C\u6309\u4EE5\u4E0B JSON \u683C\u5F0F\u8FD4\u56DE,\u4E0D\u8981\u52A0 markdown \u4EE3\u7801\u5757\u6807\u8BB0\u3001\u4E0D\u8981\u89E3\u91CA:`,
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-
|
|
1
|
+
import{g as p,r as u,d as a}from"./chunk-6Q2QTUOP-BBL9yZr5.js";import{p as f}from"./chunk-JWPE2WC7-Rx7velok.js";import{_ as n,l as o}from"./mermaid.core-BnzH2M4g.js";import{M as c,b as d}from"./cynefin-VYW2F7L2-BoAEtYBt.js";import"./main-_hK--hbF.js";import"./index-DFfbtrtQ.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),l=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:l,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},F={parser:R,db:a,renderer:u,styles:p};export{F as diagram};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-
|
|
1
|
+
import{Y as ln,$ as an,a0 as F,a1 as q,a2 as j,a3 as un,a4 as y,a5 as tn,a6 as J,a7 as _,a8 as rn,a9 as o,aa as on,ab as sn,ac as fn}from"./mermaid.core-BnzH2M4g.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,z,a){var O=I-l,i=D-h,n=z-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function U(l,h,I,D,v,A,z){var a=l-I,O=h-D,i=(z?A:-A)/J(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,B=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*J(on(0,T*T*R-P*P)),Y=(P*g-m*S)/R,$=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=Y-B,e=$-t,r=w-B,C=p-t;return x*x+e*e>r*r+C*C&&(Y=w,$=p),{cx:Y,cy:$,x01:-n,y01:-d,x11:Y*(v/T-1),y11:$*(v/T-1)}}function hn(){var l=cn,h=yn,I=j(0),D=null,v=gn,A=dn,z=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,B=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(B>tn-y)a.moveTo(s*F(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*F(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=B,S=B,Y=z.apply(this,arguments)/2,$=Y>y&&(D?+D.apply(this,arguments):J(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if($>y){var C=sn($/u*q(Y)),K=sn($/s*q(Y));(P-=C*2)>y?(C*=t?1:-1,R+=C,T-=C):(P=0,R=T=(f+c)/2),(S-=K*2)>y?(K*=t?1:-1,m+=K,g-=K):(S=0,m=g=(f+c)/2)}var G=s*F(m),H=s*q(m),L=u*F(T),M=u*q(T);if(w>y){var N=s*F(g),Q=s*q(g),V=u*F(R),W=u*q(R),E;if(B<an)if(E=pn(G,H,V,W,N,Q,L,M)){var X=G-E[0],Z=H-E[1],b=N-E[0],k=Q-E[1],nn=1/q(fn((X*b+Z*k)/(J(X*X+Z*Z)*J(b*b+k*k)))/2),en=J(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=U(V,W,G,H,s,x,t),r=U(N,Q,L,M,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(G,H),a.arc(0,0,s,m,g,!t)):a.moveTo(G,H),!(u>y)||!(P>y)?a.lineTo(L,M):p>y?(e=U(L,M,N,Q,u,-p,t),r=U(G,H,V,W,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[F(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:j(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:j(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:j(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:j(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:j(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:j(+n),i):A},i.padAngle=function(n){return arguments.length?(z=typeof n=="function"?n:j(+n),i):z},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
|