foliko 1.1.7 → 1.1.8

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 (250) hide show
  1. package/.agent/.shared/ui-ux-pro-max/data/charts.csv +26 -0
  2. package/.agent/.shared/ui-ux-pro-max/data/colors.csv +97 -0
  3. package/.agent/.shared/ui-ux-pro-max/data/icons.csv +101 -0
  4. package/.agent/.shared/ui-ux-pro-max/data/landing.csv +31 -0
  5. package/.agent/.shared/ui-ux-pro-max/data/products.csv +97 -0
  6. package/.agent/.shared/ui-ux-pro-max/data/prompts.csv +24 -0
  7. package/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +45 -0
  8. package/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  9. package/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  10. package/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  11. package/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  12. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  13. package/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  14. package/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  15. package/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +54 -0
  16. package/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  17. package/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  18. package/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  19. package/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  20. package/.agent/.shared/ui-ux-pro-max/data/styles.csv +59 -0
  21. package/.agent/.shared/ui-ux-pro-max/data/typography.csv +58 -0
  22. package/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  23. package/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  24. package/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +31 -0
  25. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
  26. package/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
  27. package/.agent/.shared/ui-ux-pro-max/scripts/core.py +258 -0
  28. package/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +1067 -0
  29. package/.agent/.shared/ui-ux-pro-max/scripts/search.py +106 -0
  30. package/.agent/ARCHITECTURE.md +288 -0
  31. package/.agent/agents/ambient-agent.md +57 -0
  32. package/.agent/agents/debugger.md +55 -0
  33. package/.agent/agents/email-assistant.md +49 -0
  34. package/.agent/agents/file-manager.md +42 -0
  35. package/.agent/agents/python-developer.md +60 -0
  36. package/.agent/agents/scheduler.md +59 -0
  37. package/.agent/agents/web-developer.md +45 -0
  38. package/.agent/data/default.json +412 -3
  39. package/.agent/data/plugins-state.json +172 -173
  40. package/.agent/data/puppeteer-sessions/undefined.json +6 -0
  41. package/.agent/data/weixin-media/2026-04-08/img_1775618677512.jpg +0 -0
  42. package/.agent/data/weixin-media/2026-04-08/img_1775619073340.jpg +0 -0
  43. package/.agent/data/weixin-media/2026-04-08/img_1775619097536.jpg +0 -0
  44. package/.agent/data/weixin-media/2026-04-08/img_1775619209388.jpg +0 -0
  45. package/.agent/mcp_config.json +11 -3
  46. package/.agent/memory/feedback/mnrdvj5i-ca3dkd.md +9 -0
  47. package/.agent/memory/feedback/mnre365e-7s4zax.md +9 -0
  48. package/.agent/memory/feedback/mnre36jn-nkfgmp.md +9 -0
  49. package/.agent/memory/feedback/mnre3805-kjiq6h.md +9 -0
  50. package/.agent/memory/feedback/mnsf66kp-b10rcd.md +9 -0
  51. package/.agent/memory/feedback/mnsi3sz8-p5g2cw.md +9 -0
  52. package/.agent/memory/feedback/mnsibe47-sv2ni1.md +9 -0
  53. package/.agent/memory/feedback/mnsic89w-nn228o.md +9 -0
  54. package/.agent/memory/feedback/mnsj1xe9-x83ba0.md +9 -0
  55. package/.agent/memory/feedback/mnsj21iv-wnwelx.md +9 -0
  56. package/.agent/memory/feedback/mnsj2g4a-cog7a2.md +9 -0
  57. package/.agent/memory/feedback/mnsj4js7-lktjp6.md +9 -0
  58. package/.agent/memory/feedback/mnsj5d4y-uglwvp.md +9 -0
  59. package/.agent/memory/feedback/mnslkuo9-uous66.md +24 -0
  60. package/.agent/memory/feedback/mnsm3vq0-megoil.md +9 -0
  61. package/.agent/memory/feedback/mnsnn5x2-sxcihd.md +9 -0
  62. package/.agent/memory/feedback/mnsnq17s-nabrn9.md +9 -0
  63. package/.agent/memory/feedback/mnsnybet-wz7rn3.md +9 -0
  64. package/.agent/memory/feedback/mnsrw0s7-7s9e30.md +9 -0
  65. package/.agent/memory/feedback/mnu5hpnd-tlm16q.md +9 -0
  66. package/.agent/memory/feedback/mnu60uqe-xuoxp4.md +9 -0
  67. package/.agent/memory/project/mnqx54u5-loqtoe.md +9 -0
  68. package/.agent/memory/project/mnqx84cv-mx6dmd.md +9 -0
  69. package/.agent/memory/project/mnsacuyr-hgtk5n.md +20 -0
  70. package/.agent/memory/project/mnu5hy2x-bjsg7u.md +9 -0
  71. package/.agent/memory/reference/mnre3cww-penbo1.md +9 -0
  72. package/.agent/memory/reference/mns9wn48-luerua.md +14 -0
  73. package/.agent/memory/reference/mns9yz5c-thc2s0.md +16 -0
  74. package/.agent/memory/reference/mnsfy4um-910f1o.md +23 -0
  75. package/.agent/memory/reference/mnsg37dp-lmfj18.md +32 -0
  76. package/.agent/memory/reference/mnsll60q-0j911u.md +36 -0
  77. package/.agent/memory/reference/mnsmlb5y-nej31u.md +16 -0
  78. package/.agent/memory/reference/mnssle72-yrot96.md +9 -0
  79. package/.agent/memory/user/mnsfuon6-l416q1.md +21 -0
  80. package/.agent/memory/user/mnsg9kut-95m7rf.md +20 -0
  81. package/.agent/memory/user/mnu2eo1v-yy6fhe.md +9 -0
  82. package/.agent/memory/user/mnu2etuo-8u8jk8.md +9 -0
  83. package/.agent/plugins/poster-plugin/fonts/NotoColorEmoji-Regular.ttf +0 -0
  84. package/.agent/plugins/poster-plugin/fonts/Symbola_hint.ttf +0 -0
  85. package/.agent/plugins/poster-plugin/package.json +3 -3
  86. package/.agent/plugins/poster-plugin/src/canvas.js +8 -0
  87. package/.agent/plugins/poster-plugin/src/components/barcode.js +5 -2
  88. package/.agent/plugins/poster-plugin/src/components/bubble.js +3 -2
  89. package/.agent/plugins/poster-plugin/src/components/button.js +74 -30
  90. package/.agent/plugins/poster-plugin/src/components/columns.js +97 -83
  91. package/.agent/plugins/poster-plugin/src/components/grid.js +104 -92
  92. package/.agent/plugins/poster-plugin/src/components/highlightText.js +2 -1
  93. package/.agent/plugins/poster-plugin/src/components/imageFrame.js +143 -93
  94. package/.agent/plugins/poster-plugin/src/components/quote.js +85 -13
  95. package/.agent/plugins/poster-plugin/src/components/ribbon.js +13 -9
  96. package/.agent/plugins/poster-plugin/src/components/seal.js +5 -3
  97. package/.agent/plugins/poster-plugin/src/components/star.js +3 -3
  98. package/.agent/plugins/poster-plugin/src/components/table.js +1 -1
  99. package/.agent/plugins/poster-plugin/src/components/watermark.js +4 -2
  100. package/.agent/plugins/poster-plugin/src/composer.js +181 -13
  101. package/.agent/plugins/poster-plugin/src/elements/artText.js +16 -7
  102. package/.agent/plugins/poster-plugin/src/elements/background.js +20 -5
  103. package/.agent/plugins/poster-plugin/src/elements/richText.js +160 -107
  104. package/.agent/plugins/poster-plugin/src/elements/text.js +48 -45
  105. package/.agent/plugins/poster-plugin/src/fonts.js +556 -125
  106. package/.agent/plugins/poster-plugin/src/index.js +46 -1
  107. package/.agent/plugins/poster-plugin/yarn.lock +186 -356
  108. package/.agent/plugins/puppeteer-plugin/README.md +147 -0
  109. package/.agent/plugins/puppeteer-plugin/index.js +1422 -0
  110. package/.agent/plugins/puppeteer-plugin/package.json +9 -0
  111. package/.agent/plugins.json +5 -11
  112. package/.agent/rules/GEMINI.md +273 -0
  113. package/.agent/rules/allow-rule.md +77 -0
  114. package/.agent/rules/log-rule.md +83 -0
  115. package/.agent/rules/security-rule.md +93 -0
  116. package/.agent/scripts/auto_preview.py +148 -0
  117. package/.agent/scripts/checklist.py +217 -0
  118. package/.agent/scripts/session_manager.py +120 -0
  119. package/.agent/scripts/verify_all.py +327 -0
  120. package/.agent/sessions/cli_default.json +122 -689
  121. package/.agent/skills/api-patterns/SKILL.md +81 -0
  122. package/.agent/skills/api-patterns/api-style.md +42 -0
  123. package/.agent/skills/api-patterns/auth.md +24 -0
  124. package/.agent/skills/api-patterns/documentation.md +26 -0
  125. package/.agent/skills/api-patterns/graphql.md +41 -0
  126. package/.agent/skills/api-patterns/rate-limiting.md +31 -0
  127. package/.agent/skills/api-patterns/response.md +37 -0
  128. package/.agent/skills/api-patterns/rest.md +40 -0
  129. package/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
  130. package/.agent/skills/api-patterns/security-testing.md +122 -0
  131. package/.agent/skills/api-patterns/trpc.md +41 -0
  132. package/.agent/skills/api-patterns/versioning.md +22 -0
  133. package/.agent/skills/app-builder/SKILL.md +75 -0
  134. package/.agent/skills/app-builder/agent-coordination.md +71 -0
  135. package/.agent/skills/app-builder/feature-building.md +53 -0
  136. package/.agent/skills/app-builder/project-detection.md +34 -0
  137. package/.agent/skills/app-builder/scaffolding.md +118 -0
  138. package/.agent/skills/app-builder/tech-stack.md +40 -0
  139. package/.agent/skills/app-builder/templates/SKILL.md +39 -0
  140. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
  141. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
  142. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
  143. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
  144. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
  145. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
  146. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
  147. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
  148. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
  149. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
  150. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
  151. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
  152. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
  153. package/.agent/skills/architecture/SKILL.md +55 -0
  154. package/.agent/skills/architecture/context-discovery.md +43 -0
  155. package/.agent/skills/architecture/examples.md +94 -0
  156. package/.agent/skills/architecture/pattern-selection.md +68 -0
  157. package/.agent/skills/architecture/patterns-reference.md +50 -0
  158. package/.agent/skills/architecture/trade-off-analysis.md +77 -0
  159. package/.agent/skills/clean-code/SKILL.md +201 -0
  160. package/.agent/skills/doc.md +177 -0
  161. package/.agent/skills/frontend-design/SKILL.md +418 -0
  162. package/.agent/skills/frontend-design/animation-guide.md +331 -0
  163. package/.agent/skills/frontend-design/color-system.md +311 -0
  164. package/.agent/skills/frontend-design/decision-trees.md +418 -0
  165. package/.agent/skills/frontend-design/motion-graphics.md +306 -0
  166. package/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
  167. package/.agent/skills/frontend-design/scripts/ux_audit.py +722 -0
  168. package/.agent/skills/frontend-design/typography-system.md +345 -0
  169. package/.agent/skills/frontend-design/ux-psychology.md +1116 -0
  170. package/.agent/skills/frontend-design/visual-effects.md +383 -0
  171. package/.agent/skills/i18n-localization/SKILL.md +154 -0
  172. package/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
  173. package/.agent/skills/mcp-builder/SKILL.md +176 -0
  174. package/.agent/skills/poster-design/SKILL.md +385 -0
  175. package/.agent/skills/web-design-guidelines/SKILL.md +57 -0
  176. package/.agent/workflows/brainstorm.md +113 -0
  177. package/.agent/workflows/create.md +59 -0
  178. package/.agent/workflows/debug.md +103 -0
  179. package/.agent/workflows/deploy.md +176 -0
  180. package/.agent/workflows/enhance.md +63 -0
  181. package/.agent/workflows/orchestrate.md +237 -0
  182. package/.agent/workflows/plan.md +89 -0
  183. package/.agent/workflows/preview.md +81 -0
  184. package/.agent/workflows/simple-test.md +42 -0
  185. package/.agent/workflows/status.md +86 -0
  186. package/.agent/workflows/structured-orchestrate.md +180 -0
  187. package/.agent/workflows/test.md +144 -0
  188. package/.agent/workflows/ui-ux-pro-max.md +296 -0
  189. package/.claude/settings.local.json +1 -2
  190. package/.env.example +56 -56
  191. package/README.md +441 -441
  192. package/output/foliko-poster.png +0 -0
  193. package/outputs/emoji-font-showcase.png +0 -0
  194. package/outputs/foliko-muji-style.png +0 -0
  195. package/package.json +3 -2
  196. package/plugins/default-plugins.js +2 -1
  197. package/plugins/extension-executor-plugin.js +24 -1
  198. package/plugins/feishu-plugin.js +2 -2
  199. package/plugins/telegram-plugin.js +2 -2
  200. package/plugins/weixin-plugin.js +2 -2
  201. package/skills/find-skills/AGENTS.md +162 -162
  202. package/skills/find-skills/SKILL.md +133 -133
  203. package/src/core/agent.js +117 -29
  204. package/src/executors/mcp-executor.js +282 -26
  205. package/system.md +719 -570
  206. package/.agent/agents/code-assistant.json +0 -17
  207. package/.agent/agents/email-assistant.json +0 -14
  208. package/.agent/agents/file-assistant.json +0 -18
  209. package/.agent/agents/orchestrator-demo.md +0 -53
  210. package/.agent/agents/orchestrator.json +0 -7
  211. package/.agent/agents/system-assistant.json +0 -15
  212. package/.agent/agents/web-assistant.json +0 -12
  213. package/.agent/data/email/processed-emails.json +0 -1
  214. package/.agent/data/scheduler/tasks.json +0 -1
  215. package/.agent/data/web/web-config.json +0 -5
  216. package/.agent/memory/feedback/mnt7jrlt-d67qs7.md +0 -15
  217. package/.agent/memory/feedback/mnt88ja3-al4fuy.md +0 -9
  218. package/.agent/package.json +0 -8
  219. package/.agent/plugins/__pycache__/file_writer.cpython-312.pyc +0 -0
  220. package/.agent/plugins/daytona/README.md +0 -89
  221. package/.agent/plugins/daytona/index.js +0 -377
  222. package/.agent/plugins/daytona/package.json +0 -12
  223. package/.agent/plugins/marknative/README.md +0 -134
  224. package/.agent/plugins/marknative/fonts/SegoeUI Emoji.ttf +0 -0
  225. package/.agent/plugins/marknative/fonts.zip +0 -0
  226. package/.agent/plugins/marknative/index.js +0 -256
  227. package/.agent/plugins/marknative/package.json +0 -12
  228. package/.agent/plugins/poster-plugin/emojis/rocket.png +0 -1
  229. package/.agent/plugins/poster-plugin/test-background.svg +0 -1
  230. package/.agent/plugins/poster-plugin/test-full-poster.svg +0 -2
  231. package/.agent/plugins/poster-plugin/test-image.png +0 -0
  232. package/.agent/plugins/system-info/index.js +0 -387
  233. package/.agent/plugins/system-info/package.json +0 -4
  234. package/.agent/plugins/system-info/test.js +0 -40
  235. package/.agent/plugins/test-plugin.py +0 -108
  236. package/.agent/python-scripts/test_sample.py +0 -24
  237. package/.agent/skills/agent-browser/SKILL.md +0 -311
  238. package/.agent/skills/agent-browser/TEST_PLAN.md +0 -200
  239. package/.agent/skills/sysinfo/SKILL.md +0 -38
  240. package/.agent/skills/sysinfo/system-info.sh +0 -130
  241. package/.agent/skills/workflow/SKILL.md +0 -324
  242. package/.agent/test-agent.js +0 -35
  243. package/.agent/weixin.json +0 -6
  244. package/.agent/workflows/email-digest.json +0 -50
  245. package/.agent/workflows/file-backup.json +0 -21
  246. package/.agent/workflows/get-ip-notify.json +0 -32
  247. package/.agent/workflows/news-aggregator.json +0 -93
  248. package/.agent/workflows/news-dashboard-v2.json +0 -94
  249. package/.agent/workflows/notification-batch.json +0 -32
  250. package/output/zen_silence.png +0 -0
