@dou-ui/editor 0.0.0-stage → 0.1.0-alpha.1

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 (324) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -2
  3. package/dist/catalog.js +18 -0
  4. package/dist/catalog.js.map +1 -0
  5. package/dist/code/code-editor-block.js +6 -0
  6. package/dist/code/code-editor-block.js.map +1 -0
  7. package/dist/code/code-editor-block.vue_vue_type_script_setup_true_lang.js +116 -0
  8. package/dist/code/code-editor-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  9. package/dist/code/index.js +69 -0
  10. package/dist/code/index.js.map +1 -0
  11. package/dist/code/languages.js +51 -0
  12. package/dist/code/languages.js.map +1 -0
  13. package/dist/code/view.js +255 -0
  14. package/dist/code/view.js.map +1 -0
  15. package/dist/collaboration/binding.js +381 -0
  16. package/dist/collaboration/binding.js.map +1 -0
  17. package/dist/collaboration/cursors.js +150 -0
  18. package/dist/collaboration/cursors.js.map +1 -0
  19. package/dist/collaboration/index.js +108 -0
  20. package/dist/collaboration/index.js.map +1 -0
  21. package/dist/collaboration/order.js +88 -0
  22. package/dist/collaboration/order.js.map +1 -0
  23. package/dist/collaboration/table.js +234 -0
  24. package/dist/collaboration/table.js.map +1 -0
  25. package/dist/collaboration/text.js +91 -0
  26. package/dist/collaboration/text.js.map +1 -0
  27. package/dist/components/block-handle.js +6 -0
  28. package/dist/components/block-handle.js.map +1 -0
  29. package/dist/components/block-handle.vue_vue_type_script_setup_true_lang.js +474 -0
  30. package/dist/components/block-handle.vue_vue_type_script_setup_true_lang.js.map +1 -0
  31. package/dist/components/bubble-toolbar.js +6 -0
  32. package/dist/components/bubble-toolbar.js.map +1 -0
  33. package/dist/components/bubble-toolbar.vue_vue_type_script_setup_true_lang.js +381 -0
  34. package/dist/components/bubble-toolbar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  35. package/dist/components/comment-button.js +6 -0
  36. package/dist/components/comment-button.js.map +1 -0
  37. package/dist/components/comment-button.vue_vue_type_script_setup_true_lang.js +83 -0
  38. package/dist/components/comment-button.vue_vue_type_script_setup_true_lang.js.map +1 -0
  39. package/dist/components/comment-card.js +6 -0
  40. package/dist/components/comment-card.js.map +1 -0
  41. package/dist/components/comment-card.vue_vue_type_script_setup_true_lang.js +104 -0
  42. package/dist/components/comment-card.vue_vue_type_script_setup_true_lang.js.map +1 -0
  43. package/dist/components/menu-escape.js +25 -0
  44. package/dist/components/menu-escape.js.map +1 -0
  45. package/dist/components/search-bar.js +6 -0
  46. package/dist/components/search-bar.js.map +1 -0
  47. package/dist/components/search-bar.vue_vue_type_script_setup_true_lang.js +192 -0
  48. package/dist/components/search-bar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  49. package/dist/components/slash-menu.js +6 -0
  50. package/dist/components/slash-menu.js.map +1 -0
  51. package/dist/components/slash-menu.vue_vue_type_script_setup_true_lang.js +164 -0
  52. package/dist/components/slash-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  53. package/dist/core/align.js +94 -0
  54. package/dist/core/align.js.map +1 -0
  55. package/dist/core/block-selection.js +155 -0
  56. package/dist/core/block-selection.js.map +1 -0
  57. package/dist/core/blocks.js +132 -0
  58. package/dist/core/blocks.js.map +1 -0
  59. package/dist/core/changes.js +85 -0
  60. package/dist/core/changes.js.map +1 -0
  61. package/dist/core/colors.js +16 -0
  62. package/dist/core/colors.js.map +1 -0
  63. package/dist/core/commands.js +379 -0
  64. package/dist/core/commands.js.map +1 -0
  65. package/dist/core/comments.js +186 -0
  66. package/dist/core/comments.js.map +1 -0
  67. package/dist/core/compare.js +106 -0
  68. package/dist/core/compare.js.map +1 -0
  69. package/dist/core/convert.js +28 -0
  70. package/dist/core/convert.js.map +1 -0
  71. package/dist/core/diff.js +141 -0
  72. package/dist/core/diff.js.map +1 -0
  73. package/dist/core/editor.js +138 -0
  74. package/dist/core/editor.js.map +1 -0
  75. package/dist/core/extension.js +99 -0
  76. package/dist/core/extension.js.map +1 -0
  77. package/dist/core/file-drop.js +56 -0
  78. package/dist/core/file-drop.js.map +1 -0
  79. package/dist/core/highlight.js +120 -0
  80. package/dist/core/highlight.js.map +1 -0
  81. package/dist/core/input-rules.js +61 -0
  82. package/dist/core/input-rules.js.map +1 -0
  83. package/dist/core/keymap.js +38 -0
  84. package/dist/core/keymap.js.map +1 -0
  85. package/dist/core/model.js +196 -0
  86. package/dist/core/model.js.map +1 -0
  87. package/dist/core/output.js +263 -0
  88. package/dist/core/output.js.map +1 -0
  89. package/dist/core/plugins.js +102 -0
  90. package/dist/core/plugins.js.map +1 -0
  91. package/dist/core/prepare.js +102 -0
  92. package/dist/core/prepare.js.map +1 -0
  93. package/dist/core/schema.js +158 -0
  94. package/dist/core/schema.js.map +1 -0
  95. package/dist/core/search.js +197 -0
  96. package/dist/core/search.js.map +1 -0
  97. package/dist/core/selection.js +16 -0
  98. package/dist/core/selection.js.map +1 -0
  99. package/dist/core/slash.js +83 -0
  100. package/dist/core/slash.js.map +1 -0
  101. package/dist/core/transaction.js +311 -0
  102. package/dist/core/transaction.js.map +1 -0
  103. package/dist/define-block.js +177 -0
  104. package/dist/define-block.js.map +1 -0
  105. package/dist/document.js +157 -0
  106. package/dist/document.js.map +1 -0
  107. package/dist/dom.js +48 -0
  108. package/dist/dom.js.map +1 -0
  109. package/dist/editor.js +33 -0
  110. package/dist/editor.js.map +1 -0
  111. package/dist/editor.vue_vue_type_script_setup_true_lang.js +564 -0
  112. package/dist/editor.vue_vue_type_script_setup_true_lang.js.map +1 -0
  113. package/dist/editor2.js +6 -0
  114. package/dist/editor2.js.map +1 -0
  115. package/dist/extensions/align/align-menu.js +6 -0
  116. package/dist/extensions/align/align-menu.js.map +1 -0
  117. package/dist/extensions/align/align-menu.vue_vue_type_script_setup_true_lang.js +82 -0
  118. package/dist/extensions/align/align-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  119. package/dist/extensions/align/align-sub.js +6 -0
  120. package/dist/extensions/align/align-sub.js.map +1 -0
  121. package/dist/extensions/align/align-sub.vue_vue_type_script_setup_true_lang.js +57 -0
  122. package/dist/extensions/align/align-sub.vue_vue_type_script_setup_true_lang.js.map +1 -0
  123. package/dist/extensions/align/commands.js +40 -0
  124. package/dist/extensions/align/commands.js.map +1 -0
  125. package/dist/extensions/align/index.js +27 -0
  126. package/dist/extensions/align/index.js.map +1 -0
  127. package/dist/extensions/attachment/attachment-block.js +6 -0
  128. package/dist/extensions/attachment/attachment-block.js.map +1 -0
  129. package/dist/extensions/attachment/attachment-block.vue_vue_type_script_setup_true_lang.js +119 -0
  130. package/dist/extensions/attachment/attachment-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  131. package/dist/extensions/attachment/files.js +66 -0
  132. package/dist/extensions/attachment/files.js.map +1 -0
  133. package/dist/extensions/attachment/index.js +132 -0
  134. package/dist/extensions/attachment/index.js.map +1 -0
  135. package/dist/extensions/blocks.js +170 -0
  136. package/dist/extensions/blocks.js.map +1 -0
  137. package/dist/extensions/callout/callout-block.js +6 -0
  138. package/dist/extensions/callout/callout-block.js.map +1 -0
  139. package/dist/extensions/callout/callout-block.vue_vue_type_script_setup_true_lang.js +71 -0
  140. package/dist/extensions/callout/callout-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  141. package/dist/extensions/callout/html.js +61 -0
  142. package/dist/extensions/callout/html.js.map +1 -0
  143. package/dist/extensions/callout/index.js +52 -0
  144. package/dist/extensions/callout/index.js.map +1 -0
  145. package/dist/extensions/callout/tones.js +12 -0
  146. package/dist/extensions/callout/tones.js.map +1 -0
  147. package/dist/extensions/code-block/code-block-view.js +6 -0
  148. package/dist/extensions/code-block/code-block-view.js.map +1 -0
  149. package/dist/extensions/code-block/code-block-view.vue_vue_type_script_setup_true_lang.js +87 -0
  150. package/dist/extensions/code-block/code-block-view.vue_vue_type_script_setup_true_lang.js.map +1 -0
  151. package/dist/extensions/code-block/index.js +98 -0
  152. package/dist/extensions/code-block/index.js.map +1 -0
  153. package/dist/extensions/code-block/languages.js +116 -0
  154. package/dist/extensions/code-block/languages.js.map +1 -0
  155. package/dist/extensions/colors/color-menu.js +6 -0
  156. package/dist/extensions/colors/color-menu.js.map +1 -0
  157. package/dist/extensions/colors/color-menu.vue_vue_type_script_setup_true_lang.js +113 -0
  158. package/dist/extensions/colors/color-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  159. package/dist/extensions/colors/index.js +49 -0
  160. package/dist/extensions/colors/index.js.map +1 -0
  161. package/dist/extensions/colors/palette.js +26 -0
  162. package/dist/extensions/colors/palette.js.map +1 -0
  163. package/dist/extensions/editor-kit.js +35 -0
  164. package/dist/extensions/editor-kit.js.map +1 -0
  165. package/dist/extensions/embed/embed-block.js +6 -0
  166. package/dist/extensions/embed/embed-block.js.map +1 -0
  167. package/dist/extensions/embed/embed-block.vue_vue_type_script_setup_true_lang.js +210 -0
  168. package/dist/extensions/embed/embed-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  169. package/dist/extensions/embed/index.js +118 -0
  170. package/dist/extensions/embed/index.js.map +1 -0
  171. package/dist/extensions/embed/targets.js +79 -0
  172. package/dist/extensions/embed/targets.js.map +1 -0
  173. package/dist/extensions/formatting.js +153 -0
  174. package/dist/extensions/formatting.js.map +1 -0
  175. package/dist/extensions/image/image-block.js +6 -0
  176. package/dist/extensions/image/image-block.js.map +1 -0
  177. package/dist/extensions/image/image-block.vue_vue_type_script_setup_true_lang.js +206 -0
  178. package/dist/extensions/image/image-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  179. package/dist/extensions/image/index.js +125 -0
  180. package/dist/extensions/image/index.js.map +1 -0
  181. package/dist/extensions/image/uploads.js +96 -0
  182. package/dist/extensions/image/uploads.js.map +1 -0
  183. package/dist/extensions/list-html.js +58 -0
  184. package/dist/extensions/list-html.js.map +1 -0
  185. package/dist/extensions/lists.js +182 -0
  186. package/dist/extensions/lists.js.map +1 -0
  187. package/dist/extensions/mention/index.js +56 -0
  188. package/dist/extensions/mention/index.js.map +1 -0
  189. package/dist/extensions/mention/mention-menu.js +6 -0
  190. package/dist/extensions/mention/mention-menu.js.map +1 -0
  191. package/dist/extensions/mention/mention-menu.vue_vue_type_script_setup_true_lang.js +132 -0
  192. package/dist/extensions/mention/mention-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  193. package/dist/extensions/mention/state.js +113 -0
  194. package/dist/extensions/mention/state.js.map +1 -0
  195. package/dist/extensions/table/commands.js +356 -0
  196. package/dist/extensions/table/commands.js.map +1 -0
  197. package/dist/extensions/table/html.js +134 -0
  198. package/dist/extensions/table/html.js.map +1 -0
  199. package/dist/extensions/table/index.js +56 -0
  200. package/dist/extensions/table/index.js.map +1 -0
  201. package/dist/extensions/table/plugin.js +81 -0
  202. package/dist/extensions/table/plugin.js.map +1 -0
  203. package/dist/extensions/table/schema.js +258 -0
  204. package/dist/extensions/table/schema.js.map +1 -0
  205. package/dist/extensions/table/table-controls.js +6 -0
  206. package/dist/extensions/table/table-controls.js.map +1 -0
  207. package/dist/extensions/table/table-controls.vue_vue_type_script_setup_true_lang.js +698 -0
  208. package/dist/extensions/table/table-controls.vue_vue_type_script_setup_true_lang.js.map +1 -0
  209. package/dist/extensions/table/view.js +19 -0
  210. package/dist/extensions/table/view.js.map +1 -0
  211. package/dist/extensions/toggle/index.js +87 -0
  212. package/dist/extensions/toggle/index.js.map +1 -0
  213. package/dist/extensions/toggle/state.js +120 -0
  214. package/dist/extensions/toggle/state.js.map +1 -0
  215. package/dist/extensions/toggle/toggle-block.js +6 -0
  216. package/dist/extensions/toggle/toggle-block.js.map +1 -0
  217. package/dist/extensions/toggle/toggle-block.vue_vue_type_script_setup_true_lang.js +42 -0
  218. package/dist/extensions/toggle/toggle-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  219. package/dist/index.js +49 -0
  220. package/dist/index.js.map +1 -0
  221. package/dist/locale.js +522 -0
  222. package/dist/locale.js.map +1 -0
  223. package/dist/markdown/index.js +24 -0
  224. package/dist/markdown/index.js.map +1 -0
  225. package/dist/style.css +1 -0
  226. package/dist/style.d.ts +1 -0
  227. package/dist/style.js +8 -0
  228. package/dist/types/catalog.d.ts +8 -0
  229. package/dist/types/code/code-editor-block.vue.d.ts +17 -0
  230. package/dist/types/code/index.d.ts +18 -0
  231. package/dist/types/code/languages.d.ts +7 -0
  232. package/dist/types/code/types.d.ts +37 -0
  233. package/dist/types/code/view.d.ts +12 -0
  234. package/dist/types/collaboration/binding.d.ts +32 -0
  235. package/dist/types/collaboration/cursors.d.ts +26 -0
  236. package/dist/types/collaboration/index.d.ts +47 -0
  237. package/dist/types/collaboration/order.d.ts +20 -0
  238. package/dist/types/collaboration/table.d.ts +25 -0
  239. package/dist/types/collaboration/text.d.ts +9 -0
  240. package/dist/types/components/block-handle.vue.d.ts +3 -0
  241. package/dist/types/components/bubble-toolbar.vue.d.ts +7 -0
  242. package/dist/types/components/comment-button.vue.d.ts +3 -0
  243. package/dist/types/components/comment-card.vue.d.ts +3 -0
  244. package/dist/types/components/menu-escape.d.ts +7 -0
  245. package/dist/types/components/search-bar.vue.d.ts +22 -0
  246. package/dist/types/components/slash-menu.vue.d.ts +11 -0
  247. package/dist/types/core/align.d.ts +16 -0
  248. package/dist/types/core/block-selection.d.ts +22 -0
  249. package/dist/types/core/blocks.d.ts +52 -0
  250. package/dist/types/core/changes.d.ts +14 -0
  251. package/dist/types/core/colors.d.ts +4 -0
  252. package/dist/types/core/commands.d.ts +61 -0
  253. package/dist/types/core/comments.d.ts +44 -0
  254. package/dist/types/core/compare.d.ts +10 -0
  255. package/dist/types/core/convert.d.ts +12 -0
  256. package/dist/types/core/diff.d.ts +49 -0
  257. package/dist/types/core/editor.d.ts +64 -0
  258. package/dist/types/core/extension.d.ts +167 -0
  259. package/dist/types/core/file-drop.d.ts +19 -0
  260. package/dist/types/core/highlight.d.ts +32 -0
  261. package/dist/types/core/input-rules.d.ts +21 -0
  262. package/dist/types/core/keymap.d.ts +8 -0
  263. package/dist/types/core/model.d.ts +158 -0
  264. package/dist/types/core/output.d.ts +64 -0
  265. package/dist/types/core/plugins.d.ts +24 -0
  266. package/dist/types/core/prepare.d.ts +23 -0
  267. package/dist/types/core/schema.d.ts +38 -0
  268. package/dist/types/core/search.d.ts +83 -0
  269. package/dist/types/core/selection.d.ts +8 -0
  270. package/dist/types/core/slash.d.ts +21 -0
  271. package/dist/types/core/transaction.d.ts +97 -0
  272. package/dist/types/define-block.d.ts +66 -0
  273. package/dist/types/document.d.ts +46 -0
  274. package/dist/types/dom.d.ts +17 -0
  275. package/dist/types/editor.d.ts +252 -0
  276. package/dist/types/editor.vue.d.ts +210 -0
  277. package/dist/types/extensions/align/align-menu.vue.d.ts +3 -0
  278. package/dist/types/extensions/align/align-sub.vue.d.ts +7 -0
  279. package/dist/types/extensions/align/commands.d.ts +13 -0
  280. package/dist/types/extensions/align/index.d.ts +7 -0
  281. package/dist/types/extensions/attachment/attachment-block.vue.d.ts +17 -0
  282. package/dist/types/extensions/attachment/files.d.ts +6 -0
  283. package/dist/types/extensions/attachment/index.d.ts +20 -0
  284. package/dist/types/extensions/blocks.d.ts +8 -0
  285. package/dist/types/extensions/callout/callout-block.vue.d.ts +14 -0
  286. package/dist/types/extensions/callout/html.d.ts +4 -0
  287. package/dist/types/extensions/callout/index.d.ts +3 -0
  288. package/dist/types/extensions/callout/tones.d.ts +8 -0
  289. package/dist/types/extensions/code-block/code-block-view.vue.d.ts +16 -0
  290. package/dist/types/extensions/code-block/index.d.ts +19 -0
  291. package/dist/types/extensions/code-block/languages.d.ts +9 -0
  292. package/dist/types/extensions/colors/color-menu.vue.d.ts +3 -0
  293. package/dist/types/extensions/colors/index.d.ts +7 -0
  294. package/dist/types/extensions/colors/palette.d.ts +7 -0
  295. package/dist/types/extensions/editor-kit.d.ts +37 -0
  296. package/dist/types/extensions/embed/embed-block.vue.d.ts +16 -0
  297. package/dist/types/extensions/embed/index.d.ts +18 -0
  298. package/dist/types/extensions/embed/targets.d.ts +32 -0
  299. package/dist/types/extensions/formatting.d.ts +8 -0
  300. package/dist/types/extensions/image/image-block.vue.d.ts +16 -0
  301. package/dist/types/extensions/image/index.d.ts +16 -0
  302. package/dist/types/extensions/image/uploads.d.ts +35 -0
  303. package/dist/types/extensions/list-html.d.ts +11 -0
  304. package/dist/types/extensions/lists.d.ts +6 -0
  305. package/dist/types/extensions/mention/index.d.ts +11 -0
  306. package/dist/types/extensions/mention/mention-menu.vue.d.ts +7 -0
  307. package/dist/types/extensions/mention/state.d.ts +28 -0
  308. package/dist/types/extensions/table/commands.d.ts +69 -0
  309. package/dist/types/extensions/table/html.d.ts +4 -0
  310. package/dist/types/extensions/table/index.d.ts +8 -0
  311. package/dist/types/extensions/table/plugin.d.ts +4 -0
  312. package/dist/types/extensions/table/schema.d.ts +23 -0
  313. package/dist/types/extensions/table/table-controls.vue.d.ts +3 -0
  314. package/dist/types/extensions/table/view.d.ts +13 -0
  315. package/dist/types/extensions/toggle/index.d.ts +7 -0
  316. package/dist/types/extensions/toggle/state.d.ts +17 -0
  317. package/dist/types/extensions/toggle/toggle-block.vue.d.ts +14 -0
  318. package/dist/types/index.d.ts +266 -0
  319. package/dist/types/locale.d.ts +195 -0
  320. package/dist/types/markdown/index.d.ts +14 -0
  321. package/dist/types/use-comments.d.ts +17 -0
  322. package/dist/use-comments.js +141 -0
  323. package/dist/use-comments.js.map +1 -0
  324. package/package.json +98 -4
