@tiptap/core 2.0.0-beta.17 → 2.0.0-beta.170

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 (318) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +2 -2
  3. package/dist/packages/core/src/CommandManager.d.ts +13 -6
  4. package/dist/packages/core/src/Editor.d.ts +23 -18
  5. package/dist/packages/core/src/EventEmitter.d.ts +8 -4
  6. package/dist/packages/core/src/Extension.d.ts +102 -26
  7. package/dist/packages/core/src/ExtensionManager.d.ts +7 -12
  8. package/dist/packages/core/src/InputRule.d.ts +42 -0
  9. package/dist/packages/core/src/Mark.d.ts +134 -30
  10. package/dist/packages/core/src/Node.d.ts +160 -32
  11. package/dist/packages/core/src/NodeView.d.ts +5 -9
  12. package/dist/packages/core/src/PasteRule.d.ts +42 -0
  13. package/dist/packages/core/src/Tracker.d.ts +11 -0
  14. package/dist/packages/core/src/commands/blur.d.ts +3 -3
  15. package/dist/packages/core/src/commands/clearContent.d.ts +3 -3
  16. package/dist/packages/core/src/commands/clearNodes.d.ts +3 -3
  17. package/dist/packages/core/src/commands/command.d.ts +2 -2
  18. package/dist/packages/core/src/commands/createParagraphNear.d.ts +3 -3
  19. package/dist/packages/core/src/commands/deleteNode.d.ts +13 -0
  20. package/dist/packages/core/src/commands/deleteRange.d.ts +3 -3
  21. package/dist/packages/core/src/commands/deleteSelection.d.ts +3 -3
  22. package/dist/packages/core/src/commands/enter.d.ts +3 -3
  23. package/dist/packages/core/src/commands/exitCode.d.ts +3 -3
  24. package/dist/packages/core/src/commands/extendMarkRange.d.ts +3 -3
  25. package/dist/packages/core/src/commands/first.d.ts +3 -3
  26. package/dist/packages/core/src/commands/focus.d.ts +5 -3
  27. package/dist/packages/core/src/commands/forEach.d.ts +14 -0
  28. package/dist/packages/core/src/commands/insertContent.d.ts +7 -3
  29. package/dist/packages/core/src/commands/insertContentAt.d.ts +16 -0
  30. package/dist/packages/core/src/commands/joinBackward.d.ts +3 -3
  31. package/dist/packages/core/src/commands/joinForward.d.ts +3 -3
  32. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +3 -3
  33. package/dist/packages/core/src/commands/lift.d.ts +3 -3
  34. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +3 -3
  35. package/dist/packages/core/src/commands/liftListItem.d.ts +3 -3
  36. package/dist/packages/core/src/commands/newlineInCode.d.ts +3 -3
  37. package/dist/packages/core/src/commands/resetAttributes.d.ts +13 -0
  38. package/dist/packages/core/src/commands/scrollIntoView.d.ts +3 -3
  39. package/dist/packages/core/src/commands/selectAll.d.ts +3 -3
  40. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +3 -3
  41. package/dist/packages/core/src/commands/selectNodeForward.d.ts +3 -3
  42. package/dist/packages/core/src/commands/selectParentNode.d.ts +3 -3
  43. package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +12 -0
  44. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +12 -0
  45. package/dist/packages/core/src/commands/setContent.d.ts +4 -3
  46. package/dist/packages/core/src/commands/setMark.d.ts +3 -3
  47. package/dist/packages/core/src/commands/setMeta.d.ts +12 -0
  48. package/dist/packages/core/src/commands/setNode.d.ts +3 -3
  49. package/dist/packages/core/src/commands/setNodeSelection.d.ts +12 -0
  50. package/dist/packages/core/src/commands/setTextSelection.d.ts +12 -0
  51. package/dist/packages/core/src/commands/sinkListItem.d.ts +3 -3
  52. package/dist/packages/core/src/commands/splitBlock.d.ts +3 -3
  53. package/dist/packages/core/src/commands/splitListItem.d.ts +3 -3
  54. package/dist/packages/core/src/commands/toggleList.d.ts +3 -3
  55. package/dist/packages/core/src/commands/toggleMark.d.ts +8 -3
  56. package/dist/packages/core/src/commands/toggleNode.d.ts +3 -3
  57. package/dist/packages/core/src/commands/toggleWrap.d.ts +3 -3
  58. package/dist/packages/core/src/commands/undoInputRule.d.ts +3 -3
  59. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +3 -3
  60. package/dist/packages/core/src/commands/unsetMark.d.ts +8 -3
  61. package/dist/packages/core/src/commands/updateAttributes.d.ts +13 -0
  62. package/dist/packages/core/src/commands/wrapIn.d.ts +3 -3
  63. package/dist/packages/core/src/commands/wrapInList.d.ts +3 -3
  64. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
  65. package/dist/packages/core/src/extensions/commands.d.ts +21 -15
  66. package/dist/packages/core/src/extensions/editable.d.ts +1 -1
  67. package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
  68. package/dist/packages/core/src/extensions/index.d.ts +1 -0
  69. package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
  70. package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
  71. package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +7 -0
  72. package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
  73. package/dist/packages/core/src/helpers/createDocument.d.ts +3 -4
  74. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +4 -5
  75. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
  76. package/dist/packages/core/src/helpers/findChildren.d.ts +3 -0
  77. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +6 -0
  78. package/dist/packages/core/src/helpers/findParentNode.d.ts +1 -1
  79. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +1 -1
  80. package/dist/packages/core/src/helpers/generateHTML.d.ts +2 -2
  81. package/dist/packages/core/src/helpers/generateJSON.d.ts +2 -0
  82. package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
  83. package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -0
  84. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +1 -1
  85. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +11 -0
  86. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +8 -0
  87. package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -0
  88. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
  89. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +1 -2
  90. package/dist/packages/core/src/helpers/getMarkRange.d.ts +1 -1
  91. package/dist/packages/core/src/helpers/getMarkType.d.ts +1 -1
  92. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +2 -2
  93. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +1 -2
  94. package/dist/packages/core/src/helpers/getNodeType.d.ts +1 -1
  95. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +2 -2
  96. package/dist/packages/core/src/helpers/getSchema.d.ts +1 -1
  97. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +3 -0
  98. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +1 -1
  99. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +1 -1
  100. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +2 -2
  101. package/dist/packages/core/src/helpers/getText.d.ts +6 -0
  102. package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
  103. package/dist/packages/core/src/helpers/getTextSeralizersFromSchema.d.ts +3 -0
  104. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +1 -1
  105. package/dist/packages/core/src/helpers/isActive.d.ts +1 -2
  106. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
  107. package/dist/packages/core/src/helpers/isList.d.ts +1 -1
  108. package/dist/packages/core/src/helpers/isMarkActive.d.ts +1 -2
  109. package/dist/packages/core/src/helpers/isNodeActive.d.ts +1 -2
  110. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +1 -1
  111. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +1 -1
  112. package/dist/packages/core/src/helpers/isTextSelection.d.ts +1 -1
  113. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -0
  114. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +4 -0
  115. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +1 -1
  116. package/dist/packages/core/src/helpers/splitExtensions.d.ts +4 -4
  117. package/dist/packages/core/src/index.d.ts +51 -20
  118. package/dist/packages/core/src/inputRules/markInputRule.d.ts +11 -2
  119. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +11 -2
  120. package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
  121. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
  122. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +23 -0
  123. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +11 -2
  124. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
  125. package/dist/packages/core/src/style.d.ts +1 -2
  126. package/dist/packages/core/src/types.d.ts +105 -52
  127. package/dist/packages/core/src/utilities/callOrReturn.d.ts +2 -1
  128. package/dist/packages/core/src/utilities/createStyleTag.d.ts +1 -1
  129. package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -2
  130. package/dist/packages/core/src/utilities/elementFromString.d.ts +1 -1
  131. package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +1 -0
  132. package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
  133. package/dist/packages/core/src/utilities/fromString.d.ts +1 -1
  134. package/dist/packages/core/src/utilities/isClass.d.ts +1 -1
  135. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
  136. package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
  137. package/dist/packages/core/src/utilities/isMacOS.d.ts +1 -0
  138. package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
  139. package/dist/packages/core/src/utilities/isObject.d.ts +1 -1
  140. package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
  141. package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
  142. package/dist/packages/core/src/utilities/isiOS.d.ts +1 -0
  143. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -2
  144. package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -2
  145. package/dist/packages/core/src/utilities/minMax.d.ts +1 -1
  146. package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -2
  147. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +8 -0
  148. package/dist/tiptap-core.cjs.js +3572 -2041
  149. package/dist/tiptap-core.cjs.js.map +1 -1
  150. package/dist/tiptap-core.esm.js +3544 -2044
  151. package/dist/tiptap-core.esm.js.map +1 -1
  152. package/dist/tiptap-core.umd.js +3430 -1898
  153. package/dist/tiptap-core.umd.js.map +1 -1
  154. package/package.json +20 -16
  155. package/src/CommandManager.ts +60 -62
  156. package/src/Editor.ts +109 -74
  157. package/src/EventEmitter.ts +14 -4
  158. package/src/Extension.ts +196 -41
  159. package/src/ExtensionManager.ts +242 -78
  160. package/src/InputRule.ts +268 -0
  161. package/src/Mark.ts +242 -47
  162. package/src/Node.ts +279 -52
  163. package/src/NodeView.ts +105 -42
  164. package/src/PasteRule.ts +246 -0
  165. package/src/Tracker.ts +42 -0
  166. package/src/commands/blur.ts +12 -6
  167. package/src/commands/clearContent.ts +3 -3
  168. package/src/commands/clearNodes.ts +29 -18
  169. package/src/commands/command.ts +2 -2
  170. package/src/commands/createParagraphNear.ts +3 -3
  171. package/src/commands/deleteNode.ts +36 -0
  172. package/src/commands/deleteRange.ts +3 -3
  173. package/src/commands/deleteSelection.ts +3 -3
  174. package/src/commands/enter.ts +3 -3
  175. package/src/commands/exitCode.ts +3 -3
  176. package/src/commands/extendMarkRange.ts +10 -10
  177. package/src/commands/first.ts +3 -3
  178. package/src/commands/focus.ts +45 -44
  179. package/src/commands/forEach.ts +24 -0
  180. package/src/commands/insertContent.ts +12 -24
  181. package/src/commands/insertContentAt.ts +107 -0
  182. package/src/commands/joinBackward.ts +3 -3
  183. package/src/commands/joinForward.ts +3 -3
  184. package/src/commands/keyboardShortcut.ts +6 -6
  185. package/src/commands/lift.ts +5 -5
  186. package/src/commands/liftEmptyBlock.ts +3 -3
  187. package/src/commands/liftListItem.ts +4 -4
  188. package/src/commands/newlineInCode.ts +3 -3
  189. package/src/commands/resetAttributes.ts +61 -0
  190. package/src/commands/scrollIntoView.ts +3 -3
  191. package/src/commands/selectAll.ts +8 -6
  192. package/src/commands/selectNodeBackward.ts +3 -3
  193. package/src/commands/selectNodeForward.ts +3 -3
  194. package/src/commands/selectParentNode.ts +3 -3
  195. package/src/commands/selectTextblockEnd.ts +19 -0
  196. package/src/commands/selectTextblockStart.ts +19 -0
  197. package/src/commands/setContent.ts +7 -11
  198. package/src/commands/setMark.ts +35 -12
  199. package/src/commands/setMeta.ts +18 -0
  200. package/src/commands/setNode.ts +27 -6
  201. package/src/commands/setNodeSelection.ts +28 -0
  202. package/src/commands/setTextSelection.ts +32 -0
  203. package/src/commands/sinkListItem.ts +4 -4
  204. package/src/commands/splitBlock.ts +14 -9
  205. package/src/commands/splitListItem.ts +41 -15
  206. package/src/commands/toggleList.ts +82 -18
  207. package/src/commands/toggleMark.ts +17 -7
  208. package/src/commands/toggleNode.ts +5 -5
  209. package/src/commands/toggleWrap.ts +8 -9
  210. package/src/commands/undoInputRule.ts +34 -5
  211. package/src/commands/unsetAllMarks.ts +7 -11
  212. package/src/commands/unsetMark.ts +34 -22
  213. package/src/commands/updateAttributes.ts +72 -0
  214. package/src/commands/wrapIn.ts +4 -10
  215. package/src/commands/wrapInList.ts +4 -4
  216. package/src/extensions/clipboardTextSerializer.ts +13 -35
  217. package/src/extensions/commands.ts +30 -21
  218. package/src/extensions/focusEvents.ts +0 -3
  219. package/src/extensions/index.ts +1 -0
  220. package/src/extensions/keymap.ts +111 -13
  221. package/src/extensions/tabindex.ts +19 -0
  222. package/src/helpers/combineTransactionSteps.ts +18 -0
  223. package/src/helpers/createChainableState.ts +37 -0
  224. package/src/helpers/createDocument.ts +5 -7
  225. package/src/helpers/createNodeFromContent.ts +15 -18
  226. package/src/helpers/defaultBlockAt.ts +13 -0
  227. package/src/helpers/findChildren.ts +17 -0
  228. package/src/helpers/findChildrenInRange.ts +31 -0
  229. package/src/helpers/findParentNode.ts +2 -2
  230. package/src/helpers/findParentNodeClosestToPos.ts +1 -1
  231. package/src/helpers/generateHTML.ts +5 -5
  232. package/src/helpers/generateJSON.ts +13 -0
  233. package/src/helpers/generateText.ts +29 -0
  234. package/src/helpers/getAttributes.ts +27 -0
  235. package/src/helpers/getAttributesFromExtensions.ts +28 -7
  236. package/src/helpers/getChangedRanges.ts +82 -0
  237. package/src/helpers/getDebugJSON.ts +53 -0
  238. package/src/helpers/getExtensionField.ts +25 -0
  239. package/src/helpers/getHTMLFromFragment.ts +6 -5
  240. package/src/helpers/getMarkAttributes.ts +12 -9
  241. package/src/helpers/getMarkRange.ts +34 -6
  242. package/src/helpers/getMarkType.ts +5 -1
  243. package/src/helpers/getMarksBetween.ts +31 -10
  244. package/src/helpers/getNodeAttributes.ts +7 -8
  245. package/src/helpers/getNodeType.ts +5 -1
  246. package/src/helpers/getRenderedAttributes.ts +4 -6
  247. package/src/helpers/getSchema.ts +6 -133
  248. package/src/helpers/getSchemaByResolvedExtensions.ts +147 -0
  249. package/src/helpers/getSchemaTypeByName.ts +2 -10
  250. package/src/helpers/getSchemaTypeNameByName.ts +1 -1
  251. package/src/helpers/getSplittedAttributes.ts +4 -4
  252. package/src/helpers/getText.ts +18 -0
  253. package/src/helpers/getTextBetween.ts +45 -0
  254. package/src/helpers/getTextSeralizersFromSchema.ts +9 -0
  255. package/src/helpers/injectExtensionAttributesToParseRule.ts +15 -17
  256. package/src/helpers/isActive.ts +4 -5
  257. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  258. package/src/helpers/isList.ts +14 -7
  259. package/src/helpers/isMarkActive.ts +43 -19
  260. package/src/helpers/isNodeActive.ts +26 -34
  261. package/src/helpers/isNodeEmpty.ts +1 -1
  262. package/src/helpers/isNodeSelection.ts +2 -2
  263. package/src/helpers/isTextSelection.ts +2 -2
  264. package/src/helpers/posToDOMRect.ts +34 -0
  265. package/src/helpers/resolveFocusPosition.ts +34 -0
  266. package/src/helpers/selectionToInsertionEnd.ts +1 -1
  267. package/src/helpers/splitExtensions.ts +1 -1
  268. package/src/index.ts +53 -20
  269. package/src/inputRules/markInputRule.ts +58 -39
  270. package/src/inputRules/nodeInputRule.ts +44 -11
  271. package/src/inputRules/textInputRule.ts +35 -0
  272. package/src/inputRules/textblockTypeInputRule.ts +37 -0
  273. package/src/inputRules/wrappingInputRule.ts +59 -0
  274. package/src/pasteRules/markPasteRule.ts +61 -53
  275. package/src/pasteRules/textPasteRule.ts +35 -0
  276. package/src/style.ts +16 -3
  277. package/src/types.ts +119 -37
  278. package/src/utilities/callOrReturn.ts +6 -3
  279. package/src/utilities/createStyleTag.ts +8 -1
  280. package/src/utilities/deleteProps.ts +2 -4
  281. package/src/utilities/elementFromString.ts +4 -5
  282. package/src/utilities/escapeForRegEx.ts +4 -0
  283. package/src/utilities/findDuplicates.ts +5 -0
  284. package/src/utilities/fromString.ts +2 -2
  285. package/src/utilities/isClass.ts +2 -2
  286. package/src/utilities/isEmptyObject.ts +2 -2
  287. package/src/utilities/isFunction.ts +3 -0
  288. package/src/utilities/isMacOS.ts +5 -0
  289. package/src/utilities/isNumber.ts +3 -0
  290. package/src/utilities/isObject.ts +6 -6
  291. package/src/utilities/isPlainObject.ts +8 -5
  292. package/src/utilities/isRegExp.ts +3 -0
  293. package/src/utilities/isString.ts +3 -0
  294. package/src/utilities/isiOS.ts +12 -0
  295. package/src/utilities/mergeAttributes.ts +2 -3
  296. package/src/utilities/mergeDeep.ts +2 -3
  297. package/src/utilities/minMax.ts +1 -1
  298. package/src/utilities/objectIncludes.ts +17 -5
  299. package/src/utilities/removeDuplicates.ts +15 -0
  300. package/CHANGELOG.md +0 -324
  301. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  302. package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
  303. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  304. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  305. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  306. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  307. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  308. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  309. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  310. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  311. package/src/commands/insertHTML.ts +0 -30
  312. package/src/commands/insertNode.ts +0 -33
  313. package/src/commands/insertText.ts +0 -22
  314. package/src/commands/replace.ts +0 -20
  315. package/src/commands/replaceRange.ts +0 -36
  316. package/src/commands/resetNodeAttributes.ts +0 -31
  317. package/src/commands/updateNodeAttributes.ts +0 -33
  318. package/src/utilities/removeElement.ts +0 -5
