@tiptap/core 2.0.0-beta.21 → 2.0.0-beta.210

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 (289) hide show
  1. package/README.md +2 -2
  2. package/dist/index.cjs +4311 -0
  3. package/dist/index.d.ts +2330 -0
  4. package/dist/index.js +4311 -0
  5. package/package.json +39 -25
  6. package/src/CommandManager.ts +76 -86
  7. package/src/Editor.ts +120 -81
  8. package/src/EventEmitter.ts +14 -4
  9. package/src/Extension.ts +280 -108
  10. package/src/ExtensionManager.ts +254 -108
  11. package/src/InputRule.ts +260 -0
  12. package/src/Mark.ts +398 -147
  13. package/src/Node.ts +437 -171
  14. package/src/NodeView.ts +132 -63
  15. package/src/PasteRule.ts +240 -0
  16. package/src/Tracker.ts +38 -0
  17. package/src/commands/blur.ts +12 -6
  18. package/src/commands/clearContent.ts +3 -3
  19. package/src/commands/clearNodes.ts +31 -19
  20. package/src/commands/command.ts +2 -2
  21. package/src/commands/createParagraphNear.ts +5 -4
  22. package/src/commands/deleteCurrentNode.ts +41 -0
  23. package/src/commands/deleteNode.ts +37 -0
  24. package/src/commands/deleteRange.ts +3 -3
  25. package/src/commands/deleteSelection.ts +5 -4
  26. package/src/commands/enter.ts +3 -3
  27. package/src/commands/exitCode.ts +5 -4
  28. package/src/commands/extendMarkRange.ts +16 -12
  29. package/src/commands/first.ts +3 -3
  30. package/src/commands/focus.ts +47 -44
  31. package/src/commands/forEach.ts +24 -0
  32. package/src/commands/index.ts +50 -0
  33. package/src/commands/insertContent.ts +17 -24
  34. package/src/commands/insertContentAt.ts +94 -0
  35. package/src/commands/join.ts +53 -0
  36. package/src/commands/keyboardShortcut.ts +6 -6
  37. package/src/commands/lift.ts +8 -7
  38. package/src/commands/liftEmptyBlock.ts +5 -4
  39. package/src/commands/liftListItem.ts +7 -6
  40. package/src/commands/newlineInCode.ts +5 -4
  41. package/src/commands/resetAttributes.ts +18 -12
  42. package/src/commands/scrollIntoView.ts +3 -3
  43. package/src/commands/selectAll.ts +8 -6
  44. package/src/commands/selectNodeBackward.ts +5 -4
  45. package/src/commands/selectNodeForward.ts +5 -4
  46. package/src/commands/selectParentNode.ts +5 -4
  47. package/src/commands/selectTextblockEnd.ts +20 -0
  48. package/src/commands/selectTextblockStart.ts +20 -0
  49. package/src/commands/setContent.ts +9 -16
  50. package/src/commands/setMark.ts +90 -14
  51. package/src/commands/setMeta.ts +18 -0
  52. package/src/commands/setNode.ts +32 -8
  53. package/src/commands/setNodeSelection.ts +27 -0
  54. package/src/commands/setTextSelection.ts +31 -0
  55. package/src/commands/sinkListItem.ts +7 -6
  56. package/src/commands/splitBlock.ts +31 -41
  57. package/src/commands/splitListItem.ts +46 -29
  58. package/src/commands/toggleList.ts +88 -20
  59. package/src/commands/toggleMark.ts +19 -8
  60. package/src/commands/toggleNode.ts +11 -6
  61. package/src/commands/toggleWrap.ts +10 -10
  62. package/src/commands/undoInputRule.ts +34 -5
  63. package/src/commands/unsetAllMarks.ts +7 -11
  64. package/src/commands/unsetMark.ts +36 -23
  65. package/src/commands/updateAttributes.ts +27 -15
  66. package/src/commands/wrapIn.ts +7 -12
  67. package/src/commands/wrapInList.ts +7 -6
  68. package/src/extensions/clipboardTextSerializer.ts +15 -36
  69. package/src/extensions/commands.ts +3 -147
  70. package/src/extensions/editable.ts +2 -1
  71. package/src/extensions/focusEvents.ts +4 -6
  72. package/src/extensions/index.ts +1 -0
  73. package/src/extensions/keymap.ts +106 -13
  74. package/src/extensions/tabindex.ts +18 -0
  75. package/src/helpers/combineTransactionSteps.ts +21 -0
  76. package/src/helpers/createChainableState.ts +38 -0
  77. package/src/helpers/createDocument.ts +5 -6
  78. package/src/helpers/createNodeFromContent.ts +20 -28
  79. package/src/helpers/defaultBlockAt.ts +13 -0
  80. package/src/helpers/findChildren.ts +18 -0
  81. package/src/helpers/findChildrenInRange.ts +36 -0
  82. package/src/helpers/findParentNode.ts +4 -3
  83. package/src/helpers/findParentNodeClosestToPos.ts +13 -7
  84. package/src/helpers/generateHTML.ts +7 -6
  85. package/src/helpers/generateJSON.ts +12 -0
  86. package/src/helpers/generateText.ts +27 -0
  87. package/src/helpers/getAttributes.ts +26 -0
  88. package/src/helpers/getAttributesFromExtensions.ts +42 -14
  89. package/src/helpers/getChangedRanges.ts +83 -0
  90. package/src/helpers/getDebugJSON.ts +54 -0
  91. package/src/helpers/getExtensionField.ts +25 -0
  92. package/src/helpers/getHTMLFromFragment.ts +5 -6
  93. package/src/helpers/getMarkAttributes.ts +18 -11
  94. package/src/helpers/getMarkRange.ts +41 -8
  95. package/src/helpers/getMarkType.ts +8 -2
  96. package/src/helpers/getMarksBetween.ts +34 -10
  97. package/src/helpers/getNodeAttributes.ts +14 -13
  98. package/src/helpers/getNodeType.ts +8 -2
  99. package/src/helpers/getRenderedAttributes.ts +9 -7
  100. package/src/helpers/getSchema.ts +7 -133
  101. package/src/helpers/getSchemaByResolvedExtensions.ts +192 -0
  102. package/src/helpers/getSchemaTypeByName.ts +3 -11
  103. package/src/helpers/getSchemaTypeNameByName.ts +2 -2
  104. package/src/helpers/getSplittedAttributes.ts +4 -4
  105. package/src/helpers/getText.ts +19 -0
  106. package/src/helpers/getTextBetween.ts +46 -0
  107. package/src/helpers/getTextContentFromNodes.ts +26 -0
  108. package/src/helpers/getTextSerializersFromSchema.ts +11 -0
  109. package/src/helpers/index.ts +33 -0
  110. package/src/helpers/injectExtensionAttributesToParseRule.ts +22 -23
  111. package/src/helpers/isActive.ts +10 -6
  112. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  113. package/src/helpers/isList.ts +14 -7
  114. package/src/helpers/isMarkActive.ts +49 -27
  115. package/src/helpers/isNodeActive.ts +29 -39
  116. package/src/helpers/isNodeEmpty.ts +2 -2
  117. package/src/helpers/isNodeSelection.ts +3 -4
  118. package/src/helpers/isTextSelection.ts +3 -4
  119. package/src/helpers/posToDOMRect.ts +35 -0
  120. package/src/helpers/resolveFocusPosition.ts +42 -0
  121. package/src/helpers/selectionToInsertionEnd.ts +3 -3
  122. package/src/helpers/splitExtensions.ts +3 -3
  123. package/src/index.ts +15 -24
  124. package/src/inputRules/index.ts +5 -0
  125. package/src/inputRules/markInputRule.ts +59 -40
  126. package/src/inputRules/nodeInputRule.ts +45 -12
  127. package/src/inputRules/textInputRule.ts +35 -0
  128. package/src/inputRules/textblockTypeInputRule.ts +37 -0
  129. package/src/inputRules/wrappingInputRule.ts +59 -0
  130. package/src/pasteRules/index.ts +3 -0
  131. package/src/pasteRules/markPasteRule.ts +61 -53
  132. package/src/pasteRules/nodePasteRule.ts +37 -0
  133. package/src/pasteRules/textPasteRule.ts +35 -0
  134. package/src/style.ts +16 -3
  135. package/src/types.ts +170 -97
  136. package/src/utilities/callOrReturn.ts +6 -3
  137. package/src/utilities/createStyleTag.ts +12 -1
  138. package/src/utilities/deleteProps.ts +2 -4
  139. package/src/utilities/elementFromString.ts +4 -5
  140. package/src/utilities/escapeForRegEx.ts +4 -0
  141. package/src/utilities/findDuplicates.ts +5 -0
  142. package/src/utilities/fromString.ts +2 -2
  143. package/src/utilities/index.ts +20 -0
  144. package/src/utilities/isEmptyObject.ts +2 -2
  145. package/src/utilities/isFunction.ts +3 -0
  146. package/src/utilities/isMacOS.ts +5 -0
  147. package/src/utilities/isNumber.ts +3 -0
  148. package/src/utilities/isPlainObject.ts +8 -5
  149. package/src/utilities/isRegExp.ts +3 -0
  150. package/src/utilities/isString.ts +3 -0
  151. package/src/utilities/isiOS.ts +12 -0
  152. package/src/utilities/mergeAttributes.ts +2 -3
  153. package/src/utilities/mergeDeep.ts +2 -3
  154. package/src/utilities/minMax.ts +1 -1
  155. package/src/utilities/objectIncludes.ts +17 -5
  156. package/src/utilities/removeDuplicates.ts +15 -0
  157. package/CHANGELOG.md +0 -365
  158. package/LICENSE.md +0 -21
  159. package/dist/packages/core/src/CommandManager.d.ts +0 -13
  160. package/dist/packages/core/src/Editor.d.ts +0 -142
  161. package/dist/packages/core/src/EventEmitter.d.ts +0 -7
  162. package/dist/packages/core/src/Extension.d.ts +0 -148
  163. package/dist/packages/core/src/ExtensionManager.d.ts +0 -24
  164. package/dist/packages/core/src/Mark.d.ts +0 -211
  165. package/dist/packages/core/src/Node.d.ts +0 -265
  166. package/dist/packages/core/src/NodeView.d.ts +0 -31
  167. package/dist/packages/core/src/commands/blur.d.ts +0 -12
  168. package/dist/packages/core/src/commands/clearContent.d.ts +0 -12
  169. package/dist/packages/core/src/commands/clearNodes.d.ts +0 -12
  170. package/dist/packages/core/src/commands/command.d.ts +0 -12
  171. package/dist/packages/core/src/commands/createParagraphNear.d.ts +0 -12
  172. package/dist/packages/core/src/commands/deleteRange.d.ts +0 -12
  173. package/dist/packages/core/src/commands/deleteSelection.d.ts +0 -12
  174. package/dist/packages/core/src/commands/enter.d.ts +0 -12
  175. package/dist/packages/core/src/commands/exitCode.d.ts +0 -12
  176. package/dist/packages/core/src/commands/extendMarkRange.d.ts +0 -13
  177. package/dist/packages/core/src/commands/first.d.ts +0 -12
  178. package/dist/packages/core/src/commands/focus.d.ts +0 -12
  179. package/dist/packages/core/src/commands/insertContent.d.ts +0 -12
  180. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  181. package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
  182. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  183. package/dist/packages/core/src/commands/joinBackward.d.ts +0 -12
  184. package/dist/packages/core/src/commands/joinForward.d.ts +0 -12
  185. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +0 -12
  186. package/dist/packages/core/src/commands/lift.d.ts +0 -13
  187. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +0 -12
  188. package/dist/packages/core/src/commands/liftListItem.d.ts +0 -13
  189. package/dist/packages/core/src/commands/newlineInCode.d.ts +0 -12
  190. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  191. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  192. package/dist/packages/core/src/commands/resetAttributes.d.ts +0 -13
  193. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  194. package/dist/packages/core/src/commands/scrollIntoView.d.ts +0 -12
  195. package/dist/packages/core/src/commands/selectAll.d.ts +0 -12
  196. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +0 -12
  197. package/dist/packages/core/src/commands/selectNodeForward.d.ts +0 -12
  198. package/dist/packages/core/src/commands/selectParentNode.d.ts +0 -12
  199. package/dist/packages/core/src/commands/setContent.d.ts +0 -12
  200. package/dist/packages/core/src/commands/setMark.d.ts +0 -13
  201. package/dist/packages/core/src/commands/setNode.d.ts +0 -13
  202. package/dist/packages/core/src/commands/sinkListItem.d.ts +0 -13
  203. package/dist/packages/core/src/commands/splitBlock.d.ts +0 -14
  204. package/dist/packages/core/src/commands/splitListItem.d.ts +0 -13
  205. package/dist/packages/core/src/commands/toggleList.d.ts +0 -13
  206. package/dist/packages/core/src/commands/toggleMark.d.ts +0 -13
  207. package/dist/packages/core/src/commands/toggleNode.d.ts +0 -13
  208. package/dist/packages/core/src/commands/toggleWrap.d.ts +0 -13
  209. package/dist/packages/core/src/commands/undoInputRule.d.ts +0 -12
  210. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +0 -12
  211. package/dist/packages/core/src/commands/unsetMark.d.ts +0 -13
  212. package/dist/packages/core/src/commands/updateAttributes.d.ts +0 -13
  213. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  214. package/dist/packages/core/src/commands/wrapIn.d.ts +0 -13
  215. package/dist/packages/core/src/commands/wrapInList.d.ts +0 -13
  216. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +0 -2
  217. package/dist/packages/core/src/extensions/commands.d.ts +0 -100
  218. package/dist/packages/core/src/extensions/editable.d.ts +0 -2
  219. package/dist/packages/core/src/extensions/focusEvents.d.ts +0 -2
  220. package/dist/packages/core/src/extensions/index.d.ts +0 -5
  221. package/dist/packages/core/src/extensions/keymap.d.ts +0 -2
  222. package/dist/packages/core/src/helpers/createDocument.d.ts +0 -4
  223. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +0 -8
  224. package/dist/packages/core/src/helpers/findParentNode.d.ts +0 -9
  225. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +0 -8
  226. package/dist/packages/core/src/helpers/generateHTML.d.ts +0 -2
  227. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +0 -6
  228. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +0 -2
  229. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +0 -4
  230. package/dist/packages/core/src/helpers/getMarkRange.d.ts +0 -3
  231. package/dist/packages/core/src/helpers/getMarkType.d.ts +0 -2
  232. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +0 -3
  233. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +0 -4
  234. package/dist/packages/core/src/helpers/getNodeType.d.ts +0 -2
  235. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +0 -3
  236. package/dist/packages/core/src/helpers/getSchema.d.ts +0 -3
  237. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +0 -2
  238. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +0 -2
  239. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +0 -2
  240. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +0 -9
  241. package/dist/packages/core/src/helpers/isActive.d.ts +0 -3
  242. package/dist/packages/core/src/helpers/isList.d.ts +0 -2
  243. package/dist/packages/core/src/helpers/isMarkActive.d.ts +0 -4
  244. package/dist/packages/core/src/helpers/isNodeActive.d.ts +0 -4
  245. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +0 -2
  246. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +0 -2
  247. package/dist/packages/core/src/helpers/isTextSelection.d.ts +0 -2
  248. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +0 -2
  249. package/dist/packages/core/src/helpers/splitExtensions.d.ts +0 -9
  250. package/dist/packages/core/src/index.d.ts +0 -30
  251. package/dist/packages/core/src/inputRules/markInputRule.d.ts +0 -3
  252. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +0 -3
  253. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +0 -3
  254. package/dist/packages/core/src/style.d.ts +0 -2
  255. package/dist/packages/core/src/types.d.ts +0 -154
  256. package/dist/packages/core/src/utilities/callOrReturn.d.ts +0 -8
  257. package/dist/packages/core/src/utilities/createStyleTag.d.ts +0 -1
  258. package/dist/packages/core/src/utilities/deleteProps.d.ts +0 -7
  259. package/dist/packages/core/src/utilities/elementFromString.d.ts +0 -1
  260. package/dist/packages/core/src/utilities/fromString.d.ts +0 -1
  261. package/dist/packages/core/src/utilities/isClass.d.ts +0 -1
  262. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +0 -1
  263. package/dist/packages/core/src/utilities/isObject.d.ts +0 -1
  264. package/dist/packages/core/src/utilities/isPlainObject.d.ts +0 -1
  265. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +0 -2
  266. package/dist/packages/core/src/utilities/mergeDeep.d.ts +0 -2
  267. package/dist/packages/core/src/utilities/minMax.d.ts +0 -1
  268. package/dist/packages/core/src/utilities/objectIncludes.d.ts +0 -7
  269. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  270. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  271. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  272. package/dist/tiptap-core.cjs.js +0 -3027
  273. package/dist/tiptap-core.cjs.js.map +0 -1
  274. package/dist/tiptap-core.esm.js +0 -3002
  275. package/dist/tiptap-core.esm.js.map +0 -1
  276. package/dist/tiptap-core.umd.js +0 -3024
  277. package/dist/tiptap-core.umd.js.map +0 -1
  278. package/src/commands/insertHTML.ts +0 -30
  279. package/src/commands/insertNode.ts +0 -33
  280. package/src/commands/insertText.ts +0 -22
  281. package/src/commands/joinBackward.ts +0 -17
  282. package/src/commands/joinForward.ts +0 -17
  283. package/src/commands/replace.ts +0 -20
  284. package/src/commands/replaceRange.ts +0 -36
  285. package/src/commands/resetNodeAttributes.ts +0 -33
  286. package/src/commands/updateNodeAttributes.ts +0 -35
  287. package/src/utilities/isClass.ts +0 -7
  288. package/src/utilities/isObject.ts +0 -10
  289. package/src/utilities/removeElement.ts +0 -5
