@akairos/pipeline 0.18.1 → 0.18.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.
Files changed (212) hide show
  1. package/ARTICLE-THEMES.md +2 -0
  2. package/README.md +5 -3
  3. package/package.json +5 -4
  4. package/src/article-theme.test.ts +55 -0
  5. package/src/article-theme.ts +10 -2
  6. package/src/commands/article-theme.ts +1 -1
  7. package/src/commands/init.ts +2 -0
  8. package/src/commands/publish.ts +1 -1
  9. package/src/commands/typeset-assets-sync.test.ts +9 -1
  10. package/src/commands/wechat-export.ts +9 -4
  11. package/src/providers/index.ts +4 -2
  12. package/src/runtime-package.ts +4 -3
  13. package/src/wechat-preview/assets/browser-dist/.vite/manifest.json +1280 -5
  14. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  15. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  16. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  17. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  18. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  19. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  20. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  21. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  22. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  23. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  24. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  25. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  26. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  27. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  28. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  29. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  30. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  31. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  32. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  33. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  34. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  35. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  36. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  37. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  38. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  39. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  40. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  41. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  42. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  43. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  44. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  45. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  46. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  47. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  48. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  49. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  50. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  51. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  52. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  53. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  54. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  55. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  56. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  57. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  58. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  59. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  60. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  61. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  62. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  63. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  64. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  65. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  66. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  67. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  68. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  69. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  70. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  71. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  72. package/src/wechat-preview/assets/browser-dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  73. package/src/wechat-preview/assets/browser-dist/assets/apl-B4CMkyY2.js +1 -0
  74. package/src/wechat-preview/assets/browser-dist/assets/asciiarmor-Df11BRmG.js +1 -0
  75. package/src/wechat-preview/assets/browser-dist/assets/asn1-EdZsLKOL.js +1 -0
  76. package/src/wechat-preview/assets/browser-dist/assets/asterisk-B-8jnY81.js +1 -0
  77. package/src/wechat-preview/assets/browser-dist/assets/brainfuck-C4LP7Hcl.js +1 -0
  78. package/src/wechat-preview/assets/browser-dist/assets/clike-B9uivgTg.js +1 -0
  79. package/src/wechat-preview/assets/browser-dist/assets/clojure-BMjYHr_A.js +1 -0
  80. package/src/wechat-preview/assets/browser-dist/assets/cmake-BQqOBYOt.js +1 -0
  81. package/src/wechat-preview/assets/browser-dist/assets/cobol-CWcv1MsR.js +1 -0
  82. package/src/wechat-preview/assets/browser-dist/assets/coffeescript-S37ZYGWr.js +1 -0
  83. package/src/wechat-preview/assets/browser-dist/assets/commonlisp-DBKNyK5s.js +1 -0
  84. package/src/wechat-preview/assets/browser-dist/assets/crystal-SjHAIU92.js +1 -0
  85. package/src/wechat-preview/assets/browser-dist/assets/css-BnMrqG3P.js +1 -0
  86. package/src/wechat-preview/assets/browser-dist/assets/cypher-C_CwsFkJ.js +1 -0
  87. package/src/wechat-preview/assets/browser-dist/assets/d-pRatUO7H.js +1 -0
  88. package/src/wechat-preview/assets/browser-dist/assets/diff-DbItnlRl.js +1 -0
  89. package/src/wechat-preview/assets/browser-dist/assets/dockerfile-BKs6k2Af.js +1 -0
  90. package/src/wechat-preview/assets/browser-dist/assets/dtd-DF_7sFjM.js +1 -0
  91. package/src/wechat-preview/assets/browser-dist/assets/dylan-DwRh75JA.js +1 -0
  92. package/src/wechat-preview/assets/browser-dist/assets/ebnf-CDyGwa7X.js +1 -0
  93. package/src/wechat-preview/assets/browser-dist/assets/ecl-Cabwm37j.js +1 -0
  94. package/src/wechat-preview/assets/browser-dist/assets/eiffel-CnydiIhH.js +1 -0
  95. package/src/wechat-preview/assets/browser-dist/assets/elm-vLlmbW-K.js +1 -0
  96. package/src/wechat-preview/assets/browser-dist/assets/erlang-BNw1qcRV.js +1 -0
  97. package/src/wechat-preview/assets/browser-dist/assets/factor-kuTfRLto.js +1 -0
  98. package/src/wechat-preview/assets/browser-dist/assets/fcl-Kvtd6kyn.js +1 -0
  99. package/src/wechat-preview/assets/browser-dist/assets/forth-Ffai-XNe.js +1 -0
  100. package/src/wechat-preview/assets/browser-dist/assets/fortran-DYz_wnZ1.js +1 -0
  101. package/src/wechat-preview/assets/browser-dist/assets/gas-Bneqetm1.js +1 -0
  102. package/src/wechat-preview/assets/browser-dist/assets/gherkin-heZmZLOM.js +1 -0
  103. package/src/wechat-preview/assets/browser-dist/assets/groovy-D9Dt4D0W.js +1 -0
  104. package/src/wechat-preview/assets/browser-dist/assets/haskell-Cw1EW3IL.js +1 -0
  105. package/src/wechat-preview/assets/browser-dist/assets/haxe-H-WmDvRZ.js +1 -0
  106. package/src/wechat-preview/assets/browser-dist/assets/http-DBlCnlav.js +1 -0
  107. package/src/wechat-preview/assets/browser-dist/assets/idl-BEugSyMb.js +1 -0
  108. package/src/wechat-preview/assets/browser-dist/assets/index-B13lCSuc.js +1 -0
  109. package/src/wechat-preview/assets/browser-dist/assets/index-BDdU9pNh.js +1 -0
  110. package/src/wechat-preview/assets/browser-dist/assets/index-BFLGVgsp.js +1 -0
  111. package/src/wechat-preview/assets/browser-dist/assets/index-BHJY0B4E.js +8 -0
  112. package/src/wechat-preview/assets/browser-dist/assets/index-BOnKEJxh.js +7 -0
  113. package/src/wechat-preview/assets/browser-dist/assets/index-BPmBcGI-.js +1 -0
  114. package/src/wechat-preview/assets/browser-dist/assets/index-BTVIa90Y.js +1 -0
  115. package/src/wechat-preview/assets/browser-dist/assets/index-BYV6TA8f.js +1 -0
  116. package/src/wechat-preview/assets/browser-dist/assets/index-BlVpb0dF.js +1 -0
  117. package/src/wechat-preview/assets/browser-dist/assets/index-BqKARoyW.js +1 -0
  118. package/src/wechat-preview/assets/browser-dist/assets/index-BzHql5Rp.js +20 -0
  119. package/src/wechat-preview/assets/browser-dist/assets/index-CPFEJ9fX.js +1 -0
  120. package/src/wechat-preview/assets/browser-dist/assets/index-CdxKyTX6.js +1 -0
  121. package/src/wechat-preview/assets/browser-dist/assets/index-CyXDvcwY.js +1 -0
  122. package/src/wechat-preview/assets/browser-dist/assets/index-DA7Z4paG.js +13 -0
  123. package/src/wechat-preview/assets/browser-dist/assets/index-DDQGWU_D.js +3 -0
  124. package/src/wechat-preview/assets/browser-dist/assets/index-DENMoE5l.js +1 -0
  125. package/src/wechat-preview/assets/browser-dist/assets/index-D_EI5vFS.js +1 -0
  126. package/src/wechat-preview/assets/browser-dist/assets/index-DpuVrwze.js +1 -0
  127. package/src/wechat-preview/assets/browser-dist/assets/index-IBlhKHQr.js +8 -0
  128. package/src/wechat-preview/assets/browser-dist/assets/index-ifI5svkD.js +2 -0
  129. package/src/wechat-preview/assets/browser-dist/assets/index-vRiJxvj2.js +1 -0
  130. package/src/wechat-preview/assets/browser-dist/assets/javascript-iXu5QeM3.js +1 -0
  131. package/src/wechat-preview/assets/browser-dist/assets/julia-DuME0IfC.js +1 -0
  132. package/src/wechat-preview/assets/browser-dist/assets/livescript-BwQOo05w.js +1 -0
  133. package/src/wechat-preview/assets/browser-dist/assets/lua-VAEuO923.js +1 -0
  134. package/src/wechat-preview/assets/browser-dist/assets/mathematica-DTrFuWx2.js +1 -0
  135. package/src/wechat-preview/assets/browser-dist/assets/mbox-CNhZ1qSd.js +1 -0
  136. package/src/wechat-preview/assets/browser-dist/assets/mirc-CjQqDB4T.js +1 -0
  137. package/src/wechat-preview/assets/browser-dist/assets/mllike-CXdrOF99.js +1 -0
  138. package/src/wechat-preview/assets/browser-dist/assets/modelica-Dc1JOy9r.js +1 -0
  139. package/src/wechat-preview/assets/browser-dist/assets/mscgen-BA5vi2Kp.js +1 -0
  140. package/src/wechat-preview/assets/browser-dist/assets/mumps-BT43cFF4.js +1 -0
  141. package/src/wechat-preview/assets/browser-dist/assets/nginx-DdIZxoE0.js +1 -0
  142. package/src/wechat-preview/assets/browser-dist/assets/nsis-LY0VT_u5.js +1 -0
  143. package/src/wechat-preview/assets/browser-dist/assets/ntriples-BfvgReVJ.js +1 -0
  144. package/src/wechat-preview/assets/browser-dist/assets/octave-Ck1zUtKM.js +1 -0
  145. package/src/wechat-preview/assets/browser-dist/assets/oz-BzwKVEFT.js +1 -0
  146. package/src/wechat-preview/assets/browser-dist/assets/pascal--L3eBynH.js +1 -0
  147. package/src/wechat-preview/assets/browser-dist/assets/perl-CdXCOZ3F.js +1 -0
  148. package/src/wechat-preview/assets/browser-dist/assets/pig-CevX1Tat.js +1 -0
  149. package/src/wechat-preview/assets/browser-dist/assets/powershell-CFHJl5sT.js +1 -0
  150. package/src/wechat-preview/assets/browser-dist/assets/properties-C78fOPTZ.js +1 -0
  151. package/src/wechat-preview/assets/browser-dist/assets/protobuf-ChK-085T.js +1 -0
  152. package/src/wechat-preview/assets/browser-dist/assets/pug-DeIclll2.js +1 -0
  153. package/src/wechat-preview/assets/browser-dist/assets/puppet-DMA9R1ak.js +1 -0
  154. package/src/wechat-preview/assets/browser-dist/assets/python-BuPzkPfP.js +1 -0
  155. package/src/wechat-preview/assets/browser-dist/assets/q-pXgVlZs6.js +1 -0
  156. package/src/wechat-preview/assets/browser-dist/assets/r-B6wPVr8A.js +1 -0
  157. package/src/wechat-preview/assets/browser-dist/assets/rpm-CTu-6PCP.js +1 -0
  158. package/src/wechat-preview/assets/browser-dist/assets/ruby-BK5aLJev.js +1 -0
  159. package/src/wechat-preview/assets/browser-dist/assets/sas-B4kiWyti.js +1 -0
  160. package/src/wechat-preview/assets/browser-dist/assets/scheme-C41bIUwD.js +1 -0
  161. package/src/wechat-preview/assets/browser-dist/assets/shell-CjFT_Tl9.js +1 -0
  162. package/src/wechat-preview/assets/browser-dist/assets/sieve-C3Gn_uJK.js +1 -0
  163. package/src/wechat-preview/assets/browser-dist/assets/simple-mode-GW_nhZxv.js +1 -0
  164. package/src/wechat-preview/assets/browser-dist/assets/smalltalk-CnHTOXQT.js +1 -0
  165. package/src/wechat-preview/assets/browser-dist/assets/solr-DehyRSwq.js +1 -0
  166. package/src/wechat-preview/assets/browser-dist/assets/sparql-DkYu6x3z.js +1 -0
  167. package/src/wechat-preview/assets/browser-dist/assets/spreadsheet-BCZA_wO0.js +1 -0
  168. package/src/wechat-preview/assets/browser-dist/assets/sql-D0XecflT.js +1 -0
  169. package/src/wechat-preview/assets/browser-dist/assets/stex-C3f8Ysf7.js +1 -0
  170. package/src/wechat-preview/assets/browser-dist/assets/style-Cif_gYUW.css +1 -0
  171. package/src/wechat-preview/assets/browser-dist/assets/stylus-B533Al4x.js +1 -0
  172. package/src/wechat-preview/assets/browser-dist/assets/swift-BzpIVaGY.js +1 -0
  173. package/src/wechat-preview/assets/browser-dist/assets/tcl-DVfN8rqt.js +1 -0
  174. package/src/wechat-preview/assets/browser-dist/assets/textile-CnDTJFAw.js +1 -0
  175. package/src/wechat-preview/assets/browser-dist/assets/tiddlywiki-DO-Gjzrf.js +1 -0
  176. package/src/wechat-preview/assets/browser-dist/assets/tiki-DGYXhP31.js +1 -0
  177. package/src/wechat-preview/assets/browser-dist/assets/toml-Bm5Em-hy.js +1 -0
  178. package/src/wechat-preview/assets/browser-dist/assets/troff-wAsdV37c.js +1 -0
  179. package/src/wechat-preview/assets/browser-dist/assets/ttcn-CfJYG6tj.js +1 -0
  180. package/src/wechat-preview/assets/browser-dist/assets/ttcn-cfg-B9xdYoR4.js +1 -0
  181. package/src/wechat-preview/assets/browser-dist/assets/turtle-B1tBg_DP.js +1 -0
  182. package/src/wechat-preview/assets/browser-dist/assets/vb-CmGdzxic.js +1 -0
  183. package/src/wechat-preview/assets/browser-dist/assets/vbscript-BuJXcnF6.js +1 -0
  184. package/src/wechat-preview/assets/browser-dist/assets/velocity-D8B20fx6.js +1 -0
  185. package/src/wechat-preview/assets/browser-dist/assets/verilog-C6RDOZhf.js +1 -0
  186. package/src/wechat-preview/assets/browser-dist/assets/vhdl-lSbBsy5d.js +1 -0
  187. package/src/wechat-preview/assets/browser-dist/assets/webidl-ZXfAyPTL.js +1 -0
  188. package/src/wechat-preview/assets/browser-dist/assets/{wechat-renderer-GgNrlSLi.js → wechat-renderer-CcHuq7M-.js} +83 -61
  189. package/src/wechat-preview/assets/browser-dist/assets/xquery-DzFWVndE.js +1 -0
  190. package/src/wechat-preview/assets/browser-dist/assets/yacas-BJ4BC0dw.js +1 -0
  191. package/src/wechat-preview/assets/browser-dist/assets/z80-Hz9HOZM7.js +1 -0
  192. package/src/wechat-preview/assets/browser-dist/editor-export.js +1 -1
  193. package/src/wechat-preview/assets/browser-dist/src/wechat-preview/browser/studio/studio.html +215 -165
  194. package/src/wechat-preview/assets/browser-dist/studio.js +1148 -237
  195. package/src/wechat-preview/browser/studio/color-palettes.ts +28 -0
  196. package/src/wechat-preview/browser/studio/config-manager.ts +49 -0
  197. package/src/wechat-preview/browser/studio/milkdown-article-menu.ts +251 -0
  198. package/src/wechat-preview/browser/studio/myno-editor.ts +122 -0
  199. package/src/wechat-preview/browser/studio/studio.css +493 -250
  200. package/src/wechat-preview/browser/studio/studio.html +213 -163
  201. package/src/wechat-preview/browser/studio/studio.ts +684 -211
  202. package/src/wechat-preview/browser/studio/style-packs.ts +201 -0
  203. package/src/wechat-preview/browser/studio/syntax-presets.test.ts +10 -32
  204. package/src/wechat-preview/browser/studio/syntax-presets.ts +19 -357
  205. package/src/wechat-preview/fixtures/all-nodes.md +2 -11
  206. package/src/wechat-preview/index.ts +29 -13
  207. package/src/wechat-preview/server/http.ts +8 -7
  208. package/src/wechat-preview/server/studio.test.ts +25 -0
  209. package/src/wechat-preview/wechat-export.integration.test.ts +49 -8
  210. package/src/wechat-preview/wechat-renderer.ts +134 -11
  211. package/src/workflow.test.ts +2 -0
  212. package/src/wechat-preview/assets/browser-dist/assets/style-C9-YtTIm.css +0 -1
