@bytechain.cn/colamd 1.5.0 → 1.5.1-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/.trae/specs/optimize-theme-loading/checklist.md +20 -0
  2. package/.trae/specs/optimize-theme-loading/spec.md +103 -0
  3. package/.trae/specs/optimize-theme-loading/tasks.md +40 -0
  4. package/CHANGELOG.md +323 -0
  5. package/CLAUDE.md +56 -0
  6. package/README.md +422 -26
  7. package/README_CN.md +480 -28
  8. package/android/app/build/.npmkeep +0 -0
  9. package/android/app/build.gradle +76 -0
  10. package/android/app/capacitor.build.gradle +24 -0
  11. package/android/app/proguard-rules.pro +21 -0
  12. package/android/app/release.keystore +0 -0
  13. package/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java +26 -0
  14. package/android/app/src/main/AndroidManifest.xml +64 -0
  15. package/android/app/src/main/java/cn/bytechain/colamd/MainActivity.java +180 -0
  16. package/android/app/src/main/res/drawable/ic_launcher_background.xml +170 -0
  17. package/android/app/src/main/res/drawable/splash.png +0 -0
  18. package/android/app/src/main/res/drawable-land-hdpi/splash.png +0 -0
  19. package/android/app/src/main/res/drawable-land-mdpi/splash.png +0 -0
  20. package/android/app/src/main/res/drawable-land-xhdpi/splash.png +0 -0
  21. package/android/app/src/main/res/drawable-land-xxhdpi/splash.png +0 -0
  22. package/android/app/src/main/res/drawable-land-xxxhdpi/splash.png +0 -0
  23. package/android/app/src/main/res/drawable-port-hdpi/splash.png +0 -0
  24. package/android/app/src/main/res/drawable-port-mdpi/splash.png +0 -0
  25. package/android/app/src/main/res/drawable-port-xhdpi/splash.png +0 -0
  26. package/android/app/src/main/res/drawable-port-xxhdpi/splash.png +0 -0
  27. package/android/app/src/main/res/drawable-port-xxxhdpi/splash.png +0 -0
  28. package/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +34 -0
  29. package/android/app/src/main/res/layout/activity_main.xml +12 -0
  30. package/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +5 -0
  31. package/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +5 -0
  32. package/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  33. package/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png +0 -0
  34. package/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  35. package/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  36. package/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png +0 -0
  37. package/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  38. package/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  39. package/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png +0 -0
  40. package/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  41. package/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  42. package/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png +0 -0
  43. package/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  44. package/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  45. package/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png +0 -0
  46. package/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  47. package/android/app/src/main/res/values/ic_launcher_background.xml +4 -0
  48. package/android/app/src/main/res/values/strings.xml +7 -0
  49. package/android/app/src/main/res/values/styles.xml +22 -0
  50. package/android/app/src/main/res/xml/file_paths.xml +5 -0
  51. package/android/app/src/main/res/xml/network_security_config.xml +8 -0
  52. package/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java +18 -0
  53. package/android/build.gradle +29 -0
  54. package/android/capacitor.settings.gradle +21 -0
  55. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  56. package/android/gradle/wrapper/gradle-wrapper.properties +7 -0
  57. package/android/gradle.properties +22 -0
  58. package/android/gradlew +248 -0
  59. package/android/gradlew.bat +92 -0
  60. package/android/settings.gradle +5 -0
  61. package/android/variables.gradle +16 -0
  62. package/bytechain.cn-colamd-1.5.1-beta.2.tgz +0 -0
  63. package/capacitor.config.js +29 -0
  64. package/capacitor.config.ts +30 -0
  65. package/demo.md +191 -484
  66. package/dist/main/index.js +77 -46
  67. package/dist/renderer/assets/{arc-tTbbM8LO.js → arc-CPdeInCG.js} +1 -1
  68. package/dist/renderer/assets/{architectureDiagram-3BPJPVTR-CEgYow6c.js → architectureDiagram-3BPJPVTR-BAbnaR9G.js} +4 -3
  69. package/dist/renderer/assets/{blockDiagram-GPEHLZMM-LHyVtPwW.js → blockDiagram-GPEHLZMM-CYSWjnJg.js} +5 -4
  70. package/dist/renderer/assets/{c4Diagram-AAUBKEIU-C1P1eJrf.js → c4Diagram-AAUBKEIU-Rb1tstnr.js} +3 -2
  71. package/dist/renderer/assets/{channel-upve91Tq.js → channel-DpG2A6fE.js} +1 -1
  72. package/dist/renderer/assets/{chunk-2J33WTMH-lag2vhq9.js → chunk-2J33WTMH-DFc0Jxy_.js} +1 -1
  73. package/dist/renderer/assets/{chunk-4BX2VUAB-BXJ8Ggh-.js → chunk-4BX2VUAB-BhRxDTNn.js} +1 -1
  74. package/dist/renderer/assets/{chunk-55IACEB6-CiBpxRa1.js → chunk-55IACEB6-DEgMVBk8.js} +1 -1
  75. package/dist/renderer/assets/{chunk-727SXJPM-ODeKQFXC.js → chunk-727SXJPM-bjBIfiz8.js} +5 -5
  76. package/dist/renderer/assets/{chunk-AQP2D5EJ-BK7xJolB.js → chunk-AQP2D5EJ-DwQMzTzD.js} +3 -3
  77. package/dist/renderer/assets/{chunk-FMBD7UC4-BxpCZPtz.js → chunk-FMBD7UC4-CkphwJzs.js} +1 -1
  78. package/dist/renderer/assets/{chunk-ND2GUHAM-CqqaU9Ue.js → chunk-ND2GUHAM-oU09z4y4.js} +1 -1
  79. package/dist/renderer/assets/{chunk-QZHKN3VN-Biq_K124.js → chunk-QZHKN3VN-rCbVuPBn.js} +1 -1
  80. package/dist/renderer/assets/{classDiagram-v2-Q7XG4LA2-Cq95X99o.js → classDiagram-4FO5ZUOK-DGS2faoM.js} +7 -6
  81. package/dist/renderer/assets/{classDiagram-4FO5ZUOK-Cq95X99o.js → classDiagram-v2-Q7XG4LA2-DGS2faoM.js} +7 -6
  82. package/dist/renderer/assets/{cose-bilkent-S5V4N54A-XasiD0bu.js → cose-bilkent-S5V4N54A-iqY6-EwA.js} +2 -1
  83. package/dist/renderer/assets/{dagre-BM42HDAG-Nq84Gfx4.js → dagre-BM42HDAG-5t3X5sDa.js} +4 -3
  84. package/dist/renderer/assets/{diagram-2AECGRRQ-DwuB1GWt.js → diagram-2AECGRRQ-DzHiYDPh.js} +4 -3
  85. package/dist/renderer/assets/{diagram-5GNKFQAL-C2tgeI1h.js → diagram-5GNKFQAL-BiNv6Keq.js} +5 -4
  86. package/dist/renderer/assets/{diagram-KO2AKTUF-D5KzjNBc.js → diagram-KO2AKTUF-ClzeDG6f.js} +4 -3
  87. package/dist/renderer/assets/{diagram-LMA3HP47-C12xHS1c.js → diagram-LMA3HP47-CGkw7wII.js} +4 -3
  88. package/dist/renderer/assets/{diagram-OG6HWLK6-CnxI9oEa.js → diagram-OG6HWLK6-Dl-Hyk1_.js} +5 -4
  89. package/dist/renderer/assets/{erDiagram-TEJ5UH35-D_uPaKwn.js → erDiagram-TEJ5UH35-BxUN79Qb.js} +5 -4
  90. package/dist/renderer/assets/{flowDiagram-I6XJVG4X-B6q_1-tE.js → flowDiagram-I6XJVG4X-CzFk-KNI.js} +7 -6
  91. package/dist/renderer/assets/{ganttDiagram-6RSMTGT7-CFo7ifF9.js → ganttDiagram-6RSMTGT7-C2xl6Igx.js} +3 -2
  92. package/dist/renderer/assets/{gitGraphDiagram-PVQCEYII-WSexHTnq.js → gitGraphDiagram-PVQCEYII-_fn7XCa7.js} +5 -4
  93. package/dist/renderer/assets/{graph-DyX_9f6d.js → graph-CDoHYrHm.js} +1 -1
  94. package/dist/renderer/assets/index-B4uDgADr.js +530 -0
  95. package/dist/renderer/assets/index-CBcVpA3d.js +30 -0
  96. package/dist/renderer/assets/index-CGj1spkU.js +27 -0
  97. package/dist/renderer/assets/{index-dyHEFYvY.css → index-CeFpoCKV.css} +443 -400
  98. package/dist/renderer/assets/index-D4CPFkph.js +9 -0
  99. package/dist/renderer/assets/{index-DW7LS8C1.js → index-DAlXyxzt.js} +1183 -346
  100. package/dist/renderer/assets/index-DxOzbfR-.js +110 -0
  101. package/dist/renderer/assets/index-Y89U1ptl.js +9 -0
  102. package/dist/renderer/assets/{infoDiagram-5YYISTIA-DaeJdLRq.js → infoDiagram-5YYISTIA-DL6XIxLz.js} +3 -2
  103. package/dist/renderer/assets/{ishikawaDiagram-YF4QCWOH-DDCZc35f.js → ishikawaDiagram-YF4QCWOH-BUZLjRo-.js} +2 -1
  104. package/dist/renderer/assets/{journeyDiagram-JHISSGLW-BEdmpAgl.js → journeyDiagram-JHISSGLW-C4rH_mQM.js} +5 -4
  105. package/dist/renderer/assets/{kanban-definition-UN3LZRKU-BEFtQcFb.js → kanban-definition-UN3LZRKU-DRbrBcWV.js} +3 -2
  106. package/dist/renderer/assets/{layout-CAJgQHdw.js → layout-DZl4n4qu.js} +2 -2
  107. package/dist/renderer/assets/{linear-B2ggJ8Am.js → linear-B0Krxg21.js} +1 -1
  108. package/dist/renderer/assets/{mindmap-definition-RKZ34NQL-DSxVgHB5.js → mindmap-definition-RKZ34NQL-DdmPsWrn.js} +4 -3
  109. package/dist/renderer/assets/{pieDiagram-4H26LBE5-CwYoJBuL.js → pieDiagram-4H26LBE5-BPZLqwG0.js} +5 -4
  110. package/dist/renderer/assets/preload-helper-tXtZnHb0.js +88 -0
  111. package/dist/renderer/assets/{quadrantDiagram-W4KKPZXB-CST9Fvg9.js → quadrantDiagram-W4KKPZXB-Dr-oWRk9.js} +3 -2
  112. package/dist/renderer/assets/{requirementDiagram-4Y6WPE33-DtrH52jS.js → requirementDiagram-4Y6WPE33-B6QZd0lo.js} +4 -3
  113. package/dist/renderer/assets/{sankeyDiagram-5OEKKPKP-ca1tPzJ_.js → sankeyDiagram-5OEKKPKP-Cyl9ojEt.js} +2 -1
  114. package/dist/renderer/assets/{sequenceDiagram-3UESZ5HK-Dfp1EJZ7.js → sequenceDiagram-3UESZ5HK-D48Yr9T6.js} +4 -3
  115. package/dist/renderer/assets/{stateDiagram-AJRCARHV-Bha2QoNB.js → stateDiagram-AJRCARHV-qyb8ETsa.js} +7 -6
  116. package/dist/renderer/assets/{stateDiagram-v2-BHNVJYJU-DWgFUYu1.js → stateDiagram-v2-BHNVJYJU-DmDOyyrJ.js} +5 -4
  117. package/dist/renderer/assets/{timeline-definition-PNZ67QCA-C3h_-OTj.js → timeline-definition-PNZ67QCA-C-KQxTi1.js} +3 -2
  118. package/dist/renderer/assets/{vennDiagram-CIIHVFJN-DFzjSrZi.js → vennDiagram-CIIHVFJN-BdaZlnH-.js} +2 -1
  119. package/dist/renderer/assets/{wardley-L42UT6IY-Cx-VbqoS.js → wardley-L42UT6IY-b-_GPpqL.js} +1 -1
  120. package/dist/renderer/assets/{wardleyDiagram-YWT4CUSO-S2D9XqX6.js → wardleyDiagram-YWT4CUSO-B2hBE-EE.js} +4 -3
  121. package/dist/renderer/assets/web-BKE0SH0E.js +36 -0
  122. package/dist/renderer/assets/web-CBsFp24u.js +564 -0
  123. package/dist/renderer/assets/web-Dc8YgoHP.js +24 -0
  124. package/dist/renderer/assets/web-TfDzToU7.js +58 -0
  125. package/dist/renderer/assets/{xychartDiagram-2RQKCTM6-Cfxigbts.js → xychartDiagram-2RQKCTM6-CSvswDTY.js} +3 -2
  126. package/dist/renderer/index.html +62 -3
  127. package/docs/academic-demo.md +566 -0
  128. package/docs/demo.html +748 -0
  129. package/docs/demo.md +546 -0
  130. package/docs/demo.pdf +0 -0
  131. package/docs/theme-paradigm.md +658 -0
  132. package/electron-builder.yml +7 -0
  133. package/electron.vite.config.js +31 -0
  134. package/electron.vite.config.ts +1 -1
  135. package/ios/App/App/AppDelegate.swift +49 -0
  136. package/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png +0 -0
  137. package/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json +14 -0
  138. package/ios/App/App/Assets.xcassets/Contents.json +6 -0
  139. package/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json +23 -0
  140. package/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png +0 -0
  141. package/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png +0 -0
  142. package/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png +0 -0
  143. package/ios/App/App/Base.lproj/LaunchScreen.storyboard +32 -0
  144. package/ios/App/App/Base.lproj/Main.storyboard +19 -0
  145. package/ios/App/App/Info.plist +49 -0
  146. package/ios/App/App.xcodeproj/project.pbxproj +408 -0
  147. package/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  148. package/ios/App/Podfile +28 -0
  149. package/package.json +23 -3
  150. package/resources/templates/slides/template-forest-ink.html +540 -0
  151. package/scripts/generate-icons.js +102 -0
  152. package/src/main/index.ts +87 -63
  153. package/src/preload/index.d.ts +51 -0
  154. package/src/preload/index.js +70 -0
  155. package/src/renderer/capacitor-api.ts +713 -0
  156. package/src/renderer/editor/editor.ts +87 -4
  157. package/src/renderer/editor/plugins/index.ts +24 -32
  158. package/src/renderer/editor/plugins/math-plugin.ts +1 -1
  159. package/src/renderer/editor/plugins/mermaid-plugin-custom.css +13 -398
  160. package/src/renderer/editor/plugins/mermaid-plugin.ts +62 -71
  161. package/src/renderer/editor/plugins/themes/base/dark.css +23 -0
  162. package/src/renderer/editor/plugins/themes/base/elegant.css +32 -0
  163. package/src/renderer/editor/plugins/themes/base/light.css +20 -0
  164. package/src/renderer/editor/plugins/themes/base/newsprint.css +27 -0
  165. package/src/renderer/editor/plugins/themes/components/mermaid/academic.css +43 -0
  166. package/src/renderer/editor/plugins/themes/components/mermaid/dark.css +20 -0
  167. package/src/renderer/editor/plugins/themes/components/mermaid/elegant.css +24 -0
  168. package/src/renderer/editor/plugins/themes/components/mermaid/light.css +21 -0
  169. package/src/renderer/editor/plugins/themes/components/mermaid/newsprint.css +26 -0
  170. package/src/renderer/editor/plugins/themes/components/mermaid/variables.css +592 -0
  171. package/src/renderer/editor/plugins/themes/foundation.css +143 -0
  172. package/src/renderer/editor/plugins/themes/theme-manager.ts +92 -0
  173. package/src/renderer/env.d.ts +4 -1
  174. package/src/renderer/index.html +59 -1
  175. package/src/renderer/main.ts +432 -57
  176. package/src/renderer/mobile.css +429 -0
  177. package/themes/README.md +3 -0
  178. package/themes/academic-paper.css +1321 -0
  179. package/themes/elegant.css +14 -7
  180. package/themes/forest-ink.css +664 -0
  181. package/themes/pixso-design.css +1261 -0
  182. package/themes/swiss-design.css +596 -0
  183. package/themes/template.css +498 -0
  184. package/tsconfig.main.json +1 -0
  185. package/tsconfig.main.tsbuildinfo +1 -0
  186. package/tsconfig.preload.json +1 -0
  187. package/tsconfig.preload.tsbuildinfo +1 -0
  188. package/tsconfig.renderer.json +1 -0
  189. package/tsconfig.renderer.tsbuildinfo +1 -0
  190. package/tsconfig.tsbuildinfo +1 -0
  191. package/.trae/documents/fix-mermaid-colors-and-sankey.md +0 -50
  192. package/src/renderer/themes/theme-manager.ts +0 -40
  193. /package/src/renderer/{themes → editor/plugins/themes}/base.css +0 -0