@@ -1,23 +1,12 @@
1
- import { canSplit } from 'prosemirror-transform'
2
- import { ContentMatch, Fragment } from 'prosemirror-model'
3
- import { EditorState, NodeSelection, TextSelection } from 'prosemirror-state'
4
- import { Command, RawCommands } from '../types'
5
- import getSplittedAttributes from '../helpers/getSplittedAttributes'
6
-
7
- function defaultBlockAt(match: ContentMatch) {
8
- for (let i = 0; i < match.edgeCount; i + 1) {
9
- const { type } = match.edge(i)
10
-
11
- if (type.isTextblock && !type.hasRequiredAttrs()) {
12
- return type
13
- }
14
- }
15
- return null
16
- }
1
+ import { EditorState, NodeSelection, TextSelection } from '@tiptap/pm/state'
2
+ import { canSplit } from '@tiptap/pm/transform'
3
+
4
+ import { defaultBlockAt } from '../helpers/defaultBlockAt'
5
+ import { getSplittedAttributes } from '../helpers/getSplittedAttributes'
6
+ import { RawCommands } from '../types'
17
7
 
18
8
  function ensureMarks(state: EditorState, splittableMarks?: string[]) {
19
- const marks = state.storedMarks
20
- || (state.selection.$to.parentOffset && state.selection.$from.marks())
9
+ const marks = state.storedMarks || (state.selection.$to.parentOffset && state.selection.$from.marks())
21
10
 
22
11
  if (marks) {
23
12
  const filteredMarks = marks.filter(mark => splittableMarks?.includes(mark.type.name))
@@ -27,21 +16,18 @@ function ensureMarks(state: EditorState, splittableMarks?: string[]) {
27
16
  }
28
17
 
29
18
  declare module '@tiptap/core' {
30
- interface Commands {
19
+ interface Commands<ReturnType> {
31
20
  splitBlock: {
32
21
  /**
33
22
  * Forks a new node from an existing node.
34
23
  */
35
- splitBlock: (options?: { keepMarks?: boolean }) => Command,
24
+ splitBlock: (options?: { keepMarks?: boolean }) => ReturnType
36
25
  }
37
26
  }
38
27
  }
39
28
 
40
29
  export const splitBlock: RawCommands['splitBlock'] = ({ keepMarks = true } = {}) => ({
41
- tr,
42
- state,
43
- dispatch,
44
- editor,
30
+ tr, state, dispatch, editor,
45
31
  }) => {
46
32
  const { selection, doc } = tr
47
33
  const { $from, $to } = selection
@@ -84,38 +70,42 @@ export const splitBlock: RawCommands['splitBlock'] = ({ keepMarks = true } = {})
84
70
  : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1)))
85
71
 
86
72
  let types = atEnd && deflt
87
- ? [{
88
- type: deflt,
89
- attrs: newAttributes,
90
- }]
73
+ ? [
74
+ {
75
+ type: deflt,
76
+ attrs: newAttributes,
77
+ },
78
+ ]
91
79
  : undefined
92
80
 
93
81
  let can = canSplit(tr.doc, tr.mapping.map($from.pos), 1, types)
94
82
 
95
83
  if (
96
84
  !types
97
- && !can
98
- && canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : undefined)
85
+ && !can
86
+ && canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt ? [{ type: deflt }] : undefined)
99
87
  ) {
100
88
  can = true
101
89
  types = deflt
102
- ? [{
103
- type: deflt,
104
- attrs: newAttributes,
105
- }]
90
+ ? [
91
+ {
92
+ type: deflt,
93
+ attrs: newAttributes,
94
+ },
95
+ ]
106
96
  : undefined
107
97
  }