@@ -1,7 +1,6 @@
1
1
  export interface SyntaxPreset {
2
2
  id: string;
3
3
  name: string;
4
- description: string;
5
4
  css: string;
6
5
  }
7
6
 
@@ -9,28 +8,12 @@ export interface SyntaxCategory {
9
8
  key: string;
10
9
  label: string;
11
10
  icon: string;
12
- defaultPresetId?: string;
13
- presets?: SyntaxPreset[];
14
- css?: string;
15
- description?: string;
11
+ defaultPresetId: string;
12
+ presets: SyntaxPreset[];
16
13
  }
17
14
 
15
+ /** 仅收录存在多个可选预设的语法节点;单一样式的节点直接由 article.css 提供。 */
18
16
  export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
19
- // ── 标题体系 ──────────────────────────────────────────────
20
- {
21
- key: "h1",
22
- label: "一级标题 (H1)",
23
- icon: "👑",
24
- description: "文章大标题:26px,加粗,紧贴后续正文,无边框背景修饰",
25
- css: `.milkdown .editor h1 {
26
- margin: 2.45em 0 0.85em;
27
- color: var(--wx-h2-color, #1f1b1c);
28
- font-size: 26px;
29
- font-weight: 700;
30
- line-height: 1.38;
31
- letter-spacing: -0.01em;
32
- }`,
33
- },
34
17
  {
35
18
  key: "h2",
36
19
  label: "二级标题 (H2)",
@@ -40,11 +23,10 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
40
23
  {
41
24
  id: "pillar",
42
25
  name: "左侧呼吸柱(推荐)",
43
- description: "2.5px 品牌色垂直微线 + 9px 内边距 + 2.8em 非对称呼吸留白",
44
26
  css: `.milkdown .editor h2 {
45
27
  margin: 2.8em 0 0.65em;
46
28
  padding-left: 9px;
47
- border-left: 2.5px solid var(--wx-brand-accent, #ca6093);
29
+ border-left: 4px solid var(--wx-brand-accent, #ca6093);
48
30
  border-bottom: none;
49
31
  background: none;
50
32
  font-size: 20px;
@@ -57,7 +39,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
57
39
  {
58
40
  id: "bottom-line",
59
41
  name: "极浅底部分割",
60
- description: "1px 细底线 + 紧凑下边距 + 3.0em 开阔章节上留白",
61
42
  css: `.milkdown .editor h2 {
62
43
  margin: 3.0em 0 0.8em;
63
44
  padding-bottom: 0.45em;
@@ -75,7 +56,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
75
56
  {
76
57
  id: "gradient-pill",
77
58
  name: "渐变微衬底(背景色块)",
78
- description: "水平柔和渐变微底色 + 左侧 3px 标柱 + 4px 圆角",
79
59
  css: `.milkdown .editor h2 {
80
60
  margin: 2.8em 0 0.7em;
81
61
  padding: 7px 14px;
@@ -93,7 +73,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
93
73
  {
94
74
  id: "contrast-green",
95
75
  name: "反差色绿底(白字反色块)",
96
- description: "高级生态绿底色 + 纯白文字 + 4px 圆角 + 8px 14px 饱满内边距",
97
76
  css: `.milkdown .editor h2 {
98
77
  margin: 2.8em 0 0.8em;
99
78
  padding: 8px 14px;
@@ -114,7 +93,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
114
93
  {
115
94
  id: "card-tag",
116
95
  name: "温润小卡片",
117
- description: "包裹式浅色暖底 + 居左微内边距 + 紧实字号",
118
96
  css: `.milkdown .editor h2 {
119
97
  margin: 2.7em 0 0.75em;
120
98
  padding: 6px 12px;
@@ -132,7 +110,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
132
110
  {
133
111
  id: "plain",
134
112
  name: "经典纯文字",
135
- description: "纯字号与字重,无边框与背景修饰",
136
113
  css: `.milkdown .editor h2 {
137
114
  margin: 2.7em 0 0.7em;
138
115
  padding: 0;
@@ -157,7 +134,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
157
134
  {
158
135
  id: "plain",
159
136
  name: "经典纯文字(默认)",
160
- description: "16px,深灰次级字色,font-weight 700",
161
137
  css: `.milkdown .editor h3 {
162
138
  margin: 1.55em 0 0.4em;
163
139
  padding-left: 0;
@@ -173,7 +149,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
173
149
  {
174
150
  id: "left-bar",
175
151
  name: "左侧微短线",
176
- description: "2px 细色柱 + 7px 内边距",
177
152
  css: `.milkdown .editor h3 {
178
153
  margin: 1.6em 0 0.45em;
179
154
  padding-left: 7px;
@@ -189,7 +164,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
189
164
  {
190
165
  id: "badge",
191
166
  name: "胶囊小微标",
192
- description: "行内微底色衬托,紧凑突出",
193
167
  css: `.milkdown .editor h3 {
194
168
  display: inline-block;
195
169
  margin: 1.6em 0 0.45em;
@@ -205,122 +179,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
205
179
  },
206
180
  ],
207
181
  },
208
- {
209
- key: "h4",
210
- label: "四级/次级标题 (H4-H6)",
211
- icon: "🔸",
212
- description: "更低层级小标题:16px 次深灰,1.55 行高,紧贴段落",
213
- css: `.milkdown .editor h4,
214
- .milkdown .editor h5,
215
- .milkdown .editor h6 {
216
- margin: 1.45em 0 0.45em;
217
- color: var(--wx-h3-color, #5c5658);
218
- font-size: 16px;
219
- font-weight: 700;
220
- line-height: 1.55;
221
- letter-spacing: 0.02em;
222
- }`,
223
- },
224
-
225
- // ── 正文与行内样式 ─────────────────────────────────────────
226
- {
227
- key: "p",
228
- label: "正文段落 (Paragraph)",
229
- icon: "📄",
230
- description: "标准段落:两端对齐,排版行高 1.84,下边距 1.2em",
231
- css: `.milkdown .editor p {
232
- margin: 0 0 1.2em;
233
- color: var(--wx-body-color, #292526);
234
- font-size: 16px;
235
- line-height: 1.84;
236
- letter-spacing: 0.012em;
237
- text-align: justify;
238
- }`,
239
- },
240
- {
241
- key: "strong",
242
- label: "加粗与斜体 (Bold / Italic)",
243
- icon: "🖋️",
244
- description: "重点强调:深沉字重 700 与斜体字色跟随",
245
- css: `.milkdown .editor strong,
246
- .milkdown .editor b {
247
- color: var(--wx-body-color, #292526);
248
- font-weight: 700;
249
- }
250
- .milkdown .editor em,
251
- .milkdown .editor i {
252
- color: var(--wx-body-color, #292526);
253
- font-style: italic;
254
- }`,
255
- },
256
- {
257
- key: "del",
258
- label: "删除线 (Strikethrough)",
259
- icon: "✂️",
260
- description: "废弃内容:静音深灰与中线划除",
261
- css: `.milkdown .editor s,
262
- .milkdown .editor del {
263
- color: var(--wx-muted-color, #6f696b);
264
- text-decoration: line-through;
265
- text-decoration-color: var(--wx-muted-color, #6f696b);
266
- }`,
267
- },
268
- {
269
- key: "mark",
270
- label: "文本高亮 (Mark ==...==)",
271
- icon: "🖍️",
272
- description: "马克笔荧光衬底:柔和品牌色淡背景 + 1.5px 下划强调线",
273
- css: `.milkdown .editor mark {
274
- margin: 0 2px;
275
- padding: 2px 5px;
276
- background-color: rgba(202, 96, 147, 0.16);
277
- color: var(--wx-body-color, #292526);
278
- border-radius: 3px;
279
- border-bottom: 1.5px solid var(--wx-brand-accent, #ca6093);
280
- }`,
281
- },
282
- {
283
- key: "inline-code",
284
- label: "行内代码 (Inline Code)",
285
- icon: "💻",
286
- description: "行内等宽代码:14px,等宽字体,浅色微边框衬底",
287
- css: `.milkdown .editor code:not(pre code),
288
- .milkdown .editor [data-wechat-node="inline-code"] {
289
- margin: 0 2px;
290
- padding: 2px 6px;
291
- border: 1px solid var(--wx-divider-color, #ded9db);
292
- border-radius: 4px;
293
- background-color: var(--wx-soft-surface, #f7f5f6);
294
- color: #4d484a;
295
- font-family: Menlo, Monaco, Consolas, monospace;
296
- font-size: 14px;
297
- line-height: 1.55;
298
- }`,
299
- },
300
-
301
- // ── 容器与代码块 ─────────────────────────────────────────
302
- {
303
- key: "code-block",
304
- label: "代码块 (Code Block)",
305
- icon: "📟",
306
- description: "多行代码框:浅灰底色,6px 圆角,深色等宽字符与水平横滚",
307
- css: `.milkdown .editor pre {
308
- margin: 1.55em 0;
309
- padding: 14px 16px;
310
- border: 1px solid var(--wx-divider-color, #e2dcdf);
311
- border-radius: 6px;
312
- background-color: var(--wx-soft-surface, #f8fafc);
313
- color: var(--wx-body-color, #292526);
314
- font-family: Menlo, Monaco, Consolas, monospace;
315
- font-size: 13px;
316
- line-height: 1.72;
317
- overflow-x: auto;
318
- }
319
- .milkdown .editor pre code {
320
- font-family: inherit;
321
- font-size: inherit;
322
- }`,
323
- },
324
182
  {
325
183
  key: "blockquote",
326
184
  label: "引用块 (Blockquote)",
@@ -330,7 +188,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
330
188
  {
331
189
  id: "left-border",
332
190
  name: "经典左单线(默认)",
333
- description: "3px 品牌色微边框 + 浅灰底色 + 4px 右圆角",
334
191
  css: `.milkdown .editor blockquote {
335
192
  margin: 1.6em 0;
336
193
  padding: 10px 16px;
@@ -343,7 +200,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
343
200
  {
344
201
  id: "tint-card",
345
202
  name: "全包裹微卡片",
346
- description: "四边 1px 极细边框 + 6px 圆角,整体成盒",
347
203
  css: `.milkdown .editor blockquote {
348
204
  margin: 1.6em 0;
349
205
  padding: 12px 18px;
@@ -355,7 +211,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
355
211
  {
356
212
  id: "minimal-indent",
357
213
  name: "极简纯缩进",
358
- description: "无底色,仅左侧细灰线与自然缩进",
359
214
  css: `.milkdown .editor blockquote {
360
215
  margin: 1.5em 0;
361
216
  padding: 6px 0 6px 16px;
@@ -367,40 +222,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
367
222
  },
368
223
  ],
369
224
  },
370
- {
371
- key: "list",
372
- label: "列表 (Unordered & Ordered)",
373
- icon: "📋",
374
- description: "标准列表:自然外缩进,1.78 行高,小圆点与阿拉伯数字序号",
375
- css: `.milkdown .editor ul,
376
- .milkdown .editor ol {
377
- margin: 1.05em 0 1.3em;
378
- padding-left: 1.6em;
379
- color: var(--wx-body-color, #292526);
380
- }
381
- .milkdown .editor li {
382
- margin: 0.4em 0;
383
- line-height: 1.78;
384
- }
385
- .milkdown .editor li p {
386
- margin: 0.15em 0;
387
- }`,
388
- },
389
- {
390
- key: "task-list",
391
- label: "任务清单 (Task List)",
392
- icon: "☑️",
393
- description: "待办复选框:品牌色勾选标记,紧凑缩进",
394
- css: `.milkdown .editor [data-wechat-node="task-list-item"] {
395
- list-style: none;
396
- }
397
- .milkdown .editor [data-wechat-node="task-marker"] {
398
- display: inline-block;
399
- min-width: 1.35em;
400
- color: var(--wx-brand-accent, #ca6093);
401
- font-weight: 700;
402
- }`,
403
- },
404
225
  {
405
226
  key: "divider",
406
227
  label: "分割线 (Divider)",
@@ -410,7 +231,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
410
231
  {
411
232
  id: "hairline",
412
233
  name: "极细实线(默认)",
413
- description: "1px 浅灰色水平实线",
414
234
  css: `.milkdown .editor hr,
415
235
  .milkdown .editor [data-wechat-node="divider"] {
416
236
  margin: 2.4em 0;
@@ -422,7 +242,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
422
242
  {
423
243
  id: "dashed",
424
244
  name: "极简虚线",
425
- description: "1px 虚线划分节奏",
426
245
  css: `.milkdown .editor hr,
427
246
  .milkdown .editor [data-wechat-node="divider"] {
428
247
  margin: 2.4em 0;
@@ -434,7 +253,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
434
253
  {
435
254
  id: "short-center",
436
255
  name: "居中短呼吸线",
437
- description: "宽度 36%,居中呼吸线",
438
256
  css: `.milkdown .editor hr,
439
257
  .milkdown .editor [data-wechat-node="divider"] {
440
258
  margin: 2.8em auto;
@@ -445,174 +263,15 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
445
263
  },
446
264
  ],
447
265
  },
448
-
449
- // ── 媒体、链接与表格 ─────────────────────────────────────────
450
- {
451
- key: "link",
452
- label: "超链接与附注 (Links & Ref)",
453
- icon: "🔗",
454
- description: "文章链接与文末尾注:品牌色下划细线与上标数字角标",
455
- css: `.milkdown .editor a,
456
- .milkdown .editor [data-wechat-node="external-link"] {
457
- border-bottom: 1px solid var(--wx-brand-accent, #ca6093);
458
- color: var(--wx-brand-accent, #ca6093);
459
- text-decoration: none;
460
- }
461
- .milkdown .editor [data-wechat-node="link-marker"] {
462
- margin-left: 2px;
463
- color: var(--wx-brand-accent, #ca6093);
464
- font-size: 11px;
465
- vertical-align: super;
466
- }`,
467
- },
468
- {
469
- key: "image",
470
- label: "图片与图注 (Image & Caption)",
471
- icon: "🖼️",
472
- description: "文章插图与下方图注:居中包裹,4px 微圆角与 13px 浅灰居中说明",
473
- css: `.milkdown .editor figure,
474
- .milkdown .editor [data-wechat-node="image-block"] {
475
- margin: 1.65em 0 1.8em;
476
- text-align: center;
477
- }
478
- .milkdown .editor img {
479
- display: block;
480
- max-width: 100%;
481
- height: auto;
482
- margin: 0 auto;
483
- border-radius: 4px;
484
- }
485
- .milkdown .editor figcaption,
486
- .milkdown .editor [data-wechat-node="image-caption"] {
487
- margin-top: 8px;
488
- color: var(--wx-muted-color, #6f696b);
489
- font-size: 13px;
490
- line-height: 1.62;
491
- text-align: center;
492
- }`,
493
- },
494
- {
495
- key: "table",
496
- label: "数据表格 (Table)",
497
- icon: "📊",
498
- description: "数据对比表格:折叠边框,浅暖色表头背景,紧凑对齐内边距",
499
- css: `.milkdown .editor table {
500
- width: 100%;
501
- margin: 1.5em 0;
502
- border-collapse: collapse;
503
- table-layout: fixed;
504
- font-size: 14px;
505
- line-height: 1.62;
506
- }
507
- .milkdown .editor th,
508
- .milkdown .editor td {
509
- padding: 8px 10px;
510
- border: 1px solid var(--wx-divider-color, #e2dcdf);
511
- text-align: left;
512
- }
513
- .milkdown .editor th {
514
- background-color: var(--wx-soft-surface, #faf8f9);
515
- color: var(--wx-h2-color, #1f1b1c);
516
- font-weight: 700;
517
- }`,
518
- },
519
-
520
- // ── 扩展组件 ───────────────────────────────────────────────
521
- {
522
- key: "callout",
523
- label: "扩展:提示卡片 (Callout Alert)",
524
- icon: "💡",
525
- description: "高亮提示盒:标准 GFM 语义色彩(Note 蓝 / Tip 绿 / Warning 橙 / Caution 红 / Important 紫)",
526
- css: `.milkdown .editor [data-wechat-node="callout"],
527
- .milkdown .editor .wechat-callout {
528
- margin: 1.4em 0;
529
- padding: 12px 16px;
530
- border-left-width: 4px;
531
- border-left-style: solid;
532
- border-radius: 6px;
533
- box-sizing: border-box;
534
- }
535
- .milkdown .editor [data-callout-type="note"],
536
- .milkdown .editor .wechat-callout-note {
537
- border-left-color: #3b82f6 !important;
538
- background-color: rgba(59, 130, 246, 0.08) !important;
539
- }
540
- .milkdown .editor [data-callout-type="tip"],
541
- .milkdown .editor .wechat-callout-tip {
542
- border-left-color: #10b981 !important;
543
- background-color: rgba(16, 185, 129, 0.08) !important;
544
- }
545
- .milkdown .editor [data-callout-type="important"],
546
- .milkdown .editor .wechat-callout-important {
547
- border-left-color: #8b5cf6 !important;
548
- background-color: rgba(139, 92, 246, 0.08) !important;
549
- }
550
- .milkdown .editor [data-callout-type="warning"],
551
- .milkdown .editor .wechat-callout-warning {
552
- border-left-color: #f59e0b !important;
553
- background-color: rgba(245, 158, 11, 0.08) !important;
554
- }
555
- .milkdown .editor [data-callout-type="caution"],
556
- .milkdown .editor .wechat-callout-caution {
557
- border-left-color: #ef4444 !important;
558
- background-color: rgba(239, 68, 68, 0.08) !important;
559
- }
560
- .milkdown .editor [data-wechat-node="callout-header"],
561
- .milkdown .editor .wechat-callout-header {
562
- font-weight: 700;
563
- font-size: 14px;
564
- margin-bottom: 6px;
565
- }`,
566
- },
567
- {
568
- key: "kbd",
569
- label: "扩展:键盘键帽 (Kbd Key)",
570
- icon: "⌨️",
571
- description: "按键徽章:立体立体阴影边框,12px 等宽字体",
572
- css: `.milkdown .editor kbd,
573
- .milkdown .editor [data-wechat-node="kbd"] {
574
- display: inline-block;
575
- margin: 0 3px;
576
- padding: 2px 6px;
577
- font-family: Menlo, Monaco, Consolas, monospace;
578
- font-size: 12px;
579
- font-weight: 600;
580
- color: #374151;
581
- background-color: #f3f4f6;
582
- border: 1px solid #d1d5db;
583
- border-bottom: 2px solid #9ca3af;
584
- border-radius: 4px;
585
- line-height: 1.3;
586
- }`,
587
- },
588
- {
589
- key: "badge",
590
- label: "扩展:彩色徽章 (Badge Pill)",
591
- icon: "🏷️",
592
- description: "胶囊微标签:全圆角胶囊底色,紧凑居中",
593
- css: `.milkdown .editor [data-wechat-node="badge"] {
594
- display: inline-block;
595
- margin: 0 2px;
596
- padding: 2px 8px;
597
- font-size: 12px;
598
- font-weight: 600;
599
- border-radius: 9999px;
600
- line-height: 1.3;
601
- background-color: rgba(202, 96, 147, 0.12);
602
- color: var(--wx-brand-accent, #ca6093);
603
- }`,
604
- },
605
266
  {
606
267
  key: "article-card",
607
- label: "扩展:篇章结构卡片",
268
+ label: "篇章结构卡片 (INTRO / CTA)",
608
269
  icon: "🎴",
609
- description: "文章开头导读 (> [!INTRO]) 与结尾互动号召 (> [!CTA])",
610
270
  defaultPresetId: "magazine",
611
271
  presets: [
612
272
  {
613
273
  id: "magazine",
614
274
  name: "杂志编者按(推荐)",
615
- description: "柔和浅底卡 + 1px 细微框线 + 胶囊标 + 13px 精致小字 + 悬挂元信息与引导条",
616
275
  css: `.milkdown .editor section[data-wechat-node="article-card"],
617
276
  .milkdown .editor .wechat-article-card {
618
277
  margin: 1.8em 0;
@@ -625,10 +284,14 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
625
284
  border: 1px solid var(--wx-divider, #eae4e7);
626
285
  }
627
286
  .milkdown .editor .wechat-article-card-cta {
628
- background-color: rgba(202, 96, 147, 0.04);
287
+ background-color: var(--brand-bg, rgba(202, 96, 147, 0.04));
629
288
  border: 1px dashed var(--wx-brand-accent, #ca6093);
630
289
  text-align: center;
631
290
  }
291
+ .milkdown .editor span[data-wechat-node="card-eyebrow-badge"],
292
+ .milkdown .editor .wechat-card-eyebrow-badge {
293
+ background-color: var(--brand-bg, rgba(202, 96, 147, 0.08));
294
+ }
632
295
  .milkdown .editor .wechat-article-card p {
633
296
  margin: 0.4em 0;
634
297
  font-size: 13px;
@@ -656,7 +319,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
656
319
  {
657
320
  id: "top-line",
658
321
  name: "顶部色彩微线",
659
- description: "顶部 3px 品牌色微边线 + 纯白底色 + 浅微边框 + 13px 精致小字",
660
322
  css: `.milkdown .editor section[data-wechat-node="article-card"],
661
323
  .milkdown .editor .wechat-article-card {
662
324
  margin: 1.8em 0;
@@ -670,10 +332,14 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
670
332
  border-top: 3px solid var(--wx-brand-accent, #ca6093);
671
333
  }
672
334
  .milkdown .editor .wechat-article-card-cta {
673
- background-color: rgba(202, 96, 147, 0.04);
335
+ background-color: var(--brand-bg, rgba(202, 96, 147, 0.04));
674
336
  border: 1px dashed var(--wx-brand-accent, #ca6093);
675
337
  text-align: center;
676
338
  }
339
+ .milkdown .editor span[data-wechat-node="card-eyebrow-badge"],
340
+ .milkdown .editor .wechat-card-eyebrow-badge {
341
+ background-color: var(--brand-bg, rgba(202, 96, 147, 0.08));
342
+ }
677
343
  .milkdown .editor .wechat-article-card p {
678
344
  margin: 0.4em 0;
679
345
  font-size: 13px;
@@ -701,7 +367,6 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
701
367
  {
702
368
  id: "minimal",
703
369
  name: "极简纯白框",
704
- description: "纯白背景 + 1px 细微框线 + 13px 精致小字",
705
370
  css: `.milkdown .editor section[data-wechat-node="article-card"],
706
371
  .milkdown .editor .wechat-article-card {
707
372
  margin: 1.8em 0;
@@ -749,13 +414,10 @@ export const SYNTAX_CATEGORIES: SyntaxCategory[] = [
749
414
  export function buildCombinedPresetsCss(selected: Record<string, string>): string {
750
415
  const cssBlocks: string[] = [];
751
416
  for (const cat of SYNTAX_CATEGORIES) {
752
- if (cat.presets && cat.presets.length > 1) {
753
- const selectedId = selected[cat.key] || cat.defaultPresetId || cat.presets[0].id;
754
- const preset = cat.presets.find((p) => p.id === selectedId) || cat.presets[0];
755
- if (preset && preset.css.trim()) {
756
- cssBlocks.push(`/* [${cat.label}] - ${preset.name} */\n${preset.css.trim()}`);
757
- }
758
- }
417
+ const preset =
418
+ cat.presets.find((p) => p.id === (selected[cat.key] || cat.defaultPresetId)) ||
419
+ cat.presets[0];
420
+ cssBlocks.push(`/* [${cat.label}] - ${preset.name} */\n${preset.css.trim()}`);
759
421
  }
760
422
  return cssBlocks.join("\n\n");
761
423
  }
@@ -1,12 +1,3 @@
1
- ---
2
- title: 微信排版语义节点验收
3
- slug: wechat-renderer-all-nodes
4
- ---
5
-
6
- # 微信排版语义节点验收
7
-
8
- # 一级标题:克制的中文编辑部
9
-
10
1
  > [!INTRO] 导读
11
2
  > **文 / Aatrox** · 预计阅读 5 分钟
12
3
  >
@@ -29,7 +20,7 @@ slug: wechat-renderer-all-nodes
29
20
  >
30
21
  > 引用可以有第二段,并保留 **重点信息**。
31
22
 
32
- ![排版示例图](../../imgx/assets/icons/logo.png "图片说明:克制、清晰、适合移动端阅读")
23
+ ![排版示例图](https://images.unsplash.com/photo-1579546929518-9e396f3cc809?w=800 "图片说明:克制、清晰、适合移动端阅读")
33
24
 
34
25
  - 无序列表第一项
35
26
  - 嵌套列表包含 `nested-code`
@@ -106,7 +97,7 @@ Setext 标题
106
97
 
107
98
  ![引用式图片][reference-image]
108
99
 
109
- [reference-image]: ../../imgx/assets/icons/logo.png "引用式图注"
100
+ [reference-image]: https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?w=800 "引用式图注"
110
101
 
111
102
  ```markdown
112
103
  ![代码示例](./missing-example.png)
@@ -25,6 +25,7 @@ import type { WechatThemeOverrides } from "../schema/config";
25
25
  import { getWechatPreviewStyleName, getWechatPreviewTheme } from "./themes";
26
26
  import { stripLeadingH1 } from "../text";
27
27
  import { buildCombinedPresetsCss } from "./browser/studio/syntax-presets";
28
+ import type { ArticleStructure } from "./wechat-renderer";
28
29
 
29
30
  interface ViteManifestEntry {
30
31
  file: string;
@@ -131,6 +132,10 @@ export function getWechatPreviewBundleSources(): string[] {
131
132
  join(WECHAT_PREVIEW_DIR, "browser/studio/studio.css"),
132
133
  join(WECHAT_PREVIEW_DIR, "browser/studio/syntax-presets.ts"),
133
134
  join(WECHAT_PREVIEW_DIR, "browser/studio/color-palettes.ts"),
135
+ join(WECHAT_PREVIEW_DIR, "browser/studio/style-packs.ts"),
136
+ join(WECHAT_PREVIEW_DIR, "browser/studio/milkdown-article-menu.ts"),
137
+ join(WECHAT_PREVIEW_DIR, "browser/studio/myno-editor.ts"),
138
+ join(WECHAT_PREVIEW_DIR, "browser/studio/config-manager.ts"),
134
139
  join(WECHAT_PREVIEW_DIR, "themes.ts"),
135
140
  join(WECHAT_PREVIEW_DIR, "frontmatter-handler.ts"),
136
141
  join(PACKAGE_ROOT, "src/text.ts"),
@@ -140,24 +145,27 @@ export function getWechatPreviewBundleSources(): string[] {
140
145
  ];
141
146
  }
142
147
 
143
- /** Studio 与 CLI 共用模板、账号覆盖和页首素材的解析顺序。 */
148
+ /** 独立配置跨账号复用;目录模板仍沿用账号覆盖顺序。 */
144
149
  export function resolveWechatArticleTheme(
145
150
  account: string,
146
151
  overrides?: Partial<WechatThemeOverrides>,
147
152
  articleTheme?: ArticleThemePackage | null,
148
153
  ) {
154
+ const standalone = articleTheme?.manifest.css !== undefined;
155
+ const accountOverrides = standalone ? undefined : overrides;
149
156
  const { headerImage, ...templateStructure } = articleTheme?.manifest.structure ?? {};
150
- const theme = getWechatPreviewTheme(account, articleTheme ? {
151
- editorVars: { ...articleTheme.manifest.editorVars, ...overrides?.editorVars },
152
- exportTheme: { footerText: "", ...articleTheme.manifest.exportTheme, ...overrides?.exportTheme },
153
- } : overrides);
154
- const structure = articleTheme ? {
157
+ const theme = getWechatPreviewTheme(standalone ? "default" : account, articleTheme ? {
158
+ editorVars: { ...articleTheme.manifest.editorVars, ...accountOverrides?.editorVars },
159
+ exportTheme: { footerText: "", ...articleTheme.manifest.exportTheme, ...accountOverrides?.exportTheme },
160
+ } : accountOverrides);
161
+ const structure: ArticleStructure | undefined = articleTheme ? {
155
162
  ...templateStructure,
156
- ...overrides?.structure,
163
+ ...accountOverrides?.structure,
157
164
  headerImageUrl: headerImage
158
- ? `data:image/${headerImage.split(".").pop()!.toLowerCase().replace("jpg", "jpeg")};base64,${Buffer.from(articleTheme.files.get(headerImage)!).toString("base64")}` : null,
159
- } : overrides?.structure;
160
- return { theme, structure };
165
+ ? `data:image/${headerImage.split(".").pop()!.toLowerCase().replace("jpg", "jpeg")};base64,${Buffer.from(articleTheme.files.get(headerImage)!).toString("base64")}` : articleTheme.manifest.structure.headerImageUrl ?? null,
166
+ } : accountOverrides?.structure;
167
+ const syntaxPresets = accountOverrides?.syntaxPresets ?? articleTheme?.manifest.syntaxPresets;
168
+ return { theme, structure, syntaxPresets };
161
169
  }
162
170
 
163
171
  export function isWechatPreviewBundleStale(
@@ -264,6 +272,14 @@ export function rewriteRelativeImagePaths(markdown: string, baseDir: string): st
264
272
  }
265
273
  return `![${alt}](${needsBrackets ? "<" : ""}${resolved}${needsBrackets ? ">" : ""}${titleStr})`;
266
274
  })
275
+ .replace(/^([ \t]*\[[^\]]+\]:\s*)(\S+)(.*)$/gm, (match, prefix, rawUrl, suffix) => {
276
+ if (isExternalUrl(rawUrl)) return match;
277
+ const cleanUrl = rawUrl.replace(/^<([^>]+)>$/, "$1");
278
+ const hadAngle = rawUrl.startsWith("<") && rawUrl.endsWith(">");
279
+ const resolved = resolveMarkdownAsset(cleanUrl, baseDir);
280
+ const needsBrackets = resolved ? resolved.includes(" ") : hadAngle;
281
+ return `${prefix}${needsBrackets ? "<" : ""}${resolved}${needsBrackets ? ">" : ""}${suffix}`;
282
+ })
267
283
  .replace(/(<img\b[^>]*\bsrc=["'])([^"']+)(["'][^>]*>)/gi, (_match, prefix, src, suffix) => {
268
284
  const resolved = resolveMarkdownAsset(String(src ?? ""), baseDir);
269
285
  return `${prefix}${resolved}${suffix}`;
@@ -404,9 +420,9 @@ export async function exportMarkdownToWechatHtml(
404
420
  const bodyMarkdown = stripLeadingH1(stripped).trimStart();
405
421
  const markdown = bodyMarkdown;
406
422
  const articleTheme = input.articleThemePath ? await readArticleTheme(input.articleThemePath) : null;
407
- const { theme, structure } = resolveWechatArticleTheme(input.account, input.themeOverrides, articleTheme);
408
- const presetsCss = input.themeOverrides?.syntaxPresets
409
- ? buildCombinedPresetsCss(input.themeOverrides.syntaxPresets)
423
+ const { theme, structure, syntaxPresets } = resolveWechatArticleTheme(input.account, input.themeOverrides, articleTheme);
424
+ const presetsCss = syntaxPresets
425
+ ? buildCombinedPresetsCss(syntaxPresets)
410
426
  : "";
411
427
  const customCss = [presetsCss, articleTheme?.css, input.customCss ? await readFile(input.customCss, "utf-8") : ""].filter(Boolean).join("\n\n");
412
428
  const shell = readUtf8(TEMPLATE_PATH);