@page.su/ai-blog-cli 0.1.0-beta.4 → 0.1.0-beta.5
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/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +44 -11
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/syntax.d.ts +4 -0
- package/dist/commands/syntax.d.ts.map +1 -0
- package/dist/commands/syntax.js +29 -0
- package/dist/commands/syntax.js.map +1 -0
- package/package.json +4 -3
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -100
- package/dist/index.js.map +0 -1
- package/dist/prompts/index.d.ts +0 -9
- package/dist/prompts/index.d.ts.map +0 -1
- package/dist/prompts/index.js +0 -178
- package/dist/prompts/index.js.map +0 -1
- package/dist/resources/syntax-spec.d.ts +0 -23
- package/dist/resources/syntax-spec.d.ts.map +0 -1
- package/dist/resources/syntax-spec.js +0 -105
- package/dist/resources/syntax-spec.js.map +0 -1
- package/dist/resources/syntax-spec.test.d.ts +0 -2
- package/dist/resources/syntax-spec.test.d.ts.map +0 -1
- package/dist/resources/syntax-spec.test.js +0 -47
- package/dist/resources/syntax-spec.test.js.map +0 -1
- package/dist/tools/build.d.ts +0 -13
- package/dist/tools/build.d.ts.map +0 -1
- package/dist/tools/build.js +0 -181
- package/dist/tools/build.js.map +0 -1
- package/dist/tools/code-repos.d.ts +0 -5
- package/dist/tools/code-repos.d.ts.map +0 -1
- package/dist/tools/code-repos.js +0 -149
- package/dist/tools/code-repos.js.map +0 -1
- package/dist/tools/comments.d.ts +0 -12
- package/dist/tools/comments.d.ts.map +0 -1
- package/dist/tools/comments.js +0 -87
- package/dist/tools/comments.js.map +0 -1
- package/dist/tools/demos.d.ts +0 -5
- package/dist/tools/demos.d.ts.map +0 -1
- package/dist/tools/demos.js +0 -98
- package/dist/tools/demos.js.map +0 -1
- package/dist/tools/glossary.d.ts +0 -4
- package/dist/tools/glossary.d.ts.map +0 -1
- package/dist/tools/glossary.js +0 -139
- package/dist/tools/glossary.js.map +0 -1
- package/dist/tools/helpers.d.ts +0 -44
- package/dist/tools/helpers.d.ts.map +0 -1
- package/dist/tools/helpers.js +0 -65
- package/dist/tools/helpers.js.map +0 -1
- package/dist/tools/knowledge.d.ts +0 -4
- package/dist/tools/knowledge.d.ts.map +0 -1
- package/dist/tools/knowledge.js +0 -140
- package/dist/tools/knowledge.js.map +0 -1
- package/dist/tools/math-concepts.d.ts +0 -4
- package/dist/tools/math-concepts.d.ts.map +0 -1
- package/dist/tools/math-concepts.js +0 -158
- package/dist/tools/math-concepts.js.map +0 -1
- package/dist/tools/posts.d.ts +0 -35
- package/dist/tools/posts.d.ts.map +0 -1
- package/dist/tools/posts.js +0 -278
- package/dist/tools/posts.js.map +0 -1
- package/dist/tools/scout.d.ts +0 -10
- package/dist/tools/scout.d.ts.map +0 -1
- package/dist/tools/scout.js +0 -111
- package/dist/tools/scout.js.map +0 -1
- package/dist/tools/series.d.ts +0 -12
- package/dist/tools/series.d.ts.map +0 -1
- package/dist/tools/series.js +0 -120
- package/dist/tools/series.js.map +0 -1
- package/dist/tools/syntax-capabilities.d.ts +0 -15
- package/dist/tools/syntax-capabilities.d.ts.map +0 -1
- package/dist/tools/syntax-capabilities.js +0 -859
- package/dist/tools/syntax-capabilities.js.map +0 -1
- package/dist/tools/taxonomy.d.ts +0 -4
- package/dist/tools/taxonomy.d.ts.map +0 -1
- package/dist/tools/taxonomy.js +0 -73
- package/dist/tools/taxonomy.js.map +0 -1
- package/dist/tools/uploads.d.ts +0 -15
- package/dist/tools/uploads.d.ts.map +0 -1
- package/dist/tools/uploads.js +0 -56
- package/dist/tools/uploads.js.map +0 -1
- package/dist/tools/workflows.d.ts +0 -9
- package/dist/tools/workflows.d.ts.map +0 -1
- package/dist/tools/workflows.js +0 -249
- package/dist/tools/workflows.js.map +0 -1
|
@@ -1,859 +0,0 @@
|
|
|
1
|
-
import { toolReplyHelpers } from "./posts.js";
|
|
2
|
-
/**
|
|
3
|
-
* 语法能力描述工具:post.describe_syntax_capabilities
|
|
4
|
-
*
|
|
5
|
-
* 设计目的:
|
|
6
|
-
* - 让 Agent 在一次调用中获取 ai-blog 全部 12 类高级 Markdown 语法的精确描述
|
|
7
|
-
* - 包含每种语法的:功能说明、精确格式、参数约束、完整示例
|
|
8
|
-
* - Agent 读完此输出即可正确生成任意高级 Markdown 内容,无需再逐个读取 resource
|
|
9
|
-
*
|
|
10
|
-
* 与 syntax-spec resource 的关系:
|
|
11
|
-
* - resource 是按章节拆分的详细规范文档(需逐个读取,适合深入查阅)
|
|
12
|
-
* - 本 tool 是一份"一次获取全景"的结构化速查表(适合 Agent 快速上手)
|
|
13
|
-
*/
|
|
14
|
-
export function registerSyntaxCapabilitiesTools(server) {
|
|
15
|
-
server.registerTool("post.describe_syntax_capabilities", {
|
|
16
|
-
title: "Describe all advanced Markdown syntax capabilities",
|
|
17
|
-
description: "返回 ai-blog 支持的全部 14 类高级 Markdown 语法的完整结构化描述。" +
|
|
18
|
-
"包含每种语法的功能定义、精确格式模板、参数约束、完整示例。" +
|
|
19
|
-
"Agent 应在首次写文章前调用一次,即可掌握所有非标准语法的正确写法。",
|
|
20
|
-
inputSchema: {},
|
|
21
|
-
}, async () => {
|
|
22
|
-
const capabilities = buildSyntaxCapabilitiesDocument();
|
|
23
|
-
return toolReplyHelpers.toToolText(capabilities);
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* 构建完整的语法能力描述文档。
|
|
28
|
-
*
|
|
29
|
-
* 每条能力包含:
|
|
30
|
-
* - id: 唯一标识符
|
|
31
|
-
* - name: 人类可读名称
|
|
32
|
-
* - summary: 一句话功能描述
|
|
33
|
-
* - syntax: 精确的语法模板(可直接套用)
|
|
34
|
-
* - parameters: 参数/属性的详细说明(含类型、约束、默认值)
|
|
35
|
-
* - example: 完整可用的示例代码
|
|
36
|
-
* - notes: 使用注意事项和边界条件
|
|
37
|
-
*/
|
|
38
|
-
function buildSyntaxCapabilitiesDocument() {
|
|
39
|
-
return {
|
|
40
|
-
version: "1.0.0",
|
|
41
|
-
totalCapabilities: 14,
|
|
42
|
-
capabilities: [
|
|
43
|
-
buildFrontmatterCapability(),
|
|
44
|
-
buildCalloutCapability(),
|
|
45
|
-
buildMermaidCapability(),
|
|
46
|
-
buildLiveDemoCapability(),
|
|
47
|
-
buildMathCapability(),
|
|
48
|
-
buildImageAttributesCapability(),
|
|
49
|
-
buildImageGalleryCapability(),
|
|
50
|
-
buildImageWhitelistCapability(),
|
|
51
|
-
buildUrlWhitelistCapability(),
|
|
52
|
-
buildReferenceCapability(),
|
|
53
|
-
buildFootnoteCapability(),
|
|
54
|
-
buildSitePostReferenceCapability(),
|
|
55
|
-
buildCodeGroupCapability(),
|
|
56
|
-
buildDetailsCapability(),
|
|
57
|
-
buildTimelineCapability(),
|
|
58
|
-
],
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
// ─── 各能力构造函数 ──────────────────────────────────────────────────────────
|
|
62
|
-
function buildFrontmatterCapability() {
|
|
63
|
-
return {
|
|
64
|
-
id: "frontmatter",
|
|
65
|
-
name: "Frontmatter(YAML 元数据)",
|
|
66
|
-
summary: "文章顶部的 YAML 块,定义标题、状态、标签等元信息。必须位于文件最开头。",
|
|
67
|
-
syntax: [
|
|
68
|
-
"---",
|
|
69
|
-
"title: \"文章标题\"",
|
|
70
|
-
"slug: my-post-slug",
|
|
71
|
-
"excerpt: \"文章摘要,最长400字符\"",
|
|
72
|
-
"status: draft",
|
|
73
|
-
"publishedAt: 2026-01-15T10:00:00.000Z",
|
|
74
|
-
"coverImage: /api/assets/oss/path/to/image.webp",
|
|
75
|
-
"tags:",
|
|
76
|
-
" - tag-slug-1",
|
|
77
|
-
" - tag-slug-2",
|
|
78
|
-
"seoTitle: \"SEO标题,最长255字符\"",
|
|
79
|
-
"seoDescription: \"SEO描述,最长320字符\"",
|
|
80
|
-
"canonicalUrl: https://example.com/original",
|
|
81
|
-
"---",
|
|
82
|
-
].join("\n"),
|
|
83
|
-
parameters: [
|
|
84
|
-
{ name: "title", type: "string", required: true, description: "文章标题,1-255字符" },
|
|
85
|
-
{ name: "slug", type: "string", required: false, description: "URL路径标识符;为空时后端根据标题自动生成" },
|
|
86
|
-
{ name: "excerpt", type: "string", required: false, description: "文章摘要,最长400字符" },
|
|
87
|
-
{ name: "status", type: "enum", required: true, description: "文章状态", allowedValues: ["draft", "published"] },
|
|
88
|
-
{ name: "publishedAt", type: "ISO 8601 string", required: false, description: "发布时间;status=published且未传时后端置为当前时间" },
|
|
89
|
-
{ name: "coverImage", type: "string", required: false, description: "封面图URL。必须是站内 /api/assets/oss/... 路径或合规https外链" },
|
|
90
|
-
{ name: "tags", type: "string[]", required: false, description: "标签slug数组" },
|
|
91
|
-
{ name: "seoTitle", type: "string", required: false, description: "SEO标题,最长255字符" },
|
|
92
|
-
{ name: "seoDescription", type: "string", required: false, description: "SEO描述,最长320字符" },
|
|
93
|
-
{ name: "canonicalUrl", type: "string", required: false, description: "规范链接URL" },
|
|
94
|
-
],
|
|
95
|
-
example: [
|
|
96
|
-
"---",
|
|
97
|
-
"title: \"React Server Components 深度解析\"",
|
|
98
|
-
"slug: react-server-components-deep-dive",
|
|
99
|
-
"excerpt: \"从原理到实践,全面理解RSC的运行机制\"",
|
|
100
|
-
"status: draft",
|
|
101
|
-
"coverImage: /api/assets/oss/covers/rsc.webp",
|
|
102
|
-
"tags:",
|
|
103
|
-
" - react",
|
|
104
|
-
" - frontend",
|
|
105
|
-
"seoTitle: \"React Server Components 深度解析 | My Blog\"",
|
|
106
|
-
"---",
|
|
107
|
-
].join("\n"),
|
|
108
|
-
notes: [
|
|
109
|
-
"frontmatter 必须是文件的第一个内容,前面不能有空行或其他字符",
|
|
110
|
-
"字段顺序:title → slug → excerpt → status → publishedAt → coverImage → tags → seoTitle → seoDescription → canonicalUrl",
|
|
111
|
-
"推荐使用 post.build_frontmatter 工具自动生成,确保格式正确",
|
|
112
|
-
],
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
function buildCalloutCapability() {
|
|
116
|
-
return {
|
|
117
|
-
id: "callout",
|
|
118
|
-
name: "Callout(提示框)",
|
|
119
|
-
summary: "基于 blockquote 的彩色提示卡片,支持5种语气类型。用于强调关键信息、警告或提示。",
|
|
120
|
-
syntax: [
|
|
121
|
-
"> [!TYPE] 标题或首行内容",
|
|
122
|
-
"> 后续内容行",
|
|
123
|
-
"> 支持多行",
|
|
124
|
-
].join("\n"),
|
|
125
|
-
parameters: [
|
|
126
|
-
{
|
|
127
|
-
name: "TYPE",
|
|
128
|
-
type: "enum",
|
|
129
|
-
required: true,
|
|
130
|
-
description: "提示框类型,决定颜色和语义",
|
|
131
|
-
allowedValues: ["NOTE", "TIP", "WARNING", "DANGER", "INFO"],
|
|
132
|
-
},
|
|
133
|
-
],
|
|
134
|
-
example: [
|
|
135
|
-
"> [!TIP] 性能优化建议",
|
|
136
|
-
"> 使用 `React.memo` 包裹纯展示组件可避免不必要的重渲染。",
|
|
137
|
-
"> 配合 `useMemo` 缓存计算结果效果更佳。",
|
|
138
|
-
"",
|
|
139
|
-
"> [!WARNING] 破坏性变更",
|
|
140
|
-
"> 从 v2.0 开始,`createStore` API 签名已变更,旧写法将抛出运行时错误。",
|
|
141
|
-
"",
|
|
142
|
-
"> [!DANGER] 安全风险",
|
|
143
|
-
"> 永远不要在客户端代码中硬编码 API 密钥。",
|
|
144
|
-
"",
|
|
145
|
-
"> [!NOTE] 补充说明",
|
|
146
|
-
"> 本功能需要 Node.js 18+ 环境。",
|
|
147
|
-
"",
|
|
148
|
-
"> [!INFO] 背景知识",
|
|
149
|
-
"> RSC 的核心思想是将渲染拆分为服务端和客户端两个阶段。",
|
|
150
|
-
].join("\n"),
|
|
151
|
-
notes: [
|
|
152
|
-
"TYPE 必须大写,紧跟 [! 和 ] 之间,不能有空格",
|
|
153
|
-
"[!TYPE] 后面的同一行文字会作为callout的首行/标题显示",
|
|
154
|
-
"每行必须以 > 开头(标准 blockquote 语法)",
|
|
155
|
-
"颜色映射:NOTE=天蓝、TIP=翡翠绿、WARNING=琥珀黄、DANGER=玫红、INFO=靛蓝",
|
|
156
|
-
"callout 内部不支持嵌套其他 callout",
|
|
157
|
-
],
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
function buildMermaidCapability() {
|
|
161
|
-
return {
|
|
162
|
-
id: "mermaid",
|
|
163
|
-
name: "Mermaid(图表)",
|
|
164
|
-
summary: "使用 Mermaid 语法渲染流程图、时序图、类图等可交互图表。支持拖拽平移。",
|
|
165
|
-
syntax: [
|
|
166
|
-
"```mermaid",
|
|
167
|
-
"<mermaid 图表代码>",
|
|
168
|
-
"```",
|
|
169
|
-
].join("\n"),
|
|
170
|
-
parameters: [],
|
|
171
|
-
example: [
|
|
172
|
-
"```mermaid",
|
|
173
|
-
"graph TD",
|
|
174
|
-
" A[用户请求] --> B{路由匹配}",
|
|
175
|
-
" B -->|匹配| C[Server Component]",
|
|
176
|
-
" B -->|未匹配| D[404页面]",
|
|
177
|
-
" C --> E[数据获取]",
|
|
178
|
-
" E --> F[HTML流式传输]",
|
|
179
|
-
" F --> G[客户端水合]",
|
|
180
|
-
"```",
|
|
181
|
-
"",
|
|
182
|
-
"```mermaid",
|
|
183
|
-
"sequenceDiagram",
|
|
184
|
-
" participant Browser",
|
|
185
|
-
" participant Server",
|
|
186
|
-
" Browser->>Server: HTTP Request",
|
|
187
|
-
" Server-->>Browser: RSC Payload",
|
|
188
|
-
" Browser->>Browser: Hydration",
|
|
189
|
-
"```",
|
|
190
|
-
].join("\n"),
|
|
191
|
-
notes: [
|
|
192
|
-
"语言标识必须是小写 mermaid",
|
|
193
|
-
"支持 Mermaid 的所有图表类型:graph/flowchart、sequenceDiagram、classDiagram、stateDiagram、gantt、pie 等",
|
|
194
|
-
"渲染后的图表支持鼠标拖拽平移浏览(容器有固定最大高度)",
|
|
195
|
-
"图表过于复杂时注意可读性,建议拆分为多个小图",
|
|
196
|
-
],
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
function buildLiveDemoCapability() {
|
|
200
|
-
return {
|
|
201
|
-
id: "live-demo",
|
|
202
|
-
name: "Live Demo(多文件交互式代码沙箱)⭐ 核心能力",
|
|
203
|
-
summary: "在文章中嵌入可运行的多文件代码沙箱。支持 HTML/CSS/JS/JSX/TSX,在隔离的 iframe 中实时执行。" +
|
|
204
|
-
"支持 Tailwind CSS、外部 CDN 注入、React 运行时转译。" +
|
|
205
|
-
"读者可全屏查看、切换源码Tab、查看Console输出、切换亮暗色主题。",
|
|
206
|
-
syntax: [
|
|
207
|
-
"```live-demo title=\"标题\" tailwind cdn=\"https://cdn.example.com/lib.js\"",
|
|
208
|
-
"/* @file index.html */",
|
|
209
|
-
"<HTML内容>",
|
|
210
|
-
"",
|
|
211
|
-
"/* @file style.css */",
|
|
212
|
-
"<CSS内容>",
|
|
213
|
-
"",
|
|
214
|
-
"/* @file app.jsx */",
|
|
215
|
-
"<JSX内容>",
|
|
216
|
-
"```",
|
|
217
|
-
].join("\n"),
|
|
218
|
-
parameters: [
|
|
219
|
-
{
|
|
220
|
-
name: "title",
|
|
221
|
-
type: "string",
|
|
222
|
-
required: false,
|
|
223
|
-
description: "代码块右上角显示的标题。格式:title=\"标题文字\"(必须双引号包裹)",
|
|
224
|
-
defaultValue: "空(显示默认标签)",
|
|
225
|
-
},
|
|
226
|
-
{
|
|
227
|
-
name: "tailwind",
|
|
228
|
-
type: "boolean flag",
|
|
229
|
-
required: false,
|
|
230
|
-
description: "是否在 iframe 内注入 Tailwind Play CDN。无需赋值,独立单词出现即为启用",
|
|
231
|
-
defaultValue: "false(不启用)",
|
|
232
|
-
},
|
|
233
|
-
{
|
|
234
|
-
name: "cdn",
|
|
235
|
-
type: "string (可重复)",
|
|
236
|
-
required: false,
|
|
237
|
-
description: "外部 CDN URL,必须 https:// 开头。可多次声明:cdn=\"url1\" cdn=\"url2\",按声明顺序注入",
|
|
238
|
-
defaultValue: "空数组",
|
|
239
|
-
},
|
|
240
|
-
{
|
|
241
|
-
name: "height",
|
|
242
|
-
type: "integer",
|
|
243
|
-
required: false,
|
|
244
|
-
description: "iframe 初始高度(像素值),范围 80-720。格式:height=\"数字\"(双引号包裹)。设置后 iframe 一开始就以该高度渲染,避免内容加载后从默认 80px 跳到实际高度导致页面抖动",
|
|
245
|
-
defaultValue: "80(MIN_FRAME_HEIGHT)",
|
|
246
|
-
},
|
|
247
|
-
],
|
|
248
|
-
example: [
|
|
249
|
-
"```live-demo title=\"React Counter\" tailwind cdn=\"https://unpkg.com/react@18/umd/react.production.min.js\" cdn=\"https://unpkg.com/react-dom@18/umd/react-dom.production.min.js\"",
|
|
250
|
-
"/* @file index.html */",
|
|
251
|
-
"<div id=\"root\"></div>",
|
|
252
|
-
"",
|
|
253
|
-
"/* @file app.tsx */",
|
|
254
|
-
"function Counter() {",
|
|
255
|
-
" const [count, setCount] = React.useState(0);",
|
|
256
|
-
" return (",
|
|
257
|
-
" <div className=\"flex flex-col items-center gap-4 p-8\">",
|
|
258
|
-
" <h1 className=\"text-2xl font-bold\">Count: {count}</h1>",
|
|
259
|
-
" <button",
|
|
260
|
-
" className=\"rounded-lg bg-blue-500 px-4 py-2 text-white hover:bg-blue-600\"",
|
|
261
|
-
" onClick={() => setCount(c => c + 1)}",
|
|
262
|
-
" >",
|
|
263
|
-
" Increment",
|
|
264
|
-
" </button>",
|
|
265
|
-
" </div>",
|
|
266
|
-
" );",
|
|
267
|
-
"}",
|
|
268
|
-
"",
|
|
269
|
-
"ReactDOM.createRoot(document.getElementById('root')!).render(<Counter />);",
|
|
270
|
-
"",
|
|
271
|
-
"/* @file style.css */",
|
|
272
|
-
"body {",
|
|
273
|
-
" margin: 0;",
|
|
274
|
-
" font-family: system-ui, sans-serif;",
|
|
275
|
-
"}",
|
|
276
|
-
"```",
|
|
277
|
-
].join("\n"),
|
|
278
|
-
notes: [
|
|
279
|
-
"【文件分隔符格式】必须是 /* @file 文件名.扩展名 */,独占一行,前后可有空行",
|
|
280
|
-
"【支持的文件类型】.html/.htm → HTML;.css → CSS;.js/.mjs → JavaScript;.jsx → React JSX;.tsx → React TSX;其他 → 只读文本",
|
|
281
|
-
"【运行机制】HTML/CSS/JS 直接合成到 iframe srcdoc 中运行;JSX/TSX 通过 Babel standalone 在 iframe 内实时转译后执行",
|
|
282
|
-
"【fence 标识】语言标识必须是小写 live-demo,反引号数量 >= 3 且开闭匹配",
|
|
283
|
-
"【tailwind flag】必须是独立单词(前后为空白或行尾),不能写成 tailwind=true",
|
|
284
|
-
"【cdn 顺序】多个 cdn 按声明顺序注入 <script>,有依赖关系时注意先后顺序",
|
|
285
|
-
"【React 项目】使用 JSX/TSX 时无需手动引入 Babel——运行时自动注入 @babel/standalone",
|
|
286
|
-
"【安全隔离】iframe 使用 srcdoc + sandbox 属性隔离,无同源访问权限",
|
|
287
|
-
"【推荐】使用 post.build_live_demo 工具自动生成代码块,确保格式正确",
|
|
288
|
-
"【首个文件】源码必须以 /* @file xxx */ 标记开始;无标记的内容会被视为无效",
|
|
289
|
-
],
|
|
290
|
-
};
|
|
291
|
-
}
|
|
292
|
-
function buildMathCapability() {
|
|
293
|
-
return {
|
|
294
|
-
id: "math",
|
|
295
|
-
name: "Math(KaTeX 数学公式)",
|
|
296
|
-
summary: "使用 LaTeX 语法渲染数学公式,支持行内公式和块级公式。基于 KaTeX 引擎。",
|
|
297
|
-
syntax: [
|
|
298
|
-
"行内公式:$LaTeX表达式$",
|
|
299
|
-
"块级公式:$$LaTeX表达式$$",
|
|
300
|
-
].join("\n"),
|
|
301
|
-
parameters: [],
|
|
302
|
-
example: [
|
|
303
|
-
"爱因斯坦质能方程 $E = mc^2$ 揭示了质量与能量的等价关系。",
|
|
304
|
-
"",
|
|
305
|
-
"贝叶斯定理的完整形式:",
|
|
306
|
-
"",
|
|
307
|
-
"$$",
|
|
308
|
-
"P(A|B) = \\frac{P(B|A) \\cdot P(A)}{P(B)}",
|
|
309
|
-
"$$",
|
|
310
|
-
"",
|
|
311
|
-
"矩阵运算示例:",
|
|
312
|
-
"",
|
|
313
|
-
"$$",
|
|
314
|
-
"\\begin{bmatrix}",
|
|
315
|
-
"a & b \\\\",
|
|
316
|
-
"c & d",
|
|
317
|
-
"\\end{bmatrix}",
|
|
318
|
-
"\\times",
|
|
319
|
-
"\\begin{bmatrix}",
|
|
320
|
-
"e \\\\ f",
|
|
321
|
-
"\\end{bmatrix}",
|
|
322
|
-
"=",
|
|
323
|
-
"\\begin{bmatrix}",
|
|
324
|
-
"ae + bf \\\\",
|
|
325
|
-
"ce + df",
|
|
326
|
-
"\\end{bmatrix}",
|
|
327
|
-
"$$",
|
|
328
|
-
].join("\n"),
|
|
329
|
-
notes: [
|
|
330
|
-
"行内公式:单个 $ 包裹,$ 与内容之间不能有空格",
|
|
331
|
-
"块级公式:$$ 独占一行,公式内容在中间行,结束 $$ 也独占一行",
|
|
332
|
-
"使用 KaTeX 引擎渲染,支持绝大部分 LaTeX 数学命令",
|
|
333
|
-
"块级公式悬停时有柔和高亮动画效果",
|
|
334
|
-
"不支持的命令会静默忽略(strict: ignore 模式)",
|
|
335
|
-
],
|
|
336
|
-
};
|
|
337
|
-
}
|
|
338
|
-
function buildImageAttributesCapability() {
|
|
339
|
-
return {
|
|
340
|
-
id: "image-attributes",
|
|
341
|
-
name: "Image Attributes(图片扩展属性)",
|
|
342
|
-
summary: "通过 Markdown 图片语法的 title 字段编码宽度、对齐、圆角、宽高比等扩展属性。" +
|
|
343
|
-
"无需引入 HTML,纯 Markdown 语法实现图片排版控制。",
|
|
344
|
-
syntax: "",
|
|
345
|
-
parameters: [
|
|
346
|
-
{
|
|
347
|
-
name: "w",
|
|
348
|
-
type: "integer",
|
|
349
|
-
required: false,
|
|
350
|
-
description: "图片宽度百分比,取值范围 1-100。预设步长:25/33/50/66/75/100",
|
|
351
|
-
defaultValue: "100(占满容器宽度)",
|
|
352
|
-
},
|
|
353
|
-
{
|
|
354
|
-
name: "align",
|
|
355
|
-
type: "enum",
|
|
356
|
-
required: false,
|
|
357
|
-
description: "图片水平对齐方式",
|
|
358
|
-
allowedValues: ["left", "center", "right"],
|
|
359
|
-
defaultValue: "center",
|
|
360
|
-
},
|
|
361
|
-
{
|
|
362
|
-
name: "ratio",
|
|
363
|
-
type: "string",
|
|
364
|
-
required: false,
|
|
365
|
-
description: "图片真实宽高比,格式为 宽:高(如 16:9、4:3、1:1)。用于骨架屏占位防止布局偏移",
|
|
366
|
-
},
|
|
367
|
-
{
|
|
368
|
-
name: "rounded / no-rounded",
|
|
369
|
-
type: "flag",
|
|
370
|
-
required: false,
|
|
371
|
-
description: "圆角控制。默认有圆角(rounded);写 no-rounded 则移除圆角",
|
|
372
|
-
defaultValue: "rounded(有圆角)",
|
|
373
|
-
},
|
|
374
|
-
],
|
|
375
|
-
example: [
|
|
376
|
-
"<!-- 50%宽度,居中,默认圆角 -->",
|
|
377
|
-
"",
|
|
378
|
-
"",
|
|
379
|
-
"<!-- 33%宽度,左对齐,无圆角 -->",
|
|
380
|
-
"",
|
|
381
|
-
"",
|
|
382
|
-
"<!-- 全宽,指定宽高比用于骨架屏 -->",
|
|
383
|
-
"",
|
|
384
|
-
"",
|
|
385
|
-
"<!-- 66%宽度,右对齐 -->",
|
|
386
|
-
"",
|
|
387
|
-
].join("\n"),
|
|
388
|
-
notes: [
|
|
389
|
-
"属性写在 title 字段中(图片URL后的双引号内),多个属性用空格分隔",
|
|
390
|
-
"只输出非默认值的属性:w=100、align=center、rounded 都无需显式写出",
|
|
391
|
-
"属性顺序不敏感,可以任意排列",
|
|
392
|
-
"推荐使用 post.build_image 工具自动生成,确保格式正确",
|
|
393
|
-
"编辑器中支持鼠标拖拽调整图片宽度(自动更新 w= 值)",
|
|
394
|
-
],
|
|
395
|
-
};
|
|
396
|
-
}
|
|
397
|
-
function buildImageGalleryCapability() {
|
|
398
|
-
return {
|
|
399
|
-
id: "image-gallery",
|
|
400
|
-
name: "Image Gallery(图片宫格)",
|
|
401
|
-
summary: "连续排列的多张图片自动检测为宫格布局,以网格形式展示。无需额外语法标记。",
|
|
402
|
-
syntax: [
|
|
403
|
-
"",
|
|
404
|
-
"",
|
|
405
|
-
"",
|
|
406
|
-
].join("\n"),
|
|
407
|
-
parameters: [],
|
|
408
|
-
example: [
|
|
409
|
-
"",
|
|
410
|
-
"",
|
|
411
|
-
"",
|
|
412
|
-
"",
|
|
413
|
-
].join("\n"),
|
|
414
|
-
notes: [
|
|
415
|
-
"连续的图片段落(中间无其他内容)会被自动检测为宫格",
|
|
416
|
-
"图片之间不能有空行或其他文本,否则会打断宫格检测",
|
|
417
|
-
"宫格内的图片会自动等高排列,点击可放大查看",
|
|
418
|
-
"单张图片不会触发宫格模式,至少需要2张连续图片",
|
|
419
|
-
],
|
|
420
|
-
};
|
|
421
|
-
}
|
|
422
|
-
function buildImageWhitelistCapability() {
|
|
423
|
-
return {
|
|
424
|
-
id: "image-whitelist",
|
|
425
|
-
name: "Image Whitelist(图片源白名单)",
|
|
426
|
-
summary: "前台严格模式下对图片 src 进行安全校验,只允许可信来源的图片加载。",
|
|
427
|
-
syntax: "(非语法特性——属于安全策略约束)",
|
|
428
|
-
parameters: [],
|
|
429
|
-
example: [
|
|
430
|
-
"<!-- ✅ 允许:站内 OSS 路径 -->",
|
|
431
|
-
"",
|
|
432
|
-
"",
|
|
433
|
-
"<!-- ✅ 允许:合规 https 外链 -->",
|
|
434
|
-
"",
|
|
435
|
-
"",
|
|
436
|
-
"<!-- ❌ 拒绝:http 协议 -->",
|
|
437
|
-
"",
|
|
438
|
-
"",
|
|
439
|
-
"<!-- ❌ 拒绝:data: URI -->",
|
|
440
|
-
"",
|
|
441
|
-
"",
|
|
442
|
-
"<!-- ❌ 拒绝:blob: 协议(仅 admin 模式允许) -->",
|
|
443
|
-
"",
|
|
444
|
-
].join("\n"),
|
|
445
|
-
notes: [
|
|
446
|
-
"前台 public 模式:只允许 /api/assets/oss/ 站内路径 + https:// 外链",
|
|
447
|
-
"后台 admin 模式:额外允许 blob: 协议(资源面板本地预览用)",
|
|
448
|
-
"不合规的图片 src 会被清空,浏览器显示 broken image 占位,保留 alt 文案",
|
|
449
|
-
"推荐所有图片先通过 upload_image_from_url 或 upload_image_from_base64 工具上传到站内 OSS",
|
|
450
|
-
],
|
|
451
|
-
};
|
|
452
|
-
}
|
|
453
|
-
function buildUrlWhitelistCapability() {
|
|
454
|
-
return {
|
|
455
|
-
id: "url-whitelist",
|
|
456
|
-
name: "URL Whitelist(链接协议白名单)",
|
|
457
|
-
summary: "对 Markdown 中所有超链接的协议进行安全校验,阻止危险协议。",
|
|
458
|
-
syntax: "(非语法特性——属于安全策略约束)",
|
|
459
|
-
parameters: [],
|
|
460
|
-
example: [
|
|
461
|
-
"<!-- ✅ 允许的协议 -->",
|
|
462
|
-
"[链接](https://example.com)",
|
|
463
|
-
"[邮件](mailto:test@example.com)",
|
|
464
|
-
"[相对路径](../posts/other-article)",
|
|
465
|
-
"[锚点](#section-id)",
|
|
466
|
-
"",
|
|
467
|
-
"<!-- ❌ 拒绝的协议 -->",
|
|
468
|
-
"[危险](javascript:alert(1))",
|
|
469
|
-
"[数据](data:text/html,...)",
|
|
470
|
-
].join("\n"),
|
|
471
|
-
notes: [
|
|
472
|
-
"前台允许的协议:https、http、ircs、mailto、xmpp",
|
|
473
|
-
"后台额外允许:blob(本地预览)",
|
|
474
|
-
"相对路径、锚点链接(无协议前缀)直接放行",
|
|
475
|
-
"不在白名单内的协议会被替换为空字符串,链接失效",
|
|
476
|
-
],
|
|
477
|
-
};
|
|
478
|
-
}
|
|
479
|
-
function buildReferenceCapability() {
|
|
480
|
-
return {
|
|
481
|
-
id: "reference",
|
|
482
|
-
name: "Reference(结构化参考文献 / 引用)⭐ 推荐用于引用论文·文档·仓库",
|
|
483
|
-
summary: "在文章中引用论文、博客、官方文档、开源仓库、视频、规范等外部资料。" +
|
|
484
|
-
"正文用 [ref:key] 行内标记渲染成可 hover 的上标角标(按出现顺序自动编号)," +
|
|
485
|
-
"用 ```ref 代码块定义引用的结构化元数据。" +
|
|
486
|
-
"鼠标悬停角标弹出引用卡片(标题/作者/出处/说明/原文链接),文章末尾自动生成结构化参考文献区。" +
|
|
487
|
-
"这是引用外部资料的首选语法,体验远优于 GFM 脚注。",
|
|
488
|
-
syntax: [
|
|
489
|
-
"正文行内标记(渲染成上标角标):",
|
|
490
|
-
"Transformer 由 Vaswani 等人提出 [ref:vaswani],BERT [ref:bert] 在此基础上扩展。",
|
|
491
|
-
"",
|
|
492
|
-
"引用定义块(每个引用一个 ```ref 块,块本身不渲染为可见内容):",
|
|
493
|
-
"```ref",
|
|
494
|
-
"key: vaswani",
|
|
495
|
-
"title: Attention Is All You Need",
|
|
496
|
-
"authors: Vaswani et al.",
|
|
497
|
-
"source: NeurIPS 2017",
|
|
498
|
-
"url: https://arxiv.org/abs/1706.03762",
|
|
499
|
-
"type: paper",
|
|
500
|
-
"note: 提出了 Transformer 架构。",
|
|
501
|
-
"```",
|
|
502
|
-
].join("\n"),
|
|
503
|
-
parameters: [
|
|
504
|
-
{
|
|
505
|
-
name: "key",
|
|
506
|
-
type: "string",
|
|
507
|
-
required: true,
|
|
508
|
-
description: "引用唯一标识,仅允许字母/数字/连字符/下划线(如 vaswani、bert-2019)。正文 [ref:key] 与 ```ref 块的 key 字段必须一致才能关联。",
|
|
509
|
-
},
|
|
510
|
-
{
|
|
511
|
-
name: "title",
|
|
512
|
-
type: "string",
|
|
513
|
-
required: true,
|
|
514
|
-
description: "引用资料的标题,会作为卡片与文末参考文献区的主标题。",
|
|
515
|
-
},
|
|
516
|
-
{
|
|
517
|
-
name: "authors",
|
|
518
|
-
type: "string",
|
|
519
|
-
required: false,
|
|
520
|
-
description: "作者 / 团队,如 'Vaswani et al.' 或 'Harvard NLP'。",
|
|
521
|
-
},
|
|
522
|
-
{
|
|
523
|
-
name: "source",
|
|
524
|
-
type: "string",
|
|
525
|
-
required: false,
|
|
526
|
-
description: "出处 / 发表 venue / 站点名,如 'NeurIPS 2017'、'pytorch.org'。",
|
|
527
|
-
},
|
|
528
|
-
{
|
|
529
|
-
name: "url",
|
|
530
|
-
type: "string",
|
|
531
|
-
required: false,
|
|
532
|
-
description: "原文链接。提供后卡片与文末区会显示「查看原文」并把标题变成可点击链接。",
|
|
533
|
-
},
|
|
534
|
-
{
|
|
535
|
-
name: "type",
|
|
536
|
-
type: "enum",
|
|
537
|
-
required: false,
|
|
538
|
-
description: "引用类型,决定卡片 / 文末区的图标与中文标签。",
|
|
539
|
-
allowedValues: ["paper", "blog", "doc", "repo", "video", "spec", "link"],
|
|
540
|
-
defaultValue: "link(通用链接)",
|
|
541
|
-
},
|
|
542
|
-
{
|
|
543
|
-
name: "note",
|
|
544
|
-
type: "string",
|
|
545
|
-
required: false,
|
|
546
|
-
description: "补充说明,会显示在卡片和文末区。支持单行;多行需在 ```ref 块内缩进续写。",
|
|
547
|
-
},
|
|
548
|
-
],
|
|
549
|
-
example: [
|
|
550
|
-
"## Transformer 架构",
|
|
551
|
-
"",
|
|
552
|
-
"Transformer 架构由 Vaswani 等人提出 [ref:vaswani],彻底改变了 NLP 领域。",
|
|
553
|
-
"工程实现可参考官方文档 [ref:pytorch-doc] 与开源实现 [ref:annotated]。",
|
|
554
|
-
"",
|
|
555
|
-
"```ref",
|
|
556
|
-
"key: vaswani",
|
|
557
|
-
"title: Attention Is All You Need",
|
|
558
|
-
"authors: Vaswani et al.",
|
|
559
|
-
"source: NeurIPS 2017",
|
|
560
|
-
"url: https://arxiv.org/abs/1706.03762",
|
|
561
|
-
"type: paper",
|
|
562
|
-
"note: 提出了 Transformer 架构,奠定了现代大模型的基础。",
|
|
563
|
-
"```",
|
|
564
|
-
"",
|
|
565
|
-
"```ref",
|
|
566
|
-
"key: pytorch-doc",
|
|
567
|
-
"title: PyTorch Transformer 官方文档",
|
|
568
|
-
"source: pytorch.org",
|
|
569
|
-
"url: https://pytorch.org/docs/stable/nn.html",
|
|
570
|
-
"type: doc",
|
|
571
|
-
"```",
|
|
572
|
-
"",
|
|
573
|
-
"```ref",
|
|
574
|
-
"key: annotated",
|
|
575
|
-
"title: The Annotated Transformer",
|
|
576
|
-
"authors: Harvard NLP",
|
|
577
|
-
"url: https://github.com/harvardnlp/annotated-transformer",
|
|
578
|
-
"type: repo",
|
|
579
|
-
"note: 逐行注释的 Transformer 实现。",
|
|
580
|
-
"```",
|
|
581
|
-
].join("\n"),
|
|
582
|
-
notes: [
|
|
583
|
-
"【正文标记】[ref:key] 中 key 只能含字母/数字/连字符/下划线,不能有空格",
|
|
584
|
-
"【自动编号】角标编号按正文 [ref:key] 首次出现顺序分配(从 1 开始);同一 key 多次引用复用同一编号",
|
|
585
|
-
"【块字段格式】```ref 块内每行 'field: value',key 与 title 必填,其余可选;不识别的字段会被忽略",
|
|
586
|
-
"【type 枚举】paper=论文 / blog=博客 / doc=文档 / repo=仓库 / video=视频 / spec=规范 / link=通用链接(默认)",
|
|
587
|
-
"【块隐身】```ref 块只用于定义元数据,不会在正文渲染出可见内容",
|
|
588
|
-
"【文末区】文章末尾自动生成「参考文献」区,按角标顺序列出所有被引用的条目",
|
|
589
|
-
"【容错】正文引用了未定义的 key 时,该标记会保留为字面文本,便于发现拼写错误",
|
|
590
|
-
"【与脚注的区别】引用论文/资料请用本语法([ref:key]),它有 hover 卡片和结构化文末区;GFM 脚注 [^id] 仅用于普通补充说明,不再渲染成引用卡片",
|
|
591
|
-
"【推荐】使用 post.build_reference 工具自动生成 ```ref 块,确保字段格式正确",
|
|
592
|
-
],
|
|
593
|
-
};
|
|
594
|
-
}
|
|
595
|
-
function buildFootnoteCapability() {
|
|
596
|
-
return {
|
|
597
|
-
id: "footnote",
|
|
598
|
-
name: "Footnote(GFM 脚注,仅用于普通补充说明)",
|
|
599
|
-
summary: "在文章底部定义脚注,正文中通过引用标记链接。支持双向跳转、自动编号。" +
|
|
600
|
-
"注意:引用论文 / 文档 / 仓库等外部资料请改用 Reference 语法([ref:key]),脚注仅用于普通补充说明。",
|
|
601
|
-
syntax: [
|
|
602
|
-
"正文中引用:[^脚注ID]",
|
|
603
|
-
"文章底部定义:[^脚注ID]: 脚注内容",
|
|
604
|
-
].join("\n"),
|
|
605
|
-
parameters: [
|
|
606
|
-
{
|
|
607
|
-
name: "脚注ID",
|
|
608
|
-
type: "string",
|
|
609
|
-
required: true,
|
|
610
|
-
description: "脚注唯一标识符。可以是数字、单词或短语(内部会做标准化处理)。大小写不敏感。",
|
|
611
|
-
},
|
|
612
|
-
],
|
|
613
|
-
example: [
|
|
614
|
-
"React Server Components[^rsc] 通过将渲染拆分到服务端来减少客户端 bundle 大小。",
|
|
615
|
-
"这一架构灵感来自 PHP 的请求处理模型[^php-model]。",
|
|
616
|
-
"",
|
|
617
|
-
"[^rsc]: Dan Abramov, \"RFC: React Server Components\", 2020.",
|
|
618
|
-
"[^php-model]: 参见 Laravel 的 Blade 模板引擎如何将 HTML 生成完全放在服务端。",
|
|
619
|
-
].join("\n"),
|
|
620
|
-
notes: [
|
|
621
|
-
"脚注引用 [^id] 可以出现在正文任意位置,会渲染为上标数字链接",
|
|
622
|
-
"脚注定义 [^id]: 必须放在文章末尾(通常是最后几行),独占一行开头",
|
|
623
|
-
"同一个 [^id] 可以在正文中多次引用,编号相同",
|
|
624
|
-
"脚注ID 的大小写和空白会被标准化处理(如 'RSC' 和 'rsc' 视为同一脚注)",
|
|
625
|
-
"定义行的 [^id]: 后面必须跟至少一个空格再写内容",
|
|
626
|
-
"渲染后脚注区域会有分割线,引用和定义之间支持双向点击跳转",
|
|
627
|
-
],
|
|
628
|
-
};
|
|
629
|
-
}
|
|
630
|
-
function buildSitePostReferenceCapability() {
|
|
631
|
-
return {
|
|
632
|
-
id: "site-post-reference",
|
|
633
|
-
name: "Site Post Reference(站内文章引用)",
|
|
634
|
-
summary: "通过相对路径引用本站其他文章,形成站内互链。需确保 slug 真实存在。",
|
|
635
|
-
syntax: "[显示文字](../posts/<slug>)",
|
|
636
|
-
parameters: [
|
|
637
|
-
{
|
|
638
|
-
name: "slug",
|
|
639
|
-
type: "string",
|
|
640
|
-
required: true,
|
|
641
|
-
description: "目标文章的 slug 标识符。必须是已存在的文章 slug。",
|
|
642
|
-
},
|
|
643
|
-
],
|
|
644
|
-
example: [
|
|
645
|
-
"关于 RSC 的基础概念,请参考 [React Server Components 入门](../posts/react-server-components-intro)。",
|
|
646
|
-
"",
|
|
647
|
-
"本文是 [v1.3.0 变更说明](../posts/changelog-v1-3-0) 中提到的新功能的详细教程。",
|
|
648
|
-
].join("\n"),
|
|
649
|
-
notes: [
|
|
650
|
-
"路径格式固定为 ../posts/<slug>,不支持其他相对路径形式",
|
|
651
|
-
"引用前必须先调用 post.list_for_reference 工具确认 slug 存在且有效",
|
|
652
|
-
"前台渲染时会正确解析为文章详情页 URL",
|
|
653
|
-
"如果 slug 对应的文章被删除,链接将失效(404)",
|
|
654
|
-
"slug 区分大小写,必须与目标文章的实际 slug 完全匹配",
|
|
655
|
-
],
|
|
656
|
-
};
|
|
657
|
-
}
|
|
658
|
-
function buildCodeGroupCapability() {
|
|
659
|
-
return {
|
|
660
|
-
id: "code-group",
|
|
661
|
-
name: "Code Group(多语言代码 Tab 切换)",
|
|
662
|
-
summary: "在同一个代码块区域中展示多个语言版本的代码,读者通过 tab 切换查看。" +
|
|
663
|
-
"适用于展示同一 API 调用的不同语言实现、同一概念的多种写法等场景。" +
|
|
664
|
-
"同一页面内多个 code-group 的 tab 选择会自动同步。",
|
|
665
|
-
syntax: [
|
|
666
|
-
"```code-group",
|
|
667
|
-
"/* @tab Label1 */",
|
|
668
|
-
"代码内容1",
|
|
669
|
-
"",
|
|
670
|
-
"/* @tab Label2 lang=xxx */",
|
|
671
|
-
"代码内容2",
|
|
672
|
-
"```",
|
|
673
|
-
].join("\n"),
|
|
674
|
-
parameters: [
|
|
675
|
-
{
|
|
676
|
-
name: "Label",
|
|
677
|
-
type: "string",
|
|
678
|
-
required: true,
|
|
679
|
-
description: "Tab 的显示标签,如 'Python'、'JavaScript'、'cURL'。" +
|
|
680
|
-
"常见语言名会自动推断语法高亮语言(如 'Python' → python、'JavaScript' → javascript)",
|
|
681
|
-
},
|
|
682
|
-
{
|
|
683
|
-
name: "lang",
|
|
684
|
-
type: "string",
|
|
685
|
-
required: false,
|
|
686
|
-
description: "显式指定语法高亮语言(如 lang=python)。当 Label 无法自动推断时使用。" +
|
|
687
|
-
"支持的语言:python、javascript、typescript、bash、go、rust、java、json、yaml、sql、" +
|
|
688
|
-
"csharp、cpp、php、ruby、swift、kotlin、dockerfile、markdown、scss、graphql 等",
|
|
689
|
-
},
|
|
690
|
-
],
|
|
691
|
-
example: [
|
|
692
|
-
"```code-group",
|
|
693
|
-
"/* @tab Python */",
|
|
694
|
-
"import requests",
|
|
695
|
-
"",
|
|
696
|
-
"response = requests.get(\"https://api.example.com/data\")",
|
|
697
|
-
"data = response.json()",
|
|
698
|
-
"print(data)",
|
|
699
|
-
"",
|
|
700
|
-
"/* @tab JavaScript */",
|
|
701
|
-
"const response = await fetch(\"https://api.example.com/data\");",
|
|
702
|
-
"const data = await response.json();",
|
|
703
|
-
"console.log(data);",
|
|
704
|
-
"",
|
|
705
|
-
"/* @tab cURL lang=bash */",
|
|
706
|
-
"curl -X GET https://api.example.com/data \\",
|
|
707
|
-
" -H \"Content-Type: application/json\"",
|
|
708
|
-
"```",
|
|
709
|
-
].join("\n"),
|
|
710
|
-
notes: [
|
|
711
|
-
"语言标识必须是小写 code-group",
|
|
712
|
-
"每个 tab 以 /* @tab Label */ 标记开始,标记必须独占一行",
|
|
713
|
-
"Label 后可选 lang=xxx 显式指定高亮语言;不指定时从 Label 自动推断",
|
|
714
|
-
"自动推断支持的 Label:Python、JavaScript、TypeScript、Bash、Shell、Go、Rust、Java、JSON、YAML、SQL、cURL 等",
|
|
715
|
-
"同一页面内多个 code-group 的 tab 选择会自动同步(如选了 Python,其他 code-group 也切到 Python)",
|
|
716
|
-
"每个 tab 独立做语法高亮,支持 20+ 种编程语言",
|
|
717
|
-
"tab 栏支持键盘左右方向键切换",
|
|
718
|
-
],
|
|
719
|
-
};
|
|
720
|
-
}
|
|
721
|
-
function buildDetailsCapability() {
|
|
722
|
-
return {
|
|
723
|
-
id: "details",
|
|
724
|
-
name: "Details(折叠块)",
|
|
725
|
-
summary: "使用 :::details 容器语法创建可折叠的内容块,基于 HTML5 <details>/<summary> 原生标签。" +
|
|
726
|
-
"支持默认展开、平滑高度过渡动画、键盘导航和屏幕阅读器友好。" +
|
|
727
|
-
"适用于补充说明、FAQ、技术细节等可选内容。",
|
|
728
|
-
syntax: [
|
|
729
|
-
":::details[标题文本]",
|
|
730
|
-
"折叠内容(支持完整 Markdown)",
|
|
731
|
-
":::",
|
|
732
|
-
"",
|
|
733
|
-
"默认展开:",
|
|
734
|
-
":::details[标题文本]{open}",
|
|
735
|
-
"默认展开的内容",
|
|
736
|
-
":::",
|
|
737
|
-
].join("\n"),
|
|
738
|
-
parameters: [
|
|
739
|
-
{
|
|
740
|
-
name: "标题文本",
|
|
741
|
-
type: "string",
|
|
742
|
-
required: true,
|
|
743
|
-
description: "折叠块的标题,显示在 summary 区域,点击可展开/收起",
|
|
744
|
-
},
|
|
745
|
-
{
|
|
746
|
-
name: "{open}",
|
|
747
|
-
type: "flag",
|
|
748
|
-
required: false,
|
|
749
|
-
description: "可选标记,添加后默认展开内容;不添加则默认收起",
|
|
750
|
-
defaultValue: "默认收起",
|
|
751
|
-
},
|
|
752
|
-
],
|
|
753
|
-
example: [
|
|
754
|
-
":::details[点击查看详细配置说明]",
|
|
755
|
-
"以下是完整的配置参数说明:",
|
|
756
|
-
"",
|
|
757
|
-
"- **timeout**: 请求超时时间(毫秒)",
|
|
758
|
-
"- **retries**: 重试次数",
|
|
759
|
-
"- **baseUrl**: API 基础路径",
|
|
760
|
-
"",
|
|
761
|
-
"```json",
|
|
762
|
-
"{",
|
|
763
|
-
" \"timeout\": 5000,",
|
|
764
|
-
" \"retries\": 3",
|
|
765
|
-
"}",
|
|
766
|
-
"```",
|
|
767
|
-
":::",
|
|
768
|
-
"",
|
|
769
|
-
":::details[常见问题 FAQ]{open}",
|
|
770
|
-
"**Q: 如何调试?**",
|
|
771
|
-
"A: 开启 debug 模式即可查看详细日志。",
|
|
772
|
-
"",
|
|
773
|
-
"**Q: 支持哪些浏览器?**",
|
|
774
|
-
"A: 支持所有现代浏览器(Chrome 90+、Firefox 88+、Safari 14+)。",
|
|
775
|
-
":::",
|
|
776
|
-
].join("\n"),
|
|
777
|
-
notes: [
|
|
778
|
-
"开标记 :::details[标题] 和闭标记 ::: 必须各占一行",
|
|
779
|
-
"标题文本放在方括号 [] 内,不能包含 ] 字符",
|
|
780
|
-
"内容区域支持完整 Markdown 语法(列表、代码块、图片、表格等)",
|
|
781
|
-
"基于 HTML5 <details>/<summary> 原生标签,语义化最佳",
|
|
782
|
-
"支持键盘导航(Space/Enter 切换展开状态)",
|
|
783
|
-
"使用 ResizeObserver 监听内容变化,平滑高度过渡动画",
|
|
784
|
-
"可以嵌套使用(在折叠块内再放一个折叠块)",
|
|
785
|
-
"推荐用于补充说明、FAQ、技术细节等非核心内容",
|
|
786
|
-
],
|
|
787
|
-
};
|
|
788
|
-
}
|
|
789
|
-
function buildTimelineCapability() {
|
|
790
|
-
return {
|
|
791
|
-
id: "timeline",
|
|
792
|
-
name: "Timeline(时间轴)",
|
|
793
|
-
summary: "使用 :::timeline 容器语法创建单侧时间轴,展示项目里程碑、版本历史、事件发展等。" +
|
|
794
|
-
"每个事件用列表项格式定义,支持激活状态标记。" +
|
|
795
|
-
"左侧竖线 + 圆点节点,激活项实心高亮,hover 时圆点放大。",
|
|
796
|
-
syntax: [
|
|
797
|
-
":::timeline",
|
|
798
|
-
"- 时间 | 标题",
|
|
799
|
-
" 事件描述内容(支持多行)",
|
|
800
|
-
"",
|
|
801
|
-
"- 时间 | 标题 [active]",
|
|
802
|
-
" 激活状态的事件描述",
|
|
803
|
-
":::",
|
|
804
|
-
].join("\n"),
|
|
805
|
-
parameters: [
|
|
806
|
-
{
|
|
807
|
-
name: "时间",
|
|
808
|
-
type: "string",
|
|
809
|
-
required: true,
|
|
810
|
-
description: "事件发生的时间,如 '2024-01'、'2024-Q1'、'2024-03-15'",
|
|
811
|
-
},
|
|
812
|
-
{
|
|
813
|
-
name: "标题",
|
|
814
|
-
type: "string",
|
|
815
|
-
required: true,
|
|
816
|
-
description: "事件的简短标题,用 | 与时间分隔",
|
|
817
|
-
},
|
|
818
|
-
{
|
|
819
|
-
name: "[active]",
|
|
820
|
-
type: "flag",
|
|
821
|
-
required: false,
|
|
822
|
-
description: "可选标记,添加在标题末尾表示激活状态(实心圆点 + 高亮)",
|
|
823
|
-
},
|
|
824
|
-
{
|
|
825
|
-
name: "描述",
|
|
826
|
-
type: "string",
|
|
827
|
-
required: false,
|
|
828
|
-
description: "事件的详细描述,缩进写在标题行下方,支持多行",
|
|
829
|
-
},
|
|
830
|
-
],
|
|
831
|
-
example: [
|
|
832
|
-
":::timeline",
|
|
833
|
-
"- 2024-01 | 项目启动",
|
|
834
|
-
" 团队组建完成,确定技术栈和架构方案。",
|
|
835
|
-
"",
|
|
836
|
-
"- 2024-03 | 第一版上线",
|
|
837
|
-
" 完成核心功能开发,包括用户认证、数据管理、API 接口。",
|
|
838
|
-
"",
|
|
839
|
-
"- 2024-06 | 性能优化 [active]",
|
|
840
|
-
" 数据库查询优化,API 响应时间从 800ms 降至 120ms。",
|
|
841
|
-
" 引入 Redis 缓存,QPS 提升 5 倍。",
|
|
842
|
-
"",
|
|
843
|
-
"- 2024-09 | 国际化支持",
|
|
844
|
-
" 支持中文、英文、日文三种语言。",
|
|
845
|
-
":::",
|
|
846
|
-
].join("\n"),
|
|
847
|
-
notes: [
|
|
848
|
-
"开标记 :::timeline 和闭标记 ::: 必须各占一行",
|
|
849
|
-
"每个事件用 `- ` 列表项开头,`|` 分隔时间和标题",
|
|
850
|
-
"标题末尾的 [active] 标记表示激活状态,解析后从标题中移除",
|
|
851
|
-
"事件描述缩进写在标题行下方(至少 2 个空格),支持多行",
|
|
852
|
-
"事件之间可以用空行分隔,提高可读性",
|
|
853
|
-
"激活状态的事件会显示实心圆点 + 高亮颜色",
|
|
854
|
-
"hover 时圆点会放大 1.2 倍,提供视觉反馈",
|
|
855
|
-
"适用于项目里程碑、版本历史、团队发展、产品演进等场景",
|
|
856
|
-
],
|
|
857
|
-
};
|
|
858
|
-
}
|
|
859
|
-
//# sourceMappingURL=syntax-capabilities.js.map
|