Skip to content

Commit 7a5d127

Browse files
committed
chore: release v0.8.9
### 主要变更: 1. 修复阅读区搜索功能相关问题 2. 优化ChapterNav布局与搜索按钮展示逻辑 3. 新增多模块专用日志系统 4. 简化剧本改编功能,移除粒度和段落选择 5. 更新应用标题与版本号
1 parent 26d98e8 commit 7a5d127

14 files changed

Lines changed: 175 additions & 144 deletions

File tree

CHANGELOG.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,34 @@
11
# Changelog
22

3+
## v0.8.9 (2026-05-13)
4+
5+
### 🐛 Bug 修复
6+
7+
**阅读区搜索功能修复**
8+
- 修复搜索按钮消失的问题(被错误地限制为仅阅读模式显示)
9+
- 修复搜索结果行号与阅读区显示行号不匹配的问题
10+
- 问题根因:搜索结果存储使用原始索引,但阅读区高亮和滚动使用过滤后索引,导致空行存在时行号不一致
11+
- 修复方案:搜索结果统一使用原始索引存储,`paragraphIndexMap[filteredIndex]` 获取原始索引,确保搜索结果行号与阅读区显示一致
12+
13+
### 🔧 改进优化
14+
15+
**搜索按钮重新显示**
16+
- 将搜索按钮从仅阅读模式显示改为在所有模式下都可访问
17+
- 搜索按钮移至 reader-toolbar 区域,不再隐藏在悬浮操作按钮中
18+
19+
**ChapterNav 布局优化**
20+
- 优化 nav-header 水平内边距,增加元素间距
21+
- 改善 nav-header-actions 内部元素布局,解决拥挤问题
22+
23+
**日志系统增强**
24+
- 扩展 logger.ts 增加多种功能模块专用日志方法:`proofread``search``tts``file``ui``debug``warn``errorGeneric`
25+
- 统一日志开关控制,通过 ConfigModal.tsx 的 toggle-switch 控制
26+
27+
**剧本改编功能简化**
28+
- 移除转换粒度选择功能,直接按章节转换
29+
- 移除段落选择功能,简化为整章内容转换
30+
- 代码复杂度降低,用户操作更简洁
31+
332
## v0.8.8 (2026-05-10)
433

