Normalize fullwidth punctuation to ASCII across codebase.

Add scripts/normalize_ambiguous_unicode.py; fix corrupted patch_instance_theme_templates.py. Preserves curly quotes in string literals; removes Git homoglyph warnings on .env.example.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-08 23:42:26 +08:00
parent aaa72c7961
commit b733e551a0
392 changed files with 71522 additions and 71369 deletions
+11 -11
View File
@@ -61,15 +61,15 @@
const state = (status && status.state) || {};
const root = (status && status.backup_root) || "";
let html = '<div class="backup-meta">';
html += '<div>目录<code>' + esc(root) + '</code></div>';
html += '<div>目录:<code>' + esc(root) + '</code></div>';
if (state.last_backup_at) {
html += '<div>上次备份' + esc(state.last_backup_at) + '' + esc(state.last_trigger || "") + "</div>";
html += '<div>上次备份:' + esc(state.last_backup_at) + '(' + esc(state.last_trigger || "") + ")</div>";
}
if (state.last_auto_at) {
html += '<div>上次自动' + esc(state.last_auto_at) + "</div>";
html += '<div>上次自动:' + esc(state.last_auto_at) + "</div>";
}
if (state.last_restore_at) {
html += '<div>上次恢复' + esc(state.last_restore_at) + " ← " + esc(state.last_restore_from || "") + "</div>";
html += '<div>上次恢复:' + esc(state.last_restore_at) + " ← " + esc(state.last_restore_from || "") + "</div>";
}
html += "</div>";
if (!rows.length) {
@@ -159,14 +159,14 @@
setStatus(data.detail || "备份失败", true);
return;
}
setStatus("完成" + (data.file || "") + "" + fmtBytes(data.size) + "");
setStatus("完成:" + (data.file || "") + "(" + fmtBytes(data.size) + ")");
await loadBackupStatus();
if (typeof showToast === "function") showToast("备份完成");
}
async function restoreLocal(name) {
if (!name) return;
if (!window.confirm("确认从服务器备份 " + name + " 恢复\n恢复前会自动做 pre-restore 快照并重启 PM2")) return;
if (!window.confirm("确认从服务器备份 " + name + " 恢复?\n恢复前会自动做 pre-restore 快照并重启 PM2.")) return;
if (window.prompt('请输入 RESTORE 确认恢复') !== "RESTORE") return;
setStatus("恢复中…");
const r = await fetch("/api/backup/restore-local", {
@@ -182,9 +182,9 @@
setStatus(data.detail || "恢复失败", true);
return;
}
setStatus("恢复完成已恢复 " + ((data.restored && data.restored.length) || 0) + " 个文件");
setStatus("恢复完成,已恢复 " + ((data.restored && data.restored.length) || 0) + " 个文件");
await loadBackupStatus();
if (typeof showToast === "function") showToast("恢复完成请刷新页面");
if (typeof showToast === "function") showToast("恢复完成,请刷新页面");
}
async function restoreUpload() {
@@ -193,7 +193,7 @@
setStatus("请选择 .zip 备份文件", true);
return;
}
if (!window.confirm("确认上传并恢复 " + file.name + "\n恢复前会自动做 pre-restore 快照并重启 PM2")) return;
if (!window.confirm("确认上传并恢复 " + file.name + "?\n恢复前会自动做 pre-restore 快照并重启 PM2.")) return;
if (window.prompt('请输入 RESTORE 确认恢复') !== "RESTORE") return;
setStatus("上传并恢复中…");
const fd = new FormData();
@@ -211,10 +211,10 @@
setStatus(data.detail || "恢复失败", true);
return;
}
setStatus("恢复完成已恢复 " + ((data.restored && data.restored.length) || 0) + " 个文件");
setStatus("恢复完成,已恢复 " + ((data.restored && data.restored.length) || 0) + " 个文件");
if (elRestoreFile) elRestoreFile.value = "";
await loadBackupStatus();
if (typeof showToast === "function") showToast("恢复完成请刷新页面");
if (typeof showToast === "function") showToast("恢复完成,请刷新页面");
}
window.initBackupSettingsUI = async function () {