@dongfangw/study-kit 0.0.0-stage → 0.1.0

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.
Files changed (110) hide show
  1. package/LICENSE +671 -0
  2. package/README.md +28 -2
  3. package/cordis.patch.yml +3 -0
  4. package/ext/adoc-convert/index.mjs +62 -0
  5. package/lib/client.js +5917 -0
  6. package/lib/client.js.map +1 -0
  7. package/lib/docsplit.d.ts +73 -0
  8. package/lib/docsplit.d.ts.map +1 -0
  9. package/lib/docsplit.js +241 -0
  10. package/lib/docsplit.js.map +1 -0
  11. package/lib/git.d.ts +29 -0
  12. package/lib/git.d.ts.map +1 -0
  13. package/lib/git.js +305 -0
  14. package/lib/git.js.map +1 -0
  15. package/lib/index.d.ts +10 -0
  16. package/lib/index.d.ts.map +1 -0
  17. package/lib/index.js +324 -0
  18. package/lib/index.js.map +1 -0
  19. package/lib/isolation.d.ts +33 -0
  20. package/lib/isolation.d.ts.map +1 -0
  21. package/lib/isolation.js +30 -0
  22. package/lib/isolation.js.map +1 -0
  23. package/lib/libraries.d.ts +36 -0
  24. package/lib/libraries.d.ts.map +1 -0
  25. package/lib/libraries.js +118 -0
  26. package/lib/libraries.js.map +1 -0
  27. package/lib/render.d.ts +22 -0
  28. package/lib/render.d.ts.map +1 -0
  29. package/lib/render.js +568 -0
  30. package/lib/render.js.map +1 -0
  31. package/lib/session.d.ts +23 -0
  32. package/lib/session.d.ts.map +1 -0
  33. package/lib/session.js +35 -0
  34. package/lib/session.js.map +1 -0
  35. package/lib/skills.d.ts +24 -0
  36. package/lib/skills.d.ts.map +1 -0
  37. package/lib/skills.js +111 -0
  38. package/lib/skills.js.map +1 -0
  39. package/lib/slidev.d.ts +13 -0
  40. package/lib/slidev.d.ts.map +1 -0
  41. package/lib/slidev.js +755 -0
  42. package/lib/slidev.js.map +1 -0
  43. package/lib/slidevBin.d.ts +7 -0
  44. package/lib/slidevBin.d.ts.map +1 -0
  45. package/lib/slidevBin.js +130 -0
  46. package/lib/slidevBin.js.map +1 -0
  47. package/lib/slidevEnv.d.ts +56 -0
  48. package/lib/slidevEnv.d.ts.map +1 -0
  49. package/lib/slidevEnv.js +702 -0
  50. package/lib/slidevEnv.js.map +1 -0
  51. package/lib/static.d.ts +8 -0
  52. package/lib/static.d.ts.map +1 -0
  53. package/lib/static.js +79 -0
  54. package/lib/static.js.map +1 -0
  55. package/lib/tools.d.ts +4 -0
  56. package/lib/tools.d.ts.map +1 -0
  57. package/lib/tools.js +160 -0
  58. package/lib/tools.js.map +1 -0
  59. package/lib/types/client/DocMarks.d.ts +76 -0
  60. package/lib/types/client/DocMarks.d.ts.map +1 -0
  61. package/lib/types/client/DocViewer.d.ts +21 -0
  62. package/lib/types/client/DocViewer.d.ts.map +1 -0
  63. package/lib/types/client/GitPanel.d.ts +20 -0
  64. package/lib/types/client/GitPanel.d.ts.map +1 -0
  65. package/lib/types/client/LibraryWorkspace.d.ts +5 -0
  66. package/lib/types/client/LibraryWorkspace.d.ts.map +1 -0
  67. package/lib/types/client/MyLibraries.d.ts +5 -0
  68. package/lib/types/client/MyLibraries.d.ts.map +1 -0
  69. package/lib/types/client/SlidevDeckViewer.d.ts +25 -0
  70. package/lib/types/client/SlidevDeckViewer.d.ts.map +1 -0
  71. package/lib/types/client/SlidevEnvPanel.d.ts +11 -0
  72. package/lib/types/client/SlidevEnvPanel.d.ts.map +1 -0
  73. package/lib/types/client/annotations.d.ts +161 -0
  74. package/lib/types/client/annotations.d.ts.map +1 -0
  75. package/lib/types/client/docEnhance.d.ts +55 -0
  76. package/lib/types/client/docEnhance.d.ts.map +1 -0
  77. package/lib/types/client/docKey.d.ts +22 -0
  78. package/lib/types/client/docKey.d.ts.map +1 -0
  79. package/lib/types/client/git.module.css.gen.d.ts +3 -0
  80. package/lib/types/client/git.module.css.gen.d.ts.map +1 -0
  81. package/lib/types/client/icons.d.ts +50 -0
  82. package/lib/types/client/icons.d.ts.map +1 -0
  83. package/lib/types/client/index.d.ts +12 -0
  84. package/lib/types/client/index.d.ts.map +1 -0
  85. package/lib/types/client/prose.d.ts +19 -0
  86. package/lib/types/client/prose.d.ts.map +1 -0
  87. package/lib/types/client/readerControls.d.ts +55 -0
  88. package/lib/types/client/readerControls.d.ts.map +1 -0
  89. package/lib/types/client/readerPrefs.d.ts +73 -0
  90. package/lib/types/client/readerPrefs.d.ts.map +1 -0
  91. package/lib/types/client/readingPos.d.ts +82 -0
  92. package/lib/types/client/readingPos.d.ts.map +1 -0
  93. package/lib/types/client/styles.module.css.gen.d.ts +3 -0
  94. package/lib/types/client/styles.module.css.gen.d.ts.map +1 -0
  95. package/lib/types/client/submitDraft.d.ts +29 -0
  96. package/lib/types/client/submitDraft.d.ts.map +1 -0
  97. package/lib/types/client/viewActive.d.ts +55 -0
  98. package/lib/types/client/viewActive.d.ts.map +1 -0
  99. package/lib/types/types.d.ts +351 -0
  100. package/lib/types/types.d.ts.map +1 -0
  101. package/lib/types.d.ts +351 -0
  102. package/lib/types.d.ts.map +1 -0
  103. package/lib/types.js +6 -0
  104. package/lib/types.js.map +1 -0
  105. package/package.json +101 -6
  106. package/skills/aero-concept-qa/SKILL.md +65 -0
  107. package/skills/aero-learning-path/SKILL.md +61 -0
  108. package/skills/aero-study-guide/SKILL.md +47 -0
  109. package/skills/aero-think/SKILL.md +59 -0
  110. package/skills/kb-organize/SKILL.md +73 -0