package/README_CN.md CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
  **本扩展版仓库**: [git@github.com:byteuser1977/ColaMD-extend.git](https://github.com/byteuser1977/ColaMD-extend)
13
13
 
14
- [功能特性](#功能特性) | [显示插件](#显示插件系统) | [Plug 菜单](#plug-菜单--插件渲染控制) | [快速开始](#快速开始) | [主题系统](#主题系统) | [技术架构](#技术架构) | [English](README.md)
14
+ [功能特性](#功能特性) | [显示插件](#显示插件系统) | [Plug 菜单](#plug-菜单--插件渲染控制) | [快速开始](#快速开始) | [移动端构建](#移动端构建--capacitor-6) | [主题系统](#主题系统) | [技术架构](#技术架构) | [English](README.md)
15
15
 
16
16
  ***
17
17
 
@@ -38,18 +38,50 @@ AI Agent 正在改变我们的工作方式。它们编辑文件、生成文档
38
38
  | 公式支持 | ❌ | ✅ KaTeX 行内/块级公式,实时编辑,PNG 导出 |
39
39
  | 图表支持 | ❌ | ✅ Mermaid 全类型图表(17+ 种),多主题适配,PNG 导出 |
40
40
  | 双模式切换 | N/A | ✅ 每个插件均支持 **渲染模式 / 源码编辑模式** 一键切换 |
41
+ | 移动端平台 | ❌ 仅桌面端 | ✅ **Android (.apk) + iOS (.ipa)** 通过 Capacitor 6 实现 |
41
42
 
42
43
  > 原版所有功能完整保留:Agent 实时同步、活动指示器、所见即所得编辑器、幻灯片系统、主题与导出等。
43
44
 
44
45
  ### 演示文档
45
46
 
46
- 本项目包含一份完整的演示文档 [`demo.md`](demo.md),涵盖:
47
+ 本项目包含多份演示文档,全面展示插件能力:
48
+
49
+ #### 通用演示 — [`demo.md`](docs/demo.md)
50
+
51
+ 一份综合性演示文档,涵盖:
47
52
 
48
53
  - **Math 公式**:7 个行内公式 + 6 个块级公式(含方程组、矩阵、物理公式等)
49
54
  - **Mermaid 图表**:17 种图表类型全部覆盖(流程图、时序图、类图、状态图、ER 图、甘特图、饼图、用户旅程图、Git 图、思维导图、时间线、四象限图、XY 图表、C4 架构图、Sankey 图、Block 图、复杂聚群图)
50
55
  - **混合内容**:公式与图表在同一文档中协同渲染
51
56
 
52
- 打开 `demo.md` 即可全面测试 ColaMD 扩展版的插件渲染、模式切换、源码编辑和 PNG 导出功能。
57
+ ColaMD 中打开 [`demo.md`](docs/demo.md) 即可全面测试插件渲染、模式切换、源码编辑和 PNG 导出功能:
58
+
59
+ ```bash
60
+ # 方式一:命令行启动时直接打开
61
+ npm run dev docs/demo.md
62
+
63
+ # 方式二:在 ColaMD 中使用菜单打开
64
+ # File → Open... → 选择 docs/demo.md
65
+
66
+ # 方式三:在 ColaMD 编辑器中 Cmd+点击 demo.md 链接
67
+ # 直接在浏览器中查看源码:https://github.com/byteuser1977/ColaMD-extend/blob/main/docs/demo.md
68
+ ```
69
+
70
+ #### 学术论文演示 — [`academic-demo.md`](docs/academic-demo.md) 🆕
71
+
72
+ 一份真实的学术论文示例,展示增强版**学术论文主题**(`academic-paper.css`)的完整效果:
73
+
74
+ - **完整学术结构**:摘要、关键词、中图分类号、文献标识码、引言、方法论、表格、参考文献
75
+ - **符合 GB/T 7713 规范**:遵循中文学术论文排版标准,正确的字体搭配(黑体标题 + 宋体正文)
76
+ - **三线表格式**:学术标准表格样式(顶线 + 表头底线 + 底线,无竖线)
77
+ - **Mermaid 图表**:复杂的组织架构图,采用打印优化的自定义配色方案
78
+ - **混合内容**:数学公式、Mermaid 图表、表格、引用在同一文档中协同展示
79
+
80
+ 在 ColaMD 中打开 [`academic-demo.md`](docs/academic-demo.md) 并启用**学术论文主题**,即可看到完整效果。本演示文档展示了:
81
+ - 专业学术排版(黑体标题、宋体正文、首行缩进)
82
+ - 打印优化的 Mermaid 图表渲染
83
+ - 学术场景下的代码块和引用块样式
84
+ - 脚注与参考文献区域格式化
53
85
 
54
86
  ***
55
87
 
@@ -108,9 +140,54 @@ page: YOUR NAME
108
140
 
109
141
  ### 📤 导出能力
110
142
 
111
- - **PDF / HTML 导出**
112
- - **幻灯片导出** — 单文件 HTML(图片 Base64 内联)或文件夹形式(含视频资源)
113
- - **公式 / 图表 PNG 导出** — 右键菜单一键导出为高清 PNG 图片(2x 缩放)
143
+ ColaMD 提供多种导出方式,满足不同场景需求:
144
+
145
+ #### 导出为 HTML
146
+
147
+ **菜单路径**:File → Export HTML...
148
+
149
+ 将当前编辑器内容导出为**独立 HTML 文件**,特性包括:
150
+
151
+ - **主题完整保留** — 导出文件包含当前主题的所有 CSS 变量(背景色、文字色、代码块配色、引用样式等),打开即可还原编辑器中的视觉效果
152
+ - **公式渲染保留** — KaTeX 渲染的数学公式以 HTML+CSS 形式完整保留,通过 CDN 引入 KaTeX 样式表
153
+ - **Mermaid 图表内联** — 渲染后的 SVG 图表直接嵌入 HTML,无需额外依赖,离线可查看
154
+ - **排版优化** — 正文最大宽度 780px 居中排版,行高 1.75,代码块圆角样式,表格边框等细节完整
155
+ - **零依赖分享** — 生成的 HTML 文件可直接用浏览器打开,无需安装任何软件
156
+
157
+ **使用方法**:
158
+
159
+ 1. 在 ColaMD 中打开 `.md` 文件
160
+ 2. 点击菜单 **File → Export HTML...**
161
+ 3. 选择保存路径,即可生成 `.html` 文件
162
+
163
+ > 💡 移动端(Android/iOS)导出 HTML 后会自动调用系统分享面板,可直接发送到微信、邮件等应用。
164
+
165
+ #### 导出为 PDF
166
+
167
+ **菜单路径**:File → Export PDF...
168
+
169
+ 将当前编辑器内容导出为 **A4 尺寸 PDF 文件**,特性包括:
170
+
171
+ - **所见即所得** — 导出内容与编辑器中看到的完全一致,包括数学公式和 Mermaid 图表
172
+ - **A4 分页** — 使用 `@page { margin: 15mm; size: A4 }` 规范分页,适合打印
173
+ - **背景色保留** — 通过 `printBackground: true` 确保深色主题导出时背景色不丢失
174
+ - **智能隐藏** — 导出时自动隐藏加载占位符和错误提示,确保输出干净
175
+
176
+ **使用方法**:
177
+
178
+ 1. 在 ColaMD 中打开 `.md` 文件
179
+ 2. 点击菜单 **File → Export PDF...**
180
+ 3. 选择保存路径,即可生成 `.pdf` 文件
181
+
182
+ > 💡 移动端(Android)导出 PDF 时会调用系统打印对话框,可选择"保存为 PDF"生成文件。
183
+
184
+ #### 幻灯片导出
185
+
186
+ - **File → Export Slides...** — 导出可分享版本(单文件 HTML 或含视频的文件夹)
187
+
188
+ #### 公式 / 图表 PNG 导出
189
+
190
+ - **右键菜单** — 右键点击公式或图表,选择"Save as PNG"一键导出为高清 PNG 图片(2x 缩放)
114
191
 
115
192
  ### 🎨 主题与跨平台(继承自原版)
116
193
 
@@ -239,6 +316,7 @@ graph TD
239
316
  | **Dark** | GitHub Dark | 系统默认 | `#0d1117` 背景, `#8b949e` 边框文字 |
240
317
  | **Elegant** | 自定义暖色系 | 霞鹜文楷 | `#e8e2db` 背景, 暖棕色调 cScale |
241
318
  | **Newsprint** | 印刷风格 | PT Serif | 衬线字体, 新闻纸质感 |
319
+ | **Forest Ink** (自定义) | 森林墨绿系 | Noto Serif SC | `#f5f1e8` 宣纸底, `#3d6b4a` 森林绿强调, 墨绿连线 |
242
320
 
243
321
  ---
244
322
 
@@ -377,6 +455,218 @@ npm run dist:linux # Linux (.AppImage / .deb)
377
455
  | macOS | `.dmg` |
378
456
  | Windows | `.exe` |
379
457
  | Linux | `.AppImage` / `.deb` |
458
+ | Android | `.apk`(通过 Capacitor 构建) |
459
+ | iOS | `.ipa`(通过 Capacitor 构建,需 Xcode) |
460
+
461
+ ---
462
+
463
+ ## 移动端构建 — Capacitor 6
464
+
465
+ > 从 v1.5.1 起,ColaMD 支持通过 **[Capacitor 6](https://capacitorjs.com/)** 构建原生移动应用 — Ionic 出品的跨平台运行时。驱动 Electron 桌面端的同一套代码,现在也能运行在 Android 和 iOS 设备上。
466
+
467
+ ### 架构:双平台桥接层
468
+
469
+ ColaMD 采用 **自动检测桥接层**,在运行时无缝切换 Electron(桌面端)和 Capacitor(移动端)API:
470
+
471
+ ```
472
+ ┌─────────────────────────────────────┐
473
+ │ src/renderer/main.ts │
474
+ │ api = electronAPI || capacitorAPI │ ← 自动检测运行环境
475
+ ├──────────────┬──────────────────────┤
476
+ │ Electron │ Capacitor 6 │
477
+ │ (桌面端) │ (移动端) │
478
+ │ │ │
479
+ │ IPC 通信 │ Filesystem Plugin │
480
+ │ dialog │ Share Plugin │
481
+ │ shell.open │ App Plugin │
482
+ │ fs 模块 │ localStorage 存储 │
483
+ └──────────────┴──────────────────────┘
484
+ ```
485
+
486
+ **核心文件**:
487
+ - [`capacitor-api.ts`](src/renderer/capacitor-api.ts) — 完整的 Capacitor 桥接层,实现与 `electronAPI` 相同的 API 接口
488
+ - [`capacitor.config.ts`](capacitor.config.ts) — Capacitor 配置文件(appId、webDir、插件设置)
489
+ - [`mobile.css`](src/renderer/mobile.css) — 触控优化的响应式样式
490
+ - [`MainActivity.java`](android/app/src/main/java/cn/bytechain/colamd/MainActivity.java) — Android WebView 中文输入法支持
491
+
492
+ ### 移动端技术栈
493
+
494
+ | 组件 | 技术 | 用途 |
495
+ |------|------|------|
496
+ | **运行时** | Capacitor 6.x | 跨平台原生桥接 |
497
+ | **WebView 引擎** | Android WebView / iOS WKWebView | 渲染 Web 内容 |
498
+ | **文件访问** | `@capacitor/filesystem` | 读写本地文件 |
499
+ | **文件选择器** | `@capawesome/capacitor-file-picker` | 原生文件选择对话框 |
500
+ | **分享** | `@capacitor/share` | 系统分享面板集成 |
501
+ | **应用生命周期** | `@capacitor/app` | 处理应用事件(暂停、恢复) |
502
+ | **状态栏** | `@capacitor/status-bar` | 状态栏样式控制 |
503
+ | **触觉反馈** | `@capacitor/haptics` | 触觉反馈 |
504
+
505
+ ### 移动端构建环境要求
506
+
507
+ | 平台 | 环境要求 |
508
+ |------|----------|
509
+ | **Android** | Android Studio + SDK (API 34+) + **Java 21** (`brew install openjdk@21`) |
510
+ | **iOS** | Xcode 15+ + CocoaPods + macOS |
511
+
512
+ ### 快速开始 — Android
513
+
514
+ ```bash
515
+ # 1. 安装依赖(包含 Capacitor 相关包)
516
+ npm install
517
+
518
+ # 2. 构建前端 Web 资源
519
+ npm run build
520
+
521
+ # 3. 同步到 Android 平台
522
+ npx cap sync android
523
+
524
+ # 4. 用 Android Studio 打开项目
525
+ npx cap open android
526
+
527
+ # 5. 或直接构建 APK
528
+ npm run cap:build:android
529
+ # 输出路径:android/app/build/outputs/apk/debug/app-debug.apk
530
+ ```
531
+
532
+ ### 快速开始 — iOS
533
+
534
+ ```bash
535
+ # 1. 同步到 iOS 平台
536
+ npx cap sync ios
537
+
538
+ # 2. 用 Xcode 打开项目
539
+ npx cap open ios
540
+
541
+ # 3. 在 Xcode 中构建(⌘R)或使用:
542
+ npm run cap:build:ios
543
+ ```
544
+
545
+ ### 构建命令
546
+
547
+ | 命令 | 说明 | 输出 |
548
+ |------|------|------|
549
+ | `npm run cap:sync` | 同步 Web 资源到所有原生平台 | 更新 `android/` 和 `ios/` |
550
+ | `npm run cap:open:android` | 用 Android Studio 打开 Android 项目 | — |
551
+ | `npm run cap:open:ios` | 用 Xcode 打开 iOS 项目 | — |
552
+ | `npm run cap:run:android` | 构建 → 同步 → 在设备/模拟器上运行 | 设备上的实时应用 |
553
+ | `npm run cap:run:ios` | 构建 → 同步 → 在模拟器上运行 | 模拟器中的实时应用 |
554
+ | `npm run cap:build:android` | 构建 **Debug APK** | `android/app/build/outputs/apk/debug/app-debug.apk` |
555
+ | `npm run cap:build:android:release` | 构建 **Release APK**(已签名) | `android/app/build/outputs/apk/release/app-release.apk` |
556
+ | `npm run cap:build:ios` | 准备 iOS 项目供 Xcode 构建 | — |
557
+
558
+ ### Release 构建 — Android
559
+
560
+ 生产环境发布版本构建,项目已包含签名配置:
561
+
562
+ ```bash
563
+ # 构建已签名的 Release APK
564
+ npm run cap:build:android:release
565
+
566
+ # 输出位置
567
+ android/app/build/outputs/apk/release/app-release.apk
568
+ ```
569
+
570
+ Release 签名密钥位于 `android/app/release.keystore`,签名凭据存储在 `build.gradle` 中。
571
+
572
+ ### Release 构建 — iOS
573
+
574
+ 1. 在 Xcode 中打开项目:
575
+ ```bash
576
+ npx cap open ios
577
+ ```
578
+
579
+ 2. 在 Xcode 中:
580
+ - 选择 **Product → Archive**
581
+ - 归档完成后,点击 **Distribute App**
582
+ - 选择分发方式(App Store Connect、Ad Hoc 等)
583
+
584
+ 3. 提交到 App Store:
585
+ - 在 Xcode 中配置签名证书
586
+ - 通过 Xcode 或 Transporter 上传到 App Store Connect
587
+
588
+ ### 中文输入法支持(Android)
589
+
590
+ ColaMD 针对 Android WebView 上的中文/日文/韩文输入法进行了特殊处理:
591
+
592
+ **实现方式**([`MainActivity.java`](android/app/src/main/java/cn/bytechain/colamd/MainActivity.java)):
593
+ - WebView 焦点优化,确保 IME 正确连接
594
+ - 获得焦点时自动弹出软键盘
595
+ - 启用触控模式的焦点能力
596
+
597
+ **已知限制**:
598
+ - ProseMirror/Milkdown 在 Android WebView 上存在已知的 IME 组合输入问题
599
+ - 部分输入法可能需要点击编辑区域才能激活
600
+ - 如果输入无响应,尝试点击其他区域后再回到编辑器
601
+
602
+ ### 文件选择器集成
603
+
604
+ 移动端使用 `@capawesome/capacitor-file-picker` 实现原生文件选择:
605
+
606
+ ```typescript
607
+ // 内部使用示例
608
+ const result = await FilePicker.pickFiles({
609
+ types: ['text/markdown', 'text/plain'],
610
+ multiple: false,
611
+ readData: true,
612
+ })
613
+ ```
614
+
615
+ **支持的文件类型**:`.md`、`.markdown`、`.txt`、`.css`(主题文件)
616
+
617
+ ### 移动端功能支持情况
618
+
619
+ | 功能 | 状态 | 说明 |
620
+ |------|------|------|
621
+ | Markdown 编辑 ✏️ | ✅ 完整支持 | Milkdown 编辑器在 WebView 中正常运行 |
622
+ | 数学公式渲染 (KaTeX) 📐 | ✅ 完整支持 | 与桌面端一致 |
623
+ | Mermaid 图表渲染 🔀 | ✅ 完整支持 | SVG 在 WebView 中正常渲染 |
624
+ | 插件系统 | ✅ 完整支持 | 通过 UI 切换,状态存储于 localStorage |
625
+ | 主题系统 | ✅ 完整支持 | 所有主题在移动端均可正常工作 |
626
+ | 文件打开/保存 | ✅ 支持 | 通过 FilePicker 插件使用原生文件选择器 |
627
+ | 中文/日文/韩文输入 | ⚠️ 部分支持 | 已实现 IME 支持,可能存在边缘情况 |
628
+ | 导出 HTML/PDF | ⚠️ 部分支持 | HTML 导出正常;PDF 使用 `window.print()` |
629
+ | Agent 文件监听 | ⚠️ 轮询模式 | 使用 2 秒间隔轮询替代 `fs.watch` |
630
+ | 幻灯片预览 | ⚠️ 受限 | 桌面端打开新浏览器窗口;移动端基础可用 |
631
+ | 外部链接 | ✅ 支持 | 通过 `_system` target 在系统浏览器中打开 |
632
+
633
+ ### 响应式设计
634
+
635
+ 移动端 CSS ([`mobile.css`](src/renderer/mobile.css)) 提供:
636
+
637
+ - **触控优化**:禁用点击高亮、正确的 touch-action 行为
638
+ - **安全区域适配**:自动为刘海屏设备添加内边距(iPhone X+、现代 Android)
639
+ - **响应式断点**:
640
+ - ≤768px:平板布局调整
641
+ - ≤480px:手机布局,更小的字号
642
+ - **编辑器适配**:固定定位编辑器填充标题栏下方视口
643
+ - **滚动行为**:`-webkit-overflow-scrolling: touch` 实现流畅滚动
644
+ - **右键菜单**:触控友好的更大点击区域(12px 内边距、15px 字号)
645
+
646
+ ### 移动端问题排查
647
+
648
+ **中文输入无法使用**:
649
+ - 点击编辑区域确保获得焦点
650
+ - 尝试切换到其他应用再切回来
651
+ - 检查软键盘是否可见
652
+
653
+ **文件选择器无法打开**:
654
+ - 确保已授予存储权限
655
+ - Android 11+ 上,检查存储权限是否设为"始终允许"
656
+
657
+ **应用启动崩溃**:
658
+ - 运行 `npx cap sync android` 确保使用最新的 Web 资源
659
+ - 在 Android Studio 中查看 logcat 错误日志
660
+ - 确认 Java 21 配置正确
661
+
662
+ **构建失败**:
663
+ ```bash
664
+ # 清理并重新构建
665
+ cd android
666
+ ./gradlew clean
667
+ cd ..
668
+ npm run cap:build:android
669
+ ```
380
670
 
381
671
  ---
382
672
 
@@ -391,32 +681,57 @@ ColaMD 内置 **4 个主题**,所有显示插件均会跟随主题自动适配
391
681
  | **Elegant** | `theme-elegant` | 优雅主题,暖色衬线体风格(默认主题) |
392
682
  | **Newsprint** | `theme-newsprint` | 新闻印刷风格 |
393
683
 
394
- 自定义主题支持:将 CSS 文件放入 `~/.colamd/themes/` 目录,通过 **Theme > Import Theme** 导入。导入的主题会持久化保存,重启后仍然可用。
684
+ 可下载的外置主题(位于 [`themes/`](themes/) 目录):
395
685
 
396
- [`themes/`](themes/) 文件夹可以下载社区贡献的主题。
686
+ | 主题文件 | 风格说明 |
687
+ |----------|----------|
688
+ | [elegant.css](themes/elegant.css) | 典雅暖调,朱砂红强调色、霞鹜文楷衬线体 |
689
+ | [guizang.css](themes/guizang.css) | 归藏古风,赭石强调色、松烟墨代码块 |
690
+ | [forest-ink.css](themes/forest-ink.css) | 🌲 森林墨,宣纸暖白底 + 松烟墨绿文字 + 森林绿强调色 |
691
+ | [academic-paper.css](themes/academic-paper.css) | 📄 **学术论文(增强版)** — 符合 GB/T 7713 规范,黑体标题 + 宋体正文,三线表格式,打印优化的 Mermaid 图表,脚注与参考文献样式。完整示例见 [`academic-demo.md`](docs/academic-demo.md) |
692
+ | [pixso-design.css](themes/pixso-design.css) | 🎨 Pixso 设计,现代设计系统风格 |
693
+ | [swiss-design.css](themes/swiss-design.css) | 🇨🇭 **瑞士国际主义平面设计风格** — 纯粹的黑白红三色体系,几何无衬线字体(Helvetica/Inter),网格化排版与大量留白,形式服从功能。极简克制的审美,灵感源自 Swiss International Typographic Style |
694
+
695
+ 自定义主题支持:将 CSS 文件放入 `~/.colamd/themes/` 目录,通过 **Theme > Import Theme** 导入。导入的主题会持久化保存,重启后仍然可用。
397
696
 
398
697
  ---
399
698
 
400
699
  ## 技术架构
401
700
 
402
701
  ```
403
- ┌─────────────────────────────────────────────┐
404
- Electron Shell
405
- ┌──────────┐ ┌───────────┐ ┌───────────┐
406
- │ Main │ │ Preload Renderer │ │
407
- │ │ Process │──│ IPC Bridge│──│ Process │ │
408
- └──────────┘ └───────────┘ └─────┬─────┘
409
-
410
- ┌──────────▼────────┐
411
- Milkdown Editor │ │
412
- (ProseMirror) │
413
- ┌──────────────┐ │ │
414
- Plugin System │ │
415
- ├─ 📐 Math │ │
416
- │ │ └─ 🔀 Mermaid │ │
417
- └──────────────┘ │ │
418
- └───────────────────┘
419
- └─────────────────────────────────────────────┘
702
+ ┌─────────────────────────────────────────────────────────────┐
703
+ ColaMD — 双平台架构
704
+
705
+ ┌──────────────────────┐ ┌────────────────────────────┐
706
+ │ │ 桌面端 (Electron) │ │ 移动端 (Capacitor 6) │ │
707
+ │ │ │ │
708
+ ┌─────────┐ ┌──────┐ │ ┌──────────────────────┐ │ │
709
+ │ │主进程 │Preload│ │ │ │ Capacitor 运行时 │ │ │
710
+ │ │ │Bridge │ │ │ │ (WebView / WKWebView) │ │ │
711
+ └────┬────┘ └──┬───┘ │ └──────────┬───────────┘ │ │
712
+ IPC │ │ │ 原生插件
713
+ │ │ └────┬────┘ │ │ ├─ Filesystem │ │
714
+ │ │ ▼ │ │ ├─ Share │ │
715
+ ┌─────────────────┐ │ ├─ App │ │
716
+ │ 渲染进程 │ │ ├─ StatusBar
717
+ │ │◄─┼───┼─────────────┤ │ │
718
+ │ │ └────────┬────────┘ │ │ └─ Haptics │ │
719
+ │ │ ▼ │ └──────────────┬───────────────┘ │
720
+ │ │ ┌──────────────────┐ │ │ │
721
+ │ │ │ Milkdown 编辑器 │◄┘ │ │
722
+ │ │ │ (ProseMirror) │ │ │
723
+ │ │ │ ┌────────────┐ │ │ │
724
+ │ │ │ │插件系统 │ │ │ │
725
+ │ │ │ │├─ 📐 Math │ │ │ │
726
+ │ │ │ │└─ 🔀Mermaid│ │ │ │
727
+ │ │ │ └────────────┘ │ │ │
728
+ │ │ └──────────────────┘ │ │
729
+ │ └──────────────────────┘ │ │
730
+ │ ┌──────────────────────────┘ │
731
+ │ ▼ │
732
+ │ 自动检测: │
733
+ │ api = electronAPI || capacitorAPI │
734
+ └─────────────────────────────────────────────────────────────┘
420
735
  ```
421
736
 
422
737
  ### 技术栈
@@ -424,6 +739,7 @@ ColaMD 内置 **4 个主题**,所有显示插件均会跟随主题自动适配
424
739
  | 技术 | 用途 | 版本 | 官方文档 |
425
740
  |------|------|------|----------|
426
741
  | [Electron](https://www.electronjs.org/) | 跨平台桌面应用框架 | ^34.0.0 | [📖 文档](https://www.electronjs.org/docs/latest/) |
742
+ | [Capacitor](https://capacitorjs.com/) | 跨平台移动端运行时(Android/iOS) | ^6.2.1 | [📖 文档](https://capacitorjs.com/docs/) |
427
743
  | [Milkdown](https://milkdown.dev/) | WYSIWYG Markdown 编辑器内核(基于 ProseMirror) | ^7.19.2 | [📖 文档](https://milkdown.dev/docs) |
428
744
  | [ProseMirror](https://prosemirror.net/) | 底层富文本编辑引擎 | — | [📖 文档](https://prosemirror.net/docs/) |
429
745
  | [KaTeX](https://katex.org/) | 数学公式渲染引擎 | ^0.16.46 | [📖 文档](https://katex.org/docs/) |
@@ -432,7 +748,7 @@ ColaMD 内置 **4 个主题**,所有显示插件均会跟随主题自动适配
432
748
  | [electron-vite](https://electron-vite.org/) | Electron 构建工具链 | ^3.0.0 | [📖 文档](https://electron-vite.org/guide/) |
433
749
  | [Vite](https://vitejs.dev/) | 底层构建引擎 | ^6.0.0 | [📖 文档](https://vitejs.dev/guide/) |
434
750
 
435
- > 💡 **开发提示**:各库的官方文档是开发新插件和自定义功能的最佳参考。特别是 [KaTeX 支持的语法](https://katex.org/docs/supported.html)[Mermaid 图表语法](https://mermaid.js.org/intro/syntax-reference.html) 对扩展插件功能至关重要。
751
+ > 💡 **开发提示**:各库的官方文档是开发新插件和自定义功能的最佳参考。特别是 [KaTeX 支持的语法](https://katex.org/docs/supported.html)[Mermaid 图表语法](https://mermaid.js.org/intro/syntax-reference.html) 和 [Capacitor 插件 API](https://capacitorjs.com/docs/apis) 对跨平台扩展功能至关重要。
436
752
 
437
753
  ### 项目结构
438
754
 
@@ -441,12 +757,15 @@ src/
441
757
  ├── main/
442
758
  │ └── index.ts # 主进程:窗口管理、文件 I/O、菜单、文件监听
443
759
  ├── preload/
444
- │ └── index.ts # 安全 IPC 桥接层
760
+ │ └── index.ts # 安全 IPC 桥接层(Electron)
445
761
  └── renderer/
446
762
  ├── index.html # 入口 HTML
447
- ├── main.ts # 渲染进程入口,连接编辑器和 IPC
763
+ ├── main.ts # 渲染进程入口,自动检测 Electron 或 Capacitor
764
+ ├── capacitor-api.ts # ★ Capacitor 桥接层(移动端替代 Electron API)
765
+ ├── mobile.css # ★ 触控优化的响应式样式
448
766
  ├── editor/
449
767
  │ ├── editor.ts # 编辑器编排核心(插件集成)
768
+ │ └── plugins/ # ★ 显示插件系统
450
769
  │ ├── html-view.ts # HTML 内联节点视图
451
770
  │ └── plugins/ # ★ 显示插件系统
452
771
  │ ├── index.ts # 插件管理器(注册/查询/启停)
@@ -469,6 +788,139 @@ src/
469
788
 
470
789
  ---
471
790
 
791
+ ## 内联 SVG 规范指南
792
+
793
+ > ⚠️ **重要提示**:ColaMD 使用 remark/rehype 解析 Markdown,其中**空行会被当作段落分隔符**。为了让内联 SVG 正确渲染,整个 HTML 块(包括 `<div>`、`<svg>`、`<p>` 标签)**必须写在一行内,不能有任何换行符**。
794
+
795
+ ### 为什么必须使用单行格式?
796
+
797
+ ColaMD 的解析流程:
798
+
799
+ ```
800
+ Markdown 源文件
801
+
802
+ remark-parse (Markdown → MDAST)
803
+
804
+ remark 插件处理
805
+
806
+ 空行检测:遇到空行 → 创建新的 paragraph 节点
807
+
808
+ rehype (MDAST → HAST)
809
+
810
+ ProseMirror 序列化
811
+ ↓ 每个 paragraph → 独立的 htmlSchema.node
812
+
813
+ html-view.ts 注入到 DOM
814
+
815
+ 最终输出:<span class="milkdown-html-inline">单个块</span>
816
+ ```
817
+
818
+ **多行格式的后果**:
819
+
820
+ ```html
821
+ <!-- 如果 SVG 分成多行(有空行) -->
822
+
823
+ Markdown:
824
+ <div>
825
+ <svg>
826
+ <defs>...</defs>
827
+
828
+ <rect/>
829
+
830
+ <circle/>
831
+ </svg>
832
+ </div>
833
+
834
+ 导出 HTML:
835
+ <p><span>...<svg><defs>...</defs></svg></span></p> ← 块1
836
+ <p><span> <rect/></span></p> ← 块2(独立!)
837
+ <p><span> <circle/></span></p> ← 块3(独立!)
838
+
839
+ 结果:❌ SVG 被拆成碎片,无法正确渲染
840
+ ```
841
+
842
+ **单行格式的效果**:
843
+
844
+ ```html
845
+ <!-- 整个内容在一行(无空行) -->
846
+
847
+ Markdown:
848
+ <div><svg><defs>...</defs><rect/><circle/></svg><p>图注</p></div>
849
+
850
+ 导出 HTML:
851
+ <p><span>
852
+ <div><svg>完整内容</svg><p>图注</p></div>
853
+ </span></p>
854
+
855
+ 结果:✅ 完整的 SVG 正确渲染
856
+ ```
857
+
858
+ ### SVG 规范要求
859
+
860
+ | # | 规则 | 重要级 | 说明 |
861
+ |---|------|--------|------|
862
+ | 1 | 🔴 **单行压缩** | **必须** | 整个 `<div>` 块不能有换行 |
863
+ | 2 | ✅ **标签闭包** | 必须 | 所有标签正确闭合或自闭合 |
864
+ | 3 | ✅ **命名空间** | 必须 | 包含 `xmlns="http://www.w3.org/2000/svg"` |
865
+ | 4 | ✅ **尺寸匹配** | 必须 | `width`/`height` 与 `viewBox` 一致 |
866
+ | 5 | ✅ **双引号** | 推荐 | 所有属性值使用双引号 |
867
+ | 6 | ✅ **ASCII字符** | 推荐 | 避免特殊符号,用 `-` 代替 `→` |
868
+
869
+ ### 示例:复杂内联 SVG
870
+
871
+ ```html
872
+ <div style="text-align: center; margin: 20px 0;"><svg width="600" height="400" viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg" style="display: block; margin: 0 auto; background: #f5f5f5; border-radius: 12px;"><defs><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#4A90E2;stop-opacity:1"/><stop offset="100%" style="stop-color:#357ABD;stop-opacity:1"/></linearGradient><linearGradient id="grad2" x1="0%" y1="0%" x2="100%" y2="0%"><stop offset="0%" style="stop-color:#7ED321;stop-opacity:1"/><stop offset="100%" style="stop-color:#5DB80D;stop-opacity:1"/></linearGradient></defs><rect width="600" height="400" fill="#f5f5f5" rx="12"/><rect x="40" y="40" width="520" height="60" rx="8" fill="url(#grad1)"/><text x="300" y="78" fill="white" text-anchor="middle" font-size="22" font-weight="bold">内联 SVG 示例</text><circle cx="150" cy="180" r="50" fill="url(#grad1)"/><text x="150" y="188" fill="white" text-anchor="middle" font-size="16" font-weight="bold">节点 A</text><rect x="250" y="130" width="100" height="100" rx="10" fill="url(#grad2)"/><text x="300" y="185" fill="white" text-anchor="middle" font-size="16" font-weight="bold">节点 B</text><polygon points="450,130 500,180 450,230 400,180" fill="#E74C3C"/><text x="450" y="188" fill="white" text-anchor="middle" font-size="14" font-weight="bold">节点 C</text><line x1="200" y1="180" x2="250" y2="180" stroke="#666" stroke-width="2" stroke-dasharray="5,5"/><line x1="350" y1="180" x2="400" y2="180" stroke="#666" stroke-width="2" stroke-dasharray="5,5"/><rect x="100" y="280" width="400" height="80" rx="8" fill="white" stroke="#ddd" stroke-width="1"/><text x="300" y="310" fill="#333" text-anchor="middle" font-size="14" font-weight="bold">三级火箭模型</text><text x="300" y="335" fill="#666" text-anchor="middle" font-size="12">材料 - 制造 - 平台</text></svg><p style="font-size: 10pt; color: #666; margin-top: 12px;">图:复杂内联 SVG 示例(单行压缩格式)</p></div>
873
+ ```
874
+
875
+ ### 对比:内联 vs 外联 SVG
876
+
877
+ | 特性 | 内联 SVG | 外联 SVG |
878
+ |------|---------|---------|
879
+ | **适用场景** | 演示、学习、简单图标 | 生产环境、复杂图形 |
880
+ | **代码位置** | Markdown 文件内 | 独立 `.svg` 文件 |
881
+ | **格式要求** | 🔴 **必须单行压缩** | 无特殊要求 |
882
+ | **可维护性** | ⚠️ 困难(长行难读) | ✅ 优秀(独立文件) |
883
+ | **复杂度上限** | 受限于单行长度 | 无限制 |
884
+ | **浏览器缓存** | ❌ 无法缓存 | ✅ 自动缓存 |
885
+
886
+ ### 最佳实践
887
+
888
+ #### 适合使用内联 SVG 的场景:
889
+ - ✅ 演示和学习目的
890
+ - ✅ 简单图标(< 10 个元素)
891
+ - ✅ 需要单文件交付
892
+ - ✅ 快速原型开发
893
+
894
+ #### 适合使用外联 SVG 的场景:
895
+ - ✅ 生产环境文档
896
+ - ✅ 复杂图形(> 20 个元素)
897
+ - ✅ 需要频繁编辑和维护
898
+ - ✅ 团队协作项目
899
+
900
+ ### 维护技巧
901
+
902
+ 1. **编辑时使用临时换行**
903
+ ```html
904
+ <!-- 开发阶段:可读格式 -->
905
+ <svg ...>
906
+ <rect .../>
907
+ <circle .../>
908
+ </svg>
909
+
910
+ <!-- 保存前:压缩为一行 -->
911
+ <svg ...><rect .../><circle .../></svg>
912
+ ```
913
+
914
+ 2. **使用代码编辑器的"合并行"功能**
915
+ - VS Code: `Ctrl+J` (Windows) / `Cmd+J` (Mac)
916
+ - WebStorm: `Ctrl+Shift+J`
917
+
918
+ 3. **版本控制友好**
919
+ - Git diff 会显示整行变更
920
+ - 可考虑使用 `.gitattributes` 处理长行
921
+
922
+ ---
923
+
472
924
  ## 致谢与版权
473
925
 
474
926
  ### 原版项目
File without changes