@prosekit/extensions 0.16.0-beta.0 → 0.16.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 (257) hide show
  1. package/dist/{prosekit-extensions-autocomplete.d.ts → autocomplete.d.ts} +1 -6
  2. package/dist/autocomplete.d.ts.map +1 -0
  3. package/dist/{prosekit-extensions-autocomplete.js → autocomplete.js} +1 -9
  4. package/dist/autocomplete.js.map +1 -0
  5. package/dist/{prosekit-extensions-background-color.d.ts → background-color.d.ts} +1 -8
  6. package/dist/background-color.d.ts.map +1 -0
  7. package/dist/{prosekit-extensions-background-color.js → background-color.js} +1 -7
  8. package/dist/background-color.js.map +1 -0
  9. package/dist/{prosekit-extensions-blockquote.d.ts → blockquote.d.ts} +1 -12
  10. package/dist/blockquote.d.ts.map +1 -0
  11. package/dist/{prosekit-extensions-blockquote.js → blockquote.js} +2 -12
  12. package/dist/blockquote.js.map +1 -0
  13. package/dist/{prosekit-extensions-bold.d.ts → bold.d.ts} +1 -12
  14. package/dist/bold.d.ts.map +1 -0
  15. package/dist/{prosekit-extensions-bold.js → bold.js} +2 -12
  16. package/dist/bold.js.map +1 -0
  17. package/dist/{prosekit-extensions-code-block.d.ts → code-block.d.ts} +1 -20
  18. package/dist/code-block.d.ts.map +1 -0
  19. package/dist/{prosekit-extensions-code-block.js → code-block.js} +3 -21
  20. package/dist/code-block.js.map +1 -0
  21. package/dist/{prosekit-extensions-code.d.ts → code.d.ts} +1 -12
  22. package/dist/code.d.ts.map +1 -0
  23. package/dist/{prosekit-extensions-code.js → code.js} +2 -12
  24. package/dist/code.js.map +1 -0
  25. package/dist/{prosekit-extensions-commit.d.ts → commit.d.ts} +1 -4
  26. package/dist/commit.d.ts.map +1 -0
  27. package/dist/{prosekit-extensions-commit.js → commit.js} +1 -3
  28. package/dist/commit.js.map +1 -0
  29. package/dist/{prosekit-extensions-doc.d.ts → doc.d.ts} +1 -4
  30. package/dist/doc.d.ts.map +1 -0
  31. package/dist/{prosekit-extensions-doc.js → doc.js} +1 -3
  32. package/dist/doc.js.map +1 -0
  33. package/dist/{prosekit-extensions-drop-cursor.d.ts → drop-cursor.d.ts} +1 -4
  34. package/dist/drop-cursor.d.ts.map +1 -0
  35. package/dist/{prosekit-extensions-drop-cursor.js → drop-cursor.js} +1 -3
  36. package/dist/drop-cursor.js.map +1 -0
  37. package/dist/{prosekit-extensions-drop-indicator.d.ts → drop-indicator.d.ts} +1 -4
  38. package/dist/drop-indicator.d.ts.map +1 -0
  39. package/dist/drop-indicator.js +2 -57
  40. package/dist/drop-indicator2.js +53 -0
  41. package/dist/drop-indicator2.js.map +1 -0
  42. package/dist/{prosekit-extensions-enter-rule.d.ts → enter-rule.d.ts} +1 -4
  43. package/dist/enter-rule.d.ts.map +1 -0
  44. package/dist/{prosekit-extensions-enter-rule.js → enter-rule.js} +1 -3
  45. package/dist/enter-rule.js.map +1 -0
  46. package/dist/file.js +2 -128
  47. package/dist/file2.js +120 -0
  48. package/dist/file2.js.map +1 -0
  49. package/dist/{prosekit-extensions-gap-cursor.d.ts → gap-cursor.d.ts} +1 -4
  50. package/dist/gap-cursor.d.ts.map +1 -0
  51. package/dist/{prosekit-extensions-gap-cursor.js → gap-cursor.js} +1 -3
  52. package/dist/gap-cursor.js.map +1 -0
  53. package/dist/{prosekit-extensions-hard-break.d.ts → hard-break.d.ts} +1 -10
  54. package/dist/hard-break.d.ts.map +1 -0
  55. package/dist/{prosekit-extensions-hard-break.js → hard-break.js} +1 -9
  56. package/dist/hard-break.js.map +1 -0
  57. package/dist/{prosekit-extensions-heading.d.ts → heading.d.ts} +1 -14
  58. package/dist/heading.d.ts.map +1 -0
  59. package/dist/{prosekit-extensions-heading.js → heading.js} +2 -12
  60. package/dist/heading.js.map +1 -0
  61. package/dist/{prosekit-extensions-horizontal-rule.d.ts → horizontal-rule.d.ts} +1 -10
  62. package/dist/horizontal-rule.d.ts.map +1 -0
  63. package/dist/{prosekit-extensions-horizontal-rule.js → horizontal-rule.js} +2 -10
  64. package/dist/horizontal-rule.js.map +1 -0
  65. package/dist/{prosekit-extensions-image.d.ts → image.d.ts} +1 -14
  66. package/dist/image.d.ts.map +1 -0
  67. package/dist/{prosekit-extensions-image.js → image.js} +2 -14
  68. package/dist/image.js.map +1 -0
  69. package/dist/index.d.ts +0 -7
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/{prosekit-extensions-input-rule.d.ts → input-rule.d.ts} +1 -4
  72. package/dist/input-rule.d.ts.map +1 -0
  73. package/dist/{prosekit-extensions-input-rule.js → input-rule.js} +1 -3
  74. package/dist/input-rule.js.map +1 -0
  75. package/dist/{prosekit-extensions-italic.d.ts → italic.d.ts} +1 -12
  76. package/dist/italic.d.ts.map +1 -0
  77. package/dist/{prosekit-extensions-italic.js → italic.js} +2 -12
  78. package/dist/italic.js.map +1 -0
  79. package/dist/{prosekit-extensions-link.d.ts → link.d.ts} +1 -8
  80. package/dist/link.d.ts.map +1 -0
  81. package/dist/{prosekit-extensions-link.js → link.js} +5 -11
  82. package/dist/link.js.map +1 -0
  83. package/dist/{prosekit-extensions-list.d.ts → list.d.ts} +1 -18
  84. package/dist/list.d.ts.map +1 -0
  85. package/dist/{prosekit-extensions-list.js → list.js} +3 -19
  86. package/dist/list.js.map +1 -0
  87. package/dist/{prosekit-extensions-loro.d.ts → loro.d.ts} +1 -14
  88. package/dist/loro.d.ts.map +1 -0
  89. package/dist/{prosekit-extensions-loro.js → loro.js} +1 -13
  90. package/dist/loro.js.map +1 -0
  91. package/dist/{prosekit-extensions-mark-rule.d.ts → mark-rule.d.ts} +1 -6
  92. package/dist/mark-rule.d.ts.map +1 -0
  93. package/dist/mark-rule.js +2 -157
  94. package/dist/mark-rule2.js +151 -0
  95. package/dist/mark-rule2.js.map +1 -0
  96. package/dist/{prosekit-extensions-math.d.ts → math.d.ts} +1 -10
  97. package/dist/math.d.ts.map +1 -0
  98. package/dist/{prosekit-extensions-math.js → math.js} +3 -11
  99. package/dist/math.js.map +1 -0
  100. package/dist/{prosekit-extensions-mention.d.ts → mention.d.ts} +1 -4
  101. package/dist/mention.d.ts.map +1 -0
  102. package/dist/{prosekit-extensions-mention.js → mention.js} +1 -3
  103. package/dist/mention.js.map +1 -0
  104. package/dist/{prosekit-extensions-mod-click-prevention.d.ts → mod-click-prevention.d.ts} +1 -4
  105. package/dist/mod-click-prevention.d.ts.map +1 -0
  106. package/dist/{prosekit-extensions-mod-click-prevention.js → mod-click-prevention.js} +1 -3
  107. package/dist/mod-click-prevention.js.map +1 -0
  108. package/dist/{prosekit-extensions-page.d.ts → page.d.ts} +1 -12
  109. package/dist/page.d.ts.map +1 -0
  110. package/dist/{prosekit-extensions-page.js → page.js} +3 -15
  111. package/dist/page.js.map +1 -0
  112. package/dist/{prosekit-extensions-paragraph.d.ts → paragraph.d.ts} +1 -10
  113. package/dist/paragraph.d.ts.map +1 -0
  114. package/dist/{prosekit-extensions-paragraph.js → paragraph.js} +1 -9
  115. package/dist/paragraph.js.map +1 -0
  116. package/dist/{prosekit-extensions-paste-rule.d.ts → paste-rule.d.ts} +1 -6
  117. package/dist/paste-rule.d.ts.map +1 -0
  118. package/dist/paste-rule.js +2 -158
  119. package/dist/paste-rule2.js +150 -0
  120. package/dist/paste-rule2.js.map +1 -0
  121. package/dist/{prosekit-extensions-placeholder.d.ts → placeholder.d.ts} +1 -4
  122. package/dist/placeholder.d.ts.map +1 -0
  123. package/dist/{prosekit-extensions-placeholder.js → placeholder.js} +2 -4
  124. package/dist/placeholder.js.map +1 -0
  125. package/dist/{prosekit-extensions-readonly.d.ts → readonly.d.ts} +1 -4
  126. package/dist/readonly.d.ts.map +1 -0
  127. package/dist/{prosekit-extensions-readonly.js → readonly.js} +6 -3
  128. package/dist/readonly.js.map +1 -0
  129. package/dist/{prosekit-extensions-search.d.ts → search.d.ts} +1 -4
  130. package/dist/search.d.ts.map +1 -0
  131. package/dist/{prosekit-extensions-search.js → search.js} +1 -3
  132. package/dist/search.js.map +1 -0
  133. package/dist/shiki-highlighter-chunk.js +0 -2
  134. package/dist/shiki-highlighter-chunk.js.map +1 -1
  135. package/dist/{prosekit-extensions-strike.d.ts → strike.d.ts} +1 -4
  136. package/dist/strike.d.ts.map +1 -0
  137. package/dist/{prosekit-extensions-strike.js → strike.js} +2 -4
  138. package/dist/strike.js.map +1 -0
  139. package/dist/{prosekit-extensions-table.d.ts → table.d.ts} +1 -26
  140. package/dist/table.d.ts.map +1 -0
  141. package/dist/table.js +2 -276
  142. package/dist/table2.js +252 -0
  143. package/dist/table2.js.map +1 -0
  144. package/dist/{prosekit-extensions-text-align.d.ts → text-align.d.ts} +1 -4
  145. package/dist/text-align.d.ts.map +1 -0
  146. package/dist/{prosekit-extensions-text-align.js → text-align.js} +1 -3
  147. package/dist/text-align.js.map +1 -0
  148. package/dist/{prosekit-extensions-text-color.d.ts → text-color.d.ts} +1 -8
  149. package/dist/text-color.d.ts.map +1 -0
  150. package/dist/{prosekit-extensions-text-color.js → text-color.js} +1 -7
  151. package/dist/text-color.js.map +1 -0
  152. package/dist/{prosekit-extensions-text.d.ts → text.d.ts} +1 -4
  153. package/dist/text.d.ts.map +1 -0
  154. package/dist/{prosekit-extensions-text.js → text.js} +1 -3
  155. package/dist/text.js.map +1 -0
  156. package/dist/{prosekit-extensions-underline.d.ts → underline.d.ts} +1 -4
  157. package/dist/underline.d.ts.map +1 -0
  158. package/dist/{prosekit-extensions-underline.js → underline.js} +1 -3
  159. package/dist/underline.js.map +1 -0
  160. package/dist/{prosekit-extensions-virtual-selection.d.ts → virtual-selection.d.ts} +1 -4
  161. package/dist/virtual-selection.d.ts.map +1 -0
  162. package/dist/{prosekit-extensions-virtual-selection.js → virtual-selection.js} +1 -3
  163. package/dist/virtual-selection.js.map +1 -0
  164. package/dist/{prosekit-extensions-yjs.d.ts → yjs.d.ts} +1 -16
  165. package/dist/yjs.d.ts.map +1 -0
  166. package/dist/{prosekit-extensions-yjs.js → yjs.js} +1 -13
  167. package/dist/yjs.js.map +1 -0
  168. package/package.json +136 -194
  169. package/src/page/page-element.ts +2 -2
  170. package/src/readonly/index.ts +6 -0
  171. package/dist/drop-indicator.js.map +0 -1
  172. package/dist/file.js.map +0 -1
  173. package/dist/mark-rule.js.map +0 -1
  174. package/dist/paste-rule.js.map +0 -1
  175. package/dist/prosekit-extensions-autocomplete.d.ts.map +0 -1
  176. package/dist/prosekit-extensions-autocomplete.js.map +0 -1
  177. package/dist/prosekit-extensions-background-color.d.ts.map +0 -1
  178. package/dist/prosekit-extensions-background-color.js.map +0 -1
  179. package/dist/prosekit-extensions-blockquote.d.ts.map +0 -1
  180. package/dist/prosekit-extensions-blockquote.js.map +0 -1
  181. package/dist/prosekit-extensions-bold.d.ts.map +0 -1
  182. package/dist/prosekit-extensions-bold.js.map +0 -1
  183. package/dist/prosekit-extensions-code-block.d.ts.map +0 -1
  184. package/dist/prosekit-extensions-code-block.js.map +0 -1
  185. package/dist/prosekit-extensions-code.d.ts.map +0 -1
  186. package/dist/prosekit-extensions-code.js.map +0 -1
  187. package/dist/prosekit-extensions-commit.d.ts.map +0 -1
  188. package/dist/prosekit-extensions-commit.js.map +0 -1
  189. package/dist/prosekit-extensions-doc.d.ts.map +0 -1
  190. package/dist/prosekit-extensions-doc.js.map +0 -1
  191. package/dist/prosekit-extensions-drop-cursor.d.ts.map +0 -1
  192. package/dist/prosekit-extensions-drop-cursor.js.map +0 -1
  193. package/dist/prosekit-extensions-drop-indicator.d.ts.map +0 -1
  194. package/dist/prosekit-extensions-drop-indicator.js +0 -2
  195. package/dist/prosekit-extensions-enter-rule.d.ts.map +0 -1
  196. package/dist/prosekit-extensions-enter-rule.js.map +0 -1
  197. package/dist/prosekit-extensions-file.js +0 -2
  198. package/dist/prosekit-extensions-gap-cursor.d.ts.map +0 -1
  199. package/dist/prosekit-extensions-gap-cursor.js.map +0 -1
  200. package/dist/prosekit-extensions-hard-break.d.ts.map +0 -1
  201. package/dist/prosekit-extensions-hard-break.js.map +0 -1
  202. package/dist/prosekit-extensions-heading.d.ts.map +0 -1
  203. package/dist/prosekit-extensions-heading.js.map +0 -1
  204. package/dist/prosekit-extensions-horizontal-rule.d.ts.map +0 -1
  205. package/dist/prosekit-extensions-horizontal-rule.js.map +0 -1
  206. package/dist/prosekit-extensions-image.d.ts.map +0 -1
  207. package/dist/prosekit-extensions-image.js.map +0 -1
  208. package/dist/prosekit-extensions-input-rule.d.ts.map +0 -1
  209. package/dist/prosekit-extensions-input-rule.js.map +0 -1
  210. package/dist/prosekit-extensions-italic.d.ts.map +0 -1
  211. package/dist/prosekit-extensions-italic.js.map +0 -1
  212. package/dist/prosekit-extensions-link.d.ts.map +0 -1
  213. package/dist/prosekit-extensions-link.js.map +0 -1
  214. package/dist/prosekit-extensions-list.d.ts.map +0 -1
  215. package/dist/prosekit-extensions-list.js.map +0 -1
  216. package/dist/prosekit-extensions-loro.d.ts.map +0 -1
  217. package/dist/prosekit-extensions-loro.js.map +0 -1
  218. package/dist/prosekit-extensions-mark-rule.d.ts.map +0 -1
  219. package/dist/prosekit-extensions-mark-rule.js +0 -2
  220. package/dist/prosekit-extensions-math.d.ts.map +0 -1
  221. package/dist/prosekit-extensions-math.js.map +0 -1
  222. package/dist/prosekit-extensions-mention.d.ts.map +0 -1
  223. package/dist/prosekit-extensions-mention.js.map +0 -1
  224. package/dist/prosekit-extensions-mod-click-prevention.d.ts.map +0 -1
  225. package/dist/prosekit-extensions-mod-click-prevention.js.map +0 -1
  226. package/dist/prosekit-extensions-page.d.ts.map +0 -1
  227. package/dist/prosekit-extensions-page.js.map +0 -1
  228. package/dist/prosekit-extensions-paragraph.d.ts.map +0 -1
  229. package/dist/prosekit-extensions-paragraph.js.map +0 -1
  230. package/dist/prosekit-extensions-paste-rule.d.ts.map +0 -1
  231. package/dist/prosekit-extensions-paste-rule.js +0 -2
  232. package/dist/prosekit-extensions-placeholder.d.ts.map +0 -1
  233. package/dist/prosekit-extensions-placeholder.js.map +0 -1
  234. package/dist/prosekit-extensions-readonly.d.ts.map +0 -1
  235. package/dist/prosekit-extensions-readonly.js.map +0 -1
  236. package/dist/prosekit-extensions-search.d.ts.map +0 -1
  237. package/dist/prosekit-extensions-search.js.map +0 -1
  238. package/dist/prosekit-extensions-strike.d.ts.map +0 -1
  239. package/dist/prosekit-extensions-strike.js.map +0 -1
  240. package/dist/prosekit-extensions-table.d.ts.map +0 -1
  241. package/dist/prosekit-extensions-table.js +0 -2
  242. package/dist/prosekit-extensions-text-align.d.ts.map +0 -1
  243. package/dist/prosekit-extensions-text-align.js.map +0 -1
  244. package/dist/prosekit-extensions-text-color.d.ts.map +0 -1
  245. package/dist/prosekit-extensions-text-color.js.map +0 -1
  246. package/dist/prosekit-extensions-text.d.ts.map +0 -1
  247. package/dist/prosekit-extensions-text.js.map +0 -1
  248. package/dist/prosekit-extensions-underline.d.ts.map +0 -1
  249. package/dist/prosekit-extensions-underline.js.map +0 -1
  250. package/dist/prosekit-extensions-virtual-selection.d.ts.map +0 -1
  251. package/dist/prosekit-extensions-virtual-selection.js.map +0 -1
  252. package/dist/prosekit-extensions-yjs.d.ts.map +0 -1
  253. package/dist/prosekit-extensions-yjs.js.map +0 -1
  254. package/dist/table.js.map +0 -1
  255. /package/dist/{prosekit-extensions-file.d.ts → file.d.ts} +0 -0
  256. /package/dist/{prosekit-extensions.js → index.js} +0 -0
  257. /package/dist/{prosekit-extensions.d.ts → index2.d.ts} +0 -0