@@ -1,3 +1,8 @@
1
+ import { Plugin, PluginKey, Selection } from 'prosemirror-state'
2
+ import { createChainableState } from '../helpers/createChainableState'
3
+ import { isiOS } from '../utilities/isiOS'
4
+ import { isMacOS } from '../utilities/isMacOS'
5
+ import { CommandManager } from '../CommandManager'
1
6
  import { Extension } from '../Extension'
2
7
 
3
8
  export const Keymap = Extension.create({
@@ -6,6 +11,24 @@ export const Keymap = Extension.create({
6
11
  addKeyboardShortcuts() {
7
12
  const handleBackspace = () => this.editor.commands.first(({ commands }) => [
8
13
  () => commands.undoInputRule(),
14
+ // maybe convert first text block node to default node
15
+ () => commands.command(({ tr }) => {
16
+ const { selection, doc } = tr
17
+ const { empty, $anchor } = selection
18
+ const { pos, parent } = $anchor
19
+ const isAtStart = Selection.atStart(doc).from === pos
20
+
21
+ if (
22
+ !empty
23
+ || !isAtStart
24
+ || !parent.type.isTextblock
25
+ || parent.textContent.length
26
+ ) {
27
+ return false
28
+ }
29
+
30
+ return commands.clearNodes()
31
+ }),
9
32
  () => commands.deleteSelection(),
10
33
  () => commands.joinBackward(),
11
34
  () => commands.selectNodeBackward(),
@@ -17,20 +40,95 @@ export const Keymap = Extension.create({
17
40
  () => commands.selectNodeForward(),
18
41
  ])
19
42
 
20
- return {
21
- Enter: () => this.editor.commands.first(({ commands }) => [
22
- () => commands.newlineInCode(),
23
- () => commands.createParagraphNear(),
24
- () => commands.liftEmptyBlock(),
25
- () => commands.splitBlock(),
26
- ]),
43
+ const handleEnter = () => this.editor.commands.first(({ commands }) => [
44
+ () => commands.newlineInCode(),
45
+ () => commands.createParagraphNear(),
46
+ () => commands.liftEmptyBlock(),
47
+ () => commands.splitBlock(),
48
+ ])
49
+
50
+ const baseKeymap = {
51
+ Enter: handleEnter,
27
52
  'Mod-Enter': () => this.editor.commands.exitCode(),
28
- Backspace: () => handleBackspace(),
29
- 'Mod-Backspace': () => handleBackspace(),
30
- Delete: () => handleDelete(),
31
- 'Mod-Delete': () => handleDelete(),
32
- // we don’t need a custom `selectAll` for now
33
- // 'Mod-a': () => this.editor.commands.selectAll(),
53
+ Backspace: handleBackspace,
54
+ 'Mod-Backspace': handleBackspace,
55
+ 'Shift-Backspace': handleBackspace,
56
+ Delete: handleDelete,
57
+ 'Mod-Delete': handleDelete,
58
+ 'Mod-a': () => this.editor.commands.selectAll(),
59
+ }
60
+
61
+ const pcKeymap = {
62
+ ...baseKeymap,
63
+ Home: () => this.editor.commands.selectTextblockStart(),
64
+ End: () => this.editor.commands.selectTextblockEnd(),
65
+ }
66
+
67
+ const macKeymap = {
68
+ ...baseKeymap,
69
+ 'Ctrl-h': handleBackspace,
70
+ 'Alt-Backspace': handleBackspace,
71
+ 'Ctrl-d': handleDelete,
72
+ 'Ctrl-Alt-Backspace': handleDelete,
73
+ 'Alt-Delete': handleDelete,
74
+ 'Alt-d': handleDelete,
75
+ 'Ctrl-a': () => this.editor.commands.selectTextblockStart(),
76
+ 'Ctrl-e': () => this.editor.commands.selectTextblockEnd(),
77
+ }
78
+
79
+ if (isiOS() || isMacOS()) {
80
+ return macKeymap
34
81
  }
82
+
83
+ return pcKeymap
84
+ },
85
+
86
+ addProseMirrorPlugins() {
87
+ return [
88
+ // With this plugin we check if the whole document was selected and deleted.
89
+ // In this case we will additionally call `clearNodes()` to convert e.g. a heading
90
+ // to a paragraph if necessary.
91
+ // This is an alternative to ProseMirror's `AllSelection`, which doesn’t work well
92
+ // with many other commands.
93
+ new Plugin({
94
+ key: new PluginKey('clearDocument'),
95
+ appendTransaction: (transactions, oldState, newState) => {
96
+ const docChanges = transactions.some(transaction => transaction.docChanged)
97
+ && !oldState.doc.eq(newState.doc)
98
+
99
+ if (!docChanges) {
100
+ return
101
+ }
102
+
103
+ const { empty, from, to } = oldState.selection
104
+ const allFrom = Selection.atStart(oldState.doc).from
105
+ const allEnd = Selection.atEnd(oldState.doc).to
106
+ const allWasSelected = from === allFrom && to === allEnd
107
+ const isEmpty = newState.doc.textBetween(0, newState.doc.content.size, ' ', ' ').length === 0
108
+
109
+ if (empty || !allWasSelected || !isEmpty) {
110
+ return
111
+ }
112
+
113
+ const tr = newState.tr
114
+ const state = createChainableState({
115
+ state: newState,
116
+ transaction: tr,
117
+ })
118
+ const { commands } = new CommandManager({
119
+ editor: this.editor,
120
+ state,
121
+ })
122
+
123
+ commands.clearNodes()
124
+
125
+ if (!tr.steps.length) {
126
+ return
127
+ }
128
+
129
+ return tr
130
+ },
131
+ }),
132
+ ]
35
133
  },
36
134
  })
@@ -0,0 +1,19 @@
1
+ import { Plugin, PluginKey } from 'prosemirror-state'
2
+ import { Extension } from '../Extension'
3
+
4
+ export const Tabindex = Extension.create({
5
+ name: 'tabindex',
6
+
7
+ addProseMirrorPlugins() {
8
+ return [
9
+ new Plugin({
10
+ key: new PluginKey('tabindex'),
11
+ props: {
12
+ attributes: {
13
+ tabindex: '0',
14
+ },
15
+ },
16
+ }),
17
+ ]
18
+ },
19
+ })
@@ -0,0 +1,18 @@
1
+ import { Node as ProseMirrorNode } from 'prosemirror-model'
2
+ import { Transaction } from 'prosemirror-state'
3
+ import { Transform } from 'prosemirror-transform'
4
+
5
+ /**
6
+ * Returns a new `Transform` based on all steps of the passed transactions.
7
+ */
8
+ export function combineTransactionSteps(oldDoc: ProseMirrorNode, transactions: Transaction[]): Transform {
9
+ const transform = new Transform(oldDoc)
10
+
11
+ transactions.forEach(transaction => {
12
+ transaction.steps.forEach(step => {
13
+ transform.step(step)
14
+ })
15
+ })
16
+
17
+ return transform
18
+ }
@@ -0,0 +1,37 @@
1
+ import { EditorState, Transaction } from 'prosemirror-state'
2
+
3
+ export function createChainableState(config: {
4
+ transaction: Transaction,
5
+ state: EditorState,
6
+ }): EditorState {
7
+ const { state, transaction } = config
8
+ let { selection } = transaction
9
+ let { doc } = transaction
10
+ let { storedMarks } = transaction
11
+
12
+ return {
13
+ ...state,
14
+ schema: state.schema,
15
+ plugins: state.plugins,
16
+ apply: state.apply.bind(state),
17
+ applyTransaction: state.applyTransaction.bind(state),
18
+ reconfigure: state.reconfigure.bind(state),
19
+ toJSON: state.toJSON.bind(state),
20
+ get storedMarks() {
21
+ return storedMarks
22
+ },
23
+ get selection() {
24
+ return selection
25
+ },
26
+ get doc() {
27
+ return doc
28
+ },
29
+ get tr() {
30
+ selection = transaction.selection
31
+ doc = transaction.doc
32
+ storedMarks = transaction.storedMarks
33
+
34
+ return transaction
35
+ },
36
+ }
37
+ }
@@ -1,13 +1,11 @@
1
- import { Schema, Node as ProseMirrorNode } from 'prosemirror-model'
2
- import { AnyObject } from '../types'
3
- import createNodeFromContent from './createNodeFromContent'
1
+ import { Schema, Node as ProseMirrorNode, ParseOptions } from 'prosemirror-model'
2
+ import { Content } from '../types'
3
+ import { createNodeFromContent } from './createNodeFromContent'
4
4
 
5
- export type Content = string | JSON | null
6
-
7
- export default function createDocument(
5
+ export function createDocument(
8
6
  content: Content,
9
7
  schema: Schema,
10
- parseOptions: AnyObject = {},
8
+ parseOptions: ParseOptions = {},
11
9
  ): ProseMirrorNode {
12
10
  return createNodeFromContent(content, schema, { slice: false, parseOptions }) as ProseMirrorNode
13
11
  }
@@ -3,30 +3,33 @@ import {
3
3
  DOMParser,
4
4
  Node as ProseMirrorNode,
5
5
  Fragment,
6
+ ParseOptions,
6
7
  } from 'prosemirror-model'
7
- import elementFromString from '../utilities/elementFromString'
8
- import { AnyObject } from '../types'
9
-
10
- export type Content = string | JSON | null
8
+ import { elementFromString } from '../utilities/elementFromString'
9
+ import { Content } from '../types'
11
10
 
12
11
  export type CreateNodeFromContentOptions = {
13
12
  slice?: boolean,
14
- parseOptions?: AnyObject,
13
+ parseOptions?: ParseOptions,
15
14
  }
16
15
 
17
- export default function createNodeFromContent(
16
+ export function createNodeFromContent(
18
17
  content: Content,
19
18
  schema: Schema,
20
19
  options?: CreateNodeFromContentOptions,
21
- ): string | ProseMirrorNode | Fragment {
20
+ ): ProseMirrorNode | Fragment {
22
21
  options = {
23
22
  slice: true,
24
23
  parseOptions: {},
25
24
  ...options,
26
25
  }
27
26
 
28
- if (content && typeof content === 'object') {
27
+ if (typeof content === 'object' && content !== null) {
29
28
  try {
29
+ if (Array.isArray(content)) {
30
+ return Fragment.fromArray(content.map(item => schema.nodeFromJSON(item)))
31
+ }
32
+
30
33
  return schema.nodeFromJSON(content)
31
34
  } catch (error) {
32
35
  console.warn(
@@ -42,17 +45,11 @@ export default function createNodeFromContent(
42
45
  }
43
46
 
44
47
  if (typeof content === 'string') {
45
- const isHTML = content.trim().startsWith('<') && content.trim().endsWith('>')
46
-
47
- if (isHTML || !options.slice) {
48
- const parser = DOMParser.fromSchema(schema)
49
-
50
- return options.slice
51
- ? parser.parseSlice(elementFromString(content), options.parseOptions).content
52
- : parser.parse(elementFromString(content), options.parseOptions)
53
- }
48
+ const parser = DOMParser.fromSchema(schema)
54
49
 
55
- return content
50
+ return options.slice
51
+ ? parser.parseSlice(elementFromString(content), options.parseOptions).content
52
+ : parser.parse(elementFromString(content), options.parseOptions)
56
53
  }
57
54
 
58
55
  return createNodeFromContent('', schema, options)
@@ -0,0 +1,13 @@
1
+ import { ContentMatch, NodeType } from 'prosemirror-model'
2
+
3
+ export function defaultBlockAt(match: ContentMatch): NodeType | null {
4
+ for (let i = 0; i < match.edgeCount; i += 1) {
5
+ const { type } = match.edge(i)
6
+
7
+ if (type.isTextblock && !type.hasRequiredAttrs()) {
8
+ return type
9
+ }
10
+ }
11
+
12
+ return null
13
+ }
@@ -0,0 +1,17 @@
1
+ import { Node as ProseMirrorNode } from 'prosemirror-model'
2
+ import { Predicate, NodeWithPos } from '../types'
3
+
4
+ export function findChildren(node: ProseMirrorNode, predicate: Predicate): NodeWithPos[] {
5
+ const nodesWithPos: NodeWithPos[] = []
6
+
7
+ node.descendants((child, pos) => {
8
+ if (predicate(child)) {
9
+ nodesWithPos.push({
10
+ node: child,
11
+ pos,
12
+ })
13
+ }
14
+ })
15
+
16
+ return nodesWithPos
17
+ }
@@ -0,0 +1,31 @@
1
+ import { Node as ProseMirrorNode } from 'prosemirror-model'
2
+ import { Predicate, Range, NodeWithPos } from '../types'
3
+
4
+ /**
5
+ * Same as `findChildren` but searches only within a `range`.
6
+ */
7
+ export function findChildrenInRange(node: ProseMirrorNode, range: Range, predicate: Predicate): NodeWithPos[] {
8
+ const nodesWithPos: NodeWithPos[] = []
9
+
10
+ // if (range.from === range.to) {
11
+ // const nodeAt = node.nodeAt(range.from)
12
+
13
+ // if (nodeAt) {
14
+ // nodesWithPos.push({
15
+ // node: nodeAt,
16
+ // pos: range.from,
17
+ // })
18
+ // }
19
+ // }
20
+
21
+ node.nodesBetween(range.from, range.to, (child, pos) => {
22
+ if (predicate(child)) {
23
+ nodesWithPos.push({
24
+ node: child,
25
+ pos,
26
+ })
27
+ }
28
+ })
29
+
30
+ return nodesWithPos
31
+ }
@@ -1,7 +1,7 @@
1
1
  import { Selection } from 'prosemirror-state'
2
- import findParentNodeClosestToPos from './findParentNodeClosestToPos'
2
+ import { findParentNodeClosestToPos } from './findParentNodeClosestToPos'
3
3
  import { Predicate } from '../types'
4
4
 
5
- export default function findParentNode(predicate: Predicate) {
5
+ export function findParentNode(predicate: Predicate) {
6
6
  return (selection: Selection) => findParentNodeClosestToPos(selection.$from, predicate)
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import { ResolvedPos, Node as ProseMirrorNode } from 'prosemirror-model'
2
2
  import { Predicate } from '../types'
3
3
 
4
- export default function findParentNodeClosestToPos($pos: ResolvedPos, predicate: Predicate): ({
4
+ export function findParentNodeClosestToPos($pos: ResolvedPos, predicate: Predicate): ({
5
5
  pos: number,
6
6
  start: number,
7
7
  depth: number,
@@ -1,11 +1,11 @@
1
1
  import { Node } from 'prosemirror-model'
2
- import getSchema from './getSchema'
3
- import getHTMLFromFragment from './getHTMLFromFragment'
4
- import { Extensions } from '../types'
2
+ import { getSchema } from './getSchema'
3
+ import { getHTMLFromFragment } from './getHTMLFromFragment'
4
+ import { Extensions, JSONContent } from '../types'
5
5
 
6
- export default function generateHTML(doc: object, extensions: Extensions): string {
6
+ export function generateHTML(doc: JSONContent, extensions: Extensions): string {
7
7
  const schema = getSchema(extensions)
8
8
  const contentNode = Node.fromJSON(schema, doc)
9
9
 
10
- return getHTMLFromFragment(contentNode, schema)
10
+ return getHTMLFromFragment(contentNode.content, schema)
11
11
  }
@@ -0,0 +1,13 @@
1
+ import { DOMParser } from 'prosemirror-model'
2
+ import { getSchema } from './getSchema'
3
+ import { elementFromString } from '../utilities/elementFromString'
4
+ import { Extensions } from '../types'
5
+
6
+ export function generateJSON(html: string, extensions: Extensions): Record<string, any> {
7
+ const schema = getSchema(extensions)
8
+ const dom = elementFromString(html)
9
+
10
+ return DOMParser.fromSchema(schema)
11
+ .parse(dom)
12
+ .toJSON()
13
+ }
@@ -0,0 +1,29 @@
1
+ import { Node } from 'prosemirror-model'
2
+ import { getSchema } from './getSchema'
3
+ import { Extensions, JSONContent, TextSerializer } from '../types'
4
+ import { getTextSeralizersFromSchema } from './getTextSeralizersFromSchema'
5
+ import { getText } from './getText'
6
+
7
+ export function generateText(
8
+ doc: JSONContent,
9
+ extensions: Extensions,
10
+ options?: {
11
+ blockSeparator?: string,
12
+ textSerializers?: Record<string, TextSerializer>,
13
+ },
14
+ ): string {
15
+ const {
16
+ blockSeparator = '\n\n',
17
+ textSerializers = {},
18
+ } = options || {}
19
+ const schema = getSchema(extensions)
20
+ const contentNode = Node.fromJSON(schema, doc)
21
+
22
+ return getText(contentNode, {
23
+ blockSeparator,
24
+ textSerializers: {
25
+ ...textSerializers,
26
+ ...getTextSeralizersFromSchema(schema),
27
+ },
28
+ })
29
+ }
@@ -0,0 +1,27 @@
1
+ import { MarkType, NodeType } from 'prosemirror-model'
2
+ import { EditorState } from 'prosemirror-state'
3
+ import { getSchemaTypeNameByName } from './getSchemaTypeNameByName'
4
+ import { getNodeAttributes } from './getNodeAttributes'
5
+ import { getMarkAttributes } from './getMarkAttributes'
6
+
7
+ export function getAttributes(
8
+ state: EditorState,
9
+ typeOrName: string | NodeType | MarkType,
10
+ ): Record<string, any> {
11
+ const schemaType = getSchemaTypeNameByName(
12
+ typeof typeOrName === 'string'
13
+ ? typeOrName
14
+ : typeOrName.name,
15
+ state.schema,
16
+ )
17
+
18
+ if (schemaType === 'node') {
19
+ return getNodeAttributes(state, typeOrName as NodeType)
20
+ }
21
+
22
+ if (schemaType === 'mark') {
23
+ return getMarkAttributes(state, typeOrName as MarkType)
24
+ }
25
+
26
+ return {}
27
+ }
@@ -1,17 +1,20 @@
1
- import splitExtensions from './splitExtensions'
1
+ import { splitExtensions } from './splitExtensions'
2
+ import { getExtensionField } from './getExtensionField'
2
3
  import {
3
4
  Extensions,
4
5
  GlobalAttributes,
5
6
  Attributes,
6
7
  Attribute,
7
8
  ExtensionAttribute,
9
+ AnyConfig,
8
10
  } from '../types'
11
+ import { NodeConfig, MarkConfig } from '..'
9
12
 
10
13
  /**
11
14
  * Get a list of all extension attributes defined in `addAttribute` and `addGlobalAttribute`.
12
15
  * @param extensions List of extensions
13
16
  */
14
- export default function getAttributesFromExtensions(extensions: Extensions): ExtensionAttribute[] {
17
+ export function getAttributesFromExtensions(extensions: Extensions): ExtensionAttribute[] {
15
18
  const extensionAttributes: ExtensionAttribute[] = []
16
19
  const { nodeExtensions, markExtensions } = splitExtensions(extensions)
17
20
  const nodeAndMarkExtensions = [...nodeExtensions, ...markExtensions]
@@ -25,14 +28,23 @@ export default function getAttributesFromExtensions(extensions: Extensions): Ext
25
28
 
26
29
  extensions.forEach(extension => {
27
30
  const context = {
31
+ name: extension.name,
28
32
  options: extension.options,
33
+ storage: extension.storage,
29
34
  }
30
35
 
31
- if (!extension.config.addGlobalAttributes) {
36
+ const addGlobalAttributes = getExtensionField<AnyConfig['addGlobalAttributes']>(
37
+ extension,
38
+ 'addGlobalAttributes',
39
+ context,
40
+ )
41
+
42
+ if (!addGlobalAttributes) {
32
43
  return
33
44
  }
34
45
 
35
- const globalAttributes = extension.config.addGlobalAttributes.bind(context)() as GlobalAttributes
46
+ // TODO: remove `as GlobalAttributes`
47
+ const globalAttributes = addGlobalAttributes() as GlobalAttributes
36
48
 
37
49
  globalAttributes.forEach(globalAttribute => {
38
50
  globalAttribute.types.forEach(type => {
@@ -54,20 +66,29 @@ export default function getAttributesFromExtensions(extensions: Extensions): Ext
54
66
 
55
67
  nodeAndMarkExtensions.forEach(extension => {
56
68
  const context = {
69
+ name: extension.name,
57
70
  options: extension.options,
71
+ storage: extension.storage,
58
72
  }
59
73
 
60
- if (!extension.config.addAttributes) {
74
+ const addAttributes = getExtensionField<NodeConfig['addAttributes'] | MarkConfig['addAttributes']>(
75
+ extension,
76
+ 'addAttributes',
77
+ context,
78
+ )
79
+
80
+ if (!addAttributes) {
61
81
  return
62
82
  }
63
83
 
64
- const attributes = extension.config.addAttributes.bind(context)() as Attributes
84
+ // TODO: remove `as Attributes`
85
+ const attributes = addAttributes() as Attributes
65
86
 
66
87
  Object
67
88
  .entries(attributes)
68
89
  .forEach(([name, attribute]) => {
69
90
  extensionAttributes.push({
70
- type: extension.config.name,
91
+ type: extension.name,
71
92
  name,
72
93
  attribute: {
73
94
  ...defaultAttribute,
@@ -0,0 +1,82 @@
1
+ import { Transform, Step } from 'prosemirror-transform'
2
+ import { Range } from '../types'
3
+ import { removeDuplicates } from '../utilities/removeDuplicates'
4
+
5
+ export type ChangedRange = {
6
+ oldRange: Range,
7
+ newRange: Range,
8
+ }
9
+
10
+ /**
11
+ * Removes duplicated ranges and ranges that are
12
+ * fully captured by other ranges.
13
+ */
14
+ function simplifyChangedRanges(changes: ChangedRange[]): ChangedRange[] {
15
+ const uniqueChanges = removeDuplicates(changes)
16
+
17
+ return uniqueChanges.length === 1
18
+ ? uniqueChanges
19
+ : uniqueChanges.filter((change, index) => {
20
+ const rest = uniqueChanges.filter((_, i) => i !== index)
21
+
22
+ return !rest.some(otherChange => {
23
+ return change.oldRange.from >= otherChange.oldRange.from
24
+ && change.oldRange.to <= otherChange.oldRange.to
25
+ && change.newRange.from >= otherChange.newRange.from
26
+ && change.newRange.to <= otherChange.newRange.to
27
+ })
28
+ })
29
+ }
30
+
31
+ /**
32
+ * Returns a list of changed ranges
33
+ * based on the first and last state of all steps.
34
+ */
35
+ export function getChangedRanges(transform: Transform): ChangedRange[] {
36
+ const { mapping, steps } = transform
37
+ const changes: ChangedRange[] = []
38
+
39
+ mapping.maps.forEach((stepMap, index) => {
40
+ const ranges: Range[] = []
41
+
42
+ // This accounts for step changes where no range was actually altered
43
+ // e.g. when setting a mark, node attribute, etc.
44
+ // @ts-ignore
45
+ if (!stepMap.ranges.length) {
46
+ const { from, to } = steps[index] as Step & {
47
+ from?: number,
48
+ to?: number,
49
+ }
50
+
51
+ if (from === undefined || to === undefined) {
52
+ return
53
+ }
54
+
55
+ ranges.push({ from, to })
56
+ } else {
57
+ stepMap.forEach((from, to) => {
58
+ ranges.push({ from, to })
59
+ })
60
+ }
61
+
62
+ ranges.forEach(({ from, to }) => {
63
+ const newStart = mapping.slice(index).map(from, -1)
64
+ const newEnd = mapping.slice(index).map(to)
65
+ const oldStart = mapping.invert().map(newStart, -1)
66
+ const oldEnd = mapping.invert().map(newEnd)
67
+
68
+ changes.push({
69
+ oldRange: {
70
+ from: oldStart,
71
+ to: oldEnd,
72
+ },
73
+ newRange: {
74
+ from: newStart,
75
+ to: newEnd,
76
+ },
77
+ })
78
+ })
79
+ })
80
+
81
+ return simplifyChangedRanges(changes)
82
+ }