@kerebron/extension-basic-editor 0.4.27 → 0.4.29

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 (242) hide show
  1. package/esm/ExtensionBaseKeymap.d.ts +7 -0
  2. package/esm/ExtensionBaseKeymap.d.ts.map +1 -0
  3. package/esm/ExtensionBaseKeymap.js +56 -0
  4. package/esm/ExtensionBaseKeymap.js.map +1 -0
  5. package/esm/ExtensionBasicCodeEditor.d.ts +11 -0
  6. package/esm/ExtensionBasicCodeEditor.d.ts.map +1 -0
  7. package/esm/ExtensionBasicCodeEditor.js +62 -0
  8. package/esm/ExtensionBasicCodeEditor.js.map +1 -0
  9. package/esm/ExtensionBasicEditor.d.ts +49 -0
  10. package/esm/ExtensionBasicEditor.d.ts.map +1 -0
  11. package/esm/ExtensionBasicEditor.js +95 -0
  12. package/esm/ExtensionBasicEditor.js.map +1 -0
  13. package/esm/ExtensionDropcursor.d.ts +19 -0
  14. package/esm/ExtensionDropcursor.d.ts.map +1 -0
  15. package/esm/ExtensionDropcursor.js +187 -0
  16. package/esm/ExtensionDropcursor.js.map +1 -0
  17. package/esm/ExtensionGapcursor.d.ts +32 -0
  18. package/esm/ExtensionGapcursor.d.ts.map +1 -0
  19. package/esm/ExtensionGapcursor.js +250 -0
  20. package/esm/ExtensionGapcursor.js.map +1 -0
  21. package/esm/ExtensionHistory.d.ts +14 -0
  22. package/esm/ExtensionHistory.d.ts.map +1 -0
  23. package/esm/ExtensionHistory.js +35 -0
  24. package/esm/ExtensionHistory.js.map +1 -0
  25. package/esm/ExtensionHtml.d.ts +15 -0
  26. package/esm/ExtensionHtml.d.ts.map +1 -0
  27. package/esm/ExtensionHtml.js +100 -0
  28. package/esm/ExtensionHtml.js.map +1 -0
  29. package/esm/ExtensionMediaUpload.d.ts +24 -0
  30. package/esm/ExtensionMediaUpload.d.ts.map +1 -0
  31. package/esm/ExtensionMediaUpload.js +168 -0
  32. package/esm/ExtensionMediaUpload.js.map +1 -0
  33. package/esm/ExtensionSelection.d.ts +11 -0
  34. package/esm/ExtensionSelection.d.ts.map +1 -0
  35. package/esm/ExtensionSelection.js +230 -0
  36. package/esm/ExtensionSelection.js.map +1 -0
  37. package/esm/ExtensionTextAlign.d.ts +11 -0
  38. package/esm/ExtensionTextAlign.d.ts.map +1 -0
  39. package/esm/ExtensionTextAlign.js +40 -0
  40. package/esm/ExtensionTextAlign.js.map +1 -0
  41. package/esm/MarkBookmark.d.ts +8 -0
  42. package/esm/MarkBookmark.d.ts.map +1 -0
  43. package/esm/MarkBookmark.js +17 -0
  44. package/esm/MarkBookmark.js.map +1 -0
  45. package/esm/MarkChange.d.ts +8 -0
  46. package/esm/MarkChange.d.ts.map +1 -0
  47. package/esm/MarkChange.js +14 -0
  48. package/esm/MarkChange.js.map +1 -0
  49. package/esm/MarkCode.d.ts +11 -0
  50. package/esm/MarkCode.d.ts.map +1 -0
  51. package/esm/MarkCode.js +24 -0
  52. package/esm/MarkCode.js.map +1 -0
  53. package/esm/MarkHighlight.d.ts +8 -0
  54. package/esm/MarkHighlight.d.ts.map +1 -0
  55. package/esm/MarkHighlight.js +36 -0
  56. package/esm/MarkHighlight.js.map +1 -0
  57. package/esm/MarkItalic.d.ts +11 -0
  58. package/esm/MarkItalic.d.ts.map +1 -0
  59. package/esm/MarkItalic.js +30 -0
  60. package/esm/MarkItalic.js.map +1 -0
  61. package/esm/MarkLink.d.ts +8 -0
  62. package/esm/MarkLink.d.ts.map +1 -0
  63. package/esm/MarkLink.js +30 -0
  64. package/esm/MarkLink.js.map +1 -0
  65. package/esm/MarkStrike.d.ts +11 -0
  66. package/esm/MarkStrike.d.ts.map +1 -0
  67. package/esm/MarkStrike.js +27 -0
  68. package/esm/MarkStrike.js.map +1 -0
  69. package/esm/MarkStrong.d.ts +11 -0
  70. package/esm/MarkStrong.d.ts.map +1 -0
  71. package/esm/MarkStrong.js +39 -0
  72. package/esm/MarkStrong.js.map +1 -0
  73. package/esm/MarkSubscript.d.ts +11 -0
  74. package/esm/MarkSubscript.d.ts.map +1 -0
  75. package/esm/MarkSubscript.js +31 -0
  76. package/esm/MarkSubscript.js.map +1 -0
  77. package/esm/MarkSuperscript.d.ts +11 -0
  78. package/esm/MarkSuperscript.d.ts.map +1 -0
  79. package/esm/MarkSuperscript.js +31 -0
  80. package/esm/MarkSuperscript.js.map +1 -0
  81. package/esm/MarkTextColor.d.ts +8 -0
  82. package/esm/MarkTextColor.d.ts.map +1 -0
  83. package/esm/MarkTextColor.js +28 -0
  84. package/esm/MarkTextColor.js.map +1 -0
  85. package/esm/MarkUnderline.d.ts +11 -0
  86. package/esm/MarkUnderline.d.ts.map +1 -0
  87. package/esm/MarkUnderline.js +34 -0
  88. package/esm/MarkUnderline.js.map +1 -0
  89. package/esm/NodeAside.d.ts +8 -0
  90. package/esm/NodeAside.d.ts.map +1 -0
  91. package/esm/NodeAside.js +17 -0
  92. package/esm/NodeAside.js.map +1 -0
  93. package/esm/NodeBlockquote.d.ts +13 -0
  94. package/esm/NodeBlockquote.d.ts.map +1 -0
  95. package/esm/NodeBlockquote.js +35 -0
  96. package/esm/NodeBlockquote.js.map +1 -0
  97. package/esm/NodeBookmark.d.ts +8 -0
  98. package/esm/NodeBookmark.d.ts.map +1 -0
  99. package/esm/NodeBookmark.js +20 -0
  100. package/esm/NodeBookmark.js.map +1 -0
  101. package/esm/NodeBulletList.d.ts +13 -0
  102. package/esm/NodeBulletList.d.ts.map +1 -0
  103. package/esm/NodeBulletList.js +35 -0
  104. package/esm/NodeBulletList.js.map +1 -0
  105. package/esm/NodeCodeBlock.d.ts +9 -0
  106. package/esm/NodeCodeBlock.d.ts.map +1 -0
  107. package/esm/NodeCodeBlock.js +51 -0
  108. package/esm/NodeCodeBlock.js.map +1 -0
  109. package/esm/NodeDefinitionDesc.d.ts +8 -0
  110. package/esm/NodeDefinitionDesc.d.ts.map +1 -0
  111. package/esm/NodeDefinitionDesc.js +17 -0
  112. package/esm/NodeDefinitionDesc.js.map +1 -0
  113. package/esm/NodeDefinitionList.d.ts +13 -0
  114. package/esm/NodeDefinitionList.d.ts.map +1 -0
  115. package/esm/NodeDefinitionList.js +29 -0
  116. package/esm/NodeDefinitionList.js.map +1 -0
  117. package/esm/NodeDefinitionTerm.d.ts +8 -0
  118. package/esm/NodeDefinitionTerm.d.ts.map +1 -0
  119. package/esm/NodeDefinitionTerm.js +17 -0
  120. package/esm/NodeDefinitionTerm.js.map +1 -0
  121. package/esm/NodeDocument.d.ts +7 -0
  122. package/esm/NodeDocument.d.ts.map +1 -0
  123. package/esm/NodeDocument.js +20 -0
  124. package/esm/NodeDocument.js.map +1 -0
  125. package/esm/NodeDocumentCode.d.ts +7 -0
  126. package/esm/NodeDocumentCode.d.ts.map +1 -0
  127. package/esm/NodeDocumentCode.js +30 -0
  128. package/esm/NodeDocumentCode.js.map +1 -0
  129. package/esm/NodeFrontmatter.d.ts +8 -0
  130. package/esm/NodeFrontmatter.d.ts.map +1 -0
  131. package/esm/NodeFrontmatter.js +17 -0
  132. package/esm/NodeFrontmatter.js.map +1 -0
  133. package/esm/NodeHardBreak.d.ts +14 -0
  134. package/esm/NodeHardBreak.d.ts.map +1 -0
  135. package/esm/NodeHardBreak.js +68 -0
  136. package/esm/NodeHardBreak.js.map +1 -0
  137. package/esm/NodeHeading.d.ts +13 -0
  138. package/esm/NodeHeading.d.ts.map +1 -0
  139. package/esm/NodeHeading.js +50 -0
  140. package/esm/NodeHeading.js.map +1 -0
  141. package/esm/NodeHorizontalRule.d.ts +11 -0
  142. package/esm/NodeHorizontalRule.d.ts.map +1 -0
  143. package/esm/NodeHorizontalRule.js +30 -0
  144. package/esm/NodeHorizontalRule.js.map +1 -0
  145. package/esm/NodeImage.d.ts +8 -0
  146. package/esm/NodeImage.d.ts.map +1 -0
  147. package/esm/NodeImage.js +34 -0
  148. package/esm/NodeImage.js.map +1 -0
  149. package/esm/NodeInlineShortCode.d.ts +11 -0
  150. package/esm/NodeInlineShortCode.d.ts.map +1 -0
  151. package/esm/NodeInlineShortCode.js +40 -0
  152. package/esm/NodeInlineShortCode.js.map +1 -0
  153. package/esm/NodeListItem.d.ts +14 -0
  154. package/esm/NodeListItem.d.ts.map +1 -0
  155. package/esm/NodeListItem.js +202 -0
  156. package/esm/NodeListItem.js.map +1 -0
  157. package/esm/NodeMath.d.ts +8 -0
  158. package/esm/NodeMath.d.ts.map +1 -0
  159. package/esm/NodeMath.js +100 -0
  160. package/esm/NodeMath.js.map +1 -0
  161. package/esm/NodeOrderedList.d.ts +23 -0
  162. package/esm/NodeOrderedList.d.ts.map +1 -0
  163. package/esm/NodeOrderedList.js +53 -0
  164. package/esm/NodeOrderedList.js.map +1 -0
  165. package/esm/NodeParagraph.d.ts +11 -0
  166. package/esm/NodeParagraph.d.ts.map +1 -0
  167. package/esm/NodeParagraph.js +45 -0
  168. package/esm/NodeParagraph.js.map +1 -0
  169. package/esm/NodeTaskItem.d.ts +24 -0
  170. package/esm/NodeTaskItem.d.ts.map +1 -0
  171. package/esm/NodeTaskItem.js +147 -0
  172. package/esm/NodeTaskItem.js.map +1 -0
  173. package/esm/NodeTaskList.d.ts +11 -0
  174. package/esm/NodeTaskList.d.ts.map +1 -0
  175. package/esm/NodeTaskList.js +26 -0
  176. package/esm/NodeTaskList.js.map +1 -0
  177. package/esm/NodeText.d.ts +7 -0
  178. package/esm/NodeText.d.ts.map +1 -0
  179. package/esm/NodeText.js +10 -0
  180. package/esm/NodeText.js.map +1 -0
  181. package/esm/NodeVideo.d.ts +8 -0
  182. package/esm/NodeVideo.d.ts.map +1 -0
  183. package/esm/NodeVideo.js +46 -0
  184. package/esm/NodeVideo.js.map +1 -0
  185. package/esm/package.json +3 -0
  186. package/esm/remote-selection/ExtensionRemoteSelection.d.ts +24 -0
  187. package/esm/remote-selection/ExtensionRemoteSelection.d.ts.map +1 -0
  188. package/esm/remote-selection/ExtensionRemoteSelection.js +23 -0
  189. package/esm/remote-selection/ExtensionRemoteSelection.js.map +1 -0
  190. package/esm/remote-selection/remoteSelectionPlugin.d.ts +25 -0
  191. package/esm/remote-selection/remoteSelectionPlugin.d.ts.map +1 -0
  192. package/esm/remote-selection/remoteSelectionPlugin.js +97 -0
  193. package/esm/remote-selection/remoteSelectionPlugin.js.map +1 -0
  194. package/package.json +6 -3
  195. package/src/ExtensionBaseKeymap.ts +64 -0
  196. package/src/ExtensionBasicCodeEditor.ts +82 -0
  197. package/src/ExtensionBasicEditor.ts +97 -0
  198. package/src/ExtensionDropcursor.ts +221 -0
  199. package/src/ExtensionGapcursor.ts +278 -0
  200. package/src/ExtensionHistory.ts +48 -0
  201. package/src/ExtensionHtml.ts +158 -0
  202. package/src/ExtensionMediaUpload.ts +258 -0
  203. package/src/ExtensionSelection.ts +379 -0
  204. package/src/ExtensionTextAlign.ts +50 -0
  205. package/src/MarkBookmark.ts +20 -0
  206. package/src/MarkChange.ts +17 -0
  207. package/src/MarkCode.ts +35 -0
  208. package/src/MarkHighlight.ts +38 -0
  209. package/src/MarkItalic.ts +41 -0
  210. package/src/MarkLink.ts +32 -0
  211. package/src/MarkStrike.ts +38 -0
  212. package/src/MarkStrong.ts +52 -0
  213. package/src/MarkSubscript.ts +42 -0
  214. package/src/MarkSuperscript.ts +42 -0
  215. package/src/MarkTextColor.ts +29 -0
  216. package/src/MarkUnderline.ts +47 -0
  217. package/src/NodeAside.ts +19 -0
  218. package/src/NodeBlockquote.ts +51 -0
  219. package/src/NodeBookmark.ts +23 -0
  220. package/src/NodeBulletList.ts +51 -0
  221. package/src/NodeCodeBlock.ts +60 -0
  222. package/src/NodeDefinitionDesc.ts +19 -0
  223. package/src/NodeDefinitionList.ts +46 -0
  224. package/src/NodeDefinitionTerm.ts +19 -0
  225. package/src/NodeDocument.ts +22 -0
  226. package/src/NodeDocumentCode.ts +33 -0
  227. package/src/NodeFrontmatter.ts +19 -0
  228. package/src/NodeHardBreak.ts +92 -0
  229. package/src/NodeHeading.ts +76 -0
  230. package/src/NodeHorizontalRule.ts +43 -0
  231. package/src/NodeImage.ts +36 -0
  232. package/src/NodeInlineShortCode.ts +55 -0
  233. package/src/NodeListItem.ts +320 -0
  234. package/src/NodeMath.ts +109 -0
  235. package/src/NodeOrderedList.ts +79 -0
  236. package/src/NodeParagraph.ts +60 -0
  237. package/src/NodeTaskItem.ts +190 -0
  238. package/src/NodeTaskList.ts +38 -0
  239. package/src/NodeText.ts +12 -0
  240. package/src/NodeVideo.ts +44 -0
  241. package/src/remote-selection/ExtensionRemoteSelection.ts +45 -0
  242. package/src/remote-selection/remoteSelectionPlugin.ts +157 -0
