pd-markdown 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/package.json +26 -0
  2. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.d.ts +4 -0
  3. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.d.ts.map +1 -0
  4. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.js +5 -0
  5. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/index.js.map +1 -0
  6. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.d.ts +4 -0
  7. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.d.ts.map +1 -0
  8. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.js +4 -0
  9. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/index.js.map +1 -0
  10. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.d.ts +6 -0
  11. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.d.ts.map +1 -0
  12. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.js +36 -0
  13. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/heading.js.map +1 -0
  14. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.d.ts +14 -0
  15. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.d.ts.map +1 -0
  16. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.js +18 -0
  17. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/list.js.map +1 -0
  18. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.d.ts +27 -0
  19. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.d.ts.map +1 -0
  20. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.js +37 -0
  21. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/plugins/transform/table.js.map +1 -0
  22. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.d.ts +22 -0
  23. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.d.ts.map +1 -0
  24. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.js +95 -0
  25. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/processor.js.map +1 -0
  26. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.d.ts +55 -0
  27. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.d.ts.map +1 -0
  28. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.js +2 -0
  29. package/packages/parser/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/parser/dist/types/index.js.map +1 -0
  30. package/packages/parser/__tests__/frontmatter.test.ts +69 -0
  31. package/packages/parser/__tests__/gfm.test.ts +83 -0
  32. package/packages/parser/__tests__/processor.test.ts +136 -0
  33. package/packages/parser/__tests__/transform/heading.test.ts +56 -0
  34. package/packages/parser/__tests__/transform/list.test.ts +67 -0
  35. package/packages/parser/__tests__/transform/table.test.ts +85 -0
  36. package/packages/parser/dist/index.cjs +191 -0
  37. package/packages/parser/dist/index.cjs.map +1 -0
  38. package/packages/parser/dist/index.d.ts +4 -0
  39. package/packages/parser/dist/index.d.ts.map +1 -0
  40. package/packages/parser/dist/index.mjs +185 -0
  41. package/packages/parser/dist/index.mjs.map +1 -0
  42. package/packages/parser/dist/plugins/index.d.ts +4 -0
  43. package/packages/parser/dist/plugins/index.d.ts.map +1 -0
  44. package/packages/parser/dist/plugins/transform/heading.d.ts +6 -0
  45. package/packages/parser/dist/plugins/transform/heading.d.ts.map +1 -0
  46. package/packages/parser/dist/plugins/transform/list.d.ts +14 -0
  47. package/packages/parser/dist/plugins/transform/list.d.ts.map +1 -0
  48. package/packages/parser/dist/plugins/transform/table.d.ts +27 -0
  49. package/packages/parser/dist/plugins/transform/table.d.ts.map +1 -0
  50. package/packages/parser/dist/processor.d.ts +22 -0
  51. package/packages/parser/dist/processor.d.ts.map +1 -0
  52. package/packages/parser/dist/types/index.d.ts +55 -0
  53. package/packages/parser/dist/types/index.d.ts.map +1 -0
  54. package/packages/parser/node_modules/.bin/yaml +17 -0
  55. package/packages/parser/package.json +38 -0
  56. package/packages/parser/rollup.config.ts +38 -0
  57. package/packages/parser/src/index.ts +15 -0
  58. package/packages/parser/src/plugins/index.ts +3 -0
  59. package/packages/parser/src/plugins/transform/heading.ts +40 -0
  60. package/packages/parser/src/plugins/transform/list.ts +29 -0
  61. package/packages/parser/src/plugins/transform/table.ts +62 -0
  62. package/packages/parser/src/processor.ts +119 -0
  63. package/packages/parser/src/types/index.ts +60 -0
  64. package/packages/parser/tsconfig.json +9 -0
  65. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.d.ts +36 -0
  66. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.d.ts.map +1 -0
  67. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.js +99 -0
  68. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/query.js.map +1 -0
  69. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.d.ts +22 -0
  70. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.d.ts.map +1 -0
  71. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.js +46 -0
  72. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/ast/traverse.js.map +1 -0
  73. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.d.ts +7 -0
  74. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.d.ts.map +1 -0
  75. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.js +8 -0
  76. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/index.js.map +1 -0
  77. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.d.ts +22 -0
  78. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.d.ts.map +1 -0
  79. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.js +140 -0
  80. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/sanitize.js.map +1 -0
  81. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.d.ts +16 -0
  82. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.d.ts.map +1 -0
  83. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.js +39 -0
  84. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/string/slugify.js.map +1 -0
  85. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.d.ts +49 -0
  86. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.d.ts.map +1 -0
  87. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.js +19 -0
  88. package/packages/utils/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/utils/dist/types/index.js.map +1 -0
  89. package/packages/utils/__tests__/query.test.ts +155 -0
  90. package/packages/utils/__tests__/sanitize.test.ts +96 -0
  91. package/packages/utils/__tests__/slugify.test.ts +71 -0
  92. package/packages/utils/__tests__/traverse.test.ts +131 -0
  93. package/packages/utils/dist/ast/query.d.ts +36 -0
  94. package/packages/utils/dist/ast/query.d.ts.map +1 -0
  95. package/packages/utils/dist/ast/traverse.d.ts +22 -0
  96. package/packages/utils/dist/ast/traverse.d.ts.map +1 -0
  97. package/packages/utils/dist/index.cjs +358 -0
  98. package/packages/utils/dist/index.cjs.map +1 -0
  99. package/packages/utils/dist/index.d.ts +7 -0
  100. package/packages/utils/dist/index.d.ts.map +1 -0
  101. package/packages/utils/dist/index.mjs +343 -0
  102. package/packages/utils/dist/index.mjs.map +1 -0
  103. package/packages/utils/dist/string/sanitize.d.ts +22 -0
  104. package/packages/utils/dist/string/sanitize.d.ts.map +1 -0
  105. package/packages/utils/dist/string/slugify.d.ts +16 -0
  106. package/packages/utils/dist/string/slugify.d.ts.map +1 -0
  107. package/packages/utils/dist/types/index.d.ts +49 -0
  108. package/packages/utils/dist/types/index.d.ts.map +1 -0
  109. package/packages/utils/package.json +27 -0
  110. package/packages/utils/rollup.config.ts +26 -0
  111. package/packages/utils/src/ast/query.ts +127 -0
  112. package/packages/utils/src/ast/traverse.ts +73 -0
  113. package/packages/utils/src/index.ts +20 -0
  114. package/packages/utils/src/string/sanitize.ts +155 -0
  115. package/packages/utils/src/string/slugify.ts +43 -0
  116. package/packages/utils/src/types/index.ts +72 -0
  117. package/packages/utils/tsconfig.json +8 -0
  118. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.d.ts +27 -0
  119. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.d.ts.map +1 -0
  120. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.js +39 -0
  121. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/MarkdownRenderer.js.map +1 -0
  122. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.d.ts +10 -0
  123. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.d.ts.map +1 -0
  124. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.js +130 -0
  125. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/NodeRenderer.js.map +1 -0
  126. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.d.ts +17 -0
  127. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.d.ts.map +1 -0
  128. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.js +14 -0
  129. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/context.js.map +1 -0
  130. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.d.ts +8 -0
  131. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.d.ts.map +1 -0
  132. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.js +5 -0
  133. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Blockquote.js.map +1 -0
  134. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.d.ts +13 -0
  135. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.d.ts.map +1 -0
  136. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.js +9 -0
  137. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Code.js.map +1 -0
  138. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.d.ts +8 -0
  139. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.d.ts.map +1 -0
  140. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.js +7 -0
  141. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Heading.js.map +1 -0
  142. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.d.ts +7 -0
  143. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.d.ts.map +1 -0
  144. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.js +5 -0
  145. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Image.js.map +1 -0
  146. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.d.ts +8 -0
  147. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.d.ts.map +1 -0
  148. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.js +7 -0
  149. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Link.js.map +1 -0
  150. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.d.ts +13 -0
  151. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.d.ts.map +1 -0
  152. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.js +14 -0
  153. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/List.js.map +1 -0
  154. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.d.ts +8 -0
  155. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.d.ts.map +1 -0
  156. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.js +5 -0
  157. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Paragraph.js.map +1 -0
  158. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.d.ts +19 -0
  159. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.d.ts.map +1 -0
  160. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.js +18 -0
  161. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/Table.js.map +1 -0
  162. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.d.ts +34 -0
  163. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.d.ts.map +1 -0
  164. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.js +28 -0
  165. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/components/defaults/index.js.map +1 -0
  166. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.d.ts +11 -0
  167. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.d.ts.map +1 -0
  168. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.js +28 -0
  169. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/hooks/useMarkdown.js.map +1 -0
  170. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.d.ts +6 -0
  171. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.d.ts.map +1 -0
  172. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.js +9 -0
  173. package/packages/web/.rollup.cache/Users/pidan/Work/Learn/pd-markdown/packages/web/dist/index.js.map +1 -0
  174. package/packages/web/__tests__/MarkdownRenderer.test.tsx +89 -0
  175. package/packages/web/__tests__/NodeRenderer.test.tsx +97 -0
  176. package/packages/web/__tests__/components/Code.test.tsx +71 -0
  177. package/packages/web/__tests__/components/Heading.test.tsx +65 -0
  178. package/packages/web/__tests__/components/List.test.tsx +100 -0
  179. package/packages/web/__tests__/components/Table.test.tsx +105 -0
  180. package/packages/web/__tests__/useMarkdown.test.ts +63 -0
  181. package/packages/web/dist/components/MarkdownRenderer.d.ts +27 -0
  182. package/packages/web/dist/components/MarkdownRenderer.d.ts.map +1 -0
  183. package/packages/web/dist/components/NodeRenderer.d.ts +10 -0
  184. package/packages/web/dist/components/NodeRenderer.d.ts.map +1 -0
  185. package/packages/web/dist/components/context.d.ts +17 -0
  186. package/packages/web/dist/components/context.d.ts.map +1 -0
  187. package/packages/web/dist/components/defaults/Blockquote.d.ts +8 -0
  188. package/packages/web/dist/components/defaults/Blockquote.d.ts.map +1 -0
  189. package/packages/web/dist/components/defaults/Code.d.ts +13 -0
  190. package/packages/web/dist/components/defaults/Code.d.ts.map +1 -0
  191. package/packages/web/dist/components/defaults/Heading.d.ts +8 -0
  192. package/packages/web/dist/components/defaults/Heading.d.ts.map +1 -0
  193. package/packages/web/dist/components/defaults/Image.d.ts +7 -0
  194. package/packages/web/dist/components/defaults/Image.d.ts.map +1 -0
  195. package/packages/web/dist/components/defaults/Link.d.ts +8 -0
  196. package/packages/web/dist/components/defaults/Link.d.ts.map +1 -0
  197. package/packages/web/dist/components/defaults/List.d.ts +13 -0
  198. package/packages/web/dist/components/defaults/List.d.ts.map +1 -0
  199. package/packages/web/dist/components/defaults/Paragraph.d.ts +8 -0
  200. package/packages/web/dist/components/defaults/Paragraph.d.ts.map +1 -0
  201. package/packages/web/dist/components/defaults/Table.d.ts +19 -0
  202. package/packages/web/dist/components/defaults/Table.d.ts.map +1 -0
  203. package/packages/web/dist/components/defaults/index.d.ts +34 -0
  204. package/packages/web/dist/components/defaults/index.d.ts.map +1 -0
  205. package/packages/web/dist/hooks/useMarkdown.d.ts +11 -0
  206. package/packages/web/dist/hooks/useMarkdown.d.ts.map +1 -0
  207. package/packages/web/dist/index.cjs +306 -0
  208. package/packages/web/dist/index.cjs.map +1 -0
  209. package/packages/web/dist/index.d.ts +6 -0
  210. package/packages/web/dist/index.d.ts.map +1 -0
  211. package/packages/web/dist/index.mjs +287 -0
  212. package/packages/web/dist/index.mjs.map +1 -0
  213. package/packages/web/package.json +40 -0
  214. package/packages/web/rollup.config.ts +36 -0
  215. package/packages/web/src/components/MarkdownRenderer.tsx +70 -0
  216. package/packages/web/src/components/NodeRenderer.tsx +205 -0
  217. package/packages/web/src/components/context.ts +24 -0
  218. package/packages/web/src/components/defaults/Blockquote.tsx +11 -0
  219. package/packages/web/src/components/defaults/Code.tsx +26 -0
  220. package/packages/web/src/components/defaults/Heading.tsx +14 -0
  221. package/packages/web/src/components/defaults/Image.tsx +10 -0
  222. package/packages/web/src/components/defaults/Link.tsx +18 -0
  223. package/packages/web/src/components/defaults/List.tsx +33 -0
  224. package/packages/web/src/components/defaults/Paragraph.tsx +11 -0
  225. package/packages/web/src/components/defaults/Table.tsx +50 -0
  226. package/packages/web/src/components/defaults/index.tsx +80 -0
  227. package/packages/web/src/hooks/useMarkdown.ts +32 -0
  228. package/packages/web/src/index.ts +37 -0
  229. package/packages/web/tsconfig.json +11 -0
  230. package/packages/web/vitest.config.ts +9 -0
  231. package/pnpm-workspace.yaml +2 -0
  232. package/tsconfig.base.json +26 -0
  233. package/tsconfig.json +8 -0
  234. package/vitest.config.ts +28 -0
  235. package/vitest.setup.ts +1 -0
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "pd-markdown",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "devDependencies": {
6
+ "@rollup/plugin-commonjs": "^28.0.2",
7
+ "@rollup/plugin-node-resolve": "^16.0.0",
8
+ "@rollup/plugin-typescript": "^12.1.2",
9
+ "@rollup/rollup-darwin-arm64": "^4.57.1",
10
+ "@testing-library/jest-dom": "^6.9.1",
11
+ "@types/node": "^22.13.5",
12
+ "rollup": "^4.34.8",
13
+ "rollup-plugin-dts": "^6.1.1",
14
+ "tslib": "^2.8.1",
15
+ "typescript": "^5.7.3",
16
+ "vitest": "^3.0.7"
17
+ },
18
+ "scripts": {
19
+ "build": "pnpm -r run build",
20
+ "test": "vitest run",
21
+ "test:watch": "vitest",
22
+ "test:coverage": "vitest run --coverage",
23
+ "typecheck": "tsc --noEmit",
24
+ "clean": "pnpm -r run clean"
25
+ }
26
+ }
@@ -0,0 +1,4 @@
1
+ export type { Parser, ParserOptions, ParserPlugin, PluginConfig, FrontmatterData, FileData, } from './types';
2
+ export { createParser, definePlugin } from './processor';
3
+ export { transformHeading, transformList, transformTable } from './plugins';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,MAAM,EACN,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,QAAQ,GACT,MAAM,SAAS,CAAA;AAGhB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAGxD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,5 @@
1
+ // Core
2
+ export { createParser, definePlugin } from './processor';
3
+ // Transform plugins (for advanced usage)
4
+ export { transformHeading, transformList, transformTable } from './plugins';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO;AACP,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAExD,yCAAyC;AACzC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { transformHeading } from './transform/heading';
2
+ export { transformList } from './transform/list';
3
+ export { transformTable } from './transform/table';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { transformHeading } from './transform/heading';
2
+ export { transformList } from './transform/list';
3
+ export { transformTable } from './transform/table';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { Root } from 'mdast';
2
+ /**
3
+ * Transform plugin that adds slug IDs to headings
4
+ */
5
+ export declare function transformHeading(tree: Root): void;
6
+ //# sourceMappingURL=heading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heading.d.ts","sourceRoot":"","sources":["../../../src/plugins/transform/heading.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAA4B,MAAM,OAAO,CAAA;AAqB3D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAejD"}
@@ -0,0 +1,36 @@
1
+ import { visit } from 'unist-util-visit';
2
+ import { uniqueSlugify } from '@pd-markdown/utils';
3
+ /**
4
+ * Extract text content from phrasing content nodes
5
+ */
6
+ function extractText(nodes) {
7
+ return nodes
8
+ .map((node) => {
9
+ if (node.type === 'text') {
10
+ return node.value;
11
+ }
12
+ if ('children' in node) {
13
+ return extractText(node.children);
14
+ }
15
+ return '';
16
+ })
17
+ .join('');
18
+ }
19
+ /**
20
+ * Transform plugin that adds slug IDs to headings
21
+ */
22
+ export function transformHeading(tree) {
23
+ const slugs = new Set();
24
+ visit(tree, 'heading', (node) => {
25
+ const text = extractText(node.children);
26
+ const slug = uniqueSlugify(text, slugs);
27
+ // Add data.id to the heading node
28
+ const data = (node.data || {});
29
+ data.id = slug;
30
+ const hProperties = (data.hProperties || {});
31
+ hProperties.id = slug;
32
+ data.hProperties = hProperties;
33
+ node.data = data;
34
+ });
35
+ }
36
+ //# sourceMappingURL=heading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heading.js","sourceRoot":"","sources":["../../../src/plugins/transform/heading.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD;;GAEG;AACH,SAAS,WAAW,CAAC,KAAwB;IAC3C,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,KAAK,CAAA;QACnB,CAAC;QACD,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;YACvB,OAAO,WAAW,CAAC,IAAI,CAAC,QAA6B,CAAC,CAAA;QACxD,CAAC;QACD,OAAO,EAAE,CAAA;IACX,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAU;IACzC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAE/B,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE;QACvC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAEvC,kCAAkC;QAClC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAA;QACzD,IAAI,CAAC,EAAE,GAAG,IAAI,CAAA;QACd,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAA2B,CAAA;QACtE,WAAW,CAAC,EAAE,GAAG,IAAI,CAAA;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Root } from 'mdast';
2
+ /**
3
+ * Extended list item with index
4
+ */
5
+ declare module 'mdast' {
6
+ interface ListItemData {
7
+ index?: number;
8
+ }
9
+ }
10
+ /**
11
+ * Transform plugin that adds index to list items
12
+ */
13
+ export declare function transformList(tree: Root): void;
14
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/plugins/transform/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAkB,MAAM,OAAO,CAAA;AAGjD;;GAEG;AACH,OAAO,QAAQ,OAAO,CAAC;IACrB,UAAU,YAAY;QACpB,KAAK,CAAC,EAAE,MAAM,CAAA;KACf;CACF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAa9C"}
@@ -0,0 +1,18 @@
1
+ import { visit } from 'unist-util-visit';
2
+ /**
3
+ * Transform plugin that adds index to list items
4
+ */
5
+ export function transformList(tree) {
6
+ visit(tree, 'list', (node) => {
7
+ node.children.forEach((item, index) => {
8
+ item.data = item.data || {};
9
+ item.data.index = index;
10
+ // For ordered lists, also store the actual number
11
+ if (node.ordered) {
12
+ const start = node.start ?? 1;
13
+ item.data.index = start + index;
14
+ }
15
+ });
16
+ });
17
+ }
18
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/plugins/transform/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAWxC;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAU;IACtC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAU,EAAE,EAAE;QACjC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAc,EAAE,KAAa,EAAE,EAAE;YACtD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;YAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;YAEvB,kDAAkD;YAClD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;gBAC7B,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,KAAK,CAAA;YACjC,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { Root } from 'mdast';
2
+ /**
3
+ * Extended table data
4
+ */
5
+ declare module 'mdast' {
6
+ interface TableData {
7
+ /** Header row */
8
+ header?: TableRow;
9
+ /** Body rows */
10
+ body?: TableRow[];
11
+ }
12
+ interface TableCellData {
13
+ /** Whether this cell is in header */
14
+ isHeader?: boolean;
15
+ /** Column alignment */
16
+ align?: 'left' | 'center' | 'right' | null;
17
+ /** Column index */
18
+ columnIndex?: number;
19
+ }
20
+ }
21
+ /**
22
+ * Transform plugin that enhances table structure
23
+ * - Separates header and body rows
24
+ * - Adds alignment and index info to cells
25
+ */
26
+ export declare function transformTable(tree: Root): void;
27
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/plugins/transform/table.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAoB,MAAM,OAAO,CAAA;AAGnD;;GAEG;AACH,OAAO,QAAQ,OAAO,CAAC;IACrB,UAAU,SAAS;QACjB,iBAAiB;QACjB,MAAM,CAAC,EAAE,QAAQ,CAAA;QACjB,gBAAgB;QAChB,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAA;KAClB;IAED,UAAU,aAAa;QACrB,qCAAqC;QACrC,QAAQ,CAAC,EAAE,OAAO,CAAA;QAClB,uBAAuB;QACvB,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAA;QAC1C,mBAAmB;QACnB,WAAW,CAAC,EAAE,MAAM,CAAA;KACrB;CACF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAgC/C"}
@@ -0,0 +1,37 @@
1
+ import { visit } from 'unist-util-visit';
2
+ /**
3
+ * Transform plugin that enhances table structure
4
+ * - Separates header and body rows
5
+ * - Adds alignment and index info to cells
6
+ */
7
+ export function transformTable(tree) {
8
+ visit(tree, 'table', (node) => {
9
+ if (node.children.length === 0)
10
+ return;
11
+ const [headerRow, ...bodyRows] = node.children;
12
+ const align = node.align || [];
13
+ // Mark header row and cells
14
+ if (headerRow) {
15
+ headerRow.children.forEach((cell, index) => {
16
+ cell.data = cell.data || {};
17
+ cell.data.isHeader = true;
18
+ cell.data.align = align[index] || null;
19
+ cell.data.columnIndex = index;
20
+ });
21
+ }
22
+ // Mark body cells
23
+ bodyRows.forEach((row) => {
24
+ row.children.forEach((cell, index) => {
25
+ cell.data = cell.data || {};
26
+ cell.data.isHeader = false;
27
+ cell.data.align = align[index] || null;
28
+ cell.data.columnIndex = index;
29
+ });
30
+ });
31
+ // Store structured data on table node
32
+ node.data = node.data || {};
33
+ node.data.header = headerRow;
34
+ node.data.body = bodyRows;
35
+ });
36
+ }
37
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/plugins/transform/table.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAuBxC;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAU;IACvC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,IAAW,EAAE,EAAE;QACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAEtC,MAAM,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;QAE9B,4BAA4B;QAC5B,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAe,EAAE,KAAa,EAAE,EAAE;gBAC5D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;gBAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;gBACzB,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAA;gBACtC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;YAC/B,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,kBAAkB;QAClB,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACvB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAe,EAAE,KAAa,EAAE,EAAE;gBACtD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;gBAC3B,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAA;gBAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,CAAA;gBACtC,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAA;YAC/B,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,sCAAsC;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;QAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;QAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAA;IAC3B,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { Root } from 'mdast';
2
+ import type { VFile } from 'vfile';
3
+ import type { Parser, ParserOptions, ParserPlugin } from './types';
4
+ /**
5
+ * Create a markdown parser with the specified options
6
+ *
7
+ * @param options - Parser configuration options
8
+ * @returns Parser instance with parse method
9
+ */
10
+ export declare function createParser(options?: ParserOptions): Parser;
11
+ /**
12
+ * Type-safe helper to define a parser plugin
13
+ *
14
+ * @param config - Plugin configuration
15
+ * @returns Parser plugin
16
+ */
17
+ export declare function definePlugin<T = void>(config: {
18
+ name: string;
19
+ phase: 'before' | 'after';
20
+ transform: (options?: T) => (tree: Root, file: VFile) => void;
21
+ }, options?: T): ParserPlugin;
22
+ //# sourceMappingURL=processor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor.d.ts","sourceRoot":"","sources":["../src/processor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAQ,MAAM,OAAO,CAAA;AACvC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAElC,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAY,MAAM,SAAS,CAAA;AA2B5E;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CAuDhE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,GAAG,IAAI,EACnC,MAAM,EAAE;IACN,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAA;IACzB,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,KAAK,IAAI,CAAA;CAC9D,EACD,OAAO,CAAC,EAAE,CAAC,GACV,YAAY,CAMd"}
@@ -0,0 +1,95 @@
1
+ import { unified } from 'unified';
2
+ import remarkParse from 'remark-parse';
3
+ import remarkGfm from 'remark-gfm';
4
+ import remarkFrontmatter from 'remark-frontmatter';
5
+ import { visit } from 'unist-util-visit';
6
+ import { parse as parseYaml } from 'yaml';
7
+ import { transformHeading, transformList, transformTable } from './plugins';
8
+ /**
9
+ * Default parser options
10
+ */
11
+ const DEFAULT_OPTIONS = {
12
+ gfm: true,
13
+ frontmatter: true,
14
+ };
15
+ /**
16
+ * Create frontmatter extraction plugin
17
+ */
18
+ function extractFrontmatter() {
19
+ return (tree, file) => {
20
+ visit(tree, 'yaml', (node) => {
21
+ try {
22
+ const data = parseYaml(node.value);
23
+ file.data.frontmatter = data;
24
+ }
25
+ catch {
26
+ // Invalid YAML, ignore
27
+ }
28
+ });
29
+ };
30
+ }
31
+ /**
32
+ * Create a markdown parser with the specified options
33
+ *
34
+ * @param options - Parser configuration options
35
+ * @returns Parser instance with parse method
36
+ */
37
+ export function createParser(options = {}) {
38
+ const opts = { ...DEFAULT_OPTIONS, ...options };
39
+ const customPlugins = options.plugins || [];
40
+ // Build processor (使用 any 绕过复杂的类型检查)
41
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
42
+ let processor = unified().use(remarkParse);
43
+ // Add GFM support
44
+ if (opts.gfm) {
45
+ processor = processor.use(remarkGfm);
46
+ }
47
+ // Add frontmatter support
48
+ if (opts.frontmatter) {
49
+ processor = processor.use(remarkFrontmatter, ['yaml']);
50
+ }
51
+ // Run custom "before" plugins
52
+ const beforePlugins = customPlugins.filter((p) => p.phase === 'before');
53
+ for (const plugin of beforePlugins) {
54
+ processor = processor.use(() => plugin.transform);
55
+ }
56
+ // Add frontmatter extraction
57
+ if (opts.frontmatter) {
58
+ processor = processor.use(extractFrontmatter);
59
+ }
60
+ // Add built-in transform plugins
61
+ processor = processor
62
+ .use(() => transformHeading)
63
+ .use(() => transformList)
64
+ .use(() => transformTable);
65
+ // Run custom "after" plugins
66
+ const afterPlugins = customPlugins.filter((p) => p.phase === 'after');
67
+ for (const plugin of afterPlugins) {
68
+ processor = processor.use(() => plugin.transform);
69
+ }
70
+ // Freeze processor
71
+ processor.freeze();
72
+ return {
73
+ parse(content) {
74
+ // Parse markdown to AST
75
+ const tree = processor.parse(content);
76
+ // Run all transform plugins
77
+ processor.runSync(tree);
78
+ return tree;
79
+ },
80
+ };
81
+ }
82
+ /**
83
+ * Type-safe helper to define a parser plugin
84
+ *
85
+ * @param config - Plugin configuration
86
+ * @returns Parser plugin
87
+ */
88
+ export function definePlugin(config, options) {
89
+ return {
90
+ name: config.name,
91
+ phase: config.phase,
92
+ transform: config.transform(options),
93
+ };
94
+ }
95
+ //# sourceMappingURL=processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor.js","sourceRoot":"","sources":["../src/processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,WAAW,MAAM,cAAc,CAAA;AACtC,OAAO,SAAS,MAAM,YAAY,CAAA;AAClC,OAAO,iBAAiB,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAA;AAKzC,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE3E;;GAEG;AACH,MAAM,eAAe,GAA6C;IAChE,GAAG,EAAE,IAAI;IACT,WAAW,EAAE,IAAI;CAClB,CAAA;AAED;;GAEG;AACH,SAAS,kBAAkB;IACzB,OAAO,CAAC,IAAU,EAAE,IAAW,EAAE,EAAE;QACjC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,IAAU,EAAE,EAAE;YACjC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAA4B,CAC5D;gBAAC,IAAI,CAAC,IAAiB,CAAC,WAAW,GAAG,IAAI,CAAA;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACP,uBAAuB;YACzB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,UAAyB,EAAE;IACtD,MAAM,IAAI,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE,CAAA;IAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAA;IAE3C,qCAAqC;IACrC,8DAA8D;IAC9D,IAAI,SAAS,GAAQ,OAAO,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAE/C,kBAAkB;IAClB,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IACtC,CAAC;IAED,0BAA0B;IAC1B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IACxD,CAAC;IAED,8BAA8B;IAC9B,MAAM,aAAa,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAA;IACvE,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;QACnC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACnD,CAAC;IAED,6BAA6B;IAC7B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IAC/C,CAAC;IAED,iCAAiC;IACjC,SAAS,GAAG,SAAS;SAClB,GAAG,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC;SAC3B,GAAG,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC;SACxB,GAAG,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,CAAA;IAE5B,6BAA6B;IAC7B,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,CAAA;IACrE,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACnD,CAAC;IAED,mBAAmB;IACnB,SAAS,CAAC,MAAM,EAAE,CAAA;IAElB,OAAO;QACL,KAAK,CAAC,OAAe;YACnB,wBAAwB;YACxB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAS,CAAA;YAE7C,4BAA4B;YAC5B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAEvB,OAAO,IAAI,CAAA;QACb,CAAC;KACF,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,MAIC,EACD,OAAW;IAEX,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;KACrC,CAAA;AACH,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { Root } from 'mdast';
2
+ import type { VFile } from 'vfile';
3
+ /**
4
+ * Parser plugin configuration
5
+ */
6
+ export interface ParserPlugin {
7
+ /** Unique plugin name */
8
+ name: string;
9
+ /** When to run: before or after built-in transforms */
10
+ phase: 'before' | 'after';
11
+ /** Transform function */
12
+ transform: (tree: Root, file: VFile) => void;
13
+ }
14
+ /**
15
+ * Parser options
16
+ */
17
+ export interface ParserOptions {
18
+ /** Custom plugins to add */
19
+ plugins?: ParserPlugin[];
20
+ /** Enable GFM syntax (default: true) */
21
+ gfm?: boolean;
22
+ /** Enable frontmatter parsing (default: true) */
23
+ frontmatter?: boolean;
24
+ }
25
+ /**
26
+ * Parser instance
27
+ */
28
+ export interface Parser {
29
+ /** Parse markdown string to AST */
30
+ parse(content: string): Root;
31
+ }
32
+ /**
33
+ * Plugin definition helper config
34
+ */
35
+ export interface PluginConfig<T = unknown> {
36
+ /** Plugin name */
37
+ name: string;
38
+ /** When to run */
39
+ phase: 'before' | 'after';
40
+ /** Transform function factory */
41
+ transform: (options?: T) => (tree: Root, file: VFile) => void;
42
+ }
43
+ /**
44
+ * Frontmatter data extracted from markdown
45
+ */
46
+ export interface FrontmatterData {
47
+ [key: string]: unknown;
48
+ }
49
+ /**
50
+ * Extended file data with frontmatter
51
+ */
52
+ export interface FileData {
53
+ frontmatter?: FrontmatterData;
54
+ }
55
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAElC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,uDAAuD;IACvD,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAA;IACzB,yBAAyB;IACzB,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,KAAK,IAAI,CAAA;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,4BAA4B;IAC5B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;IACxB,wCAAwC;IACxC,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,iDAAiD;IACjD,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,mCAAmC;IACnC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,CAAC,GAAG,OAAO;IACvC,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,kBAAkB;IAClB,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAA;IACzB,iCAAiC;IACjC,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,KAAK,IAAI,CAAA;CAC9D;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,WAAW,CAAC,EAAE,eAAe,CAAA;CAC9B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,69 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { createParser } from '../src/processor'
3
+ import type { Yaml } from 'mdast'
4
+
5
+ describe('Frontmatter support', () => {
6
+ describe('YAML frontmatter', () => {
7
+ it('should parse YAML frontmatter block', () => {
8
+ const parser = createParser({ frontmatter: true })
9
+ const ast = parser.parse(`---
10
+ title: My Article
11
+ author: John Doe
12
+ date: 2024-01-01
13
+ ---
14
+
15
+ # Content here`)
16
+
17
+ expect(ast.children[0].type).toBe('yaml')
18
+ const yaml = ast.children[0] as Yaml
19
+ expect(yaml.value).toContain('title: My Article')
20
+ })
21
+
22
+ it('should parse nested YAML values', () => {
23
+ const parser = createParser({ frontmatter: true })
24
+ const ast = parser.parse(`---
25
+ meta:
26
+ keywords:
27
+ - markdown
28
+ - parser
29
+ category: tech
30
+ ---
31
+
32
+ Content`)
33
+
34
+ const yaml = ast.children[0] as Yaml
35
+ expect(yaml.value).toContain('keywords:')
36
+ })
37
+
38
+ it('should handle empty frontmatter', () => {
39
+ const parser = createParser({ frontmatter: true })
40
+ const ast = parser.parse(`---
41
+ ---
42
+
43
+ Content`)
44
+
45
+ expect(ast.children[0].type).toBe('yaml')
46
+ })
47
+ })
48
+
49
+ describe('without frontmatter', () => {
50
+ it('should not parse frontmatter when disabled', () => {
51
+ const parser = createParser({ frontmatter: false })
52
+ const ast = parser.parse(`---
53
+ title: Test
54
+ ---
55
+
56
+ Content`)
57
+
58
+ // First child should be thematicBreak, not yaml
59
+ expect(ast.children[0].type).toBe('thematicBreak')
60
+ })
61
+
62
+ it('should parse content without frontmatter', () => {
63
+ const parser = createParser({ frontmatter: true })
64
+ const ast = parser.parse('# Just a heading\n\nSome content')
65
+
66
+ expect(ast.children[0].type).toBe('heading')
67
+ })
68
+ })
69
+ })
@@ -0,0 +1,83 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { createParser } from '../src/processor'
3
+ import type { Table, List, ListItem } from 'mdast'
4
+
5
+ describe('GFM syntax support', () => {
6
+ const parser = createParser({ gfm: true })
7
+
8
+ describe('tables', () => {
9
+ it('should parse basic table', () => {
10
+ const ast = parser.parse(`
11
+ | Header 1 | Header 2 |
12
+ |----------|----------|
13
+ | Cell 1 | Cell 2 |
14
+ | Cell 3 | Cell 4 |
15
+ `.trim())
16
+
17
+ const table = ast.children[0] as Table
18
+ expect(table.type).toBe('table')
19
+ expect(table.children).toHaveLength(3) // 1 header + 2 body rows
20
+ })
21
+
22
+ it('should parse table with alignment', () => {
23
+ const ast = parser.parse(`
24
+ | Left | Center | Right |
25
+ |:-----|:------:|------:|
26
+ | L | C | R |
27
+ `.trim())
28
+
29
+ const table = ast.children[0] as Table
30
+ expect(table.align).toEqual(['left', 'center', 'right'])
31
+ })
32
+ })
33
+
34
+ describe('task lists', () => {
35
+ it('should parse checked items', () => {
36
+ const ast = parser.parse('- [x] Completed task')
37
+
38
+ const list = ast.children[0] as List
39
+ const item = list.children[0] as ListItem
40
+ expect(item.checked).toBe(true)
41
+ })
42
+
43
+ it('should parse unchecked items', () => {
44
+ const ast = parser.parse('- [ ] Pending task')
45
+
46
+ const list = ast.children[0] as List
47
+ const item = list.children[0] as ListItem
48
+ expect(item.checked).toBe(false)
49
+ })
50
+
51
+ it('should parse mixed task list', () => {
52
+ const ast = parser.parse(`
53
+ - [x] Done
54
+ - [ ] Not done
55
+ - Regular item
56
+ `.trim())
57
+
58
+ const list = ast.children[0] as List
59
+ expect(list.children[0].checked).toBe(true)
60
+ expect(list.children[1].checked).toBe(false)
61
+ expect(list.children[2].checked).toBeNull()
62
+ })
63
+ })
64
+
65
+ describe('strikethrough', () => {
66
+ it('should parse strikethrough text', () => {
67
+ const ast = parser.parse('~~deleted text~~')
68
+
69
+ const paragraph = ast.children[0]
70
+ expect(paragraph.type).toBe('paragraph')
71
+ expect((paragraph as any).children[0].type).toBe('delete')
72
+ })
73
+ })
74
+
75
+ describe('autolinks', () => {
76
+ it('should parse URL autolinks', () => {
77
+ const ast = parser.parse('Visit https://example.com for more')
78
+
79
+ const paragraph = ast.children[0]
80
+ expect((paragraph as any).children[1].type).toBe('link')
81
+ })
82
+ })
83
+ })