package/lib/render.js ADDED
@@ -0,0 +1,568 @@
1
+ import path from 'node:path';
2
+ import { execFile, execFileSync } from 'node:child_process';
3
+ import { existsSync, readFileSync, statSync } from 'node:fs';
4
+ import { createRequire } from 'node:module';
5
+ import { fileURLToPath } from 'node:url';
6
+ const require2 = createRequire(import.meta.url);
7
+ // ---------------------------------------------------------------------------
8
+ // 惰性加载重型渲染库(markdown-it / katex)。
9
+ //
10
+ // 这两个库只在真正渲染时加载,避免插件在 dsh 启动阶段引入顶层副作用。
11
+ // 注意 @asciidoctor/core **不在进程内加载**,见下面的 convertAsciidoc()。
12
+ // ---------------------------------------------------------------------------
13
+ let markdownItCtor = null;
14
+ function loadMarkdownIt() {
15
+ if (markdownItCtor === null)
16
+ markdownItCtor = require2('markdown-it');
17
+ return markdownItCtor;
18
+ }
19
+ let katexMod = null;
20
+ function loadKatex() {
21
+ if (katexMod === null)
22
+ katexMod = require2('katex');
23
+ return katexMod;
24
+ }
25
+ // ---------------------------------------------------------------------------
26
+ // AsciiDoc 渲染:**必须走子进程**(ext/adoc-convert/index.mjs)。
27
+ //
28
+ // `@asciidoctor/core` 的 Opal 运行时会改写内建原型链(实测 getPrototypeOf(Array.prototype)
29
+ // 不再等于 Object.prototype)。DSH 宿主用「无损 JSON」校验(dsh-util-values 的
30
+ // snapshotJsonValue)把关会话事件落盘,该校验会核对内建原型;一旦进程内被 Opal 改写,
31
+ // 该进程里**所有数组都不再是合法 JSON**,于是:
32
+ // · prompt 写不进会话日志 → 被包装成 session/agent-busy「prompt rejected」(学生端看到
33
+ // 「提问报错 agent busy」);
34
+ // · 新会话的 api-session/added 事件转发失败 → 新建会话失败。
35
+ // 首次打开任意 .adoc 教案即触发,事后恢复原型链又会破坏 Opal 自身调用,
36
+ // 因此唯一稳妥做法是把 asciidoctor 挡在宿主进程之外。
37
+ // ---------------------------------------------------------------------------
38
+ const ADOC_CONVERT_CLI = fileURLToPath(new URL('../ext/adoc-convert/index.mjs', import.meta.url));
39
+ /** 在独立子进程里把 AsciiDoc 源码渲染成 HTML(Opal 的原型污染不会回流宿主进程)。 */
40
+ function convertAsciidoc(text, options) {
41
+ const stdout = execFileSync(process.execPath, [ADOC_CONVERT_CLI], {
42
+ input: JSON.stringify({ text, options }),
43
+ encoding: 'utf8',
44
+ maxBuffer: 64 * 1024 * 1024,
45
+ windowsHide: true,
46
+ });
47
+ const outcome = JSON.parse(stdout);
48
+ if (outcome.ok !== true || typeof outcome.html !== 'string') {
49
+ throw new Error(outcome.error ?? 'asciidoctor 隔离执行器未返回 HTML');
50
+ }
51
+ return outcome.html;
52
+ }
53
+ /**
54
+ * 同上,但**异步**:`execFileSync` 会把宿主进程的 event loop 整个挡住(实测单篇教案
55
+ * 0.6–1.1 s),这期间 DSH 的会话流式输出、仿真、目录请求全部排队——用户看到的就是
56
+ * 「整个插件卡住」。宿主是单线程服务,渲染这种重活必须让出 event loop。
57
+ */
58
+ function convertAsciidocAsync(text, options) {
59
+ return new Promise((resolve, reject) => {
60
+ const child = execFile(process.execPath, [ADOC_CONVERT_CLI], { encoding: 'utf8', maxBuffer: 64 * 1024 * 1024, windowsHide: true }, (err, stdout) => {
61
+ if (err !== null) {
62
+ reject(err);
63
+ return;
64
+ }
65
+ try {
66
+ const outcome = JSON.parse(stdout);
67
+ if (outcome.ok !== true || typeof outcome.html !== 'string') {
68
+ reject(new Error(outcome.error ?? 'asciidoctor 隔离执行器未返回 HTML'));
69
+ return;
70
+ }
71
+ resolve(outcome.html);
72
+ }
73
+ catch (e) {
74
+ reject(e instanceof Error ? e : new Error(String(e)));
75
+ }
76
+ });
77
+ child.stdin?.end(JSON.stringify({ text, options }));
78
+ });
79
+ }
80
+ /** 读取 katex 的 dist 目录绝对路径(供静态路由伺服 CSS/字体)。 */
81
+ export function katexDistDir() {
82
+ const pkg = require2.resolve('katex/package.json');
83
+ return path.join(path.dirname(pkg), 'dist');
84
+ }
85
+ /** 读取 katex 的 CSS 文本。 */
86
+ let cachedKatexCss = null;
87
+ export function katexCss() {
88
+ if (cachedKatexCss === null) {
89
+ cachedKatexCss = readFileSync(path.join(katexDistDir(), 'katex.min.css'), 'utf8');
90
+ }
91
+ return cachedKatexCss;
92
+ }
93
+ // ---------------------------------------------------------------------------
94
+ // 轻量 HTML 消毒(教师内容可信,但仍剥离脚本/事件/危险协议)
95
+ // ---------------------------------------------------------------------------
96
+ function sanitizeHtml(html) {
97
+ return html
98
+ .replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi, '')
99
+ .replace(/<(iframe|object|embed|style)\b[^>]*>[\s\S]*?<\/\1\s*>/gi, '')
100
+ .replace(/<(iframe|object|embed)\b[^>]*\/?>/gi, '')
101
+ .replace(/\son\w+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/gi, '')
102
+ .replace(/(href|src)\s*=\s*(["'])\s*javascript:[^"']*\2/gi, '$1=$2#');
103
+ }
104
+ // ---------------------------------------------------------------------------
105
+ // 图片路径重写:相对路径 → /aero-kb/asset?p=<相对KB根的路径>
106
+ // ---------------------------------------------------------------------------
107
+ function resolveAsset(kbRoot, srcDir, src) {
108
+ let decoded = src;
109
+ try {
110
+ decoded = decodeURIComponent(src);
111
+ }
112
+ catch {
113
+ /* 保留原样 */
114
+ }
115
+ if (/^(https?:|data:|#|\/)/i.test(decoded))
116
+ return null;
117
+ if (decoded.includes('\0'))
118
+ return null;
119
+ const abs = path.resolve(srcDir, decoded);
120
+ const rel = path.relative(kbRoot, abs);
121
+ if (rel.startsWith('..') || path.isAbsolute(rel))
122
+ return null;
123
+ // 图片地址同时携带其所属 KB 根(root),使 asset 路由无需再猜会话 cwd。
124
+ return '/aero-kb/asset?p=' + encodeURIComponent(rel.replaceAll('\\', '/')) + '&root=' + encodeURIComponent(kbRoot);
125
+ }
126
+ // ---------------------------------------------------------------------------
127
+ // 文档间链接:相对 .adoc/.md(及 asciidoctor 改写的 .html)→ data-kbdoc 属性,
128
+ // 由 DocViewer 拦截为阅读器内导航(外审 P0-1:工作台原本只重写图片、不处理文档链接)。
129
+ // ---------------------------------------------------------------------------
130
+ function rewriteDocLinks(html, kbRoot, srcDir) {
131
+ return html.replace(/<a\b([^>]*)>/gi, (whole, attrs) => {
132
+ const m = /\bhref\s*=\s*"([^"]*)"/i.exec(attrs);
133
+ if (m === null)
134
+ return whole;
135
+ let href = m[1];
136
+ try {
137
+ href = decodeURIComponent(href);
138
+ }
139
+ catch {
140
+ /* 保留原样 */
141
+ }
142
+ if (/^(https?:|data:|mailto:|#|\/)/i.test(href))
143
+ return whole;
144
+ const clean = href.split('#')[0];
145
+ const candidates = /\.html$/i.test(clean)
146
+ ? [clean.replace(/\.html$/i, '.adoc'), clean.replace(/\.html$/i, '.md')]
147
+ : /\.(adoc|md)$/i.test(clean) ? [clean] : [];
148
+ let relPosix = null;
149
+ for (const c of candidates) {
150
+ const abs = path.resolve(srcDir, c);
151
+ const rel = path.relative(kbRoot, abs);
152
+ if (!rel.startsWith('..') && !path.isAbsolute(rel) && existsSync(abs)) {
153
+ relPosix = rel.replaceAll('\\', '/');
154
+ break;
155
+ }
156
+ }
157
+ if (relPosix === null)
158
+ return whole;
159
+ const kept = attrs.replace(/\bhref\s*=\s*"[^"]*"/i, 'href="#"');
160
+ return `<a${kept} data-kbdoc="${relPosix}">`;
161
+ });
162
+ }
163
+ function rewriteImgSrcs(html, kbRoot, srcDir) {
164
+ return html.replace(/<img\b([^>]*)>/gi, (_whole, attrs) => {
165
+ const rewritten = attrs.replace(/\bsrc\s*=\s*"([^"]*)"/i, (_m, src) => {
166
+ const url = resolveAsset(kbRoot, srcDir, src);
167
+ return url === null ? _m : `src="${url}"`;
168
+ });
169
+ return `<img${rewritten}>`;
170
+ });
171
+ }
172
+ // ---------------------------------------------------------------------------
173
+ // markdown-it:KaTeX 数学 + 标题锚点 + 章节收集
174
+ // ---------------------------------------------------------------------------
175
+ const CJK_RE = /[\u3000-\u303f\u3400-\u4dbf\u4e00-\u9fff\uff00-\uffef]/;
176
+ function escapeHtml(s) {
177
+ return s
178
+ .replace(/&/g, '&amp;')
179
+ .replace(/</g, '&lt;')
180
+ .replace(/>/g, '&gt;')
181
+ .replace(/"/g, '&quot;');
182
+ }
183
+ /**
184
+ * 渲染数学:cjkFallback=true(markdown 路径默认)时,含中文的 `$...$`
185
+ * (教材里常作强调用)按纯文本输出;adoc 路径传 false——其数学永远是真 LaTeX,
186
+ * 中文只出现在 \text{…} 内,KaTeX 可正常渲染,回退反而会把公式退化成源码文本。
187
+ *
188
+ * output 固定 `html`(不输出 MathML 副本):KaTeX 的 `htmlAndMathml` 会把每个公式
189
+ * 渲染两遍,文档正文里有上万个公式时(参考书单文件 1.2 万个公式),HTML 体积与
190
+ * DOM 节点数都翻倍——实测 22 MB / 54 万节点,浏览器直接卡死。可见排版完全由 HTML 那份
191
+ * 决定,去掉隐藏的 MathML 副本不改变任何视觉效果,只把体积砍掉约四成。
192
+ */
193
+ function renderTex(tex, displayMode, cjkFallback = true) {
194
+ if (cjkFallback && CJK_RE.test(tex))
195
+ return escapeHtml(tex);
196
+ return loadKatex().renderToString(tex, {
197
+ throwOnError: false,
198
+ strict: 'ignore',
199
+ displayMode,
200
+ output: 'html',
201
+ });
202
+ }
203
+ function slugify(title) {
204
+ const s = title
205
+ .toLowerCase()
206
+ .replace(/[^\p{L}\p{N}]+/gu, '-')
207
+ .replace(/^-+|-+$/g, '')
208
+ .slice(0, 40);
209
+ return s;
210
+ }
211
+ function texInline(state, silent) {
212
+ const src = state.src;
213
+ const start = state.pos;
214
+ if (src.charCodeAt(start) !== 0x24)
215
+ return false;
216
+ if (src.charCodeAt(start + 1) === 0x24)
217
+ return false;
218
+ let end = -1;
219
+ for (let i = start + 1; i < src.length; i++) {
220
+ const c = src.charCodeAt(i);
221
+ if (c === 0x24) {
222
+ end = i;
223
+ break;
224
+ }
225
+ if (c === 0x0a)
226
+ return false;
227
+ }
228
+ if (end === -1)
229
+ return false;
230
+ const tex = src.slice(start + 1, end).trim();
231
+ if (tex.length === 0 || tex.length > 2000)
232
+ return false;
233
+ if (!silent) {
234
+ const token = state.push('aero_math_inline', '', 0);
235
+ token.content = tex;
236
+ }
237
+ state.pos = end + 1;
238
+ return true;
239
+ }
240
+ function texBlock(state, startLine, endLine, silent) {
241
+ const startPos = state.bMarks[startLine] + state.tShift[startLine];
242
+ const max = state.eMarks[startLine];
243
+ const lineText = state.src.slice(startPos, max);
244
+ const opener = lineText.indexOf('$$');
245
+ if (opener === -1)
246
+ return false;
247
+ // 只认以 $$ 开头的块(避免把段落中间出现的 $$ 误判)
248
+ if (lineText.slice(0, opener).trim() !== '')
249
+ return false;
250
+ let content;
251
+ let nextLine;
252
+ const after = lineText.slice(opener + 2);
253
+ const singleClose = after.indexOf('$$');
254
+ if (singleClose !== -1) {
255
+ content = after.slice(0, singleClose);
256
+ nextLine = startLine;
257
+ }
258
+ else {
259
+ content = after + '\n';
260
+ nextLine = -1;
261
+ for (let i = startLine + 1; i < endLine; i++) {
262
+ const t = state.src.slice(state.bMarks[i] + state.tShift[i], state.eMarks[i]);
263
+ const close = t.indexOf('$$');
264
+ if (close !== -1) {
265
+ content += t.slice(0, close);
266
+ nextLine = i;
267
+ break;
268
+ }
269
+ content += t + '\n';
270
+ }
271
+ if (nextLine === -1)
272
+ return false;
273
+ }
274
+ if (silent)
275
+ return true;
276
+ const token = state.push('aero_math_block', 'div', 0);
277
+ token.map = [startLine, nextLine + 1];
278
+ token.content = content.trim();
279
+ state.line = nextLine + 1;
280
+ return true;
281
+ }
282
+ /** 收集标题(core rule):给 heading 注入 id,并登记到 sections。 */
283
+ function headingCore(state, sections) {
284
+ const tokens = state.tokens;
285
+ let counter = 0;
286
+ for (let i = 0; i < tokens.length; i++) {
287
+ const t = tokens[i];
288
+ if (t.type === 'heading_open') {
289
+ const level = Number(t.tag.slice(1));
290
+ // 收集 inline 文本
291
+ let text = '';
292
+ for (let j = i + 1; j < tokens.length; j++) {
293
+ const k = tokens[j];
294
+ if (k.type === 'heading_close')
295
+ break;
296
+ if (k.type === 'inline')
297
+ text += k.content;
298
+ else if (k.type === 'text')
299
+ text += k.content;
300
+ }
301
+ const slug = slugify(text) || 'section';
302
+ const id = `sec-${counter}-${slug}`;
303
+ t.attrSet('id', id);
304
+ sections.push({ id, title: text.replace(/\s+/g, ' ').trim(), level });
305
+ counter++;
306
+ }
307
+ }
308
+ }
309
+ function createMarkdownIt() {
310
+ const md = new (loadMarkdownIt())({ html: true, linkify: false, breaks: false, typographer: false });
311
+ md.inline.ruler.after('escape', 'aero_math_inline', texInline);
312
+ md.block.ruler.before('fence', 'aero_math_block', texBlock);
313
+ md.renderer.rules.aero_math_inline = (tokens, idx) => `<span class="aero-math-inline">${renderTex(tokens[idx].content, false)}</span>`;
314
+ md.renderer.rules.aero_math_block = (tokens, idx) => `<div class="aero-math-block">${renderTex(tokens[idx].content, true)}</div>`;
315
+ const sections = [];
316
+ md.core.ruler.push('aero_heading', (state) => headingCore(state, sections));
317
+ // 图片路径改写放在 render 后处理,避免侵入 markdown-it
318
+ return { md, sections };
319
+ }
320
+ // ---------------------------------------------------------------------------
321
+ // AsciiDoc:latexmath/asciimath/stem 数学 → 占位符 → KaTeX(避开宏 API 差异)
322
+ // 覆盖两种形态:行内宏 latexmath:[…]/stem:[…];显示公式块 [stem]++++…++++。
323
+ // 后者 Asciidoctor 会原样输出 \[…\] 文本,必须在 convert 前整块占位。
324
+ // ---------------------------------------------------------------------------
325
+ /** 去掉 `$`/`$$` 定界符,保留 `\$` 转义(货币等字面美元)。 */
326
+ function stripMathDelimiters(target) {
327
+ return target
328
+ .replace(/\\\$/g, '\u0000DOLLAR\u0000')
329
+ .replace(/\$/g, '')
330
+ .replace(/\u0000DOLLAR\u0000/g, '\\$');
331
+ }
332
+ const ADOC_MATH_RE = /(?:latexmath|asciimath|stem):\[/g;
333
+ /** [stem](或带属性)+ ++++…++++ 开放块;捕获块体 LaTeX。 */
334
+ const ADOC_STEM_BLOCK_RE = /^[ \t]*\[stem[^\]]*\][ \t]*\r?\n\+\+\+\+[ \t]*\r?\n([\s\S]*?)\r?\n\+\+\+\+[ \t]*(?=\r?\n|$)/gm;
335
+ const INLINE_MATH_PH = (i) => `AEROMATHPLACEHOLDER${i}AEROMATH`;
336
+ const BLOCK_MATH_PH = (i) => `AEROMATHDISPLAY${i}AEROMATH`;
337
+ /**
338
+ * 行内数学宏体提取:从 `宏名:[` 之后的第一个字符开始,按方括号深度找配对的 `]`。
339
+ * 公式体内常见 `\left[…\right]`、`\\[10pt]` 等嵌套/成对方括号,
340
+ * 简单的 `[^\]]*` 会在第一个 `]` 处截断公式(渲染出残缺红字 + 尾部乱码)。
341
+ * 跨越空行(段落边界)仍未闭合时,回退为本段首个 `]`(旧行为)。
342
+ */
343
+ function scanAdocInlineMathBody(text, open) {
344
+ let depth = 1;
345
+ for (let i = open; i < text.length; i++) {
346
+ const ch = text[i];
347
+ if (ch === '\n' && text[i + 1] === '\n')
348
+ break;
349
+ if (ch === '[')
350
+ depth++;
351
+ else if (ch === ']') {
352
+ depth--;
353
+ if (depth === 0)
354
+ return { body: text.slice(open, i), next: i + 1 };
355
+ }
356
+ }
357
+ const end = text.indexOf(']', open);
358
+ return end === -1 ? null : { body: text.slice(open, end), next: end + 1 };
359
+ }
360
+ function preprocessAsciidocMath(src) {
361
+ const math = [];
362
+ const blockMath = [];
363
+ // 先整块占位显示公式块,再处理行内宏,避免块体内容被行内扫描误切。
364
+ let text = src.replace(ADOC_STEM_BLOCK_RE, (_whole, body) => {
365
+ const tex = stripMathDelimiters(body.trim());
366
+ const idx = blockMath.length;
367
+ blockMath.push(tex);
368
+ return BLOCK_MATH_PH(idx);
369
+ });
370
+ let out = '';
371
+ let last = 0;
372
+ for (let m = ADOC_MATH_RE.exec(text); m !== null; m = ADOC_MATH_RE.exec(text)) {
373
+ const scanned = scanAdocInlineMathBody(text, m.index + m[0].length);
374
+ if (scanned === null)
375
+ continue;
376
+ const tex = stripMathDelimiters(scanned.body.trim());
377
+ out += text.slice(last, m.index) + INLINE_MATH_PH(math.length);
378
+ math.push(tex);
379
+ last = scanned.next;
380
+ ADOC_MATH_RE.lastIndex = scanned.next;
381
+ }
382
+ out += text.slice(last);
383
+ return { text: out, math, blockMath };
384
+ }
385
+ function postprocessAsciidocMath(html, math, blockMath) {
386
+ for (let i = 0; i < math.length; i++) {
387
+ const rendered = renderTex(math[i], false, false);
388
+ html = html.replaceAll(INLINE_MATH_PH(i), `<span class="aero-math-inline">${rendered}</span>`);
389
+ }
390
+ // 显示公式块走 KaTeX displayMode(\tag{} 等仅在 display 模式受支持)。
391
+ // 占位符独占一段时先剥掉 <p> 壳,避免输出 <p><div…></div></p> 非法嵌套;
392
+ // 与其他文字同段时(列表 + 续行场景)用 </p>…<p> 切分,保持两段合法 HTML。
393
+ for (let i = 0; i < blockMath.length; i++) {
394
+ const rendered = renderTex(blockMath[i], true, false);
395
+ const div = `<div class="aero-math-block">${rendered}</div>`;
396
+ const wrapped = new RegExp(`<p>\\s*${BLOCK_MATH_PH(i)}\\s*</p>`);
397
+ html = wrapped.test(html) ? html.replace(wrapped, div) : html.replaceAll(BLOCK_MATH_PH(i), `</p>${div}<p>`);
398
+ }
399
+ return html;
400
+ }
401
+ function extractSectionsFromHtml(html) {
402
+ const sections = [];
403
+ const re = /<h([1-6])\b([^>]*)>([\s\S]*?)<\/h\1>/gi;
404
+ let m;
405
+ let counter = 0;
406
+ while ((m = re.exec(html)) !== null) {
407
+ const level = Number(m[1]);
408
+ const attrs = m[2] ?? '';
409
+ const idMatch = /\bid="([^"]*)"/i.exec(attrs);
410
+ const rawTitle = m[3] ?? '';
411
+ const title = rawTitle.replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim();
412
+ const id = idMatch?.[1] ?? `sec-${counter}-${slugify(title) || 'section'}`;
413
+ sections.push({ id, title, level });
414
+ counter++;
415
+ }
416
+ return sections;
417
+ }
418
+ export function renderMarkdown(text, ctx) {
419
+ const { md, sections } = createMarkdownIt();
420
+ let html = md.render(text);
421
+ html = rewriteImgSrcs(html, ctx.kbRoot, ctx.srcDir);
422
+ html = rewriteDocLinks(html, ctx.kbRoot, ctx.srcDir);
423
+ html = sanitizeHtml(html);
424
+ const title = sections[0]?.title ?? ctx.relPath;
425
+ return { ok: true, kind: 'md', title, html, sections };
426
+ }
427
+ export function renderAsciidoc(text, ctx) {
428
+ return finishAsciidoc(convertAsciidoc, text, ctx);
429
+ }
430
+ /**
431
+ * AsciiDoc 渲染(异步版):宿主 /doc 路由走这一条,让出 event loop。
432
+ * 除 asciidoctor 子进程调用外的步骤与同步版完全一致,逻辑只写一份。
433
+ */
434
+ export async function renderAsciidocAsync(text, ctx) {
435
+ const { text: preprocessed, math, blockMath } = preprocessAsciidocMath(text);
436
+ let html;
437
+ try {
438
+ html = await convertAsciidocAsync(preprocessed, {
439
+ safe: 'unsafe',
440
+ attributes: { 'source-highlighter': '', 'icons': 'font', 'showtitle': true },
441
+ });
442
+ }
443
+ catch (err) {
444
+ return { ok: false, kind: 'adoc', title: ctx.relPath, html: '', sections: [], error: err instanceof Error ? err.message : String(err) };
445
+ }
446
+ return finishAsciidocHtml(html, math, blockMath, ctx);
447
+ }
448
+ function finishAsciidoc(convert, text, ctx) {
449
+ const { text: preprocessed, math, blockMath } = preprocessAsciidocMath(text);
450
+ let html;
451
+ try {
452
+ html = convert(preprocessed, {
453
+ safe: 'unsafe',
454
+ attributes: { 'source-highlighter': '', 'icons': 'font', 'showtitle': true },
455
+ });
456
+ }
457
+ catch (err) {
458
+ return { ok: false, kind: 'adoc', title: ctx.relPath, html: '', sections: [], error: err instanceof Error ? err.message : String(err) };
459
+ }
460
+ return finishAsciidocHtml(html, math, blockMath, ctx);
461
+ }
462
+ /** AsciiDoc 渲染的公共收尾:数学占位符回填 → 图片/链接重写 → 消毒 → 收集标题。 */
463
+ function finishAsciidocHtml(html0, math, blockMath, ctx) {
464
+ let html = postprocessAsciidocMath(html0, math, blockMath);
465
+ html = rewriteImgSrcs(html, ctx.kbRoot, ctx.srcDir);
466
+ html = rewriteDocLinks(html, ctx.kbRoot, ctx.srcDir);
467
+ html = sanitizeHtml(html);
468
+ const sections = extractSectionsFromHtml(html);
469
+ const title = sections[0]?.title ?? ctx.relPath;
470
+ return { ok: true, kind: 'adoc', title, html, sections };
471
+ }
472
+ // ---------------------------------------------------------------------------
473
+ // Slidev slides.md → 每页渲染
474
+ // ---------------------------------------------------------------------------
475
+ const SLIDE_SCRIPT_RE = /<script\b[^>]*>[\s\S]*?<\/script\s*>/gi;
476
+ const SLIDE_STYLE_RE = /<style\b[^>]*>[\s\S]*?<\/style\s*>/gi;
477
+ function stripVueDirectives(chunk) {
478
+ return chunk
479
+ .replace(/\s+v-[\w-]+(?:="[^"]*")?/g, '')
480
+ .replace(/\s+:[\w-]+="[^"]*"/g, '')
481
+ .replace(/\s+@[\w-]+(?:="[^"]*")?/g, '')
482
+ .replace(/\{\{[\s\S]*?\}\}/g, '')
483
+ .replace(/<transition[^>]*>[\s\S]*?<\/transition>/g, '')
484
+ .replace(/<component\b[^>]*\/?>/g, '');
485
+ }
486
+ function stripSlideFrontmatter(chunk) {
487
+ const lines = chunk.split(/\r?\n/);
488
+ if ((lines[0] ?? '').trim() === '---') {
489
+ let i = 1;
490
+ while (i < lines.length && lines[i].trim() !== '---')
491
+ i++;
492
+ return lines.slice(i + 1).join('\n');
493
+ }
494
+ return chunk;
495
+ }
496
+ /** 从 deck 前置 YAML 提取 title。 */
497
+ function deckTitle(text) {
498
+ const m = /(?:^|\n)\s*title:\s*(.+)\s*$/m.exec(text.slice(0, 2048));
499
+ if (m === null)
500
+ return null;
501
+ return m[1].trim().replace(/^['"]|['"]$/g, '');
502
+ }
503
+ export function renderSlidesMd(text, ctx) {
504
+ const title = deckTitle(text) ?? ctx.relPath;
505
+ const lines = text.split(/\r?\n/);
506
+ let i = 0;
507
+ // 去掉整份 deck 的前置 YAML frontmatter
508
+ if ((lines[0] ?? '').trim() === '---') {
509
+ i = 1;
510
+ while (i < lines.length && lines[i].trim() !== '---')
511
+ i++;
512
+ i++;
513
+ }
514
+ const chunks = [];
515
+ let cur = [];
516
+ for (; i < lines.length; i++) {
517
+ if (lines[i].trim() === '---') {
518
+ chunks.push(cur.join('\n'));
519
+ cur = [];
520
+ }
521
+ else {
522
+ cur.push(lines[i]);
523
+ }
524
+ }
525
+ if (cur.join('\n').trim() !== '')
526
+ chunks.push(cur.join('\n'));
527
+ const { md } = createMarkdownIt();
528
+ const slides = [];
529
+ for (const chunk of chunks) {
530
+ const stripped = stripSlideFrontmatter(chunk)
531
+ .replace(SLIDE_SCRIPT_RE, '')
532
+ .replace(SLIDE_STYLE_RE, '');
533
+ const cleaned = stripVueDirectives(stripped).trim();
534
+ if (cleaned === '')
535
+ continue;
536
+ let html = md.render(cleaned);
537
+ html = rewriteImgSrcs(html, ctx.kbRoot, ctx.srcDir);
538
+ html = rewriteDocLinks(html, ctx.kbRoot, ctx.srcDir);
539
+ html = sanitizeHtml(html);
540
+ slides.push(html);
541
+ }
542
+ if (slides.length === 0) {
543
+ return { ok: false, title, slides: [], error: '未解析到任何幻灯片' };
544
+ }
545
+ return { ok: true, title, slides };
546
+ }
547
+ /** 读取 KB 内文件(限制大小),返回文本或 null。 */
548
+ export function readKbText(kbRoot, rel, maxBytes = 4 * 1024 * 1024) {
549
+ const abs = path.resolve(kbRoot, rel);
550
+ const rootWithSep = kbRoot.endsWith(path.sep) ? kbRoot : kbRoot + path.sep;
551
+ if (!abs.startsWith(rootWithSep))
552
+ return null;
553
+ if (!existsSync(abs))
554
+ return null;
555
+ let st;
556
+ try {
557
+ st = statSync(abs);
558
+ }
559
+ catch {
560
+ return null;
561
+ }
562
+ if (!st.isFile())
563
+ return null;
564
+ if (st.size > maxBytes)
565
+ return null;
566
+ return readFileSync(abs, 'utf8');
567
+ }
568
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * 会话级解析缓存:把"当前会话该看哪几个库、以什么身份看"解析一次并短时缓存。
3
+ *
4
+ * 缓存键是会话 cwd;TTL 30s,`libraries.yaml` / `library.yaml` 改了就靠 TTL 自动失效
5
+ * (比到处手动 invalidate 可靠;目录扫描本身有 200ms 级开销,30s 足够安全)。
6
+ */
7
+ import type { Viewer } from '@aero/library-core';
8
+ import { type ResolvedWorkspace } from './libraries.ts';
9
+ export interface Resolved {
10
+ readonly cwd: string;
11
+ readonly viewer: Viewer;
12
+ readonly workspace: ResolvedWorkspace;
13
+ readonly at: number;
14
+ }
15
+ /** 当前身份:教师 profile 还是学生。旧环境变量 `AERO_TEACHER_MODE` 继续认(兼容期)。 */
16
+ export declare function currentViewer(): Viewer;
17
+ /** 取(或重算)某会话 cwd 的解析结果。解析不到返回 null。 */
18
+ export declare function resolveFor(cwd: string | null | undefined, force?: boolean): Resolved | null;
19
+ /** 只读缓存(工具里用;不触发解析)。 */
20
+ export declare function lookResolved(cwd: string | null | undefined): Resolved | null;
21
+ /** 强制清空(`libraries.yaml` 被改动、或 pull 成功后调用)。 */
22
+ export declare function invalidate(): void;
23
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEzE,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAA;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CACpB;AAKD,+DAA+D;AAC/D,wBAAgB,aAAa,IAAI,MAAM,CAKtC;AAED,uCAAuC;AACvC,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,UAAQ,GAAG,QAAQ,GAAG,IAAI,CAYzF;AAED,wBAAwB;AACxB,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAE5E;AAED,+CAA+C;AAC/C,wBAAgB,UAAU,IAAI,IAAI,CAEjC"}