@ant-design/x-markdown-mini 0.1.0-beta.0 → 0.1.0-beta.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.
Files changed (48) hide show
  1. package/dist/components/Markdown/index.acss +65 -7
  2. package/dist/components/MiniNodeRenderer/index.acss +19 -4
  3. package/dist/components/MiniNodeRenderer/index.axml +109 -29
  4. package/dist/components/MiniNodeRenderer/index.js +12 -0
  5. package/dist/components/MiniNodeRenderer/index.sjs +48 -0
  6. package/dist/es/Markdown/index.acss +65 -7
  7. package/dist/es/MiniNodeRenderer/index.acss +19 -4
  8. package/dist/es/MiniNodeRenderer/index.axml +109 -29
  9. package/dist/es/MiniNodeRenderer/index.js +12 -0
  10. package/dist/es/MiniNodeRenderer/index.sjs +48 -0
  11. package/dist/index.d.mts +39 -1
  12. package/dist/index.d.ts +39 -1
  13. package/dist/index.js +134 -56
  14. package/dist/index.mjs +134 -56
  15. package/dist/miniprogram_dist/components/Markdown/index.json +1 -1
  16. package/dist/miniprogram_dist/components/Markdown/index.wxss +65 -7
  17. package/dist/miniprogram_dist/components/MiniNodeRenderer/index.js +12 -0
  18. package/dist/miniprogram_dist/components/MiniNodeRenderer/index.json +1 -1
  19. package/dist/miniprogram_dist/components/MiniNodeRenderer/index.wxml +98 -21
  20. package/dist/miniprogram_dist/components/MiniNodeRenderer/index.wxs +41 -0
  21. package/dist/miniprogram_dist/components/MiniNodeRenderer/index.wxss +13 -2
  22. package/dist/miniprogram_dist/es/Markdown/index.json +1 -1
  23. package/dist/miniprogram_dist/es/Markdown/index.wxss +65 -7
  24. package/dist/miniprogram_dist/es/MiniNodeRenderer/index.js +12 -0
  25. package/dist/miniprogram_dist/es/MiniNodeRenderer/index.json +1 -1
  26. package/dist/miniprogram_dist/es/MiniNodeRenderer/index.wxml +98 -21
  27. package/dist/miniprogram_dist/es/MiniNodeRenderer/index.wxs +41 -0
  28. package/dist/miniprogram_dist/es/MiniNodeRenderer/index.wxss +13 -2
  29. package/dist/miniprogram_dist/index.js +134 -56
  30. package/dist/miniprogram_dist/plugins/CodeHighlight/index.js +13 -5
  31. package/dist/miniprogram_dist/plugins/CodeHighlight/style.wxss +41 -31
  32. package/dist/miniprogram_dist/plugins/Latex/index.js +44 -23
  33. package/dist/miniprogram_dist/plugins/Latex/style.wxss +11 -11
  34. package/dist/miniprogram_dist/shared/flattenInline.js +33 -5
  35. package/dist/plugins/CodeHighlight/index.d.mts +1 -1
  36. package/dist/plugins/CodeHighlight/index.d.ts +1 -1
  37. package/dist/plugins/CodeHighlight/index.js +13 -5
  38. package/dist/plugins/CodeHighlight/index.mjs +13 -5
  39. package/dist/plugins/CodeHighlight/style.acss +41 -31
  40. package/dist/plugins/Latex/index.d.mts +1 -1
  41. package/dist/plugins/Latex/index.d.ts +1 -1
  42. package/dist/plugins/Latex/index.js +44 -23
  43. package/dist/plugins/Latex/index.mjs +47 -23
  44. package/dist/plugins/Latex/style.acss +11 -6
  45. package/dist/shared/flattenInline.js +33 -5
  46. package/dist/{types-CegkonfJ.d.mts → types-BcxGtbQZ.d.mts} +25 -0
  47. package/dist/{types-CegkonfJ.d.ts → types-BcxGtbQZ.d.ts} +25 -0
  48. package/package.json +3 -2
@@ -1,3 +1,23 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+
1
21
  // node_modules/katex/dist/katex.mjs