@@ -1,8 +1,6 @@
1
1
  import { Command } from "@prosekit/pm/state";
2
2
  import { Extension, PlainExtension, Union } from "@prosekit/core";
3
3
  import { Attrs } from "@prosekit/pm/model";
4
-
5
- //#region src/page/page-break-commands.d.ts
6
4
  /**
7
5
  * @internal
8
6
  */
@@ -19,8 +17,6 @@ declare function insertPageBreak(): Command;
19
17
  * @internal
20
18
  */
21
19
  declare function definePageBreakCommands(): PageBreakCommandsExtension;
22
- //#endregion
23
- //#region src/page/page-break-keymap.d.ts
24
20
  /**
25
21
  * @internal
26
22
  */
@@ -29,8 +25,6 @@ type PageBreakKeymapExtension = PlainExtension;
29
25
  * @internal
30
26
  */
31
27
  declare function definePageBreakKeymap(): PageBreakKeymapExtension;
32
- //#endregion
33
- //#region src/page/page-break-spec.d.ts
34
28
  /**
35
29
  * @internal
36
30
  */
@@ -48,8 +42,6 @@ declare module '@prosekit/pm/model' {
48
42
  pageBreak?: boolean | undefined;
49
43
  }
50
44
  } //# sourceMappingURL=page-break-spec.d.ts.map
