@stylewx/core 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/core.test.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { describe, it, expect } from 'vitest';
2
- import { markdownToHtml, renderMarkdownToHtml, countWords, estimateReadingMinutes, } from './index.js';
2
+ import { markdownToHtml, renderMarkdownToHtml, countWords, estimateReadingMinutes, preprocessSuperSub, } from './index.js';
3
3
  import { getPresetTheme, compileThemeToCss } from '@stylewx/theme';
4
4
  const theme = getPresetTheme('tech-minimal');
5
5
  const sampleMarkdown = `# 科技极简示例
@@ -52,6 +52,19 @@ describe('markdownToHtml', () => {
52
52
  const h6 = markdownToHtml('######深标题');
53
53
  expect(h6).toContain('<h6>');
54
54
  });
55
+ it('上标 ^x^ 与下标 ~x~,且不动 ~~删除线~~ 与代码', () => {
56
+ const out = preprocessSuperSub('上标 x^2^、下标 H~2~O、删除 ~~x~~、代码 `a^b^c`');
57
+ expect(out).toContain('<sup>2</sup>');
58
+ expect(out).toContain('<sub>2</sub>');
59
+ expect(out).toContain('~~x~~');
60
+ expect(out).toContain('`a^b^c`');
61
+ });
62
+ it(':::type 标题 … ::: 渲染为带内联样式的警告框,内容仍走 Markdown', () => {
63
+ const html = markdownToHtml(':::warning 警告内容\n**别这样做**。\n:::');
64
+ expect(html).toContain('border-left:4px solid');
65
+ expect(html).toContain('警告内容');
66
+ expect(html).toContain('<strong>别这样做</strong>');
67
+ });
55
68
  it('代码围栏内的 `##` 行不被误判为标题', () => {
56
69
  const md = '```\n##not-a-heading\n```';
57
70
  const html = markdownToHtml(md);
