From d4554eb1afc70bd05ad08f043e5ba4e4571d403f Mon Sep 17 00:00:00 2001
From: LuminousRuoxi <2494735589@qq.com>
Date: Thu, 10 Sep 2026 15:05:01 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A4=8D=E5=88=B6=E5=8E=9F=E6=96=87?=
=?UTF-8?q?=E5=88=B0=E6=94=B9=E5=86=99=E5=8C=BA=E6=8C=89=E9=92=AE=20+=20?=
=?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=94=B9=E5=AE=8C=E5=AD=97=E7=82=B9=E6=AE=B5?=
=?UTF-8?q?=E5=8F=B7=E7=AC=AC=E4=B8=80=E6=AC=A1=E7=82=B9=E5=87=BB=E4=B8=A2?=
=?UTF-8?q?=E5=A4=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 改写区新增「复制原文到改写区 →」: 一键以原文为起点手动改写;
改写区已有内容时二次确认,避免覆盖已写的工作
- 修复既有 bug: 改写区 blur(点段号的 mousedown 触发)会重建段号按钮,
mouseup 时按钮已被替换 → 第一次点击丢失(改完字要点两次才切段)。
onRewriteInput/onRewriteBlur 改用轻量 class 更新(updateParagraphSwitcherState),
不再重建 DOM
- 浏览器实测: 复制/确认/覆盖/切段 9/9 + 核心回归 6/6 通过
---
index.html | 31 ++++++++++++++++++++++++++++---
1 file changed, 28 insertions(+), 3 deletions(-)
diff --git a/index.html b/index.html
index 71508f5..5f10364 100644
--- a/index.html
+++ b/index.html
@@ -193,7 +193,7 @@ button,input,textarea{font:inherit}button{cursor:pointer}.hidden{display:none!im
基于左侧原意重新表达这一整段,不需要逐句对应原文。
自动保存0 characters
-
+
需要一点帮助?
@@ -1022,6 +1022,18 @@ function renderParagraphSwitcher(){
$('#focusOriginal').classList.toggle('active', originalView==='focus');
$('#fullOriginal').classList.toggle('active', originalView==='full');
}
+// 轻量更新段号按钮状态(active / has-copy),不重建 DOM:
+// 改写区 blur(点段号的 mousedown 触发)若重建按钮,mouseup 时按钮已被替换,
+// 第一次点击会丢失(用户实测:改完字点段号要连点两次)。
+function updateParagraphSwitcherState(){
+ const wrap = $('#paragraphSwitcher');
+ if(!wrap) return;
+ wrap.querySelectorAll('[data-para-index]').forEach(btn=>{
+ const i = Number(btn.dataset.paraIndex);
+ btn.classList.toggle('active', i===current);
+ btn.classList.toggle('has-copy', hasRewrite(i));
+ });
+}
function renderOriginalPane(){
const wrap=$('#originalFull');
wrap.innerHTML='';
@@ -1144,6 +1156,18 @@ async function toggleTranslate(){
btn.disabled = false;
renderTranslateBtn(); renderTranslateBox();
}
+// 体验优化:把当前段原文一键复制到改写区 —— 顾问以原文为起点手动改写
+// (改写区已有内容时二次确认,避免覆盖已写的工作)。
+function copyOriginalToRewrite(){
+ const area = $('#rewriteArea');
+ const text = String(paragraphs[current]||'').trim();
+ if(!area || !text) return;
+ if(String(area.value||'').trim() && !confirm('改写区已有内容,确定用原文覆盖吗?')) return;
+ area.value = text;
+ area.focus();
+ onRewriteInput({target: area}); // 复用输入处理:状态/字数提示/译文过期/保存调度
+ track('original_copied_to_rewrite', {paragraph_id: pidOf(current)});
+}
// 体验优化:原文中文对照(逐句)—— 顾问读英文吃力时,特别是被高亮标注
// 「需要改写」的句子,需要它的中文意思才能判断怎么改。
// 句子由前端拆分(en 为原文精确文本,服务端原样回填),命中批注 evidence 的
@@ -1312,7 +1336,7 @@ function onRewriteInput(e){
}
}
scheduleSave(current);
- renderParagraphSwitcher();
+ updateParagraphSwitcherState();
updateProgress();
}
function onRewriteBlur(){
@@ -1321,7 +1345,7 @@ function onRewriteBlur(){
if(hasRewrite(current)) rewriteStatus[current] = 'REWRITTEN';
else rewriteStatus[current] = 'UNTOUCHED';
flushSave(current);
- renderParagraphSwitcher();
+ updateParagraphSwitcherState(); // 不重建按钮:避免点击段号时 mousedown→blur 重建导致第一次点击丢失
updateProgress();
}
function recordExposure(kind, text){
@@ -1604,6 +1628,7 @@ $('#rewriteArea').addEventListener('input', onRewriteInput);
$('#rewriteArea').addEventListener('blur', onRewriteBlur);
$('#showScaffold').onclick=toggleScaffold;
$('#showReference').onclick=toggleReference;
+$('#copyOriginalBtn').onclick=copyOriginalToRewrite;
$('#translateBtn').onclick=toggleTranslate;
$('#recheckHistoryBtn').onclick=()=>toggleRecheckHistory();
// 点击复检历史面板与开关按钮以外的区域自动收起