108
98
 
109
99
  if (can) {
110
100
  tr.split(tr.mapping.map($from.pos), 1, types)
111
101
 
112
- if (
113
- !atEnd
114
- && !$from.parentOffset
115
- && $from.parent.type !== deflt
116
- && $from.node(-1).canReplace($from.index(-1), $from.indexAfter(-1), Fragment.from(deflt?.create()))
117
- ) {
118
- tr.setNodeMarkup(tr.mapping.map($from.before()), deflt || undefined)
102
+ if (deflt && !atEnd && !$from.parentOffset && $from.parent.type !== deflt) {
103
+ const first = tr.mapping.map($from.before())
104
+ const $first = tr.doc.resolve(first)
105
+
106
+ if ($from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt)) {
107
+ tr.setNodeMarkup(tr.mapping.map($from.before()), deflt)
108
+ }
119
109
  }
120
110
  }
121
111
 
@@ -1,22 +1,20 @@
1
1
  import {
2
- NodeType,
3
- Node as ProseMirrorNode,
4
- Fragment,
5
- Slice,
6
- } from 'prosemirror-model'
7
- import { canSplit } from 'prosemirror-transform'
8
- import { TextSelection } from 'prosemirror-state'
9
- import { Command, RawCommands } from '../types'
10
- import getNodeType from '../helpers/getNodeType'
11
- import getSplittedAttributes from '../helpers/getSplittedAttributes'
2
+ Fragment, Node as ProseMirrorNode, NodeType, Slice,
3
+ } from '@tiptap/pm/model'
4
+ import { TextSelection } from '@tiptap/pm/state'
5
+ import { canSplit } from '@tiptap/pm/transform'
6
+
7
+ import { getNodeType } from '../helpers/getNodeType'
8
+ import { getSplittedAttributes } from '../helpers/getSplittedAttributes'
9
+ import { RawCommands } from '../types'
12
10
 
