@ggboy123/dsh-paper-reader 1.5.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/mineru.js +5 -2
- package/dist/search.js +11 -3
- package/package.json +2 -1
- package/reader/index.html +8 -1
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
**English**: [README_EN.md](README_EN.md)
|
|
9
9
|
|
|
10
|
-
[DeepSeek Harness (dsh)](https://github.com/deepseek-ai/deepseek-harness) 插件:**论文伴读工作台** —— 文献库 + PDF 阅读器 + AI 伴读,回答自带页码、点页码跳回原文。当前版本 **v1.5.
|
|
10
|
+
[DeepSeek Harness (dsh)](https://github.com/deepseek-ai/deepseek-harness) 插件:**论文伴读工作台** —— 文献库 + PDF 阅读器 + AI 伴读,回答自带页码、点页码跳回原文。当前版本 **v1.5.1**。
|
|
11
11
|
|
|
12
12
|
> 💬 **QQ 交流群:1127244508** —— 安装/使用问题、功能建议、bug 反馈都欢迎来聊。
|
|
13
13
|
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
- 💬 **带页码的伴读**:回答必带页码,点页码跳回原文并高亮;选中文字即问;支持历史对话
|
|
24
24
|
- 🤖 **教练式带读**:专用 preset 定分步阅读计划、逐节指导、出题批改,学习进度跨会话累积
|
|
25
25
|
- 🀄 **一键中文版**:原文 ↔ 纯中文原地切换,译文 PDF 一键导出(纯中文 / 中英对照),翻译引擎零预装自动安装
|
|
26
|
-
- 🈯 **划词翻译(公式保留)**(v1.5.
|
|
27
|
-
- 🖥️ **中英对照 / 分屏**(v1.5.
|
|
26
|
+
- 🈯 **划词翻译(公式保留)**(v1.5.1):选中点「译」出纯译文气泡;选区含公式时用 MinerU 识别的 LaTeX 替换文本层乱码、要求模型原样保留
|
|
27
|
+
- 🖥️ **中英对照 / 分屏**(v1.5.1):并排对照页或左右分屏同步滚动,随时切换、按文献记忆
|
|
28
28
|
- 🗂️ **文献管理**:专题/论文改名、删除进回收站可恢复
|
|
29
29
|
- ➕ **可选增强**(默认关):MinerU 解析——扫描件可读、公式可点引用可检索;嵌入端点——大白话命中术语段落
|
|
30
30
|
|
package/dist/mineru.js
CHANGED
|
@@ -64,8 +64,7 @@ function redactSecret(msg, secret) {
|
|
|
64
64
|
* 导出供 `mineru-config.ts` 的预检复用(预检也会把响应体片段拼进错误,见 F-R2-1)。
|
|
65
65
|
*/
|
|
66
66
|
export function sanitizeDetail(msg, secret = '') {
|
|
67
|
-
const out = redactSecret(msg, secret)
|
|
68
|
-
return out
|
|
67
|
+
const out = redactSecret(msg, secret)
|
|
69
68
|
// Bearer 之后只吃到「不可能属于令牌」的字符为止:不要把紧跟的 ) ] } , ; 引号 一起吃掉(验证报告 O4)
|
|
70
69
|
.replace(/Bearer\s+[^\s)\]}>"',;]+/gi, 'Bearer [redacted]')
|
|
71
70
|
.replace(/\bsk-[A-Za-z0-9_-]{4,}\b/g, '[redacted]')
|
|
@@ -73,6 +72,10 @@ export function sanitizeDetail(msg, secret = '') {
|
|
|
73
72
|
.replace(/\s+/g, ' ')
|
|
74
73
|
.trim()
|
|
75
74
|
.slice(0, 240);
|
|
75
|
+
// 截断同样不能落在代理对中间:错误详情会进 tool result / 模型上下文,孤立代理项会让
|
|
76
|
+
// 宿主的请求整轮 400(issue #9 同类)。宁可短 1 个码元。
|
|
77
|
+
const last = out.charCodeAt(out.length - 1);
|
|
78
|
+
return last >= 0xd800 && last <= 0xdbff ? out.slice(0, -1) : out;
|
|
76
79
|
}
|
|
77
80
|
function isRecord(v) {
|
|
78
81
|
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
package/dist/search.js
CHANGED
|
@@ -30,9 +30,17 @@ export function chunkText(text, size = 1500) {
|
|
|
30
30
|
while (rest.length > size) {
|
|
31
31
|
if (cur.length > 0)
|
|
32
32
|
flush(restStart);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
// 硬切回退到码点边界:slice 按 UTF-16 码元计数,切点若落在代理对中间(数学论文的
|
|
34
|
+
// LaTeX 斜体全在 U+1D400 区段,如 𝑋 = D835 DC4B),前后片段就各带一个孤立代理项。
|
|
35
|
+
// 片段文本经 search_paper 原样返回 → 留在会话历史 → 宿主之后每一轮模型请求都
|
|
36
|
+
// 400 INVALID_REQUEST,整条会话报废(issue #9)。宁可片段短 1 个码元,绝不切开代理对。
|
|
37
|
+
let cut = size;
|
|
38
|
+
const beforeCut = rest.charCodeAt(cut - 1);
|
|
39
|
+
if (beforeCut >= 0xd800 && beforeCut <= 0xdbff && cut > 1)
|
|
40
|
+
cut -= 1;
|
|
41
|
+
chunks.push({ index: chunks.length + 1, start: restStart, end: restStart + cut, text: rest.slice(0, cut) });
|
|
42
|
+
rest = rest.slice(cut);
|
|
43
|
+
restStart += cut;
|
|
36
44
|
}
|
|
37
45
|
if (rest !== '') {
|
|
38
46
|
if (cur.length > 0)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ggboy123/dsh-paper-reader",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"description": "DeepSeek Harness 插件:论文伴读工作台 — PDF 转录 / 检索 / 原生对话伴读 + 内置阅读器页面。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
"pretest": "npm run build",
|
|
49
49
|
"test": "node --test --test-timeout=60000 --test-concurrency=1 \"test/*.test.mjs\"",
|
|
50
50
|
"smoke:engine": "node scripts/engine-smoke.mjs",
|
|
51
|
+
"release": "node scripts/release.mjs",
|
|
51
52
|
"prepublishOnly": "tsc -p tsconfig.json"
|
|
52
53
|
},
|
|
53
54
|
"keywords": [
|
package/reader/index.html
CHANGED
|
@@ -1757,7 +1757,14 @@ function buildChunks(chars, itemsByPage) {
|
|
|
1757
1757
|
if (room <= 0) break;
|
|
1758
1758
|
let s = payload;
|
|
1759
1759
|
const cap = c.kind === 'text' ? Math.min(MAX_SELECTION_CHARS, room) : room;
|
|
1760
|
-
if (s.length > cap)
|
|
1760
|
+
if (s.length > cap) {
|
|
1761
|
+
// 截断回退到码点边界:slice 按 UTF-16 码元计数,切开代理对(数学斜体 𝑋 等)会让
|
|
1762
|
+
// 翻译请求带孤立代理项、上游整轮 400(issue #9 同类)。宁可短 1 个码元。
|
|
1763
|
+
let cut = cap;
|
|
1764
|
+
const before = s.charCodeAt(cut - 1);
|
|
1765
|
+
if (before >= 0xd800 && before <= 0xdbff && cut > 1) cut -= 1;
|
|
1766
|
+
s = s.slice(0, cut);
|
|
1767
|
+
}
|
|
1761
1768
|
if (!s) continue;
|
|
1762
1769
|
total += s.length;
|
|
1763
1770
|
capped.push(c.kind === 'text' ? { page: c.page, kind: 'text', text: s } : { page: c.page, kind: 'formula', latex: s });
|