@lemoncat7/dsh-knowledge 2.3.0 → 2.3.2

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 (52) hide show
  1. package/README.md +12 -4
  2. package/docs/architecture.md +1 -1
  3. package/lib/api.d.ts +2 -0
  4. package/lib/api.d.ts.map +1 -1
  5. package/lib/api.js +93 -0
  6. package/lib/api.js.map +1 -1
  7. package/lib/client.js +1 -1
  8. package/lib/client.js.map +1 -1
  9. package/lib/config.d.ts +2 -0
  10. package/lib/config.d.ts.map +1 -1
  11. package/lib/config.js +26 -0
  12. package/lib/config.js.map +1 -1
  13. package/lib/extraction.js +9 -2
  14. package/lib/extraction.js.map +1 -1
  15. package/lib/index.d.ts.map +1 -1
  16. package/lib/index.js +15 -1
  17. package/lib/index.js.map +1 -1
  18. package/lib/notes/domain.d.ts +8 -0
  19. package/lib/notes/domain.d.ts.map +1 -1
  20. package/lib/notes/domain.js.map +1 -1
  21. package/lib/notes/share-import.d.ts +50 -0
  22. package/lib/notes/share-import.d.ts.map +1 -0
  23. package/lib/notes/share-import.js +344 -0
  24. package/lib/notes/share-import.js.map +1 -0
  25. package/lib/notes/share-markdown.d.ts +12 -0
  26. package/lib/notes/share-markdown.d.ts.map +1 -0
  27. package/lib/notes/share-markdown.js +79 -0
  28. package/lib/notes/share-markdown.js.map +1 -0
  29. package/lib/notes/share-page.d.ts +12 -0
  30. package/lib/notes/share-page.d.ts.map +1 -0
  31. package/lib/notes/share-page.js +176 -0
  32. package/lib/notes/share-page.js.map +1 -0
  33. package/lib/notes/store.d.ts +15 -1
  34. package/lib/notes/store.d.ts.map +1 -1
  35. package/lib/notes/store.js +177 -6
  36. package/lib/notes/store.js.map +1 -1
  37. package/lib/web-note-editor-selection.d.ts.map +1 -1
  38. package/lib/web-note-editor-selection.js +23 -0
  39. package/lib/web-note-editor-selection.js.map +1 -1
  40. package/lib/web.d.ts.map +1 -1
  41. package/lib/web.js +7 -6
  42. package/lib/web.js.map +1 -1
  43. package/package.json +2 -2
  44. package/web/app.js +303 -29
  45. package/web/index.html +1 -2
  46. package/web/note-editor.js +64 -64
  47. package/web/styles.css +168 -291
  48. package/lib/web-workspace-effects.d.ts +0 -13
  49. package/lib/web-workspace-effects.d.ts.map +0 -1
  50. package/lib/web-workspace-effects.js +0 -366
  51. package/lib/web-workspace-effects.js.map +0 -1
  52. package/web/workspace-effects.js +0 -16