@@ -0,0 +1,250 @@
1
+ import { NodeSelection, Plugin, Selection, TextSelection, } from 'prosemirror-state';
2
+ import { Fragment, Slice } from 'prosemirror-model';
3
+ import { Decoration, DecorationSet } from 'prosemirror-view';
4
+ import { Extension } from '@kerebron/editor';
5
+ import { keydownHandler } from '@kerebron/editor/plugins/keymap';
6
+ /// Gap cursor selections are represented using this class. Its
7
+ /// `$anchor` and `$head` properties both point at the cursor position.
8
+ export class GapCursor extends Selection {
9
+ /// Create a gap cursor.
10
+ constructor($pos) {
11
+ super($pos, $pos);
12
+ this.visible = false;
13
+ }
14
+ map(doc, mapping) {
15
+ let $pos = doc.resolve(mapping.map(this.head));
16
+ return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos);
17
+ }
18
+ content() {
19
+ return Slice.empty;
20
+ }
21
+ eq(other) {
22
+ return other instanceof GapCursor && other.head == this.head;
23
+ }
24
+ toJSON() {
25
+ return { type: 'gapcursor', pos: this.head };
26
+ }
27
+ /// @internal
28
+ static fromJSONToGapCursor(doc, json) {
29
+ if (typeof json.pos != 'number') {
30
+ throw new RangeError('Invalid input for GapCursor.fromJSON');
31
+ }
32
+ return new GapCursor(doc.resolve(json.pos));
33
+ }
34
+ /// @internal
35
+ getBookmark() {
36
+ return new GapBookmark(this.anchor);
37
+ }
38
+ /// @internal
39
+ static valid($pos) {
40
+ let parent = $pos.parent;
41
+ if (parent.isTextblock || !closedBefore($pos) || !closedAfter($pos)) {
42
+ return false;
43
+ }
44
+ let override = parent.type.spec.allowGapCursor;
45
+ if (override != null)
46
+ return override;
47
+ let deflt = parent.contentMatchAt($pos.index()).defaultType;
48
+ return deflt && deflt.isTextblock;
49
+ }
50
+ /// @internal
51
+ static findGapCursorFrom($pos, dir, mustMove = false) {
52
+ search: for (;;) {
53
+ if (!mustMove && GapCursor.valid($pos))
54
+ return $pos;
55
+ let pos = $pos.pos, next = null;
56
+ // Scan up from this position
57
+ for (let d = $pos.depth;; d--) {
58
+ let parent = $pos.node(d);
59
+ if (dir > 0 ? $pos.indexAfter(d) < parent.childCount : $pos.index(d) > 0) {
60
+ next = parent.child(dir > 0 ? $pos.indexAfter(d) : $pos.index(d) - 1);
61
+ break;
62
+ }
63
+ else if (d == 0) {
64
+ return null;
65
+ }
66
+ pos += dir;
67
+ let $cur = $pos.doc.resolve(pos);
68
+ if (GapCursor.valid($cur))
69
+ return $cur;
70
+ }
71
+ // And then down into the next node
72
+ for (;;) {
73
+ let inside = dir > 0 ? next.firstChild : next.lastChild;
74
+ if (!inside) {
75
+ if (next.isAtom && !next.isText && !NodeSelection.isSelectable(next)) {
76
+ $pos = $pos.doc.resolve(pos + next.nodeSize * dir);
77
+ mustMove = false;
78
+ continue search;
79
+ }
80
+ break;
81
+ }
82
+ next = inside;
83
+ pos += dir;
84
+ let $cur = $pos.doc.resolve(pos);
85
+ if (GapCursor.valid($cur))
86
+ return $cur;
87
+ }
88
+ return null;
89
+ }
90
+ }
91
+ }
92
+ Selection.jsonID('gapcursor', GapCursor);
93
+ class GapBookmark {
94
+ pos;
95
+ constructor(pos) {
96
+ this.pos = pos;
97
+ }
98
+ map(mapping) {
99
+ return new GapBookmark(mapping.map(this.pos));
100
+ }
101
+ resolve(doc) {
102
+ let $pos = doc.resolve(this.pos);
103
+ return GapCursor.valid($pos) ? new GapCursor($pos) : Selection.near($pos);
104
+ }
105
+ }
106
+ function closedBefore($pos) {
107
+ for (let d = $pos.depth; d >= 0; d--) {
108
+ let index = $pos.index(d), parent = $pos.node(d);
109
+ // At the start of this parent, look at next one
110
+ if (index == 0) {
111
+ if (parent.type.spec.isolating)
112
+ return true;
113
+ continue;
114
+ }
115
+ // See if the node before (or its first ancestor) is closed
116
+ for (let before = parent.child(index - 1);; before = before.lastChild) {
117
+ if ((before.childCount == 0 && !before.inlineContent) || before.isAtom ||
118
+ before.type.spec.isolating)
119
+ return true;
120
+ if (before.inlineContent)
121
+ return false;
122
+ }
123
+ }
124
+ // Hit start of document
125
+ return true;
126
+ }
127
+ function closedAfter($pos) {
128
+ for (let d = $pos.depth; d >= 0; d--) {
129
+ let index = $pos.indexAfter(d), parent = $pos.node(d);
130
+ if (index == parent.childCount) {
131
+ if (parent.type.spec.isolating)
132
+ return true;
133
+ continue;
134
+ }
135
+ for (let after = parent.child(index);; after = after.firstChild) {
136
+ if ((after.childCount == 0 && !after.inlineContent) || after.isAtom ||
137
+ after.type.spec.isolating)
138
+ return true;
139
+ if (after.inlineContent)
140
+ return false;
141
+ }
142
+ }
143
+ return true;
144
+ }
145
+ /// Create a gap cursor plugin. When enabled, this will capture clicks
146
+ /// near and arrow-key-motion past places that don't have a normally
147
+ /// selectable position nearby, and create a gap cursor selection for
148
+ /// them. The cursor is drawn as an element with class
149
+ /// `kb-gapcursor`. You can either include
150
+ /// `style/gapcursor.css` from the package's directory or add your own
151
+ /// styles to make it visible.
152
+ function gapCursor() {
153
+ return new Plugin({
154
+ props: {
155
+ decorations: drawGapCursor,
156
+ createSelectionBetween(_view, $anchor, $head) {
157
+ return $anchor.pos == $head.pos && GapCursor.valid($head)
158
+ ? new GapCursor($head)
159
+ : null;
160
+ },
161
+ handleClick,
162
+ handleKeyDown,
163
+ handleDOMEvents: { beforeinput: beforeinput },
164
+ },
165
+ });
166
+ }
167
+ const handleKeyDown = keydownHandler({
168
+ 'ArrowLeft': arrow('horiz', -1),
169
+ 'ArrowRight': arrow('horiz', 1),
170
+ 'ArrowUp': arrow('vert', -1),
171
+ 'ArrowDown': arrow('vert', 1),
172
+ });
173
+ function arrow(axis, dir) {
174
+ const dirStr = axis == 'vert'
175
+ ? (dir > 0 ? 'down' : 'up')
176
+ : (dir > 0 ? 'right' : 'left');
177
+ return function (state, dispatch, view) {
178
+ let sel = state.selection;
179
+ let $start = dir > 0 ? sel.$to : sel.$from, mustMove = sel.empty;
180
+ if (sel instanceof TextSelection) {
181
+ if (!view.endOfTextblock(dirStr) || $start.depth == 0)
182
+ return false;
183
+ mustMove = false;
184
+ $start = state.doc.resolve(dir > 0 ? $start.after() : $start.before());
185
+ }
186
+ let $found = GapCursor.findGapCursorFrom($start, dir, mustMove);
187
+ if (!$found)
188
+ return false;
189
+ if (dispatch)
190
+ dispatch(state.tr.setSelection(new GapCursor($found)));
191
+ return true;
192
+ };
193
+ }
194
+ function handleClick(view, pos, event) {
195
+ if (!view || !view.editable)
196
+ return false;
197
+ let $pos = view.state.doc.resolve(pos);
198
+ if (!GapCursor.valid($pos))
199
+ return false;
200
+ let clickPos = view.posAtCoords({ left: event.clientX, top: event.clientY });
201
+ if (clickPos && clickPos.inside > -1 &&
202
+ NodeSelection.isSelectable(view.state.doc.nodeAt(clickPos.inside)))
203
+ return false;
204
+ view.dispatch(view.state.tr.setSelection(new GapCursor($pos)));
205
+ return true;
206
+ }
207
+ // This is a hack that, when a composition starts while a gap cursor
208
+ // is active, quickly creates an inline context for the composition to
209
+ // happen in, to avoid it being aborted by the DOM selection being
210
+ // moved into a valid position.
211
+ function beforeinput(view, event) {
212
+ if (event.inputType != 'insertCompositionText' ||
213
+ !(view.state.selection instanceof GapCursor))
214
+ return false;
215
+ let { $from } = view.state.selection;
216
+ let insert = $from.parent.contentMatchAt($from.index()).findWrapping(view.state.schema.nodes.text);
217
+ if (!insert)
218
+ return false;
219
+ let frag = Fragment.empty;
220
+ for (let i = insert.length - 1; i >= 0; i--) {
221
+ frag = Fragment.from(insert[i].createAndFill(null, frag));
222
+ }
223
+ let tr = view.state.tr.replace($from.pos, $from.pos, new Slice(frag, 0, 0));
224
+ tr.setSelection(TextSelection.near(tr.doc.resolve($from.pos + 1)));
225
+ view.dispatch(tr);
226
+ return false;
227
+ }
228
+ function drawGapCursor(state) {
229
+ if (!(state.selection instanceof GapCursor))
230
+ return null;
231
+ let node = document.createElement('div');
232
+ node.className = 'kb-gapcursor';
233
+ return DecorationSet.create(state.doc, [
234
+ Decoration.widget(state.selection.head, node, { key: 'gapcursor' }),
235
+ ]);
236
+ }
237
+ export class ExtensionGapcursor extends Extension {
238
+ name = 'gapcursor';
239
+ options = {
240
+ color: 'currentColor',
241
+ width: 1,
242
+ class: undefined,
243
+ };
244
+ getProseMirrorPlugins() {
245
+ return [
246
+ gapCursor(),
247
+ ];
248
+ }
249
+ }
250
+ //# sourceMappingURL=ExtensionGapcursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionGapcursor.js","sourceRoot":"","sources":["../src/ExtensionGapcursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { Plugin } from 'prosemirror-state';
2
+ import { type CoreEditor, Extension } from '@kerebron/editor';
3
+ import { type CommandFactories, type CommandShortcuts } from '@kerebron/editor/commands';
4
+ export declare class ExtensionHistory extends Extension {
5
+ name: string;
6
+ options: {
7
+ depth: number;
8
+ newGroupDelay: number;
9
+ };
10
+ getCommandFactories(editor: CoreEditor): Partial<CommandFactories>;
11
+ getKeyboardShortcuts(): Partial<CommandShortcuts>;
12
+ getProseMirrorPlugins(): Plugin[];
13
+ }
14
+ //# sourceMappingURL=ExtensionHistory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionHistory.d.ts","sourceRoot":"","sources":["../src/ExtensionHistory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACtB,MAAM,2BAA2B,CAAC;AAEnC,qBAAa,gBAAiB,SAAQ,SAAS;IAC7C,IAAI,SAAa;IAEjB,OAAO;;;MAGL;IAEO,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAOlE,oBAAoB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAiBjD,qBAAqB,IAAI,MAAM,EAAE;CAK3C"}
@@ -0,0 +1,35 @@
1
+ import { history, redo, undo } from 'prosemirror-history';
2
+ import { Extension } from '@kerebron/editor';
3
+ export class ExtensionHistory extends Extension {
4
+ name = 'history';
5
+ options = {
6
+ depth: 100,
7
+ newGroupDelay: 500,
8
+ };
9
+ getCommandFactories(editor) {
10
+ return {
11
+ 'undo': () => undo,
12
+ 'redo': () => redo,
13
+ };
14
+ }
15
+ getKeyboardShortcuts() {
16
+ // https://stackoverflow.com/a/73619128
17
+ const mac = typeof navigator != 'undefined'
18
+ ? /Mac|iP(hone|[oa]d)/.test(navigator?.platform)
19
+ : false;
20
+ const shortcuts = {
21
+ 'Mod-z': 'undo',
22
+ 'Mod-y': 'redo',
23
+ };
24
+ if (!mac) {
25
+ shortcuts['Mod-y'] = 'redo';
26
+ }
27
+ return shortcuts;
28
+ }
29
+ getProseMirrorPlugins() {
30
+ return [
31
+ history(this.options),
32
+ ];
33
+ }
34
+ }
35
+ //# sourceMappingURL=ExtensionHistory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionHistory.js","sourceRoot":"","sources":["../src/ExtensionHistory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,EAAmB,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAO9D,MAAM,OAAO,gBAAiB,SAAQ,SAAS;IAC7C,IAAI,GAAG,SAAS,CAAC;IAEjB,OAAO,GAAG;QACR,KAAK,EAAE,GAAG;QACV,aAAa,EAAE,GAAG;KACnB,CAAC;IAEO,mBAAmB,CAAC,MAAkB;QAC7C,OAAO;YACL,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI;YAClB,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI;SACnB,CAAC;IACJ,CAAC;IAEQ,oBAAoB;QAC3B,uCAAuC;QACvC,MAAM,GAAG,GAAG,OAAO,SAAS,IAAI,WAAW;YACzC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC;YAChD,CAAC,CAAC,KAAK,CAAC;QAEV,MAAM,SAAS,GAAG;YAChB,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,MAAM;SAChB,CAAC;QACF,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,SAAS,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;QAC9B,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAEQ,qBAAqB;QAC5B,OAAO;YACL,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;SACtB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import { Fragment, Node, type ParseOptions, Schema } from 'prosemirror-model';
2
+ import { type Converter, type CoreEditor, Extension } from '@kerebron/editor';
3
+ export type CreateNodeFromContentOptions = {
4
+ parseOptions?: ParseOptions;
5
+ errorOnInvalidContent?: boolean;
6
+ };
7
+ export declare function getHTMLFromFragment(fragment: Fragment, schema: Schema): string;
8
+ export declare function elementFromString(value: string): HTMLElement;
9
+ export declare function createNodeFromHTML(content: string, schema: Schema, options?: CreateNodeFromContentOptions): Node;
10
+ export declare function createFragmentFromHTML(content: string, schema: Schema, options?: CreateNodeFromContentOptions): Fragment;
11
+ export declare class ExtensionHtml extends Extension {
12
+ name: string;
13
+ getConverters(editor: CoreEditor, schema: Schema): Record<string, Converter>;
14
+ }
15
+ //# sourceMappingURL=ExtensionHtml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionHtml.d.ts","sourceRoot":"","sources":["../src/ExtensionHtml.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,QAAQ,EACR,IAAI,EACJ,KAAK,YAAY,EACjB,MAAM,EACP,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE9E,MAAM,MAAM,4BAA4B,GAAG;IACzC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,GACb,MAAM,CAaR;AAqBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAQ5D;AA+BD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,4BAA4B,GACrC,IAAI,CAgBN;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,4BAA4B,GACrC,QAAQ,CAiBV;AAED,qBAAa,aAAc,SAAQ,SAAS;IAC1C,IAAI,SAAU;IAEL,aAAa,CACpB,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;CAc7B"}
@@ -0,0 +1,100 @@
1
+ import { DOMParser, DOMSerializer, Schema, } from 'prosemirror-model';
2
+ import { Extension } from '@kerebron/editor';
3
+ export function getHTMLFromFragment(fragment, schema) {
4
+ const document = globalThis.document;
5
+ const documentFragment = DOMSerializer.fromSchema(schema).serializeFragment(fragment, { document });
6
+ const temporaryDocument = document.implementation.createHTMLDocument();
7
+ const container = temporaryDocument.createElement('div');
8
+ container.appendChild(documentFragment);
9
+ return container.innerHTML;
10
+ }
11
+ const removeWhitespaces = (node) => {
12
+ const children = node.childNodes;
13
+ for (let i = children.length - 1; i >= 0; i -= 1) {
14
+ const child = children[i];
15
+ if (child.nodeType === 3 && child.nodeValue &&
16
+ /^(\n\s\s|\n)$/.test(child.nodeValue)) {
17
+ node.removeChild(child);
18
+ }
19
+ else if (child.nodeType === 1) {
20
+ removeWhitespaces(child);
21
+ }
22
+ }
23
+ return node;
24
+ };
25
+ export function elementFromString(value) {
26
+ // add a wrapper to preserve leading and trailing whitespace
27
+ const wrappedValue = `<html lang="en"><body>${value}</body></html>`;
28
+ const body = new globalThis.DOMParser().parseFromString(wrappedValue, 'text/html').body;
29
+ return removeWhitespaces(body);
30
+ }
31
+ function prepareContentCheckSchema(schema) {
32
+ const contentCheckSchema = new Schema({
33
+ topNode: schema.spec.topNode,
34
+ marks: schema.spec.marks,
35
+ // Prosemirror's schemas are executed such that: the last to execute, matches last
36
+ // This means that we can add a catch-all node at the end of the schema to catch any content that we don't know how to handle
37
+ nodes: schema.spec.nodes.append({
38
+ __unknown__catch__all__node: {
39
+ content: 'inline*',
40
+ group: 'block',
41
+ parseDOM: [
42
+ {
43
+ tag: '*',
44
+ getAttrs: (e) => {
45
+ // Try to stringify the element for a more helpful error message
46
+ const invalidContent = typeof e === 'string' ? e : e.outerHTML;
47
+ throw new Error('Invalid HTML content', {
48
+ cause: new Error(`Invalid element found: ${invalidContent}`),
49
+ });
50
+ },
51
+ },
52
+ ],
53
+ },
54
+ }),
55
+ });
56
+ return contentCheckSchema;
57
+ }
58
+ export function createNodeFromHTML(content, schema, options) {
59
+ options = {
60
+ parseOptions: {},
61
+ ...options,
62
+ };
63
+ if (options.errorOnInvalidContent) {
64
+ const contentCheckSchema = prepareContentCheckSchema(schema);
65
+ DOMParser.fromSchema(contentCheckSchema).parse(elementFromString(content), options.parseOptions);
66
+ }
67
+ const parser = DOMParser.fromSchema(schema);
68
+ return parser.parse(elementFromString(content), options.parseOptions);
69
+ }
70
+ export function createFragmentFromHTML(content, schema, options) {
71
+ options = {
72
+ parseOptions: {},
73
+ ...options,
74
+ };
75
+ if (options.errorOnInvalidContent) {
76
+ const contentCheckSchema = prepareContentCheckSchema(schema);
77
+ DOMParser.fromSchema(contentCheckSchema).parseSlice(elementFromString(content), options.parseOptions);
78
+ }
79
+ const parser = DOMParser.fromSchema(schema);
80
+ return parser.parseSlice(elementFromString(content), options.parseOptions)
81
+ .content;
82
+ }
83
+ export class ExtensionHtml extends Extension {
84
+ name = 'html';
85
+ getConverters(editor, schema) {
86
+ return {
87
+ 'text/html': {
88
+ fromDoc: async (document) => {
89
+ const html = getHTMLFromFragment(document.content, editor.schema);
90
+ return new TextEncoder().encode(html);
91
+ },
92
+ toDoc: async (buffer) => {
93
+ const html = new TextDecoder().decode(buffer);
94
+ return createNodeFromHTML(html, editor.schema);
95
+ },
96
+ },
97
+ };
98
+ }
99
+ }
100
+ //# sourceMappingURL=ExtensionHtml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionHtml.js","sourceRoot":"","sources":["../src/ExtensionHtml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { Plugin } from 'prosemirror-state';
2
+ import { Extension } from '@kerebron/editor';
3
+ export interface MediaUploadOptions {
4
+ /** Maximum file size in bytes (default: 10MB for images) */
5
+ maxFileSize?: number;
6
+ /** Maximum file size for videos (default: 50MB) */
7
+ maxVideoFileSize?: number;
8
+ /** Allowed image MIME types */
9
+ allowedImageTypes?: string[];
10
+ /** Allowed video MIME types */
11
+ allowedVideoTypes?: string[];
12
+ /** Use object URLs for videos instead of base64 (default: true) */
13
+ useObjectURLForVideos?: boolean;
14
+ /** Custom upload handler. Returns the URL of uploaded media. */
15
+ uploadHandler?: (file: File) => Promise<string>;
16
+ }
17
+ /** Extension that adds media upload support via drag & drop and paste */
18
+ export declare class ExtensionMediaUpload extends Extension {
19
+ protected config: Partial<MediaUploadOptions>;
20
+ name: string;
21
+ constructor(config?: Partial<MediaUploadOptions>);
22
+ getProseMirrorPlugins(): Plugin[];
23
+ }
24
+ //# sourceMappingURL=ExtensionMediaUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionMediaUpload.d.ts","sourceRoot":"","sources":["../src/ExtensionMediaUpload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAa,MAAM,mBAAmB,CAAC;AAGtD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,+BAA+B;IAC/B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B,+BAA+B;IAC/B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE7B,mEAAmE;IACnE,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC,gEAAgE;IAChE,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACjD;AA+ND,yEAAyE;AACzE,qBAAa,oBAAqB,SAAQ,SAAS;cAGlB,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC;IAFlE,IAAI,SAAiB;gBAEU,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAI9D,qBAAqB,IAAI,MAAM,EAAE;CAG3C"}
@@ -0,0 +1,168 @@
1
+ import { Plugin, PluginKey } from 'prosemirror-state';
2
+ import { Extension } from '@kerebron/editor';
3
+ const mediaUploadKey = new PluginKey('mediaUpload');
4
+ /** Convert a File to a base64 data URL */
5
+ function fileToDataURL(file) {
6
+ return new Promise((resolve, reject) => {
7
+ const reader = new FileReader();
8
+ reader.onload = () => resolve(reader.result);
9
+ reader.onerror = reject;
10
+ reader.readAsDataURL(file);
11
+ });
12
+ }
13
+ /** Convert a File to an object URL (better for videos) */
14
+ function fileToObjectURL(file) {
15
+ return URL.createObjectURL(file);
16
+ }
17
+ /** Check if a file is an image */
18
+ function isImage(file, allowedTypes) {
19
+ return allowedTypes.some((type) => file.type.match(type));
20
+ }
21
+ /** Check if a file is a video */
22
+ function isVideo(file, allowedTypes) {
23
+ return allowedTypes.some((type) => file.type.match(type));
24
+ }
25
+ /** Insert an image into the editor at the given position */
26
+ function insertImage(view, pos, src, alt, title) {
27
+ const { schema } = view.state;
28
+ const imageType = schema.nodes.image;
29
+ if (!imageType) {
30
+ console.warn('Image node type not found in schema');
31
+ return;
32
+ }
33
+ const node = imageType.create({ src, alt, title });
34
+ const transaction = view.state.tr.insert(pos, node);
35
+ view.dispatch(transaction);
36
+ }
37
+ /** Insert a video into the editor at the given position */
38
+ function insertVideo(view, pos, src, title, width, height) {
39
+ const { schema } = view.state;
40
+ const videoType = schema.nodes.video;
41
+ if (!videoType) {
42
+ console.warn('Video node type not found in schema');
43
+ return;
44
+ }
45
+ const node = videoType.create({ src, title, width, height, controls: true });
46
+ const transaction = view.state.tr.insert(pos, node);
47
+ view.dispatch(transaction);
48
+ }
49
+ /** Handle media files (images and videos) from drop or paste events */
50
+ async function handleMediaFiles(view, files, pos, options) {
51
+ const { maxFileSize = 10 * 1024 * 1024, // 10MB for images
52
+ maxVideoFileSize = 50 * 1024 * 1024, // 50MB for videos
53
+ allowedImageTypes = ['^image/'], allowedVideoTypes = ['^video/'], uploadHandler, } = options;
54
+ for (const file of files) {
55
+ const isImageFile = isImage(file, allowedImageTypes);
56
+ const isVideoFile = isVideo(file, allowedVideoTypes);
57
+ // Skip if not an image or video
58
+ if (!isImageFile && !isVideoFile) {
59
+ continue;
60
+ }
61
+ // Check file size
62
+ const sizeLimit = isVideoFile ? maxVideoFileSize : maxFileSize;
63
+ if (file.size > sizeLimit) {
64
+ console.warn(`${isVideoFile ? 'Video' : 'Image'} file "${file.name}" is too large (${(file.size / 1024 / 1024).toFixed(2)}MB). Maximum size is ${(sizeLimit / 1024 / 1024).toFixed(2)}MB.`);
65
+ continue;
66
+ }
67
+ try {
68
+ // Upload or convert to data URL
69
+ console.log(`Processing ${isVideoFile ? 'video' : 'image'}: ${file.name} (${(file.size / 1024 / 1024).toFixed(2)}MB, ${file.type})`);
70
+ let src;
71
+ if (uploadHandler) {
72
+ src = await uploadHandler(file);
73
+ }
74
+ else if (isVideoFile && options.useObjectURLForVideos !== false) {
75
+ // Use object URL for videos (better performance, doesn't bloat the document)
76
+ src = fileToObjectURL(file);
77
+ console.log('Using object URL for video:', src);
78
+ }
79
+ else {
80
+ // Use base64 data URL
81
+ src = await fileToDataURL(file);
82
+ console.log(`${isVideoFile ? 'Video' : 'Image'} converted to data URL, length: ${src.length} characters`);
83
+ }
84
+ // Insert the media
85
+ if (isVideoFile) {
86
+ insertVideo(view, pos, src, file.name);
87
+ console.log('Video inserted into editor');
88
+ }
89
+ else {
90
+ insertImage(view, pos, src, file.name);
91
+ console.log('Image inserted into editor');
92
+ }
93
+ // Increment position for next media
94
+ pos += 1;
95
+ }
96
+ catch (error) {
97
+ console.error(`Failed to process ${isVideoFile ? 'video' : 'image'} "${file.name}":`, error);
98
+ }
99
+ }
100
+ }
101
+ /** Create the media upload plugin */
102
+ function createMediaUploadPlugin(options = {}) {
103
+ return new Plugin({
104
+ key: mediaUploadKey,
105
+ props: {
106
+ /** Handle file drops */
107
+ handleDrop(view, event, slice, moved) {
108
+ // If content was moved from within the editor, let the default handler deal with it
109
+ if (moved)
110
+ return false;
111
+ const files = Array.from(event.dataTransfer?.files || []);
112
+ if (files.length === 0)
113
+ return false;
114
+ // Check if any files are images or videos
115
+ const { allowedImageTypes = ['^image/'], allowedVideoTypes = ['^video/'], } = options;
116
+ const hasMedia = files.some((file) => isImage(file, allowedImageTypes) || isVideo(file, allowedVideoTypes));
117
+ if (!hasMedia)
118
+ return false;
119
+ // Prevent default drop behavior
120
+ event.preventDefault();
121
+ // Get drop position
122
+ const coords = { left: event.clientX, top: event.clientY };
123
+ const pos = view.posAtCoords(coords);
124
+ if (!pos)
125
+ return false;
126
+ // Handle the media files
127
+ handleMediaFiles(view, files, pos.pos, options);
128
+ return true;
129
+ },
130
+ /** Handle paste events with images (videos typically don't paste) */
131
+ handlePaste(view, event, slice) {
132
+ const items = Array.from(event.clipboardData?.items || []);
133
+ const imageItems = items.filter((item) => item.type.startsWith('image/'));
134
+ if (imageItems.length === 0)
135
+ return false;
136
+ // Prevent default paste behavior
137
+ event.preventDefault();
138
+ // Convert clipboard items to files
139
+ const files = [];
140
+ for (const item of imageItems) {
141
+ const file = item.getAsFile();
142
+ if (file)
143
+ files.push(file);
144
+ }
145
+ if (files.length === 0)
146
+ return false;
147
+ // Get current cursor position
148
+ const { from } = view.state.selection;
149
+ // Handle the image files
150
+ handleMediaFiles(view, files, from, options);
151
+ return true;
152
+ },
153
+ },
154
+ });
155
+ }
156
+ /** Extension that adds media upload support via drag & drop and paste */
157
+ export class ExtensionMediaUpload extends Extension {
158
+ config;
159
+ name = 'mediaUpload';
160
+ constructor(config = {}) {
161
+ super(config);
162
+ this.config = config;
163
+ }
164
+ getProseMirrorPlugins() {
165
+ return [createMediaUploadPlugin(this.config)];
166
+ }
167
+ }
168
+ //# sourceMappingURL=ExtensionMediaUpload.js.map