wendang 0.0.1 → 0.1.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/LICENSE +44 -0
- package/NOTICE.md +7 -0
- package/README.md +169 -2
- package/dist/cjs/document.js +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/mindmap.js +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/schema.js +1 -0
- package/dist/cjs/shared/anchor.js +1 -0
- package/dist/cjs/shared/callout.js +1 -0
- package/dist/cjs/shared/code-block.js +1 -0
- package/dist/cjs/shared/code-languages.js +1 -0
- package/dist/cjs/shared/doc-compatibility.js +1 -0
- package/dist/cjs/shared/doc-text.js +1 -0
- package/dist/cjs/shared/document-colors.js +1 -0
- package/dist/cjs/shared/inline-comments.js +1 -0
- package/dist/cjs/shared/mind-map-folding.js +1 -0
- package/dist/cjs/shared/mind-map-phase2.js +1 -0
- package/dist/cjs/shared/mind-map.js +1 -0
- package/dist/cjs/shared/mind-topic-text.js +1 -0
- package/dist/cjs/shared/node-catalog.js +1 -0
- package/dist/cjs/shared/presence.js +1 -0
- package/dist/cjs/shared/safe-href.js +1 -0
- package/dist/cjs/shared/table-cell-format.js +1 -0
- package/dist/cjs/shared/table-layout.js +1 -0
- package/dist/cjs/shared/types.js +1 -0
- package/dist/cjs/shared/video-embed.js +1 -0
- package/dist/cjs/shared/workbook.js +1 -0
- package/dist/cjs/spreadsheet.js +1 -0
- package/dist/cjs/types.js +1 -0
- package/dist/cjs/validation/callout.js +1 -0
- package/dist/cjs/validation/doc-node-whitelist.js +1 -0
- package/dist/cjs/validation/error.js +1 -0
- package/dist/cjs/validation/mind-map.js +1 -0
- package/dist/cjs/validation/schema-version.js +1 -0
- package/dist/cjs/validation/schema.js +1 -0
- package/dist/cjs/validation/video-embed.js +1 -0
- package/dist/cjs/validation/workbook.js +1 -0
- package/dist/esm/document.js +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/mindmap.js +1 -0
- package/dist/esm/schema.js +1 -0
- package/dist/esm/shared/anchor.js +1 -0
- package/dist/esm/shared/callout.js +1 -0
- package/dist/esm/shared/code-block.js +1 -0
- package/dist/esm/shared/code-languages.js +1 -0
- package/dist/esm/shared/doc-compatibility.js +1 -0
- package/dist/esm/shared/doc-text.js +1 -0
- package/dist/esm/shared/document-colors.js +1 -0
- package/dist/esm/shared/inline-comments.js +1 -0
- package/dist/esm/shared/mind-map-folding.js +1 -0
- package/dist/esm/shared/mind-map-phase2.js +1 -0
- package/dist/esm/shared/mind-map.js +1 -0
- package/dist/esm/shared/mind-topic-text.js +1 -0
- package/dist/esm/shared/node-catalog.js +1 -0
- package/dist/esm/shared/presence.js +1 -0
- package/dist/esm/shared/safe-href.js +1 -0
- package/dist/esm/shared/table-cell-format.js +1 -0
- package/dist/esm/shared/table-layout.js +1 -0
- package/dist/esm/shared/types.js +1 -0
- package/dist/esm/shared/video-embed.js +1 -0
- package/dist/esm/shared/workbook.js +1 -0
- package/dist/esm/spreadsheet.js +1 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/validation/callout.js +1 -0
- package/dist/esm/validation/doc-node-whitelist.js +1 -0
- package/dist/esm/validation/error.js +1 -0
- package/dist/esm/validation/mind-map.js +1 -0
- package/dist/esm/validation/schema-version.js +1 -0
- package/dist/esm/validation/schema.js +1 -0
- package/dist/esm/validation/video-embed.js +1 -0
- package/dist/esm/validation/workbook.js +1 -0
- package/dist/types/document.d.ts +4 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/mindmap.d.ts +4 -0
- package/dist/types/schema.d.ts +4 -0
- package/dist/types/shared/anchor.d.ts +32 -0
- package/dist/types/shared/callout.d.ts +25 -0
- package/dist/types/shared/code-block.d.ts +25 -0
- package/dist/types/shared/code-languages.d.ts +7 -0
- package/dist/types/shared/doc-compatibility.d.ts +1 -0
- package/dist/types/shared/doc-text.d.ts +7 -0
- package/dist/types/shared/document-colors.d.ts +102 -0
- package/dist/types/shared/inline-comments.d.ts +29 -0
- package/dist/types/shared/mind-map-folding.d.ts +3 -0
- package/dist/types/shared/mind-map-phase2.d.ts +19 -0
- package/dist/types/shared/mind-map.d.ts +130 -0
- package/dist/types/shared/mind-topic-text.d.ts +16 -0
- package/dist/types/shared/node-catalog.d.ts +13 -0
- package/dist/types/shared/presence.d.ts +18 -0
- package/dist/types/shared/safe-href.d.ts +2 -0
- package/dist/types/shared/table-cell-format.d.ts +23 -0
- package/dist/types/shared/table-layout.d.ts +4 -0
- package/dist/types/shared/types.d.ts +40 -0
- package/dist/types/shared/video-embed.d.ts +10 -0
- package/dist/types/shared/workbook.d.ts +54 -0
- package/dist/types/spreadsheet.d.ts +1 -0
- package/dist/types/types.d.ts +3 -0
- package/dist/types/validation/callout.d.ts +1 -0
- package/dist/types/validation/doc-node-whitelist.d.ts +2 -0
- package/dist/types/validation/error.d.ts +7 -0
- package/dist/types/validation/mind-map.d.ts +20 -0
- package/dist/types/validation/schema-version.d.ts +1 -0
- package/dist/types/validation/schema.d.ts +15 -0
- package/dist/types/validation/video-embed.d.ts +1 -0
- package/dist/types/validation/workbook.d.ts +1 -0
- package/package.json +88 -6
package/LICENSE
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Wendang 商业使用许可 1.0
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ztes. All rights reserved.
|
|
4
|
+
|
|
5
|
+
本许可适用于 Wendang 项目及 wendang、wendang-vue 包中由 ztes 拥有版权的代码。
|
|
6
|
+
使用、复制或分发本软件即表示接受以下条款。
|
|
7
|
+
|
|
8
|
+
1. 允许的使用
|
|
9
|
+
在遵守本许可的前提下,授予您非独占、全球、免许可费的权利:
|
|
10
|
+
a. 将本软件用于个人、内部或商业用途,包括收费产品、客户项目及 SaaS 服务;
|
|
11
|
+
b. 为开发、集成、测试、维护和运行您的应用而复制本软件,并修改源码;
|
|
12
|
+
c. 将原版或修改后的编译代码作为您的应用组成部分交付给客户或最终用户,
|
|
13
|
+
包括网站、浏览器应用、桌面应用、移动应用及服务端部署;
|
|
14
|
+
d. 向受保密义务约束的雇员、承包商或客户提供维护上述应用所需的源码,
|
|
15
|
+
前提是这些接收者只能为该应用使用源码并遵守本许可。
|
|
16
|
+
您无需公开应用源码,也无需向 ztes 支付商业使用许可费。
|
|
17
|
+
|
|
18
|
+
2. 限制及保留的权利
|
|
19
|
+
本许可未授予您将本软件或其修改版作为独立库、SDK、编辑器组件包或源码
|
|
20
|
+
产品进行公开再发布、再许可、改名发布、出售或出租的权利。
|
|
21
|
+
上述限制不妨碍您销售或运营包含本软件的应用,也不妨碍按第 1 条交付应用。
|
|
22
|
+
超出本许可范围的独立分发或源码再许可,须另获 ztes 书面授权。
|
|
23
|
+
不得移除本软件中的版权、许可及第三方权利声明。本许可不授予商标权;
|
|
24
|
+
其他未明确授予的权利由各权利人保留。
|
|
25
|
+
|
|
26
|
+
3. 声明的保留
|
|
27
|
+
分发包含本软件的应用时,应在随附许可文件、第三方声明或应用关于页面中
|
|
28
|
+
保留本许可及版权声明。无需在应用主界面展示品牌或链接。
|
|
29
|
+
|
|
30
|
+
4. 第三方组件
|
|
31
|
+
第三方组件及其版权声明继续适用各自许可证,见 NOTICE.md 和
|
|
32
|
+
third-party-notices/。本许可不限制第三方许可证已经授予的权利。
|
|
33
|
+
|
|
34
|
+
5. 终止
|
|
35
|
+
如违反本许可且未在收到书面通知后 30 日内纠正,本许可授予的权利终止。
|
|
36
|
+
终止不影响终止前已产生的义务及权利人的救济权。
|
|
37
|
+
|
|
38
|
+
6. 免责声明与责任限制
|
|
39
|
+
在适用法律允许的最大范围内,本软件按“现状”提供,不附带任何明示或
|
|
40
|
+
默示担保,包括适销性、特定用途适用性及不侵权担保。对于使用或无法使用
|
|
41
|
+
本软件产生的损害、数据丢失、利润损失或其他责任,作者及权利人不承担责任。
|
|
42
|
+
|
|
43
|
+
这是保留源码权利的商业使用许可,不是开源许可证。
|
|
44
|
+
授权联系:https://doc.yjmf.com
|
package/NOTICE.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
Generated from the installed runtime dependency graph; package licenses remain unchanged.
|
|
4
|
+
Wendang is licensed under the Wendang Commercial Use License; see LICENSE. Third-party components retain their own licenses.
|
|
5
|
+
|
|
6
|
+
| Package | Version | Declared license | Included upstream notice |
|
|
7
|
+
| --- | --- | --- | --- |
|
package/README.md
CHANGED
|
@@ -1,5 +1,172 @@
|
|
|
1
1
|
# wendang
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
文档、电子表格和思维导图的内容协议与校验核心,适用于浏览器数据层和 Node.js 服务端。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[主页](https://doc.yjmf.com) · [Vue 编辑组件](https://www.npmjs.com/package/wendang-vue)
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm install wendang
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
支持 Node.js >=20.19、ESM、CommonJS 和 TypeScript。无运行时依赖,不初始化 DOM,也不发起网络请求。
|
|
14
|
+
|
|
15
|
+
## 文档校验
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import { ContentSchemaService, SCHEMA_VERSION } from 'wendang/schema'
|
|
19
|
+
import type { ProseMirrorDoc } from 'wendang/types'
|
|
20
|
+
|
|
21
|
+
const doc: ProseMirrorDoc = {
|
|
22
|
+
type: 'doc',
|
|
23
|
+
content: [{
|
|
24
|
+
type: 'paragraph',
|
|
25
|
+
content: [{ type: 'text', text: '你好,Wendang' }],
|
|
26
|
+
}],
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const result = new ContentSchemaService().validate(doc, SCHEMA_VERSION)
|
|
30
|
+
console.log(result.doc)
|
|
31
|
+
console.log(result.attachmentIds)
|
|
32
|
+
console.log(result.linkTargetIds)
|
|
33
|
+
console.log(result.mentionUserIds)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
CommonJS:
|
|
37
|
+
|
|
38
|
+
```js
|
|
39
|
+
const { ContentSchemaService, SCHEMA_VERSION } = require('wendang/schema')
|
|
40
|
+
|
|
41
|
+
const result = new ContentSchemaService().validate(
|
|
42
|
+
{ type: 'doc', content: [{ type: 'paragraph' }] },
|
|
43
|
+
SCHEMA_VERSION,
|
|
44
|
+
)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`validate(raw, schemaVersion)` 返回以下字段:
|
|
48
|
+
|
|
49
|
+
| 字段 | 含义 |
|
|
50
|
+
| --- | --- |
|
|
51
|
+
| `doc` | 校验并按白名单处理后的内容 |
|
|
52
|
+
| `schemaVersion` | 内容 schema 版本 |
|
|
53
|
+
| `attachmentIds` | 附件 ID 列表 |
|
|
54
|
+
| `linkTargetIds` | 被引用页面的 ID 列表 |
|
|
55
|
+
| `mentionUserIds` | 被提及用户的 ID 列表 |
|
|
56
|
+
|
|
57
|
+
未知节点、非法值和不支持的更高版本会被拒绝。`schemaVersion` 必须为正整数;普通文档当前版本为 `10`。
|
|
58
|
+
|
|
59
|
+
### 处理校验错误
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
import {
|
|
63
|
+
ContentSchemaService,
|
|
64
|
+
ContentValidationError,
|
|
65
|
+
SCHEMA_VERSION,
|
|
66
|
+
} from 'wendang/schema'
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
new ContentSchemaService().validate({ type: 'unknown' }, SCHEMA_VERSION)
|
|
70
|
+
} catch (error) {
|
|
71
|
+
if (error instanceof ContentValidationError) {
|
|
72
|
+
console.error(error.code, error.message, error.details)
|
|
73
|
+
} else {
|
|
74
|
+
throw error
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`ContentValidationError` 包含 `code`、`message`、`status` 和可选 `details`。普通校验错误的 `code` 为 `validation.failed`,`status` 为 `422`;可由应用映射成 HTTP 响应。
|
|
80
|
+
|
|
81
|
+
内容校验不执行授权。服务端仍需检查写入权限、附件归属和引用资源可见性。页面、用户、附件引用使用 UUID;其他业务主键需建立稳定映射。
|
|
82
|
+
|
|
83
|
+
## 电子表格
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
import {
|
|
87
|
+
emptyWorkbook,
|
|
88
|
+
validateWorkbook,
|
|
89
|
+
workbookText,
|
|
90
|
+
} from 'wendang/spreadsheet'
|
|
91
|
+
|
|
92
|
+
const doc = emptyWorkbook(crypto.randomUUID())
|
|
93
|
+
doc.workbook.name = '销售统计'
|
|
94
|
+
doc.workbook.sheets.sheet1.cellData = {
|
|
95
|
+
0: {
|
|
96
|
+
0: { v: '金额', t: 1 },
|
|
97
|
+
1: { v: 12, t: 2 },
|
|
98
|
+
2: { f: '=B1*2', v: 24, t: 2 },
|
|
99
|
+
},
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const snapshot = validateWorkbook(doc)
|
|
103
|
+
const searchableText = workbookText(snapshot)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
工作簿结构为 `{ type: 'workbook', formatVersion: 1, workbook: ... }`:
|
|
107
|
+
|
|
108
|
+
- `f` 保存公式表达式,`v` 保存值或公式计算缓存。
|
|
109
|
+
- `validateWorkbook` 返回独立快照,检查越界、危险属性、非法值和重叠合并。
|
|
110
|
+
- 核心包保存和校验公式,不执行公式计算。可视编辑和 XLSX 转换使用 `wendang-vue`。
|
|
111
|
+
- 工作簿采用与 Univer 1.1.0 兼容的数据结构;升级引擎大版本时需检查格式兼容。
|
|
112
|
+
|
|
113
|
+
| 限制 | 上限 |
|
|
114
|
+
| --- | --- |
|
|
115
|
+
| Sheet 数 | 20 |
|
|
116
|
+
| 每表行数 / 列数 | 10000 / 200 |
|
|
117
|
+
| 实际单元格总数 | 50000 |
|
|
118
|
+
| JSON 大小 | 4 MiB |
|
|
119
|
+
|
|
120
|
+
## 思维导图
|
|
121
|
+
|
|
122
|
+
```ts
|
|
123
|
+
import {
|
|
124
|
+
createMindMap,
|
|
125
|
+
readMindMap,
|
|
126
|
+
mindMapToJson,
|
|
127
|
+
} from 'wendang/mindmap'
|
|
128
|
+
|
|
129
|
+
const json = createMindMap('both')
|
|
130
|
+
const model = readMindMap(json)
|
|
131
|
+
|
|
132
|
+
if (model) {
|
|
133
|
+
model.topics[0].text = '项目计划'
|
|
134
|
+
const snapshot = mindMapToJson(model)
|
|
135
|
+
console.log(snapshot)
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
| API | 用途 |
|
|
140
|
+
| --- | --- |
|
|
141
|
+
| `createMindMap(layout?)` | 创建可持久化的 `MindMapJson` |
|
|
142
|
+
| `readMindMap(json)` | 解析为 `MindMapModel`,无效内容返回 `null` |
|
|
143
|
+
| `mindMapToJson(model)` | 将模型序列化为 JSON |
|
|
144
|
+
|
|
145
|
+
导图当前 `formatVersion` 为 `3`,支持受支持旧版的读取。主题和关系线拥有稳定 ID,支持主题文字、富文本、描述、备注、附件及样式;单图最多 500 个主题,单主题标题最多 2000 字符。
|
|
146
|
+
|
|
147
|
+
持久化 JSON 数据;视口和选区属于展示状态。复制分支应重新生成身份,避免讨论锚点指向旧主题。
|
|
148
|
+
|
|
149
|
+
## 导入入口
|
|
150
|
+
|
|
151
|
+
| 入口 | 内容 |
|
|
152
|
+
| --- | --- |
|
|
153
|
+
| `wendang` | 校验、版本、主要类型、工作簿和导图创建函数 |
|
|
154
|
+
| `wendang/schema` | 校验服务、异常类型、内容版本和节点白名单 |
|
|
155
|
+
| `wendang/document` | 文档类型、节点目录、文本工具和校验 |
|
|
156
|
+
| `wendang/spreadsheet` | 工作簿类型、创建、校验和文本提取 |
|
|
157
|
+
| `wendang/mindmap` | 导图模型、解析、序列化、布局、分支和搜索 |
|
|
158
|
+
| `wendang/types` | 文档、工作簿、导图及讨论类型 |
|
|
159
|
+
|
|
160
|
+
应用应通过以上入口导入,不引用 `dist` 内部文件。
|
|
161
|
+
|
|
162
|
+
## 数据与升级规范
|
|
163
|
+
|
|
164
|
+
- npm 包版本、文档 `schemaVersion` 与工作簿 / 导图 `formatVersion` 分别管理。
|
|
165
|
+
- 保存时同时保存内容和对应格式版本;加载更高版本失败时保留原始数据。
|
|
166
|
+
- HTML、截图及渲染坐标不能替代 JSON 源数据。
|
|
167
|
+
- 自定义节点需同时支持编辑、阅读、校验和导出;只增加前端节点不会自动放宽后端校验。
|
|
168
|
+
- 数据库升级和历史数据迁移由应用控制。
|
|
169
|
+
|
|
170
|
+
## License
|
|
171
|
+
|
|
172
|
+
采用随包附带的 [Wendang 商业使用许可](LICENSE):允许免费商业使用、应用集成修改和随应用分发运行代码,无需公开应用源码。独立 SDK 或源码产品的再发布、再许可及出售需书面授权。
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,o,i)}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),t=this&&this.__exportStar||function(t,r){for(var o in t)"default"===o||Object.prototype.hasOwnProperty.call(r,o)||e(r,t,o)};Object.defineProperty(exports,"__esModule",{value:!0}),t(require("./schema.js"),exports),t(require("./shared/node-catalog.js"),exports),t(require("./shared/doc-text.js"),exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=this&&this.__createBinding||(Object.create?function(e,r,t,o){void 0===o&&(o=t);var n=Object.getOwnPropertyDescriptor(r,t);n&&!("get"in n?!r.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return r[t]}}),Object.defineProperty(e,o,n)}:function(e,r,t,o){void 0===o&&(o=t),e[o]=r[t]}),r=this&&this.__exportStar||function(r,t){for(var o in r)"default"===o||Object.prototype.hasOwnProperty.call(t,o)||e(t,r,o)};Object.defineProperty(exports,"__esModule",{value:!0}),exports.mindMapToJson=exports.readMindMap=exports.createMindMap=exports.validateWorkbook=exports.emptyWorkbook=void 0,r(require("./schema.js"),exports);var t=require("./spreadsheet.js");Object.defineProperty(exports,"emptyWorkbook",{enumerable:!0,get:function(){return t.emptyWorkbook}}),Object.defineProperty(exports,"validateWorkbook",{enumerable:!0,get:function(){return t.validateWorkbook}});var o=require("./mindmap.js");Object.defineProperty(exports,"createMindMap",{enumerable:!0,get:function(){return o.createMindMap}}),Object.defineProperty(exports,"readMindMap",{enumerable:!0,get:function(){return o.readMindMap}}),Object.defineProperty(exports,"mindMapToJson",{enumerable:!0,get:function(){return o.mindMapToJson}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=this&&this.__createBinding||(Object.create?function(e,r,t,i){void 0===i&&(i=t);var a=Object.getOwnPropertyDescriptor(r,t);a&&!("get"in a?!r.__esModule:a.writable||a.configurable)||(a={enumerable:!0,get:function(){return r[t]}}),Object.defineProperty(e,i,a)}:function(e,r,t,i){void 0===i&&(i=t),e[i]=r[t]}),r=this&&this.__exportStar||function(r,t){for(var i in r)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||e(t,r,i)};Object.defineProperty(exports,"__esModule",{value:!0}),exports.validateMindMap=void 0,r(require("./shared/mind-map.js"),exports),r(require("./shared/mind-map-phase2.js"),exports),r(require("./shared/mind-map-folding.js"),exports);var t=require("./validation/mind-map.js");Object.defineProperty(exports,"validateMindMap",{enumerable:!0,get:function(){return t.validateMindMap}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"commonjs"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ALLOWED_MARKS=exports.ALLOWED_NODES=exports.ContentValidationError=exports.SCHEMA_VERSION=exports.ContentSchemaService=void 0;var e=require("./validation/schema.js");Object.defineProperty(exports,"ContentSchemaService",{enumerable:!0,get:function(){return e.ContentSchemaService}}),Object.defineProperty(exports,"SCHEMA_VERSION",{enumerable:!0,get:function(){return e.SCHEMA_VERSION}});var r=require("./validation/error.js");Object.defineProperty(exports,"ContentValidationError",{enumerable:!0,get:function(){return r.ContentValidationError}});var t=require("./validation/doc-node-whitelist.js");Object.defineProperty(exports,"ALLOWED_NODES",{enumerable:!0,get:function(){return t.ALLOWED_NODES}}),Object.defineProperty(exports,"ALLOWED_MARKS",{enumerable:!0,get:function(){return t.ALLOWED_MARKS}});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function scoreCandidate(t,e,n,o,r,l){let s=1e3;return o.length>0&&(s+=4*commonSuffixLength(t.slice(Math.max(0,e-o.length),e),o)),r.length>0&&(s+=4*commonPrefixLength(t.slice(e+n,e+n+r.length),r)),l>=0&&(s-=Math.min(Math.abs(e-l),200)),s}function commonSuffixLength(t,e){let n=0;for(;n<t.length&&n<e.length&&t[t.length-1-n]===e[e.length-1-n];)n+=1;return n}function commonPrefixLength(t,e){let n=0;for(;n<t.length&&n<e.length&&t[n]===e[n];)n+=1;return n}Object.defineProperty(exports,"__esModule",{value:!0}),exports.ANCHOR_QUOTE_MAX=exports.ANCHOR_CONTEXT_LENGTH=void 0,exports.flattenDocText=function flattenDocText(t){const e=[];let n="";return t.forEach((t,o)=>{o>0&&(n+="\n"),e.push({start:n.length,blockIndex:o,length:t.length}),n+=t}),{text:n,segments:e}},exports.locateBlock=function locateBlock(t,e){for(const n of t.segments)if(e>=n.start&&e<=n.start+n.length)return{blockIndex:n.blockIndex,offsetInBlock:e-n.start};const n=t.segments[t.segments.length-1];return n&&e>n.start+n.length?{blockIndex:n.blockIndex,offsetInBlock:n.length}:null},exports.resolveAnchor=function resolveAnchor(t,e){const n=(e.quote??"").trim();if(0===n.length)return null;const o=e.prefix??"",r=e.suffix??"",l=e.start??-1,s=[];let c=t.indexOf(n);for(;-1!==c;)s.push(c),c=t.indexOf(n,c+1);if(s.length>0){let e=null;for(const c of s){const s=scoreCandidate(t,c,n.length,o,r,l);(!e||s>e.score)&&(e={start:c,score:s})}if(e)return{from:e.start,to:e.start+n.length,score:e.score,exact:!0}}if(o.length>0&&r.length>0){const e=o+r,n=t.indexOf(e);if(-1!==n){const t=n+o.length;return{from:t,to:t,score:50,exact:!1}}}const f=o.length>=r.length?o:r;if(f.length>=4){const e=function nearestOccurrence(t,e,n){if(0===e.length)return-1;const o=[];let r=t.indexOf(e);for(;-1!==r&&(o.push(r),!(o.length>500));)r=t.indexOf(e,r+1);if(0===o.length)return-1;if(n<0)return o[0];let l=o[0];for(const t of o)Math.abs(t-n)<Math.abs(l-n)&&(l=t);return l}(t,f,l);if(-1!==e){const t=o.length>=r.length?e+f.length:e;return{from:t,to:t,score:10,exact:!1}}}return null},exports.commonSuffixLength=commonSuffixLength,exports.commonPrefixLength=commonPrefixLength,exports.clipContext=function clipContext(t){return t.slice(0,exports.ANCHOR_CONTEXT_LENGTH)},exports.ANCHOR_CONTEXT_LENGTH=64,exports.ANCHOR_QUOTE_MAX=500;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function validCalloutAttrs(o){if(!o||"object"!=typeof o||Array.isArray(o))return!1;const t=o,valid=(o,r)=>void 0===t[o]||null===t[o]||"string"==typeof t[o]&&r.includes(t[o]);return valid("tone",exports.CALLOUT_TONES)&&valid("icon",["",...exports.CALLOUT_ICONS])&&valid("textColor",exports.CALLOUT_COLORS)&&valid("borderColor",["none",...exports.CALLOUT_COLORS])&&valid("backgroundColor",["none",...exports.CALLOUT_FILLS])}function effectiveCallout(o={}){const t=exports.CALLOUT_TONES.includes(o.tone)?o.tone:"info",r={info:"blue",success:"green",warning:"orange",danger:"red"}[t];return{tone:t,icon:null===o.icon||void 0===o.icon?{info:"💡",success:"✅",warning:"⚠️",danger:"❗"}[t]:["",...exports.CALLOUT_ICONS].includes(o.icon)?o.icon:"💡",textColor:exports.CALLOUT_COLORS.includes(o.textColor)?o.textColor:null,borderColor:["none",...exports.CALLOUT_COLORS].includes(o.borderColor)?o.borderColor:r,backgroundColor:["none",...exports.CALLOUT_FILLS].includes(o.backgroundColor)?o.backgroundColor:r}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.CALLOUT_FILLS=exports.CALLOUT_COLORS=exports.CALLOUT_ICONS=exports.CALLOUT_TONES=void 0,exports.validCalloutAttrs=validCalloutAttrs,exports.effectiveCallout=effectiveCallout,exports.calloutDOMAttributes=function calloutDOMAttributes(o={}){const t=effectiveCallout(o);return{"data-callout":"true","data-tone":t.tone,"data-callout-icon":o.icon??"default",...Object.fromEntries(["textColor","borderColor","backgroundColor"].filter(t=>null!=o[t]).map(t=>[`data-callout-${t.toLowerCase()}`,String(o[t])])),...""===t.icon?{"data-icon-hidden":"true"}:{},style:["--callout-border:"+("none"===t.borderColor?"transparent":`var(--callout-border-${t.borderColor})`),"--callout-fill:"+("none"===t.backgroundColor?"transparent":`var(--doc-highlight-${"gray"===t.backgroundColor?"gray-soft":t.backgroundColor})`),"--callout-text:"+(t.textColor?`var(--doc-text-${t.textColor})`:"var(--content-text-color, var(--color-text))")].join(";")}},exports.calloutMetadata=function calloutMetadata(o){if(!validCalloutAttrs(o))return"";const t=Object.fromEntries(["icon","textColor","borderColor","backgroundColor"].filter(t=>void 0!==o[t]&&null!==o[t]).map(t=>[t,o[t]]));return Object.keys(t).length?` \x3c!--ywiki-callout:${encodeURIComponent(JSON.stringify(t))}--\x3e`:""},exports.readCalloutMetadata=function readCalloutMetadata(o){const t=/^\s*<!--ywiki-callout:([^\s<>]{1,4096})-->\s*/.exec(o);if(!t)return null;try{const o=JSON.parse(decodeURIComponent(t[1]));return!validCalloutAttrs(o)||Object.keys(o).some(o=>!["icon","textColor","borderColor","backgroundColor"].includes(o))?null:{attrs:o,length:t[0].length}}catch{return null}},exports.CALLOUT_TONES=["info","success","warning","danger"],exports.CALLOUT_ICONS=["💡","ℹ️","✅","⚠️","❗","📌","🎯","💬","📖","📝","🚀","🔔","🔎","⭐","🌅","🛠️","📅","🔒","❤️","🎉","❓","📎","🏁","🔥"],exports.CALLOUT_COLORS=["gray","red","orange","yellow","green","blue","purple"],exports.CALLOUT_FILLS=[...exports.CALLOUT_COLORS,...exports.CALLOUT_COLORS.map(o=>`${o}-strong`)];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function codeLineCount(e){let o=1;for(let t=0;t<e.length;t++)"\n"===e[t]&&o++;return o}Object.defineProperty(exports,"__esModule",{value:!0}),exports.CODE_THEMES=void 0,exports.codeBlockDisplay=function codeBlockDisplay(){return{collapsed:!1,lineNumbers:!0,limited:!0,theme:"auto"}},exports.rememberCodeTheme=function rememberCodeTheme(e){},exports.codeLineCount=codeLineCount,exports.codeLineNumbers=function codeLineNumbers(e){return Array.from({length:codeLineCount(e)},(e,o)=>String(o+1)).join("\n")},exports.codeBlockClass=function codeBlockClass(e){return["ywiki-code-panel",`code-theme-${e.theme}`,...e.collapsed?["is-collapsed"]:[],...e.lineNumbers?[]:["without-line-numbers"],...e.limited?[]:["is-unlimited"]]},exports.CODE_THEMES=[{value:"auto",label:"跟随页面"},{value:"paper",label:"纸白"},{value:"soft",label:"柔和"},{value:"night",label:"深色"}];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.CODE_LANGUAGES=void 0,exports.codeLanguageLabel=function codeLanguageLabel(e){return e?l.get(e)??e:""},exports.isKnownCodeLanguage=function isKnownCodeLanguage(e){return l.has(e)},exports.CODE_LANGUAGES=[{value:"",label:"纯文本"},{value:"bash",label:"Bash / Shell"},{value:"json",label:"JSON"},{value:"yaml",label:"YAML"},{value:"sql",label:"SQL"},{value:"markdown",label:"Markdown"},{value:"diff",label:"Diff"},{value:"javascript",label:"JavaScript"},{value:"typescript",label:"TypeScript"},{value:"jsx",label:"JSX"},{value:"tsx",label:"TSX"},{value:"python",label:"Python"},{value:"java",label:"Java"},{value:"go",label:"Go"},{value:"rust",label:"Rust"},{value:"c",label:"C"},{value:"cpp",label:"C++"},{value:"csharp",label:"C#"},{value:"php",label:"PHP"},{value:"ruby",label:"Ruby"},{value:"kotlin",label:"Kotlin"},{value:"swift",label:"Swift"},{value:"html",label:"HTML"},{value:"css",label:"CSS"},{value:"xml",label:"XML"},{value:"dockerfile",label:"Dockerfile"},{value:"ini",label:"INI / TOML"}];const l=new Map(exports.CODE_LANGUAGES.map(l=>[l.value,l.label]));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.supportsDocument=function supportsDocument(n,s=1){if(s>t.SCHEMA_VERSION)return!1;if(!n)return!0;if("object"!=typeof n)return!1;const u=n;return!(!u.type||!(0,e.nodeMeta)(u.type))&&!("mindMap"===u.type&&!(0,r.readMindMap)(u))&&!("callout"===u.type&&!(0,o.validCalloutAttrs)(u.attrs??{}))&&(!u.content||Array.isArray(u.content)&&u.content.every(e=>supportsDocument(e)))};const e=require("./node-catalog.js"),t=require("../schema.js"),r=require("./mind-map.js"),o=require("./callout.js");
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function plainTextOf(t){const e=[],walk=t=>{"string"==typeof t.text&&e.push(t.text);for(const e of t.content??[])walk(e)};return walk(t),e.join("")}Object.defineProperty(exports,"__esModule",{value:!0}),exports.extractBlockTexts=function extractBlockTexts(t){const e=[],walk=(t,n)=>{if(["paragraph","heading","codeBlock","blockquote","listItem","taskItem","tableCell","tableHeader","mindMapTopic"].includes(t.type??""))e.push({index:n,text:plainTextOf(t)});else for(const e of t.content??[])walk(e,n)};return(t?.content??[]).forEach((t,e)=>walk(t,e)),e.filter(t=>t.text.length>0)},exports.plainTextOf=plainTextOf;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function paletteColor(e,n){const t=e.trim().toLowerCase(),o=/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/.exec(t);if(o&&o.slice(1).some(e=>Number(e)>255))return null;const a=o?`#${o.slice(1).map(e=>Number(e).toString(16).padStart(2,"0")).join("")}`:t;return n.some(e=>e.value===a)?a:null}Object.defineProperty(exports,"__esModule",{value:!0}),exports.HIGHLIGHT_COLORS=exports.TEXT_COLORS=void 0,exports.paletteColor=paletteColor,exports.documentColorAttributes=function documentColorAttributes(e,n){if("string"!=typeof n)return{};const t="text"===e?exports.TEXT_COLORS:exports.HIGHLIGHT_COLORS,o=paletteColor(n,t),a=t.find(e=>e.value===o);if(!a?.value)return{};const l="text"===e?"color":"background-color";return{"data-color":a.value,style:`${l}: var(--doc-${e}-${a.token}, ${a.value})`}},exports.TEXT_COLORS=[{name:"默认",value:null,token:null},{name:"灰",value:"#868e96",token:"gray"},{name:"红",value:"#d92c2c",token:"red"},{name:"橙",value:"#e07b1a",token:"orange"},{name:"黄褐",value:"#9a7b12",token:"yellow"},{name:"绿",value:"#2f9e44",token:"green"},{name:"蓝",value:"#1971c2",token:"blue"},{name:"紫",value:"#7048e8",token:"purple"}],exports.HIGHLIGHT_COLORS=[{name:"无",value:null,token:null},{name:"浅灰",value:"#f1f3f5",token:"gray-soft"},{name:"浅红",value:"#ffe3e3",token:"red"},{name:"浅橙",value:"#fff0db",token:"orange"},{name:"浅黄",value:"#fff3bf",token:"yellow"},{name:"浅绿",value:"#d3f9d8",token:"green"},{name:"浅蓝",value:"#d0ebff",token:"blue"},{name:"浅紫",value:"#e5dbff",token:"purple"},{name:"灰",value:"#dee2e6",token:"gray"},{name:"深灰",value:"#ced4da",token:"gray-strong"},{name:"红",value:"#ffc9c9",token:"red-strong"},{name:"橙",value:"#ffd8a8",token:"orange-strong"},{name:"黄",value:"#ffec99",token:"yellow-strong"},{name:"绿",value:"#b2f2bb",token:"green-strong"},{name:"蓝",value:"#a5d8ff",token:"blue-strong"},{name:"紫",value:"#d0bfff",token:"purple-strong"}];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.buildTextRuns=buildTextRuns,exports.buildFlatText=buildFlatText,exports.resolveInlineComments=function resolveInlineComments(e,n){const o=buildTextRuns(e),s=buildFlatText(e),r=[],i=[];for(const a of n){if(a.deleted||!a.anchor)continue;if(a.anchor.prefix?.startsWith("mind:")){let t=!1;const walk=e=>{if("mindMap"!==e.type||e.attrs?.id!==a.anchor.prefix.slice(5))for(const t of e.content??[])walk(t);else t=!!e.content?.some(t=>"mindMapTopic"===t.type&&t.attrs?.id===a.anchor.suffix)};e&&walk(e),t||i.push(a.id);continue}if(null!==a.parentId)continue;const n=(0,t.resolveAnchor)(s,{quote:a.anchor.quote,prefix:a.anchor.prefix,suffix:a.anchor.suffix,start:a.anchor.start});if(!n){i.push(a.id);continue}const l=o.filter(t=>t.flatEnd>n.from&&t.flatStart<=n.to);if(0===l.length){i.push(a.id);continue}if(n.to<=n.from){const t=l[0];r.push({commentId:a.id,textIndex:t.index,from:Math.max(0,n.from-t.flatStart),to:Math.max(0,n.from-t.flatStart),state:"shifted",hasReplies:a.replies.length>0});continue}const f="exact";let c=0;for(const t of l){const e=Math.max(0,n.from-t.flatStart),o=Math.min(t.text.length,n.to-t.flatStart);o<=e||(r.push({commentId:a.id,textIndex:t.index,from:e,to:o,state:f,hasReplies:a.replies.length>0}),c+=1)}0===c&&i.push(a.id)}const a=new Map;for(const t of r){const e=a.get(t.textIndex)??[];e.push(t),a.set(t.textIndex,e)}return{marks:r,orphanCommentIds:i,byTextIndex:a}},exports.splitTextByMarks=function splitTextByMarks(t,e){if(0===e.length||0===t.length)return[{text:t,marks:[]}];const n=new Set([0,t.length]);for(const o of e)n.add(Math.max(0,Math.min(o.from,t.length))),n.add(Math.max(0,Math.min(o.to,t.length)));const o=[...n].sort((t,e)=>t-e),s=[];for(let n=0;n<o.length-1;n+=1){const r=o[n],i=o[n+1];if(i<=r)continue;const a=e.filter(t=>t.from<=r&&t.to>=i);s.push({text:t.slice(r,i),marks:a})}return s.length>0?s:[{text:t,marks:[]}]};const t=require("./anchor.js"),e=require("./doc-text.js");function buildTextRuns(t){const e=[];let n=0;const o=[],collect=(t,e)=>{if("string"!=typeof t.text)for(const n of t.content??[])collect(n,e);else e.push(t)};for(const s of t?.content??[]){const t=[];collect(s,t);const r=t.map(t=>t.text??"").join("");if(0===r.length)continue;o.push(r);const i=o.length>1?n+1:n;let a=0;for(const n of t){const t=n.text??"";0!==t.length&&(e.push({index:e.length,text:t,flatStart:i+a,flatEnd:i+a+t.length}),a+=t.length)}n=i+a}return e}function buildFlatText(n){const o=(n?.content??[]).map(t=>(0,e.plainTextOf)(t)).filter(t=>t.length>0);return(0,t.flattenDocText)(o).text}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.normalizeMindFolds=normalizeMindFolds,exports.firstLevelMindFolds=function firstLevelMindFolds(n){return normalizeMindFolds(n,(0,e.mindMapTree)(n).filter(e=>e.parentId===n.rootId).map(e=>e.id))};const e=require("./mind-map.js");function normalizeMindFolds(n,r){const i=(0,e.mindMapTree)(n),t=new Set(i.map(e=>e.parentId)),d=new Set(i.map(e=>e.id));return new Set([...r].filter(e=>e!==n.rootId&&d.has(e)&&t.has(e)))}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.MIND_BACKGROUNDS=exports.MIND_COLORS=exports.MIND_ICONS=void 0,exports.topicTitle=function topicTitle(t){return(t.content??[]).filter(t=>"text"===t.type).map(t=>t.text??"").join("")},exports.topicField=function topicField(t,e){return(t.content?.find(t=>t.type===("description"===e?"mindMapDescription":"mindMapNote"))?.content??[]).map(t=>t.text??"").join("")},exports.branchModel=function branchModel(e,r){const n=(0,t.mindMapDescendants)(e,r);return{...e,rootId:r,topics:(0,t.mindMapTree)(e).filter(t=>n.has(t.id)).map(t=>t.id===r?{...t,parentId:""}:t),relations:e.relations?.filter(t=>n.has(t.source)&&n.has(t.target))}},exports.ancestorIds=function ancestorIds(e,r){const n=new Map((0,t.mindMapTree)(e).map(t=>[t.id,t])),o=[];let i=n.get(r);for(;i?.parentId&&o.length<500;)o.push(i.parentId),i=n.get(i.parentId);return o},exports.searchMindMap=function searchMindMap(e,r,n=!0){if(!r)return[];const o=r.toLocaleLowerCase(),i=[];for(const r of(0,t.mindMapOutline)(e))for(const t of n?["title","description","note"]:["title"]){const e=("title"===t?r.text:r[t]??"").toLocaleLowerCase();for(let n=0;(n=e.indexOf(o,n))>=0;n+=o.length)if(i.push({id:r.id,field:t,from:n,to:n+o.length}),i.length>5e3)return i}return i},exports.parseMindMapImport=parseMindMapImport,exports.mindMapTemplate=function mindMapTemplate(e){const r={project:["项目拆解","目标与范围","需求梳理","研发实现","测试验收","上线与复盘"],meeting:["会议讨论","议题","背景信息","讨论结论","待办事项","负责人"],knowledge:["知识目录","基础概念","核心原理","实践案例","常见问题","参考资料"]}[e],n=(0,t.readMindMap)((0,t.createMindMap)("both"));return n.topics=r.map((e,r)=>({id:r?(0,t.mindMapId)():n.rootId,parentId:r?n.rootId:"",order:r,text:e})),n},exports.importBranch=importBranch,exports.parseMindBranch=function parseMindBranch(e){if(!e.startsWith("YWIKI_MINDMAP_BRANCH_V1\n")||e.length>2e6)throw new Error("不是有效的导图分支");const r=JSON.parse(e.slice(e.indexOf("\n")+1));if(!Array.isArray(r)||r.length>1500)throw new Error("分支内容过大");const n=r.filter(t=>"mindMapTopic"===t?.type);if(!n.length||!n[0].attrs)throw new Error("分支缺少主题");const o=r.map(t=>t===n[0]?{...t,attrs:{...t.attrs,parentId:""}}:t),i=(0,t.readMindMap)({type:"mindMap",attrs:{id:"clipboard",rootId:n[0].attrs.id,formatVersion:t.MIND_MAP_VERSION,layout:"right",theme:"blue",height:380},content:o});if(!i)throw new Error("分支结构不合法");return importBranch(parseMindMapImport(JSON.stringify((0,t.mindMapToJson)(i))))};const t=require("./mind-map.js");function parseMindMapImport(e){if((new TextEncoder).encode(e).length>2e6)throw new Error("导入内容过大(最多 2 MB)");if(e.trimStart().startsWith("{")){const r=JSON.parse(e),n="mindMap"===r.type?(0,t.readMindMap)(r):"ywiki-mind-map"===r.format&&[1,2,t.MIND_MAP_VERSION].includes(r.version)&&Array.isArray(r.topics)?(0,t.readMindMap)((0,t.mindMapToJson)(r)):null;if(!n)throw new Error("导图结构或版本无效");if(n.topics.some(t=>t.id!==n.rootId&&!n.topics.some(e=>e.id===t.parentId)))throw new Error("导入结构包含不存在的父主题");if(n.relations?.some(t=>!n.topics.some(e=>e.id===t.source)||!n.topics.some(e=>e.id===t.target)))throw new Error("导入关系的端点不存在");for(const t of n.topics){const e=new Set;let r=t;for(;r?.parentId;){if(e.has(r.id))throw new Error("导入结构存在循环关系");e.add(r.id),r=n.topics.find(t=>t.id===r.parentId)}}return(0,t.readMindMap)((0,t.mindMapToJson)(n,!0))}const r=e.replace(/\r/g,"").split("\n").filter(t=>t.trim());if(!r.length)throw new Error("请输入缩进列表或导图 JSON");if(r.length>499)throw new Error("导入列表最多 499 行,加中心主题后最多 500 个主题");const n=(0,t.readMindMap)((0,t.createMindMap)());n.topics=[n.topics[0]],n.topics[0].text="导入的主题";const o=[{indent:-1,id:n.rootId}];for(let e=0;e<r.length;e++){const i=r[e],p=(i.match(/^\s*/)?.[0]??"").replace(/\t/g," ").length,a=i.trim().replace(/^(?:[-*+]\s+|\d+[.)]\s+)/,"");if(a.length>2e3)throw new Error(`第 ${e+1} 行超过 2000 字符`);for(;o.length>1&&o.at(-1).indent>=p;)o.pop();if(o.length>50)throw new Error(`第 ${e+1} 行嵌套超过 50 层`);const s=(0,t.mindMapId)();n.topics.push({id:s,parentId:o.at(-1).id,order:e,text:a}),o.push({indent:p,id:s})}return n}function importBranch(e){return(0,t.mindMapToJson)(e,!0).content??[]}exports.MIND_ICONS=["","💡","🎯","📌","🚩","⭐","✅","⚠️","💬","📅","🔎"],exports.MIND_COLORS=["","#18243a","#ffffff","#3864ef","#087f8c","#7950c7","#a66b08","#d94848"],exports.MIND_BACKGROUNDS=["","#f3f5fb","#dce7ff","#d3f4e9","#ece0ff","#fff0c2","#ffe1e1","#233044"];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.MIND_MAP_PALETTE=exports.mindMapId=exports.MIND_MAP_THEMES=exports.MIND_MAP_LAYOUTS=exports.MIND_MAP_MAX_TEXT=exports.MIND_MAP_MAX_TOPICS=exports.MIND_MAP_VERSION=void 0,exports.createMindMap=function createMindMap(t="right"){const e=(0,exports.mindMapId)(),n=(0,exports.mindMapId)();return{type:"mindMap",attrs:{id:e,rootId:n,formatVersion:exports.MIND_MAP_VERSION,layout:t,theme:"blue",height:380},content:[{type:"mindMapTopic",attrs:{id:n,parentId:"",order:0},content:[{type:"text",text:"中心主题"}]},...["分支主题 1","分支主题 2","分支主题 3"].map((t,e)=>({type:"mindMapTopic",attrs:{id:(0,exports.mindMapId)(),parentId:n,order:e},content:[{type:"text",text:t}]}))]}},exports.readMindMap=function readMindMap(t){const e=t?.attrs;if("mindMap"!==t?.type||!e||![1,2,exports.MIND_MAP_VERSION].includes(Number(e.formatVersion))||!validId(e.id)||!validId(e.rootId)||!Array.isArray(t.content)||t.content.length<1||t.content.filter(t=>"mindMapTopic"===t?.type).length>exports.MIND_MAP_MAX_TOPICS||t.content.length>1500)return null;const n=[],i=new Set;for(const e of t.content.filter(t=>"mindMapRelation"!==t?.type)){if(!e||"object"!=typeof e)return null;const t=e.attrs;if("mindMapTopic"!==e.type||!t||!validId(t.id)||i.has(t.id)||"string"!=typeof t.parentId||""!==t.parentId&&!validId(t.parentId)||"number"!=typeof t.order||!Number.isFinite(t.order)||Math.abs(t.order)>1e12||void 0!==e.content&&!Array.isArray(e.content)||e.content?.some(t=>!t||!["text","mindMapDescription","mindMapNote"].includes(t.type??"")||"text"===t.type&&"string"!=typeof t.text))return null;const o=(e.content??[]).filter(t=>"text"===t.type).map(t=>t.text??"").join("");if(o.length>exports.MIND_MAP_MAX_TEXT)return null;i.add(t.id);const r={};if(t.color&&!/^#[0-9a-f]{6}$/i.test(String(t.color)))return null;if(t.background&&!/^#[0-9a-f]{6}$/i.test(String(t.background)))return null;for(const e of["color","background"])if(t[e]&&!["#18243a","#ffffff","#3864ef","#087f8c","#7950c7","#a66b08","#d94848","#f3f5fb","#dce7ff","#d3f4e9","#ece0ff","#fff0c2","#ffe1e1","#233044"].includes(String(t[e])))return null;if(t.shape&&!["round","pill","text"].includes(String(t.shape)))return null;if(t.fontSize&&![12,14,16,18,20].includes(Number(t.fontSize)))return null;if(t.align&&!["left","center","right"].includes(String(t.align)))return null;if(void 0!==t.done&&null!==t.done&&"boolean"!=typeof t.done)return null;if(void 0!==t.side&&null!==t.side&&-1!==t.side&&1!==t.side)return null;if(t.icon&&!["💡","🎯","📌","🚩","⭐","✅","⚠️","💬","📅","🔎"].includes(String(t.icon)))return null;if(t.attachmentId&&("string"!=typeof t.attachmentId||!/^[0-9a-f-]{36}$/i.test(t.attachmentId)))return null;const d=new Set;let a=!1,s=!1;for(const t of e.content??[]){if(void 0!==t.marks&&(!Array.isArray(t.marks)||t.marks.some(t=>!t||!["bold","italic","strike","textStyle","highlight","link"].includes(t.type))))return null;if("text"!==t.type&&(void 0!==t.content&&!Array.isArray(t.content)||t.content?.some(t=>"text"!==t.type||"string"!=typeof t.text)||(t.content??[]).reduce((t,e)=>t+(e.text?.length??0),0)>4e3))return null;if("text"===t.type&&a)return null;if("text"!==t.type){if(d.has(t.type)||"mindMapDescription"===t.type&&s)return null;d.add(t.type),a=!0,"mindMapNote"===t.type&&(s=!0)}}for(const e of["shape","color","background","fontSize","align","icon","done","attachmentId","side"])void 0!==t[e]&&null!==t[e]&&""!==t[e]&&Object.assign(r,{[e]:t[e]});const p=(e.content??[]).filter(t=>"text"===t.type).map(t=>({text:t.text??"",...t.marks?.length?{marks:t.marks}:{}}));p.some(t=>t.marks?.length)&&(r.runs=p);for(const[t,n]of[["mindMapDescription","description"],["mindMapNote","note"]]){const i=e.content?.find(e=>e.type===t);i&&(r[n]=(i.content??[]).map(t=>t.text??"").join(""))}n.push({id:t.id,parentId:t.parentId,order:t.order,text:o,...r})}if(!i.has(e.rootId))return null;const o=t.content.filter(t=>"mindMapRelation"===t.type),r=new Set;for(const t of o){const e=t.attrs;if(!e||!validId(e.id)||i.has(e.id)||r.has(e.id)||!validId(e.source)||!validId(e.target)||e.source===e.target||!["related","depends","reference"].includes(String(e.kind))||"string"!=typeof e.label||e.label.length>200)return null;r.add(e.id)}return{id:e.id,rootId:e.rootId,topics:n,...e.branchStyle?{branchStyle:e.branchStyle}:{},...t.content.some(t=>"mindMapRelation"===t.type)?{relations:t.content.filter(t=>"mindMapRelation"===t.type).map(t=>({...t.attrs}))}:{},layout:exports.MIND_MAP_LAYOUTS.includes(e.layout)?e.layout:"right",theme:exports.MIND_MAP_THEMES.includes(e.theme)?e.theme:"blue",height:"number"==typeof e.height&&Number.isFinite(e.height)?Math.min(800,Math.max(240,e.height)):380}},exports.mindMapTree=mindMapTree,exports.mindMapDescendants=mindMapDescendants,exports.canMoveMindTopic=canMoveMindTopic,exports.mindMapBranchSides=mindMapBranchSides,exports.projectMindSideMove=function projectMindSideMove(t,e,n,i){if("down"===t.layout||-1!==n&&1!==n||!canMoveMindTopic(t,e,t.rootId))return null;const o=mindMapBranchSides(t),r=mindMapTree(t).filter(i=>i.parentId===t.rootId&&i.id!==e&&o.get(i.id)===n),d=i?r.findIndex(t=>t.id===i):r.length;if(d<0)return null;const a=r.map(t=>t.id);a.splice(d,0,e);const s=new Map(a.map((t,e)=>[t,1024*e]));return{...t,layout:"both",topics:t.topics.map(i=>i.id===e?{...i,parentId:t.rootId,side:n,order:s.get(e)}:i.parentId===t.rootId?{...i,side:o.get(i.id),order:s.get(i.id)??i.order}:i)}},exports.textDifference=function textDifference(t,e){let n=0,i=0;for(;n<t.length&&n<e.length&&t[n]===e[n];)n++;for(n>0&&/[\uD800-\uDBFF]/.test(t[n-1])&&n--;i<t.length-n&&i<e.length-n&&t[t.length-i-1]===e[e.length-i-1];)i++;return i>0&&/[\uDC00-\uDFFF]/.test(t[t.length-i])&&i--,{from:n,to:t.length-i,text:e.slice(n,e.length-i)}},exports.layoutMindMap=layoutMindMap,exports.mindMapSvg=function mindMapSvg(t,i={}){const o=layoutMindMap(t),r=o.bounds,d=exports.MIND_MAP_PALETTE[t.theme];return`<svg xmlns="http://www.w3.org/2000/svg" viewBox="${r.x} ${r.y} ${r.width} ${r.height}" width="${Math.ceil(r.width)}" height="${Math.ceil(r.height)}">`+(i.transparent?"":`<rect x="${r.x}" y="${r.y}" width="${r.width}" height="${r.height}" fill="#fff"/>`)+o.edges.map(t=>`<path d="${t.path}" fill="none" stroke="${d}" stroke-width="2"/>`).join("")+o.nodes.map(o=>{const r=(0,n.mindTopicLineHeight)(o.fontSize||14),a=11+(r-(o.fontSize||14))/2+.8*(o.fontSize||14),s=o.background||(o.id===t.rootId?d:"#f3f5fb"),p=o.color||("text"===o.shape?"#25314a":o.background?(0,e.readableTextColor)(o.background):o.id===t.rootId?"#fff":"#25314a"),c=o.description?function wrapTopic(t,e=14){const n=[];for(const i of(t||"未命名主题").split("\n")){let t="",o=0;for(const r of i){const i=/[\u0000-\u00ff]/.test(r)?.6:1;o+i>e&&(n.push(t),t="",o=0),t+=r,o+=i}n.push(t||" ")}return n}(o.description):[],l=o.attachmentId&&i.images?.[o.attachmentId];return"<g>"+("text"===o.shape?"":`<rect x="${o.x}" y="${o.y}" width="${o.width}" height="${o.height}" rx="${"pill"===o.shape?24:9}" fill="${escapeXml(s)}" stroke="${d}" stroke-opacity=".3"/>`)+(o.icon||o.done?`<text x="${o.x+o.width/2}" y="${o.y+22}" text-anchor="middle" font-size="16">${o.done?"☑ ":""}${escapeXml(o.icon||"")}</text>`:"")+o.lines.map((t,e)=>function svgHighlights(t,e,n,i,o){if(!t.runs?.some(t=>t.marks?.some(t=>"highlight"===t.type)))return"";const r=t.fontSize||14,width=t=>(/[\u0000-\u00ff]/.test(t)?8:14)*r/14,d=[...e].reduce((t,e)=>t+width(e),0);let a="left"===t.align?i+16:"right"===t.align?i+t.width-d-16:i+(t.width-d)/2,s=n;const p=[];for(const n of e){let e=0;const i=t.runs.find(t=>{const n=e;return e+=t.text.length,s>=n&&s<e}),d=i?.marks?.find(t=>"highlight"===t.type)?.attrs?.color,c=width(n);/^#[0-9a-f]{6}$/i.test(String(d))&&p.push(`<rect x="${a}" y="${o-r}" width="${c}" height="${r+4}" rx="2" fill="${d}"/>`),a+=c,s+=n.length}return p.join("")}(o,t,o.lines.slice(0,e).reduce((t,e)=>t+e.length,0),o.x,o.y+a+e*r+(o.icon||o.done?20:0))).join("")+o.lines.map((t,e)=>`<text x="${o.x+("left"===o.align?16:"right"===o.align?o.width-16:o.width/2)}" y="${o.y+a+e*r+(o.icon||o.done?20:0)}" text-anchor="${"left"===o.align?"start":"right"===o.align?"end":"middle"}" font-family="${escapeXml(n.MIND_TOPIC_FONT)}" font-size="${o.fontSize||14}" fill="${escapeXml(p)}">${function svgRichLine(t,e,n){if(!t.runs?.length)return escapeXml(e);const i=[];let o=n;for(const n of e){let e=0;const r=t.runs.find(t=>{const n=e;return e+=t.text.length,o>=n&&o<e}),d=r?.marks??[],a=[];for(const t of d)"bold"===t.type&&a.push("font-weight:700"),"italic"===t.type&&a.push("font-style:italic"),"strike"===t.type&&a.push("text-decoration:line-through"),"link"===t.type&&a.push("text-decoration:underline"),"textStyle"===t.type&&/^#[0-9a-f]{6}$/i.test(String(t.attrs?.color))&&a.push(`fill:${t.attrs.color}`);i.push(`<tspan${a.length?` style="${a.join(";")}"`:""}>${escapeXml(n)}</tspan>`),o+=n.length}return i.join("")}(o,t,o.lines.slice(0,e).reduce((t,e)=>t+e.length,0))}</text>`).join("")+c.map((t,e)=>`<text x="${o.x+o.width/2}" y="${o.y+28+o.lines.length*r+18*e+(o.icon||o.done?20:0)}" text-anchor="middle" font-size="12" fill="#677184">${escapeXml(t)}</text>`).join("")+(o.note?`<text x="${o.x+o.width/2}" y="${o.y+o.height-(o.attachmentId?112:10)}" text-anchor="middle" font-size="10" fill="#677184">▤ 备注</text>`:"")+(l&&/^data:image\/(png|jpeg|webp|gif);base64,/.test(l)?`<image x="${o.x+10}" y="${o.y+o.height-105}" width="${o.width-20}" height="95" href="${l}" preserveAspectRatio="xMidYMid meet"/>`:"")+"</g>"}).join("")+mindRelationPaths(t,o).map(t=>`<path d="${t.path}" fill="none" stroke="#8b5fc7" stroke-width="2" stroke-dasharray="6 4"/><text x="${t.x}" y="${t.y}" font-size="12" fill="#7950c7">${escapeXml(t.label||{related:"相关",depends:"依赖",reference:"参考"}[t.kind])}</text>`).join("")+"</svg>"},exports.mindMapOutline=mindMapOutline,exports.mindMapMarkdown=function mindMapMarkdown(e){const escape=t=>t.replace(/([\\`*_[\]<>])/g,"\\$1").replace(/\n/g," ");return mindMapOutline(e).map(e=>{const n=(e.runs??[{text:e.text}]).map(e=>{let n=escape(e.text);for(const i of e.marks??[])"bold"===i.type&&(n=`**${n}**`),"italic"===i.type&&(n=`*${n}*`),"strike"===i.type&&(n=`~~${n}~~`),"link"===i.type&&(0,t.isSafeHref)(i.attrs?.href)&&(n=`[${n}](${String(i.attrs.href).replace(/[()]/g,t=>encodeURIComponent(t))})`);return n}).join("")||"未命名主题";return`${" ".repeat(e.depth)}- ${e.done?"[x] ":""}${e.icon?e.icon+" ":""}${n}${e.description?" — "+escape(e.description):""}${e.note?"(备注:"+escape(e.note)+")":""}${e.attachmentId?" [图片附件:"+e.attachmentId+"]":""}`}).join("\n")+((e.relations?.length??0)>0?"\n\n关系:\n"+e.relations.map(t=>`- ${escape(e.topics.find(e=>e.id===t.source)?.text||"已移除主题")} → ${escape(e.topics.find(e=>e.id===t.target)?.text||"已移除主题")}:${escape(t.label||t.kind)}`).join("\n"):"")},exports.mindRelationPaths=mindRelationPaths,exports.mindMapToJson=function mindMapToJson(t,e=!1){const n=new Map(t.topics.map(t=>[t.id,e?(0,exports.mindMapId)():t.id]));return{type:"mindMap",attrs:{id:e?(0,exports.mindMapId)():t.id,rootId:n.get(t.rootId),formatVersion:exports.MIND_MAP_VERSION,layout:t.layout,theme:t.theme,height:t.height,branchStyle:t.branchStyle||"curve"},content:[...t.topics.map(t=>{const{text:e,runs:i,description:o,note:r,...d}=t;return{type:"mindMapTopic",attrs:{...d,id:n.get(t.id),parentId:n.get(t.parentId)??""},content:[...(i??(e?[{text:e}]:[])).map(t=>({type:"text",...t})),...o?[{type:"mindMapDescription",content:[{type:"text",text:o}]}]:[],...r?[{type:"mindMapNote",content:[{type:"text",text:r}]}]:[]]}}),...(t.relations??[]).map(t=>({type:"mindMapRelation",attrs:{...t,id:e?(0,exports.mindMapId)():t.id,source:n.get(t.source),target:n.get(t.target)}}))]}};const t=require("./safe-href.js"),e=require("./presence.js"),n=require("./mind-topic-text.js");exports.MIND_MAP_VERSION=3,exports.MIND_MAP_MAX_TOPICS=500,exports.MIND_MAP_MAX_TEXT=2e3,exports.MIND_MAP_LAYOUTS=["right","left","both","down"],exports.MIND_MAP_THEMES=["blue","teal","violet","amber"],exports.mindMapId=()=>crypto.randomUUID();const validId=t=>"string"==typeof t&&/^[\w-]{1,80}$/.test(t);function mindMapTree(t){const e=t.topics.map(t=>({...t})),n=new Map(e.map(t=>[t.id,t]));for(const i of e)i.id===t.rootId?i.parentId="":n.has(i.parentId)&&i.parentId!==i.id||(i.parentId=t.rootId);for(const i of[...e].sort((t,e)=>t.id.localeCompare(e.id))){const e=[],o=new Set;let r=i;for(;r&&r.id!==t.rootId;){if(o.has(r.id)){const i=e.slice(e.indexOf(r.id)).sort();n.get(i[0]).parentId=t.rootId;break}o.add(r.id),e.push(r.id),r=n.get(r.parentId)}}return e.sort((t,e)=>t.order-e.order||t.id.localeCompare(e.id))}function mindMapDescendants(t,e){const n=mindMapTree(t),i=new Set([e]);for(let t=!0;t;){t=!1;for(const e of n)i.has(e.parentId)&&!i.has(e.id)&&(i.add(e.id),t=!0)}return i}function canMoveMindTopic(t,e,n){return e!==t.rootId&&t.topics.some(t=>t.id===e)&&t.topics.some(t=>t.id===n)&&!mindMapDescendants(t,e).has(n)}function mindMapBranchSides(t){return new Map(mindMapTree(t).filter(e=>e.parentId===t.rootId).map((e,n)=>[e.id,"left"===t.layout?-1:"both"===t.layout?e.side??(n%2?-1:1):1]))}function layoutMindMap(t,e=new Set){const i=mindMapTree(t),o=new Map;for(const t of i){const e=o.get(t.parentId)??[];e.push(t),o.set(t.parentId,e)}const r=i.find(e=>e.id===t.rootId),d=new Map(i.map(t=>{const e=(0,n.mindTopicTextSize)(t.text,t.fontSize||14,t.id===r.id,t.description||"",!!t.runs?.some(t=>t.marks?.some(t=>"bold"===t.type)),t.attachmentId?180:0);return[t.id,{lines:e.lines,width:e.width,height:Math.max(44,e.titleHeight+22)+(t.description?18*e.descriptionLines.length+6:0)+(t.attachmentId?104:0)+(t.icon||t.done?20:0)+(t.note?20:0)}]})),kids=t=>e.has(t)?[]:o.get(t)??[],a=[],span=e=>Math.max("down"===t.layout?d.get(e.id).width:d.get(e.id).height,kids(e.id).reduce((t,e)=>t+span(e)+20,-20)),place=(e,n,i,o)=>{const r=d.get(e.id);a.push({...e,...r,x:n,y:i,side:o});const s=kids(e.id),p=s.reduce((t,e)=>t+span(e)+20,-20);let c=("down"===t.layout?n+r.width/2:i+r.height/2)-p/2;for(const e of s){const a=d.get(e.id),s=span(e);"down"===t.layout?place(e,c+s/2-a.width/2,i+r.height+60,o):place(e,1===o?n+r.width+64:n-a.width-64,c+s/2-a.height/2,o),c+=s+20}};if("both"===t.layout){const e=d.get(r.id);a.push({...r,...e,x:0,y:0,side:1});const n=kids(r.id),i=mindMapBranchSides(t);for(const t of[-1,1]){const o=n.filter(e=>i.get(e.id)===t);let r=e.height/2-o.reduce((t,e)=>t+span(e)+20,-20)/2;for(const n of o){const i=d.get(n.id),o=span(n);place(n,1===t?e.width+64:-i.width-64,r+o/2-i.height/2,t),r+=o+20}}}else place(r,0,0,"left"===t.layout?-1:1);const s=new Map(a.map(t=>[t.id,t])),p=a.filter(t=>t.id!==r.id).map(e=>{const n=s.get(e.parentId);let i,o,r,d,a;return"down"===t.layout?(i=n.x+n.width/2,o=n.y+n.height,r=e.x+e.width/2,d=e.y,a=`M${i},${o} C${i},${(o+d)/2} ${r},${(o+d)/2} ${r},${d}`):(i=n.x+(1===e.side?n.width:0),o=n.y+n.height/2,r=e.x+(1===e.side?0:e.width),d=e.y+e.height/2,a=`M${i},${o} C${(i+r)/2},${o} ${(i+r)/2},${d} ${r},${d}`),"straight"===t.branchStyle&&(a=`M${i},${o} L${r},${d}`),"step"===t.branchStyle&&(a="down"===t.layout?`M${i},${o} V${(o+d)/2} H${r} V${d}`:`M${i},${o} H${(i+r)/2} V${d} H${r}`),{id:`${n.id}-${e.id}`,source:n.id,target:e.id,path:a}}),c=(t.relations??[]).flatMap(t=>{const e=s.get(t.source),n=s.get(t.target);if(!e||!n)return[];const i=(e.x+e.width/2+n.x+n.width/2)/2,o=7*[...t.label].length/2;return[{left:i-o,right:i+o,top:Math.min(e.y,n.y)-68}]}),l=Math.min(...a.map(t=>t.x),...c.map(t=>t.left))-32,h=Math.min(...a.map(t=>t.y),...c.map(t=>t.top))-32;return{nodes:a,edges:p,bounds:{x:l,y:h,width:Math.max(...a.map(t=>t.x+t.width),...c.map(t=>t.right))-l+32,height:Math.max(...a.map(t=>t.y+t.height))-h+32}}}exports.MIND_MAP_PALETTE={blue:"#3864ef",teal:"#087f8c",violet:"#7950c7",amber:"#a66b08"};const escapeXml=t=>t.replace(/[&<>"']/g,t=>({"&":"&","<":"<",">":">",'"':""","'":"'"}[t]));function mindMapOutline(t){const e=mindMapTree(t),n=[],visit=(t,i)=>{const o=e.find(e=>e.id===t);if(o){n.push({...o,depth:i});for(const n of e.filter(e=>e.parentId===t))visit(n.id,i+1)}};return visit(t.rootId,0),n}function mindRelationPaths(t,e){const n=new Map(e.nodes.map(t=>[t.id,t]));return(t.relations??[]).flatMap(t=>{const e=n.get(t.source),i=n.get(t.target);if(!e||!i||e===i)return[];const o=e.x+e.width/2,r=e.y,d=i.x+i.width/2,a=i.y,s=Math.min(r,a)-48;return[{...t,path:`M${o},${r} C${o},${s} ${d},${s} ${d},${a}`,x:(o+d)/2,y:s+8}]})}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.MIND_TOPIC_FONT=exports.MIND_TOPIC_PADDING=exports.mindTopicLineHeight=exports.MIND_TOPIC_LINE_HEIGHT=void 0,exports.setMindTextMeasureFactory=function setMindTextMeasureFactory(n){t=n,e.clear()},exports.mindTextMeasure=mindTextMeasure,exports.wrapMindText=wrapMindText,exports.mindTopicTextSize=function mindTopicTextSize(t,n=14,i=!1,s="",r=!1,o=0){const p=JSON.stringify([t,n,i,s,r,o]),a=e.get(p);if(a)return a;const x=mindTextMeasure(n,r?700:i?600:400),I=mindTextMeasure(12),M=t||"未命名主题",T=Math.max(...M.split("\n").map(x),...s.split("\n").map(I)),c=Math.min(240,Math.max(i?128:100,o,Math.ceil(T+exports.MIND_TOPIC_PADDING+2))),u=wrapMindText(M,c-exports.MIND_TOPIC_PADDING,x),d={width:c,lines:u,descriptionLines:s?wrapMindText(s,c-exports.MIND_TOPIC_PADDING,I):[],titleHeight:u.length*(0,exports.mindTopicLineHeight)(n)};return e.size>=512&&e.delete(e.keys().next().value),e.set(p,d),d},exports.MIND_TOPIC_LINE_HEIGHT=22,exports.mindTopicLineHeight=(e=14)=>Math.max(exports.MIND_TOPIC_LINE_HEIGHT,Math.ceil(1.4*e)),exports.MIND_TOPIC_PADDING=34,exports.MIND_TOPIC_FONT='-apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif';const e=new Map;let t;function mindTextMeasure(e=14,n=400){const i=t?.(e,n);return i||(t=>[...t].reduce((t,n)=>t+(/[\u0000-\u00ff]/.test(n)?9:14)*e/14,0))}function wrapMindText(e,t,n){const i=[],s="function"==typeof Intl.Segmenter?new Intl.Segmenter(void 0,{granularity:"grapheme"}):null;for(const r of e.split("\n")){let e="";const o=s?[...s.segment(r)].map(e=>e.segment):[...r];for(const s of o)e&&n(e+s)>t&&(i.push(e),e=""),e+=s;i.push(e)}return i}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.UNKNOWN_NODE_LABEL=exports.NODE_CATALOG=void 0,exports.nodeMeta=function nodeMeta(l){return l?e.get(l):void 0},exports.headingTag=function headingTag(e){const l="number"==typeof e?e:1;return`h${Math.min(Math.max(l,1),6)}`},exports.NODE_CATALOG=[{type:"doc",kind:"block",label:"文档",topLevel:!0},{type:"paragraph",kind:"block",label:"段落",topLevel:!0},{type:"heading",kind:"block",label:"标题",topLevel:!0},{type:"bulletList",kind:"block",label:"无序列表",topLevel:!0},{type:"orderedList",kind:"block",label:"有序列表",topLevel:!0},{type:"taskList",kind:"block",label:"待办列表",topLevel:!0},{type:"listItem",kind:"block",label:"列表项"},{type:"taskItem",kind:"block",label:"待办项"},{type:"blockquote",kind:"block",label:"引用块",topLevel:!0},{type:"codeBlock",kind:"block",label:"代码块",topLevel:!0},{type:"horizontalRule",kind:"atom",atom:!0,label:"分割线",topLevel:!0},{type:"table",kind:"block",label:"表格",topLevel:!0},{type:"tableRow",kind:"block",label:"表格行"},{type:"tableHeader",kind:"block",label:"表头单元格"},{type:"tableCell",kind:"block",label:"单元格"},{type:"image",kind:"atom",atom:!0,label:"图片",topLevel:!0},{type:"fileAttachment",kind:"atom",atom:!0,label:"视频或文件",topLevel:!0},{type:"videoEmbed",kind:"atom",atom:!0,label:"嵌入视频",topLevel:!0},{type:"mindMap",kind:"block",label:"思维导图",topLevel:!0},{type:"mindMapDescription",kind:"inline",label:"主题描述"},{type:"mindMapNote",kind:"inline",label:"主题备注"},{type:"mindMapRelation",kind:"block",label:"主题关系"},{type:"mindMapTopic",kind:"block",label:"导图主题"},{type:"callout",kind:"block",label:"高亮块",topLevel:!0},{type:"columns",kind:"block",label:"分栏",topLevel:!0},{type:"column",kind:"block",label:"栏"},{type:"pageLink",kind:"atom",atom:!0,label:"页面引用"},{type:"mention",kind:"atom",atom:!0,label:"提及用户"},{type:"mathInline",kind:"atom",atom:!0,label:"行内公式"},{type:"mathBlock",kind:"atom",atom:!0,label:"公式块",topLevel:!0},{type:"text",kind:"text",label:"文本"},{type:"hardBreak",kind:"inline",atom:!0,label:"换行"}];const e=new Map(exports.NODE_CATALOG.map(e=>[e.type,e]));exports.UNKNOWN_NODE_LABEL="此内容由更高版本的编辑器创建,当前版本无法显示";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function colorForUser(e){return exports.PRESENCE_PALETTE[hashIndex(e,exports.PRESENCE_PALETTE.length)]}function hashIndex(e,r){let t=2166136261;for(let r=0;r<e.length;r++)t^=e.charCodeAt(r),t=t+((t<<1)+(t<<4)+(t<<7)+(t<<8)+(t<<24))>>>0;return r>0?t%r:0}function relativeLuminance(e){const r=parseHex(e);if(!r)return 0;const[t,o,s]=r.map(e=>{const r=e/255;return r<=.03928?r/12.92:((r+.055)/1.055)**2.4});return.2126*t+.7152*o+.0722*s}function contrastRatio(e,r){const t=relativeLuminance(e),o=relativeLuminance(r);return(Math.max(t,o)+.05)/(Math.min(t,o)+.05)}function parseHex(e){const r=/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(e.trim());if(!r)return null;let t=r[1];return 3===t.length&&(t=t.split("").map(e=>e+e).join("")),[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]}Object.defineProperty(exports,"__esModule",{value:!0}),exports.DARK_TEXT=exports.PRESENCE_PALETTE=void 0,exports.colorForUser=colorForUser,exports.hashIndex=hashIndex,exports.initialOf=function initialOf(e){const r=e.trim();return""===r?"?":r.slice(0,1).toUpperCase()},exports.collectPresence=function collectPresence(e,r){const t=new Map;for(const o of e)o.userId&&(r&&o.userId===r||t.has(o.userId)||t.set(o.userId,{userId:o.userId,displayName:o.displayName||"匿名",color:colorForUser(o.userId)}));return[...t.values()].sort((e,r)=>e.displayName.localeCompare(r.displayName,"zh-Hans-CN"))},exports.relativeLuminance=relativeLuminance,exports.contrastRatio=contrastRatio,exports.readableTextColor=function readableTextColor(e){return contrastRatio(e,"#ffffff")>=contrastRatio(e,exports.DARK_TEXT)?"#ffffff":exports.DARK_TEXT},exports.parseHex=parseHex,exports.PRESENCE_PALETTE=["#2f6feb","#127a45","#b45309","#c026d3","#dc2626","#0e7490","#7c3aed","#9a4a08"],exports.DARK_TEXT="#1f2937";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.isSafeHref=isSafeHref,exports.safeHref=function safeHref(e){return isSafeHref(e)?String(e):"#"};const e=/^(https?:|mailto:)/i;function isSafeHref(t){if("string"!=typeof t)return!1;const r=t.replace(/[\u0000-\u001f\u007f\s]/g,"").toLowerCase();return!(""===r||!r.startsWith("/")&&!r.startsWith("#")&&!e.test(r)&&r.includes(":"))}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.CELL_BACKGROUNDS=void 0,exports.cellBackground=function cellBackground(e){return"string"==typeof e&&exports.CELL_BACKGROUNDS.some(a=>a.value===e)?e:null},exports.CELL_BACKGROUNDS=[{name:"默认",value:null},{name:"灰",value:"#f1f3f5"},{name:"黄",value:"#fff3bf"},{name:"绿",value:"#d3f9d8"},{name:"蓝",value:"#d0ebff"},{name:"紫",value:"#e5dbff"},{name:"红",value:"#ffe3e3"}];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.TABLE_CELL_MIN_WIDTH=void 0,exports.tableColumnWidths=function tableColumnWidths(t){const e=t.content?.find(t=>"tableRow"===t.type),o=[];for(const t of e?.content??[]){const e=Number(t.attrs?.colspan??1),r=Number.isSafeInteger(e)&&e>0?Math.min(e,1e3):1,n=t.attrs?.colwidth;for(let t=0;t<r;t+=1){const e=Array.isArray(n)?n[t]:void 0;o.push("number"==typeof e&&Number.isFinite(e)&&e>0?e:0)}}return o},exports.tableMinWidth=function tableMinWidth(t){return t.length>0?t.reduce((t,e)=>t+(e>0?e:exports.TABLE_CELL_MIN_WIDTH),0):void 0},exports.TABLE_CELL_MIN_WIDTH=120;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function normalizeVideoEmbed(e){if(!e||"object"!=typeof e)return null;const r=e,t="youtube"===r.provider?"string"==typeof r.videoId&&/^[\w-]{11}$/.test(r.videoId):"bilibili"===r.provider&&"string"==typeof r.videoId&&/^(BV[A-Za-z0-9]{10}|av[1-9]\d{0,15})$/.test(r.videoId),i=r.page??1,o=r.startSeconds??0;return!t||!Number.isInteger(i)||Number(i)<1||Number(i)>1e3||!Number.isInteger(o)||Number(o)<0||Number(o)>604800?null:{provider:r.provider,videoId:r.videoId,page:"youtube"===r.provider?1:Number(i),startSeconds:Number(o)}}function seconds(e){if(!e)return 0;if(/^\d+$/.test(e))return Number(e);const r=/^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/.exec(e);return r&&r[0]?3600*Number(r[1]??0)+60*Number(r[2]??0)+Number(r[3]??0):NaN}Object.defineProperty(exports,"__esModule",{value:!0}),exports.normalizeVideoEmbed=normalizeVideoEmbed,exports.parseVideoUrl=function parseVideoUrl(e){let r;try{r=new URL(e.trim())}catch{return null}if(!["https:","http:"].includes(r.protocol)||r.username||r.password||r.port)return null;const t=r.hostname.toLowerCase(),i=r.pathname.split("/").filter(Boolean);let o,s;if("youtu.be"===t)o="youtube",s=1===i.length?i[0]:null;else if(["youtube.com","www.youtube.com","m.youtube.com","www.youtube-nocookie.com"].includes(t))o="youtube",s="/watch"===r.pathname?r.searchParams.get("v"):["embed","shorts","live"].includes(i[0])&&2===i.length?i[1]:null;else if(["bilibili.com","www.bilibili.com","m.bilibili.com"].includes(t))o="bilibili",s="video"===i[0]&&2===i.length?i[1]:null;else{if("player.bilibili.com"!==t||"/player.html"!==r.pathname)return null;o="bilibili",s=r.searchParams.get("bvid")??(r.searchParams.get("aid")?`av${r.searchParams.get("aid")}`:null)}const a=/^#t=(.*)$/.exec(r.hash)?.[1]??null;return normalizeVideoEmbed({provider:o,videoId:s,page:Number(r.searchParams.get("p")??1),startSeconds:seconds(r.searchParams.get("start")??r.searchParams.get("t")??a)})},exports.videoSourceUrl=function videoSourceUrl(e){const r=normalizeVideoEmbed(e);if(!r)return"";const t=new URL("youtube"===r.provider?`https://www.youtube.com/watch?v=${r.videoId}`:`https://www.bilibili.com/video/${r.videoId}`);return"bilibili"===r.provider&&r.page>1&&t.searchParams.set("p",String(r.page)),r.startSeconds&&t.searchParams.set("t",String(r.startSeconds)),t.href},exports.videoPlayerUrl=function videoPlayerUrl(e){const r=normalizeVideoEmbed(e);if(!r)return"";const t=new URL("youtube"===r.provider?`https://www.youtube.com/embed/${r.videoId}`:"https://player.bilibili.com/player.html");return t.searchParams.set("autoplay","0"),"youtube"===r.provider?(t.searchParams.set("playsinline","1"),r.startSeconds&&t.searchParams.set("start",String(r.startSeconds))):(t.searchParams.set(r.videoId.startsWith("BV")?"bvid":"aid",r.videoId.startsWith("BV")?r.videoId:r.videoId.slice(2)),t.searchParams.set("p",String(r.page)),t.searchParams.set("t",String(r.startSeconds)),t.searchParams.set("danmaku","0")),t.href};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";function isWorkbookDocument(e){return!!e&&"object"==typeof e&&"workbook"===e.type}function record(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function index(e,o){return/^(0|[1-9]\d*)$/.test(e)&&Number(e)<o}function workbookCellText(e){return e?e.p?.body?.dataStream?e.p.body.dataStream.replace(/[\r\n]+$/,""):void 0!==e.v&&null!==e.v?String(e.v):e.f??"":""}Object.defineProperty(exports,"__esModule",{value:!0}),exports.WORKBOOK_LIMITS=void 0,exports.isWorkbookDocument=isWorkbookDocument,exports.emptyWorkbook=function emptyWorkbook(e){return{type:"workbook",formatVersion:1,workbook:{id:e,name:"工作簿",appVersion:"1.1.0",locale:"zhCN",sheetOrder:["sheet1"],sheets:{sheet1:{id:"sheet1",name:"Sheet1",rowCount:1e3,columnCount:26,cellData:{}}}}}},exports.validateWorkbook=function validateWorkbook(e){const fail=e=>{throw new Error(`工作表格式无效:${e}`)};isWorkbookDocument(e)&&1===e.formatVersion&&record(e.workbook)||fail("不支持的版本");const o=e,t=JSON.stringify(o);(new TextEncoder).encode(t).byteLength>exports.WORKBOOK_LIMITS.bytes&&fail("超过 4MB");let r=0;const walk=(e,o)=>{if((++r>5e5||o>40)&&fail("结构过大或嵌套过深"),"number"!=typeof e||Number.isFinite(e)||fail("包含非法数值"),Array.isArray(e))e.forEach(e=>walk(e,o+1));else if(record(e)){Object.getPrototypeOf(e)!==Object.prototype&&null!==Object.getPrototypeOf(e)&&fail("包含非法对象");for(const[t,r]of Object.entries(e))["__proto__","constructor","prototype"].includes(t)&&fail("包含非法属性"),walk(r,o+1)}};walk(o,0);const n=o.workbook;("string"!=typeof n.id||!n.id||n.id.length>128||"string"!=typeof n.name||n.name.length>256)&&fail("工作簿名称或标识无效"),Array.isArray(n.sheetOrder)&&n.sheetOrder.length&&!(n.sheetOrder.length>exports.WORKBOOK_LIMITS.sheets)&&new Set(n.sheetOrder).size===n.sheetOrder.length&&record(n.sheets)&&Object.keys(n.sheets).length===n.sheetOrder.length||fail("表页数量或顺序无效");let s=0;const a=new Set;for(const e of n.sheetOrder){("string"!=typeof e||!e||e.length>128)&&fail("表页标识无效");const o=n.sheets[e];if((!record(o)||o.id!==e||"string"!=typeof o.name||!o.name.trim()||o.name.length>31||/[\\/*?:[\]]/.test(o.name)||a.has(o.name.toLowerCase()))&&fail("表页名称无效或重复(最多 31 字符)"),a.add(o.name.toLowerCase()),(!Number.isInteger(o.rowCount)||o.rowCount<1||o.rowCount>exports.WORKBOOK_LIMITS.rows||!Number.isInteger(o.columnCount)||o.columnCount<1||o.columnCount>exports.WORKBOOK_LIMITS.columns)&&fail("行列超出上限"),void 0!==o.cellData){record(o.cellData)||fail("单元格结构无效");for(const[e,t]of Object.entries(o.cellData)){index(e,o.rowCount)&&record(t)||fail("单元格行号无效");for(const[e,r]of Object.entries(t))++s>exports.WORKBOOK_LIMITS.cells&&fail("单元格超过 50000 个"),index(e,o.columnCount)||fail("单元格列号无效"),null!==r&&(record(r)||fail("单元格结构无效"),void 0===r.v||null===r.v||["string","number","boolean"].includes(typeof r.v)||fail("单元格值无效"),"string"==typeof r.v&&r.v.length>16e3&&fail("单元格文字过长"),void 0!==r.f&&("string"!=typeof r.f||r.f.length>4e3)&&fail("公式无效"),void 0!==r.t&&(!Number.isInteger(r.t)||Number(r.t)<0||Number(r.t)>4)&&fail("单元格类型无效"),void 0===r.s||null===r.s||"string"==typeof r.s||record(r.s)||fail("单元格样式无效"),void 0===r.p||record(r.p)&&(void 0===r.p.body||record(r.p.body)&&"string"==typeof r.p.body.dataStream&&!(r.p.body.dataStream.length>16e3))||fail("单元格富文本无效"))}}for(const[e,t]of[[o.rowData,o.rowCount],[o.columnData,o.columnCount]])void 0===e||record(e)&&!Object.keys(e).some(e=>!index(e,t))||fail("行列属性越界");if(void 0!==o.mergeData){(!Array.isArray(o.mergeData)||o.mergeData.length>exports.WORKBOOK_LIMITS.cells)&&fail("合并区域无效");const e=new Set;for(const t of o.mergeData){(!record(t)||![t.startRow,t.endRow,t.startColumn,t.endColumn].every(Number.isInteger)||t.startRow<0||t.endRow<t.startRow||t.endRow>=o.rowCount||t.startColumn<0||t.endColumn<t.startColumn||t.endColumn>=o.columnCount)&&fail("合并区域越界");const r=(t.endRow-t.startRow+1)*(t.endColumn-t.startColumn+1);e.size+r>2e5&&fail("合并区域总范围过大");for(let o=t.startRow;o<=t.endRow;o++)for(let r=t.startColumn;r<=t.endColumn;r++){const t=o*exports.WORKBOOK_LIMITS.columns+r;e.has(t)&&fail("合并区域重叠"),e.add(t)}}}}return JSON.parse(t)},exports.workbookCellText=workbookCellText,exports.workbookText=function workbookText(e){return e.workbook.sheetOrder.map(o=>{const t=e.workbook.sheets[o];return`${t.name} ${Object.values(t.cellData??{}).flatMap(e=>Object.values(e).map(workbookCellText)).join(" ")}`}).join(" ").slice(0,2e5)},exports.WORKBOOK_LIMITS={sheets:20,rows:1e4,columns:200,cells:5e4,bytes:4194304};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,o,i)}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),t=this&&this.__exportStar||function(t,r){for(var o in t)"default"===o||Object.prototype.hasOwnProperty.call(r,o)||e(r,t,o)};Object.defineProperty(exports,"__esModule",{value:!0}),t(require("./shared/workbook.js"),exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var o=Object.getOwnPropertyDescriptor(t,r);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,o)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),t=this&&this.__exportStar||function(t,r){for(var i in t)"default"===i||Object.prototype.hasOwnProperty.call(r,i)||e(r,t,i)};Object.defineProperty(exports,"__esModule",{value:!0}),t(require("./shared/types.js"),exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var o=Object.getOwnPropertyDescriptor(t,r);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,o)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),t=this&&this.__exportStar||function(t,r){for(var i in t)"default"===i||Object.prototype.hasOwnProperty.call(r,i)||e(r,t,i)};Object.defineProperty(exports,"__esModule",{value:!0}),t(require("../shared/callout.js"),exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ALLOWED_MARKS=exports.ALLOWED_NODES=void 0,exports.ALLOWED_NODES=new Set(["mindMapDescription","mindMapNote","mindMapRelation","mindMap","mindMapTopic","doc","paragraph","text","heading","bulletList","orderedList","listItem","taskList","taskItem","blockquote","codeBlock","horizontalRule","hardBreak","image","fileAttachment","videoEmbed","callout","columns","column","table","tableRow","tableHeader","tableCell","pageLink","mention","mathInline","mathBlock"]),exports.ALLOWED_MARKS=new Set(["bold","italic","strike","code","link","textStyle","highlight"]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ContentValidationError=void 0;class ContentValidationError extends Error{code;status;details;constructor(t,r,o=422,e){super(r),this.code=t,this.status=o,this.details=e,this.name="ContentValidationError"}static validation(t){return new ContentValidationError("validation.failed",t)}}exports.ContentValidationError=ContentValidationError;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.validateMindMap=function validateMindMap(t){const e=t.attrs;if(!e||![1,2,3].includes(Number(e.formatVersion))||!idOk(e.id)||!idOk(e.rootId)||!["right","left","both","down"].includes(String(e.layout))||!["blue","teal","violet","amber"].includes(String(e.theme))||"number"!=typeof e.height||!Number.isFinite(e.height)||e.height<240||e.height>800)throw new Error("思维导图属性或格式版本无效");if(!Array.isArray(t.content)||t.content.length<1||t.content.filter(t=>"mindMapTopic"===t?.type).length>500||t.content.length>1500)throw new Error("思维导图需要 1~500 个主题");const r=new Set;for(const e of t.content.filter(t=>"mindMapRelation"!==t?.type)){const t=e?.attrs;if(!e||"mindMapTopic"!==e.type||!t||!idOk(t.id)||r.has(t.id)||"string"!=typeof t.parentId||""!==t.parentId&&!idOk(t.parentId)||"number"!=typeof t.order||!Number.isFinite(t.order)||Math.abs(t.order)>1e12||void 0!==e.content&&!Array.isArray(e.content))throw new Error("思维导图主题结构无效");r.add(t.id);for(const[e,r]of Object.entries({shape:["round","pill","text"],align:["left","center","right"]}))if(void 0!==t[e]&&null!==t[e]&&!r.includes(String(t[e])))throw new Error("导图主题样式无效");for(const e of["color","background"])if(t[e]&&!["#18243a","#ffffff","#3864ef","#087f8c","#7950c7","#a66b08","#d94848","#f3f5fb","#dce7ff","#d3f4e9","#ece0ff","#fff0c2","#ffe1e1","#233044"].includes(String(t[e])))throw new Error("导图颜色无效");if(void 0!==t.fontSize&&null!==t.fontSize&&![12,14,16,18,20].includes(Number(t.fontSize)))throw new Error("导图字号无效");if(t.icon&&!["💡","🎯","📌","🚩","⭐","✅","⚠️","💬","📅","🔎"].includes(String(t.icon)))throw new Error("导图图标无效");if(void 0!==t.done&&null!==t.done&&"boolean"!=typeof t.done)throw new Error("导图状态无效");if(void 0!==t.side&&null!==t.side&&-1!==t.side&&1!==t.side)throw new Error("导图分支方向无效");if(t.attachmentId&&("string"!=typeof t.attachmentId||!/^[0-9a-f-]{36}$/i.test(t.attachmentId)))throw new Error("导图图片引用无效");let n=0;const o=new Set;let i=!1,d=!1;for(const t of e.content??[])if(t&&["mindMapDescription","mindMapNote"].includes(t.type??"")){if("mindMapDescription"===t.type&&d)throw new Error("主题描述必须位于备注之前");if(i=!0,"mindMapNote"===t.type&&(d=!0),o.has(t.type)||void 0!==t.content&&!Array.isArray(t.content)||t.content?.some(t=>"text"!==t?.type||"string"!=typeof t.text||void 0!==t.content)||(t.content??[]).reduce((t,e)=>t+(e.text?.length??0),0)>4e3)throw new Error("导图描述或备注无效");o.add(t.type)}else{if(!t||"text"!==t.type||"string"!=typeof t.text||void 0!==t.content)throw new Error("思维导图主题只支持纯文本");if(i)throw new Error("主题标题必须位于描述和备注之前");n+=t.text.length}if(n>2e3)throw new Error("单个主题文字不得超过 2000 字符")}if(!r.has(e.rootId))throw new Error("思维导图缺少中心主题");if(e.branchStyle&&!["curve","straight","step"].includes(String(e.branchStyle)))throw new Error("分支样式无效");const n=new Set;for(const e of t.content.filter(t=>"mindMapRelation"===t?.type)){const t=e.attrs;if(!t||!idOk(t.id)||r.has(t.id)||n.has(t.id)||!idOk(t.source)||!idOk(t.target)||t.source===t.target||!["related","depends","reference"].includes(String(t.kind))||"string"!=typeof t.label||t.label.length>200||e.content?.length)throw new Error("导图关系线无效");n.add(t.id)}},exports.mindMapOutline=function mindMapOutline(t){const e=String(t.attrs?.rootId??"");if(!idOk(e)||!Array.isArray(t.content)||t.content.filter(t=>"mindMapTopic"===t?.type).length>500||t.content.length>1500)return[];const r=(t.content??[]).filter(t=>"mindMapTopic"===t.type).map(t=>({id:String(t.attrs?.id??""),parentId:String(t.attrs?.parentId??""),order:Number(t.attrs?.order)||0,text:(t.content??[]).filter(t=>"text"===t.type).map(t=>t.text??"").join(""),...Object.fromEntries((t.content??[]).filter(t=>"mindMapDescription"===t.type||"mindMapNote"===t.type).map(t=>["mindMapDescription"===t.type?"description":"note",(t.content??[]).map(t=>t.text??"").join("")])),...t.attrs?.attachmentId?{attachmentId:String(t.attrs.attachmentId)}:{}}));if(!r.some(t=>t.id===e))return[];const n=new Map(r.map(t=>[t.id,t]));for(const t of r)t.id===e?t.parentId="":n.has(t.parentId)&&t.parentId!==t.id||(t.parentId=e);for(const t of[...r].sort((t,e)=>t.id.localeCompare(e.id))){const r=[],o=new Set;let i=t;for(;i&&i.id!==e;){if(o.has(i.id)){n.get(r.slice(r.indexOf(i.id)).sort()[0]).parentId=e;break}r.push(i.id),o.add(i.id),i=n.get(i.parentId)}}r.sort((t,e)=>t.order-e.order||t.id.localeCompare(e.id));const o=[],i=new Set,visit=(t,e)=>{const d=n.get(t);if(d&&!i.has(t)){i.add(t),o.push({...d,depth:e});for(const n of r.filter(e=>e.parentId===t))visit(n.id,e+1)}};return visit(e,0),o};const idOk=t=>"string"==typeof t&&/^[\w-]{1,80}$/.test(t);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.CONTENT_SCHEMA_VERSION=void 0,exports.CONTENT_SCHEMA_VERSION=10;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.ContentSchemaService=exports.SCHEMA_VERSION=exports.ALLOWED_NODES=void 0;const t=require("./error.js"),e="validation.failed",n=require("./doc-node-whitelist.js");Object.defineProperty(exports,"ALLOWED_NODES",{enumerable:!0,get:function(){return n.ALLOWED_NODES}});const r=require("./video-embed.js"),o=require("./schema-version.js"),i=require("./mind-map.js"),a=require("./callout.js"),s=require("./workbook.js");exports.SCHEMA_VERSION=o.CONTENT_SCHEMA_VERSION;const l={heading:new Set(["level","textAlign","indent"]),paragraph:new Set(["textAlign","indent"]),orderedList:new Set(["start"]),textStyle:new Set(["color"]),highlight:new Set(["color"]),image:new Set(["attachmentId","alt","width","align"]),fileAttachment:new Set(["attachmentId","filename","mimeType","size"]),videoEmbed:new Set(["provider","videoId","page","startSeconds"]),mindMap:new Set(["id","rootId","formatVersion","layout","theme","height","branchStyle"]),mindMapTopic:new Set(["id","parentId","order","shape","color","background","fontSize","align","icon","done","attachmentId","side"]),mindMapRelation:new Set(["id","source","target","kind","label"]),callout:new Set(["tone","icon","textColor","borderColor","backgroundColor"]),codeBlock:new Set(["language"]),link:new Set(["href","target","rel"]),pageLink:new Set(["pageId","label"]),mention:new Set(["userId","label"]),tableCell:new Set(["colspan","rowspan","align","colwidth","backgroundColor"]),tableHeader:new Set(["colspan","rowspan","align","colwidth","backgroundColor"]),taskItem:new Set(["checked"]),mathInline:new Set(["latex"]),mathBlock:new Set(["latex"])},c=new Set(["colspan","rowspan"]),d=new Set(["#f1f3f5","#fff3bf","#d3f9d8","#d0ebff","#e5dbff","#ffe3e3"]);function isTableCellType(t){return"tableCell"===t||"tableHeader"===t}function coercePositiveInt(t){const e="number"==typeof t?t:Number.parseInt(String(t??""),10);if(!Number.isFinite(e))return;const n=Math.floor(e);return n>=1?n:void 0}function coerceColwidth(t){if(null===t)return null;let e;if(Array.isArray(t))e=t;else{if("string"!=typeof t)return;{const n=t.trim();if(!n)return null;if(n.startsWith("["))try{const t=JSON.parse(n);e=Array.isArray(t)?t:[]}catch{return}else e=n.split(",")}}if(0===e.length)return null;const n=e.map(t=>{const e="number"==typeof t?t:Number.parseInt(String(t??""),10);return Number.isFinite(e)&&e>0?Math.floor(e):0});return n.some(t=>t>0)?n:null}exports.ContentSchemaService=class ContentSchemaService{validate(o,f){if(!Number.isSafeInteger(f)||f<1)throw t.ContentValidationError.validation("内容版本必须是正整数");if((0,s.isWorkbookDocument)(o)){if(10!==f)throw t.ContentValidationError.validation("工作表需要当前编辑器版本");try{return{doc:(0,s.validateWorkbook)(o),schemaVersion:f,linkTargetIds:[],attachmentIds:[],mentionUserIds:[]}}catch(e){throw t.ContentValidationError.validation(e instanceof Error?e.message:"工作表格式无效")}}if("object"!=typeof o||null===o||"doc"!==o.type)throw t.ContentValidationError.validation("正文格式非法:根节点必须是 doc");if(f>exports.SCHEMA_VERSION)throw new t.ContentValidationError(e,`正文版本 ${f} 高于服务端支持的 ${exports.SCHEMA_VERSION},请升级后再编辑`,422);const p=new Set,h=new Set,m=new Set;let u=0;const walk=(o,s,f="")=>{if("object"!=typeof o||null===o)throw t.ContentValidationError.validation("正文包含非法节点");if(s>100)throw t.ContentValidationError.validation("正文嵌套层级过深");const S=o,g=S.type;if(("mindMapTopic"===g||"mindMapRelation"===g)&&"mindMap"!==f)throw t.ContentValidationError.validation("导图主题只能放在思维导图内");if(["mindMapDescription","mindMapNote"].includes(String(g))&&"mindMapTopic"!==f)throw t.ContentValidationError.validation("导图描述只能放在主题内");if("mindMap"===g)try{(0,i.validateMindMap)(S)}catch(e){throw t.ContentValidationError.validation(e instanceof Error?e.message:"思维导图结构无效")}if("callout"===g&&!(0,a.validCalloutAttrs)(S.attrs??{}))throw t.ContentValidationError.validation("高亮块属性无效");if("string"==typeof g){if(!n.ALLOWED_NODES.has(g))throw new t.ContentValidationError(e,`正文包含服务端不支持的节点「${g}」,已拒绝保存以避免内容丢失`,422,{nodeType:g,schemaVersion:exports.SCHEMA_VERSION});if(u+=1,u>2e4)throw t.ContentValidationError.validation("正文节点数超出上限")}const y={};if("string"==typeof g&&(y.type=g),S.attrs&&"object"==typeof S.attrs){const t="string"==typeof g?l[g]:void 0,e={};for(const[n,r]of Object.entries(S.attrs))if(t&&t.has(n))if(isTableCellType(g)&&"backgroundColor"===n)"string"==typeof r&&d.has(r)&&(e[n]=r);else if("href"!==n||"string"!=typeof r||this.isSafeHref(r)){if(isTableCellType(g)&&c.has(n)){const t=coercePositiveInt(r);if(void 0===t)continue;e[n]=t;continue}if(isTableCellType(g)&&"colwidth"===n){const t=coerceColwidth(r);if(void 0===t)continue;e[n]=t;continue}e[n]=r}Object.keys(e).length>0&&(y.attrs=e)}if("videoEmbed"===g){const e=(0,r.normalizeVideoEmbed)(S.attrs);if(!e)throw t.ContentValidationError.validation("视频属性无效,请重新插入视频");y.attrs={...e}}if("string"==typeof S.text&&(y.text=S.text),Array.isArray(S.marks)){const t=S.marks.filter(t=>"string"==typeof t.type&&n.ALLOWED_MARKS.has(t.type)).map(t=>{const e={type:t.type};if(t.attrs&&"object"==typeof t.attrs){const n=l[t.type],r={};for(const[e,o]of Object.entries(t.attrs))n?.has(e)&&("href"!==e||"string"==typeof o&&this.isSafeHref(o))&&(r[e]=o);Object.keys(r).length>0&&(e.attrs=r)}return e});t.length>0&&(y.marks=t)}if("pageLink"===g&&S.attrs){const t=S.attrs.pageId;"string"==typeof t&&t.length>0&&p.add(t)}if(("image"===g||"mindMapTopic"===g)&&S.attrs){const t=S.attrs.attachmentId;"string"==typeof t&&t.length>0&&h.add(t)}if("fileAttachment"===g&&S.attrs){const t=S.attrs.attachmentId;"string"==typeof t&&t.length>0&&h.add(t)}if(("mathInline"===g||"mathBlock"===g)&&S.attrs){const e=S.attrs.latex;if("string"==typeof e&&e.length>5e3)throw t.ContentValidationError.validation("公式内容过长(上限 5000 字符)")}if("mention"===g&&S.attrs){const t=S.attrs.userId;"string"==typeof t&&t.length>0&&m.add(t)}return Array.isArray(S.content)&&(y.content=S.content.filter(t=>null!=t).map(t=>walk(t,s+1,"string"==typeof g?g:""))),y};return{doc:walk(o,0),schemaVersion:exports.SCHEMA_VERSION,linkTargetIds:[...p],attachmentIds:[...h],mentionUserIds:[...m]}}isSafeHref(t){const e=t.trim().toLowerCase();return!(!e.startsWith("/")&&!e.startsWith("#"))||e.startsWith("http://")||e.startsWith("https://")||e.startsWith("mailto:")}extractPlainText(t){if((0,s.isWorkbookDocument)(t))return(0,s.workbookText)(t);const e=[],walk=t=>{if("object"!=typeof t||null===t)return;const n=t;"string"==typeof n.text&&e.push(n.text),Array.isArray(n.content)&&n.content.forEach(walk)};return walk(t),e.join(" ").replace(/\s+/g," ").trim()}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var o=Object.getOwnPropertyDescriptor(t,r);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,o)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),t=this&&this.__exportStar||function(t,r){for(var i in t)"default"===i||Object.prototype.hasOwnProperty.call(r,i)||e(r,t,i)};Object.defineProperty(exports,"__esModule",{value:!0}),t(require("../shared/video-embed.js"),exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,o,i)}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),t=this&&this.__exportStar||function(t,r){for(var o in t)"default"===o||Object.prototype.hasOwnProperty.call(r,o)||e(r,t,o)};Object.defineProperty(exports,"__esModule",{value:!0}),t(require("../shared/workbook.js"),exports);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./schema.js";export*from"./shared/node-catalog.js";export*from"./shared/doc-text.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./schema.js";export{emptyWorkbook,validateWorkbook}from"./spreadsheet.js";export{createMindMap,readMindMap,mindMapToJson}from"./mindmap.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./shared/mind-map.js";export*from"./shared/mind-map-phase2.js";export*from"./shared/mind-map-folding.js";export{validateMindMap}from"./validation/mind-map.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{ContentSchemaService,SCHEMA_VERSION}from"./validation/schema.js";export{ContentValidationError}from"./validation/error.js";export{ALLOWED_NODES,ALLOWED_MARKS}from"./validation/doc-node-whitelist.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const ANCHOR_CONTEXT_LENGTH=64;export const ANCHOR_QUOTE_MAX=500;export function flattenDocText(t){const e=[];let n="";return t.forEach((t,o)=>{o>0&&(n+="\n"),e.push({start:n.length,blockIndex:o,length:t.length}),n+=t}),{text:n,segments:e}}export function locateBlock(t,e){for(const n of t.segments)if(e>=n.start&&e<=n.start+n.length)return{blockIndex:n.blockIndex,offsetInBlock:e-n.start};const n=t.segments[t.segments.length-1];return n&&e>n.start+n.length?{blockIndex:n.blockIndex,offsetInBlock:n.length}:null}export function resolveAnchor(t,e){const n=(e.quote??"").trim();if(0===n.length)return null;const o=e.prefix??"",r=e.suffix??"",l=e.start??-1,c=[];let s=t.indexOf(n);for(;-1!==s;)c.push(s),s=t.indexOf(n,s+1);if(c.length>0){let e=null;for(const s of c){const c=scoreCandidate(t,s,n.length,o,r,l);(!e||c>e.score)&&(e={start:s,score:c})}if(e)return{from:e.start,to:e.start+n.length,score:e.score,exact:!0}}if(o.length>0&&r.length>0){const e=o+r,n=t.indexOf(e);if(-1!==n){const t=n+o.length;return{from:t,to:t,score:50,exact:!1}}}const f=o.length>=r.length?o:r;if(f.length>=4){const e=function nearestOccurrence(t,e,n){if(0===e.length)return-1;const o=[];let r=t.indexOf(e);for(;-1!==r&&(o.push(r),!(o.length>500));)r=t.indexOf(e,r+1);if(0===o.length)return-1;if(n<0)return o[0];let l=o[0];for(const t of o)Math.abs(t-n)<Math.abs(l-n)&&(l=t);return l}(t,f,l);if(-1!==e){const t=o.length>=r.length?e+f.length:e;return{from:t,to:t,score:10,exact:!1}}}return null}function scoreCandidate(t,e,n,o,r,l){let c=1e3;return o.length>0&&(c+=4*commonSuffixLength(t.slice(Math.max(0,e-o.length),e),o)),r.length>0&&(c+=4*commonPrefixLength(t.slice(e+n,e+n+r.length),r)),l>=0&&(c-=Math.min(Math.abs(e-l),200)),c}export function commonSuffixLength(t,e){let n=0;for(;n<t.length&&n<e.length&&t[t.length-1-n]===e[e.length-1-n];)n+=1;return n}export function commonPrefixLength(t,e){let n=0;for(;n<t.length&&n<e.length&&t[n]===e[n];)n+=1;return n}export function clipContext(t){return t.slice(0,64)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const CALLOUT_TONES=["info","success","warning","danger"];export const CALLOUT_ICONS=["💡","ℹ️","✅","⚠️","❗","📌","🎯","💬","📖","📝","🚀","🔔","🔎","⭐","🌅","🛠️","📅","🔒","❤️","🎉","❓","📎","🏁","🔥"];export const CALLOUT_COLORS=["gray","red","orange","yellow","green","blue","purple"];export const CALLOUT_FILLS=[...CALLOUT_COLORS,...CALLOUT_COLORS.map(o=>`${o}-strong`)];export function validCalloutAttrs(o){if(!o||"object"!=typeof o||Array.isArray(o))return!1;const r=o,valid=(o,t)=>void 0===r[o]||null===r[o]||"string"==typeof r[o]&&t.includes(r[o]);return valid("tone",CALLOUT_TONES)&&valid("icon",["",...CALLOUT_ICONS])&&valid("textColor",CALLOUT_COLORS)&&valid("borderColor",["none",...CALLOUT_COLORS])&&valid("backgroundColor",["none",...CALLOUT_FILLS])}export function effectiveCallout(o={}){const r=CALLOUT_TONES.includes(o.tone)?o.tone:"info",t={info:"blue",success:"green",warning:"orange",danger:"red"}[r];return{tone:r,icon:null===o.icon||void 0===o.icon?{info:"💡",success:"✅",warning:"⚠️",danger:"❗"}[r]:["",...CALLOUT_ICONS].includes(o.icon)?o.icon:"💡",textColor:CALLOUT_COLORS.includes(o.textColor)?o.textColor:null,borderColor:["none",...CALLOUT_COLORS].includes(o.borderColor)?o.borderColor:t,backgroundColor:["none",...CALLOUT_FILLS].includes(o.backgroundColor)?o.backgroundColor:t}}export function calloutDOMAttributes(o={}){const r=effectiveCallout(o);return{"data-callout":"true","data-tone":r.tone,"data-callout-icon":o.icon??"default",...Object.fromEntries(["textColor","borderColor","backgroundColor"].filter(r=>null!=o[r]).map(r=>[`data-callout-${r.toLowerCase()}`,String(o[r])])),...""===r.icon?{"data-icon-hidden":"true"}:{},style:["--callout-border:"+("none"===r.borderColor?"transparent":`var(--callout-border-${r.borderColor})`),"--callout-fill:"+("none"===r.backgroundColor?"transparent":`var(--doc-highlight-${"gray"===r.backgroundColor?"gray-soft":r.backgroundColor})`),"--callout-text:"+(r.textColor?`var(--doc-text-${r.textColor})`:"var(--content-text-color, var(--color-text))")].join(";")}}export function calloutMetadata(o){if(!validCalloutAttrs(o))return"";const r=Object.fromEntries(["icon","textColor","borderColor","backgroundColor"].filter(r=>void 0!==o[r]&&null!==o[r]).map(r=>[r,o[r]]));return Object.keys(r).length?` \x3c!--ywiki-callout:${encodeURIComponent(JSON.stringify(r))}--\x3e`:""}export function readCalloutMetadata(o){const r=/^\s*<!--ywiki-callout:([^\s<>]{1,4096})-->\s*/.exec(o);if(!r)return null;try{const o=JSON.parse(decodeURIComponent(r[1]));return!validCalloutAttrs(o)||Object.keys(o).some(o=>!["icon","textColor","borderColor","backgroundColor"].includes(o))?null:{attrs:o,length:r[0].length}}catch{return null}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const CODE_THEMES=[{value:"auto",label:"跟随页面"},{value:"paper",label:"纸白"},{value:"soft",label:"柔和"},{value:"night",label:"深色"}];export function codeBlockDisplay(){return{collapsed:!1,lineNumbers:!0,limited:!0,theme:"auto"}}export function rememberCodeTheme(e){}export function codeLineCount(e){let t=1;for(let o=0;o<e.length;o++)"\n"===e[o]&&t++;return t}export function codeLineNumbers(e){return Array.from({length:codeLineCount(e)},(e,t)=>String(t+1)).join("\n")}export function codeBlockClass(e){return["ywiki-code-panel",`code-theme-${e.theme}`,...e.collapsed?["is-collapsed"]:[],...e.lineNumbers?[]:["without-line-numbers"],...e.limited?[]:["is-unlimited"]]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const CODE_LANGUAGES=[{value:"",label:"纯文本"},{value:"bash",label:"Bash / Shell"},{value:"json",label:"JSON"},{value:"yaml",label:"YAML"},{value:"sql",label:"SQL"},{value:"markdown",label:"Markdown"},{value:"diff",label:"Diff"},{value:"javascript",label:"JavaScript"},{value:"typescript",label:"TypeScript"},{value:"jsx",label:"JSX"},{value:"tsx",label:"TSX"},{value:"python",label:"Python"},{value:"java",label:"Java"},{value:"go",label:"Go"},{value:"rust",label:"Rust"},{value:"c",label:"C"},{value:"cpp",label:"C++"},{value:"csharp",label:"C#"},{value:"php",label:"PHP"},{value:"ruby",label:"Ruby"},{value:"kotlin",label:"Kotlin"},{value:"swift",label:"Swift"},{value:"html",label:"HTML"},{value:"css",label:"CSS"},{value:"xml",label:"XML"},{value:"dockerfile",label:"Dockerfile"},{value:"ini",label:"INI / TOML"}];const l=new Map(CODE_LANGUAGES.map(l=>[l.value,l.label]));export function codeLanguageLabel(a){return a?l.get(a)??a:""}export function isKnownCodeLanguage(a){return l.has(a)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{nodeMeta as t}from"./node-catalog.js";import{SCHEMA_VERSION as r}from"../schema.js";import{readMindMap as o}from"./mind-map.js";import{validCalloutAttrs as e}from"./callout.js";export function supportsDocument(n,p=1){if(p>r)return!1;if(!n)return!0;if("object"!=typeof n)return!1;const m=n;return!(!m.type||!t(m.type))&&!("mindMap"===m.type&&!o(m))&&!("callout"===m.type&&!e(m.attrs??{}))&&(!m.content||Array.isArray(m.content)&&m.content.every(t=>supportsDocument(t)))}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function extractBlockTexts(t){const e=[],walk=(t,n)=>{if(["paragraph","heading","codeBlock","blockquote","listItem","taskItem","tableCell","tableHeader","mindMapTopic"].includes(t.type??""))e.push({index:n,text:plainTextOf(t)});else for(const e of t.content??[])walk(e,n)};return(t?.content??[]).forEach((t,e)=>walk(t,e)),e.filter(t=>t.text.length>0)}export function plainTextOf(t){const e=[],walk=t=>{"string"==typeof t.text&&e.push(t.text);for(const e of t.content??[])walk(e)};return walk(t),e.join("")}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const TEXT_COLORS=[{name:"默认",value:null,token:null},{name:"灰",value:"#868e96",token:"gray"},{name:"红",value:"#d92c2c",token:"red"},{name:"橙",value:"#e07b1a",token:"orange"},{name:"黄褐",value:"#9a7b12",token:"yellow"},{name:"绿",value:"#2f9e44",token:"green"},{name:"蓝",value:"#1971c2",token:"blue"},{name:"紫",value:"#7048e8",token:"purple"}];export const HIGHLIGHT_COLORS=[{name:"无",value:null,token:null},{name:"浅灰",value:"#f1f3f5",token:"gray-soft"},{name:"浅红",value:"#ffe3e3",token:"red"},{name:"浅橙",value:"#fff0db",token:"orange"},{name:"浅黄",value:"#fff3bf",token:"yellow"},{name:"浅绿",value:"#d3f9d8",token:"green"},{name:"浅蓝",value:"#d0ebff",token:"blue"},{name:"浅紫",value:"#e5dbff",token:"purple"},{name:"灰",value:"#dee2e6",token:"gray"},{name:"深灰",value:"#ced4da",token:"gray-strong"},{name:"红",value:"#ffc9c9",token:"red-strong"},{name:"橙",value:"#ffd8a8",token:"orange-strong"},{name:"黄",value:"#ffec99",token:"yellow-strong"},{name:"绿",value:"#b2f2bb",token:"green-strong"},{name:"蓝",value:"#a5d8ff",token:"blue-strong"},{name:"紫",value:"#d0bfff",token:"purple-strong"}];export function paletteColor(e,n){const a=e.trim().toLowerCase(),o=/^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/.exec(a);if(o&&o.slice(1).some(e=>Number(e)>255))return null;const t=o?`#${o.slice(1).map(e=>Number(e).toString(16).padStart(2,"0")).join("")}`:a;return n.some(e=>e.value===t)?t:null}export function documentColorAttributes(e,n){if("string"!=typeof n)return{};const a="text"===e?TEXT_COLORS:HIGHLIGHT_COLORS,o=paletteColor(n,a),t=a.find(e=>e.value===o);if(!t?.value)return{};const l="text"===e?"color":"background-color";return{"data-color":t.value,style:`${l}: var(--doc-${e}-${t.token}, ${t.value})`}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{flattenDocText as t,resolveAnchor as n}from"./anchor.js";import{plainTextOf as e}from"./doc-text.js";export function buildTextRuns(t){const n=[];let e=0;const o=[],collect=(t,n)=>{if("string"!=typeof t.text)for(const e of t.content??[])collect(e,n);else n.push(t)};for(const s of t?.content??[]){const t=[];collect(s,t);const r=t.map(t=>t.text??"").join("");if(0===r.length)continue;o.push(r);const i=o.length>1?e+1:e;let f=0;for(const e of t){const t=e.text??"";0!==t.length&&(n.push({index:n.length,text:t,flatStart:i+f,flatEnd:i+f+t.length}),f+=t.length)}e=i+f}return n}export function buildFlatText(n){const o=(n?.content??[]).map(t=>e(t)).filter(t=>t.length>0);return t(o).text}export function resolveInlineComments(t,e){const o=buildTextRuns(t),s=buildFlatText(t),r=[],i=[];for(const f of e){if(f.deleted||!f.anchor)continue;if(f.anchor.prefix?.startsWith("mind:")){let n=!1;const walk=t=>{if("mindMap"!==t.type||t.attrs?.id!==f.anchor.prefix.slice(5))for(const n of t.content??[])walk(n);else n=!!t.content?.some(t=>"mindMapTopic"===t.type&&t.attrs?.id===f.anchor.suffix)};t&&walk(t),n||i.push(f.id);continue}if(null!==f.parentId)continue;const e=n(s,{quote:f.anchor.quote,prefix:f.anchor.prefix,suffix:f.anchor.suffix,start:f.anchor.start});if(!e){i.push(f.id);continue}const a=o.filter(t=>t.flatEnd>e.from&&t.flatStart<=e.to);if(0===a.length){i.push(f.id);continue}if(e.to<=e.from){const t=a[0];r.push({commentId:f.id,textIndex:t.index,from:Math.max(0,e.from-t.flatStart),to:Math.max(0,e.from-t.flatStart),state:"shifted",hasReplies:f.replies.length>0});continue}const c="exact";let l=0;for(const t of a){const n=Math.max(0,e.from-t.flatStart),o=Math.min(t.text.length,e.to-t.flatStart);o<=n||(r.push({commentId:f.id,textIndex:t.index,from:n,to:o,state:c,hasReplies:f.replies.length>0}),l+=1)}0===l&&i.push(f.id)}const f=new Map;for(const t of r){const n=f.get(t.textIndex)??[];n.push(t),f.set(t.textIndex,n)}return{marks:r,orphanCommentIds:i,byTextIndex:f}}export function splitTextByMarks(t,n){if(0===n.length||0===t.length)return[{text:t,marks:[]}];const e=new Set([0,t.length]);for(const o of n)e.add(Math.max(0,Math.min(o.from,t.length))),e.add(Math.max(0,Math.min(o.to,t.length)));const o=[...e].sort((t,n)=>t-n),s=[];for(let e=0;e<o.length-1;e+=1){const r=o[e],i=o[e+1];if(i<=r)continue;const f=n.filter(t=>t.from<=r&&t.to>=i);s.push({text:t.slice(r,i),marks:f})}return s.length>0?s:[{text:t,marks:[]}]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{mindMapTree as e}from"./mind-map.js";export function normalizeMindFolds(n,t){const r=e(n),o=new Set(r.map(e=>e.parentId)),i=new Set(r.map(e=>e.id));return new Set([...t].filter(e=>e!==n.rootId&&i.has(e)&&o.has(e)))}export function firstLevelMindFolds(n){return normalizeMindFolds(n,e(n).filter(e=>e.parentId===n.rootId).map(e=>e.id))}
|