51
- //#endregion
52
- //#region src/page/page-break.d.ts
53
45
  /**
54
46
  * @internal
55
47
  */
@@ -58,8 +50,6 @@ type PageBreakExtension = Union<[PageBreakSpecExtension, PageBreakCommandsExtens
58
50
  * @public
59
51
  */
60
52
  declare function definePageBreak(): PageBreakExtension;
61
- //#endregion
62
- //#region src/page/page-rendering.d.ts
63
53
  /**
64
54
  * @public
65
55
  */
@@ -109,6 +99,5 @@ declare function definePageRendering(options?: PageRenderingOptions): PageRender
109
99
  * @internal
110
100
  */
111
101
  type PageRenderingExtension = Extension;
112
- //#endregion
113
102
  export { type PageBreakCommandsExtension, type PageBreakExtension, type PageBreakKeymapExtension, type PageBreakSpecExtension, type PageRenderingExtension, type PageRenderingOptions, definePageBreak, definePageBreakCommands, definePageBreakKeymap, definePageBreakSpec, definePageRendering, insertPageBreak };
114
- //# sourceMappingURL=prosekit-extensions-page.d.ts.map
103
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","names":[],"sources":["../src/page/page-break-commands.ts","../src/page/page-break-keymap.ts","../src/page/page-break-spec.ts","../src/page/page-break.ts","../src/page/page-rendering.ts"],"mappings":";;;;;AAOA;KAAY,0BAAA,GAA6B,SAAA;EACvC,QAAA;IACE,eAAA;EAAA;AAAA;;;;iBAoBY,eAAA,CAAA,GAAmB,OAAA;;;;iBAOnB,uBAAA,CAAA,GAA2B,0BAAA;;;;KC7B/B,wBAAA,GAA2B,cAAA;;;;iBAKvB,qBAAA,CAAA,GAAyB,wBAAA;;;ADLzC;KEDY,sBAAA,GAAyB,SAAA;EACnC,KAAA;IACE,SAAA,EAAW,KAAA;EAAA;AAAA;;;;iBAOC,mBAAA,CAAA,GAAuB,sBAAA;AAAA;EAAA,UAc3B,QAAA;IACR,SAAA;EAAA;AAAA;AFvBJ;;;AAAA,KGEY,kBAAA,GAAqB,KAAA,EAC9B,sBAAA,EAAwB,0BAAA,EAA4B,wBAAA;;AHmBvD;;iBGbgB,eAAA,CAAA,GAAmB,kBAAA;;;;UCLlB,oBAAA;EJJqB;;;;;EIUpC,SAAA;EJRiB;;AAoBnB;;;EILE,UAAA;EJKwC;AAO1C;;;;EILE,SAAA;;AHxBF;;;;EG+BE,WAAA;EH1Bc;;;;;EGiCd,YAAA;EFvCU;;;;;EE8CV,UAAA;AAAA;;;;iBAMc,mBAAA,CAAoB,OAAA,GAAS,oBAAA,GAA4B,sBAAA;;;;KAS7D,sBAAA,GAAyB,SAAA"}
@@ -4,7 +4,6 @@ import { Decoration, DecorationSet } from "@prosekit/pm/view";
4
4
  import { Fragment, Slice } from "@prosekit/pm/model";
5
5
  import { getId, once } from "@ocavue/utils";
6
6
  import { HTMLElement, customElements } from "server-dom-shim";
7
- //#region src/page/page-break-commands.ts
8
7
  const insertPageBreakCommand = (state, dispatch) => {
9
8
  if (!dispatch) return true;
10
9
  const { schema, tr } = state;
@@ -27,16 +26,12 @@ function insertPageBreak() {
27
26
  function definePageBreakCommands() {
28
27
  return defineCommands({ insertPageBreak });
29
28
  }
30
- //#endregion
31
- //#region src/page/page-break-keymap.ts
32
29
  /**
33
30
  * @internal
34
31
  */
35
32
  function definePageBreakKeymap() {
36
33
  return defineKeymap({ "Mod-Enter": insertPageBreak() });
37
34
  }
38
- //#endregion
39
- //#region src/page/page-break-spec.ts
40
35
  /**
41
36
  * @internal
42
37
  */
@@ -56,16 +51,12 @@ function definePageBreakSpec() {
56
51
  pageBreak: true
57
52
  });
58
53
  }
59
- //#endregion
60
- //#region src/page/page-break.ts
61
54
  /**
62
55
  * @public
63
56
  */
64
57
  function definePageBreak() {
65
58
  return union(definePageBreakSpec(), definePageBreakCommands(), definePageBreakKeymap());
66
59
  }
67
- //#endregion
68
- //#region src/page/page-element.ts
69
60
  /**
70
61
  * @internal
71
62
  */
@@ -73,10 +64,10 @@ const PAGE_CHUNK_TAG_NAME = "pm-page-chunk";
73
64
  /**
74
65
  * @internal
75
66
  */
76
- const registerPageChunkElement = /* @__PURE__ */ once(() => {
67
+ function registerPageChunkElement() {
77
68
  if (typeof window === "undefined" || customElements.get("pm-page-chunk")) return;
78
69
  customElements.define(PAGE_CHUNK_TAG_NAME, PageChunkElement);
79
- });
70
+ }
80
71
  var PageChunkElement = class extends HTMLElement {
81
72
  static {
82
73
  this.observedAttributes = [
@@ -242,8 +233,6 @@ function findAllChunks(element, group) {
242
233
  const elements = element.closest(".ProseMirror")?.querySelectorAll(`${PAGE_CHUNK_TAG_NAME}[data-group="${group}"]`);
243
234
  return Array.from(elements || []);
244
235
  }
245
- //#endregion
246
- //#region src/page/page-rendering.ts
247
236
  /**
248
237
  * @public
249
238
  */
@@ -318,7 +307,6 @@ function createPageRenderingPlugin(options) {
318
307
  }
319
308
  });
320
309
  }
321
- //#endregion
322
310
  export { definePageBreak, definePageBreakCommands, definePageBreakKeymap, definePageBreakSpec, definePageRendering, insertPageBreak };
323
311
 
324
- //# sourceMappingURL=prosekit-extensions-page.js.map
312
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.js","names":["#parseDataAttributes","#isLeader","#isHeadPending","#render","#contentBoxHeight","#paddingTop","#paddingBottom","#requestUpdate","#group","#forceNextBreak","#pageHeight","#parseFloatAttribute","#pageMarginTop","#pageMarginBottom","#size","#paddingTopPending","#paddingBottomPending","#isHead","#isTail","#isTailPending","#updateRequested","#updateAll"],"sources":["../src/page/page-break-commands.ts","../src/page/page-break-keymap.ts","../src/page/page-break-spec.ts","../src/page/page-break.ts","../src/page/page-element.ts","../src/page/page-rendering.ts"],"sourcesContent":["import { defineCommands, getNodeType, type Extension } from '@prosekit/core'\nimport { Fragment, Slice } from '@prosekit/pm/model'\nimport type { Command } from '@prosekit/pm/state'\n\n/**\n * @internal\n */\nexport type PageBreakCommandsExtension = Extension<{\n Commands: {\n insertPageBreak: []\n }\n}>\n\nconst insertPageBreakCommand: Command = (state, dispatch): boolean => {\n if (!dispatch) return true\n\n const { schema, tr } = state\n const type = getNodeType(schema, 'pageBreak')\n const node = type.createChecked()\n const pos = tr.selection.anchor\n const slice = new Slice(Fragment.from(node), 0, 0)\n tr.replaceRange(pos, pos, slice).scrollIntoView()\n dispatch(tr)\n return true\n}\n\n/**\n * @internal\n */\nexport function insertPageBreak(): Command {\n return insertPageBreakCommand\n}\n\n/**\n * @internal\n */\nexport function definePageBreakCommands(): PageBreakCommandsExtension {\n return defineCommands({\n insertPageBreak: insertPageBreak,\n })\n}\n","import { defineKeymap, type PlainExtension } from '@prosekit/core'\n\nimport { insertPageBreak } from './page-break-commands.ts'\n\n/**\n * @internal\n */\nexport type PageBreakKeymapExtension = PlainExtension\n\n/**\n * @internal\n */\nexport function definePageBreakKeymap(): PageBreakKeymapExtension {\n return defineKeymap({\n 'Mod-Enter': insertPageBreak(),\n })\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\n\n/**\n * @internal\n */\nexport type PageBreakSpecExtension = Extension<{\n Nodes: {\n pageBreak: Attrs\n }\n}>\n\n/**\n * @internal\n */\nexport function definePageBreakSpec(): PageBreakSpecExtension {\n return defineNodeSpec({\n name: 'pageBreak',\n group: 'block',\n selectable: true,\n parseDOM: [{ tag: 'div.prosekit-page-break' }],\n toDOM() {\n return ['div', { class: 'prosekit-horizontal-rule prosekit-page-break' }, ['hr']]\n },\n pageBreak: true,\n })\n}\n\ndeclare module '@prosekit/pm/model' {\n interface NodeSpec {\n pageBreak?: boolean | undefined\n }\n}\n","import { union, type Union } from '@prosekit/core'\n\nimport { definePageBreakCommands, type PageBreakCommandsExtension } from './page-break-commands.ts'\nimport { definePageBreakKeymap, type PageBreakKeymapExtension } from './page-break-keymap.ts'\nimport { definePageBreakSpec, type PageBreakSpecExtension } from './page-break-spec.ts'\n\n/**\n * @internal\n */\nexport type PageBreakExtension = Union<\n [PageBreakSpecExtension, PageBreakCommandsExtension, PageBreakKeymapExtension]\n>\n\n/**\n * @public\n */\nexport function definePageBreak(): PageBreakExtension {\n return union(\n definePageBreakSpec(),\n definePageBreakCommands(),\n definePageBreakKeymap(),\n )\n}\n","import { once } from '@ocavue/utils'\nimport { customElements, HTMLElement } from 'server-dom-shim'\n\n/**\n * @internal\n */\nexport const PAGE_CHUNK_TAG_NAME = 'pm-page-chunk'\n\n/**\n * @internal\n */\nexport function registerPageChunkElement(): void {\n if (typeof window === 'undefined' || customElements.get(PAGE_CHUNK_TAG_NAME)) return\n customElements.define(PAGE_CHUNK_TAG_NAME, PageChunkElement)\n}\n\nclass PageChunkElement extends HTMLElement {\n static observedAttributes = [\n 'data-group',\n 'data-break',\n 'data-h',\n 'data-mt',\n 'data-mb',\n\n // Only the first chunk of the whole document has this attribute.\n 'data-size',\n ]\n\n // Data attributes set by external code\n #group: string = ''\n #forceNextBreak: boolean = false\n #pageHeight: number = 0\n #pageMarginTop: number = 0\n #pageMarginBottom: number = 0\n #size: number | undefined = undefined\n\n // Internal states\n #updateRequested: boolean = false\n #contentBoxHeight: number = 0\n\n // Rendering states\n #isHead: boolean = false\n #isTail: boolean = false\n #paddingTop: number = 0\n #paddingBottom: number = 0\n\n // Pending rendering states\n #isHeadPending: boolean = false\n #isTailPending: boolean = false\n #paddingTopPending: number = 0\n #paddingBottomPending: number = 0\n\n connectedCallback() {\n this.#parseDataAttributes()\n\n if (this.#isLeader()) {\n this.#isHeadPending = true\n }\n\n this.#render()\n\n // Get the initial content box height when the resize observer is not started yet. Notice that\n // `this.clientHeight` is an integer while the content box height can be a float, so this is not\n // accurate but should be good enough for the first render.\n this.#contentBoxHeight = this.clientHeight - this.#paddingTop - this.#paddingBottom\n\n observeElement(this)\n\n this.#requestUpdate()\n }\n\n disconnectedCallback() {\n unobserveElement(this)\n }\n\n attributeChangedCallback(_: string, oldValue: string | null, newValue: string | null) {\n if (oldValue === newValue) return\n this.#parseDataAttributes()\n this.#requestUpdate()\n }\n\n #parseDataAttributes() {\n this.#group = this.getAttribute('data-group') || ''\n this.#forceNextBreak = this.hasAttribute('data-break')\n this.#pageHeight = this.#parseFloatAttribute('data-h')\n this.#pageMarginTop = this.#parseFloatAttribute('data-mt')\n this.#pageMarginBottom = this.#parseFloatAttribute('data-mb')\n\n const sizeAttr = this.getAttribute('data-size')\n this.#size = sizeAttr ? Number.parseInt(sizeAttr, 10) : undefined\n }\n\n #parseFloatAttribute(name: string): number {\n const value = this.getAttribute(name)\n return value != null ? Number.parseFloat(value) : 0\n }\n\n #isLeader() {\n return this.#size != null\n }\n\n #render() {\n if (this.#paddingTop !== this.#paddingTopPending || this.#paddingBottom !== this.#paddingBottomPending) {\n Object.assign(this.style, {\n paddingTop: `${this.#paddingTop = this.#paddingTopPending}px`,\n paddingBottom: `${this.#paddingBottom = this.#paddingBottomPending}px`,\n })\n }\n if (this.#isHead !== this.#isHeadPending) {\n this.toggleAttribute('data-page-head', this.#isHead = this.#isHeadPending)\n }\n if (this.#isTail !== this.#isTailPending) {\n this.toggleAttribute('data-page-tail', this.#isTail = this.#isTailPending)\n }\n }\n\n setHeight(height: number) {\n // Avoid potential float number precision issues\n if (Math.abs(this.#contentBoxHeight - height) < 0.1) {\n return\n }\n this.#contentBoxHeight = height\n this.#requestUpdate()\n }\n\n /**\n * Schedules a batched page layout recalculation.\n *\n * Any chunk can call this method, but the actual layout work (#updateAll)\n * always runs on the leader chunk, because it needs to iterate over every\n * chunk in order to compute page breaks.\n *\n * Two nested microtasks are used to batch updates:\n *\n * Microtask 1 – Delegation: non-leader chunks forward the request to the\n * leader chunk, so multiple chunks changing in the same tick only trigger\n * one layout pass.\n *\n * Microtask 2 – Execution: the leader chunk defers #updateAll to a second\n * microtask so that any other attribute / resize changes that were queued\n * in the same tick (and forwarded during microtask 1) are already reflected\n * before the layout is recalculated.\n *\n * The #updateRequested flag acts as a deduplication guard so that rapid\n * successive calls (e.g. multiple attributes changing at once) result in at\n * most one scheduled pass per chunk.\n */\n #requestUpdate() {\n if (this.#updateRequested) {\n return\n }\n\n this.#updateRequested = true\n queueMicrotask(() => {\n if (!this.#isLeader()) {\n this.#updateRequested = false\n const leader = findLeaderChunk(this, this.#group)\n if (!leader) return\n leader.#requestUpdate()\n return\n }\n queueMicrotask(() => {\n this.#updateRequested = false\n this.#updateAll()\n })\n })\n }\n\n #updateAll() {\n if (!this.isConnected) {\n return\n }\n\n const elements = findAllChunks(this, this.#group)\n const count = elements.length\n if (count === 0) return\n\n const pageHeight = this.#pageHeight\n const pageMarginTop = this.#pageMarginTop\n const maxContentHeight = pageHeight - pageMarginTop - this.#pageMarginBottom\n\n let currentContentHeight = 0\n let forceNextBreak = false\n\n for (let i = 0; i < count; i++) {\n const element = elements[i]\n const h = element.#contentBoxHeight\n const isHead = forceNextBreak || i === 0 || (currentContentHeight + h > maxContentHeight)\n\n forceNextBreak = element.#forceNextBreak\n\n if (isHead && i > 0) {\n const prev = elements[i - 1]\n prev.#paddingBottomPending = Math.max(0, pageHeight - pageMarginTop - currentContentHeight)\n prev.#isTailPending = true\n currentContentHeight = h\n } else {\n currentContentHeight += h\n }\n\n element.#paddingTopPending = isHead ? pageMarginTop : 0\n element.#paddingBottomPending = 0\n element.#isTailPending = false\n element.#isHeadPending = isHead\n }\n\n const last = elements[count - 1]\n last.#paddingBottomPending = Math.max(0, pageHeight - pageMarginTop - currentContentHeight)\n last.#isTailPending = true\n\n for (const element of elements) {\n element.#render()\n }\n }\n}\n\nfunction handleResize(entries: ResizeObserverEntry[]) {\n for (const entry of entries) {\n const contentBoxHeight = entry.contentBoxSize?.[0]?.blockSize ?? entry.contentRect.height\n const element = entry.target as PageChunkElement\n element.setHeight(contentBoxHeight)\n }\n}\n\nconst getResizeObserver = /* @__PURE__ */ once(() => {\n return new ResizeObserver(handleResize)\n})\n\nfunction observeElement(element: PageChunkElement) {\n getResizeObserver().observe(element)\n}\n\nfunction unobserveElement(element: PageChunkElement) {\n getResizeObserver().unobserve(element)\n}\n\nfunction findLeaderChunk(element: HTMLElement, group: string): PageChunkElement | null | undefined {\n const root = element.closest('.ProseMirror')\n return root?.querySelector<PageChunkElement>(`${PAGE_CHUNK_TAG_NAME}[data-group=\"${group}\"][data-size]`)\n}\n\nfunction findAllChunks(element: HTMLElement, group: string): PageChunkElement[] {\n const root = element.closest('.ProseMirror')\n const elements = root?.querySelectorAll<PageChunkElement>(`${PAGE_CHUNK_TAG_NAME}[data-group=\"${group}\"]`)\n return Array.from(elements || [])\n}\n","import { getId } from '@ocavue/utils'\nimport { definePlugin, type Extension } from '@prosekit/core'\nimport type { Node } from '@prosekit/pm/model'\nimport { Plugin, PluginKey } from '@prosekit/pm/state'\nimport { Decoration, DecorationSet } from '@prosekit/pm/view'\n\nimport { PAGE_CHUNK_TAG_NAME, registerPageChunkElement } from './page-element.ts'\n\n/**\n * @public\n */\nexport interface PageRenderingOptions {\n /**\n * The width of the page in px.\n *\n * @default 794 (Portrait A4 paper size in 96 DPI)\n */\n pageWidth?: number\n\n /**\n * The height of the page in px.\n *\n * @default 1123 (Portrait A4 paper size in 96 DPI)\n */\n pageHeight?: number\n\n /**\n * The top margin of the page in px.\n *\n * @default 70\n */\n marginTop?: number\n\n /**\n * The right margin of the page in px.\n *\n * @default 70\n */\n marginRight?: number\n\n /**\n * The bottom margin of the page in px.\n *\n * @default 70\n */\n marginBottom?: number\n\n /**\n * The left margin of the page in px.\n *\n * @default 70\n */\n marginLeft?: number\n}\n\n/**\n * @public\n */\nexport function definePageRendering(options: PageRenderingOptions = {}): PageRenderingExtension {\n return definePlugin(\n createPageRenderingPlugin(options),\n )\n}\n\n/**\n * @internal\n */\nexport type PageRenderingExtension = Extension\n\nfunction createPageRenderingPlugin(options: PageRenderingOptions): Plugin {\n const {\n pageWidth = 794,\n pageHeight = 1123,\n marginTop = 70,\n marginRight = 70,\n marginBottom = 70,\n marginLeft = 70,\n } = options\n\n type PluginState = [group: string, decoration: DecorationSet]\n\n const key = new PluginKey<PluginState>('prosekit-page-render')\n\n function createDecorationSet(doc: Node, group: string): DecorationSet {\n const decorations: Decoration[] = []\n const totalCount = doc.childCount\n\n doc.forEach((node, pos, index) => {\n const isPageBreak: boolean | undefined = node.type.spec.pageBreak\n\n decorations.push(Decoration.node(pos, pos + node.nodeSize, {\n 'nodeName': PAGE_CHUNK_TAG_NAME,\n 'data-group': group,\n 'data-break': isPageBreak ? 'true' : undefined,\n 'data-h': String(pageHeight),\n 'data-mt': String(marginTop),\n 'data-mb': String(marginBottom),\n 'data-size': index === 0 ? String(totalCount) : undefined,\n }))\n })\n\n return DecorationSet.create(doc, decorations)\n }\n\n return new Plugin<PluginState>({\n key,\n view: () => {\n registerPageChunkElement()\n return {}\n },\n state: {\n init: (_config, state): PluginState => {\n const group = `page-group-${getId()}`\n const decoration = createDecorationSet(state.doc, group)\n return [group, decoration]\n },\n apply: (tr, value, oldState, newState): PluginState => {\n if (!tr.docChanged) return value\n\n const [group, decoration] = value\n\n let needRecreate = oldState.doc.childCount !== newState.doc.childCount\n\n if (!needRecreate) {\n const count = oldState.doc.childCount\n for (let i = 0; i < count; i++) {\n const oldNode = oldState.doc.child(i)\n const newNode = newState.doc.child(i)\n if (oldNode.type !== newNode.type) {\n needRecreate = true\n break\n }\n }\n }\n\n if (!needRecreate) {\n const mapped = decoration.map(tr.mapping, tr.doc, {\n onRemove: () => {\n needRecreate = true\n },\n })\n if (!needRecreate) {\n return [group, mapped]\n }\n }\n\n return [group, createDecorationSet(newState.doc, group)]\n },\n },\n props: {\n decorations: (state) => {\n return key.getState(state)?.[1]\n },\n attributes: {\n style: [\n `--page-margin-right:${marginRight}px;`,\n `--page-margin-left:${marginLeft}px;`,\n `--page-width:${pageWidth}px;`,\n `--page-height:${pageHeight}px;`,\n ].join(''),\n },\n },\n })\n}\n"],"mappings":"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"}
@@ -1,8 +1,6 @@
1
1
  import { Command } from "@prosekit/pm/state";
2
2
  import { Extension, PlainExtension, Union } from "@prosekit/core";
3
3
  import { Attrs } from "@prosekit/pm/model";
4
-
5
- //#region src/paragraph/paragraph-commands.d.ts
6
4
  /**
7
5
  * @internal
8
6
  */
@@ -15,14 +13,10 @@ type ParagraphCommandsExtension = Extension<{
15
13
  * @internal
16
14
  */
17
15
  declare function defineParagraphCommands(): ParagraphCommandsExtension;
18
- //#endregion
19
- //#region src/paragraph/paragraph-keymap.d.ts
20
16
  /**
21
17
  * @internal
22
18
  */
23
19
  declare function defineParagraphKeymap(): PlainExtension;
24
- //#endregion
25
- //#region src/paragraph/paragraph-spec.d.ts
26
20
  /**
27
21
  * @internal
28
22
  */
@@ -37,8 +31,6 @@ type ParagraphSpecExtension = Extension<{
37
31
  * Defines a paragraph node spec.
38
32
  */
39
33
  declare function defineParagraphSpec(): ParagraphSpecExtension;
40
- //#endregion
41
- //#region src/paragraph/paragraph.d.ts
42
34
  /**
43
35
  * @internal
44
36
  */
@@ -52,6 +44,5 @@ type ParagraphExtension = Union<[ParagraphSpecExtension, ParagraphCommandsExtens
52
44
  * default block node for most cases.
53
45
  */
54
46
  declare function defineParagraph(): ParagraphExtension;
55
- //#endregion
56
47
  export { type ParagraphCommandsExtension, type ParagraphExtension, type ParagraphSpecExtension, defineParagraph, defineParagraphCommands, defineParagraphKeymap, defineParagraphSpec };
57
- //# sourceMappingURL=prosekit-extensions-paragraph.d.ts.map
48
+ //# sourceMappingURL=paragraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paragraph.d.ts","names":[],"sources":["../src/paragraph/paragraph-commands.ts","../src/paragraph/paragraph-keymap.ts","../src/paragraph/paragraph-spec.ts","../src/paragraph/paragraph.ts"],"mappings":";;;;;AAMA;KAAY,0BAAA,GAA6B,SAAA;EACvC,QAAA;IACE,YAAA;EAAA;AAAA;;;;iBAcY,uBAAA,CAAA,GAA2B,0BAAA;;;;iBCf3B,qBAAA,CAAA,GAAyB,cAAA;;;ADDzC;KEAY,sBAAA,GAAyB,SAAA;EACnC,KAAA;IACE,SAAA,EAAW,KAAA;EAAA;AAAA;;;;AFcf;;iBELgB,mBAAA,CAAA,GAAuB,sBAAA;;AFXvC;;KGIY,kBAAA,GAAqB,KAAA,EAAO,sBAAA,EAAwB,0BAAA;;;;;;;AHYhE;;iBGFgB,eAAA,CAAA,GAAmB,kBAAA"}
@@ -1,5 +1,4 @@
1
1
  import { defineCommands, defineKeymap, defineNodeSpec, setBlockType, union, withPriority } from "@prosekit/core";
2
- //#region src/paragraph/paragraph-commands.ts
3
2
  /**
4
3
  * @internal
5
4
  */
@@ -12,16 +11,12 @@ function setParagraph() {
12
11
  function defineParagraphCommands() {
13
12
  return defineCommands({ setParagraph });
14
13
  }
15
- //#endregion
16
- //#region src/paragraph/paragraph-keymap.ts
17
14
  /**
18
15
  * @internal
19
16
  */
20
17
  function defineParagraphKeymap() {
21
18
  return defineKeymap({ "Mod-Alt-0": setParagraph() });
22
19
  }
23
- //#endregion
24
- //#region src/paragraph/paragraph-spec.ts
25
20
  /**
26
21
  * @internal
27
22
  *
@@ -38,8 +33,6 @@ function defineParagraphSpec() {
38
33
  }
39
34
  });
40
35
  }
41
- //#endregion
42
- //#region src/paragraph/paragraph.ts
43
36
  /**
44
37
  * @public
45
38
  *
@@ -51,7 +44,6 @@ function defineParagraphSpec() {
51
44
  function defineParagraph() {
52
45
  return union(withPriority(defineParagraphSpec(), 4), defineParagraphCommands(), defineParagraphKeymap());
53
46
  }
54
- //#endregion
55
47
  export { defineParagraph, defineParagraphCommands, defineParagraphKeymap, defineParagraphSpec };
56
48
 
57
- //# sourceMappingURL=prosekit-extensions-paragraph.js.map
49
+ //# sourceMappingURL=paragraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paragraph.js","names":[],"sources":["../src/paragraph/paragraph-commands.ts","../src/paragraph/paragraph-keymap.ts","../src/paragraph/paragraph-spec.ts","../src/paragraph/paragraph.ts"],"sourcesContent":["import { defineCommands, setBlockType, type Extension } from '@prosekit/core'\nimport type { Command } from '@prosekit/pm/state'\n\n/**\n * @internal\n */\nexport type ParagraphCommandsExtension = Extension<{\n Commands: {\n setParagraph: []\n }\n}>\n\n/**\n * @internal\n */\nexport function setParagraph(): Command {\n return setBlockType({ type: 'paragraph' })\n}\n\n/**\n * @internal\n */\nexport function defineParagraphCommands(): ParagraphCommandsExtension {\n return defineCommands({ setParagraph })\n}\n","import { defineKeymap, type PlainExtension } from '@prosekit/core'\n\nimport { setParagraph } from './paragraph-commands.ts'\n\n/**\n * @internal\n */\nexport function defineParagraphKeymap(): PlainExtension {\n return defineKeymap({\n 'Mod-Alt-0': setParagraph(),\n })\n}\n","import { defineNodeSpec, type Extension } from '@prosekit/core'\nimport type { Attrs } from '@prosekit/pm/model'\n\n/**\n * @internal\n */\nexport type ParagraphSpecExtension = Extension<{\n Nodes: {\n paragraph: Attrs\n }\n}>\n\n/**\n * @internal\n *\n * Defines a paragraph node spec.\n */\nexport function defineParagraphSpec(): ParagraphSpecExtension {\n return defineNodeSpec({\n name: 'paragraph',\n content: 'inline*',\n group: 'block',\n parseDOM: [{ tag: 'p' }],\n toDOM() {\n return ['p', 0]\n },\n })\n}\n","import type { Priority } from '@prosekit/core'\nimport { union, withPriority, type Union } from '@prosekit/core'\n\nimport { defineParagraphCommands, type ParagraphCommandsExtension } from './paragraph-commands.ts'\nimport { defineParagraphKeymap } from './paragraph-keymap.ts'\nimport { defineParagraphSpec, type ParagraphSpecExtension } from './paragraph-spec.ts'\n\n/**\n * @internal\n */\nexport type ParagraphExtension = Union<[ParagraphSpecExtension, ParagraphCommandsExtension]>\n\n/**\n * @public\n *\n * Defines a paragraph node.\n *\n * The paragraph node spec has the highest priority, because it should be the\n * default block node for most cases.\n */\nexport function defineParagraph(): ParagraphExtension {\n return union(\n withPriority(defineParagraphSpec(), 4 satisfies typeof Priority.highest),\n defineParagraphCommands(),\n defineParagraphKeymap(),\n )\n}\n"],"mappings":";;;;AAeA,SAAgB,eAAwB;AACtC,QAAO,aAAa,EAAE,MAAM,aAAa,CAAC;;;;;AAM5C,SAAgB,0BAAsD;AACpE,QAAO,eAAe,EAAE,cAAc,CAAC;;;;;AChBzC,SAAgB,wBAAwC;AACtD,QAAO,aAAa,EAClB,aAAa,cAAc,EAC5B,CAAC;;;;;;;ACOJ,SAAgB,sBAA8C;AAC5D,QAAO,eAAe;EACpB,MAAM;EACN,SAAS;EACT,OAAO;EACP,UAAU,CAAC,EAAE,KAAK,KAAK,CAAC;EACxB,QAAQ;AACN,UAAO,CAAC,KAAK,EAAE;;EAElB,CAAC;;;;;;;;;;ACNJ,SAAgB,kBAAsC;AACpD,QAAO,MACL,aAAa,qBAAqB,EAAE,EAAoC,EACxE,yBAAyB,EACzB,uBAAuB,CACxB"}
@@ -1,8 +1,6 @@
1
1
  import { PlainExtension } from "@prosekit/core";
2
2
  import { EditorView } from "@prosekit/pm/view";
3
3
  import { Attrs, MarkType, ProseMirrorNode, Slice } from "@prosekit/pm/model";
4
-
5
- //#region src/paste-rule/mark-paste-rule.d.ts
6
4
  /**
7
5
  * The options for {@link defineMarkPasteRule}.
8
6
  *
@@ -37,8 +35,6 @@ interface MarkPasteRuleOptions {
37
35
  * @public
38
36
  */
39
37
  declare function defineMarkPasteRule(options: MarkPasteRuleOptions): PlainExtension;
40
- //#endregion
41
- //#region src/paste-rule/paste-rule.d.ts
42
38
  /**
43
39
  * @public
44
40
  *
@@ -88,6 +84,5 @@ interface PasteRuleOptions {
88
84
  declare function definePasteRule({
89
85
  handler
90
86
  }: PasteRuleOptions): PlainExtension;
91
- //#endregion
92
87
  export { type MarkPasteRuleOptions, type PasteRuleHandler, type PasteRuleHandlerOptions, type PasteRuleOptions, defineMarkPasteRule, definePasteRule };
93
- //# sourceMappingURL=prosekit-extensions-paste-rule.d.ts.map
88
+ //# sourceMappingURL=paste-rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paste-rule.d.ts","names":[],"sources":["../src/paste-rule/mark-paste-rule.ts","../src/paste-rule/paste-rule.ts"],"mappings":";;;;;AAYA;;;UAAiB,oBAAA;EAUA;;;;EALf,KAAA,EAAO,MAAA;EAmB4B;;;EAdnC,IAAA,WAAe,QAAA;EAAA;;;;;;EAQf,QAAA,IAAY,KAAA,EAAO,eAAA,KAAoB,KAAA;EAMzB;;;AAQhB;EARE,UAAA,IAAc,IAAA,EAAM,eAAA;AAAA;;;;;;iBAQN,mBAAA,CAAoB,OAAA,EAAS,oBAAA,GAAuB,cAAA;;AAhCpE;;;;UCDiB,uBAAA;EDmBI;;;ECfnB,KAAA,EAAO,KAAA;EDqB4B;;;EChBnC,IAAA,EAAM,UAAA;EDES;;;;ECIf,KAAA;AAAA;;;;;ADkBF;;KCTY,gBAAA,IAAoB,OAAA,EAAS,uBAAA,KAA4B,KAAA;;;;;;UAOpD,gBAAA;;AA/BjB;;EAmCE,OAAA,EAAS,gBAAA;AAAA;;;;;;;;AAXX;iBAsBgB,eAAA,CAAA;EAAkB;AAAA,GAAW,gBAAA,GAAmB,cAAA"}
@@ -1,158 +1,2 @@
1
- import { PluginKey, ProseMirrorPlugin } from "@prosekit/pm/state";
2
- import { defineFacet, defineFacetPayload, getMarkType, pluginFacet } from "@prosekit/core";
3
- import { Fragment, Slice } from "@prosekit/pm/model";
4
- //#region src/paste-rule/paste-rule-plugin.ts
5
- /**
6
- * @internal
7
- */
8
- const pasteRuleFacet = defineFacet({
9
- reduce: () => {
10
- let handlers = [];
11
- const transformPasted = (slice, view, plain) => {
12
- for (const handler of handlers) slice = handler({
13
- slice,
14
- view,
15
- plain
16
- });
17
- return slice;
18
- };
19
- const plugin = new ProseMirrorPlugin({
20
- key: new PluginKey("prosekit-paste-rule"),
21
- props: { transformPasted }
22
- });
23
- return (inputs) => {
24
- handlers = [...inputs].reverse();
25
- return plugin;
26
- };
27
- },
28
- singleton: true,
29
- parent: pluginFacet
30
- });
31
- /**
32
- * @internal
33
- */
34
- function definePasteRulePlugin(payload) {
35
- return defineFacetPayload(pasteRuleFacet, [payload]);
36
- }
37
- //#endregion
38
- //#region src/paste-rule/paste-rule.ts
39
- /**
40
- * Defines a paste rule. This rule allows you to modify pasted or dragged
41
- * content before it is inserted into the document.
42
- *
43
- * @param options
44
- *
45
- * @public
46
- */
47
- function definePasteRule({ handler }) {
48
- return definePasteRulePlugin(handler);
49
- }
50
- //#endregion
51
- //#region src/paste-rule/split-text-by-regex.ts
52
- /**
53
- * Splits text into chunks based on regex matches, preserving both matched and unmatched segments.
54
- * Returns an array of tuples where each tuple contains a text segment and either the match data
55
- * (for matched segments) or undefined (for unmatched segments).
56
- */
57
- function splitTextByRegex(text, regex) {
58
- regex.lastIndex = 0;
59
- const chunks = [];
60
- let lastIndex = 0;
61
- let match;
62
- let matched = false;
63
- while (match = regex.exec(text)) {
64
- const start = match.index;
65
- const end = regex.lastIndex;
66
- if (start > lastIndex) chunks.push([text.slice(lastIndex, start), void 0]);
67
- chunks.push([text.slice(start, end), match]);
68
- matched = true;
69
- if (lastIndex === end) return;
70
- lastIndex = end;
71
- }
72
- if (matched && lastIndex < text.length) chunks.push([text.slice(lastIndex), void 0]);
73
- regex.lastIndex = 0;
74
- return matched ? chunks : void 0;
75
- }
76
- //#endregion
77
- //#region src/paste-rule/mark-paste-rule.ts
78
- /**
79
- * Defines a paste rule that applies marks based on regex patterns.
80
- *
81
- * @public
82
- */
83
- function defineMarkPasteRule(options) {
84
- return definePasteRule({ handler: ({ slice, view, plain }) => {
85
- if (plain) return slice;
86
- return replaceMarkInSlice({
87
- markType: getMarkType(view.state.schema, options.type),
88
- regex: options.regex,
89
- getAttrs: options.getAttrs,
90
- shouldSkip: options.shouldSkip
91
- }, slice);
92
- } });
93
- }
94
- function replaceMarkInSlice(options, slice) {
95
- const newFragment = replaceMarkInFragment(options, slice.content);
96
- if (!newFragment) return slice;
97
- return new Slice(newFragment, slice.openStart, slice.openEnd);
98
- }
99
- function replaceMarkInFragment(options, fragment) {
100
- let changed = false;
101
- const children = [];
102
- for (const child of fragment.content) {
103
- const newChild = replaceMarkInNode(options, child);
104
- if (newChild) changed = true;
105
- children.push(newChild || child);
106
- }
107
- if (changed) return Fragment.from(children);
108
- }
109
- function replaceMarkInNode(options, node) {
110
- if (node.type.spec.code) return;
111
- if (node.type.isInline) return;
112
- if (node.type.isTextblock) return replaceMarkInTextblockNode(options, node);
113
- const newChildren = replaceMarkInFragment(options, node.content);
114
- if (!newChildren) return;
115
- return node.copy(newChildren);
116
- }
117
- function replaceMarkInTextblockNode(options, node) {
118
- const newChildren = [];
119
- let changed = false;
120
- for (const inlineNode of node.content.content) {
121
- const newInlineNodes = replaceMarkInInlineNode(options, inlineNode);
122
- if (newInlineNodes) {
123
- changed = true;
124
- newChildren.push(...newInlineNodes);
125
- } else newChildren.push(inlineNode);
126
- }
127
- if (changed) return node.copy(Fragment.from(newChildren));
128
- }
129
- function replaceMarkInInlineNode(options, node) {
130
- const text = node.text;
131
- if (!text) return;
132
- const { markType, shouldSkip } = options;
133
- if (shouldSkip) {
134
- if (shouldSkip(node)) return;
135
- } else {
136
- if (node.marks.some((mark) => mark.type === markType)) return;
137
- if (node.marks.some((mark) => mark.type.spec.code)) return;
138
- }
139
- const chunks = splitTextByRegex(text, options.regex);
140
- if (!chunks) return;
141
- const schema = node.type.schema;
142
- const nodes = [];
143
- for (const [text, match] of chunks) {
144
- if (!text) continue;
145
- if (match) {
146
- const attrs = options.getAttrs?.(match) ?? null;
147
- if (attrs !== false) {
148
- const mark = markType.create(attrs);
149
- nodes.push(schema.text(text, [...node.marks, mark]));
150
- } else nodes.push(schema.text(text, node.marks));
151
- } else nodes.push(schema.text(text, node.marks));
152
- }
153
- return nodes;
154
- }
155
- //#endregion
156
- export { definePasteRule as n, defineMarkPasteRule as t };
157
-
158
- //# sourceMappingURL=paste-rule.js.map
1
+ import { n as definePasteRule, t as defineMarkPasteRule } from "./paste-rule2.js";
2
+ export { defineMarkPasteRule, definePasteRule };
@@ -0,0 +1,150 @@
1
+ import { PluginKey, ProseMirrorPlugin } from "@prosekit/pm/state";
2
+ import { defineFacet, defineFacetPayload, getMarkType, pluginFacet } from "@prosekit/core";
3
+ import { Fragment, Slice } from "@prosekit/pm/model";
4
+ /**
5
+ * @internal
6
+ */
7
+ const pasteRuleFacet = defineFacet({
8
+ reduce: () => {
9
+ let handlers = [];
10
+ const transformPasted = (slice, view, plain) => {
11
+ for (const handler of handlers) slice = handler({
12
+ slice,
13
+ view,
14
+ plain
15
+ });
16
+ return slice;
17
+ };
18
+ const plugin = new ProseMirrorPlugin({
19
+ key: new PluginKey("prosekit-paste-rule"),
20
+ props: { transformPasted }
21
+ });
22
+ return (inputs) => {
23
+ handlers = [...inputs].reverse();
24
+ return plugin;
25
+ };
26
+ },
27
+ singleton: true,
28
+ parent: pluginFacet
29
+ });
30
+ /**
31
+ * @internal
32
+ */
33
+ function definePasteRulePlugin(payload) {
34
+ return defineFacetPayload(pasteRuleFacet, [payload]);
35
+ }
36
+ /**
37
+ * Defines a paste rule. This rule allows you to modify pasted or dragged
38
+ * content before it is inserted into the document.
39
+ *
40
+ * @param options
41
+ *
42
+ * @public
43
+ */
44
+ function definePasteRule({ handler }) {
45
+ return definePasteRulePlugin(handler);
46
+ }
47
+ /**
48
+ * Splits text into chunks based on regex matches, preserving both matched and unmatched segments.
49
+ * Returns an array of tuples where each tuple contains a text segment and either the match data
50
+ * (for matched segments) or undefined (for unmatched segments).
51
+ */
52
+ function splitTextByRegex(text, regex) {
53
+ regex.lastIndex = 0;
54
+ const chunks = [];
55
+ let lastIndex = 0;
56
+ let match;
57
+ let matched = false;
58
+ while (match = regex.exec(text)) {
59
+ const start = match.index;
60
+ const end = regex.lastIndex;
61
+ if (start > lastIndex) chunks.push([text.slice(lastIndex, start), void 0]);
62
+ chunks.push([text.slice(start, end), match]);
63
+ matched = true;
64
+ if (lastIndex === end) return;
65
+ lastIndex = end;
66
+ }
67
+ if (matched && lastIndex < text.length) chunks.push([text.slice(lastIndex), void 0]);
68
+ regex.lastIndex = 0;
69
+ return matched ? chunks : void 0;
70
+ }
71
+ /**
72
+ * Defines a paste rule that applies marks based on regex patterns.
73
+ *
74
+ * @public
75
+ */
76
+ function defineMarkPasteRule(options) {
77
+ return definePasteRule({ handler: ({ slice, view, plain }) => {
78
+ if (plain) return slice;
79
+ return replaceMarkInSlice({
80
+ markType: getMarkType(view.state.schema, options.type),
81
+ regex: options.regex,
82
+ getAttrs: options.getAttrs,
83
+ shouldSkip: options.shouldSkip
84
+ }, slice);
85
+ } });
86
+ }
87
+ function replaceMarkInSlice(options, slice) {
88
+ const newFragment = replaceMarkInFragment(options, slice.content);
89
+ if (!newFragment) return slice;
90
+ return new Slice(newFragment, slice.openStart, slice.openEnd);
91
+ }
92
+ function replaceMarkInFragment(options, fragment) {
93
+ let changed = false;
94
+ const children = [];
95
+ for (const child of fragment.content) {
96
+ const newChild = replaceMarkInNode(options, child);
97
+ if (newChild) changed = true;
98
+ children.push(newChild || child);
99
+ }
100
+ if (changed) return Fragment.from(children);
101
+ }
102
+ function replaceMarkInNode(options, node) {
103
+ if (node.type.spec.code) return;
104
+ if (node.type.isInline) return;
105
+ if (node.type.isTextblock) return replaceMarkInTextblockNode(options, node);
106
+ const newChildren = replaceMarkInFragment(options, node.content);
107
+ if (!newChildren) return;
108
+ return node.copy(newChildren);
109
+ }
110
+ function replaceMarkInTextblockNode(options, node) {
111
+ const newChildren = [];
112
+ let changed = false;
113
+ for (const inlineNode of node.content.content) {
114
+ const newInlineNodes = replaceMarkInInlineNode(options, inlineNode);
115
+ if (newInlineNodes) {
116
+ changed = true;
117
+ newChildren.push(...newInlineNodes);
118
+ } else newChildren.push(inlineNode);
119
+ }
120
+ if (changed) return node.copy(Fragment.from(newChildren));
121
+ }
122
+ function replaceMarkInInlineNode(options, node) {
123
+ const text = node.text;
124
+ if (!text) return;
125
+ const { markType, shouldSkip } = options;
126
+ if (shouldSkip) {
127
+ if (shouldSkip(node)) return;
128
+ } else {
129
+ if (node.marks.some((mark) => mark.type === markType)) return;
130
+ if (node.marks.some((mark) => mark.type.spec.code)) return;
131
+ }
132
+ const chunks = splitTextByRegex(text, options.regex);
133
+ if (!chunks) return;
134
+ const schema = node.type.schema;
135
+ const nodes = [];
136
+ for (const [text, match] of chunks) {
137
+ if (!text) continue;
138
+ if (match) {
139
+ const attrs = options.getAttrs?.(match) ?? null;
140
+ if (attrs !== false) {
141
+ const mark = markType.create(attrs);
142
+ nodes.push(schema.text(text, [...node.marks, mark]));
143
+ } else nodes.push(schema.text(text, node.marks));
144
+ } else nodes.push(schema.text(text, node.marks));
145
+ }
146
+ return nodes;
147
+ }
148
+ export { definePasteRule as n, defineMarkPasteRule as t };
149
+
150
+ //# sourceMappingURL=paste-rule2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paste-rule2.js","names":[],"sources":["../src/paste-rule/paste-rule-plugin.ts","../src/paste-rule/paste-rule.ts","../src/paste-rule/split-text-by-regex.ts","../src/paste-rule/mark-paste-rule.ts"],"sourcesContent":["import { defineFacet, defineFacetPayload, pluginFacet, type PlainExtension, type PluginPayload } from '@prosekit/core'\nimport type { Slice } from '@prosekit/pm/model'\nimport { PluginKey, ProseMirrorPlugin } from '@prosekit/pm/state'\nimport type { EditorView } from '@prosekit/pm/view'\n\ntype PasteRulePayload = (options: { slice: Slice; view: EditorView; plain: boolean }) => Slice\n\n/**\n * @internal\n */\nconst pasteRuleFacet = defineFacet<PasteRulePayload, PluginPayload>({\n reduce: () => {\n let handlers: PasteRulePayload[] = []\n\n const transformPasted = (slice: Slice, view: EditorView, plain: boolean): Slice => {\n for (const handler of handlers) {\n slice = handler({ slice, view, plain })\n }\n return slice\n }\n\n const plugin = new ProseMirrorPlugin({\n key: new PluginKey('prosekit-paste-rule'),\n props: {\n transformPasted,\n },\n })\n\n return (inputs: PasteRulePayload[]) => {\n // Last added rule (highest priority) is applied first\n handlers = [...inputs].reverse()\n return plugin\n }\n },\n singleton: true,\n parent: pluginFacet,\n})\n\n/**\n * @internal\n */\nexport function definePasteRulePlugin(payload: PasteRulePayload): PlainExtension {\n return defineFacetPayload(pasteRuleFacet, [payload]) as PlainExtension\n}\n","import type { PlainExtension } from '@prosekit/core'\nimport type { Slice } from '@prosekit/pm/model'\nimport type { EditorView } from '@prosekit/pm/view'\n\nimport { definePasteRulePlugin } from './paste-rule-plugin.ts'\n\n/**\n * @public\n *\n * Options for {@link PasteRuleHandler}.\n */\nexport interface PasteRuleHandlerOptions {\n /**\n * The slice to be pasted.\n */\n slice: Slice\n\n /**\n * The editor view.\n */\n view: EditorView\n\n /**\n * Whether the pasted content is treated as plain text. This is true when the\n * `Shift` key is held when pasting.\n */\n plain: boolean\n}\n\n/**\n * @public\n *\n * Can be used to transform pasted or dragged-and-dropped content before it is\n * applied to the document.\n */\nexport type PasteRuleHandler = (options: PasteRuleHandlerOptions) => Slice\n\n/**\n * Options for {@link definePasteRule}.\n *\n * @public\n */\nexport interface PasteRuleOptions {\n /**\n * A function to be called when a paste rule is triggered.\n */\n handler: PasteRuleHandler\n}\n\n/**\n * Defines a paste rule. This rule allows you to modify pasted or dragged\n * content before it is inserted into the document.\n *\n * @param options\n *\n * @public\n */\nexport function definePasteRule({ handler }: PasteRuleOptions): PlainExtension {\n return definePasteRulePlugin(handler)\n}\n","/**\n * Splits text into chunks based on regex matches, preserving both matched and unmatched segments.\n * Returns an array of tuples where each tuple contains a text segment and either the match data\n * (for matched segments) or undefined (for unmatched segments).\n */\nexport function splitTextByRegex(\n text: string,\n regex: RegExp,\n): Array<[string, RegExpExecArray | undefined]> | undefined {\n regex.lastIndex = 0\n\n const chunks: Array<[string, RegExpExecArray | undefined]> = []\n let lastIndex = 0\n let match: RegExpExecArray | null\n let matched = false\n\n while ((match = regex.exec(text))) {\n const start = match.index\n const end = regex.lastIndex\n\n // Push the unmatched prefix, if any.\n if (start > lastIndex) {\n chunks.push([text.slice(lastIndex, start), undefined])\n }\n\n // Push the matched segment.\n chunks.push([text.slice(start, end), match])\n matched = true\n\n if (lastIndex === end) {\n // Safeguard against zero-width matches that would otherwise cause an infinite loop.\n return\n }\n lastIndex = end\n }\n\n if (matched && lastIndex < text.length) {\n chunks.push([text.slice(lastIndex), undefined])\n }\n\n regex.lastIndex = 0\n\n return matched ? chunks : undefined\n}\n","import { getMarkType, type PlainExtension } from '@prosekit/core'\nimport type { Attrs, MarkType, ProseMirrorNode } from '@prosekit/pm/model'\nimport { Fragment, Slice } from '@prosekit/pm/model'\n\nimport { definePasteRule } from './paste-rule.ts'\nimport { splitTextByRegex } from './split-text-by-regex.ts'\n\n/**\n * The options for {@link defineMarkPasteRule}.\n *\n * @public\n */\nexport interface MarkPasteRuleOptions {\n /**\n * The regular expression to match against. It must have a `g` flag to match\n * all instances of the mark.\n */\n regex: RegExp\n\n /**\n * The mark type to apply to the matched text.\n */\n type: string | MarkType\n\n /**\n * A function used to compute attributes to set on the mark created by this\n * rule. When it returns `false`, the rule won't match. When it returns `null`\n * or `undefined`, that is interpreted as an empty/default set of attributes.\n * @default null\n */\n getAttrs?: (match: RegExpExecArray) => Attrs | null | undefined | false\n\n /**\n * Optional function to determine if a text node should be skipped.\n * Default behavior: skip code nodes and nodes that already have the target mark.\n */\n shouldSkip?: (node: ProseMirrorNode) => boolean\n}\n\n/**\n * Defines a paste rule that applies marks based on regex patterns.\n *\n * @public\n */\nexport function defineMarkPasteRule(options: MarkPasteRuleOptions): PlainExtension {\n return definePasteRule({\n handler: ({ slice, view, plain }) => {\n if (plain) {\n return slice\n }\n\n const markType = getMarkType(view.state.schema, options.type)\n\n return replaceMarkInSlice({\n markType,\n regex: options.regex,\n getAttrs: options.getAttrs,\n shouldSkip: options.shouldSkip,\n }, slice)\n },\n })\n}\n\ninterface MarkPasteRuleHandlerOptions {\n markType: MarkType\n regex: RegExp\n getAttrs?: (match: RegExpExecArray) => Attrs | null | undefined | false\n shouldSkip?: (node: ProseMirrorNode) => boolean\n}\n\nfunction replaceMarkInSlice(options: MarkPasteRuleHandlerOptions, slice: Slice): Slice {\n const newFragment = replaceMarkInFragment(options, slice.content)\n if (!newFragment) {\n return slice\n }\n return new Slice(newFragment, slice.openStart, slice.openEnd)\n}\n\nfunction replaceMarkInFragment(options: MarkPasteRuleHandlerOptions, fragment: Fragment): Fragment | undefined {\n let changed = false\n const children: ProseMirrorNode[] = []\n\n for (const child of fragment.content) {\n const newChild = replaceMarkInNode(options, child)\n if (newChild) {\n changed = true\n }\n children.push(newChild || child)\n }\n\n if (changed) {\n return Fragment.from(children)\n }\n\n return\n}\n\nfunction replaceMarkInNode(options: MarkPasteRuleHandlerOptions, node: ProseMirrorNode): ProseMirrorNode | undefined {\n if (node.type.spec.code) {\n return\n }\n if (node.type.isInline) {\n return\n }\n if (node.type.isTextblock) {\n return replaceMarkInTextblockNode(options, node)\n }\n\n const newChildren = replaceMarkInFragment(options, node.content)\n if (!newChildren) {\n return\n }\n return node.copy(newChildren)\n}\n\nfunction replaceMarkInTextblockNode(options: MarkPasteRuleHandlerOptions, node: ProseMirrorNode): ProseMirrorNode | undefined {\n const newChildren: ProseMirrorNode[] = []\n let changed = false\n\n for (const inlineNode of node.content.content) {\n const newInlineNodes = replaceMarkInInlineNode(options, inlineNode)\n if (newInlineNodes) {\n changed = true\n newChildren.push(...newInlineNodes)\n } else {\n newChildren.push(inlineNode)\n }\n }\n if (changed) {\n return node.copy(Fragment.from(newChildren))\n }\n return\n}\n\nfunction replaceMarkInInlineNode(options: MarkPasteRuleHandlerOptions, node: ProseMirrorNode): ProseMirrorNode[] | undefined {\n const text = node.text\n if (!text) {\n return\n }\n\n const { markType, shouldSkip } = options\n\n // Use custom skip logic if provided, otherwise use default\n if (shouldSkip) {\n if (shouldSkip(node)) {\n return\n }\n } else {\n // Default skip logic: skip if already has the target mark or has code mark\n if (node.marks.some((mark) => mark.type === markType)) {\n return\n }\n if (node.marks.some((mark) => mark.type.spec.code)) {\n return\n }\n }\n\n const chunks = splitTextByRegex(text, options.regex)\n if (!chunks) {\n return\n }\n\n const schema = node.type.schema\n const nodes: ProseMirrorNode[] = []\n\n for (const [text, match] of chunks) {\n if (!text) {\n continue\n }\n if (match) {\n const attrs = options.getAttrs?.(match) ?? null\n if (attrs !== false) {\n const mark = markType.create(attrs)\n nodes.push(schema.text(text, [...node.marks, mark]))\n } else {\n nodes.push(schema.text(text, node.marks))\n }\n } else {\n nodes.push(schema.text(text, node.marks))\n }\n }\n\n return nodes\n}\n"],"mappings":"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"}
@@ -1,7 +1,5 @@
1
1
  import { EditorState } from "@prosekit/pm/state";
2
2
  import { PlainExtension } from "@prosekit/core";
3
-
4
- //#region src/placeholder/index.d.ts
5
3
  interface PlaceholderOptions {
6
4
  /**
7
5
  * The placeholder to use. It can be a static string or a function that
@@ -29,6 +27,5 @@ interface PlaceholderOptions {
29
27
  * empty.
30
28
  */
31
29
  declare function definePlaceholder(options: PlaceholderOptions): PlainExtension;
32
- //#endregion
33
30
  export { PlaceholderOptions, definePlaceholder };
34
- //# sourceMappingURL=prosekit-extensions-placeholder.d.ts.map
31
+ //# sourceMappingURL=placeholder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placeholder.d.ts","names":[],"sources":["../src/placeholder/index.ts"],"mappings":";;UAOiB,kBAAA;EAAA;;;;EAKf,WAAA,aAAwB,KAAA,EAAO,WAAA;EAAA;;;;;;;AAuBjC;;;;;;;EAPE,QAAA,uBAA+B,KAAA,EAAO,WAAA;AAAA;;;;;iBAOxB,iBAAA,CAAkB,OAAA,EAAS,kBAAA,GAAqB,cAAA"}