@@ -0,0 +1,356 @@
1
+ import { createId } from "../../core/model.js";
2
+ import { fitColumns, tableRows } from "./schema.js";
3
+ import { TextSelection } from "prosemirror-state";
4
+ import { CellSelection, TableMap, addColumn, addRow, cellAround, deleteCellSelection, isInTable, removeColumn, removeRow, selectedRect, selectionCell, splitCell } from "prosemirror-tables";
5
+ // src/extensions/table/commands.ts
6
+ function tableAt($pos) {
7
+ for (let depth = $pos.depth; depth > 0; depth--) {
8
+ const node = $pos.node(depth);
9
+ if (node.type.spec.tableRole === "table") return {
10
+ node,
11
+ pos: $pos.before(depth),
12
+ map: TableMap.get(node)
13
+ };
14
+ }
15
+ return null;
16
+ }
17
+ var columnsOf = (rect) => fitColumns(rect.table.attrs.columns, rect.map.width);
18
+ /** Add a column before or after the selected ones. */
19
+ function insertColumn(side) {
20
+ return (state, dispatch) => {
21
+ if (!isInTable(state)) return false;
22
+ if (dispatch) {
23
+ const rect = selectedRect(state);
24
+ const at = side === "before" ? rect.left : rect.right;
25
+ const columns = columnsOf(rect);
26
+ columns.splice(at, 0, { id: createId() });
27
+ dispatch(addColumn(state.tr, rect, at).setNodeAttribute(rect.tableStart - 1, "columns", columns));
28
+ }
29
+ return true;
30
+ };
31
+ }
32
+ /** Add a row above or below the selected ones. */
33
+ function insertRow(side) {
34
+ return (state, dispatch) => {
35
+ if (!isInTable(state)) return false;
36
+ if (dispatch) {
37
+ const rect = selectedRect(state);
38
+ dispatch(addRow(state.tr, rect, side === "before" ? rect.top : rect.bottom));
39
+ }
40
+ return true;
41
+ };
42
+ }
43
+ /** Remove the selected columns; not all of them (that is deleting the table). */
44
+ var deleteColumns = (state, dispatch) => {
45
+ if (!isInTable(state)) return false;
46
+ const rect = selectedRect(state);
47
+ if (rect.left === 0 && rect.right === rect.map.width) return false;
48
+ if (dispatch) {
49
+ const tr = state.tr;
50
+ const columns = columnsOf(rect);
51
+ for (let col = rect.right - 1; col >= rect.left; col--) {
52
+ removeColumn(tr, rect, col);
53
+ const table = tr.doc.nodeAt(rect.tableStart - 1);
54
+ rect.table = table;
55
+ rect.map = TableMap.get(table);
56
+ }
57
+ columns.splice(rect.left, rect.right - rect.left);
58
+ dispatch(tr.setNodeAttribute(rect.tableStart - 1, "columns", columns));
59
+ }
60
+ return true;
61
+ };
62
+ /** Remove the selected rows; not all of them. */
63
+ var deleteRows = (state, dispatch) => {
64
+ if (!isInTable(state)) return false;
65
+ const rect = selectedRect(state);
66
+ if (rect.top === 0 && rect.bottom === rect.map.height) return false;
67
+ if (dispatch) {
68
+ const tr = state.tr;
69
+ for (let row = rect.bottom - 1; row >= rect.top; row--) {
70
+ removeRow(tr, rect, row);
71
+ const table = tr.doc.nodeAt(rect.tableStart - 1);
72
+ rect.table = table;
73
+ rect.map = TableMap.get(table);
74
+ }
75
+ dispatch(tr);
76
+ }
77
+ return true;
78
+ };
79
+ /**
80
+ * Where rows (or columns) can be cut: the boundaries no merged cell
81
+ * crosses. A run of rows between two of them moves as one.
82
+ */
83
+ function boundaries(map, axis) {
84
+ const size = axis === "row" ? map.height : map.width;
85
+ const crossed = /* @__PURE__ */ new Set();
86
+ const seen = /* @__PURE__ */ new Set();
87
+ for (const pos of map.map) {
88
+ if (seen.has(pos)) continue;
89
+ seen.add(pos);
90
+ const rect = map.findCell(pos);
91
+ const [from, to] = axis === "row" ? [rect.top, rect.bottom] : [rect.left, rect.right];
92
+ for (let index = from + 1; index < to; index++) crossed.add(index);
93
+ }
94
+ const result = [];
95
+ for (let index = 0; index <= size; index++) if (!crossed.has(index)) result.push(index);
96
+ return result;
97
+ }
98
+ /** The run of rows (or columns) that holds `[from, to)` and can move as one. */
99
+ function band(map, axis, from, to) {
100
+ const cuts = boundaries(map, axis);
101
+ let start = 0;
102
+ let end = cuts.at(-1);
103
+ for (const cut of cuts) {
104
+ if (cut <= from) start = cut;
105
+ if (cut >= to) {
106
+ end = cut;
107
+ break;
108
+ }
109
+ }
110
+ return {
111
+ start,
112
+ end,
113
+ cuts
114
+ };
115
+ }
116
+ /**
117
+ * Move the selected rows (or columns), with any merged cells they belong
118
+ * to, one step up or down (left or right). Ids, widths and alignment move
119
+ * along.
120
+ */
121
+ function moveLines(axis, direction) {
122
+ return (state, dispatch) => {
123
+ if (!isInTable(state)) return false;
124
+ const rect = selectedRect(state);
125
+ const [from, to] = axis === "row" ? [rect.top, rect.bottom] : [rect.left, rect.right];
126
+ const { start, end, cuts } = band(rect.map, axis, from, to);
127
+ const other = cuts[cuts.indexOf(direction < 0 ? start : end) + direction];
128
+ if (other === void 0) return false;
129
+ return moveLinesTo(rect.tableStart - 1, axis, start, end, other)(state, dispatch);
130
+ };
131
+ }
132
+ /**
133
+ * Move rows (or columns) `[start, end)` of the table at `tablePos` to the
134
+ * boundary `to`, given as the index of the line they go before. Both the
135
+ * run and `to` have to be on boundaries no merged cell crosses.
136
+ */
137
+ function moveLinesTo(tablePos, axis, start, end, to) {
138
+ return (state, dispatch) => {
139
+ const table = state.doc.nodeAt(tablePos);
140
+ if (!table || table.type.spec.tableRole !== "table") return false;
141
+ const map = TableMap.get(table);
142
+ const cuts = boundaries(map, axis);
143
+ if (start >= end || !cuts.includes(start) || !cuts.includes(end) || !cuts.includes(to)) return false;
144
+ if (to >= start && to <= end) return false;
145
+ if (dispatch) {
146
+ const order = Array.from({ length: axis === "row" ? map.height : map.width }, (_, i) => i);
147
+ const moved = to < start ? [
148
+ ...order.slice(0, to),
149
+ ...order.slice(start, end),
150
+ ...order.slice(to, start),
151
+ ...order.slice(end)
152
+ ] : [
153
+ ...order.slice(0, start),
154
+ ...order.slice(end, to),
155
+ ...order.slice(start, end),
156
+ ...order.slice(to)
157
+ ];
158
+ const read = tableRows.read(table);
159
+ const columns = read.props.columns;
160
+ const rows = axis === "row" ? moved.map((i) => read.rows[i]) : read.rows.map((row) => ({
161
+ ...row,
162
+ cells: moved.map((i) => row.cells[i])
163
+ }));
164
+ const props = axis === "row" ? read.props : {
165
+ ...read.props,
166
+ columns: moved.map((i) => columns[i])
167
+ };
168
+ const rebuilt = tableRows.write(table.type, props, rows);
169
+ const tr = state.tr.replaceWith(tablePos, tablePos + table.nodeSize, rebuilt);
170
+ const first = to < start ? to : to - (end - start);
171
+ selectLines(tr, tablePos, axis, first, first + end - start);
172
+ dispatch(tr.scrollIntoView());
173
+ }
174
+ return true;
175
+ };
176
+ }
177
+ /** Select whole rows (or columns) `[from, to)` of the table at `tablePos`. */
178
+ function selectLines(tr, tablePos, axis, from, to) {
179
+ const table = tr.doc.nodeAt(tablePos);
180
+ const map = TableMap.get(table);
181
+ const start = tablePos + 1;
182
+ const [anchor, head] = axis === "row" ? [map.positionAt(from, 0, table), map.positionAt(to - 1, map.width - 1, table)] : [map.positionAt(0, from, table), map.positionAt(map.height - 1, to - 1, table)];
183
+ const $anchor = tr.doc.resolve(start + anchor);
184
+ const $head = tr.doc.resolve(start + head);
185
+ tr.setSelection(axis === "row" ? CellSelection.rowSelection($anchor, $head) : CellSelection.colSelection($anchor, $head));
186
+ return tr;
187
+ }
188
+ /**
189
+ * Merge the selected cells into the top-left one. Their text joins it,
190
+ * each on a line of its own.
191
+ */
192
+ var mergeCells = (state, dispatch) => {
193
+ const selection = state.selection;
194
+ if (!(selection instanceof CellSelection) || selection.$anchorCell.pos === selection.$headCell.pos) return false;
195
+ const rect = selectedRect(state);
196
+ const { map, table, tableStart } = rect;
197
+ const seen = /* @__PURE__ */ new Set();
198
+ const inside = [];
199
+ for (let row = rect.top; row < rect.bottom; row++) for (let col = rect.left; col < rect.right; col++) {
200
+ const pos = map.map[row * map.width + col];
201
+ if (seen.has(pos)) continue;
202
+ seen.add(pos);
203
+ const cell = map.findCell(pos);
204
+ if (cell.left < rect.left || cell.right > rect.right || cell.top < rect.top || cell.bottom > rect.bottom) return false;
205
+ inside.push(pos);
206
+ }
207
+ if (dispatch) {
208
+ const tr = state.tr;
209
+ const [first, ...rest] = inside;
210
+ const target = table.nodeAt(first);
211
+ const breakType = state.schema.nodes.hardBreak;
212
+ const parts = [target, ...rest.map((pos) => table.nodeAt(pos))].filter((cell) => cell.content.size);
213
+ const content = [];
214
+ parts.forEach((cell, index) => {
215
+ if (index) content.push(breakType.create());
216
+ cell.content.forEach((child) => content.push(child));
217
+ });
218
+ for (let index = rest.length - 1; index >= 0; index--) {
219
+ const pos = rest[index];
220
+ const cell = table.nodeAt(pos);
221
+ tr.delete(tableStart + pos, tableStart + pos + cell.nodeSize);
222
+ }
223
+ const widths = Array.from({ length: rect.right - rect.left }, (_, index) => {
224
+ const pos = map.map[rect.top * map.width + rect.left + index];
225
+ const cell = table.nodeAt(pos);
226
+ const offset = rect.left + index - map.findCell(pos).left;
227
+ return cell.attrs.colwidth?.[offset] ?? 0;
228
+ });
229
+ const at = tableStart + first;
230
+ tr.replaceWith(at, at + target.nodeSize, target.type.create({
231
+ ...target.attrs,
232
+ colspan: rect.right - rect.left,
233
+ rowspan: rect.bottom - rect.top,
234
+ colwidth: widths.some(Boolean) ? widths : null
235
+ }, content));
236
+ tr.setSelection(TextSelection.create(tr.doc, at + 1));
237
+ dispatch(tr);
238
+ }
239
+ return true;
240
+ };
241
+ /** Whether the selection is in (or on) a merged cell. */
242
+ function inMergedCell(state) {
243
+ if (!isInTable(state)) return false;
244
+ const cell = selectionCell(state).nodeAfter;
245
+ return !!cell && (cell.attrs.colspan > 1 || cell.attrs.rowspan > 1);
246
+ }
247
+ /** Split a merged cell back into single cells; its text stays in the first. */
248
+ var splitMergedCell = (state, dispatch) => splitCell(state, dispatch);
249
+ /** Empty the selected cells. */
250
+ var clearCells = deleteCellSelection;
251
+ /** Align the text of the selected columns. */
252
+ function alignColumns(align) {
253
+ return (state, dispatch) => {
254
+ if (!isInTable(state)) return false;
255
+ if (dispatch) {
256
+ const rect = selectedRect(state);
257
+ const columns = columnsOf(rect).map((column, index) => {
258
+ if (index < rect.left || index >= rect.right) return column;
259
+ return align && align !== "left" ? {
260
+ id: column.id,
261
+ align
262
+ } : { id: column.id };
263
+ });
264
+ dispatch(state.tr.setNodeAttribute(rect.tableStart - 1, "columns", columns));
265
+ }
266
+ return true;
267
+ };
268
+ }
269
+ /** Turn the first row (or column) into a header, or back. */
270
+ function toggleHeader(which) {
271
+ return (state, dispatch) => {
272
+ const found = tableAt(state.selection.$from);
273
+ if (!found) return false;
274
+ if (dispatch) dispatch(state.tr.setNodeAttribute(found.pos, which, !found.node.attrs[which]));
275
+ return true;
276
+ };
277
+ }
278
+ var cellStart = (state) => cellAround(state.selection.$head);
279
+ /**
280
+ * `Tab` / `Shift+Tab`: the next or previous cell, its text selected.
281
+ * `Tab` in the last cell adds a row.
282
+ */
283
+ function goToCell(direction) {
284
+ return (state, dispatch) => {
285
+ const $cell = cellStart(state);
286
+ const found = $cell && tableAt($cell);
287
+ if (!$cell || !found) return false;
288
+ const { map, pos } = found;
289
+ const start = pos + 1;
290
+ const rect = map.findCell($cell.pos - start);
291
+ const cells = [];
292
+ for (const cell of map.map) if (!cells.includes(cell)) cells.push(cell);
293
+ let next = cells[cells.indexOf(map.map[rect.top * map.width + rect.left]) + direction];
294
+ let tr = state.tr;
295
+ if (next === void 0) {
296
+ if (direction < 0) return false;
297
+ if (!dispatch) return true;
298
+ const full = selectedRect(state);
299
+ tr = addRow(tr, {
300
+ ...full,
301
+ top: map.height - 1,
302
+ bottom: map.height
303
+ }, map.height);
304
+ const table = tr.doc.nodeAt(pos);
305
+ const after = TableMap.get(table);
306
+ next = after.map[map.height * after.width];
307
+ }
308
+ if (dispatch) {
309
+ const cell = tr.doc.nodeAt(pos).nodeAt(next);
310
+ const from = start + next + 1;
311
+ dispatch(tr.setSelection(TextSelection.create(tr.doc, from, from + cell.content.size)).scrollIntoView());
312
+ }
313
+ return true;
314
+ };
315
+ }
316
+ /** `Enter`: the cell below, adding a row at the bottom. */
317
+ var goDown = (state, dispatch) => {
318
+ const $cell = cellStart(state);
319
+ const found = $cell && tableAt($cell);
320
+ if (!$cell || !found) return false;
321
+ const { map, pos } = found;
322
+ const start = pos + 1;
323
+ const rect = map.findCell($cell.pos - start);
324
+ let tr = state.tr;
325
+ let below = rect.bottom;
326
+ if (below >= map.height) {
327
+ if (!dispatch) return true;
328
+ tr = addRow(tr, {
329
+ ...selectedRect(state),
330
+ top: map.height - 1,
331
+ bottom: map.height
332
+ }, map.height);
333
+ below = map.height;
334
+ }
335
+ if (dispatch) {
336
+ const table = tr.doc.nodeAt(pos);
337
+ const after = TableMap.get(table);
338
+ const cell = after.map[below * after.width + rect.left];
339
+ const from = start + cell + 1 + table.nodeAt(cell).content.size;
340
+ dispatch(tr.setSelection(TextSelection.create(tr.doc, from)).scrollIntoView());
341
+ }
342
+ return true;
343
+ };
344
+ /** `Backspace` at the start of a cell, `Delete` at its end: nothing, so cells never join. */
345
+ function stopAtCellEdge(side) {
346
+ return (state) => {
347
+ const { $from, empty } = state.selection;
348
+ if (!empty || $from.parent.type.spec.tableRole === void 0) return false;
349
+ const role = $from.parent.type.spec.tableRole;
350
+ if (role !== "cell" && role !== "header_cell") return false;
351
+ return side === "start" ? $from.parentOffset === 0 : $from.parentOffset === $from.parent.content.size;
352
+ };
353
+ }
354
+ export { alignColumns, band, boundaries, clearCells, deleteColumns, deleteRows, goDown, goToCell, inMergedCell, insertColumn, insertRow, mergeCells, moveLines, moveLinesTo, selectLines, splitMergedCell, stopAtCellEdge, tableAt, toggleHeader };
355
+
356
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","names":[],"sources":["../../../src/extensions/table/commands.ts"],"sourcesContent":["import type { Node as PMNode, ResolvedPos } from 'prosemirror-model'\nimport { TextSelection, type Command, type EditorState, type Transaction } from 'prosemirror-state'\nimport {\n addColumn,\n addRow,\n CellSelection,\n cellAround,\n deleteCellSelection,\n isInTable,\n removeColumn,\n removeRow,\n selectedRect,\n selectionCell,\n splitCell,\n TableMap,\n type TableRect,\n} from 'prosemirror-tables'\nimport { createId } from '../../core/model'\nimport { fitColumns, tableRows, type TableAlign } from './schema'\n\n/** The table around the selection: its node, position and grid. */\nexport interface TableAt {\n node: PMNode\n /** Position right before the table node. */\n pos: number\n map: TableMap\n}\n\nexport function tableAt($pos: ResolvedPos): TableAt | null {\n for (let depth = $pos.depth; depth > 0; depth--) {\n const node = $pos.node(depth)\n if (node.type.spec.tableRole === 'table')\n return { node, pos: $pos.before(depth), map: TableMap.get(node) }\n }\n return null\n}\n\nconst columnsOf = (rect: TableRect) => fitColumns(rect.table.attrs.columns, rect.map.width)\n\n/* rows and columns */\n\n/** Add a column before or after the selected ones. */\nexport function insertColumn(side: 'before' | 'after'): Command {\n return (state, dispatch) => {\n if (!isInTable(state)) return false\n if (dispatch) {\n const rect = selectedRect(state)\n const at = side === 'before' ? rect.left : rect.right\n const columns = columnsOf(rect)\n columns.splice(at, 0, { id: createId() })\n const tr = addColumn(state.tr, rect, at)\n dispatch(tr.setNodeAttribute(rect.tableStart - 1, 'columns', columns))\n }\n return true\n }\n}\n\n/** Add a row above or below the selected ones. */\nexport function insertRow(side: 'before' | 'after'): Command {\n return (state, dispatch) => {\n if (!isInTable(state)) return false\n if (dispatch) {\n const rect = selectedRect(state)\n dispatch(addRow(state.tr, rect, side === 'before' ? rect.top : rect.bottom))\n }\n return true\n }\n}\n\n/** Remove the selected columns; not all of them (that is deleting the table). */\nexport const deleteColumns: Command = (state, dispatch) => {\n if (!isInTable(state)) return false\n const rect = selectedRect(state)\n if (rect.left === 0 && rect.right === rect.map.width) return false\n if (dispatch) {\n const tr = state.tr\n const columns = columnsOf(rect)\n for (let col = rect.right - 1; col >= rect.left; col--) {\n removeColumn(tr, rect, col)\n // the next column to the left is read from the changed table\n const table = tr.doc.nodeAt(rect.tableStart - 1)!\n rect.table = table\n rect.map = TableMap.get(table)\n }\n columns.splice(rect.left, rect.right - rect.left)\n dispatch(tr.setNodeAttribute(rect.tableStart - 1, 'columns', columns))\n }\n return true\n}\n\n/** Remove the selected rows; not all of them. */\nexport const deleteRows: Command = (state, dispatch) => {\n if (!isInTable(state)) return false\n const rect = selectedRect(state)\n if (rect.top === 0 && rect.bottom === rect.map.height) return false\n if (dispatch) {\n const tr = state.tr\n for (let row = rect.bottom - 1; row >= rect.top; row--) {\n removeRow(tr, rect, row)\n const table = tr.doc.nodeAt(rect.tableStart - 1)!\n rect.table = table\n rect.map = TableMap.get(table)\n }\n dispatch(tr)\n }\n return true\n}\n\n/**\n * Where rows (or columns) can be cut: the boundaries no merged cell\n * crosses. A run of rows between two of them moves as one.\n */\nexport function boundaries(map: TableMap, axis: 'row' | 'column'): number[] {\n const size = axis === 'row' ? map.height : map.width\n const crossed = new Set<number>()\n const seen = new Set<number>()\n for (const pos of map.map) {\n if (seen.has(pos)) continue\n seen.add(pos)\n const rect = map.findCell(pos)\n const [from, to] = axis === 'row' ? [rect.top, rect.bottom] : [rect.left, rect.right]\n for (let index = from + 1; index < to; index++) crossed.add(index)\n }\n const result: number[] = []\n for (let index = 0; index <= size; index++) if (!crossed.has(index)) result.push(index)\n return result\n}\n\n/** The run of rows (or columns) that holds `[from, to)` and can move as one. */\nexport function band(map: TableMap, axis: 'row' | 'column', from: number, to: number) {\n const cuts = boundaries(map, axis)\n let start = 0\n let end = cuts.at(-1)!\n for (const cut of cuts) {\n if (cut <= from) start = cut\n if (cut >= to) {\n end = cut\n break\n }\n }\n return { start, end, cuts }\n}\n\n/**\n * Move the selected rows (or columns), with any merged cells they belong\n * to, one step up or down (left or right). Ids, widths and alignment move\n * along.\n */\nexport function moveLines(axis: 'row' | 'column', direction: -1 | 1): Command {\n return (state, dispatch) => {\n if (!isInTable(state)) return false\n const rect = selectedRect(state)\n const [from, to] = axis === 'row' ? [rect.top, rect.bottom] : [rect.left, rect.right]\n const { start, end, cuts } = band(rect.map, axis, from, to)\n const other = cuts[cuts.indexOf(direction < 0 ? start : end) + direction]\n if (other === undefined) return false\n return moveLinesTo(rect.tableStart - 1, axis, start, end, other)(state, dispatch)\n }\n}\n\n/**\n * Move rows (or columns) `[start, end)` of the table at `tablePos` to the\n * boundary `to`, given as the index of the line they go before. Both the\n * run and `to` have to be on boundaries no merged cell crosses.\n */\nexport function moveLinesTo(\n tablePos: number,\n axis: 'row' | 'column',\n start: number,\n end: number,\n to: number,\n): Command {\n return (state, dispatch) => {\n const table = state.doc.nodeAt(tablePos)\n if (!table || table.type.spec.tableRole !== 'table') return false\n const map = TableMap.get(table)\n const cuts = boundaries(map, axis)\n if (start >= end || !cuts.includes(start) || !cuts.includes(end) || !cuts.includes(to))\n return false\n if (to >= start && to <= end) return false\n if (dispatch) {\n const order = Array.from({ length: axis === 'row' ? map.height : map.width }, (_, i) => i)\n const moved =\n to < start\n ? [\n ...order.slice(0, to),\n ...order.slice(start, end),\n ...order.slice(to, start),\n ...order.slice(end),\n ]\n : [\n ...order.slice(0, start),\n ...order.slice(end, to),\n ...order.slice(start, end),\n ...order.slice(to),\n ]\n const read = tableRows.read(table)\n const columns = read.props.columns as unknown[]\n const rows =\n axis === 'row'\n ? moved.map((i) => read.rows[i]!)\n : read.rows.map((row) => ({ ...row, cells: moved.map((i) => row.cells[i]!) }))\n const props =\n axis === 'row' ? read.props : { ...read.props, columns: moved.map((i) => columns[i]) }\n const rebuilt = tableRows.write(table.type, props, rows)\n const tr = state.tr.replaceWith(tablePos, tablePos + table.nodeSize, rebuilt)\n const first = to < start ? to : to - (end - start)\n selectLines(tr, tablePos, axis, first, first + end - start)\n dispatch(tr.scrollIntoView())\n }\n return true\n }\n}\n\n/** Select whole rows (or columns) `[from, to)` of the table at `tablePos`. */\nexport function selectLines(\n tr: Transaction,\n tablePos: number,\n axis: 'row' | 'column',\n from: number,\n to: number,\n) {\n const table = tr.doc.nodeAt(tablePos)!\n const map = TableMap.get(table)\n const start = tablePos + 1\n const [anchor, head] =\n axis === 'row'\n ? [map.positionAt(from, 0, table), map.positionAt(to - 1, map.width - 1, table)]\n : [map.positionAt(0, from, table), map.positionAt(map.height - 1, to - 1, table)]\n const $anchor = tr.doc.resolve(start + anchor)\n const $head = tr.doc.resolve(start + head)\n tr.setSelection(\n axis === 'row'\n ? CellSelection.rowSelection($anchor, $head)\n : CellSelection.colSelection($anchor, $head),\n )\n return tr\n}\n\n/* cells */\n\n/**\n * Merge the selected cells into the top-left one. Their text joins it,\n * each on a line of its own.\n */\nexport const mergeCells: Command = (state, dispatch) => {\n const selection = state.selection\n if (\n !(selection instanceof CellSelection) ||\n selection.$anchorCell.pos === selection.$headCell.pos\n )\n return false\n const rect = selectedRect(state)\n const { map, table, tableStart } = rect\n // a merged cell that reaches out of the selection can't be merged\n const seen = new Set<number>()\n const inside: number[] = []\n for (let row = rect.top; row < rect.bottom; row++) {\n for (let col = rect.left; col < rect.right; col++) {\n const pos = map.map[row * map.width + col]!\n if (seen.has(pos)) continue\n seen.add(pos)\n const cell = map.findCell(pos)\n if (\n cell.left < rect.left ||\n cell.right > rect.right ||\n cell.top < rect.top ||\n cell.bottom > rect.bottom\n )\n return false\n inside.push(pos)\n }\n }\n if (dispatch) {\n const tr = state.tr\n const [first, ...rest] = inside\n const target = table.nodeAt(first!)!\n const breakType = state.schema.nodes.hardBreak!\n const parts = [target, ...rest.map((pos) => table.nodeAt(pos)!)].filter(\n (cell) => cell.content.size,\n )\n const content: PMNode[] = []\n parts.forEach((cell, index) => {\n if (index) content.push(breakType.create())\n cell.content.forEach((child) => content.push(child))\n })\n // later cells first, so earlier positions stay valid\n for (let index = rest.length - 1; index >= 0; index--) {\n const pos = rest[index]!\n const cell = table.nodeAt(pos)!\n tr.delete(tableStart + pos, tableStart + pos + cell.nodeSize)\n }\n const widths = Array.from({ length: rect.right - rect.left }, (_, index) => {\n const pos = map.map[rect.top * map.width + rect.left + index]!\n const cell = table.nodeAt(pos)!\n const offset = rect.left + index - map.findCell(pos).left\n return (cell.attrs.colwidth as number[] | null)?.[offset] ?? 0\n })\n const at = tableStart + first!\n tr.replaceWith(\n at,\n at + target.nodeSize,\n target.type.create(\n {\n ...target.attrs,\n colspan: rect.right - rect.left,\n rowspan: rect.bottom - rect.top,\n colwidth: widths.some(Boolean) ? widths : null,\n },\n content,\n ),\n )\n tr.setSelection(TextSelection.create(tr.doc, at + 1))\n dispatch(tr)\n }\n return true\n}\n\n/** Whether the selection is in (or on) a merged cell. */\nexport function inMergedCell(state: EditorState) {\n if (!isInTable(state)) return false\n const $cell = selectionCell(state)\n const cell = $cell.nodeAfter\n return !!cell && (cell.attrs.colspan > 1 || cell.attrs.rowspan > 1)\n}\n\n/** Split a merged cell back into single cells; its text stays in the first. */\nexport const splitMergedCell: Command = (state, dispatch) => splitCell(state, dispatch)\n\n/** Empty the selected cells. */\nexport const clearCells: Command = deleteCellSelection\n\n/** Align the text of the selected columns. */\nexport function alignColumns(align: TableAlign | null): Command {\n return (state, dispatch) => {\n if (!isInTable(state)) return false\n if (dispatch) {\n const rect = selectedRect(state)\n const columns = columnsOf(rect).map((column, index) => {\n if (index < rect.left || index >= rect.right) return column\n return align && align !== 'left' ? { id: column.id, align } : { id: column.id }\n })\n dispatch(state.tr.setNodeAttribute(rect.tableStart - 1, 'columns', columns))\n }\n return true\n }\n}\n\n/** Turn the first row (or column) into a header, or back. */\nexport function toggleHeader(which: 'headerRow' | 'headerColumn'): Command {\n return (state, dispatch) => {\n const found = tableAt(state.selection.$from)\n if (!found) return false\n if (dispatch) dispatch(state.tr.setNodeAttribute(found.pos, which, !found.node.attrs[which]))\n return true\n }\n}\n\n/* moving the cursor */\n\nconst cellStart = (state: EditorState) => cellAround(state.selection.$head)\n\n/**\n * `Tab` / `Shift+Tab`: the next or previous cell, its text selected.\n * `Tab` in the last cell adds a row.\n */\nexport function goToCell(direction: 1 | -1): Command {\n return (state, dispatch) => {\n const $cell = cellStart(state)\n const found = $cell && tableAt($cell)\n if (!$cell || !found) return false\n const { map, pos } = found\n const start = pos + 1\n const rect = map.findCell($cell.pos - start)\n const cells: number[] = []\n for (const cell of map.map) if (!cells.includes(cell)) cells.push(cell)\n const index = cells.indexOf(map.map[rect.top * map.width + rect.left]!)\n let next = cells[index + direction]\n let tr = state.tr\n if (next === undefined) {\n if (direction < 0) return false\n if (!dispatch) return true\n const full = selectedRect(state)\n tr = addRow(tr, { ...full, top: map.height - 1, bottom: map.height }, map.height)\n const table = tr.doc.nodeAt(pos)!\n const after = TableMap.get(table)\n next = after.map[map.height * after.width]!\n }\n if (dispatch) {\n const table = tr.doc.nodeAt(pos)!\n const cell = table.nodeAt(next)!\n const from = start + next + 1\n dispatch(\n tr\n .setSelection(TextSelection.create(tr.doc, from, from + cell.content.size))\n .scrollIntoView(),\n )\n }\n return true\n }\n}\n\n/** `Enter`: the cell below, adding a row at the bottom. */\nexport const goDown: Command = (state, dispatch) => {\n const $cell = cellStart(state)\n const found = $cell && tableAt($cell)\n if (!$cell || !found) return false\n const { map, pos } = found\n const start = pos + 1\n const rect = map.findCell($cell.pos - start)\n let tr = state.tr\n let below = rect.bottom\n if (below >= map.height) {\n if (!dispatch) return true\n tr = addRow(tr, { ...selectedRect(state), top: map.height - 1, bottom: map.height }, map.height)\n below = map.height\n }\n if (dispatch) {\n const table = tr.doc.nodeAt(pos)!\n const after = TableMap.get(table)\n const cell = after.map[below * after.width + rect.left]!\n const from = start + cell + 1 + table.nodeAt(cell)!.content.size\n dispatch(tr.setSelection(TextSelection.create(tr.doc, from)).scrollIntoView())\n }\n return true\n}\n\n/** `Backspace` at the start of a cell, `Delete` at its end: nothing, so cells never join. */\nexport function stopAtCellEdge(side: 'start' | 'end'): Command {\n return (state) => {\n const { $from, empty } = state.selection\n if (!empty || $from.parent.type.spec.tableRole === undefined) return false\n const role = $from.parent.type.spec.tableRole\n if (role !== 'cell' && role !== 'header_cell') return false\n return side === 'start'\n ? $from.parentOffset === 0\n : $from.parentOffset === $from.parent.content.size\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ import { isAlign, isHeaderAt } from "./schema.js";
2
+ // src/extensions/table/html.ts
3
+ /** The cells that show, row by row: covered ones are left out, spans kept inside the table. */
4
+ function placedRows(block) {
5
+ const rows = block.rows ?? [];
6
+ const width = Math.max(0, ...rows.map((row) => row.cells.length));
7
+ const covered = rows.map(() => Array.from({ length: width }, () => false));
8
+ return {
9
+ rows: rows.map((row, r) => {
10
+ const placed = [];
11
+ for (let c = 0; c < width; c++) {
12
+ if (covered[r][c]) continue;
13
+ const cell = row.cells[c] ?? { content: [] };
14
+ let colspan = Math.max(1, Math.min(cell.colspan ?? 1, width - c));
15
+ let rowspan = Math.max(1, Math.min(cell.rowspan ?? 1, rows.length - r));
16
+ while (colspan > 1 && covered[r].slice(c, c + colspan).some(Boolean)) colspan--;
17
+ while (rowspan > 1 && covered.slice(r, r + rowspan).some((line) => line.slice(c, c + colspan).some(Boolean))) rowspan--;
18
+ for (let y = r; y < r + rowspan; y++) for (let x = c; x < c + colspan; x++) covered[y][x] = true;
19
+ placed.push({
20
+ cell: {
21
+ ...cell,
22
+ colspan,
23
+ rowspan
24
+ },
25
+ row: r,
26
+ col: c
27
+ });
28
+ }
29
+ return placed;
30
+ }),
31
+ width
32
+ };
33
+ }
34
+ var columnsOf = (block) => Array.isArray(block.props.columns) ? block.props.columns : [];
35
+ function tableHTML(block, inline) {
36
+ const { rows } = placedRows(block);
37
+ const columns = columnsOf(block);
38
+ const widths = columns.map((column) => Number(column.width) || 0);
39
+ const colgroup = widths.some(Boolean) ? `<colgroup>${widths.map((width) => width ? `<col style="width: ${width}px">` : "<col>").join("")}</colgroup>` : "";
40
+ const props = {
41
+ headerRow: block.props.headerRow ?? true,
42
+ headerColumn: block.props.headerColumn
43
+ };
44
+ const rowHTML = (placed) => `<tr>${placed.map(({ cell, row, col }) => {
45
+ const tag = isHeaderAt(props, row, col) ? "th" : "td";
46
+ const align = columns[col]?.align;
47
+ return `<${tag}${[
48
+ cell.colspan > 1 ? ` colspan="${cell.colspan}"` : "",
49
+ cell.rowspan > 1 ? ` rowspan="${cell.rowspan}"` : "",
50
+ isAlign(align) && align !== "left" ? ` style="text-align: ${align}"` : ""
51
+ ].join("")}>${inline(cell)}</${tag}>`;
52
+ }).join("")}</tr>`;
53
+ const [head, ...body] = rows;
54
+ const thead = props.headerRow && head ? `<thead>${rowHTML(head)}</thead>` : "";
55
+ const tbody = (props.headerRow ? body : rows).map(rowHTML).join("");
56
+ return `<table>${colgroup}${thead}${tbody ? `<tbody>${tbody}</tbody>` : ""}</table>`;
57
+ }
58
+ /** GitHub's table syntax. Its first row is always the header; merged cells leave the covered places empty. */
59
+ function tableMarkdown(block, inline) {
60
+ const { rows, width } = placedRows(block);
61
+ if (!rows.length || !width) return "";
62
+ const columns = columnsOf(block);
63
+ const lines = rows.map((placed) => {
64
+ const cells = Array.from({ length: width }, () => "");
65
+ for (const { cell, col } of placed) cells[col] = inline(cell);
66
+ return `| ${cells.join(" | ")} |`;
67
+ });
68
+ const rule = Array.from({ length: width }, (_, index) => {
69
+ const align = columns[index]?.align;
70
+ return align === "center" ? ":-:" : align === "right" ? "--:" : "---";
71
+ });
72
+ return [
73
+ lines[0],
74
+ `| ${rule.join(" | ")} |`,
75
+ ...lines.slice(1)
76
+ ].join("\n");
77
+ }
78
+ var tableOutput = {
79
+ html: (block, { inline, children }) => tableHTML(block, (cell) => inline(cell.content)) + children,
80
+ markdown: (block, { inline, children }) => {
81
+ const table = tableMarkdown(block, (cell) => inline(cell.content).replace(/\\\n/g, "<br>").replace(/\n/g, " "));
82
+ return children ? `${table}\n\n${children}` : table;
83
+ }
84
+ };
85
+ var BLOCKS = "p, div, h1, h2, h3, h4, h5, h6, li, blockquote, pre, ul, ol, figure, details, table, thead, tbody, tfoot, tr, td, th";
86
+ /** A cell holds a line of text: its paragraphs and list items become lines, images their text. */
87
+ function flattenCell(cell) {
88
+ const doc = cell.ownerDocument;
89
+ for (const img of Array.from(cell.querySelectorAll("img"))) img.replaceWith(doc.createTextNode(img.getAttribute("alt") ?? ""));
90
+ const blocks = Array.from(cell.querySelectorAll(BLOCKS));
91
+ for (let index = blocks.length - 1; index >= 0; index--) {
92
+ const element = blocks[index];
93
+ const parts = Array.from(element.childNodes);
94
+ if (element.nextSibling && element.textContent?.trim()) parts.push(doc.createElement("br"));
95
+ element.replaceWith(...parts);
96
+ }
97
+ }
98
+ /** Widths from a `<colgroup>`, put on each cell as `data-colwidth`, which the cells read. */
99
+ function spreadWidths(table) {
100
+ const cols = Array.from(table.querySelectorAll(":scope > colgroup > col"));
101
+ if (!cols.length) return;
102
+ const widths = cols.flatMap((col) => {
103
+ const width = /^(\d+)px$/.exec(col.style.width)?.[1];
104
+ const span = Number(col.getAttribute("span") || 1);
105
+ return Array.from({ length: span }, () => Number(width) || 0);
106
+ });
107
+ if (!widths.some(Boolean)) return;
108
+ const taken = [];
109
+ Array.from(table.rows).forEach((row, r) => {
110
+ taken[r] ??= [];
111
+ let c = 0;
112
+ for (const cell of Array.from(row.cells)) {
113
+ while (taken[r][c]) c++;
114
+ for (let y = r; y < r + cell.rowSpan; y++) {
115
+ taken[y] ??= [];
116
+ for (let x = c; x < c + cell.colSpan; x++) taken[y][x] = true;
117
+ }
118
+ const span = widths.slice(c, c + cell.colSpan);
119
+ if (span.length === cell.colSpan && span.some(Boolean)) cell.dataset.colwidth = span.join(",");
120
+ c += cell.colSpan;
121
+ }
122
+ });
123
+ }
124
+ /** Get pasted and imported tables ready: widths onto the cells, and each cell down to one line of text. */
125
+ function prepareTables(root) {
126
+ const tables = Array.from(root.querySelectorAll("table")).filter((table) => !table.parentElement?.closest("td, th"));
127
+ for (const table of tables) {
128
+ spreadWidths(table);
129
+ for (const cell of Array.from(table.querySelectorAll("td, th"))) flattenCell(cell);
130
+ }
131
+ }
132
+ export { prepareTables, tableOutput };
133
+
134
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","names":[],"sources":["../../../src/extensions/table/html.ts"],"sourcesContent":["import type { Block, TableCell } from '../../core/model'\nimport type { BlockOutput } from '../../core/output'\nimport { isAlign, isHeaderAt, type TableColumn } from './schema'\n\ninterface Placed {\n cell: TableCell\n row: number\n col: number\n}\n\n/** The cells that show, row by row: covered ones are left out, spans kept inside the table. */\nfunction placedRows(block: Block): { rows: Placed[][]; width: number } {\n const rows = block.rows ?? []\n const width = Math.max(0, ...rows.map((row) => row.cells.length))\n const covered = rows.map(() => Array.from({ length: width }, () => false))\n const result = rows.map((row, r) => {\n const placed: Placed[] = []\n for (let c = 0; c < width; c++) {\n if (covered[r]![c]) continue\n const cell = row.cells[c] ?? { content: [] }\n let colspan = Math.max(1, Math.min(cell.colspan ?? 1, width - c))\n let rowspan = Math.max(1, Math.min(cell.rowspan ?? 1, rows.length - r))\n while (colspan > 1 && covered[r]!.slice(c, c + colspan).some(Boolean)) colspan--\n while (\n rowspan > 1 &&\n covered.slice(r, r + rowspan).some((line) => line.slice(c, c + colspan).some(Boolean))\n )\n rowspan--\n for (let y = r; y < r + rowspan; y++)\n for (let x = c; x < c + colspan; x++) covered[y]![x] = true\n placed.push({ cell: { ...cell, colspan, rowspan }, row: r, col: c })\n }\n return placed\n })\n return { rows: result, width }\n}\n\nconst columnsOf = (block: Block) =>\n (Array.isArray(block.props.columns) ? block.props.columns : []) as Partial<TableColumn>[]\n\nfunction tableHTML(block: Block, inline: (cell: TableCell) => string): string {\n const { rows } = placedRows(block)\n const columns = columnsOf(block)\n const widths = columns.map((column) => Number(column.width) || 0)\n const colgroup = widths.some(Boolean)\n ? `<colgroup>${widths.map((width) => (width ? `<col style=\"width: ${width}px\">` : '<col>')).join('')}</colgroup>`\n : ''\n const props = { headerRow: block.props.headerRow ?? true, headerColumn: block.props.headerColumn }\n const rowHTML = (placed: Placed[]) =>\n `<tr>${placed\n .map(({ cell, row, col }) => {\n const tag = isHeaderAt(props, row, col) ? 'th' : 'td'\n const align = columns[col]?.align\n const attrs = [\n cell.colspan! > 1 ? ` colspan=\"${cell.colspan}\"` : '',\n cell.rowspan! > 1 ? ` rowspan=\"${cell.rowspan}\"` : '',\n isAlign(align) && align !== 'left' ? ` style=\"text-align: ${align}\"` : '',\n ].join('')\n return `<${tag}${attrs}>${inline(cell)}</${tag}>`\n })\n .join('')}</tr>`\n const [head, ...body] = rows\n const thead = props.headerRow && head ? `<thead>${rowHTML(head)}</thead>` : ''\n const tbody = (props.headerRow ? body : rows).map(rowHTML).join('')\n return `<table>${colgroup}${thead}${tbody ? `<tbody>${tbody}</tbody>` : ''}</table>`\n}\n\n/** GitHub's table syntax. Its first row is always the header; merged cells leave the covered places empty. */\nfunction tableMarkdown(block: Block, inline: (cell: TableCell) => string): string {\n const { rows, width } = placedRows(block)\n if (!rows.length || !width) return ''\n const columns = columnsOf(block)\n const lines = rows.map((placed) => {\n const cells = Array.from({ length: width }, () => '')\n for (const { cell, col } of placed) cells[col] = inline(cell)\n return `| ${cells.join(' | ')} |`\n })\n const rule = Array.from({ length: width }, (_, index) => {\n const align = columns[index]?.align\n return align === 'center' ? ':-:' : align === 'right' ? '--:' : '---'\n })\n return [lines[0], `| ${rule.join(' | ')} |`, ...lines.slice(1)].join('\\n')\n}\n\nexport const tableOutput: BlockOutput = {\n html: (block, { inline, children }) =>\n tableHTML(block, (cell) => inline(cell.content)) + children,\n markdown: (block, { inline, children }) => {\n // a cell is one line: line breaks become `<br>`\n const table = tableMarkdown(block, (cell) =>\n inline(cell.content).replace(/\\\\\\n/g, '<br>').replace(/\\n/g, ' '),\n )\n return children ? `${table}\\n\\n${children}` : table\n },\n}\n\n/* reading */\n\nconst BLOCKS =\n 'p, div, h1, h2, h3, h4, h5, h6, li, blockquote, pre, ul, ol, figure, details, table, thead, tbody, tfoot, tr, td, th'\n\n/** A cell holds a line of text: its paragraphs and list items become lines, images their text. */\nfunction flattenCell(cell: Element) {\n const doc = cell.ownerDocument\n for (const img of Array.from(cell.querySelectorAll('img')))\n img.replaceWith(doc.createTextNode(img.getAttribute('alt') ?? ''))\n // innermost first\n const blocks = Array.from(cell.querySelectorAll(BLOCKS))\n for (let index = blocks.length - 1; index >= 0; index--) {\n const element = blocks[index]!\n const parts: Node[] = Array.from(element.childNodes)\n if (element.nextSibling && element.textContent?.trim()) parts.push(doc.createElement('br'))\n element.replaceWith(...parts)\n }\n}\n\n/** Widths from a `<colgroup>`, put on each cell as `data-colwidth`, which the cells read. */\nfunction spreadWidths(table: HTMLTableElement) {\n const cols = Array.from(table.querySelectorAll(':scope > colgroup > col'))\n if (!cols.length) return\n const widths = cols.flatMap((col) => {\n const width = /^(\\d+)px$/.exec((col as HTMLElement).style.width)?.[1]\n const span = Number(col.getAttribute('span') || 1)\n return Array.from({ length: span }, () => Number(width) || 0)\n })\n if (!widths.some(Boolean)) return\n const taken: boolean[][] = []\n Array.from(table.rows).forEach((row, r) => {\n taken[r] ??= []\n let c = 0\n for (const cell of Array.from(row.cells)) {\n while (taken[r]![c]) c++\n for (let y = r; y < r + cell.rowSpan; y++) {\n taken[y] ??= []\n for (let x = c; x < c + cell.colSpan; x++) taken[y]![x] = true\n }\n const span = widths.slice(c, c + cell.colSpan)\n if (span.length === cell.colSpan && span.some(Boolean)) cell.dataset.colwidth = span.join(',')\n c += cell.colSpan\n }\n })\n}\n\n/** Get pasted and imported tables ready: widths onto the cells, and each cell down to one line of text. */\nexport function prepareTables(root: HTMLElement) {\n const tables = Array.from(root.querySelectorAll('table')).filter(\n (table) => !table.parentElement?.closest('td, th'),\n )\n for (const table of tables) {\n spreadWidths(table)\n for (const cell of Array.from(table.querySelectorAll('td, th'))) flattenCell(cell)\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { defineEditorExtension } from "../../core/extension.js";
2
+ import { tableNodes, tableSpec } from "./schema.js";
3
+ import { alignColumns, clearCells, deleteColumns, deleteRows, goDown, goToCell, insertColumn, insertRow, mergeCells, moveLines, moveLinesTo, splitMergedCell, stopAtCellEdge, toggleHeader } from "./commands.js";
4
+ import { prepareTables, tableOutput } from "./html.js";
5
+ import { tablePlugin } from "./plugin.js";
6
+ import table_controls_default from "./table-controls.js";
7
+ import { TableBlockView } from "./view.js";
8
+ import { TableIcon } from "@dou-ui/icons";
9
+ import { columnResizing, tableEditing } from "prosemirror-tables";
10
+ // src/extensions/table/index.ts
11
+ /**
12
+ * Tables: rows and columns of formatted text. Cells can be merged; rows
13
+ * and columns are added, moved and removed from the handles on their
14
+ * edges, and columns resized by dragging their borders.
15
+ */
16
+ var table = defineEditorExtension({
17
+ name: "table",
18
+ blocks: { table: tableSpec },
19
+ nodes: tableNodes,
20
+ nodeViews: { table: (node) => new TableBlockView(node) },
21
+ keymap: () => ({
22
+ tab: goToCell(1),
23
+ "shift+tab": goToCell(-1),
24
+ enter: goDown,
25
+ backspace: stopAtCellEdge("start"),
26
+ delete: stopAtCellEdge("end")
27
+ }),
28
+ plugins: () => [
29
+ columnResizing({
30
+ cellMinWidth: 48,
31
+ defaultCellMinWidth: 96,
32
+ View: null
33
+ }),
34
+ tableEditing(),
35
+ tablePlugin()
36
+ ],
37
+ output: { blocks: { table: tableOutput } },
38
+ prepareHTML: prepareTables,
39
+ overlays: [table_controls_default],
40
+ blockOptions: [{
41
+ key: "table",
42
+ type: "table",
43
+ label: (m) => m.types.table,
44
+ hint: (m) => m.hints.table,
45
+ icon: TableIcon,
46
+ keywords: [
47
+ "table",
48
+ "grid",
49
+ "bg",
50
+ "biaoge"
51
+ ]
52
+ }]
53
+ });
54
+ export { alignColumns, clearCells, deleteColumns, deleteRows, insertColumn, insertRow, mergeCells, moveLines, moveLinesTo, splitMergedCell, table, toggleHeader };
55
+
56
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["TableControls"],"sources":["../../../src/extensions/table/index.ts"],"sourcesContent":["import { TableIcon } from '@dou-ui/icons'\nimport { columnResizing, tableEditing } from 'prosemirror-tables'\nimport { defineEditorExtension } from '../../core/extension'\nimport { goDown, goToCell, stopAtCellEdge } from './commands'\nimport { prepareTables, tableOutput } from './html'\nimport { tablePlugin } from './plugin'\nimport { tableNodes, tableSpec } from './schema'\nimport TableControls from './table-controls.vue'\nimport { CELL_MIN_WIDTH, TableBlockView } from './view'\n\n/**\n * Tables: rows and columns of formatted text. Cells can be merged; rows\n * and columns are added, moved and removed from the handles on their\n * edges, and columns resized by dragging their borders.\n */\nexport const table = defineEditorExtension({\n name: 'table',\n blocks: { table: tableSpec },\n nodes: tableNodes,\n nodeViews: { table: (node) => new TableBlockView(node) },\n keymap: () => ({\n tab: goToCell(1),\n 'shift+tab': goToCell(-1),\n enter: goDown,\n backspace: stopAtCellEdge('start'),\n delete: stopAtCellEdge('end'),\n }),\n plugins: () => [\n columnResizing({ cellMinWidth: 48, defaultCellMinWidth: CELL_MIN_WIDTH, View: null }),\n tableEditing(),\n tablePlugin(),\n ],\n output: { blocks: { table: tableOutput } },\n prepareHTML: prepareTables,\n overlays: [TableControls],\n blockOptions: [\n {\n key: 'table',\n type: 'table',\n label: (m) => m.types.table,\n hint: (m) => m.hints.table,\n icon: TableIcon,\n keywords: ['table', 'grid', 'bg', 'biaoge'],\n },\n ],\n})\n\nexport {\n alignColumns,\n clearCells,\n deleteColumns,\n deleteRows,\n insertColumn,\n insertRow,\n mergeCells,\n moveLines,\n moveLinesTo,\n splitMergedCell,\n toggleHeader,\n} from './commands'\nexport type { TableAlign, TableColumn } from './schema'\n"],"mappings":";;;;;;;;;;;;;;;AAeA,IAAa,QAAQ,sBAAsB;CACzC,MAAM;CACN,QAAQ,EAAE,OAAO,UAAU;CAC3B,OAAO;CACP,WAAW,EAAE,QAAQ,SAAS,IAAI,eAAe,IAAI,EAAE;CACvD,eAAe;EACb,KAAK,SAAS,CAAC;EACf,aAAa,SAAS,EAAE;EACxB,OAAO;EACP,WAAW,eAAe,OAAO;EACjC,QAAQ,eAAe,KAAK;CAC9B;CACA,eAAe;EACb,eAAe;GAAE,cAAc;GAAI,qBAAA;GAAqC,MAAM;EAAK,CAAC;EACpF,aAAa;EACb,YAAY;CACd;CACA,QAAQ,EAAE,QAAQ,EAAE,OAAO,YAAY,EAAE;CACzC,aAAa;CACb,UAAU,CAACA,sBAAa;CACxB,cAAc,CACZ;EACE,KAAK;EACL,MAAM;EACN,QAAQ,MAAM,EAAE,MAAM;EACtB,OAAO,MAAM,EAAE,MAAM;EACrB,MAAM;EACN,UAAU;GAAC;GAAS;GAAQ;GAAM;EAAQ;CAC5C,CACF;AACF,CAAC"}