@open-feishu-card/adapter 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.
@@ -0,0 +1,358 @@
1
+ import { EMOJI_KEY_TO_NAME } from './emoji-data.js';
2
+ function styleAttrs(s) {
3
+ const attributes = [];
4
+ if (s.bold)
5
+ attributes.push('bold');
6
+ if (s.italic)
7
+ attributes.push('italic');
8
+ if (s.strike)
9
+ attributes.push('strikethrough');
10
+ const hasColor = s.color && s.color !== 'default';
11
+ if (attributes.length === 0 && !hasColor)
12
+ return undefined;
13
+ const ts = {};
14
+ if (attributes.length)
15
+ ts.attributes = attributes;
16
+ if (hasColor)
17
+ ts.color = s.color;
18
+ return ts;
19
+ }
20
+ function makeText(content, s) {
21
+ const property = { content };
22
+ const ts = styleAttrs(s);
23
+ if (ts)
24
+ property.textStyle = ts;
25
+ return { tag: 'plain_text', property };
26
+ }
27
+ /**
28
+ * 把一段(可能含软换行 \n)行内文本解析成子元素数组。
29
+ * 逐字符扫描,维护加粗/斜体/删除线/颜色状态;状态切换或遇到特殊构造时,
30
+ * 把累积的纯文本冲刷为一个 plain_text 段(对称于 rebuildMarkdown 的分段模型)。
31
+ */
32
+ export function parseInline(text) {
33
+ const out = [];
34
+ const style = { bold: false, italic: false, strike: false };
35
+ let buf = '';
36
+ const flush = () => {
37
+ if (buf) {
38
+ out.push(makeText(buf, style));
39
+ buf = '';
40
+ }
41
+ };
42
+ let i = 0;
43
+ const n = text.length;
44
+ const startsWith = (s) => text.startsWith(s, i);
45
+ while (i < n) {
46
+ const c = text[i];
47
+ // 软换行 → br
48
+ if (c === '\n') {
49
+ flush();
50
+ out.push({ tag: 'br', property: {} });
51
+ i += 1;
52
+ continue;
53
+ }
54
+ // 转义:\* \_ \` 等,原样取下一个字符
55
+ if (c === '\\' && i + 1 < n) {
56
+ buf += text[i + 1];
57
+ i += 2;
58
+ continue;
59
+ }
60
+ // :Key: emoji 短码 —— 仅当 key 在表内才成 emoji,否则原样留字面
61
+ // (未知 key 如 :NOTAREALKEY: 与正文裸冒号 时间:值 都保持文本)
62
+ if (c === ':') {
63
+ const mm = /^:([A-Za-z0-9_]+):/.exec(text.slice(i));
64
+ if (mm && EMOJI_KEY_TO_NAME[mm[1]]) {
65
+ flush();
66
+ out.push({ tag: 'emoji', property: { key: mm[1] } });
67
+ i += mm[0].length;
68
+ continue;
69
+ }
70
+ }
71
+ // 加粗 **(先于单星判定)
72
+ if (startsWith('**')) {
73
+ flush();
74
+ style.bold = !style.bold;
75
+ i += 2;
76
+ continue;
77
+ }
78
+ // 删除线 ~~
79
+ if (startsWith('~~')) {
80
+ flush();
81
+ style.strike = !style.strike;
82
+ i += 2;
83
+ continue;
84
+ }
85
+ // 斜体 * 或 _(单字符;避免把 ** 的第二个星、或单词内下划线误判)
86
+ if ((c === '*' || c === '_')) {
87
+ const prev = text[i - 1];
88
+ const next = text[i + 1];
89
+ // 下划线只有在词边界处才作斜体,避免 file_name 被拆开
90
+ const boundaryOk = c === '*' || (!isWord(prev) || !isWord(next));
91
+ if (boundaryOk) {
92
+ flush();
93
+ style.italic = !style.italic;
94
+ i += 1;
95
+ continue;
96
+ }
97
+ }
98
+ // 行内代码 `...`
99
+ if (c === '`') {
100
+ const end = text.indexOf('`', i + 1);
101
+ if (end !== -1) {
102
+ flush();
103
+ out.push({ tag: 'code_span', property: { content: text.slice(i + 1, end) } });
104
+ i = end + 1;
105
+ continue;
106
+ }
107
+ }
108
+ // 链接 [text](url)
109
+ if (c === '[') {
110
+ const link = matchLink(text, i);
111
+ if (link) {
112
+ flush();
113
+ const property = { content: link.text, url: link.url };
114
+ const ts = styleAttrs(style);
115
+ if (ts)
116
+ property.textStyle = ts;
117
+ out.push({ tag: 'link', property });
118
+ i = link.end;
119
+ continue;
120
+ }
121
+ }
122
+ // <font color='x'>...</font>
123
+ if (startsWith('<font')) {
124
+ const m = /^<font\s+color=['"]?([^'">]+)['"]?\s*>/.exec(text.slice(i));
125
+ if (m) {
126
+ flush();
127
+ style.color = m[1];
128
+ i += m[0].length;
129
+ continue;
130
+ }
131
+ }
132
+ if (startsWith('</font>')) {
133
+ flush();
134
+ style.color = undefined;
135
+ i += '</font>'.length;
136
+ continue;
137
+ }
138
+ // <at id=xxx></at> / <at id=all></at>
139
+ if (startsWith('<at')) {
140
+ const m = /^<at\s+id=['"]?([^'">\s]+)['"]?\s*>\s*<\/at>/.exec(text.slice(i));
141
+ if (m) {
142
+ flush();
143
+ if (m[1] === 'all')
144
+ out.push({ tag: 'at_all', property: {} });
145
+ else
146
+ out.push({ tag: 'at', property: { userID: m[1] } });
147
+ i += m[0].length;
148
+ continue;
149
+ }
150
+ }
151
+ // <text_tag color='x'>inner</text_tag>
152
+ if (startsWith('<text_tag')) {
153
+ const m = /^<text_tag(?:\s+color=['"]?([^'">]+)['"]?)?\s*>([\s\S]*?)<\/text_tag>/.exec(text.slice(i));
154
+ if (m) {
155
+ flush();
156
+ const property = {
157
+ text: { tag: 'plain_text', property: { content: m[2] } },
158
+ };
159
+ if (m[1])
160
+ property.color = m[1];
161
+ out.push({ tag: 'text_tag', property });
162
+ i += m[0].length;
163
+ continue;
164
+ }
165
+ }
166
+ // <person id='ou_x' show_name=true show_avatar=true style='normal'></person>
167
+ // 飞书 markdown 内联人员:转成 person_v1,无人员表时走 PERSON_FALLBACK_* 降级。
168
+ if (startsWith('<person')) {
169
+ const m = /^<person\b([^>]*?)(?:\/>|>\s*<\/person>)/.exec(text.slice(i));
170
+ if (m) {
171
+ flush();
172
+ const attrs = parseHtmlAttrs(m[1]);
173
+ const property = {
174
+ userID: attrs.id || attrs.user_id || '',
175
+ // 标记为 markdown 内联:渲染时跟正文字号,而非独立 person 的 medium 默认
176
+ avatarFollowFontSize: true,
177
+ };
178
+ if (attrs.show_name != null)
179
+ property.showName = attrs.show_name !== 'false';
180
+ if (attrs.show_avatar != null)
181
+ property.showAvatar = attrs.show_avatar !== 'false';
182
+ if (attrs.size)
183
+ property.size = attrs.size;
184
+ // style=capsule → 胶囊外形;normal / 其它忽略
185
+ if (attrs.style === 'capsule')
186
+ property.pillShaped = true;
187
+ out.push({ tag: 'person_v1', property });
188
+ i += m[0].length;
189
+ continue;
190
+ }
191
+ }
192
+ buf += c;
193
+ i += 1;
194
+ }
195
+ flush();
196
+ return out;
197
+ }
198
+ /** 解析 HTML 属性串:`id='x' show_name=true style="normal"` → { id, show_name, style } */
199
+ function parseHtmlAttrs(s) {
200
+ const out = {};
201
+ const re = /([A-Za-z_][\w-]*)\s*=\s*(?:'([^']*)'|"([^"]*)"|([^\s'">=]+))/g;
202
+ let m;
203
+ while ((m = re.exec(s))) {
204
+ out[m[1]] = m[2] ?? m[3] ?? m[4] ?? '';
205
+ }
206
+ return out;
207
+ }
208
+ function isWord(ch) {
209
+ return !!ch && /[\w一-龥]/.test(ch);
210
+ }
211
+ /** 从 `[` 起匹配 [text](url),返回文本、url 与结束下标;不成立返回 null */
212
+ function matchLink(text, start) {
213
+ // 找 ] 且紧跟 (
214
+ let depth = 0;
215
+ let j = start;
216
+ for (; j < text.length; j++) {
217
+ if (text[j] === '[')
218
+ depth++;
219
+ else if (text[j] === ']') {
220
+ depth--;
221
+ if (depth === 0)
222
+ break;
223
+ }
224
+ }
225
+ if (j >= text.length || text[j + 1] !== '(')
226
+ return null;
227
+ const label = text.slice(start + 1, j);
228
+ const close = text.indexOf(')', j + 2);
229
+ if (close === -1)
230
+ return null;
231
+ const url = text.slice(j + 2, close);
232
+ return { text: label, url, end: close + 1 };
233
+ }
234
+ /* ------------------------------------------------------------------ *
235
+ * 块级解析
236
+ * ------------------------------------------------------------------ */
237
+ const RE_HEADING = /^(#{1,6})\s+(.*)$/;
238
+ const RE_HR = /^\s*([-*_])\1{2,}\s*$/;
239
+ const RE_LIST = /^(\s*)([-*+]|\d+\.)\s+(.*)$/;
240
+ const RE_FENCE = /^\s*```(.*)$/;
241
+ /**
242
+ * markdown 字符串 → 子元素数组(块级 + 行内)。
243
+ * 逐行扫描识别块构造;连续的普通文本行合并为一段,用 br 承载软换行。
244
+ */
245
+ export function parseMarkdown(content) {
246
+ if (!content)
247
+ return [];
248
+ const lines = String(content).replace(/\r\n?/g, '\n').split('\n');
249
+ const out = [];
250
+ let para = [];
251
+ const flushPara = () => {
252
+ if (para.length === 0)
253
+ return;
254
+ // 段内软换行用 \n 交给 parseInline 转成 br
255
+ const seg = parseInline(para.join('\n'));
256
+ out.push(...seg);
257
+ para = [];
258
+ };
259
+ for (let i = 0; i < lines.length; i++) {
260
+ const line = lines[i];
261
+ // 空行:结束当前段落,并补一个 br 以还原段间距(渲染器 markdown 是单 div,靠 br 断行)
262
+ if (line.trim() === '') {
263
+ if (para.length) {
264
+ flushPara();
265
+ out.push({ tag: 'br', property: {} });
266
+ }
267
+ continue;
268
+ }
269
+ // 围栏代码块 ```lang ... ```
270
+ const fence = RE_FENCE.exec(line);
271
+ if (fence) {
272
+ flushPara();
273
+ const language = fence[1].trim();
274
+ const body = [];
275
+ i++;
276
+ for (; i < lines.length; i++) {
277
+ if (/^\s*```/.test(lines[i]))
278
+ break;
279
+ body.push(lines[i]);
280
+ }
281
+ out.push({
282
+ tag: 'code_block',
283
+ property: {
284
+ language,
285
+ contents: body.map((l) => ({ contents: [{ content: l }] })),
286
+ },
287
+ });
288
+ continue;
289
+ }
290
+ // 标题
291
+ const heading = RE_HEADING.exec(line);
292
+ if (heading) {
293
+ flushPara();
294
+ out.push({
295
+ tag: 'heading',
296
+ property: { level: heading[1].length, elements: parseInline(heading[2]) },
297
+ });
298
+ continue;
299
+ }
300
+ // 分割线
301
+ if (RE_HR.test(line)) {
302
+ flushPara();
303
+ out.push({ tag: 'hr', property: {} });
304
+ continue;
305
+ }
306
+ // 引用块(连续 > 行合并)
307
+ if (/^\s*>\s?/.test(line)) {
308
+ flushPara();
309
+ const quote = [];
310
+ for (; i < lines.length; i++) {
311
+ if (!/^\s*>\s?/.test(lines[i])) {
312
+ i--;
313
+ break;
314
+ }
315
+ quote.push(lines[i].replace(/^\s*>\s?/, ''));
316
+ }
317
+ out.push({ tag: 'blockquote', property: { elements: parseInline(quote.join('\n')) } });
318
+ continue;
319
+ }
320
+ // 列表(连续列表项合并;含缩进层级与有序/无序)
321
+ if (RE_LIST.test(line)) {
322
+ flushPara();
323
+ const items = [];
324
+ let counter = 0;
325
+ let lastOrdered;
326
+ for (; i < lines.length; i++) {
327
+ const m = RE_LIST.exec(lines[i]);
328
+ if (!m) {
329
+ i--;
330
+ break;
331
+ }
332
+ const indent = m[1].replace(/\t/g, ' ').length;
333
+ const level = Math.floor(indent / 2);
334
+ const ordered = /\d+\./.test(m[2]);
335
+ if (ordered !== lastOrdered)
336
+ counter = 0;
337
+ lastOrdered = ordered;
338
+ const item = {
339
+ type: ordered ? 'ol' : 'ul',
340
+ level,
341
+ elements: parseInline(m[3]),
342
+ };
343
+ if (ordered) {
344
+ counter += 1;
345
+ item.order = counter;
346
+ }
347
+ items.push(item);
348
+ }
349
+ out.push({ tag: 'list', property: { items } });
350
+ continue;
351
+ }
352
+ // 普通文本行 → 累积到当前段落
353
+ para.push(line);
354
+ }
355
+ flushPara();
356
+ return out;
357
+ }
358
+ //# sourceMappingURL=md-parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"md-parse.js","sourceRoot":"","sources":["../src/md-parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** 未知/私有组件自动降级:包一层 unknown 节点,原始 RAW 保留在 fallback。 */
2
+ export declare function degradeUnknown(el: Record<string, unknown>): Record<string, unknown>;
3
+ /** RAW envelope(可能是 {json_card:{card}} / {card} / 直接 card)→ DSL 卡片对象 */
4
+ export declare function rawToDsl(raw: unknown): Record<string, unknown>;
5
+ /** DSL → RAW(重导出,统一入口) */
6
+ export { dslToRaw } from './dsl-to-raw.js';
7
+ export type { CardElement, ElementProperty, JsonCard } from './types.js';
8
+ //# sourceMappingURL=raw-to-dsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-to-dsl.d.ts","sourceRoot":"","sources":["../src/raw-to-dsl.ts"],"names":[],"mappings":"AA6CA,sDAAsD;AACtD,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGnF;AAED,wEAAwE;AACxE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiB9D;AAyGD,0BAA0B;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,166 @@
1
+ const CAMEL_RENAME = {
2
+ textAlign: 'text_align',
3
+ textStyle: 'text_style',
4
+ backgroundStyle: 'background_style',
5
+ backgroundColor: 'background_color',
6
+ userID: 'user_id',
7
+ showAvatar: 'show_avatar',
8
+ showName: 'show_name',
9
+ hasBorder: 'has_border',
10
+ hoverTips: 'hover_tips',
11
+ pillShaped: 'pill_shaped',
12
+ tagStyle: 'tag_style',
13
+ scaleType: 'scale_type',
14
+ dropInvalidUserID: 'drop_invalid_user_id',
15
+ udIcon: 'ud_icon',
16
+ };
17
+ /** 已知公开 DSL 组件 tag 集合;不在此列的视为私有/未知 */
18
+ const KNOWN_TAGS = new Set([
19
+ 'markdown', 'lark_md', 'div', 'column_set', 'column', 'hr', 'image', 'img',
20
+ 'button', 'overflow', 'select_static', 'select_multi', 'input', 'date_picker',
21
+ 'picker_time', 'picker_date', 'checker', 'chart', 'table', 'iframe', 'person',
22
+ 'person_list', 'interactive_container', 'tag', 'text_tag', 'multi_image',
23
+ 'plain_text', 'lark_md_inline', 'image_text', 'carousel', 'grid', 'speaking',
24
+ 'vote', 'lottery', 'calender', 'schedule', 'share_chat', 'share_user', 'add_on',
25
+ 'whole_text', 'cropper_image', 'highlight', 'local_file', 'file_preview',
26
+ 'input_select', 'picker_datetime', 'picker_multi', 'rule', 'statistic', 'task',
27
+ 'card_header', 'body', 'unknown',
28
+ ]);
29
+ function isRecord(v) {
30
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
31
+ }
32
+ /** 未知/私有组件自动降级:包一层 unknown 节点,原始 RAW 保留在 fallback。 */
33
+ export function degradeUnknown(el) {
34
+ const rawTag = typeof el.tag === 'string' ? el.tag : 'undefined';
35
+ return { tag: 'unknown', raw_tag: rawTag, fallback: el };
36
+ }
37
+ /** RAW envelope(可能是 {json_card:{card}} / {card} / 直接 card)→ DSL 卡片对象 */
38
+ export function rawToDsl(raw) {
39
+ let card = {};
40
+ if (isRecord(raw)) {
41
+ const env = isRecord(raw.json_card) ? raw.json_card : isRecord(raw.card) ? raw.card : raw;
42
+ if (isRecord(env))
43
+ card = env;
44
+ }
45
+ const out = {
46
+ schema: typeof card.schema === 'string' ? card.schema : '2.0',
47
+ };
48
+ if (isRecord(card.config))
49
+ out.config = card.config;
50
+ if (isRecord(card.header))
51
+ out.header = convertHeaderToDsl(card.header);
52
+ if (isRecord(card.body))
53
+ out.body = convertBodyToDsl(card.body);
54
+ else if (Array.isArray(card.elements)) {
55
+ // 兼容扁平 body 写法
56
+ out.body = { elements: card.elements.map(convertElToDsl).filter(Boolean) };
57
+ }
58
+ return out;
59
+ }
60
+ function convertHeaderToDsl(header) {
61
+ const property = isRecord(header.property) ? header.property : header;
62
+ const out = {};
63
+ for (const [k, v] of Object.entries(property)) {
64
+ if (k === 'ud_icon' || k === 'udIcon') {
65
+ if (isRecord(v) && typeof v.tag === 'string') {
66
+ out.ud_icon = convertElToDsl(v);
67
+ continue;
68
+ }
69
+ }
70
+ out[CAMEL_RENAME[k] ?? k] = unwrapTextLeaf(v);
71
+ }
72
+ return out;
73
+ }
74
+ function convertBodyToDsl(body) {
75
+ const property = isRecord(body.property) ? body.property : body;
76
+ const out = {};
77
+ for (const [k, v] of Object.entries(property)) {
78
+ if (k === 'elements' && Array.isArray(v)) {
79
+ out.elements = v.map(convertElToDsl).filter(Boolean);
80
+ continue;
81
+ }
82
+ if (isRecord(v) && typeof v.tag === 'string') {
83
+ out[CAMEL_RENAME[k] ?? k] = convertElToDsl(v);
84
+ continue;
85
+ }
86
+ if (Array.isArray(v)) {
87
+ out[CAMEL_RENAME[k] ?? k] = v.map((item) => (isRecord(item) && typeof item.tag === 'string' ? convertElToDsl(item) : item));
88
+ continue;
89
+ }
90
+ out[CAMEL_RENAME[k] ?? k] = unwrapBox(v);
91
+ }
92
+ return out;
93
+ }
94
+ function convertElToDsl(el) {
95
+ if (!isRecord(el))
96
+ return undefined;
97
+ const tag = typeof el.tag === 'string' ? el.tag : '';
98
+ if (!tag)
99
+ return undefined;
100
+ // 未知/私有组件:降级,保数据
101
+ if (!KNOWN_TAGS.has(tag))
102
+ return degradeUnknown(el);
103
+ // 有 fallback 的 RAW 节点(渲染器未知组件降级产物)原样透传
104
+ if ('fallback' in el && isRecord(el.fallback))
105
+ return el;
106
+ const property = isRecord(el.property) ? el.property : {};
107
+ const out = {};
108
+ if (tag !== 'plain_text')
109
+ out.tag = tag === 'img' ? 'image' : tag;
110
+ for (const [k, v] of Object.entries(property)) {
111
+ const key = CAMEL_RENAME[k] ?? k;
112
+ if (k === 'elements' && Array.isArray(v)) {
113
+ if (tag === 'markdown') {
114
+ // markdown 子元素树 → 尽力还原为 markdown 字符串
115
+ out.content = elementsToMarkdown(v);
116
+ continue;
117
+ }
118
+ out.elements = v.map(convertElToDsl).filter(Boolean);
119
+ continue;
120
+ }
121
+ if (k === 'columns' && Array.isArray(v)) {
122
+ out.columns = v.map(convertElToDsl).filter(Boolean);
123
+ continue;
124
+ }
125
+ if (isRecord(v) && typeof v.tag === 'string') {
126
+ out[key] = convertElToDsl(v);
127
+ continue;
128
+ }
129
+ if (Array.isArray(v)) {
130
+ out[key] = v.map((item) => (isRecord(item) && typeof item.tag === 'string' ? convertElToDsl(item) : item));
131
+ continue;
132
+ }
133
+ out[key] = unwrapBox(unwrapTextLeaf(v));
134
+ }
135
+ return out;
136
+ }
137
+ /** plain_text 叶子 → 字符串 */
138
+ function unwrapTextLeaf(v) {
139
+ if (isRecord(v) && v.tag === 'plain_text') {
140
+ const p = isRecord(v.property) ? v.property : {};
141
+ return typeof p.content === 'string' ? p.content : '';
142
+ }
143
+ return v;
144
+ }
145
+ /** {top/right/bottom/left:{type:'pixels',value}} 简写 → "t r b l" 字符串 */
146
+ function unwrapBox(v) {
147
+ if (!isRecord(v) || !isRecord(v.top) || !isRecord(v.right))
148
+ return v;
149
+ const side = (s) => (isRecord(s) && typeof s.value === 'number' ? `${s.value}px` : '0px');
150
+ return `${side(v.top)} ${side(v.right)} ${side(v.bottom ?? v.top)} ${side(v.left ?? v.right)}`;
151
+ }
152
+ /** markdown 子元素树 → 近似 markdown 字符串(逐叶子提取文本) */
153
+ function elementsToMarkdown(els) {
154
+ const parts = [];
155
+ for (const el of els) {
156
+ const p = (isRecord(el?.property) ? el.property : {});
157
+ if (typeof p.content === 'string')
158
+ parts.push(p.content);
159
+ else if (Array.isArray(p.elements))
160
+ parts.push(elementsToMarkdown(p.elements));
161
+ }
162
+ return parts.join('');
163
+ }
164
+ /** DSL → RAW(重导出,统一入口) */
165
+ export { dslToRaw } from './dsl-to-raw.js';
166
+ //# sourceMappingURL=raw-to-dsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"raw-to-dsl.js","sourceRoot":"","sources":["../src/raw-to-dsl.ts"],"names":[],"mappings":"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"}