@@ -1 +1 @@
1
- {"version":3,"file":"core.test.js","sourceRoot":"","sources":["../src/core.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.test.js","sourceRoot":"","sources":["../src/core.test.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,22 @@
5
5
  * 使其成为合法标题。跳过 ``` / ~~~ 代码围栏与缩进代码,避免误伤代码。
6
6
  */
7
7
  export declare function normalizeNoSpaceAtxHeadings(markdown: string): string;
8
+ /**
9
+ * 把 `^x^` 转成 <sup>x</sup>(上标)、`~x~` 转成 <sub>x</sub>(下标)。
10
+ * 跳过代码围栏与行内代码,避免破坏代码;`~~` 删除线用单臂负断言保护,不与下标冲突。
11
+ */
12
+ export declare function preprocessSuperSub(markdown: string): string;
13
+ /** 警告框类型 → 颜色(背景 / 左边框 / 标题色)。 */
14
+ export declare const CALLOUT_TYPES: Record<string, {
15
+ bg: string;
16
+ border: string;
17
+ title: string;
18
+ }>;
19
+ /**
20
+ * 把 `:::类型 标题\n内容\n:::` 转成带内联样式的彩色警告框(提醒/建议/重要/警告/注意)。
21
+ * 内容仍按 Markdown 递归渲染;内联样式会被保留下游(validator 仅裁危险结构)。
22
+ */
23
+ export declare function preprocessCallouts(markdown: string): string;
8
24
  /**
9
25
  * 把 Markdown 字符串转换为嵌套的 HTML 片段(不含根容器)。
10
26
  * @param markdown 文章 Markdown
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAoCA;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBpE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWvD"}
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAoCA;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBpE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAsB3D;AAED,kCAAkC;AAClC,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAMvF,CAAA;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAa3D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWvD"}
package/dist/markdown.js CHANGED
@@ -51,13 +51,65 @@ export function normalizeNoSpaceAtxHeadings(markdown) {
51
51
  })
52
52
  .join('\n');
53
53
  }
54
+ /**
55
+ * 把 `^x^` 转成 <sup>x</sup>(上标)、`~x~` 转成 <sub>x</sub>(下标)。
56
+ * 跳过代码围栏与行内代码,避免破坏代码;`~~` 删除线用单臂负断言保护,不与下标冲突。
57
+ */
58
+ export function preprocessSuperSub(markdown) {
59
+ const lines = markdown.split('\n');
60
+ let inFence = false;
61
+ return lines
62
+ .map((line) => {
63
+ if (/^\s{0,3}(```|~~~)/.test(line)) {
64
+ inFence = !inFence;
65
+ return line;
66
+ }
67
+ if (inFence)
68
+ return line;
69
+ // 保护行内代码 `...`,避免把代码里的 ^ / ~ 误判
70
+ const codes = [];
71
+ const guarded = line.replace(/`[^`]+`/g, (m) => {
72
+ codes.push(m);
73
+ return '\u0000' + (codes.length - 1) + '\u0000';
74
+ });
75
+ const conv = guarded
76
+ .replace(/\^([^\^\u0000]+)\^/g, (_m, t) => `<sup>${t}</sup>`)
77
+ .replace(/(?<!~)~([^\n~\u0000]+)~(?!~)/g, (_m, t) => `<sub>${t}</sub>`);
78
+ return conv.replace(/\u0000(\d+)\u0000/g, (_m, i) => codes[+i] ?? '');
79
+ })
80
+ .join('\n');
81
+ }
82
+ /** 警告框类型 → 颜色(背景 / 左边框 / 标题色)。 */
83
+ export const CALLOUT_TYPES = {
84
+ info: { bg: '#eef6ff', border: '#409eff', title: '#337ecc' },
85
+ tip: { bg: '#f2fbef', border: '#67c23a', title: '#529b2e' },
86
+ important: { bg: '#fdf6ec', border: '#e6a23c', title: '#b88230' },
87
+ warning: { bg: '#fef0f0', border: '#f56c6c', title: '#c45656' },
88
+ note: { bg: '#f4f0fe', border: '#9b6df2', title: '#8250df' },
89
+ };
90
+ /**
91
+ * 把 `:::类型 标题\n内容\n:::` 转成带内联样式的彩色警告框(提醒/建议/重要/警告/注意)。
92
+ * 内容仍按 Markdown 递归渲染;内联样式会被保留下游(validator 仅裁危险结构)。
93
+ */
94
+ export function preprocessCallouts(markdown) {
95
+ const esc = (s) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
96
+ return markdown.replace(/:::\s*(info|tip|important|warning|note)\b[ \t]*([^\n]*)\n([\s\S]*?)\n:::/g, (_m, type, title, inner) => {
97
+ const s = CALLOUT_TYPES[type] || { bg: '#eef6ff', border: '#409eff', title: '#337ecc' };
98
+ const t = (title.trim() || type);
99
+ const innerHtml = markdownToHtml(inner.trim());
100
+ return (`<div style="background:${s.bg};border-left:4px solid ${s.border};padding:12px 16px;border-radius:8px;margin:14px 0">` +
101
+ `<div style="font-weight:600;font-size:14px;color:${s.title};margin-bottom:6px">${esc(t)}</div>` +
102
+ `<div style="font-size:13.5px;color:#333;line-height:1.7">${innerHtml}</div>` +
103
+ '</div>');
104
+ });
105
+ }
54
106
  /**
55
107
  * 把 Markdown 字符串转换为嵌套的 HTML 片段(不含根容器)。
56
108
  * @param markdown 文章 Markdown
57
109
  * @returns HTML 字符串,例如 `<h1>…</h1><p>…</p>`
58
110
  */
59
111
  export function markdownToHtml(markdown) {
60
- const normalized = normalizeNoSpaceAtxHeadings(markdown);
112
+ const normalized = preprocessCallouts(preprocessSuperSub(normalizeNoSpaceAtxHeadings(markdown)));
61
113
  const file = unified()
62
114
  .use(remarkParse)
63
115
  .use(remarkGfm)
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,WAAW,MAAM,cAAc,CAAA;AACtC,OAAO,SAAS,MAAM,YAAY,CAAA;AAClC,OAAO,YAAY,MAAM,eAAe,CAAA;AACxC,OAAO,SAAS,MAAM,YAAY,CAAA;AAClC,OAAO,eAAe,MAAM,kBAAkB,CAAA;AAS9C,2DAA2D;AAC3D,SAAS,eAAe,CAAC,IAAc;IACrC,IAAI,IAAI,CAAC,UAAU,IAAI,WAAW,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAA;IAClC,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ;YAAE,eAAe,CAAC,KAAK,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB;IAC9B,OAAO,CAAC,IAAc,EAAQ,EAAE;QAC9B,eAAe,CAAC,IAAI,CAAC,CAAA;IACvB,CAAC,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IAC1D,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACrC,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,4CAA4C;QAC5C,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,OAAO,GAAG,CAAC,OAAO,CAAA;YAClB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,IAAI,OAAO;YAAE,OAAO,IAAI,CAAA;QACxB,kCAAkC;QAClC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAA;QACtC,2DAA2D;QAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAA;IACnD,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,UAAU,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAA;IACxD,MAAM,IAAI,GAAG,OAAO,EAAE;SACnB,GAAG,CAAC,WAAW,CAAC;SAChB,GAAG,CAAC,SAAS,CAAC;SACd,GAAG,CAAC,YAAY,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;SAC/C,GAAG,CAAC,SAAS,CAAC;SACd,GAAG,CAAC,uBAAuB,CAAC;SAC5B,GAAG,CAAC,eAAe,CAAC;SACpB,WAAW,CAAC,UAAU,CAAC,CAAA;IAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAA;AACrB,CAAC"}
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stylewx/core",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "stylewx headless render core: Markdown → WeChat-compatible inlined-style HTML. Pure function, no DOM / no Node-only APIs.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -23,7 +23,7 @@
23
23
  "remark-parse": "^11.0.0",
24
24
  "remark-rehype": "^11.1.1",
25
25
  "unified": "^11.0.5",
26
- "@stylewx/theme": "0.1.1"
26
+ "@stylewx/theme": "0.1.2"
27
27
  },
28
28
  "publishConfig": {
29
29
  "access": "public"