@@ -1,134 +0,0 @@
1
- # MarkNative Plugin
2
-
3
- 将 Markdown 转换为 PNG/SVG 图片的 Foliko 插件。基于 [marknative](https://github.com/liyown/marknative) 项目。
4
-
5
- ## 特性
6
-
7
- - **原生渲染**: 不需要浏览器,使用原生 2D canvas API
8
- - **多种格式**: 支持 PNG 和 SVG 输出
9
- - **丰富主题**: 10 种内置主题(浅色/深色)
10
- - **代码高亮**: 支持代码块语法高亮
11
- - **分页支持**: 自动分页处理长文档
12
- - **双重模式**: 支持本地运行和 Daytona 沙箱运行
13
-
14
- ## 安装依赖
15
-
16
- ### 方式一:本地安装
17
- ```bash
18
- cd .agent/plugins/marknative
19
- npm install
20
- ```
21
-
22
- ### 方式二:使用 Daytona 沙箱
23
- 确保已配置 Daytona 插件,插件将自动在沙箱中运行。
24
-
25
- ## 工具列表
26
-
27
- ### marknative_render
28
- 将 Markdown 渲染为图片(Base64 编码返回)
29
-
30
- 参数:
31
- - `markdown`: Markdown 内容(必填)
32
- - `format`: 输出格式 (png/svg)
33
- - `theme`: 主题名称
34
- - `singlePage`: 是否单页输出
35
- - `codeTheme`: 代码高亮主题
36
- - `useSandbox`: 是否强制使用沙箱执行
37
-
38
- ### marknative_render_to_file
39
- 将 Markdown 渲染为图片并保存到文件
40
-
41
- 参数:
42
- - `markdown`: Markdown 内容(必填)
43
- - `outputPath`: 输出文件路径(必填)
44
- - `format`: 输出格式
45
- - `theme`: 主题名称
46
- - `codeTheme`: 代码高亮主题
47
-
48
- ### marknative_preview
49
- 预览渲染效果(返回第一页 Base64)
50
-
51
- 参数:
52
- - `markdown`: Markdown 内容(必填)
53
- - `theme`: 主题名称
54
- - `codeTheme`: 代码高亮主题
55
-
56
- ### marknative_get_themes
57
- 获取所有可用主题和代码高亮主题列表
58
-
59
- ### marknative_status
60
- 检查插件状态
61
-
62
- ## 可用主题
63
-
64
- | 主题 | 描述 |
65
- |------|------|
66
- | default | 默认主题(浅色) |
67
- | github | GitHub 风格 |
68
- | solarized | Solarized 风格 |
69
- | sepia | 复古纸张风格 |
70
- | rose | 玫瑰粉风格 |
71
- | dark | 深色主题 |
72
- | nord | Nord 风格 |
73
- | dracula | Dracula 风格 |
74
- | ocean | 海洋风格 |
75
- | forest | 森林风格 |
76
-
77
- ## 代码高亮主题
78
-
79
- 支持 Shiki 主题:`github-light`, `github-dark`, `nord`, `dracula`, `solarized-light`, `solarized-dark`, `monokai` 等。
80
-
81
- ## 使用示例
82
-
83
- ```javascript
84
- // 1. 检查状态
85
- marknative_status({})
86
-
87
- // 2. 渲染为 Base64 图片
88
- marknative_render({
89
- markdown: '# Hello\n\nThis is **markdown** to image!',
90
- format: 'png',
91
- theme: 'github'
92
- })
93
-
94
- // 3. 保存为文件
95
- marknative_render_to_file({
96
- markdown: '# Document\n\nContent here...',
97
- outputPath: './output.png',
98
- theme: 'dark'
99
- })
100
-
101
- // 4. 预览
102
- marknative_preview({
103
- markdown: '# Preview\n\nTest content',
104
- theme: 'nord'
105
- })
106
-
107
- // 5. 获取主题列表
108
- marknative_get_themes({})
109
- ```
110
-
111
- ## 完整示例
112
-
113
- ```javascript
114
- // 渲染带有代码高亮的文档
115
- marknative_render({
116
- markdown: `# 示例代码
117
-
118
- \`\`\`javascript
119
- function hello() {
120
- console.log('Hello, World!');
121
- }
122
- \`\`\`
123
-
124
- **支持语法高亮!**
125
- `,
126
- format: 'png',
127
- theme: 'dark',
128
- codeTheme: 'github-dark'
129
- })
130
- ```
131
-
132
- ## 许可证
133
-
134
- MIT
Binary file
@@ -1,256 +0,0 @@
1
- const { z } = require('zod');
2
- const path = require('path');
3
- const fs = require('fs');
4
-
5
- module.exports = function (Plugin) {
6
- return class MarkNativePlugin extends Plugin {
7
- constructor(config = {}) {
8
- super();
9
- this.name = 'marknative';
10
- this.version = '1.0.1';
11
- this.description = 'Markdown 转图片插件 - 将 Markdown 转换为 PNG/SVG';
12
- this.priority = 10;
13
- this.marknative = null;
14
- this.checked = false;
15
- }
16
-
17
- async _ensureMarkNative() {
18
- if (this.checked) return;
19
- this.checked = true;
20
-
21
- this.marknative = await import('marknative');
22
- }
23
-
24
- tools = {
25
- marknative_render: {
26
- description: '将 Markdown 渲染为图片并保存到文件(返回文件路径)',
27
- inputSchema: z.object({
28
- markdown: z.string().describe('Markdown 内容'),
29
- outputPath: z.string().optional().describe('输出文件路径(如 output.png),不提供则自动生成'),
30
- format: z.enum(['png', 'svg']).optional().describe('输出格式:png 或 svg,默认 png'),
31
- theme: z.string().optional().describe('主题:default, github, solarized, sepia, rose, dark, nord, dracula, ocean, forest'),
32
- singlePage: z.boolean().optional().describe('是否渲染为单张图片(默认 false)'),
33
- codeTheme: z.string().optional().describe('代码高亮主题(如 github-dark, nord 等)'),
34
- }),
35
- execute: async (args) => {
36
- try {
37
- await this._ensureMarkNative();
38
-
39
- if (!this.marknative) {
40
- return {
41
- success: false,
42
- error: 'marknative 未安装。请运行: cd .agent/plugins/marknative && npm install'
43
- };
44
- }
45
-
46
- const { renderMarkdown } = this.marknative;
47
-
48
- const format = args.format || 'png';
49
- const options = {
50
- format,
51
- singlePage: args.singlePage || false
52
- };
53
-
54
- if (args.theme) options.theme = args.theme;
55
- if (args.codeTheme) options.codeHighlighting = { theme: args.codeTheme };
56
-
57
- const pages = await renderMarkdown(args.markdown, options);
58
-
59
- if (pages.length === 0) {
60
- return { success: false, error: '渲染失败,无输出' };
61
- }
62
-
63
- // 自动生成输出路径
64
- let basePath = args.outputPath;
65
- if (!basePath) {
66
- const timestamp = Date.now().toString(36);
67
- basePath = `output/markdown-${timestamp}.${format}`;
68
- }
69
-
70
- const dir = path.dirname(basePath);
71
- if (dir && dir !== '.' && !fs.existsSync(dir)) {
72
- fs.mkdirSync(dir, { recursive: true });
73
- }
74
-
75
- const files = [];
76
- for (let i = 0; i < pages.length; i++) {
77
- const page = pages[i];
78
- const filePath = pages.length === 1
79
- ? basePath
80
- : basePath.replace(/(\.[^.]+)$/, `-${String(i + 1).padStart(2, '0')}$1`);
81
-
82
- if (page.format === 'png') {
83
- fs.writeFileSync(filePath, page.data);
84
- } else {
85
- fs.writeFileSync(filePath, page.data, 'utf-8');
86
- }
87
- files.push(filePath);
88
- }
89
-
90
- return {
91
- success: true,
92
- files,
93
- pageCount: pages.length,
94
- message: pages.length === 1
95
- ? `图片已生成: ${files[0]}`
96
- : `已生成 ${pages.length} 页图片: ${files.join(', ')}`
97
- };
98
- } catch (error) {
99
- return { success: false, error: error.message };
100
- }
101
- },
102
- },
103
-
104
- marknative_render_to_file: {
105
- description: '将 Markdown 渲染为图片并保存到文件',
106
- inputSchema: z.object({
107
- markdown: z.string().describe('Markdown 内容'),
108
- outputPath: z.string().describe('输出文件路径(如 output.png)'),
109
- format: z.enum(['png', 'svg']).optional().describe('输出格式,默认根据文件扩展名'),
110
- theme: z.string().optional().describe('主题'),
111
- codeTheme: z.string().optional().describe('代码高亮主题'),
112
- }),
113
- execute: async (args) => {
114
- try {
115
- await this._ensureMarkNative();
116
-
117
- if (!this.marknative) {
118
- return {
119
- success: false,
120
- error: 'marknative 未安装。请运行: cd .agent/plugins/marknative && npm install'
121
- };
122
- }
123
-
124
- const { renderMarkdown } = this.marknative;
125
-
126
- const ext = path.extname(args.outputPath).toLowerCase();
127
- const format = args.format || (ext === '.svg' ? 'svg' : 'png');
128
-
129
- const options = { format };
130
- if (args.theme) options.theme = args.theme;
131
- if (args.codeTheme) options.codeHighlighting = { theme: args.codeTheme };
132
-
133
- const pages = await renderMarkdown(args.markdown, options);
134
-
135
- const dir = path.dirname(args.outputPath);
136
- if (dir && dir !== '.' && !fs.existsSync(dir)) {
137
- fs.mkdirSync(dir, { recursive: true });
138
- }
139
-
140
- const files = [];
141
- for (let i = 0; i < pages.length; i++) {
142
- const page = pages[i];
143
- const filePath = pages.length === 1
144
- ? args.outputPath
145
- : args.outputPath.replace(/(\.[^.]+)$/, `-${String(i + 1).padStart(2, '0')}$1`);
146
-
147
- if (page.format === 'png') {
148
- fs.writeFileSync(filePath, page.data);
149
- } else {
150
- fs.writeFileSync(filePath, page.data, 'utf-8');
151
- }
152
- files.push(filePath);
153
- }
154
-
155
- return {
156
- success: true,
157
- files,
158
- pageCount: pages.length,
159
- message: `已生成 ${pages.length} 页图片: ${files.join(', ')}`
160
- };
161
- } catch (error) {
162
- return { success: false, error: error.message };
163
- }
164
- },
165
- },
166
-
167
- marknative_preview: {
168
- description: '预览 Markdown 渲染效果(返回第一页 Base64)',
169
- inputSchema: z.object({
170
- markdown: z.string().describe('Markdown 内容'),
171
- theme: z.string().optional().describe('主题'),
172
- codeTheme: z.string().optional().describe('代码高亮主题'),
173
- }),
174
- execute: async (args) => {
175
- try {
176
- await this._ensureMarkNative();
177
-
178
- if (!this.marknative) {
179
- return {
180
- success: false,
181
- error: 'marknative 未安装。请运行: cd .agent/plugins/marknative && npm install'
182
- };
183
- }
184
-
185
- const { renderMarkdown } = this.marknative;
186
-
187
- const options = {
188
- format: 'png',
189
- singlePage: true
190
- };
191
-
192
- if (args.theme) options.theme = args.theme;
193
- if (args.codeTheme) options.codeHighlighting = { theme: args.codeTheme };
194
-
195
- const pages = await renderMarkdown(args.markdown, options);
196
-
197
- if (pages.length === 0) {
198
- return { success: false, error: '预览生成失败' };
199
- }
200
-
201
- return {
202
- success: true,
203
- preview: pages[0].data.toString('base64'),
204
- format: 'png'
205
- };
206
- } catch (error) {
207
- return { success: false, error: error.message };
208
- }
209
- },
210
- },
211
-
212
- marknative_get_themes: {
213
- description: '获取所有可用的主题列表',
214
- inputSchema: z.object({}),
215
- execute: async () => {
216
- return {
217
- success: true,
218
- themes: [
219
- { name: 'default', description: '默认主题(浅色)' },
220
- { name: 'github', description: 'GitHub 风格' },
221
- { name: 'solarized', description: 'Solarized 风格' },
222
- { name: 'sepia', description: '复古纸张风格' },
223
- { name: 'rose', description: '玫瑰粉风格' },
224
- { name: 'dark', description: '深色主题' },
225
- { name: 'nord', description: 'Nord 风格' },
226
- { name: 'dracula', description: 'Dracula 风格' },
227
- { name: 'ocean', description: '海洋风格' },
228
- { name: 'forest', description: '森林风格' }
229
- ],
230
- codeThemes: ['github-light', 'github-dark', 'nord', 'dracula', 'solarized-light', 'solarized-dark', 'monokai']
231
- };
232
- },
233
- },
234
-
235
- marknative_status: {
236
- description: '检查 marknative 插件状态',
237
- inputSchema: z.object({}),
238
- execute: async () => {
239
- await this._ensureMarkNative();
240
-
241
- return {
242
- success: true,
243
- available: this.marknative !== null,
244
- message: this.marknative ? 'marknative 已就绪' : 'marknative 未安装,请运行: cd .agent/plugins/marknative && npm install'
245
- };
246
- },
247
- },
248
- };
249
-
250
- install(framework) {
251
- return this;
252
- }
253
-
254
- uninstall(framework) {}
255
- };
256
- };
@@ -1,12 +0,0 @@
1
- {
2
- "name": "marknative-plugin",
3
- "version": "1.0.0",
4
- "description": "Markdown 转图片插件 - 将 Markdown 转换为 PNG/SVG",
5
- "main": "index.js",
6
- "keywords": ["markdown", "png", "svg", "image", "render", "foliko", "plugin"],
7
- "author": "",
8
- "license": "MIT",
9
- "dependencies": {
10
- "marknative": "^0.3.1"
11
- }
12
- }
@@ -1 +0,0 @@
1
- 404: Not Found
@@ -1 +0,0 @@
1
- <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="800" height="600" viewBox="0,0,800,600"><g fill="#ffffff" fill-rule="nonzero" stroke="none" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" stroke-miterlimit="10" stroke-dasharray="" stroke-dashoffset="0" font-family="sans-serif" font-weight="normal" font-size="40" text-anchor="middle" style="mix-blend-mode: normal"><text x="400" y="300">背景图片测试</text></g></svg>
@@ -1,2 +0,0 @@
1
- <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="800" height="600" viewBox="0,0,800,600"><g fill="none" fill-rule="nonzero" stroke="none" stroke-width="none" stroke-linecap="none" stroke-linejoin="miter" stroke-miterlimit="10" stroke-dasharray="" stroke-dashoffset="0" font-family="none" font-weight="none" font-size="none" text-anchor="none" style="mix-blend-mode: normal"><path d="M0,600v-600h800v600z" fill="#1a1a2e" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M20,50c0,-16.56854 13.43146,-30 30,-30c16.56854,0 30,13.43146 30,30c0,16.56854 -13.43146,30 -30,30c-16.56854,0 -30,-13.43146 -30,-30z" fill="#ff6b6b" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M100,50l100,50" fill="none" stroke="#4ecdc4" stroke-width="2" stroke-linecap="butt"></path><text x="150" y="60" fill="#ffffff" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="微软雅黑" font-weight="normal" font-size="20" text-anchor="start"></text><text x="250" y="60" fill="#ffffff" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="微软雅黑" font-weight="normal" font-size="20" text-anchor="middle"></text><image x="1466.66667" y="150" transform="scale(0.375,0.33333)" width="400" height="300" href="data:image/png;base64,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" fill="none" stroke="none" stroke-width="1" stroke-linecap="butt"></image><path d="M58,180c-4.41828,0 -8,-3.58172 -8,-8v-14c0,-4.41828 3.58172,-8 8,-8h64c4.41828,0 8,3.58172 8,8v14c0,4.41828 -3.58172,8 -8,8z" fill="#3b82f6" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="90" y="173" fill="#ffffff" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="24" text-anchor="middle">按钮</text><text x="165" y="171" fill="#ffcc00" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="18" text-anchor="middle">★</text><path d="M280,155v-15h0.53333v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M280.66667,155v-15h1.06667v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M282,155v-15h1.06667v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M282.66667,155v-15h0.53333v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M283.33333,155v-15h1.06667v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M281.33333,155v-15h0.53333v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M284,155v-15h1.06667v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M284.66667,155v-15h0.53333v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M288,155v-15h0.53333v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M288.66667,155v-15h1.06667v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M289.33333,155v-15h0.53333v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M283.33333,155v-15h1.06667v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M288,155v-15h0.53333v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M288.66667,155v-15h1.06667v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M294,155v-15h1.06667v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M294.66667,155v-15h0.53333v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M295.33333,155v-15h1.06667v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M285.33333,155v-15h0.53333v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M286,155v-15h1.06667v15z" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="330" y="174" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="monospace" font-weight="normal" font-size="16" text-anchor="middle">1234567890</text><path d="M400,190v-60h80v60z" fill="none" stroke="#4ecdc4" stroke-width="2" stroke-linecap="butt"></path><path d="M520,170c-11.04569,0 -20,-8.95431 -20,-20v0c0,-11.04569 8.95431,-20 20,-20h40c11.04569,0 20,8.95431 20,20v0c0,11.04569 -8.95431,20 -20,20z" fill="#ffffff" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M510,165l20,14v-28z" fill="#ffffff" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="525" y="158" fill="#ff6b6b" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="24" text-anchor="start">气
2
- 泡</text><text x="0" y="0" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="24" text-anchor="start">气</text><text x="0" y="0" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="24" text-anchor="start">气泡</text><path d="M600,180v-50h300v50z" fill="#e74c3c" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M600,130l-15,-15h15z" fill="#b93d30" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M900,130l15,-15h-15z" fill="#b93d30" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="750" y="164.33333" fill="#e94560" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="28" text-anchor="middle">缎带</text><path d="M703,190c0,-25.95738 21.04262,-47 47,-47c25.95738,0 47,21.04262 47,47c0,25.95738 -21.04262,47 -47,47c-25.95738,0 -47,-21.04262 -47,-47z" fill="none" stroke="#ff6b6b" stroke-width="3" stroke-linecap="butt"></path><path d="M710.05,190c0,-22.06378 17.88622,-39.95 39.95,-39.95c22.06378,0 39.95,17.88622 39.95,39.95c0,22.06378 -17.88622,39.95 -39.95,39.95c-22.06378,0 -39.95,-17.88622 -39.95,-39.95z" fill="none" stroke="#ff6b6b" stroke-width="1" stroke-linecap="butt"></path><text x="750" y="198" fill="#ff6b6b" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="serif" font-weight="normal" font-size="24" text-anchor="middle">印章</text><text x="750" y="165" fill="#ff6b6b" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="serif" font-weight="normal" font-size="16" text-anchor="middle">★</text><text x="750" y="223.33333" fill="#ff6b6b" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="serif" font-weight="normal" font-size="12" text-anchor="middle">★ ★ ★</text><text x="400" y="108" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="48" text-anchor="start">高亮</text><path d="M396.87507,122.14619l-3.34678,-38.25388l105.59664,-9.23851l3.34678,38.25388z" fill="#ffff00" stroke="none" stroke-width="1" stroke-linecap="butt" opacity="0.5"></path><path d="M50,300v-80h150v80z" fill="#ffffff" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="70" y="264" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="24" text-anchor="start">卡片</text><path d="M198.2,268c-2.20914,0 -4,-1.79086 -4,-4v-40c0,-2.20914 1.79086,-4 4,-4h43.6c2.20914,0 4,1.79086 4,4v40c0,2.20914 -1.79086,4 -4,4z" fill="#007bff" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="220" y="250" fill="#e94560" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="18" text-anchor="middle">徽章</text><path d="M347,288c-4.41828,0 -8,-3.58172 -8,-8v-52c0,-4.41828 3.58172,-8 8,-8h106c4.41828,0 8,3.58172 8,8v52c0,4.41828 -3.58172,8 -8,8z" fill="#e94560" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="400" y="260" fill="#ffffff" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="18" text-anchor="middle">行动号召</text><text x="565" y="252" fill="#007bff" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="32" text-anchor="start">🚀</text><text x="565" y="277" fill="#ffffff" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="20" text-anchor="start">特性</text><text x="565" y="296" fill="#aaaaaa" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="14" text-anchor="start">描述</text><path d="M60,355c-5.52285,0 -10,-3.35786 -10,-7.5v0c0,-4.14214 4.47715,-7.5 10,-7.5h130c5.52285,0 10,3.35786 10,7.5v0c0,4.14214 -4.47715,7.5 -10,7.5z" fill="#e0e0e0" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M60,355c-5.52285,0 -10,-3.35786 -10,-7.5v0c0,-4.14214 4.47715,-7.5 10,-7.5h85c5.52285,0 10,3.35786 10,7.5v0c0,4.14214 -4.47715,7.5 -10,7.5z" fill="#6366f1" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="MNaN,NaNcNaN,NaN NaN,NaN NaN,NaNcNaN,NaN NaN,NaN NaN,NaNcNaN,NaN NaN,NaN NaN,NaNcNaN,NaN NaN,NaN NaN,NaNz" fill-opacity="0" fill="#000000" stroke="#e0e0e0" stroke-width="10" stroke-linecap="butt"></path><path d="MNaN,NaN" fill="none" stroke="#3b82f6" stroke-width="10" stroke-linecap="round"></path><text x="0" y="0" transform="translate(NaN,NaN)" fill="#3b82f6" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="bold" font-size="NaN" text-anchor="middle">60%</text><path d="M300,335l5.87785,-3.09017l-1.12257,6.54508l4.75528,4.63525l-6.57164,0.95492l-2.93893,5.95492l-2.93893,-5.95492l-6.57164,-0.95492l4.75528,-4.63525l-1.12257,-6.54508z" fill="#fbbf24" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M324,335l5.87785,-3.09017l-1.12257,6.54508l4.75528,4.63525l-6.57164,0.95492l-2.93893,5.95492l-2.93893,-5.95492l-6.57164,-0.95492l4.75528,-4.63525l-1.12257,-6.54508z" fill="#fbbf24" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M348,335l5.87785,-3.09017l-1.12257,6.54508l4.75528,4.63525l-6.57164,0.95492l-2.93893,5.95492l-2.93893,-5.95492l-6.57164,-0.95492l4.75528,-4.63525l-1.12257,-6.54508z" fill="#fbbf24" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M372,335l5.87785,-3.09017l-1.12257,6.54508l4.75528,4.63525l-6.57164,0.95492l-2.93893,5.95492l-2.93893,-5.95492l-6.57164,-0.95492l4.75528,-4.63525l-1.12257,-6.54508z" fill="#fbbf24" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M396,335l5.87785,-3.09017l-1.12257,6.54508l4.75528,4.63525l-6.57164,0.95492l-2.93893,5.95492l-2.93893,-5.95492l-6.57164,-0.95492l4.75528,-4.63525l-1.12257,-6.54508z" fill="#e5e7eb" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M412,440c-6.62742,0 -12,-5.37258 -12,-12v-96c0,-6.62742 5.37258,-12 12,-12h176c6.62742,0 12,5.37258 12,12v96c0,6.62742 -5.37258,12 -12,12z" fill="#ffffff" stroke="#e5e7eb" stroke-width="1" stroke-linecap="butt"></path><text x="420" y="355" fill="#6366f1" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="24" text-anchor="start">📦</text><text x="420" y="380" fill="#64748b" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="14" text-anchor="start">销量</text><text x="420" y="405" fill="#1e293b" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="28" text-anchor="start">999+</text><path d="M558,380c-4.41828,0 -8,-3.58172 -8,-8v-44c0,-4.41828 3.58172,-8 8,-8h384c4.41828,0 8,3.58172 8,8v44c0,4.41828 -3.58172,8 -8,8z" fill="#ffffff" stroke="#e5e7eb" stroke-width="1" stroke-linecap="butt"></path><text x="565" y="356" fill="#6366f1" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="20" text-anchor="middle">→</text><text x="600" y="345" fill="#1e293b" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="16" text-anchor="start">列表项</text><text x="600" y="365" fill="#64748b" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="12" text-anchor="start">描述</text><path d="M69,438c-10.49341,0 -19,-8.50659 -19,-19v0c0,-10.49341 8.50659,-19 19,-19h11.2c10.49341,0 19,8.50659 19,19v0c0,10.49341 -8.50659,19 -19,19z" fill="#e0e7ff" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="74.6" y="423.66667" fill="#4338ca" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="14" text-anchor="middle">标签1</text><path d="M128.2,438c-10.49341,0 -19,-8.50659 -19,-19v0c0,-10.49341 8.50659,-19 19,-19h11.2c10.49341,0 19,8.50659 19,19v0c0,10.49341 -8.50659,19 -19,19z" fill="#e0e7ff" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="133.8" y="423.66667" fill="#4338ca" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="14" text-anchor="middle">标签2</text><path d="M187.4,438c-10.49341,0 -19,-8.50659 -19,-19v0c0,-10.49341 8.50659,-19 19,-19h11.2c10.49341,0 19,8.50659 19,19v0c0,10.49341 -8.50659,19 -19,19z" fill="#e0e7ff" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="193" y="423.66667" fill="#4338ca" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="14" text-anchor="middle">标签3</text><path d="M220,400h560" fill="none" stroke="#e5e7eb" stroke-width="2" stroke-linecap="butt"></path><path d="M200,400c0,-11.04569 8.95431,-20 20,-20c11.04569,0 20,8.95431 20,20c0,11.04569 -8.95431,20 -20,20c-11.04569,0 -20,-8.95431 -20,-20z" fill="#22c55e" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="220" y="406.66667" fill="#ffffff" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="16" text-anchor="middle">✓</text><text x="220" y="440" fill="#1e293b" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="14" text-anchor="middle">Step 1</text><path d="M500,400c0,-11.04569 8.95431,-20 20,-20c11.04569,0 20,8.95431 20,20c0,11.04569 -8.95431,20 -20,20c-11.04569,0 -20,-8.95431 -20,-20z" fill="#6366f1" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="520" y="406.66667" fill="#ffffff" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="16" text-anchor="middle">2</text><text x="520" y="440" fill="#1e293b" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="14" text-anchor="middle">Step 2</text><path d="M800,400c0,-11.04569 8.95431,-20 20,-20c11.04569,0 20,8.95431 20,20c0,11.04569 -8.95431,20 -20,20c-11.04569,0 -20,-8.95431 -20,-20z" fill="#e5e7eb" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="820" y="406.66667" fill="#ffffff" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="16" text-anchor="middle">3</text><text x="820" y="440" fill="#94a3b8" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="14" text-anchor="middle">Step 3</text><path d="M480,388v60" fill="none" stroke="#e2e8f0" stroke-width="2" stroke-linecap="butt"></path><path d="M472,388c0,-4.41828 3.58172,-8 8,-8c4.41828,0 8,3.58172 8,8c0,4.41828 -3.58172,8 -8,8c-4.41828,0 -8,-3.58172 -8,-8z" fill="#6366f1" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="410" y="393" fill="#94a3b8" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="12" text-anchor="start">2024</text><text x="520" y="393" fill="#1e293b" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="16" text-anchor="start">事件1</text><path d="M472,448c0,-4.41828 3.58172,-8 8,-8c4.41828,0 8,3.58172 8,8c0,4.41828 -3.58172,8 -8,8c-4.41828,0 -8,-3.58172 -8,-8z" fill="#6366f1" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="520" y="453" fill="#1e293b" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="16" text-anchor="start">事件2</text><path d="M58,540c-4.41828,0 -8,-3.58172 -8,-8v-44c0,-4.41828 3.58172,-8 8,-8h64c4.41828,0 8,3.58172 8,8v44c0,4.41828 -3.58172,8 -8,8z" fill="#1a1a2e" stroke="#00d9ff" stroke-width="0.5" stroke-linecap="butt" opacity="0.8"></path><text x="65" y="519" fill="#00ff88" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="28" text-anchor="start">★</text><text x="65" y="548" fill="#ffffff" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="16" text-anchor="start">A</text><path d="M158,540c-4.41828,0 -8,-3.58172 -8,-8v-44c0,-4.41828 3.58172,-8 8,-8h64c4.41828,0 8,3.58172 8,8v44c0,4.41828 -3.58172,8 -8,8z" fill="#1a1a2e" stroke="#00d9ff" stroke-width="0.5" stroke-linecap="butt" opacity="0.8"></path><text x="165" y="519" fill="#00ff88" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="28" text-anchor="start">●</text><text x="165" y="548" fill="#ffffff" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="16" text-anchor="start">B</text><path d="MNaN,500cNaN,0 NaN,NaN NaN,NaN" fill="none" stroke="#e0e0e0" stroke-width="1" stroke-linecap="butt"></path><path d="MNaN,500cNaN,0 NaN,NaN NaN,NaN" fill="none" stroke="#e0e0e0" stroke-width="1" stroke-linecap="butt"></path><path d="M600,400h100" fill="none" stroke="#4ecdc4" stroke-width="2" stroke-linecap="butt"></path><path d="M625,250c0,-13.80712 11.19288,-25 25,-25c13.80712,0 25,11.19288 25,25c0,13.80712 -11.19288,25 -25,25c-13.80712,0 -25,-11.19288 -25,-25z" fill="#6366f1" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M658,436c-4.41828,0 -8,-3.58172 -8,-8v-100c0,-4.41828 3.58172,-8 8,-8h384c4.41828,0 8,3.58172 8,8v100c0,4.41828 -3.58172,8 -8,8z" fill="#f8fafc" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="M650,436v-116h4v116z" fill="#6366f1" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="680" y="358" fill="#6366f1" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="36" text-anchor="start">"</text><text x="700" y="367" fill="#1e293b" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="18" text-anchor="start">引用</text><text x="670" y="395" fill="#64748b" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="14.4" text-anchor="start">— 作者</text><path d="MNaN,NaNcNaN,NaN NaN,NaN NaN,NaNcNaN,NaN NaN,NaN NaN,NaNcNaN,NaN NaN,NaN NaN,NaNcNaN,NaN NaN,NaN NaN,NaNcNaN,NaN NaN,NaN NaN,NaNcNaN,NaN NaN,NaN NaN,NaNcNaN,NaN NaN,NaN NaN,NaNcNaN,NaN NaN,NaN NaN,NaNcNaN,NaN NaN,NaN NaN,NaNcNaN,NaN NaN,NaN NaN,NaNz" fill="none" stroke="none" stroke-width="1" stroke-linecap="butt"></path><path d="MNaN,NaNcNaN,NaN NaN,NaN NaN,NaN" fill="none" stroke="#333333" stroke-width="2" stroke-linecap="butt"></path><path d="M694.8,468c-8.83656,0 -16,-7.16344 -16,-16v-4c0,-8.83656 7.16344,-16 16,-16h10.4c8.83656,0 16,7.16344 16,16v4c0,8.83656 -7.16344,16 -16,16z" fill="#e0e0e0" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="700" y="454" fill="#4ecdc4" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="12" text-anchor="middle">芯片</text><text x="0" y="0" transform="translate(NaN,NaN)" fill-opacity="0.1" fill="#000000" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="48" text-anchor="middle" opacity="0.3">水印</text><path d="M654,NaNc-2.20914,NaN -4,NaN -4,NaNc0,NaN 0,NaN 0,NaNc0,NaN 1.79086,NaN 4,NaNc0,NaN 22.66667,NaN 22.66667,NaNc2.20914,NaN 4,NaN 4,NaNc0,NaN 0,NaN 0,NaNc0,NaN -1.79086,NaN -4,NaNc0,NaN -22.66667,NaN -22.66667,NaNz" fill="#3b82f6" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="0" y="0" transform="translate(NaN,NaN)" fill="#666666" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="12" text-anchor="middle">undefined</text><text x="665.33333" y="542" fill="#333333" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="11" text-anchor="middle"></text><path d="M688.66667,NaNc-2.20914,NaN -4,NaN -4,NaNc0,NaN 0,NaN 0,NaNc0,NaN 1.79086,NaN 4,NaNc0,NaN 22.66667,NaN 22.66667,NaNc2.20914,NaN 4,NaN 4,NaNc0,NaN 0,NaN 0,NaNc0,NaN -1.79086,NaN -4,NaNc0,NaN -22.66667,NaN -22.66667,NaNz" fill="#3b82f6" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="0" y="0" transform="translate(NaN,NaN)" fill="#666666" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="12" text-anchor="middle">undefined</text><text x="700" y="542" fill="#333333" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="11" text-anchor="middle"></text><path d="M723.33333,NaNc-2.20914,NaN -4,NaN -4,NaNc0,NaN 0,NaN 0,NaNc0,NaN 1.79086,NaN 4,NaNc0,NaN 22.66667,NaN 22.66667,NaNc2.20914,NaN 4,NaN 4,NaNc0,NaN 0,NaN 0,NaNc0,NaN -1.79086,NaN -4,NaNc0,NaN -22.66667,NaN -22.66667,NaNz" fill="#3b82f6" stroke="none" stroke-width="1" stroke-linecap="butt"></path><text x="0" y="0" transform="translate(NaN,NaN)" fill="#666666" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="12" text-anchor="middle">undefined</text><text x="734.66667" y="542" fill="#333333" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="11" text-anchor="middle"></text><path d="M200,588v-108h200v108z" fill-opacity="0" fill="#000000" stroke="#e0e0e0" stroke-width="1" stroke-linecap="butt"></path><path d="M200,516v-36h200v36z" fill="#f0f0f0" stroke="#e0e0e0" stroke-width="0.5" stroke-linecap="butt"></path><text x="250" y="502" fill="#333333" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="bold" font-size="13" text-anchor="middle">列1</text><path d="M300,480v108" fill="none" stroke="#e0e0e0" stroke-width="0.5" stroke-linecap="butt"></path><text x="350" y="502" fill="#333333" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="bold" font-size="13" text-anchor="middle">列2</text><path d="M200,516h200" fill="none" stroke="#e0e0e0" stroke-width="0.5" stroke-linecap="butt"></path><text x="250" y="538" fill="#333333" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="12" text-anchor="middle">a</text><text x="350" y="538" fill="#333333" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="12" text-anchor="middle">b</text><path d="M200,588v-36h200v36z" fill="#fafafa" stroke="#e0e0e0" stroke-width="0.5" stroke-linecap="butt"></path><path d="M200,552h200" fill="none" stroke="#e0e0e0" stroke-width="0.5" stroke-linecap="butt"></path><text x="250" y="574" fill="#333333" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="12" text-anchor="middle">c</text><text x="350" y="574" fill="#333333" stroke="none" stroke-width="1" stroke-linecap="butt" font-family="sans-serif" font-weight="normal" font-size="12" text-anchor="middle">d</text></g></svg>