2
22
  var ParseError = class _ParseError extends Error {
3
23
  // The underlying error message without any context added.
@@ -14497,6 +14517,10 @@ var katex = {
14497
14517
  };
14498
14518
 
14499
14519
  // src/plugins/shared/htmlToMiniNodes.ts
14520
+ var CLOSE_TAG_RE = /<\/(\w+)\s*>/y;
14521
+ var OPEN_TAG_RE = /<(\w+)((?:\s+[^>]*?)?)(\/?)>/y;
14522
+ var KATEX_CLOSE_SPAN_RE = /<\/span\s*>/iy;
14523
+ var KATEX_OPEN_SPAN_RE = /<span[\s>]/iy;
14500
14524
  function htmlToMiniNodes(html, escapeText) {
14501
14525
  var _a;
14502
14526
  const root = { name: "root", children: [] };
@@ -14534,7 +14558,8 @@ function htmlToMiniNodes(html, escapeText) {
14534
14558
  }
14535
14559
  while (i < html.length) {
14536
14560
  if (html[i] === "<") {
14537
- const closeMatch = /^<\/(\w+)\s*>/.exec(html.slice(i));
14561
+ CLOSE_TAG_RE.lastIndex = i;
14562
+ const closeMatch = CLOSE_TAG_RE.exec(html);
14538
14563
  if (closeMatch) {
14539
14564
  const closeTag = closeMatch[1].toLowerCase();
14540
14565
  for (let j = stack.length - 1; j > 0; j--) {
@@ -14546,7 +14571,8 @@ function htmlToMiniNodes(html, escapeText) {
14546
14571
  i += closeMatch[0].length;
14547
14572
  continue;
14548
14573
  }
14549
- const tagMatch = /^<(\w+)((?:\s+[^>]*?)?)(\/?)>/.exec(html.slice(i));
14574
+ OPEN_TAG_RE.lastIndex = i;
14575
+ const tagMatch = OPEN_TAG_RE.exec(html);
14550
14576
  if (tagMatch) {
14551
14577
  const rawTag = tagMatch[1].toLowerCase();
14552
14578
  const attrStr = tagMatch[2];
@@ -14557,8 +14583,10 @@ function htmlToMiniNodes(html, escapeText) {
14557
14583
  while (si < html.length && depth > 0) {
14558
14584
  const next = html.indexOf("<", si);
14559
14585
  if (next === -1) break;
14560
- const csm = /^<\/span\s*>/i.exec(html.slice(next));
14561
- const osm = /^<span[\s>]/i.exec(html.slice(next));
14586
+ KATEX_CLOSE_SPAN_RE.lastIndex = next;
14587
+ const csm = KATEX_CLOSE_SPAN_RE.exec(html);
14588
+ KATEX_OPEN_SPAN_RE.lastIndex = next;
14589
+ const osm = KATEX_OPEN_SPAN_RE.exec(html);
14562
14590
  if (csm) {
14563
14591
  depth--;
14564
14592
  si = next + csm[0].length;
@@ -14657,29 +14685,25 @@ function inlineStart(src) {
14657
14685
  return void 0;
14658
14686
  }
14659
14687
  function renderKatex(tex, displayMode, options) {
14688
+ let html;
14660
14689
  try {
14661
- const html = katex.renderToString(tex, {
14690
+ html = katex.renderToString(tex, __spreadProps(__spreadValues({
14662
14691
  displayMode,
14663
- throwOnError: false,
14664
- output: "html",
14665
- ...options.katexOptions
14666
- });
14667
- const nodes = htmlToMiniNodes(html, false);
14668
- const wrapper = displayMode ? "div" : "span";
14669
- const className = displayMode ? "katex-display" : "katex-inline";
14670
- return [{ name: wrapper, attrs: { class: className }, children: nodes }];
14692
+ output: "html"
14693
+ }, options.katexOptions), {
14694
+ // The plugin owns error handling: force KaTeX to throw on invalid input
14695
+ // so we never emit its red `.katex-error` markup. This is intentionally
14696
+ // set after the spread so a caller's `throwOnError: false` cannot re-enable
14697
+ // the broken-formula output (common during streaming of partial formulas).
14698
+ throwOnError: true
14699
+ }));
14671
14700
  } catch (err) {
14672
- if (options.onError) {
14673
- return options.onError(tex, err);
14674
- }
14675
- return [
14676
- {
14677
- name: "span",
14678
- attrs: { class: "katex-error" },
14679
- children: [{ name: "text", attrs: { value: err.message } }]
14680
- }
14681
- ];
14701
+ return options.onError ? options.onError(tex, err) : [];
14682
14702
  }
14703
+ const nodes = htmlToMiniNodes(html, false);
14704
+ const wrapper = displayMode ? "div" : "span";
14705
+ const className = displayMode ? "katex-display" : "katex-inline";
14706
+ return [{ name: wrapper, attrs: { class: className }, children: nodes }];
14683
14707
  }
14684
14708
  function Latex(options = {}) {
14685
14709
  return {
@@ -209,6 +209,7 @@
209
209
  /* Note: '>' child combinators replaced with ' ' (descendant) for mini-program compat */
210
210
 
211
211
  .katex {
212
+ display: inline-block;
212
213
  font-family: KaTeX_Main, "PingFang SC", "Helvetica Neue", Helvetica, Arial, sans-serif;
213
214
  font-size: 1em;
214
215
  font-weight: normal;
@@ -218,6 +219,10 @@
218
219
  -webkit-font-smoothing: antialiased;
219
220
  }
220
221
 
222
+ /* mini-program 无原生 <span>,KaTeX 节点渲染为 <view>/<text>;未带显式 display
223
+ 的原子默认 inline-block,结构性 class 规则(.base/.vlist* 等)按特异性覆盖。 */
224
+ .katex view { display: inline-block; vertical-align: baseline; }
225
+
221
226
  .katex * {
222
227
  -ms-high-contrast-adjust: none !important;
223
228
  border-color: currentColor;
@@ -281,13 +286,13 @@
281
286
  position: relative;
282
287
  }
283
288
 
284
- .katex .vlist span {
289
+ .katex .vlist view {
285
290
  display: block;
286
291
  height: 0;
287
292
  position: relative;
288
293
  }
289
294
 
290
- .katex .vlist span span { display: inline-block; }
295
+ .katex .vlist view view { display: inline-block; }
291
296
 
292
297
  .katex .vlist .pstrut {
293
298
  overflow: hidden;
@@ -326,7 +331,7 @@
326
331
 
327
332
  .katex .msupsub { text-align: left; }
328
333
 
329
- .katex .mfrac span span { text-align: center; }
334
+ .katex .mfrac view view { text-align: center; }
330
335
 
331
336
  .katex .mfrac .frac-line {
332
337
  display: inline-block;
@@ -354,7 +359,7 @@
354
359
  .katex .llap .fix, .katex .rlap .fix, .katex .clap .fix { display: inline-block; }
355
360
  .katex .llap .inner { right: 0; }
356
361
  .katex .rlap .inner, .katex .clap .inner { left: 0; }
357
- .katex .clap .inner span { margin-left: -50%; margin-right: 50%; }
362
+ .katex .clap .inner view { margin-left: -50%; margin-right: 50%; }
358
363
 
359
364
  .katex .rule {
360
365
  display: inline-block;
@@ -529,8 +534,8 @@
529
534
  .katex .delimsizing.size3 { font-family: KaTeX_Size3; }
530
535
  .katex .delimsizing.size4 { font-family: KaTeX_Size4; }
531
536
 
532
- .katex .delimsizing.mult .delim-size1 span { font-family: KaTeX_Size1; }
533
- .katex .delimsizing.mult .delim-size4 span { font-family: KaTeX_Size4; }
537
+ .katex .delimsizing.mult .delim-size1 view { font-family: KaTeX_Size1; }
538
+ .katex .delimsizing.mult .delim-size4 view { font-family: KaTeX_Size4; }
534
539
 
535
540
  .katex .nulldelimiter { display: inline-block; width: 0.12em; }
536
541
  .katex .delimcenter { position: relative; }
@@ -1,8 +1,25 @@
1
1
  "use strict";
2
2
  var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
8
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
10
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
+ var __spreadValues = (a, b) => {
12
+ for (var prop in b || (b = {}))
13
+ if (__hasOwnProp.call(b, prop))
14
+ __defNormalProp(a, prop, b[prop]);
15
+ if (__getOwnPropSymbols)
16
+ for (var prop of __getOwnPropSymbols(b)) {
17
+ if (__propIsEnum.call(b, prop))
18
+ __defNormalProp(a, prop, b[prop]);
19
+ }
20
+ return a;
21
+ };
22
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
6
23
  var __export = (target, all) => {
7
24
  for (var name in all)
8
25
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -34,16 +51,23 @@ const INLINE_TAGS = {
34
51
  const TAG_CLASS = {
35
52
  strong: "md-strong",
36
53
  em: "md-em",
37
- del: "md-del",
38
- code: "md-inline-code"
54
+ del: "md-del"
55
+ // 'code' 不在此处加类:行内 codespan 由 transformer 直接打 md-inline-code
56
+ // 而代码块内的 <code>(在 <pre> 中)不应带行内药丸底色。
39
57
  // 'span' 不附加额外 class
40
58
  };
59
+ function isKatex(node) {
60
+ var _a;
61
+ const cls = (_a = node.attrs) == null ? void 0 : _a.class;
62
+ return typeof cls === "string" && cls.indexOf("katex") > -1;
63
+ }
41
64
  function walk(node) {
65
+ if (isKatex(node)) return node;
42
66
  if (!node.children || node.children.length === 0) return node;
43
67
  if (node.name === "a") {
44
- return { ...node, children: flattenChildren(node.children) };
68
+ return __spreadProps(__spreadValues({}, node), { children: flattenChildren(node.children) });
45
69
  }
46
- return { ...node, children: flattenChildren(node.children) };
70
+ return __spreadProps(__spreadValues({}, node), { children: flattenChildren(node.children) });
47
71
  }
48
72
  function flattenChildren(children) {
49
73
  const out = [];
@@ -65,8 +89,12 @@ function flattenOne(n, classChain, out) {
65
89
  out.push({ name: "br", attrs: {} });
66
90
  return;
67
91
  }
92
+ if (isKatex(n)) {
93
+ out.push(n);
94
+ return;
95
+ }
68
96
  if (n.name === "a") {
69
- out.push({ ...n, children: flattenChildren((_d = n.children) != null ? _d : []) });
97
+ out.push(__spreadProps(__spreadValues({}, n), { children: flattenChildren((_d = n.children) != null ? _d : []) }));
70
98
  return;
71
99
  }
72
100
  if (n.name === "img") {
@@ -41,6 +41,22 @@ interface XMarkdownExtension {
41
41
  /** Marked tokenizer overrides (forwarded to marked). */
42
42
  tokenizer?: MarkedExtension['tokenizer'];
43
43
  }
44
+ /** Context passed to a code-block header renderer. */
45
+ interface CodeHeaderContext {
46
+ /** Resolved language id ('' when the fence has no language). */
47
+ lang: string;
48
+ /** Raw code text — the clipboard payload. */
49
+ text: string;
50
+ token: Tokens.Code;
51
+ }
52
+ /** Context passed to a table header renderer. */
53
+ interface TableHeaderContext {
54
+ /** Raw markdown source of the table — the clipboard payload. */
55
+ markdown: string;
56
+ token: Tokens.Table;
57
+ }
58
+ type CodeHeaderRenderer = (ctx: CodeHeaderContext) => MiniNode | MiniNode[] | null;
59
+ type TableHeaderRenderer = (ctx: TableHeaderContext) => MiniNode | MiniNode[] | null;
44
60
  /** 渲染上下文:transformer 共用的公共配置。 */
45
61
  interface RenderContext {
46
62
  /** 是否启用块级动画 */
@@ -57,6 +73,13 @@ interface RenderContext {
57
73
  * Colocated tokenizer+renderer extensions registered on the instance.
58
74
  */
59
75
  extensions?: readonly XMarkdownExtension[];
76
+ /**
77
+ * Code-block header config. `true`/undefined = default (language + copy
78
+ * button); `false` = no header; function = custom header nodes.
79
+ */
80
+ codeHeader?: boolean | CodeHeaderRenderer;
81
+ /** Table header config. Same semantics as `codeHeader`. */
82
+ tableHeader?: boolean | TableHeaderRenderer;
60
83
  /**
61
84
  * Recursively render an inline token array to MiniNode[]. Provided by the
62
85
  * platform transformer; used by custom extension miniRenderers that emit
@@ -76,6 +99,8 @@ interface MiniNode {
76
99
  attrs?: Record<string, string | number | boolean>;
77
100
  /** 子节点 */
78
101
  children?: MiniNode[];
102
+ /** 代码块/表格顶部 header 栏(语言/标题 + 复制按钮)。 */
103
+ header?: MiniNode[];
79
104
  /** 是否开启动画 */
80
105
  animate?: boolean;
81
106
  }
@@ -41,6 +41,22 @@ interface XMarkdownExtension {
41
41
  /** Marked tokenizer overrides (forwarded to marked). */
42
42
  tokenizer?: MarkedExtension['tokenizer'];
43
43
  }
44
+ /** Context passed to a code-block header renderer. */
45
+ interface CodeHeaderContext {
46
+ /** Resolved language id ('' when the fence has no language). */
47
+ lang: string;
48
+ /** Raw code text — the clipboard payload. */
49
+ text: string;
50
+ token: Tokens.Code;
51
+ }
52
+ /** Context passed to a table header renderer. */
53
+ interface TableHeaderContext {
54
+ /** Raw markdown source of the table — the clipboard payload. */
55
+ markdown: string;
56
+ token: Tokens.Table;
57
+ }
58
+ type CodeHeaderRenderer = (ctx: CodeHeaderContext) => MiniNode | MiniNode[] | null;
59
+ type TableHeaderRenderer = (ctx: TableHeaderContext) => MiniNode | MiniNode[] | null;
44
60
  /** 渲染上下文:transformer 共用的公共配置。 */
45
61
  interface RenderContext {
46
62
  /** 是否启用块级动画 */
@@ -57,6 +73,13 @@ interface RenderContext {
57
73
  * Colocated tokenizer+renderer extensions registered on the instance.
58
74
  */
59
75
  extensions?: readonly XMarkdownExtension[];
76
+ /**
77
+ * Code-block header config. `true`/undefined = default (language + copy
78
+ * button); `false` = no header; function = custom header nodes.
79
+ */
80
+ codeHeader?: boolean | CodeHeaderRenderer;
81
+ /** Table header config. Same semantics as `codeHeader`. */
82
+ tableHeader?: boolean | TableHeaderRenderer;
60
83
  /**
61
84
  * Recursively render an inline token array to MiniNode[]. Provided by the
62
85
  * platform transformer; used by custom extension miniRenderers that emit
@@ -76,6 +99,8 @@ interface MiniNode {
76
99
  attrs?: Record<string, string | number | boolean>;
77
100
  /** 子节点 */
78
101
  children?: MiniNode[];
102
+ /** 代码块/表格顶部 header 栏(语言/标题 + 复制按钮)。 */
103
+ header?: MiniNode[];
79
104
  /** 是否开启动画 */
80
105
  animate?: boolean;
81
106
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ant-design/x-markdown-mini",
3
- "version": "0.1.0-beta.0",
3
+ "version": "0.1.0-beta.1",
4
4
  "description": "多小程序场景下的高性能、强扩展、流式友好的 Markdown 渲染器",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -31,7 +31,7 @@
31
31
  "dist"
32
32
  ],
33
33
  "scripts": {
34
- "build": "tsup && node scripts/patch-modern-regex.mjs && node scripts/copy-miniprogram-dist.mjs && node scripts/copy-component-assets.mjs",
34
+ "build": "node scripts/clean.mjs && tsup && node scripts/patch-modern-regex.mjs && node scripts/copy-miniprogram-dist.mjs && node scripts/copy-component-assets.mjs",
35
35
  "clean": "node scripts/clean.mjs",
36
36
  "clean:all": "node scripts/clean.mjs --all",
37
37
  "test": "vitest run --coverage",
@@ -42,6 +42,7 @@
42
42
  "bench:check": "npm run bench && node scripts/check-bench.mjs --threshold 0.10",
43
43
  "bench:update": "npm run bench && node scripts/bench-update.mjs",
44
44
  "bench:compare": "tsx benchmark/compare.ts",
45
+ "check:examples": "node scripts/check-examples.mjs",
45
46
  "lint": "eslint src --ext .ts",
46
47
  "docs": "npm run build && cd docs-site && npm run dev",
47
48
  "docs:build": "npm run build && cd docs-site && npm run build",