@mteditor/renderer-mini 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +161 -2
- package/components/README.md +89 -0
- package/components/mt-node/index.js +123 -0
- package/components/mt-node/index.json +6 -0
- package/components/mt-node/index.wxml +95 -0
- package/components/mt-node/index.wxss +163 -0
- package/components/mt-renderer/index.js +51 -0
- package/components/mt-renderer/index.json +6 -0
- package/components/mt-renderer/index.wxml +24 -0
- package/components/mt-renderer/index.wxss +14 -0
- package/components/mt-theme.wxss +82 -0
- package/dist/alipay/index.cjs +4 -0
- package/dist/alipay/index.cjs.map +1 -0
- package/dist/alipay/index.d.cts +2 -0
- package/dist/alipay/index.d.ts +2 -0
- package/dist/alipay/index.js +3 -0
- package/dist/alipay/index.js.map +1 -0
- package/dist/arkts/index.cjs +4 -0
- package/dist/arkts/index.cjs.map +1 -0
- package/dist/arkts/index.d.cts +2 -0
- package/dist/arkts/index.d.ts +2 -0
- package/dist/arkts/index.js +3 -0
- package/dist/arkts/index.js.map +1 -0
- package/dist/bytedance/index.cjs +4 -0
- package/dist/bytedance/index.cjs.map +1 -0
- package/dist/bytedance/index.d.cts +2 -0
- package/dist/bytedance/index.d.ts +2 -0
- package/dist/bytedance/index.js +3 -0
- package/dist/bytedance/index.js.map +1 -0
- package/dist/index.cjs +259 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +101 -0
- package/dist/index.d.ts +101 -0
- package/dist/index.js +247 -0
- package/dist/index.js.map +1 -0
- package/dist/taro/index.cjs +4 -0
- package/dist/taro/index.cjs.map +1 -0
- package/dist/taro/index.d.cts +2 -0
- package/dist/taro/index.d.ts +2 -0
- package/dist/taro/index.js +3 -0
- package/dist/taro/index.js.map +1 -0
- package/dist/theme-COcEGLOF.d.cts +214 -0
- package/dist/theme-COcEGLOF.d.ts +214 -0
- package/dist/uni-app/index.cjs +4 -0
- package/dist/uni-app/index.cjs.map +1 -0
- package/dist/uni-app/index.d.cts +2 -0
- package/dist/uni-app/index.d.ts +2 -0
- package/dist/uni-app/index.js +3 -0
- package/dist/uni-app/index.js.map +1 -0
- package/dist/wechat/index.cjs +259 -0
- package/dist/wechat/index.cjs.map +1 -0
- package/dist/wechat/index.d.cts +61 -0
- package/dist/wechat/index.d.ts +61 -0
- package/dist/wechat/index.js +250 -0
- package/dist/wechat/index.js.map +1 -0
- package/package.json +142 -3
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import { serializeDocumentToMini, computeTreeStats } from '@mteditor/document';
|
|
2
|
+
|
|
3
|
+
// src/render.ts
|
|
4
|
+
|
|
5
|
+
// src/capabilities.ts
|
|
6
|
+
var MT_WECHAT_RICH_TEXT_TAGS = [
|
|
7
|
+
"a",
|
|
8
|
+
"abbr",
|
|
9
|
+
"address",
|
|
10
|
+
"article",
|
|
11
|
+
"aside",
|
|
12
|
+
"b",
|
|
13
|
+
"bdi",
|
|
14
|
+
"bdo",
|
|
15
|
+
"big",
|
|
16
|
+
"blockquote",
|
|
17
|
+
"br",
|
|
18
|
+
"caption",
|
|
19
|
+
"center",
|
|
20
|
+
"cite",
|
|
21
|
+
"code",
|
|
22
|
+
"col",
|
|
23
|
+
"colgroup",
|
|
24
|
+
"dd",
|
|
25
|
+
"del",
|
|
26
|
+
"div",
|
|
27
|
+
"dl",
|
|
28
|
+
"dt",
|
|
29
|
+
"em",
|
|
30
|
+
"fieldset",
|
|
31
|
+
"font",
|
|
32
|
+
"footer",
|
|
33
|
+
"h1",
|
|
34
|
+
"h2",
|
|
35
|
+
"h3",
|
|
36
|
+
"h4",
|
|
37
|
+
"h5",
|
|
38
|
+
"h6",
|
|
39
|
+
"header",
|
|
40
|
+
"hr",
|
|
41
|
+
"i",
|
|
42
|
+
"img",
|
|
43
|
+
"ins",
|
|
44
|
+
"label",
|
|
45
|
+
"legend",
|
|
46
|
+
"li",
|
|
47
|
+
"mark",
|
|
48
|
+
"nav",
|
|
49
|
+
"ol",
|
|
50
|
+
"p",
|
|
51
|
+
"pre",
|
|
52
|
+
"q",
|
|
53
|
+
"rt",
|
|
54
|
+
"ruby",
|
|
55
|
+
"s",
|
|
56
|
+
"section",
|
|
57
|
+
"small",
|
|
58
|
+
"span",
|
|
59
|
+
"strong",
|
|
60
|
+
"sub",
|
|
61
|
+
"sup",
|
|
62
|
+
"table",
|
|
63
|
+
"tbody",
|
|
64
|
+
"td",
|
|
65
|
+
"tfoot",
|
|
66
|
+
"th",
|
|
67
|
+
"thead",
|
|
68
|
+
"tr",
|
|
69
|
+
"tt",
|
|
70
|
+
"u",
|
|
71
|
+
"ul"
|
|
72
|
+
];
|
|
73
|
+
var MT_WECHAT_TAG_ATTRS = {
|
|
74
|
+
img: ["alt", "src", "height", "width"],
|
|
75
|
+
table: ["width"],
|
|
76
|
+
col: ["span", "width"],
|
|
77
|
+
colgroup: ["span", "width"],
|
|
78
|
+
td: ["colspan", "height", "rowspan", "width"],
|
|
79
|
+
th: ["colspan", "height", "rowspan", "width"],
|
|
80
|
+
tr: ["colspan", "height", "rowspan", "width"],
|
|
81
|
+
ol: ["start", "type"]
|
|
82
|
+
};
|
|
83
|
+
var MT_MINI_CAPABILITIES = {
|
|
84
|
+
wechat: {
|
|
85
|
+
platform: "wechat",
|
|
86
|
+
verified: true,
|
|
87
|
+
tags: MT_WECHAT_RICH_TEXT_TAGS,
|
|
88
|
+
globalAttrs: ["class", "style"],
|
|
89
|
+
supportsId: false,
|
|
90
|
+
tagAttrs: MT_WECHAT_TAG_ATTRS,
|
|
91
|
+
/**
|
|
92
|
+
* `rich-text` 下不可表达、必须拆到组件外的节点(§9.2)。
|
|
93
|
+
* 组件通道下这些节点走原生组件,不受 `rich-text` 白名单限制。
|
|
94
|
+
*/
|
|
95
|
+
nativeComponents: ["video", "audio"]
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
var resolveCapabilities = (platform) => {
|
|
99
|
+
const found = MT_MINI_CAPABILITIES[platform];
|
|
100
|
+
if (found === void 0) {
|
|
101
|
+
throw new RangeError(
|
|
102
|
+
`@mteditor/renderer-mini \u5C1A\u672A\u652F\u6301\u5E73\u53F0 "${platform}"\uFF1A\u5176 rich-text \u767D\u540D\u5355\u672A\u7ECF\u5B9E\u6D4B\u6838\u5B9E\uFF0C\u6309 AGENTS.md \xA74.4 \u7981\u6B62\u51ED\u731C\u6D4B\u63D0\u4F9B\u6620\u5C04\u8868\u3002\u5F53\u524D\u53EF\u7528\u5E73\u53F0\uFF1Awechat\u3002`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
return found;
|
|
106
|
+
};
|
|
107
|
+
var resolveChannel = (doc, option, maxNodes) => {
|
|
108
|
+
if (option !== "auto") return { mode: option, switched: null };
|
|
109
|
+
const { nodeCount } = computeTreeStats(doc.content);
|
|
110
|
+
if (nodeCount <= maxNodes) return { mode: "component", switched: null };
|
|
111
|
+
return {
|
|
112
|
+
mode: "richText",
|
|
113
|
+
switched: { from: "component", to: "richText", nodeCount, maxNodes }
|
|
114
|
+
};
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// src/options.ts
|
|
118
|
+
var MT_DEFAULT_MAX_NODES = 3e3;
|
|
119
|
+
var MT_DEFAULT_MODE = "auto";
|
|
120
|
+
var MT_DEFAULT_PLATFORM = "wechat";
|
|
121
|
+
|
|
122
|
+
// src/theme.ts
|
|
123
|
+
var MT_MINI_TOKENS_LIGHT = {
|
|
124
|
+
"--mt-color-primary": "#2563eb",
|
|
125
|
+
"--mt-color-primary-hover": "#1d4ed8",
|
|
126
|
+
"--mt-color-primary-active": "#1e40af",
|
|
127
|
+
"--mt-color-success": "#16a34a",
|
|
128
|
+
"--mt-color-warning": "#d97706",
|
|
129
|
+
"--mt-color-danger": "#dc2626",
|
|
130
|
+
"--mt-color-link": "#2563eb",
|
|
131
|
+
"--mt-color-text": "#1f2329",
|
|
132
|
+
"--mt-color-text-secondary": "#646a73",
|
|
133
|
+
"--mt-color-text-disabled": "#a6a9ad",
|
|
134
|
+
"--mt-color-text-inverse": "#fff",
|
|
135
|
+
"--mt-color-bg": "#fff",
|
|
136
|
+
"--mt-color-bg-elevated": "#fff",
|
|
137
|
+
"--mt-color-bg-muted": "#f5f7fa",
|
|
138
|
+
"--mt-color-bg-hover": "#f2f3f5",
|
|
139
|
+
"--mt-color-border": "#dee0e3",
|
|
140
|
+
"--mt-color-border-strong": "#babdbf",
|
|
141
|
+
"--mt-color-selection": "rgb(37 99 235 / 18%)",
|
|
142
|
+
"--mt-color-code-bg": "#f5f5f5",
|
|
143
|
+
"--mt-color-code-text": "#c0392b",
|
|
144
|
+
"--mt-color-quote-border": "#dee0e3",
|
|
145
|
+
"--mt-color-mark-bg": "#fff3a3",
|
|
146
|
+
"--mt-font-family": "-apple-system, blinkmacsystemfont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif",
|
|
147
|
+
"--mt-font-family-mono": "'SFMono-Regular', consolas, 'Liberation Mono', menlo, monospace",
|
|
148
|
+
"--mt-font-size": "15px",
|
|
149
|
+
"--mt-font-size-sm": "13px",
|
|
150
|
+
"--mt-font-size-lg": "17px",
|
|
151
|
+
"--mt-line-height": "1.7",
|
|
152
|
+
"--mt-letter-spacing": "normal",
|
|
153
|
+
"--mt-h1-font-size": "28px",
|
|
154
|
+
"--mt-h2-font-size": "24px",
|
|
155
|
+
"--mt-h3-font-size": "20px",
|
|
156
|
+
"--mt-h4-font-size": "18px",
|
|
157
|
+
"--mt-h5-font-size": "16px",
|
|
158
|
+
"--mt-h6-font-size": "15px",
|
|
159
|
+
"--mt-space-1": "4px",
|
|
160
|
+
"--mt-space-2": "8px",
|
|
161
|
+
"--mt-space-3": "12px",
|
|
162
|
+
"--mt-space-4": "16px",
|
|
163
|
+
"--mt-space-5": "24px",
|
|
164
|
+
"--mt-space-6": "32px",
|
|
165
|
+
"--mt-radius-sm": "3px",
|
|
166
|
+
"--mt-radius-md": "6px",
|
|
167
|
+
"--mt-radius-lg": "10px",
|
|
168
|
+
"--mt-radius-full": "9999px",
|
|
169
|
+
"--mt-shadow-sm": "0 1px 3px rgb(0 0 0 / 8%)",
|
|
170
|
+
"--mt-shadow-md": "0 4px 12px rgb(0 0 0 / 10%)",
|
|
171
|
+
"--mt-toolbar-height": "40px",
|
|
172
|
+
"--mt-content-max-width": "860px",
|
|
173
|
+
"--mt-content-padding": "20px",
|
|
174
|
+
"--mt-control-size": "30px",
|
|
175
|
+
"--mt-control-icon-size": "18px",
|
|
176
|
+
"--mt-control-gap": "2px",
|
|
177
|
+
"--mt-popup-padding": "4px",
|
|
178
|
+
"--mt-popup-gap": "6px",
|
|
179
|
+
"--mt-drawer-max-height": "60vh",
|
|
180
|
+
"--mt-block-handle-width": "46px",
|
|
181
|
+
"--mt-block-indicator-height": "2px",
|
|
182
|
+
"--mt-outline-width": "200px",
|
|
183
|
+
"--mt-outline-top": "0px",
|
|
184
|
+
"--mt-z-toolbar": "100",
|
|
185
|
+
"--mt-z-dropdown": "200",
|
|
186
|
+
"--mt-z-popover": "300",
|
|
187
|
+
"--mt-z-modal": "400",
|
|
188
|
+
"--mt-z-toast": "500",
|
|
189
|
+
"--mt-transition-fast": "120ms ease",
|
|
190
|
+
"--mt-transition-base": "200ms ease"
|
|
191
|
+
};
|
|
192
|
+
var MT_MINI_TOKENS_DARK_OVERRIDES = {
|
|
193
|
+
"--mt-color-primary": "#3b82f6",
|
|
194
|
+
"--mt-color-primary-hover": "#60a5fa",
|
|
195
|
+
"--mt-color-primary-active": "#2563eb",
|
|
196
|
+
"--mt-color-success": "#22c55e",
|
|
197
|
+
"--mt-color-warning": "#f59e0b",
|
|
198
|
+
"--mt-color-danger": "#ef4444",
|
|
199
|
+
"--mt-color-link": "#60a5fa",
|
|
200
|
+
"--mt-color-text": "#e5e6eb",
|
|
201
|
+
"--mt-color-text-secondary": "#a3a6ad",
|
|
202
|
+
"--mt-color-text-disabled": "#6b6f76",
|
|
203
|
+
"--mt-color-text-inverse": "#1f2329",
|
|
204
|
+
"--mt-color-bg": "#1f2329",
|
|
205
|
+
"--mt-color-bg-elevated": "#282c33",
|
|
206
|
+
"--mt-color-bg-muted": "#282c33",
|
|
207
|
+
"--mt-color-bg-hover": "#32363d",
|
|
208
|
+
"--mt-color-border": "#3a3f47",
|
|
209
|
+
"--mt-color-border-strong": "#4e545d",
|
|
210
|
+
"--mt-color-selection": "rgb(59 130 246 / 28%)",
|
|
211
|
+
"--mt-color-code-bg": "#2b2f36",
|
|
212
|
+
"--mt-color-code-text": "#f87171",
|
|
213
|
+
"--mt-color-quote-border": "#3a3f47",
|
|
214
|
+
"--mt-color-mark-bg": "#6b5a1a",
|
|
215
|
+
"--mt-shadow-sm": "0 1px 3px rgb(0 0 0 / 40%)",
|
|
216
|
+
"--mt-shadow-md": "0 4px 12px rgb(0 0 0 / 50%)"
|
|
217
|
+
};
|
|
218
|
+
var MT_MINI_TOKENS_DARK = {
|
|
219
|
+
...MT_MINI_TOKENS_LIGHT,
|
|
220
|
+
...MT_MINI_TOKENS_DARK_OVERRIDES
|
|
221
|
+
};
|
|
222
|
+
var resolveThemeTokens = (theme, override) => {
|
|
223
|
+
const base = theme === void 0 || theme === "light" ? MT_MINI_TOKENS_LIGHT : theme === "dark" ? MT_MINI_TOKENS_DARK : theme;
|
|
224
|
+
return override === void 0 ? { ...base } : { ...base, ...override };
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
// src/render.ts
|
|
228
|
+
var renderMiniDocument = (doc, options = {}) => {
|
|
229
|
+
const platform = options.platform ?? MT_DEFAULT_PLATFORM;
|
|
230
|
+
void resolveCapabilities(platform);
|
|
231
|
+
const { mode, switched } = resolveChannel(
|
|
232
|
+
doc,
|
|
233
|
+
options.mode ?? MT_DEFAULT_MODE,
|
|
234
|
+
options.maxNodes ?? MT_DEFAULT_MAX_NODES
|
|
235
|
+
);
|
|
236
|
+
const { output, report, stats } = serializeDocumentToMini(doc, {
|
|
237
|
+
platform,
|
|
238
|
+
mode,
|
|
239
|
+
themeTokens: resolveThemeTokens(options.theme, options.themeTokens),
|
|
240
|
+
...options.preRendered === void 0 ? {} : { preRendered: options.preRendered }
|
|
241
|
+
});
|
|
242
|
+
return { platform, mode, nodes: output, report, stats, autoSwitched: switched };
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
// src/wechat/index.ts
|
|
246
|
+
var render = (doc, options = {}) => renderMiniDocument(doc, { ...options, platform: "wechat" });
|
|
247
|
+
|
|
248
|
+
export { MT_MINI_CAPABILITIES, MT_MINI_TOKENS_DARK, MT_MINI_TOKENS_LIGHT, MT_WECHAT_RICH_TEXT_TAGS, MT_WECHAT_TAG_ATTRS, render, resolveCapabilities, resolveThemeTokens };
|
|
249
|
+
//# sourceMappingURL=index.js.map
|
|
250
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/capabilities.ts","../../src/channel.ts","../../src/options.ts","../../src/theme.ts","../../src/render.ts","../../src/wechat/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 各端 `rich-text` 能力表(`docs/document-model.md` §9.1 / §9.4)。\n *\n * **准入条件:必须实测核实。** §4.4 明令「各子路径必须各自维护映射差异,\n * 禁止共用一份映射表」;反过来说,**没有实测过就不能让别人用**——\n * 一份「看起来能跑」的错误白名单比明确的报错危险得多(ADR-0030 决策 5)。\n *\n * 因此本文件当前只包含 `wechat`。支付宝 / 抖音的表在各自实测完成后\n * (M4-b,需各自开发者工具)追加,并同时回填 §9.4 的待确认项。\n */\n\nimport type { MtMiniCapabilities, MtMiniPlatform } from './types'\n\n/**\n * 微信小程序 `rich-text` 受信任标签白名单(§9.1,**已核实**)。\n *\n * 顺序与官方文档一致,便于逐条比对;`Set` 查询由调用方按需构造。\n */\nexport const MT_WECHAT_RICH_TEXT_TAGS: readonly string[] = [\n 'a',\n 'abbr',\n 'address',\n 'article',\n 'aside',\n 'b',\n 'bdi',\n 'bdo',\n 'big',\n 'blockquote',\n 'br',\n 'caption',\n 'center',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'dd',\n 'del',\n 'div',\n 'dl',\n 'dt',\n 'em',\n 'fieldset',\n 'font',\n 'footer',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'hr',\n 'i',\n 'img',\n 'ins',\n 'label',\n 'legend',\n 'li',\n 'mark',\n 'nav',\n 'ol',\n 'p',\n 'pre',\n 'q',\n 'rt',\n 'ruby',\n 's',\n 'section',\n 'small',\n 'span',\n 'strong',\n 'sub',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'th',\n 'thead',\n 'tr',\n 'tt',\n 'u',\n 'ul',\n]\n\n/**\n * 逐标签属性白名单(§9.1,**已核实**)。\n *\n * 未在表中的标签不接受额外属性;全局属性(`class` / `style`)单独由\n * `globalAttrs` 描述。**`id` 不在任何一张表里** —— 微信全局不支持 `id`。\n */\nexport const MT_WECHAT_TAG_ATTRS: Readonly<Record<string, readonly string[]>> = {\n img: ['alt', 'src', 'height', 'width'],\n table: ['width'],\n col: ['span', 'width'],\n colgroup: ['span', 'width'],\n td: ['colspan', 'height', 'rowspan', 'width'],\n th: ['colspan', 'height', 'rowspan', 'width'],\n tr: ['colspan', 'height', 'rowspan', 'width'],\n ol: ['start', 'type'],\n}\n\n/**\n * 小程序平台能力表。\n *\n * 当前只登记 `wechat`(§9.1 已核实)。缺失的平台在\n * `resolveCapabilities` 处**抛错**,不做容错。\n */\nexport const MT_MINI_CAPABILITIES: Readonly<Partial<Record<MtMiniPlatform, MtMiniCapabilities>>> = {\n wechat: {\n platform: 'wechat',\n verified: true,\n tags: MT_WECHAT_RICH_TEXT_TAGS,\n globalAttrs: ['class', 'style'],\n supportsId: false,\n tagAttrs: MT_WECHAT_TAG_ATTRS,\n /**\n * `rich-text` 下不可表达、必须拆到组件外的节点(§9.2)。\n * 组件通道下这些节点走原生组件,不受 `rich-text` 白名单限制。\n */\n nativeComponents: ['video', 'audio'],\n },\n}\n\n/**\n * 取某个平台的能力表。\n *\n * @param platform 平台标识\n * @returns 该平台的能力描述\n * @throws {RangeError} 该平台尚未实测核实(ADR-0030 决策 5)\n *\n * @example\n * ```ts\n * resolveCapabilities('wechat').supportsId // false\n * resolveCapabilities('alipay') // 抛 RangeError:尚未实测\n * ```\n */\nexport const resolveCapabilities = (platform: MtMiniPlatform): MtMiniCapabilities => {\n const found = MT_MINI_CAPABILITIES[platform]\n if (found === undefined) {\n throw new RangeError(\n `@mteditor/renderer-mini 尚未支持平台 \"${platform}\":其 rich-text 白名单未经实测核实,` +\n '按 AGENTS.md §4.4 禁止凭猜测提供映射表。当前可用平台:wechat。',\n )\n }\n return found\n}\n","/**\n * 通道解析(ADR-0005 双通道 / ADR-0030 决策 3)。\n *\n * `@mteditor/document` 只接受显式的 `'component' | 'richText'`;把 `'auto'`\n * 解析成具体通道是**渲染层**的职责 —— 因为它需要知道 `maxNodes` 这类\n * 宿主侧的渲染成本概念,而 `document` 是零框架的文档模型层。\n */\n\nimport { computeTreeStats } from '@mteditor/document'\nimport type { MtDocument } from '@mteditor/document'\nimport type { MtMiniChannelOption, MtMiniChannelSwitch, MtMiniMode } from './types'\n\n/** 通道解析结果 */\nexport interface MtChannelResolution {\n /** 实际使用的通道 */\n mode: MtMiniMode\n /** 自动切换记录;未发生切换时为 `null` */\n switched: MtMiniChannelSwitch | null\n}\n\n/**\n * 解析渲染通道。\n *\n * 规则(§9.2):\n * - 显式给出 `'component'` / `'richText'` 时**原样采用**,不做阈值判定\n * —— 宿主显式指定就代表它知道自己在做什么;\n * - `'auto'` 时按**文档节点数**判定:`nodeCount > maxNodes` 走 `richText`。\n *\n * @param doc 文档\n * @param option 通道选择\n * @param maxNodes `'auto'` 的阈值(文档节点数)\n * @returns 通道与该次判定是否发生了切换\n *\n * @example\n * ```ts\n * // 3000 节点以内:组件通道\n * resolveChannel(doc, 'auto', 3000).mode // 'component'\n * // 显式指定时不看阈值\n * resolveChannel(hugeDoc, 'component', 1).mode // 'component'\n * ```\n */\nexport const resolveChannel = (\n doc: MtDocument,\n option: MtMiniChannelOption,\n maxNodes: number,\n): MtChannelResolution => {\n if (option !== 'auto') return { mode: option, switched: null }\n\n const { nodeCount } = computeTreeStats(doc.content)\n if (nodeCount <= maxNodes) return { mode: 'component', switched: null }\n\n return {\n mode: 'richText',\n switched: { from: 'component', to: 'richText', nodeCount, maxNodes },\n }\n}\n","/**\n * 渲染层默认值。\n *\n * 单独成文件的理由:这些数值同时出现在**文档**(AGENTS.md §9.2)与\n * **测试**(阈值边界用例)里,散落在实现里会让「改默认值」变成一次考古。\n */\n\nimport type { MtMiniMode } from './types'\n\n/**\n * `mode: 'auto'` 的降级阈值,单位是**文档节点数**(§9.2)。\n *\n * 判定依据不是「输出 nodes 数」:那需要先序列化一次才能判定,而判定的意义\n * 正是避免一次昂贵序列化(ADR-0030 决策 3)。\n */\nexport const MT_DEFAULT_MAX_NODES = 3000\n\n/** 缺省通道选择 */\nexport const MT_DEFAULT_MODE: 'auto' | MtMiniMode = 'auto'\n\n/** 缺省主题名 */\nexport const MT_DEFAULT_THEME = 'light'\n\n/** 缺省平台 */\nexport const MT_DEFAULT_PLATFORM = 'wechat'\n","/**\n * 内置主题字面量(ADR-0030 决策 4)。\n *\n * ## 为什么这份数据必须存在于本包\n *\n * 小程序端 `rich-text` 内的 `style` **不参与宿主 CSS 变量继承**(§9.3),\n * 所有主题值必须在序列化时解析为字面量,而 `@mteditor/theme-default` 按 §6.1\n * 只产出 CSS、没有 JS 导出 —— 若要求宿主自备这份表,每个项目都要手抄\n * `tokens.css` 的 65 个键,抄错还**没有报错**(本仓库自己就踩过:\n * `mini.ts` 读的 `--mt-font-mono` 与 `tokens.css` 的 `--mt-font-family-mono`\n * 不一致,两个引用点恒走 fallback)。\n *\n * ## 与 tokens.css 的关系:允许独立,禁止无守卫地独立\n *\n * 本文件是 `packages/theme-default/src/tokens.css` 的**逐键镜像**\n * (`dark` 是 `light` 上的部分覆盖,与 CSS 的层叠语义一致)。\n * `scripts/check-theme-tokens.mjs` 断言两者键集合与取值完全一致 ——\n * 改任一侧而漏改另一侧会让 `pnpm verify` 失败。\n *\n * 取值风格与 CSS 一致:保留 `rgb(37 99 235 / 18%)` 这类现代空格语法,\n * 不自作主张转换为逗号语法(`@mteditor/document` 原样内联,不做解析)。\n */\n\nimport type { MtMiniTheme } from './types'\n\n/** 亮色主题:`tokens.css` 中 `:root, [data-mt-theme='light']` 块的完整镜像 */\nexport const MT_MINI_TOKENS_LIGHT: Readonly<Record<string, string>> = {\n '--mt-color-primary': '#2563eb',\n '--mt-color-primary-hover': '#1d4ed8',\n '--mt-color-primary-active': '#1e40af',\n '--mt-color-success': '#16a34a',\n '--mt-color-warning': '#d97706',\n '--mt-color-danger': '#dc2626',\n '--mt-color-link': '#2563eb',\n '--mt-color-text': '#1f2329',\n '--mt-color-text-secondary': '#646a73',\n '--mt-color-text-disabled': '#a6a9ad',\n '--mt-color-text-inverse': '#fff',\n '--mt-color-bg': '#fff',\n '--mt-color-bg-elevated': '#fff',\n '--mt-color-bg-muted': '#f5f7fa',\n '--mt-color-bg-hover': '#f2f3f5',\n '--mt-color-border': '#dee0e3',\n '--mt-color-border-strong': '#babdbf',\n '--mt-color-selection': 'rgb(37 99 235 / 18%)',\n '--mt-color-code-bg': '#f5f5f5',\n '--mt-color-code-text': '#c0392b',\n '--mt-color-quote-border': '#dee0e3',\n '--mt-color-mark-bg': '#fff3a3',\n '--mt-font-family':\n \"-apple-system, blinkmacsystemfont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif\",\n '--mt-font-family-mono': \"'SFMono-Regular', consolas, 'Liberation Mono', menlo, monospace\",\n '--mt-font-size': '15px',\n '--mt-font-size-sm': '13px',\n '--mt-font-size-lg': '17px',\n '--mt-line-height': '1.7',\n '--mt-letter-spacing': 'normal',\n '--mt-h1-font-size': '28px',\n '--mt-h2-font-size': '24px',\n '--mt-h3-font-size': '20px',\n '--mt-h4-font-size': '18px',\n '--mt-h5-font-size': '16px',\n '--mt-h6-font-size': '15px',\n '--mt-space-1': '4px',\n '--mt-space-2': '8px',\n '--mt-space-3': '12px',\n '--mt-space-4': '16px',\n '--mt-space-5': '24px',\n '--mt-space-6': '32px',\n '--mt-radius-sm': '3px',\n '--mt-radius-md': '6px',\n '--mt-radius-lg': '10px',\n '--mt-radius-full': '9999px',\n '--mt-shadow-sm': '0 1px 3px rgb(0 0 0 / 8%)',\n '--mt-shadow-md': '0 4px 12px rgb(0 0 0 / 10%)',\n '--mt-toolbar-height': '40px',\n '--mt-content-max-width': '860px',\n '--mt-content-padding': '20px',\n '--mt-control-size': '30px',\n '--mt-control-icon-size': '18px',\n '--mt-control-gap': '2px',\n '--mt-popup-padding': '4px',\n '--mt-popup-gap': '6px',\n '--mt-drawer-max-height': '60vh',\n '--mt-block-handle-width': '46px',\n '--mt-block-indicator-height': '2px',\n '--mt-outline-width': '200px',\n '--mt-outline-top': '0px',\n '--mt-z-toolbar': '100',\n '--mt-z-dropdown': '200',\n '--mt-z-popover': '300',\n '--mt-z-modal': '400',\n '--mt-z-toast': '500',\n '--mt-transition-fast': '120ms ease',\n '--mt-transition-base': '200ms ease',\n}\n\n/**\n * 暗色主题对亮色的**覆盖项**(与 `tokens.css` 的 `[data-mt-theme='dark']` 块一致)。\n *\n * 单独导出是为了让卡口脚本能分别比对「覆盖集」与「派生全集」——\n * 若只导出派生的全集,CSS 里删掉一个覆盖项(于是暗色回退到亮色值)\n * 在 TS 侧不可见。\n */\nexport const MT_MINI_TOKENS_DARK_OVERRIDES: Readonly<Record<string, string>> = {\n '--mt-color-primary': '#3b82f6',\n '--mt-color-primary-hover': '#60a5fa',\n '--mt-color-primary-active': '#2563eb',\n '--mt-color-success': '#22c55e',\n '--mt-color-warning': '#f59e0b',\n '--mt-color-danger': '#ef4444',\n '--mt-color-link': '#60a5fa',\n '--mt-color-text': '#e5e6eb',\n '--mt-color-text-secondary': '#a3a6ad',\n '--mt-color-text-disabled': '#6b6f76',\n '--mt-color-text-inverse': '#1f2329',\n '--mt-color-bg': '#1f2329',\n '--mt-color-bg-elevated': '#282c33',\n '--mt-color-bg-muted': '#282c33',\n '--mt-color-bg-hover': '#32363d',\n '--mt-color-border': '#3a3f47',\n '--mt-color-border-strong': '#4e545d',\n '--mt-color-selection': 'rgb(59 130 246 / 28%)',\n '--mt-color-code-bg': '#2b2f36',\n '--mt-color-code-text': '#f87171',\n '--mt-color-quote-border': '#3a3f47',\n '--mt-color-mark-bg': '#6b5a1a',\n '--mt-shadow-sm': '0 1px 3px rgb(0 0 0 / 40%)',\n '--mt-shadow-md': '0 4px 12px rgb(0 0 0 / 50%)',\n}\n\n/** 暗色主题全集(亮色为基底 + 覆盖项) */\nexport const MT_MINI_TOKENS_DARK: Readonly<Record<string, string>> = {\n ...MT_MINI_TOKENS_LIGHT,\n ...MT_MINI_TOKENS_DARK_OVERRIDES,\n}\n\n/**\n * 解析主题字面量表。\n *\n * 合并顺序:内置名(或自定义表)→ `themeTokens` 覆盖项。\n *\n * @param theme 内置主题名或自定义字面量表,缺省 `'light'`\n * @param override 覆盖项,键含 `--` 前缀;缺省不覆盖\n * @returns 可直接传给 `serializeDocumentToMini` 的 `themeTokens`\n *\n * @example\n * ```ts\n * resolveThemeTokens('dark') // 65 个键的暗色表\n * resolveThemeTokens(undefined, { '--mt-color-link': '#f00' })\n * // 亮色表,但链接色为 #f00\n * ```\n */\nexport const resolveThemeTokens = (\n theme?: MtMiniTheme,\n override?: Record<string, string>,\n): Record<string, string> => {\n const base =\n theme === undefined || theme === 'light'\n ? MT_MINI_TOKENS_LIGHT\n : theme === 'dark'\n ? MT_MINI_TOKENS_DARK\n : theme\n return override === undefined ? { ...base } : { ...base, ...override }\n}\n","/**\n * 渲染层主入口(ADR-0030)。\n *\n * 本函数的职责边界刻意很窄 —— 只做三件事,**不自己拼 nodes**:\n *\n * | 步骤 | 说明 |\n * |---|---|\n * | ① 平台准入 | 能力表未登记的平台直接抛错,不做容错 |\n * | ② 通道解析 | `'auto'` → 按 `maxNodes` 判定,并记录是否发生切换 |\n * | ③ 主题注入 | 内置 light / dark 字面量(小程序无 CSS 变量) |\n *\n * `nodes` 一律由 `@mteditor/document` 的 `serializeDocumentToMini` 产出\n * —— 这是 ADR-0021「序列化真相源唯一」在小程序端的同一条原则。\n */\n\nimport { serializeDocumentToMini } from '@mteditor/document'\nimport type { MtDocument } from '@mteditor/document'\nimport { resolveCapabilities } from './capabilities'\nimport { resolveChannel } from './channel'\nimport { MT_DEFAULT_MAX_NODES, MT_DEFAULT_MODE, MT_DEFAULT_PLATFORM } from './options'\nimport { resolveThemeTokens } from './theme'\nimport type { MtMiniRenderOptions, MtMiniRenderResult } from './types'\n\n/**\n * 把 `MtDocument` 渲染为小程序可直接 `setData` 的 payload。\n *\n * @param doc 文档(唯一真相源)\n * @param options 渲染选项\n * @returns 通道、nodes、降级报告、统计与自动切换记录\n * @throws {RangeError} `options.platform` 的能力表未经实测核实(ADR-0030 决策 5)\n *\n * @example\n * ```ts\n * import { renderMiniDocument } from '@mteditor/renderer-mini'\n *\n * const { mode, nodes, report, autoSwitched } = renderMiniDocument(doc, {\n * theme: 'dark',\n * mode: 'auto',\n * })\n *\n * if (autoSwitched) console.warn(`节点数 ${autoSwitched.nodeCount} 超过阈值,已切到 rich-text`)\n * if (report.length > 0) console.warn('内容有降级', report)\n * ```\n */\nexport const renderMiniDocument = (\n doc: MtDocument,\n options: MtMiniRenderOptions = {},\n): MtMiniRenderResult => {\n const platform = options.platform ?? MT_DEFAULT_PLATFORM\n // 平台准入:未实测核实的平台在此抛错,而不是拿微信的表硬跑(§4.4)\n void resolveCapabilities(platform)\n\n const { mode, switched } = resolveChannel(\n doc,\n options.mode ?? MT_DEFAULT_MODE,\n options.maxNodes ?? MT_DEFAULT_MAX_NODES,\n )\n\n const { output, report, stats } = serializeDocumentToMini(doc, {\n platform,\n mode,\n themeTokens: resolveThemeTokens(options.theme, options.themeTokens),\n ...(options.preRendered === undefined ? {} : { preRendered: options.preRendered }),\n })\n\n return { platform, mode, nodes: output, report, stats, autoSwitched: switched }\n}\n","/**\n * 微信小程序渲染器(P0,M4-a 已落地)\n *\n * ## 平台事实(**已核实**,docs/document-model.md §9.1)\n *\n * - `rich-text` 全局**只支持 `class` 与 `style`,不支持 `id`**;\n * - `img` 仅 `alt` / `src` / `height` / `width`;\n * - `nodes` **只使用 Array 形式**(String 形式会被组件内部转换,性能更差);\n * - **无 `video` / `audio` / `input`** → 必须拆到 `rich-text` 之外用原生组件渲染;\n * - 代码高亮与公式无客户端运行时 → 分别由 `document` 层预渲染为内联 `style` 的 `span`\n * 与内联 SVG(ADR-0012 / ADR-0013)。\n *\n * 最低基础库:2.21.0(AGENTS.md §4.4)。\n *\n * ## 用法\n *\n * ```ts\n * // 页面 js:把渲染结果写进 data,WXML 按 mode 分支\n * import { render } from '@mteditor/renderer-mini/wechat'\n *\n * Page({\n * data: { mode: 'component', nodes: [], report: [] },\n * onLoad() {\n * const { mode, nodes, report } = render(doc, { theme: 'dark' })\n * this.setData({ mode, nodes, report })\n * },\n * })\n * ```\n *\n * ```xml\n * <!-- 页面 wxml:两条通道二选一 -->\n * <mt-renderer wx:if=\"{{mode === 'component'}}\" nodes=\"{{nodes}}\" />\n * <rich-text wx:else nodes=\"{{nodes}}\" />\n * ```\n *\n * `components/` 目录里有配套的递归自定义组件源码(canonical 副本,ADR-0030 决策 6)。\n */\n\nimport type { MtDocument } from '@mteditor/document'\nimport { renderMiniDocument } from '../render'\nimport type { MtMiniRenderOptions, MtMiniRenderResult } from '../types'\n\n/** 微信端渲染选项:平台已绑定,不接受 `platform` 覆盖 */\nexport type MtWechatRenderOptions = Omit<MtMiniRenderOptions, 'platform'>\n\n/**\n * 渲染文档为微信小程序可 `setData` 的 payload。\n *\n * @param doc 文档\n * @param options 渲染选项(`platform` 固定为 `'wechat'`)\n * @returns 通道、nodes、降级报告、统计与自动切换记录\n *\n * @example\n * ```ts\n * const { mode, nodes, report } = render(doc)\n * // 宿主**必须**按 mode 分支:'component' 走递归组件,'richText' 走 <rich-text nodes>\n * ```\n */\nexport const render = (doc: MtDocument, options: MtWechatRenderOptions = {}): MtMiniRenderResult =>\n renderMiniDocument(doc, { ...options, platform: 'wechat' })\n\nexport {\n MT_WECHAT_RICH_TEXT_TAGS,\n MT_WECHAT_TAG_ATTRS,\n MT_MINI_CAPABILITIES,\n resolveCapabilities,\n} from '../capabilities'\nexport { MT_MINI_TOKENS_LIGHT, MT_MINI_TOKENS_DARK, resolveThemeTokens } from '../theme'\nexport type {\n MtMiniCapabilities,\n MtMiniChannelOption,\n MtMiniChannelSwitch,\n MtMiniMode,\n MtMiniNode,\n MtMiniRenderResult,\n MtMiniTheme,\n} from '../types'\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,145 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mteditor/renderer-mini",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "小程序 / uni-app / Taro / 鸿蒙 ArkTS 只读渲染器,子路径导出多端",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"mteditor",
|
|
7
|
+
"wechat-miniprogram",
|
|
8
|
+
"alipay-miniprogram",
|
|
9
|
+
"uni-app",
|
|
10
|
+
"taro",
|
|
11
|
+
"arkts"
|
|
12
|
+
],
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"homepage": "https://gitee.com/meilitao/editor",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://gitee.com/meilitao/editor/issues"
|
|
17
|
+
},
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://gitee.com/meilitao/editor.git"
|
|
21
|
+
},
|
|
22
|
+
"engines": {
|
|
23
|
+
"node": ">=20"
|
|
24
|
+
},
|
|
25
|
+
"type": "module",
|
|
26
|
+
"sideEffects": false,
|
|
27
|
+
"main": "./dist/index.cjs",
|
|
28
|
+
"module": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"exports": {
|
|
31
|
+
".": {
|
|
32
|
+
"import": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"default": "./dist/index.js"
|
|
35
|
+
},
|
|
36
|
+
"require": {
|
|
37
|
+
"types": "./dist/index.d.cts",
|
|
38
|
+
"default": "./dist/index.cjs"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"./wechat": {
|
|
42
|
+
"import": {
|
|
43
|
+
"types": "./dist/wechat/index.d.ts",
|
|
44
|
+
"default": "./dist/wechat/index.js"
|
|
45
|
+
},
|
|
46
|
+
"require": {
|
|
47
|
+
"types": "./dist/wechat/index.d.cts",
|
|
48
|
+
"default": "./dist/wechat/index.cjs"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"./alipay": {
|
|
52
|
+
"import": {
|
|
53
|
+
"types": "./dist/alipay/index.d.ts",
|
|
54
|
+
"default": "./dist/alipay/index.js"
|
|
55
|
+
},
|
|
56
|
+
"require": {
|
|
57
|
+
"types": "./dist/alipay/index.d.cts",
|
|
58
|
+
"default": "./dist/alipay/index.cjs"
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
"./bytedance": {
|
|
62
|
+
"import": {
|
|
63
|
+
"types": "./dist/bytedance/index.d.ts",
|
|
64
|
+
"default": "./dist/bytedance/index.js"
|
|
65
|
+
},
|
|
66
|
+
"require": {
|
|
67
|
+
"types": "./dist/bytedance/index.d.cts",
|
|
68
|
+
"default": "./dist/bytedance/index.cjs"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"./uni-app": {
|
|
72
|
+
"import": {
|
|
73
|
+
"types": "./dist/uni-app/index.d.ts",
|
|
74
|
+
"default": "./dist/uni-app/index.js"
|
|
75
|
+
},
|
|
76
|
+
"require": {
|
|
77
|
+
"types": "./dist/uni-app/index.d.cts",
|
|
78
|
+
"default": "./dist/uni-app/index.cjs"
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
"./taro": {
|
|
82
|
+
"import": {
|
|
83
|
+
"types": "./dist/taro/index.d.ts",
|
|
84
|
+
"default": "./dist/taro/index.js"
|
|
85
|
+
},
|
|
86
|
+
"require": {
|
|
87
|
+
"types": "./dist/taro/index.d.cts",
|
|
88
|
+
"default": "./dist/taro/index.cjs"
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"./arkts": {
|
|
92
|
+
"import": {
|
|
93
|
+
"types": "./dist/arkts/index.d.ts",
|
|
94
|
+
"default": "./dist/arkts/index.js"
|
|
95
|
+
},
|
|
96
|
+
"require": {
|
|
97
|
+
"types": "./dist/arkts/index.d.cts",
|
|
98
|
+
"default": "./dist/arkts/index.cjs"
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"./package.json": "./package.json"
|
|
102
|
+
},
|
|
103
|
+
"files": [
|
|
104
|
+
"dist",
|
|
105
|
+
"components",
|
|
106
|
+
"README.md",
|
|
107
|
+
"LICENSE"
|
|
108
|
+
],
|
|
109
|
+
"publishConfig": {
|
|
110
|
+
"access": "public"
|
|
111
|
+
},
|
|
112
|
+
"dependencies": {
|
|
113
|
+
"@mteditor/document": "0.1.0"
|
|
114
|
+
},
|
|
115
|
+
"peerDependencies": {
|
|
116
|
+
"@dcloudio/uni-app": ">=2.0.0",
|
|
117
|
+
"@ohos/arkui": "*",
|
|
118
|
+
"@tarojs/taro": ">=3.0.0"
|
|
119
|
+
},
|
|
120
|
+
"peerDependenciesMeta": {
|
|
121
|
+
"@dcloudio/uni-app": {
|
|
122
|
+
"optional": true
|
|
123
|
+
},
|
|
124
|
+
"@ohos/arkui": {
|
|
125
|
+
"optional": true
|
|
126
|
+
},
|
|
127
|
+
"@tarojs/taro": {
|
|
128
|
+
"optional": true
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
"devDependencies": {
|
|
132
|
+
"miniprogram-automator": "^0.12.1",
|
|
133
|
+
"rimraf": "^6.0.1",
|
|
134
|
+
"tsup": "^8.3.5",
|
|
135
|
+
"typescript": "^5.7.2",
|
|
136
|
+
"vitest": "^2.1.8"
|
|
137
|
+
},
|
|
138
|
+
"scripts": {
|
|
139
|
+
"build": "tsup",
|
|
140
|
+
"typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.test.json",
|
|
141
|
+
"test": "vitest run --coverage",
|
|
142
|
+
"test:watch": "vitest",
|
|
143
|
+
"clean": "rimraf dist .turbo"
|
|
144
|
+
}
|
|
6
145
|
}
|