wechat-pub-skills 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/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "wechat-pub-skills",
3
+ "version": "0.1.0",
4
+ "description": "Agent-friendly CLI skills for rendering, uploading, publishing, and updating WeChat public account articles.",
5
+ "license": "MIT",
6
+ "bin": {
7
+ "wechat-pub-skills": "dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist/**",
11
+ "browser/**",
12
+ "themes/**",
13
+ "README.md",
14
+ "SKILL.md"
15
+ ],
16
+ "scripts": {
17
+ "build": "webpack",
18
+ "cli": "node dist/cli.js",
19
+ "check": "node dist/cli.js render examples/example.md --out /tmp/wechat-pub-skills-check.html --json",
20
+ "pack:dry": "npm pack --dry-run"
21
+ },
22
+ "keywords": [
23
+ "wechat",
24
+ "wechat-public-account",
25
+ "agent",
26
+ "markdown",
27
+ "npx",
28
+ "skills"
29
+ ],
30
+ "dependencies": {
31
+ "front-matter": "^4.0.2",
32
+ "highlight.js": "^11.9.0",
33
+ "isomorphic-dompurify": "^2.36.0",
34
+ "jimp": "^1.6.1",
35
+ "juice": "^10.0.0",
36
+ "marked": "^12.0.0"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^20.11.0",
40
+ "terser-webpack-plugin": "^5.3.10",
41
+ "ts-loader": "^9.5.0",
42
+ "typescript": "^5.3.0",
43
+ "webpack": "^5.90.0",
44
+ "webpack-cli": "^5.1.0"
45
+ }
46
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * MD 基础主题样式
3
+ * 包含所有元素的基础样式和 CSS 变量定义
4
+ */
5
+
6
+ /* ==================== 容器样式 ==================== */
7
+ section,
8
+ container {
9
+ font-family: var(--md-font-family);
10
+ font-size: var(--md-font-size);
11
+ line-height: 1.75;
12
+ text-align: left;
13
+ }
14
+
15
+ /* 确保 #output 容器应用基础样式 */
16
+ #output {
17
+ font-family: var(--md-font-family);
18
+ font-size: var(--md-font-size);
19
+ line-height: 1.75;
20
+ text-align: left;
21
+ }
22
+
23
+ /* 去除第一个元素的 margin-top */
24
+ #output section > :first-child {
25
+ margin-top: 0 !important;
26
+ }
27
+
28
+ .mermaid-diagram .nodeLabel p {
29
+ color: unset !important;
30
+ letter-spacing: unset !important;
31
+ }
@@ -0,0 +1,434 @@
1
+ /**
2
+ * MD 默认主题(经典主题)
3
+ * 按 Alt/Option + Shift + F 可格式化
4
+ * 如需使用主题色,请使用 var(--md-primary-color) 代替颜色值
5
+ */
6
+
7
+ /* ==================== 一级标题 ==================== */
8
+ h1 {
9
+ display: table;
10
+ padding: 0 1em;
11
+ border-bottom: 2px solid var(--md-primary-color);
12
+ margin: 2em auto 1em;
13
+ color: hsl(var(--foreground));
14
+ font-size: calc(var(--md-font-size) * 1.2);
15
+ font-weight: bold;
16
+ text-align: center;
17
+ }
18
+
19
+ /* ==================== 二级标题 ==================== */
20
+ h2 {
21
+ display: table;
22
+ padding: 0 0.2em;
23
+ margin: 4em auto 2em;
24
+ color: #fff;
25
+ background: var(--md-primary-color);
26
+ font-size: calc(var(--md-font-size) * 1.2);
27
+ font-weight: bold;
28
+ text-align: center;
29
+ }
30
+
31
+ /* ==================== 三级标题 ==================== */
32
+ h3 {
33
+ padding-left: 8px;
34
+ border-left: 3px solid var(--md-primary-color);
35
+ margin: 2em 8px 0.75em 0;
36
+ color: hsl(var(--foreground));
37
+ font-size: calc(var(--md-font-size) * 1.1);
38
+ font-weight: bold;
39
+ line-height: 1.2;
40
+ }
41
+
42
+ /* ==================== 四级标题 ==================== */
43
+ h4 {
44
+ margin: 2em 8px 0.5em;
45
+ color: var(--md-primary-color);
46
+ font-size: calc(var(--md-font-size) * 1);
47
+ font-weight: bold;
48
+ }
49
+
50
+ /* ==================== 五级标题 ==================== */
51
+ h5 {
52
+ margin: 1.5em 8px 0.5em;
53
+ color: var(--md-primary-color);
54
+ font-size: calc(var(--md-font-size) * 1);
55
+ font-weight: bold;
56
+ }
57
+
58
+ /* ==================== 六级标题 ==================== */
59
+ h6 {
60
+ margin: 1.5em 8px 0.5em;
61
+ font-size: calc(var(--md-font-size) * 1);
62
+ color: var(--md-primary-color);
63
+ }
64
+
65
+ /* ==================== 段落 ==================== */
66
+ p {
67
+ margin: 1.5em 8px;
68
+ letter-spacing: 0.1em;
69
+ color: hsl(var(--foreground));
70
+ }
71
+
72
+ /* ==================== 引用块 ==================== */
73
+ blockquote {
74
+ font-style: normal;
75
+ padding: 1em;
76
+ border-left: 4px solid var(--md-primary-color);
77
+ border-radius: 6px;
78
+ color: hsl(var(--foreground));
79
+ background: var(--blockquote-background);
80
+ margin-bottom: 1em;
81
+ }
82
+
83
+ blockquote > p {
84
+ display: block;
85
+ font-size: 1em;
86
+ letter-spacing: 0.1em;
87
+ color: hsl(var(--foreground));
88
+ margin: 0;
89
+ }
90
+
91
+ /* ==================== GFM 警告块 ==================== */
92
+ .alert-title-note,
93
+ .alert-title-tip,
94
+ .alert-title-info,
95
+ .alert-title-important,
96
+ .alert-title-warning,
97
+ .alert-title-caution,
98
+ .alert-title-abstract,
99
+ .alert-title-summary,
100
+ .alert-title-tldr,
101
+ .alert-title-todo,
102
+ .alert-title-success,
103
+ .alert-title-done,
104
+ .alert-title-question,
105
+ .alert-title-help,
106
+ .alert-title-faq,
107
+ .alert-title-failure,
108
+ .alert-title-fail,
109
+ .alert-title-missing,
110
+ .alert-title-danger,
111
+ .alert-title-error,
112
+ .alert-title-bug,
113
+ .alert-title-example,
114
+ .alert-title-quote,
115
+ .alert-title-cite {
116
+ display: flex;
117
+ align-items: center;
118
+ gap: 0.5em;
119
+ margin-bottom: 0.5em;
120
+ }
121
+
122
+ .alert-title-note {
123
+ color: #478be6;
124
+ }
125
+
126
+ .alert-title-tip {
127
+ color: #57ab5a;
128
+ }
129
+
130
+ .alert-title-info {
131
+ color: #93c5fd;
132
+ }
133
+
134
+ .alert-title-important {
135
+ color: #986ee2;
136
+ }
137
+
138
+ .alert-title-warning {
139
+ color: #c69026;
140
+ }
141
+
142
+ .alert-title-caution {
143
+ color: #e5534b;
144
+ }
145
+
146
+ /* Obsidian-style callout colors */
147
+ .alert-title-abstract,
148
+ .alert-title-summary,
149
+ .alert-title-tldr {
150
+ color: #00bfff;
151
+ }
152
+
153
+ .alert-title-todo {
154
+ color: #478be6;
155
+ }
156
+
157
+ .alert-title-success,
158
+ .alert-title-done {
159
+ color: #57ab5a;
160
+ }
161
+
162
+ .alert-title-question,
163
+ .alert-title-help,
164
+ .alert-title-faq {
165
+ color: #c69026;
166
+ }
167
+
168
+ .alert-title-failure,
169
+ .alert-title-fail,
170
+ .alert-title-missing {
171
+ color: #e5534b;
172
+ }
173
+
174
+ .alert-title-danger,
175
+ .alert-title-error {
176
+ color: #e5534b;
177
+ }
178
+
179
+ .alert-title-bug {
180
+ color: #e5534b;
181
+ }
182
+
183
+ .alert-title-example {
184
+ color: #986ee2;
185
+ }
186
+
187
+ .alert-title-quote,
188
+ .alert-title-cite {
189
+ color: #9ca3af;
190
+ }
191
+
192
+ /* GFM Alert SVG 图标颜色 */
193
+ .alert-icon-note {
194
+ fill: #478be6;
195
+ }
196
+
197
+ .alert-icon-tip {
198
+ fill: #57ab5a;
199
+ }
200
+
201
+ .alert-icon-info {
202
+ fill: #93c5fd;
203
+ }
204
+
205
+ .alert-icon-important {
206
+ fill: #986ee2;
207
+ }
208
+
209
+ .alert-icon-warning {
210
+ fill: #c69026;
211
+ }
212
+
213
+ .alert-icon-caution {
214
+ fill: #e5534b;
215
+ }
216
+
217
+ /* Obsidian-style callout icon colors */
218
+ .alert-icon-abstract,
219
+ .alert-icon-summary,
220
+ .alert-icon-tldr {
221
+ fill: #00bfff;
222
+ }
223
+
224
+ .alert-icon-todo {
225
+ fill: #478be6;
226
+ }
227
+
228
+ .alert-icon-success,
229
+ .alert-icon-done {
230
+ fill: #57ab5a;
231
+ }
232
+
233
+ .alert-icon-question,
234
+ .alert-icon-help,
235
+ .alert-icon-faq {
236
+ fill: #c69026;
237
+ }
238
+
239
+ .alert-icon-failure,
240
+ .alert-icon-fail,
241
+ .alert-icon-missing {
242
+ fill: #e5534b;
243
+ }
244
+
245
+ .alert-icon-danger,
246
+ .alert-icon-error {
247
+ fill: #e5534b;
248
+ }
249
+
250
+ .alert-icon-bug {
251
+ fill: #e5534b;
252
+ }
253
+
254
+ .alert-icon-example {
255
+ fill: #986ee2;
256
+ }
257
+
258
+ .alert-icon-quote,
259
+ .alert-icon-cite {
260
+ fill: #9ca3af;
261
+ }
262
+
263
+ /* ==================== 代码块 ==================== */
264
+ pre.code__pre,
265
+ .hljs.code__pre {
266
+ font-size: 90%;
267
+ overflow-x: auto;
268
+ border-radius: 8px;
269
+ padding: 0 !important;
270
+ line-height: 1.5;
271
+ margin: 10px 8px;
272
+ }
273
+
274
+ /* ==================== 图片 ==================== */
275
+ img {
276
+ display: block;
277
+ max-width: 100%;
278
+ margin: 0.1em auto 0.5em;
279
+ border-radius: 4px;
280
+ }
281
+
282
+ /* ==================== 列表 ==================== */
283
+ ol {
284
+ list-style: none;
285
+ padding-left: 1em;
286
+ margin-left: 0;
287
+ color: hsl(var(--foreground));
288
+ }
289
+
290
+ ul {
291
+ list-style: none;
292
+ padding-left: 1em;
293
+ margin-left: 0;
294
+ color: hsl(var(--foreground));
295
+ }
296
+
297
+ li {
298
+ display: block;
299
+ margin: 0.2em 8px;
300
+ color: hsl(var(--foreground));
301
+ }
302
+
303
+ /* ==================== 脚注 ==================== */
304
+ /* footnotes 在 buildFootnotes() 中渲染为 <p> 标签 */
305
+ p.footnotes {
306
+ margin: 0.5em 8px;
307
+ font-size: 80%;
308
+ color: hsl(var(--foreground));
309
+ }
310
+
311
+ /* ==================== 图表 ==================== */
312
+ figure {
313
+ margin: 1.5em 8px;
314
+ color: hsl(var(--foreground));
315
+ }
316
+
317
+ figcaption,
318
+ .md-figcaption {
319
+ text-align: center;
320
+ color: #888;
321
+ font-size: 0.8em;
322
+ }
323
+
324
+ /* ==================== 分隔线 ==================== */
325
+ hr {
326
+ border-style: solid;
327
+ border-width: 2px 0 0;
328
+ border-color: rgba(0, 0, 0, 0.1);
329
+ -webkit-transform-origin: 0 0;
330
+ -webkit-transform: scale(1, 0.5);
331
+ transform-origin: 0 0;
332
+ transform: scale(1, 0.5);
333
+ height: 0.4em;
334
+ margin: 1.5em 0;
335
+ }
336
+
337
+ /* ==================== 行内代码 ==================== */
338
+ code {
339
+ font-size: 90%;
340
+ color: #d14;
341
+ background: rgba(27, 31, 35, 0.05);
342
+ padding: 3px 5px;
343
+ border-radius: 4px;
344
+ }
345
+
346
+ /* 代码块内的 code 标签需要特殊处理(覆盖行内 code 样式) */
347
+ pre.code__pre > code,
348
+ .hljs.code__pre > code {
349
+ display: -webkit-box;
350
+ padding: 0.5em 1em 1em;
351
+ overflow-x: auto;
352
+ text-indent: 0;
353
+ color: inherit;
354
+ background: none;
355
+ white-space: nowrap;
356
+ margin: 0;
357
+ }
358
+
359
+ /* ==================== 强调 ==================== */
360
+ em {
361
+ font-style: italic;
362
+ font-size: inherit;
363
+ }
364
+
365
+ /* ==================== 链接 ==================== */
366
+ a {
367
+ color: #576b95;
368
+ text-decoration: none;
369
+ }
370
+
371
+ /* ==================== 粗体 ==================== */
372
+ strong {
373
+ color: var(--md-primary-color);
374
+ font-weight: bold;
375
+ font-size: inherit;
376
+ }
377
+
378
+ /* ==================== 表格 ==================== */
379
+ table {
380
+ color: hsl(var(--foreground));
381
+ }
382
+
383
+ thead {
384
+ font-weight: bold;
385
+ color: hsl(var(--foreground));
386
+ }
387
+
388
+ th {
389
+ border: 1px solid #dfdfdf;
390
+ padding: 0.25em 0.5em;
391
+ color: hsl(var(--foreground));
392
+ word-break: keep-all;
393
+ background: rgba(0, 0, 0, 0.05);
394
+ }
395
+
396
+ td {
397
+ border: 1px solid #dfdfdf;
398
+ padding: 0.25em 0.5em;
399
+ color: hsl(var(--foreground));
400
+ word-break: keep-all;
401
+ }
402
+
403
+ /* ==================== KaTeX 公式 ==================== */
404
+ .katex-inline {
405
+ max-width: 100%;
406
+ overflow-x: auto;
407
+ }
408
+
409
+ .katex-block {
410
+ max-width: 100%;
411
+ overflow-x: auto;
412
+ -webkit-overflow-scrolling: touch;
413
+ padding: 0.5em 0;
414
+ text-align: center;
415
+ }
416
+
417
+ /* ==================== 标记高亮 ==================== */
418
+ .markup-highlight {
419
+ background-color: var(--md-primary-color);
420
+ padding: 2px 4px;
421
+ border-radius: 2px;
422
+ color: #fff;
423
+ }
424
+
425
+ .markup-underline {
426
+ text-decoration: underline;
427
+ text-decoration-color: var(--md-primary-color);
428
+ }
429
+
430
+ .markup-wavyline {
431
+ text-decoration: underline wavy;
432
+ text-decoration-color: var(--md-primary-color);
433
+ text-decoration-thickness: 2px;
434
+ }
@@ -0,0 +1,130 @@
1
+ /**
2
+ * MD 优雅主题 (@brzhang)
3
+ * 在默认主题基础上添加优雅的视觉效果
4
+ */
5
+
6
+ /* ==================== 标题样式 ==================== */
7
+ h1 {
8
+ padding: 0.5em 1em;
9
+ border-bottom: 2px solid var(--md-primary-color);
10
+ font-size: calc(var(--md-font-size) * 1.4);
11
+ text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);
12
+ }
13
+
14
+ h2 {
15
+ padding: 0.3em 1em;
16
+ border-radius: 8px;
17
+ font-size: calc(var(--md-font-size) * 1.3);
18
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
19
+ }
20
+
21
+ h3 {
22
+ padding-left: 12px;
23
+ font-size: calc(var(--md-font-size) * 1.2);
24
+ border-left: 4px solid var(--md-primary-color);
25
+ border-bottom: 1px dashed var(--md-primary-color);
26
+ }
27
+
28
+ h4 {
29
+ font-size: calc(var(--md-font-size) * 1.1);
30
+ }
31
+
32
+ h5 {
33
+ font-size: var(--md-font-size);
34
+ }
35
+
36
+ h6 {
37
+ font-size: var(--md-font-size);
38
+ }
39
+
40
+ /* ==================== 引用块 ==================== */
41
+ blockquote {
42
+ font-style: italic;
43
+ padding: 1em 1em 1em 2em;
44
+ border-left: 4px solid var(--md-primary-color);
45
+ border-radius: 6px;
46
+ color: rgba(0, 0, 0, 0.6);
47
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
48
+ margin-bottom: 1em;
49
+ }
50
+
51
+ .markdown-alert {
52
+ font-style: italic;
53
+ }
54
+
55
+ /* ==================== 代码块 ==================== */
56
+ pre.code__pre,
57
+ .hljs.code__pre {
58
+ box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.05);
59
+ }
60
+
61
+ pre.code__pre > code,
62
+ .hljs.code__pre > code {
63
+ font-family: 'Fira Code', Menlo, Operator Mono, Consolas, Monaco, monospace;
64
+ }
65
+
66
+ /* ==================== 图片 ==================== */
67
+ img {
68
+ border-radius: 8px;
69
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
70
+ }
71
+
72
+ figcaption,
73
+ .md-figcaption {
74
+ text-align: center;
75
+ color: #888;
76
+ font-size: 0.8em;
77
+ }
78
+
79
+ /* ==================== 列表 ==================== */
80
+ ol {
81
+ padding-left: 1.5em;
82
+ }
83
+
84
+ ul {
85
+ list-style: none;
86
+ padding-left: 1.5em;
87
+ }
88
+
89
+ li {
90
+ margin: 0.5em 8px;
91
+ }
92
+
93
+ /* ==================== 分隔线 ==================== */
94
+ hr {
95
+ height: 1px;
96
+ border: none;
97
+ margin: 2em 0;
98
+ background: linear-gradient(to right, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0));
99
+ }
100
+
101
+ /* ==================== 表格 ==================== */
102
+ table {
103
+ border-collapse: separate;
104
+ border-spacing: 0;
105
+ border-radius: 8px;
106
+ margin: 1em 8px;
107
+ color: hsl(var(--foreground));
108
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
109
+ overflow: hidden;
110
+ }
111
+
112
+ thead {
113
+ color: #fff;
114
+ }
115
+
116
+ td {
117
+ padding: 0.5em 1em;
118
+ }
119
+
120
+ /* ==================== 强调 ==================== */
121
+ em {
122
+ font-style: italic;
123
+ font-size: inherit;
124
+ }
125
+
126
+ /* ==================== 链接 ==================== */
127
+ a {
128
+ color: #576b95;
129
+ text-decoration: none;
130
+ }