43 lines
2.1 KiB
Bash
43 lines
2.1 KiB
Bash
|
|
#!/usr/bin/env bash
|
|||
|
|
# 构建期补丁:改 KasmVNC web 客户端的 webpack 产物 dist/*.bundle.js
|
|||
|
|
# (1) 默认开启 IME 输入模式(本地输入法打中文,成品汉字发进容器,容器内不装 IME)
|
|||
|
|
# (2) 修复 noVNC 的中文 IME 输入:原实现靠"隐藏 textarea 差分→逐字符重发 keysym",
|
|||
|
|
# 会在合成过程中把中间拼音也发给远端、且永不 reset 导致累积+退格风暴;
|
|||
|
|
# 改为合成期间和提交时都只同步内部 textarea 状态,不再发送中文 keysym。
|
|||
|
|
# 最终成品文本由面板前端捕获后通过 xclip/xdotool 粘贴,绕过 KasmVNC XKB keysym 限制。
|
|||
|
|
# 末尾断言:若 base 镜像换了打包结构、一个文件都没改到,则构建失败而非静默放过。
|
|||
|
|
set -euo pipefail
|
|||
|
|
|
|||
|
|
PATCH_PL="$(dirname "$0")/woc-ime.pl"
|
|||
|
|
patched=0
|
|||
|
|
|
|||
|
|
for f in /usr/share/kasmvnc/www/dist/*.bundle.js /usr/local/share/kasmvnc/www/dist/*.bundle.js; do
|
|||
|
|
[ -f "$f" ] || continue
|
|||
|
|
changed=0
|
|||
|
|
|
|||
|
|
# (1) enable_ime 默认开启
|
|||
|
|
if grep -q "initSetting('enable_ime', false)" "$f"; then
|
|||
|
|
sed -i "s/initSetting('enable_ime', false)/initSetting('enable_ime', true)/g" "$f"
|
|||
|
|
changed=1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
# (2) IME 差分逻辑修复(仅含 noVNC 键盘逻辑的 bundle)
|
|||
|
|
# 幂等:/usr/share/kasmvnc 是 /usr/local/share/kasmvnc 的软链,两个 glob 会命中同一 inode,
|
|||
|
|
# 故已含 _imeJustCommitted 的文件直接跳过,避免重复注入守卫块。
|
|||
|
|
if grep -q "IME input change, sending differential" "$f" && ! grep -q "WOC-IME" "$f"; then
|
|||
|
|
perl -0777 -i -pe "$(cat "$PATCH_PL")" "$f"
|
|||
|
|
after="$(grep -c "WOC-IME" "$f" || true)"
|
|||
|
|
# 断言两处替换都命中(compositionend 标记 1 + _handleInput 守卫标记 1 = 2 行)
|
|||
|
|
if [ "$after" -ne 2 ]; then
|
|||
|
|
echo "FATAL: IME patch mismatch on $f (markers=$after, expect 2)" >&2
|
|||
|
|
exit 1
|
|||
|
|
fi
|
|||
|
|
changed=1
|
|||
|
|
fi
|
|||
|
|
|
|||
|
|
[ "$changed" = "1" ] && { echo "woc-www-patch: patched $f"; patched=1; }
|
|||
|
|
done
|
|||
|
|
|
|||
|
|
[ "$patched" = "1" ] || { echo "FATAL: no bundle patched" >&2; exit 1; }
|
|||
|
|
echo "woc-www-patch: done"
|