534
### 🐛 Bug 修复

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<meta charset="UTF-8" />
55
<link rel="icon" type="image/x-icon" href="/icons/favicon.ico" />
66
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
7-
<title>校对助手</title>
7+
<title>AI排版校对助手</title>
88
</head>
99
<body>
1010
<div id="root"></div>

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "proofreader",
33
"private": true,
4-
"version": "0.8.8",
4+
"version": "0.8.9",
55
"type": "module",
66
"scripts": {
77
"dev": "vite",

src-tauri/Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src-tauri/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "proofreader"
3-
version = "0.8.8"
3+
version = "0.8.9"
44
edition = "2021"
55

66
[lib]

src-tauri/target/.rustc_info.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"rustc_fingerprint":8181815494667461818,"outputs":{"2595164081506252816":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/Users/hegeken/.rustup/toolchains/stable-aarch64-apple-darwin\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"aarch64\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"neon\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"android\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"11449549311697287552":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/Users/hegeken/.rustup/toolchains/stable-aarch64-apple-darwin\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"sse3\"\ntarget_feature=\"ssse3\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"android\"\ntarget_pointer_width=\"32\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.90.0 (1159e78c4 2025-09-14)\nbinary: rustc\ncommit-hash: 1159e78c4747b02ef996e55082b704c09b970588\ncommit-date: 2025-09-14\nhost: aarch64-apple-darwin\nrelease: 1.90.0\nLLVM version: 20.1.8\n","stderr":""},"3285132367535543654":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/Users/hegeken/.rustup/toolchains/stable-aarch64-apple-darwin\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"popcnt\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_feature=\"sse3\"\ntarget_feature=\"sse4.1\"\ntarget_feature=\"ssse3\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"android\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"10144619854796028087":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/Users/hegeken/.rustup/toolchains/stable-aarch64-apple-darwin\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"eabi\"\ntarget_arch=\"arm\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"android\"\ntarget_pointer_width=\"32\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.dylib\nlib___.dylib\nlib___.a\nlib___.dylib\n/Users/hegeken/.rustup/toolchains/stable-aarch64-apple-darwin\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"aarch64\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"aes\"\ntarget_feature=\"crc\"\ntarget_feature=\"dit\"\ntarget_feature=\"dotprod\"\ntarget_feature=\"dpb\"\ntarget_feature=\"dpb2\"\ntarget_feature=\"fcma\"\ntarget_feature=\"fhm\"\ntarget_feature=\"flagm\"\ntarget_feature=\"fp16\"\ntarget_feature=\"frintts\"\ntarget_feature=\"jsconv\"\ntarget_feature=\"lor\"\ntarget_feature=\"lse\"\ntarget_feature=\"neon\"\ntarget_feature=\"paca\"\ntarget_feature=\"pacg\"\ntarget_feature=\"pan\"\ntarget_feature=\"pmuv3\"\ntarget_feature=\"ras\"\ntarget_feature=\"rcpc\"\ntarget_feature=\"rcpc2\"\ntarget_feature=\"rdm\"\ntarget_feature=\"sb\"\ntarget_feature=\"sha2\"\ntarget_feature=\"sha3\"\ntarget_feature=\"ssbs\"\ntarget_feature=\"vh\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"macos\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"apple\"\nunix\n","stderr":""}},"successes":{}}
1+
{"rustc_fingerprint":8645173116325193397,"outputs":{"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.90.0 (1159e78c4 2025-09-14)\nbinary: rustc\ncommit-hash: 1159e78c4747b02ef996e55082b704c09b970588\ncommit-date: 2025-09-14\nhost: aarch64-apple-darwin\nrelease: 1.90.0\nLLVM version: 20.1.8\n","stderr":""},"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.dylib\nlib___.dylib\nlib___.a\nlib___.dylib\n/Users/hegeken/.rustup/toolchains/stable-aarch64-apple-darwin\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"aarch64\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"aes\"\ntarget_feature=\"crc\"\ntarget_feature=\"dit\"\ntarget_feature=\"dotprod\"\ntarget_feature=\"dpb\"\ntarget_feature=\"dpb2\"\ntarget_feature=\"fcma\"\ntarget_feature=\"fhm\"\ntarget_feature=\"flagm\"\ntarget_feature=\"fp16\"\ntarget_feature=\"frintts\"\ntarget_feature=\"jsconv\"\ntarget_feature=\"lor\"\ntarget_feature=\"lse\"\ntarget_feature=\"neon\"\ntarget_feature=\"paca\"\ntarget_feature=\"pacg\"\ntarget_feature=\"pan\"\ntarget_feature=\"pmuv3\"\ntarget_feature=\"ras\"\ntarget_feature=\"rcpc\"\ntarget_feature=\"rcpc2\"\ntarget_feature=\"rdm\"\ntarget_feature=\"sb\"\ntarget_feature=\"sha2\"\ntarget_feature=\"sha3\"\ntarget_feature=\"ssbs\"\ntarget_feature=\"vh\"\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"macos\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"apple\"\nunix\n","stderr":""},"6432102384495711296":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.dylib\nlib___.dylib\nlib___.a\nlib___.dylib\n/Users/hegeken/.rustup/toolchains/stable-aarch64-apple-darwin\noff\npacked\nunpacked\n___\ndebug_assertions\nfmt_debug=\"full\"\noverflow_checks\npanic=\"unwind\"\nproc_macro\nrelocation_model=\"pic\"\ntarget_abi=\"\"\ntarget_arch=\"aarch64\"\ntarget_endian=\"little\"\ntarget_env=\"\"\ntarget_family=\"unix\"\ntarget_feature=\"aes\"\ntarget_feature=\"crc\"\ntarget_feature=\"dit\"\ntarget_feature=\"dotprod\"\ntarget_feature=\"dpb\"\ntarget_feature=\"dpb2\"\ntarget_feature=\"fcma\"\ntarget_feature=\"fhm\"\ntarget_feature=\"flagm\"\ntarget_feature=\"flagm2\"\ntarget_feature=\"fp16\"\ntarget_feature=\"frintts\"\ntarget_feature=\"jsconv\"\ntarget_feature=\"lor\"\ntarget_feature=\"lse\"\ntarget_feature=\"lse2\"\ntarget_feature=\"neon\"\ntarget_feature=\"paca\"\ntarget_feature=\"pacg\"\ntarget_feature=\"pan\"\ntarget_feature=\"pmuv3\"\ntarget_feature=\"ras\"\ntarget_feature=\"rcpc\"\ntarget_feature=\"rcpc2\"\ntarget_feature=\"rdm\"\ntarget_feature=\"sb\"\ntarget_feature=\"sha2\"\ntarget_feature=\"sha3\"\ntarget_feature=\"ssbs\"\ntarget_feature=\"v8.1a\"\ntarget_feature=\"v8.2a\"\ntarget_feature=\"v8.3a\"\ntarget_feature=\"v8.4a\"\ntarget_feature=\"vh\"\ntarget_has_atomic\ntarget_has_atomic=\"128\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_has_atomic_equal_alignment=\"128\"\ntarget_has_atomic_equal_alignment=\"16\"\ntarget_has_atomic_equal_alignment=\"32\"\ntarget_has_atomic_equal_alignment=\"64\"\ntarget_has_atomic_equal_alignment=\"8\"\ntarget_has_atomic_equal_alignment=\"ptr\"\ntarget_has_atomic_load_store\ntarget_has_atomic_load_store=\"128\"\ntarget_has_atomic_load_store=\"16\"\ntarget_has_atomic_load_store=\"32\"\ntarget_has_atomic_load_store=\"64\"\ntarget_has_atomic_load_store=\"8\"\ntarget_has_atomic_load_store=\"ptr\"\ntarget_has_reliable_f128\ntarget_has_reliable_f16\ntarget_has_reliable_f16_math\ntarget_os=\"macos\"\ntarget_pointer_width=\"64\"\ntarget_thread_local\ntarget_vendor=\"apple\"\nub_checks\nunix\n","stderr":""}},"successes":{}}