13
11
  declare module '@tiptap/core' {
14
- interface Commands {
12
+ interface Commands<ReturnType> {
15
13
  splitListItem: {
16
14
  /**
17
15
  * Splits one list item into two list items.
18
16
  */
19
- splitListItem: (typeOrName: string | NodeType) => Command,
17
+ splitListItem: (typeOrName: string | NodeType) => ReturnType
20
18
  }
21
19
  }
22
20
  }
@@ -29,7 +27,7 @@ export const splitListItem: RawCommands['splitListItem'] = typeOrName => ({
29
27
 
30
28
  // @ts-ignore
31
29
  // eslint-disable-next-line
32
- const node: ProseMirrorNode = state.selection.node
30
+ const node: ProseMirrorNode = state.selection.node
33
31
 
34
32
  if ((node && node.isBlock) || $from.depth < 2 || !$from.sameParent($to)) {
35
33
  return false
@@ -49,22 +47,26 @@ export const splitListItem: RawCommands['splitListItem'] = typeOrName => ({
49
47
  // command handle lifting.
50
48
  if (
51
49
  $from.depth === 2
52
- || $from.node(-3).type !== type
53
- || $from.index(-2) !== $from.node(-2).childCount - 1
50
+ || $from.node(-3).type !== type
51
+ || $from.index(-2) !== $from.node(-2).childCount - 1
54
52
  ) {
55
53
  return false
56
54
  }
57
55
 
58
56
  if (dispatch) {
59
57
  let wrap = Fragment.empty
60
- const keepItem = $from.index(-1) > 0
58
+ // eslint-disable-next-line
59
+ const depthBefore = $from.index(-1) ? 1 : $from.index(-2) ? 2 : 3
61
60
 
62
61
  // Build a fragment containing empty versions of the structure
63
62
  // from the outer list item to the parent node of the cursor
64
- for (let d = $from.depth - (keepItem ? 1 : 2); d >= $from.depth - 3; d -= 1) {
63
+ for (let d = $from.depth - depthBefore; d >= $from.depth - 3; d -= 1) {
65
64
  wrap = Fragment.from($from.node(d).copy(wrap))
66
65
  }
67
66
 
67
+ // eslint-disable-next-line
68
+ const depthAfter = $from.indexAfter(-1) < $from.node(-2).childCount ? 1 : $from.indexAfter(-2) < $from.node(-3).childCount ? 2 : 3
69
+
68
70
  // Add a second list item with an empty default start node
69
71
  const newNextTypeAttributes = getSplittedAttributes(
70
72
  extensionAttributes,
@@ -72,24 +74,36 @@ export const splitListItem: RawCommands['splitListItem'] = typeOrName => ({
72
74
  $from.node().attrs,
73
75
  )
74
76
  const nextType = type.contentMatch.defaultType?.createAndFill(newNextTypeAttributes) || undefined
77
+
75
78
  wrap = wrap.append(Fragment.from(type.createAndFill(null, nextType) || undefined))
76
79
 
77
- tr
78
- .replace(
79
- $from.before(keepItem ? undefined : -1),
80
- $from.after(-3),
81
- new Slice(wrap, keepItem ? 3 : 2, 2),
82
- )
83
- .setSelection(TextSelection.near(tr.doc.resolve($from.pos + (keepItem ? 3 : 2))))
84
- .scrollIntoView()
80
+ const start = $from.before($from.depth - (depthBefore - 1))
81
+
82
+ tr.replace(start, $from.after(-depthAfter), new Slice(wrap, 4 - depthBefore, 0))
83
+
84
+ let sel = -1
85
+
86
+ tr.doc.nodesBetween(start, tr.doc.content.size, (n, pos) => {
87
+ if (sel > -1) {
88
+ return false
89
+ }
90
+
91
+ if (n.isTextblock && n.content.size === 0) {
92
+ sel = pos + 1
93
+ }
94
+ })
95
+
96
+ if (sel > -1) {
97
+ tr.setSelection(TextSelection.near(tr.doc.resolve(sel)))
98
+ }
99
+
100
+ tr.scrollIntoView()
85
101
  }
86
102
 
87
103
  return true
88
104
  }
89
105
 
90
- const nextType = $to.pos === $from.end()
91
- ? grandParent.contentMatchAt(0).defaultType
92
- : null
106
+ const nextType = $to.pos === $from.end() ? grandParent.contentMatchAt(0).defaultType : null
93
107
 
94
108
  const newTypeAttributes = getSplittedAttributes(
95
109
  extensionAttributes,
@@ -105,7 +119,10 @@ export const splitListItem: RawCommands['splitListItem'] = typeOrName => ({
105
119
  tr.delete($from.pos, $to.pos)
106
120
 
107
121
  const types = nextType
108
- ? [{ type, attrs: newTypeAttributes }, { type: nextType, attrs: newNextTypeAttributes }]
122
+ ? [
123
+ { type, attrs: newTypeAttributes },
124
+ { type: nextType, attrs: newNextTypeAttributes },
125
+ ]
109
126
  : [{ type, attrs: newTypeAttributes }]
110
127
 
111
128
  if (!canSplit(tr.doc, $from.pos, 2)) {
@@ -1,16 +1,72 @@
1
- import { NodeType } from 'prosemirror-model'
2
- import { Command, RawCommands } from '../types'
3
- import getNodeType from '../helpers/getNodeType'
4
- import findParentNode from '../helpers/findParentNode'
5
- import isList from '../helpers/isList'
1
+ import { NodeType } from '@tiptap/pm/model'
2
+ import { Transaction } from '@tiptap/pm/state'
3
+ import { canJoin } from '@tiptap/pm/transform'
4
+
5
+ import { findParentNode } from '../helpers/findParentNode'
6
+ import { getNodeType } from '../helpers/getNodeType'
7
+ import { isList } from '../helpers/isList'
8
+ import { RawCommands } from '../types'
9
+
10
+ const joinListBackwards = (tr: Transaction, listType: NodeType): boolean => {
11
+ const list = findParentNode(node => node.type === listType)(tr.selection)
12
+
13
+ if (!list) {
14
+ return true
15
+ }
16
+
17
+ const before = tr.doc.resolve(Math.max(0, list.pos - 1)).before(list.depth)
18
+
19
+ if (before === undefined) {
20
+ return true
21
+ }
22
+
23
+ const nodeBefore = tr.doc.nodeAt(before)
24
+ const canJoinBackwards = list.node.type === nodeBefore?.type && canJoin(tr.doc, list.pos)
25
+
26
+ if (!canJoinBackwards) {
27
+ return true
28
+ }
29
+
30
+ tr.join(list.pos)
31
+
32
+ return true
33
+ }
34
+
35
+ const joinListForwards = (tr: Transaction, listType: NodeType): boolean => {
36
+ const list = findParentNode(node => node.type === listType)(tr.selection)
37
+
38
+ if (!list) {
39
+ return true
40
+ }
41
+
42
+ const after = tr.doc.resolve(list.start).after(list.depth)
43
+
44
+ if (after === undefined) {
45
+ return true
46
+ }
47
+
48
+ const nodeAfter = tr.doc.nodeAt(after)
49
+ const canJoinForwards = list.node.type === nodeAfter?.type && canJoin(tr.doc, after)
50
+
51
+ if (!canJoinForwards) {
52
+ return true
53
+ }
54
+
55
+ tr.join(after)
56
+
57
+ return true
58
+ }
6
59
 
7
60
  declare module '@tiptap/core' {
8
- interface Commands {
61
+ interface Commands<ReturnType> {
9
62
  toggleList: {
10
63
  /**
11
64
  * Toggle between different list types.
12
65
  */
13
- toggleList: (listTypeOrName: string | NodeType, itemTypeOrName: string | NodeType) => Command,
66
+ toggleList: (
67
+ listTypeOrName: string | NodeType,
68
+ itemTypeOrName: string | NodeType,
69
+ ) => ReturnType
14
70
  }
15
71
  }
16
72
  }
@@ -18,7 +74,7 @@ declare module '@tiptap/core' {
18
74
  export const toggleList: RawCommands['toggleList'] = (listTypeOrName, itemTypeOrName) => ({
19
75
  editor, tr, state, dispatch, chain, commands, can,
20
76
  }) => {
21
- const { extensions } = editor.options
77
+ const { extensions } = editor.extensionManager
22
78
  const listType = getNodeType(listTypeOrName, state.schema)
23
79
  const itemType = getNodeType(itemTypeOrName, state.schema)
24
80
  const { selection } = state
@@ -40,24 +96,36 @@ export const toggleList: RawCommands['toggleList'] = (listTypeOrName, itemTypeOr
40
96
  // change list type
41
97
  if (
42
98
  isList(parentList.node.type.name, extensions)
43
- && listType.validContent(parentList.node.content)
44
- && dispatch
99
+ && listType.validContent(parentList.node.content)
100
+ && dispatch
45
101
  ) {
46
- tr.setNodeMarkup(parentList.pos, listType)
102
+ return chain()
103
+ .command(() => {
104
+ tr.setNodeMarkup(parentList.pos, listType)
47
105
 
48
- return true
106
+ return true
107
+ })
108
+ .command(() => joinListBackwards(tr, listType))
109
+ .command(() => joinListForwards(tr, listType))
110
+ .run()
49
111
  }
50
112
  }
51
113
 
52
- const canWrapInList = can().wrapInList(listType)
114
+ return (
115
+ chain()
116
+ // try to convert node to default node if needed
117
+ .command(() => {
118
+ const canWrapInList = can().wrapInList(listType)
53
119
 
54
- // try to convert node to paragraph if needed
55
- if (!canWrapInList) {
56
- return chain()
57
- .clearNodes()
120
+ if (canWrapInList) {
121
+ return true
122
+ }
123
+
124
+ return commands.clearNodes()
125
+ })
58
126
  .wrapInList(listType)
127
+ .command(() => joinListBackwards(tr, listType))
128
+ .command(() => joinListForwards(tr, listType))
59
129
  .run()
60
- }
61
-
62
- return commands.wrapInList(listType)
130
+ )
63
131
  }
@@ -1,25 +1,36 @@
1
- import { MarkType } from 'prosemirror-model'
2
- import { AnyObject, Command, RawCommands } from '../types'
3
- import getMarkType from '../helpers/getMarkType'
4
- import isMarkActive from '../helpers/isMarkActive'
1
+ import { MarkType } from '@tiptap/pm/model'
2
+
3
+ import { getMarkType } from '../helpers/getMarkType'
4
+ import { isMarkActive } from '../helpers/isMarkActive'
5
+ import { RawCommands } from '../types'
5
6
 
6
7
  declare module '@tiptap/core' {
7
- interface Commands {
8
+ interface Commands<ReturnType> {
8
9
  toggleMark: {
9
10
  /**
10
11
  * Toggle a mark on and off.
11
12
  */
12
- toggleMark: (typeOrName: string | MarkType, attributes?: AnyObject) => Command,
13
+ toggleMark: (
14
+ typeOrName: string | MarkType,
15
+ attributes?: Record<string, any>,
16
+ options?: {
17
+ /**
18
+ * Removes the mark even across the current selection. Defaults to `false`.
19
+ */
20
+ extendEmptyMarkRange?: boolean
21
+ },
22
+ ) => ReturnType
13
23
  }
14
24
  }
15
25
  }
16
26
 
17
- export const toggleMark: RawCommands['toggleMark'] = (typeOrName, attributes = {}) => ({ state, commands }) => {
27
+ export const toggleMark: RawCommands['toggleMark'] = (typeOrName, attributes = {}, options = {}) => ({ state, commands }) => {
28
+ const { extendEmptyMarkRange = false } = options
18
29
  const type = getMarkType(typeOrName, state.schema)
19
30
  const isActive = isMarkActive(state, type, attributes)
20
31
 
21
32
  if (isActive) {
22
- return commands.unsetMark(type)
33
+ return commands.unsetMark(type, { extendEmptyMarkRange })
23
34
  }
24
35
 
25
36
  return commands.setMark(type, attributes)
@@ -1,15 +1,20 @@
1
- import { NodeType } from 'prosemirror-model'
2
- import { AnyObject, Command, RawCommands } from '../types'
3
- import isNodeActive from '../helpers/isNodeActive'
4
- import getNodeType from '../helpers/getNodeType'
1
+ import { NodeType } from '@tiptap/pm/model'
2
+
3
+ import { getNodeType } from '../helpers/getNodeType'
4
+ import { isNodeActive } from '../helpers/isNodeActive'
5
+ import { RawCommands } from '../types'
5
6
 
6
7
  declare module '@tiptap/core' {
7
- interface Commands {
8
+ interface Commands<ReturnType> {
8
9
  toggleNode: {
9
10
  /**
10
11
  * Toggle a node with another node.
11
12
  */
12
- toggleNode: (typeOrName: string | NodeType, toggleTypeOrName: string | NodeType, attributes?: AnyObject) => Command,
13
+ toggleNode: (
14
+ typeOrName: string | NodeType,
15
+ toggleTypeOrName: string | NodeType,
16
+ attributes?: Record<string, any>,
17
+ ) => ReturnType
13
18
  }
14
19
  }
15
20
  }
@@ -1,27 +1,27 @@
1
- import { wrapIn, lift } from 'prosemirror-commands'
2
- import { NodeType } from 'prosemirror-model'
3
- import { AnyObject, Command, RawCommands } from '../types'
4
- import isNodeActive from '../helpers/isNodeActive'
5
- import getNodeType from '../helpers/getNodeType'
1
+ import { NodeType } from '@tiptap/pm/model'
2
+
3
+ import { getNodeType } from '../helpers/getNodeType'
4
+ import { isNodeActive } from '../helpers/isNodeActive'
5
+ import { RawCommands } from '../types'
6
6
 
7
7
  declare module '@tiptap/core' {
8
- interface Commands {
8
+ interface Commands<ReturnType> {
9
9
  toggleWrap: {
10
10
  /**
11
11
  * Wraps nodes in another node, or removes an existing wrap.
12
12
  */
13
- toggleWrap: (typeOrName: string | NodeType, attributes?: AnyObject) => Command,
13
+ toggleWrap: (typeOrName: string | NodeType, attributes?: Record<string, any>) => ReturnType
14
14
  }
15
15
  }
16
16
  }
17
17
 
18
- export const toggleWrap: RawCommands['toggleWrap'] = (typeOrName, attributes = {}) => ({ state, dispatch }) => {
18
+ export const toggleWrap: RawCommands['toggleWrap'] = (typeOrName, attributes = {}) => ({ state, commands }) => {
19
19
  const type = getNodeType(typeOrName, state.schema)
20
20
  const isActive = isNodeActive(state, type, attributes)
21
21
 
22
22
  if (isActive) {
23
- return lift(state, dispatch)
23
+ return commands.lift(type)
24
24
  }
25
25
 
26
- return wrapIn(type, attributes)(state, dispatch)
26
+ return commands.wrapIn(type, attributes)
27
27
  }
@@ -1,17 +1,46 @@
1
- import { undoInputRule as originalUndoInputRule } from 'prosemirror-inputrules'
2
- import { Command, RawCommands } from '../types'
1
+ import { RawCommands } from '../types'
3
2
 
4
3
  declare module '@tiptap/core' {
5
- interface Commands {
4
+ interface Commands<ReturnType> {
6
5
  undoInputRule: {
7
6
  /**
8
7
  * Undo an input rule.
9
8
  */
10
- undoInputRule: () => Command,
9
+ undoInputRule: () => ReturnType,
11
10
  }
12
11
  }
13
12
  }
14
13
 
15
14
  export const undoInputRule: RawCommands['undoInputRule'] = () => ({ state, dispatch }) => {
16
- return originalUndoInputRule(state, dispatch)
15
+ const plugins = state.plugins
16
+
17
+ for (let i = 0; i < plugins.length; i += 1) {
18
+ const plugin = plugins[i]
19
+ let undoable
20
+
21
+ // @ts-ignore
22
+ // eslint-disable-next-line
23
+ if (plugin.spec.isInputRules && (undoable = plugin.getState(state))) {
24
+ if (dispatch) {
25
+ const tr = state.tr
26
+ const toUndo = undoable.transform
27
+
28
+ for (let j = toUndo.steps.length - 1; j >= 0; j -= 1) {
29
+ tr.step(toUndo.steps[j].invert(toUndo.docs[j]))
30
+ }
31
+
32
+ if (undoable.text) {
33
+ const marks = tr.doc.resolve(undoable.from).marks()
34
+
35
+ tr.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks))
36
+ } else {
37
+ tr.delete(undoable.from, undoable.to)
38
+ }
39
+ }
40
+
41
+ return true
42
+ }
43
+ }
44
+
45
+ return false
17
46
  }
@@ -1,17 +1,17 @@
1
- import { Command, RawCommands } from '../types'
1
+ import { RawCommands } from '../types'
2
2
 
3
3
  declare module '@tiptap/core' {
4
- interface Commands {
4
+ interface Commands<ReturnType> {
5
5
  unsetAllMarks: {
6
6
  /**
7
7
  * Remove all marks in the current selection.
8
8
  */
9
- unsetAllMarks: () => Command,
9
+ unsetAllMarks: () => ReturnType,
10
10
  }
11
11
  }
12
12
  }
13
13
 
14
- export const unsetAllMarks: RawCommands['unsetAllMarks'] = () => ({ tr, state, dispatch }) => {
14
+ export const unsetAllMarks: RawCommands['unsetAllMarks'] = () => ({ tr, dispatch }) => {
15
15
  const { selection } = tr
16
16
  const { empty, ranges } = selection
17
17
 
@@ -20,13 +20,9 @@ export const unsetAllMarks: RawCommands['unsetAllMarks'] = () => ({ tr, state, d
20
20
  }
21
21
 
22
22
  if (dispatch) {
23
- Object
24
- .entries(state.schema.marks)
25
- .forEach(([, mark]) => {
26
- ranges.forEach(range => {
27
- tr.removeMark(range.$from.pos, range.$to.pos, mark as any)
28
- })
29
- })
23
+ ranges.forEach(range => {
24
+ tr.removeMark(range.$from.pos, range.$to.pos)
25
+ })
30
26
  }
31
27
 
32
28
  return true
@@ -1,43 +1,56 @@
1
- import { MarkType } from 'prosemirror-model'
2
- import { Command, RawCommands } from '../types'
3
- import getMarkType from '../helpers/getMarkType'
4
- import getMarkRange from '../helpers/getMarkRange'
1
+ import { MarkType } from '@tiptap/pm/model'
2
+
3
+ import { getMarkRange } from '../helpers/getMarkRange'
4
+ import { getMarkType } from '../helpers/getMarkType'
5
+ import { RawCommands } from '../types'
5
6
 
6
7
  declare module '@tiptap/core' {
7
- interface Commands {
8
+ interface Commands<ReturnType> {
8
9
  unsetMark: {
9
10
  /**
10
11
  * Remove all marks in the current selection.
11
12
  */
12
- unsetMark: (typeOrName: string | MarkType) => Command,
13
+ unsetMark: (
14
+ typeOrName: string | MarkType,
15
+ options?: {
16
+ /**
17
+ * Removes the mark even across the current selection. Defaults to `false`.
18
+ */
19
+ extendEmptyMarkRange?: boolean
20
+ },
21
+ ) => ReturnType
13
22
  }
14
23
  }
15
24
  }
16
25
 
17
- export const unsetMark: RawCommands['unsetMark'] = typeOrName => ({ tr, state, dispatch }) => {
26
+ export const unsetMark: RawCommands['unsetMark'] = (typeOrName, options = {}) => ({ tr, state, dispatch }) => {
27
+ const { extendEmptyMarkRange = false } = options
18
28
  const { selection } = tr
19
29
  const type = getMarkType(typeOrName, state.schema)
20
30
  const { $from, empty, ranges } = selection
21
31
 
22
- if (dispatch) {
23
- if (empty) {
24
- let { from, to } = selection
25
- const range = getMarkRange($from, type)
26
-
27
- if (range) {
28
- from = range.from
29
- to = range.to
30
- }
31
-
32
- tr.removeMark(from, to, type)
33
- } else {
34
- ranges.forEach(range => {
35
- tr.removeMark(range.$from.pos, range.$to.pos, type)
36
- })
32
+ if (!dispatch) {
33
+ return true
34
+ }
35
+
36
+ if (empty && extendEmptyMarkRange) {
37
+ let { from, to } = selection
38
+ const attrs = $from.marks().find(mark => mark.type === type)?.attrs
39
+ const range = getMarkRange($from, type, attrs)
40
+
41
+ if (range) {
42
+ from = range.from
43
+ to = range.to
37
44
  }
38
45
 
39
- tr.removeStoredMark(type)
46
+ tr.removeMark(from, to, type)
47
+ } else {
48
+ ranges.forEach(range => {
49
+ tr.removeMark(range.$from.pos, range.$to.pos, type)
50
+ })
40
51
  }
41
52
 
53
+ tr.removeStoredMark(type)
54
+
42
55
  return true
43
56
  }