mirror of
https://github.com/hectorqin/reader.git
synced 2026-11-12 05:50:54 +08:00
现状问题。TXT 的段落和缩进原本由服务端决定:`chapter-html:<n>` 把章节渲染成 带 `<p>` 的片段,客户端只是把它塞进 shadow root。于是三件事同时不对。一是缩进 设定只对服务端已经渲染好的那份生效,windowed 路径拿到的 `chapter:<n>` 是纯字符 没有段落,同一个读者同一本书会因为走哪条传输而长得不一样。二是抓取来的文件里 用来当缩进的段前空格被原样留下,和读者的缩进叠加,恰好在最需要这个设定的文件 上看起来像没生效。三是这些设定是每台设备各自的阅读偏好,烧进响应就等于把每次 调整变成一次往返。另一件事是顶栏和底栏可以各自隐藏,读者收起导航后底栏仍压着 每一页的最后两行。 方案依据。把「一段是什么」收敛到客户端的唯一定义(`formats/segments.ts`), 本地加载、windowed、流式三条路都走它,服务端的职责缩小为交出完整章节和在原文 上断段。`ReaderView` 在渲染前对纯文本章节再过一遍这个拆分(按块读回、拼回空行 再拆,所以服务端断得对不对不影响观感),缩进、段间距、去掉段前空格因此无需请求 即可作用于两条路径。顶栏与前底栏由 `.reader-screen` 上的一个 `data-chrome` 统一 开关,收起时两条栏一起归零高度并滑出、正文长满整屏,同时右侧浮出一列快捷按钮, 否则收起工具栏会变成「必须离开才能操作」的状态。 放弃方案。把服务端的 `chapter-html` 直接删掉:`href` 同时是阅读位置的标识,且 `format: 'html'` 字段已是既有契约,删掉会让旧客户端与旧位置一起失效,所以保留 作为传输,只去掉它承担的排版职责。让缩进靠服务端属性(`data-indent`)继续驱动: 那正是「设定是响应的属性」这一问题的根源。收起态用两个独立开关:写法上就能只藏 一半,而这恰是读者报的那个 bug。 改动点。新增 `web/src/formats/segments.ts`(分段、去段前空格、HTML/节点两种形 式、跨 chunk 的 carry 判定);`reader-view.ts` 增加 `retypePlainText` 并去掉旧 排版表里读服务端属性的规则;`render/text.ts` 按 `carry` 拼接跨块段落;服务端 `text-html.ts` 去掉 `indent` 选项、不再截断;`reader-chrome.tsx` 增加侧边快捷列 与设置面板顶部的「快捷」一行;`reader.css` 增加两条栏的收放与按钮列样式;图标 集新增 `text-indent` / `text-type` / `spacing`;`docs/ui.md` 补 §3.7 的边界说明 与 §3.8 沉浸式阅读。 验证方式。`cd web && npm test`(369 条)、`cd server && npm test`(205 条)全绿; `npm run build` 通过;`npm run ui:review` 全绿,并新增「收起工具栏: 顶栏与底栏一 起走 / 都不|不可见 / 正文占满整屏 / 右侧仍有快捷按钮」四条尺寸断言(截图见 `docs/ui-review/03-reader-no-chrome.png`),评审夹具改用全角空格缩进,使「段前 空格被去掉」在截图上可见。 Ref: #34