src-tauri/tauri.conf.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"$schema": "https://raw.githubusercontent.com/tauri-apps/tauri/dev/crates/tauri-schema-generator/schemas/config.schema.json",
33
"productName": "Proof Reader",
4-
"version": "0.8.8",
4+
"version": "0.8.9",
55
"identifier": "cn.helilab.proofreader",
66
"build": {
77
"frontendDist": "../dist",

src/App.css

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ select {
668668
Chapter Nav - Liquid Glass
669669
============================================================ */
670670
.app-sidebar {
671-
width: 220px;
671+
min-width: 220px;
672672
background: var(--glass-bg);
673673
border-right: 1px solid var(--border);
674674
backdrop-filter: blur(var(--glass-blur));
@@ -690,8 +690,9 @@ select {
690690
display: flex;
691691
align-items: center;
692692
justify-content: space-between;
693-
padding: 18px 18px 14px;
693+
padding: 16px 20px 12px;
694694
flex-shrink: 0;
695+
gap: 16px;
695696
}
696697

697698
.nav-header h3 {
@@ -705,7 +706,7 @@ select {
705706
.nav-header-actions {
706707
display: flex;
707708
align-items: center;
708-
gap: 8px;
709+
gap: 12px;
709710
}
710711

711712
.chapter-count {

src/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ export default function App() {
237237
<h1 className="app-title">
238238
<a href="/" onClick={handleTitleClick} style={{ textDecoration: "none", color: "inherit", display: "flex", alignItems: "center", gap: "8px" }}>
239239
<img src="/icons/icon.png" alt="" className="app-icon" />
240-
校对助手
240+
AI排版校对助手
241241
</a>
242242
</h1>
243243
</div>

src/components/ReaderPanel.tsx

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { TTSPlayer, type TTSSentence } from "../utils/ttsService";
1212
import { EmptyState } from "./EmptyState";
1313
import { Icons } from "./Icons";
1414
import { Select } from "./Select";
15+
import { logger } from "../utils/logger";
1516

1617
export function ReaderPanel({
1718
showReadingModeToggle = false,
@@ -152,12 +153,14 @@ export function ReaderPanel({
152153
/** TTS 控制 */
153154
const handleTTSToggle = useCallback(() => {
154155
if (ttsPlaying) {
156+
logger.tts("暂停播放");
155157
if (ttsPlayerRef.current) {
156158
ttsPlayerRef.current.pause();
157159
setTtsPlaying(false);
158160
setTtsHighlightedPara(-1);
159161
}
160162
} else {
163+
logger.tts("开始播放, 段落数: " + paragraphs.length);
161164
if (!ttsPlayerRef.current) {
162165
ttsPlayerRef.current = new TTSPlayer(ttsConfig);
163166
ttsPlayerRef.current.setOnUpdate((sentences) => {
@@ -168,6 +171,7 @@ export function ReaderPanel({
168171
}
169172
});
170173
ttsPlayerRef.current.setOnComplete(() => {
174+
logger.tts("播放完成");
171175
setTtsPlaying(false);
172176
setTtsHighlightedPara(-1);
173177
});
@@ -305,16 +309,19 @@ export function ReaderPanel({
305309
setSearchResults([]);
306310
return;
307311
}
312+
logger.search(`搜索: "${query}"`);
308313
const results: typeof searchResults = [];
309314
const lowerQuery = query.toLowerCase();
310-
paragraphs.forEach((para, paraIndex) => {
315+
paragraphs.forEach((para, filteredIndex) => {
316+
// 获取原始段落索引(用于行号显示和滚动定位)
317+
const originalIndex = paragraphIndexMap[filteredIndex];
311318
let startIndex = 0;
312319
const lowerPara = para.toLowerCase();
313320
while (startIndex < lowerPara.length) {
314321
const matchIndex = lowerPara.indexOf(lowerQuery, startIndex);
315322
if (matchIndex === -1) break;
316323
results.push({
317-
paraIndex,
324+
paraIndex: originalIndex,
318325
matchStart: matchIndex,
319326
matchEnd: matchIndex + query.length,
320327
text: para.slice(Math.max(0, matchIndex - 20), matchIndex) + "【" + para.slice(matchIndex, matchIndex + query.length) + "】" + para.slice(matchIndex + query.length, Math.min(para.length, matchIndex + query.length + 20)),
@@ -324,7 +331,8 @@ export function ReaderPanel({
324331
});
325332
setSearchResults(results);
326333
setCurrentMatchIndex(results.length > 0 ? 0 : -1);
327-
}, [paragraphs]);
334+
logger.search(`搜索完成, 找到 ${results.length} 个匹配`);
335+
}, [paragraphs, paragraphIndexMap]);
328336

329337
/** 点击搜索结果:跳转并关闭 */
330338
const handleSearchResultClick = useCallback((index: number) => {
@@ -471,6 +479,13 @@ export function ReaderPanel({
471479
</label>
472480
</div>
473481
)}
482+
<button
483+
className="reader-search-btn"
484+
onClick={() => setShowSearch(true)}
485+
>
486+
<Icons.search size={18} />
487+
<span>搜索</span>
488+
</button>
474489
</div>
475490
<div
476491
className={`reader-content${readingMode ? " reading-mode" : ""}`}
@@ -1011,15 +1026,6 @@ export function ReaderPanel({
10111026

10121027
{/* 悬浮操作按钮 */}
10131028
<div className="reader-floating-actions">
1014-
{!readingMode && (
1015-
<button
1016-
className="reader-search-btn"
1017-
onClick={() => setShowSearch(true)}
1018-
>
1019-
<Icons.search size={18} />
1020-
<span>搜索</span>
1021-
</button>
1022-
)}
10231029
{readingMode && ttsPlaying && (
10241030
<button
10251031
className="reader-tts-btn playing"

0 commit comments

Comments
 (0)