@@ -0,0 +1,344 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { lookup } from 'node:dns/promises';
3
+ import { request as requestHttp } from 'node:http';
4
+ import { request as requestHttps } from 'node:https';
5
+ import { isIP } from 'node:net';
6
+ const SHARE_TOKEN_PATTERN = /^share_[A-Za-z0-9_-]{32}$/;
7
+ const MAX_MANIFEST_BYTES = 2 * 1024 * 1024;
8
+ const MAX_IMPORT_FILE_BYTES = 64 * 1024 * 1024;
9
+ const MAX_IMPORT_TOTAL_BYTES = 256 * 1024 * 1024;
10
+ const MAX_IMPORT_NODES = 500;
11
+ const REQUEST_TIMEOUT_MS = 20_000;
12
+ export function createNoteShareManifest(share, nodes, truncated) {
13
+ const paths = relativePaths(share.node, nodes);
14
+ const manifestNodes = nodes.map(node => ({
15
+ id: node.id,
16
+ path: paths.get(node.id) ?? node.name,
17
+ kind: node.kind,
18
+ mediaType: node.mediaType,
19
+ size: node.size,
20
+ sha256: node.sha256,
21
+ }));
22
+ const files = manifestNodes.filter(node => node.kind !== 'folder');
23
+ return {
24
+ version: 1,
25
+ share: {
26
+ name: share.node.name,
27
+ kind: share.node.kind,
28
+ updatedAt: share.node.updatedAt,
29
+ nodeCount: manifestNodes.length,
30
+ fileCount: files.length,
31
+ totalSize: files.reduce((total, node) => total + node.size, 0),
32
+ },
33
+ nodes: manifestNodes,
34
+ truncated,
35
+ };
36
+ }
37
+ export async function inspectNoteShareUrl(rawUrl, store, policy = {}) {
38
+ const url = canonicalShareUrl(rawUrl);
39
+ const localShare = store?.getShareByToken(shareToken(url));
40
+ if (localShare !== undefined) {
41
+ const localNodes = localShare.node.kind === 'folder' ? store.listSharedSubtree(localShare.noteId, 501) : [localShare.node];
42
+ const truncated = localNodes.length > 500;
43
+ return { url: url.href, manifest: createNoteShareManifest(localShare, localNodes.slice(0, 500), truncated) };
44
+ }
45
+ const payload = await requestPublicUrl(new URL(`${url.href}/manifest`), MAX_MANIFEST_BYTES, policy);
46
+ return { url: url.href, manifest: validateManifest(JSON.parse(payload.toString('utf8'))) };
47
+ }
48
+ export async function importNoteShare(store, rawUrl, parentId, policy = {}) {
49
+ const canonical = canonicalShareUrl(rawUrl);
50
+ const localShare = store.getShareByToken(shareToken(canonical));
51
+ if (localShare !== undefined) {
52
+ const nodes = localShare.node.kind === 'folder' ? store.listSharedSubtree(localShare.noteId, MAX_IMPORT_NODES + 1) : [localShare.node];
53
+ if (nodes.length > MAX_IMPORT_NODES)
54
+ throw inputError('分享目录超过 500 项,暂时不能导入');
55
+ const root = await store.copy(localShare.noteId, parentId);
56
+ const files = nodes.filter(node => node.kind !== 'folder');
57
+ return {
58
+ root,
59
+ importedNodes: nodes.length,
60
+ importedFiles: files.length,
61
+ totalBytes: files.reduce((total, node) => total + node.size, 0),
62
+ };
63
+ }
64
+ const { url, manifest } = await inspectNoteShareUrl(canonical.href, undefined, policy);
65
+ if (manifest.truncated)
66
+ throw inputError('分享目录超过 500 项,暂时不能导入');
67
+ if (manifest.nodes.length === 0)
68
+ throw inputError('分享中没有可导入的内容');
69
+ const rootManifest = manifest.nodes.find(node => node.path === manifest.share.name);
70
+ if (rootManifest === undefined || rootManifest.kind !== manifest.share.kind)
71
+ throw inputError('分享清单缺少有效的根项目');
72
+ const createdByPath = new Map();
73
+ let root;
74
+ let importedFiles = 0;
75
+ let totalBytes = 0;
76
+ try {
77
+ const ordered = [...manifest.nodes].sort((left, right) => {
78
+ const depth = pathDepth(left.path) - pathDepth(right.path);
79
+ if (depth !== 0)
80
+ return depth;
81
+ if (left.kind === 'folder' && right.kind !== 'folder')
82
+ return -1;
83
+ if (left.kind !== 'folder' && right.kind === 'folder')
84
+ return 1;
85
+ return left.path.localeCompare(right.path, 'zh-CN');
86
+ });
87
+ for (const item of ordered) {
88
+ const name = pathName(item.path);
89
+ const parentPath = pathParent(item.path);
90
+ const destinationParentId = parentPath === null ? parentId : createdByPath.get(parentPath)?.id;
91
+ if (parentPath !== null && destinationParentId === undefined)
92
+ throw inputError(`分享清单中的父目录不存在:${parentPath}`);
93
+ let created;
94
+ if (item.kind === 'folder') {
95
+ created = await store.createFolder(name, destinationParentId ?? null);
96
+ }
97
+ else {
98
+ const content = await requestPublicUrl(contentUrl(url, item.id), MAX_IMPORT_FILE_BYTES, policy);
99
+ if (content.byteLength !== item.size)
100
+ throw inputError(`分享文件大小校验失败:${item.path}`);
101
+ if (item.sha256 !== null && createHash('sha256').update(content).digest('hex') !== item.sha256) {
102
+ throw inputError(`分享文件完整性校验失败:${item.path}`);
103
+ }
104
+ totalBytes += content.byteLength;
105
+ if (totalBytes > MAX_IMPORT_TOTAL_BYTES)
106
+ throw inputError('分享内容超过 256 MiB 导入上限');
107
+ created = item.kind === 'document'
108
+ ? await store.createDocument(name, destinationParentId ?? null, content.toString('utf8'))
109
+ : await store.upload({ name, parentId: destinationParentId ?? null, mediaType: item.mediaType ?? 'application/octet-stream', content });
110
+ importedFiles += 1;
111
+ }
112
+ createdByPath.set(item.path, created);
113
+ if (item === rootManifest)
114
+ root = created;
115
+ }
116
+ }
117
+ catch (error) {
118
+ if (root !== undefined)
119
+ await store.delete(root.id).catch(() => { });
120
+ throw error;
121
+ }
122
+ if (root === undefined)
123
+ throw inputError('分享内容导入失败');
124
+ return { root, importedNodes: createdByPath.size, importedFiles, totalBytes };
125
+ }
126
+ function canonicalShareUrl(raw) {
127
+ let url;
128
+ try {
129
+ url = new URL(raw.trim());
130
+ }
131
+ catch {
132
+ throw inputError('请输入完整的 HTTP 或 HTTPS 分享链接');
133
+ }
134
+ if (url.protocol !== 'https:' && url.protocol !== 'http:')
135
+ throw inputError('分享链接只支持 HTTP 或 HTTPS');
136
+ if (url.username || url.password)
137
+ throw inputError('分享链接不能包含用户名或密码');
138
+ const match = url.pathname.match(/^(.*\/shared\/(share_[A-Za-z0-9_-]{32}))(?:\/)?$/);
139
+ if (match?.[1] === undefined || !SHARE_TOKEN_PATTERN.test(match[2] ?? ''))
140
+ throw inputError('这不是有效的 DSH 笔记分享链接');
141
+ url.pathname = match[1];
142
+ url.search = '';
143
+ url.hash = '';
144
+ return url;
145
+ }
146
+ function contentUrl(base, noteId) {
147
+ const url = new URL(`${base}/content`);
148
+ url.searchParams.set('noteId', noteId);
149
+ return url;
150
+ }
151
+ function shareToken(url) { return url.pathname.slice(url.pathname.lastIndexOf('/') + 1); }
152
+ async function requestPublicUrl(url, maximumBytes, policy, redirects = 0) {
153
+ if (redirects > 3)
154
+ throw upstreamError('分享服务重定向次数过多');
155
+ const target = await resolveShareTarget(url, policy);
156
+ const request = url.protocol === 'https:' ? requestHttps : requestHttp;
157
+ return await new Promise((resolve, reject) => {
158
+ const req = request(url, {
159
+ headers: { accept: 'application/json, application/octet-stream;q=0.9', 'user-agent': 'dsh-knowledge-share-import/1' },
160
+ lookup: createPinnedLookup(target),
161
+ }, response => {
162
+ const status = response.statusCode ?? 502;
163
+ if ([301, 302, 303, 307, 308].includes(status)) {
164
+ response.resume();
165
+ const location = response.headers.location;
166
+ if (!location)
167
+ return reject(upstreamError('分享服务返回了无效重定向'));
168
+ let redirected;
169
+ try {
170
+ redirected = new URL(location, url);
171
+ }
172
+ catch {
173
+ return reject(upstreamError('分享服务返回了无效重定向'));
174
+ }
175
+ requestPublicUrl(redirected, maximumBytes, policy, redirects + 1).then(resolve, reject);
176
+ return;
177
+ }
178
+ if (status < 200 || status >= 300) {
179
+ response.resume();
180
+ reject(upstreamError(status === 404 ? '分享不存在或已经停止' : `分享服务返回 HTTP ${status}`));
181
+ return;
182
+ }
183
+ const declared = Number(response.headers['content-length'] ?? 0);
184
+ if (Number.isFinite(declared) && declared > maximumBytes) {
185
+ response.destroy();
186
+ reject(inputError('分享内容超过导入限制'));
187
+ return;
188
+ }
189
+ const chunks = [];
190
+ let size = 0;
191
+ response.on('data', chunk => {
192
+ const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
193
+ size += buffer.byteLength;
194
+ if (size > maximumBytes) {
195
+ response.destroy(inputError('分享内容超过导入限制'));
196
+ return;
197
+ }
198
+ chunks.push(buffer);
199
+ });
200
+ response.on('end', () => resolve(Buffer.concat(chunks)));
201
+ response.on('error', reject);
202
+ });
203
+ req.setTimeout(REQUEST_TIMEOUT_MS, () => req.destroy(upstreamError('读取分享超时,请稍后重试')));
204
+ req.on('error', reject);
205
+ req.end();
206
+ });
207
+ }
208
+ /** Keep the request on the address that passed SSRF validation, including Node 24's multi-address lookup mode. */
209
+ export function createPinnedLookup(target) {
210
+ return (_hostname, options, callback) => {
211
+ if (options.all)
212
+ callback(null, [target]);
213
+ else
214
+ callback(null, target.address, target.family);
215
+ };
216
+ }
217
+ export async function resolveShareTarget(url, policy = {}, lookupHost = lookup) {
218
+ if (url.protocol !== 'https:' && url.protocol !== 'http:')
219
+ throw inputError('分享链接只支持 HTTP 或 HTTPS');
220
+ const hostname = url.hostname.toLocaleLowerCase();
221
+ if (hostname === 'localhost' || hostname.endsWith('.localhost'))
222
+ throw inputError('分享链接不能指向本机或私有网络');
223
+ const literalFamily = isIP(hostname);
224
+ if (literalFamily !== 0) {
225
+ if (!isPublicAddress(hostname))
226
+ throw inputError('分享链接不能指向本机或私有网络');
227
+ return { address: hostname, family: literalFamily };
228
+ }
229
+ let addresses;
230
+ try {
231
+ addresses = await lookupHost(hostname, { all: true, verbatim: true });
232
+ }
233
+ catch {
234
+ throw upstreamError('无法解析分享链接的主机名');
235
+ }
236
+ const publicAddress = addresses.find(item => isPublicAddress(item.address));
237
+ if (publicAddress !== undefined && addresses.every(item => isPublicAddress(item.address))) {
238
+ return { address: publicAddress.address, family: publicAddress.family === 6 ? 6 : 4 };
239
+ }
240
+ const trustedPrivateOrigin = policy.trustedPrivateOrigins?.includes(url.origin) === true && isShareResourcePath(url.pathname);
241
+ if (!trustedPrivateOrigin) {
242
+ throw inputError('分享链接不能解析到本机或私有网络');
243
+ }
244
+ const pinned = addresses.find(item => isIP(item.address) !== 0);
245
+ if (pinned === undefined)
246
+ throw upstreamError('无法解析分享链接的主机名');
247
+ return { address: pinned.address, family: pinned.family === 6 ? 6 : 4 };
248
+ }
249
+ function isShareResourcePath(pathname) {
250
+ return /\/shared\/share_[A-Za-z0-9_-]{32}(?:\/(?:manifest|content))?\/?$/u.test(pathname);
251
+ }
252
+ function isPublicAddress(address) {
253
+ if (address.includes(':')) {
254
+ const normalized = address.toLocaleLowerCase();
255
+ if (normalized === '::' || normalized === '::1' || normalized.startsWith('fc') || normalized.startsWith('fd') || normalized.startsWith('fe8') || normalized.startsWith('fe9') || normalized.startsWith('fea') || normalized.startsWith('feb') || normalized.startsWith('ff') || normalized.startsWith('2001:db8:'))
256
+ return false;
257
+ const mapped = normalized.match(/^::ffff:(\d+\.\d+\.\d+\.\d+)$/)?.[1];
258
+ return mapped === undefined || isPublicAddress(mapped);
259
+ }
260
+ const octets = address.split('.').map(Number);
261
+ if (octets.length !== 4 || octets.some(value => !Number.isInteger(value) || value < 0 || value > 255))
262
+ return false;
263
+ const [a = 0, b = 0, c = 0] = octets;
264
+ return !(a === 0 || a === 10 || a === 127 || a >= 224
265
+ || (a === 100 && b >= 64 && b <= 127)
266
+ || (a === 169 && b === 254)
267
+ || (a === 172 && b >= 16 && b <= 31)
268
+ || (a === 192 && (b === 168 || (b === 0 && (c === 0 || c === 2))))
269
+ || (a === 198 && (b === 18 || b === 19 || (b === 51 && c === 100)))
270
+ || (a === 203 && b === 0 && c === 113));
271
+ }
272
+ function validateManifest(value) {
273
+ if (!isRecord(value) || value.version !== 1 || !isRecord(value.share) || !Array.isArray(value.nodes))
274
+ throw inputError('分享服务返回的清单格式无效');
275
+ const share = value.share;
276
+ if (typeof share.name !== 'string' || share.name.length === 0 || share.name.length > 255)
277
+ throw inputError('分享名称无效');
278
+ if (!isNoteKind(share.kind) || typeof share.updatedAt !== 'string')
279
+ throw inputError('分享信息无效');
280
+ if (value.nodes.length > MAX_IMPORT_NODES)
281
+ throw inputError('分享目录超过 500 项,暂时不能导入');
282
+ const paths = new Set();
283
+ let totalSize = 0;
284
+ const nodes = value.nodes.map((item, index) => {
285
+ if (!isRecord(item) || typeof item.id !== 'string' || !/^note_[a-f0-9]{32}$/.test(item.id))
286
+ throw inputError(`分享清单第 ${index + 1} 项编号无效`);
287
+ if (typeof item.path !== 'string' || !validRelativePath(item.path))
288
+ throw inputError(`分享清单第 ${index + 1} 项路径无效`);
289
+ if (paths.has(item.path))
290
+ throw inputError(`分享清单存在重复路径:${item.path}`);
291
+ paths.add(item.path);
292
+ if (!isNoteKind(item.kind) || (item.mediaType !== null && typeof item.mediaType !== 'string'))
293
+ throw inputError(`分享清单第 ${index + 1} 项类型无效`);
294
+ const size = item.size;
295
+ if (typeof size !== 'number' || !Number.isSafeInteger(size) || size < 0 || size > MAX_IMPORT_FILE_BYTES)
296
+ throw inputError(`分享清单第 ${index + 1} 项大小无效`);
297
+ if (item.sha256 !== null && (typeof item.sha256 !== 'string' || !/^[a-f0-9]{64}$/.test(item.sha256)))
298
+ throw inputError(`分享清单第 ${index + 1} 项摘要无效`);
299
+ if (item.kind !== 'folder')
300
+ totalSize += size;
301
+ return { id: item.id, path: item.path, kind: item.kind, mediaType: item.mediaType, size, sha256: item.sha256 };
302
+ });
303
+ if (totalSize > MAX_IMPORT_TOTAL_BYTES)
304
+ throw inputError('分享内容超过 256 MiB 导入上限');
305
+ if (share.nodeCount !== nodes.length || share.fileCount !== nodes.filter(node => node.kind !== 'folder').length || share.totalSize !== totalSize)
306
+ throw inputError('分享清单统计信息不一致');
307
+ return { version: 1, share: { name: share.name, kind: share.kind, updatedAt: share.updatedAt, nodeCount: share.nodeCount, fileCount: share.fileCount, totalSize: share.totalSize }, nodes, truncated: value.truncated === true };
308
+ }
309
+ function relativePaths(root, nodes) {
310
+ const byId = new Map(nodes.map(node => [node.id, node]));
311
+ const paths = new Map([[root.id, root.name]]);
312
+ const resolve = (node, seen = new Set()) => {
313
+ const cached = paths.get(node.id);
314
+ if (cached !== undefined)
315
+ return cached;
316
+ if (seen.has(node.id) || node.parentId === null)
317
+ return node.name;
318
+ seen.add(node.id);
319
+ const parent = byId.get(node.parentId);
320
+ const value = parent === undefined ? node.name : `${resolve(parent, seen)}/${node.name}`;
321
+ paths.set(node.id, value);
322
+ return value;
323
+ };
324
+ for (const node of nodes)
325
+ resolve(node);
326
+ return paths;
327
+ }
328
+ function validRelativePath(value) {
329
+ if (value.length === 0 || value.length > 4096 || value.startsWith('/') || value.includes('\\') || value.includes('\0'))
330
+ return false;
331
+ const parts = value.split('/');
332
+ return parts.every(part => part.length > 0 && part.length <= 255 && part !== '.' && part !== '..');
333
+ }
334
+ function pathDepth(value) { return value.split('/').length; }
335
+ function pathName(value) { return value.slice(value.lastIndexOf('/') + 1); }
336
+ function pathParent(value) {
337
+ const index = value.lastIndexOf('/');
338
+ return index < 0 ? null : value.slice(0, index);
339
+ }
340
+ function isNoteKind(value) { return value === 'folder' || value === 'document' || value === 'file'; }
341
+ function isRecord(value) { return value !== null && typeof value === 'object' && !Array.isArray(value); }
342
+ function inputError(message) { return Object.assign(new Error(message), { status: 400, code: 'BAD_REQUEST' }); }
343
+ function upstreamError(message) { return Object.assign(new Error(message), { status: 502, code: 'UPSTREAM_ERROR' }); }
344
+ //# sourceMappingURL=share-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share-import.js","sourceRoot":"","sources":["../../src/notes/share-import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface SharedMarkdownHeading {
2
+ id: string;
3
+ depth: number;
4
+ text: string;
5
+ }
6
+ export interface SharedMarkdownDocument {
7
+ html: string;
8
+ headings: SharedMarkdownHeading[];
9
+ }
10
+ /** Render public Markdown without accepting embedded HTML or executable URLs. */
11
+ export declare function renderSharedMarkdown(markdown: string): SharedMarkdownDocument;
12
+ //# sourceMappingURL=share-markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share-markdown.d.ts","sourceRoot":"","sources":["../../src/notes/share-markdown.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,qBAAqB,EAAE,CAAA;CAClC;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CA+B7E"}
@@ -0,0 +1,79 @@
1
+ import { Renderer, marked } from 'marked';
2
+ /** Render public Markdown without accepting embedded HTML or executable URLs. */
3
+ export function renderSharedMarkdown(markdown) {
4
+ const headings = [];
5
+ const ids = new Map();
6
+ const renderer = new Renderer();
7
+ renderer.html = ({ text }) => escapeHtml(text);
8
+ renderer.heading = function ({ tokens, depth }) {
9
+ const text = plainText(tokens).trim() || '未命名标题';
10
+ const id = uniqueHeadingId(text, ids);
11
+ headings.push({ id, depth, text });
12
+ return `<h${depth} id="${escapeAttribute(id)}">${this.parser.parseInline(tokens)}<a class="heading-anchor" href="#${escapeAttribute(id)}" aria-label="链接到标题:${escapeAttribute(text)}">#</a></h${depth}>\n`;
13
+ };
14
+ renderer.link = function ({ href, title, tokens }) {
15
+ const label = this.parser.parseInline(tokens);
16
+ if (!safeLink(href))
17
+ return `<span class="unsafe-link">${label}</span>`;
18
+ const external = /^(?:https?|mailto|tel):/iu.test(href);
19
+ return `<a href="${escapeAttribute(href)}"${title ? ` title="${escapeAttribute(title)}"` : ''}${external ? ' target="_blank" rel="noopener noreferrer"' : ''}>${label}</a>`;
20
+ };
21
+ renderer.image = ({ href, title, text }) => {
22
+ if (!safeImage(href))
23
+ return `<span class="image-fallback">[图片:${escapeHtml(text || href)}]</span>`;
24
+ return `<img src="${escapeAttribute(href)}" alt="${escapeAttribute(text)}"${title ? ` title="${escapeAttribute(title)}"` : ''} loading="lazy" decoding="async">`;
25
+ };
26
+ renderer.checkbox = ({ checked }) => `<span class="task-box${checked ? ' is-checked' : ''}" role="img" aria-label="${checked ? '已完成' : '未完成'}"></span>`;
27
+ const html = marked.parse(markdown, {
28
+ async: false,
29
+ breaks: false,
30
+ gfm: true,
31
+ renderer,
32
+ });
33
+ return { html, headings };
34
+ }
35
+ function uniqueHeadingId(text, counts) {
36
+ const base = text
37
+ .normalize('NFKC')
38
+ .toLocaleLowerCase()
39
+ .replace(/[^\p{Letter}\p{Number}\s_-]/gu, '')
40
+ .trim()
41
+ .replace(/[\s_]+/gu, '-')
42
+ .replace(/-+/gu, '-') || 'section';
43
+ const count = counts.get(base) ?? 0;
44
+ counts.set(base, count + 1);
45
+ return count === 0 ? base : `${base}-${count + 1}`;
46
+ }
47
+ function plainText(tokens) {
48
+ return tokens.map(token => {
49
+ if ('tokens' in token && Array.isArray(token.tokens))
50
+ return plainText(token.tokens);
51
+ if ('text' in token && typeof token.text === 'string')
52
+ return token.text;
53
+ return '';
54
+ }).join('');
55
+ }
56
+ function safeLink(href) {
57
+ const trimmed = href.trim();
58
+ if (trimmed.startsWith('#') || trimmed.startsWith('/') || trimmed.startsWith('./') || trimmed.startsWith('../'))
59
+ return true;
60
+ try {
61
+ return ['http:', 'https:', 'mailto:', 'tel:'].includes(new URL(trimmed).protocol);
62
+ }
63
+ catch {
64
+ return !/^[a-z][a-z\d+.-]*:/iu.test(trimmed);
65
+ }
66
+ }
67
+ function safeImage(href) {
68
+ const trimmed = href.trim();
69
+ if (trimmed.startsWith('/') || trimmed.startsWith('./') || trimmed.startsWith('../'))
70
+ return true;
71
+ return /^data:image\/(?:png|gif|jpeg|webp);base64,[a-z\d+/=\s]+$/iu.test(trimmed);
72
+ }
73
+ function escapeHtml(value) {
74
+ return value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;').replaceAll("'", '&#39;');
75
+ }
76
+ function escapeAttribute(value) {
77
+ return escapeHtml(value);
78
+ }
79
+ //# sourceMappingURL=share-markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share-markdown.js","sourceRoot":"","sources":["../../src/notes/share-markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { NoteNode, NoteShare } from './domain.js';
2
+ export interface NoteSharePageInput {
3
+ apiPrefix: string;
4
+ share: NoteShare;
5
+ nodes: NoteNode[];
6
+ selectedNode?: NoteNode;
7
+ selectedText?: string;
8
+ contentTruncated?: boolean;
9
+ listTruncated?: boolean;
10
+ }
11
+ export declare function renderNoteSharePage(input: NoteSharePageInput): string;
12
+ //# sourceMappingURL=share-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"share-page.d.ts","sourceRoot":"","sources":["../../src/notes/share-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGtD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,SAAS,CAAA;IAChB,KAAK,EAAE,QAAQ,EAAE,CAAA;IACjB,YAAY,CAAC,EAAE,QAAQ,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CA0BrE"}