@tiptap/core 2.0.0-beta.98 → 2.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/README.md +3 -3
  2. package/dist/index.cjs +4360 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/{tiptap-core.esm.js → index.js} +2349 -1447
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.umd.js +4358 -0
  7. package/dist/index.umd.js.map +1 -0
  8. package/dist/packages/core/src/CommandManager.d.ts +14 -7
  9. package/dist/packages/core/src/Editor.d.ts +25 -11
  10. package/dist/packages/core/src/EventEmitter.d.ts +8 -4
  11. package/dist/packages/core/src/Extension.d.ts +63 -29
  12. package/dist/packages/core/src/ExtensionManager.d.ts +3 -4
  13. package/dist/packages/core/src/InputRule.d.ts +42 -0
  14. package/dist/packages/core/src/Mark.d.ts +94 -36
  15. package/dist/packages/core/src/Node.d.ts +104 -45
  16. package/dist/packages/core/src/NodeView.d.ts +8 -8
  17. package/dist/packages/core/src/PasteRule.d.ts +42 -0
  18. package/dist/packages/core/src/Tracker.d.ts +1 -1
  19. package/dist/packages/core/src/commands/deleteCurrentNode.d.ts +12 -0
  20. package/dist/packages/core/src/commands/deleteNode.d.ts +1 -1
  21. package/dist/packages/core/src/commands/deleteRange.d.ts +1 -1
  22. package/dist/packages/core/src/commands/extendMarkRange.d.ts +1 -1
  23. package/dist/packages/core/src/commands/focus.d.ts +4 -2
  24. package/dist/packages/core/src/commands/index.d.ts +50 -0
  25. package/dist/packages/core/src/commands/insertContent.d.ts +6 -3
  26. package/dist/packages/core/src/commands/insertContentAt.d.ts +6 -3
  27. package/dist/packages/core/src/commands/join.d.ts +33 -0
  28. package/dist/packages/core/src/commands/lift.d.ts +1 -1
  29. package/dist/packages/core/src/commands/liftListItem.d.ts +1 -1
  30. package/dist/packages/core/src/commands/resetAttributes.d.ts +1 -1
  31. package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +12 -0
  32. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +12 -0
  33. package/dist/packages/core/src/commands/setContent.d.ts +2 -2
  34. package/dist/packages/core/src/commands/setMark.d.ts +1 -1
  35. package/dist/packages/core/src/commands/setNode.d.ts +1 -1
  36. package/dist/packages/core/src/commands/setTextSelection.d.ts +1 -1
  37. package/dist/packages/core/src/commands/sinkListItem.d.ts +1 -1
  38. package/dist/packages/core/src/commands/splitListItem.d.ts +1 -1
  39. package/dist/packages/core/src/commands/toggleList.d.ts +2 -2
  40. package/dist/packages/core/src/commands/toggleMark.d.ts +7 -2
  41. package/dist/packages/core/src/commands/toggleNode.d.ts +1 -1
  42. package/dist/packages/core/src/commands/toggleWrap.d.ts +1 -1
  43. package/dist/packages/core/src/commands/unsetMark.d.ts +7 -2
  44. package/dist/packages/core/src/commands/updateAttributes.d.ts +1 -1
  45. package/dist/packages/core/src/commands/wrapIn.d.ts +1 -1
  46. package/dist/packages/core/src/commands/wrapInList.d.ts +1 -1
  47. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
  48. package/dist/packages/core/src/extensions/commands.d.ts +2 -97
  49. package/dist/packages/core/src/extensions/editable.d.ts +1 -1
  50. package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
  51. package/dist/packages/core/src/extensions/index.d.ts +1 -0
  52. package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
  53. package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
  54. package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +7 -0
  55. package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
  56. package/dist/packages/core/src/helpers/createDocument.d.ts +2 -2
  57. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +2 -2
  58. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
  59. package/dist/packages/core/src/helpers/findChildren.d.ts +3 -3
  60. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +3 -3
  61. package/dist/packages/core/src/helpers/findParentNode.d.ts +3 -4
  62. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +3 -3
  63. package/dist/packages/core/src/helpers/generateHTML.d.ts +1 -1
  64. package/dist/packages/core/src/helpers/generateJSON.d.ts +1 -1
  65. package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
  66. package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -3
  67. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +2 -2
  68. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +11 -0
  69. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +2 -5
  70. package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -2
  71. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
  72. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +3 -3
  73. package/dist/packages/core/src/helpers/getMarkRange.d.ts +2 -2
  74. package/dist/packages/core/src/helpers/getMarkType.d.ts +2 -2
  75. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +2 -2
  76. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +3 -3
  77. package/dist/packages/core/src/helpers/getNodeType.d.ts +2 -2
  78. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +2 -2
  79. package/dist/packages/core/src/helpers/getSchema.d.ts +2 -2
  80. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +2 -2
  81. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +2 -2
  82. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +2 -2
  83. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +1 -1
  84. package/dist/packages/core/src/helpers/getText.d.ts +6 -0
  85. package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
  86. package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +2 -0
  87. package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +3 -0
  88. package/dist/packages/core/src/helpers/index.d.ts +47 -0
  89. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +2 -2
  90. package/dist/packages/core/src/helpers/isActive.d.ts +2 -2
  91. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
  92. package/dist/packages/core/src/helpers/isList.d.ts +1 -1
  93. package/dist/packages/core/src/helpers/isMarkActive.d.ts +3 -3
  94. package/dist/packages/core/src/helpers/isNodeActive.d.ts +3 -3
  95. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +2 -2
  96. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +2 -2
  97. package/dist/packages/core/src/helpers/isTextSelection.d.ts +2 -2
  98. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -2
  99. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +4 -0
  100. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +2 -2
  101. package/dist/packages/core/src/helpers/splitExtensions.d.ts +6 -6
  102. package/dist/packages/core/src/index.d.ts +12 -34
  103. package/dist/packages/core/src/inputRules/index.d.ts +5 -0
  104. package/dist/packages/core/src/inputRules/markInputRule.d.ts +12 -3
  105. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +12 -3
  106. package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
  107. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
  108. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +27 -0
  109. package/dist/packages/core/src/pasteRules/index.d.ts +3 -0
  110. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +12 -3
  111. package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +12 -0
  112. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
  113. package/dist/packages/core/src/style.d.ts +1 -2
  114. package/dist/packages/core/src/types.d.ts +70 -40
  115. package/dist/packages/core/src/utilities/callOrReturn.d.ts +1 -1
  116. package/dist/packages/core/src/utilities/createStyleTag.d.ts +1 -1
  117. package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -1
  118. package/dist/packages/core/src/utilities/elementFromString.d.ts +1 -1
  119. package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +1 -0
  120. package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
  121. package/dist/packages/core/src/utilities/fromString.d.ts +1 -1
  122. package/dist/packages/core/src/utilities/index.d.ts +20 -0
  123. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
  124. package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
  125. package/dist/packages/core/src/utilities/isMacOS.d.ts +1 -0
  126. package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
  127. package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
  128. package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
  129. package/dist/packages/core/src/utilities/isString.d.ts +1 -0
  130. package/dist/packages/core/src/utilities/isiOS.d.ts +1 -1
  131. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -1
  132. package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -1
  133. package/dist/packages/core/src/utilities/minMax.d.ts +1 -1
  134. package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -1
  135. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +8 -0
  136. package/package.json +25 -24
  137. package/src/CommandManager.ts +73 -83
  138. package/src/Editor.ts +101 -53
  139. package/src/EventEmitter.ts +14 -4
  140. package/src/Extension.ts +244 -138
  141. package/src/ExtensionManager.ts +153 -152
  142. package/src/InputRule.ts +260 -0
  143. package/src/Mark.ts +365 -204
  144. package/src/Node.ts +406 -253
  145. package/src/NodeView.ts +59 -38
  146. package/src/PasteRule.ts +240 -0
  147. package/src/Tracker.ts +4 -8
  148. package/src/commands/blur.ts +4 -0
  149. package/src/commands/clearNodes.ts +15 -9
  150. package/src/commands/createParagraphNear.ts +3 -2
  151. package/src/commands/deleteCurrentNode.ts +41 -0
  152. package/src/commands/deleteNode.ts +3 -2
  153. package/src/commands/deleteRange.ts +1 -1
  154. package/src/commands/deleteSelection.ts +3 -2
  155. package/src/commands/exitCode.ts +3 -2
  156. package/src/commands/extendMarkRange.ts +9 -5
  157. package/src/commands/focus.ts +31 -42
  158. package/src/commands/index.ts +50 -0
  159. package/src/commands/insertContent.ts +15 -4
  160. package/src/commands/insertContentAt.ts +71 -14
  161. package/src/commands/join.ts +53 -0
  162. package/src/commands/keyboardShortcut.ts +3 -3
  163. package/src/commands/lift.ts +6 -5
  164. package/src/commands/liftEmptyBlock.ts +2 -1
  165. package/src/commands/liftListItem.ts +5 -4
  166. package/src/commands/newlineInCode.ts +3 -2
  167. package/src/commands/resetAttributes.ts +16 -10
  168. package/src/commands/selectAll.ts +5 -3
  169. package/src/commands/selectNodeBackward.ts +3 -2
  170. package/src/commands/selectNodeForward.ts +3 -2
  171. package/src/commands/selectParentNode.ts +3 -2
  172. package/src/commands/selectTextblockEnd.ts +20 -0
  173. package/src/commands/selectTextblockStart.ts +20 -0
  174. package/src/commands/setContent.ts +6 -9
  175. package/src/commands/setMark.ts +66 -13
  176. package/src/commands/setNode.ts +30 -6
  177. package/src/commands/setNodeSelection.ts +6 -7
  178. package/src/commands/setTextSelection.ts +8 -9
  179. package/src/commands/sinkListItem.ts +5 -4
  180. package/src/commands/splitBlock.ts +23 -38
  181. package/src/commands/splitListItem.ts +30 -27
  182. package/src/commands/toggleList.ts +108 -19
  183. package/src/commands/toggleMark.ts +17 -6
  184. package/src/commands/toggleNode.ts +9 -4
  185. package/src/commands/toggleWrap.ts +8 -8
  186. package/src/commands/undoInputRule.ts +31 -2
  187. package/src/commands/unsetAllMarks.ts +4 -8
  188. package/src/commands/unsetMark.ts +34 -21
  189. package/src/commands/updateAttributes.ts +18 -12
  190. package/src/commands/wrapIn.ts +5 -10
  191. package/src/commands/wrapInList.ts +5 -4
  192. package/src/extensions/clipboardTextSerializer.ts +15 -36
  193. package/src/extensions/commands.ts +3 -144
  194. package/src/extensions/editable.ts +2 -1
  195. package/src/extensions/focusEvents.ts +4 -6
  196. package/src/extensions/index.ts +1 -0
  197. package/src/extensions/keymap.ts +111 -13
  198. package/src/extensions/tabindex.ts +18 -0
  199. package/src/helpers/combineTransactionSteps.ts +21 -0
  200. package/src/helpers/createChainableState.ts +38 -0
  201. package/src/helpers/createDocument.ts +4 -3
  202. package/src/helpers/createNodeFromContent.ts +10 -15
  203. package/src/helpers/defaultBlockAt.ts +13 -0
  204. package/src/helpers/findChildren.ts +4 -3
  205. package/src/helpers/findChildrenInRange.ts +8 -3
  206. package/src/helpers/findParentNode.ts +4 -3
  207. package/src/helpers/findParentNodeClosestToPos.ts +13 -7
  208. package/src/helpers/generateHTML.ts +6 -5
  209. package/src/helpers/generateJSON.ts +6 -7
  210. package/src/helpers/generateText.ts +27 -0
  211. package/src/helpers/getAttributes.ts +8 -9
  212. package/src/helpers/getAttributesFromExtensions.ts +25 -12
  213. package/src/helpers/getChangedRanges.ts +83 -0
  214. package/src/helpers/getDebugJSON.ts +42 -38
  215. package/src/helpers/getExtensionField.ts +3 -3
  216. package/src/helpers/getHTMLFromFragment.ts +5 -6
  217. package/src/helpers/getMarkAttributes.ts +18 -10
  218. package/src/helpers/getMarkRange.ts +13 -8
  219. package/src/helpers/getMarkType.ts +5 -3
  220. package/src/helpers/getMarksBetween.ts +34 -10
  221. package/src/helpers/getNodeAttributes.ts +14 -12
  222. package/src/helpers/getNodeType.ts +5 -3
  223. package/src/helpers/getRenderedAttributes.ts +8 -6
  224. package/src/helpers/getSchema.ts +5 -4
  225. package/src/helpers/getSchemaByResolvedExtensions.ts +165 -111
  226. package/src/helpers/getSchemaTypeByName.ts +3 -11
  227. package/src/helpers/getSchemaTypeNameByName.ts +2 -2
  228. package/src/helpers/getSplittedAttributes.ts +1 -1
  229. package/src/helpers/getText.ts +19 -0
  230. package/src/helpers/getTextBetween.ts +46 -0
  231. package/src/helpers/getTextContentFromNodes.ts +26 -0
  232. package/src/helpers/getTextSerializersFromSchema.ts +11 -0
  233. package/src/helpers/index.ts +47 -0
  234. package/src/helpers/injectExtensionAttributesToParseRule.ts +22 -23
  235. package/src/helpers/isActive.ts +10 -5
  236. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  237. package/src/helpers/isList.ts +6 -5
  238. package/src/helpers/isMarkActive.ts +32 -35
  239. package/src/helpers/isNodeActive.ts +27 -37
  240. package/src/helpers/isNodeEmpty.ts +2 -2
  241. package/src/helpers/isNodeSelection.ts +3 -4
  242. package/src/helpers/isTextSelection.ts +3 -4
  243. package/src/helpers/posToDOMRect.ts +10 -4
  244. package/src/helpers/resolveFocusPosition.ts +42 -0
  245. package/src/helpers/selectionToInsertionEnd.ts +3 -3
  246. package/src/helpers/splitExtensions.ts +3 -3
  247. package/src/index.ts +12 -37
  248. package/src/inputRules/index.ts +5 -0
  249. package/src/inputRules/markInputRule.ts +59 -40
  250. package/src/inputRules/nodeInputRule.ts +45 -12
  251. package/src/inputRules/textInputRule.ts +35 -0
  252. package/src/inputRules/textblockTypeInputRule.ts +37 -0
  253. package/src/inputRules/wrappingInputRule.ts +84 -0
  254. package/src/pasteRules/index.ts +3 -0
  255. package/src/pasteRules/markPasteRule.ts +49 -56
  256. package/src/pasteRules/nodePasteRule.ts +37 -0
  257. package/src/pasteRules/textPasteRule.ts +35 -0
  258. package/src/style.ts +12 -3
  259. package/src/types.ts +140 -106
  260. package/src/utilities/callOrReturn.ts +3 -2
  261. package/src/utilities/createStyleTag.ts +8 -4
  262. package/src/utilities/deleteProps.ts +1 -1
  263. package/src/utilities/elementFromString.ts +1 -1
  264. package/src/utilities/escapeForRegEx.ts +4 -0
  265. package/src/utilities/findDuplicates.ts +5 -0
  266. package/src/utilities/fromString.ts +2 -2
  267. package/src/utilities/index.ts +20 -0
  268. package/src/utilities/isEmptyObject.ts +2 -2
  269. package/src/utilities/isFunction.ts +3 -0
  270. package/src/utilities/isMacOS.ts +5 -0
  271. package/src/utilities/isNumber.ts +3 -0
  272. package/src/utilities/isPlainObject.ts +8 -5
  273. package/src/utilities/isRegExp.ts +3 -0
  274. package/src/utilities/isString.ts +3 -0
  275. package/src/utilities/isiOS.ts +1 -1
  276. package/src/utilities/mergeAttributes.ts +2 -1
  277. package/src/utilities/mergeDeep.ts +2 -2
  278. package/src/utilities/minMax.ts +1 -1
  279. package/src/utilities/objectIncludes.ts +18 -4
  280. package/src/utilities/removeDuplicates.ts +15 -0
  281. package/CHANGELOG.md +0 -1182
  282. package/LICENSE.md +0 -21
  283. package/dist/packages/core/src/commands/joinBackward.d.ts +0 -12
  284. package/dist/packages/core/src/commands/joinForward.d.ts +0 -12
  285. package/dist/packages/core/src/utilities/isClass.d.ts +0 -1
  286. package/dist/packages/core/src/utilities/isObject.d.ts +0 -1
  287. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  288. package/dist/tiptap-core.cjs.js +0 -3408
  289. package/dist/tiptap-core.cjs.js.map +0 -1
  290. package/dist/tiptap-core.esm.js.map +0 -1
  291. package/dist/tiptap-core.umd.js +0 -3405
  292. package/dist/tiptap-core.umd.js.map +0 -1
  293. package/src/commands/joinBackward.ts +0 -17
  294. package/src/commands/joinForward.ts +0 -17
  295. package/src/utilities/isClass.ts +0 -7
  296. package/src/utilities/isObject.ts +0 -10
  297. package/src/utilities/removeElement.ts +0 -5
@@ -1,18 +1,17 @@
1
- import { EditorState } from 'prosemirror-state'
2
- import { MarkType } from 'prosemirror-model'
3
- import objectIncludes from '../utilities/objectIncludes'
4
- import getMarkType from './getMarkType'
1
+ import { MarkType } from '@tiptap/pm/model'
2
+ import { EditorState } from '@tiptap/pm/state'
3
+
5
4
  import { MarkRange } from '../types'
5
+ import { objectIncludes } from '../utilities/objectIncludes'
6
+ import { getMarkType } from './getMarkType'
6
7
 
7
- export default function isMarkActive(
8
+ export function isMarkActive(
8
9
  state: EditorState,
9
10
  typeOrName: MarkType | string | null,
10
11
  attributes: Record<string, any> = {},
11
12
  ): boolean {
12
- const { from, to, empty } = state.selection
13
- const type = typeOrName
14
- ? getMarkType(typeOrName, state.schema)
15
- : null
13
+ const { empty, ranges } = state.selection
14
+ const type = typeOrName ? getMarkType(typeOrName, state.schema) : null
16
15
 
17
16
  if (empty) {
18
17
  return !!(state.storedMarks || state.selection.$from.marks())
@@ -23,26 +22,35 @@ export default function isMarkActive(
23
22
 
24
23
  return type.name === mark.type.name
25
24
  })
26
- .find(mark => objectIncludes(mark.attrs, attributes))
25
+ .find(mark => objectIncludes(mark.attrs, attributes, { strict: false }))
27
26
  }
28
27
 
29
28
  let selectionRange = 0
30
- let markRanges: MarkRange[] = []
29
+ const markRanges: MarkRange[] = []
30
+
31
+ ranges.forEach(({ $from, $to }) => {
32
+ const from = $from.pos
33
+ const to = $to.pos
34
+
35
+ state.doc.nodesBetween(from, to, (node, pos) => {
36
+ if (!node.isText && !node.marks.length) {
37
+ return
38
+ }
31
39
 
32
- state.doc.nodesBetween(from, to, (node, pos) => {
33
- if (node.isText) {
34
40
  const relativeFrom = Math.max(from, pos)
35
41
  const relativeTo = Math.min(to, pos + node.nodeSize)
36
42
  const range = relativeTo - relativeFrom
37
43
 
38
44
  selectionRange += range
39
45
 
40
- markRanges = [...markRanges, ...node.marks.map(mark => ({
41
- mark,
42
- from: relativeFrom,
43
- to: relativeTo,
44
- }))]
45
- }
46
+ markRanges.push(
47
+ ...node.marks.map(mark => ({
48
+ mark,
49
+ from: relativeFrom,
50
+ to: relativeTo,
51
+ })),
52
+ )
53
+ })
46
54
  })
47
55
 
48
56
  if (selectionRange === 0) {
@@ -58,12 +66,8 @@ export default function isMarkActive(
58
66
 
59
67
  return type.name === markRange.mark.type.name
60
68
  })
61
- .filter(markRange => objectIncludes(markRange.mark.attrs, attributes))
62
- .reduce((sum, markRange) => {
63
- const size = markRange.to - markRange.from
64
-
65
- return sum + size
66
- }, 0)
69
+ .filter(markRange => objectIncludes(markRange.mark.attrs, attributes, { strict: false }))
70
+ .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0)
67
71
 
68
72
  // calculate range of marks that excludes the searched mark
69
73
  // for example `code` doesn’t allow any other marks
@@ -73,20 +77,13 @@ export default function isMarkActive(
73
77
  return true
74
78
  }
75
79
 
76
- return markRange.mark.type !== type
77
- && markRange.mark.type.excludes(type)
80
+ return markRange.mark.type !== type && markRange.mark.type.excludes(type)
78
81
  })
79
- .reduce((sum, markRange) => {
80
- const size = markRange.to - markRange.from
81
-
82
- return sum + size
83
- }, 0)
82
+ .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0)
84
83
 
85
84
  // we only include the result of `excludedRange`
86
85
  // if there is a match at all
87
- const range = matchedRange > 0
88
- ? matchedRange + excludedRange
89
- : matchedRange
86
+ const range = matchedRange > 0 ? matchedRange + excludedRange : matchedRange
90
87
 
91
88
  return range >= selectionRange
92
89
  }
@@ -1,49 +1,37 @@
1
- import { EditorState } from 'prosemirror-state'
2
- import { NodeType } from 'prosemirror-model'
3
- import objectIncludes from '../utilities/objectIncludes'
4
- import getNodeType from './getNodeType'
1
+ import { NodeType } from '@tiptap/pm/model'
2
+ import { EditorState } from '@tiptap/pm/state'
3
+
5
4
  import { NodeRange } from '../types'
5
+ import { objectIncludes } from '../utilities/objectIncludes'
6
+ import { getNodeType } from './getNodeType'
6
7
 
7
- export default function isNodeActive(
8
+ export function isNodeActive(
8
9
  state: EditorState,
9
10
  typeOrName: NodeType | string | null,
10
11
  attributes: Record<string, any> = {},
11
12
  ): boolean {
12
13
  const { from, to, empty } = state.selection
13
- const type = typeOrName
14
- ? getNodeType(typeOrName, state.schema)
15
- : null
14
+ const type = typeOrName ? getNodeType(typeOrName, state.schema) : null
16
15
 
17
- let nodeRanges: NodeRange[] = []
16
+ const nodeRanges: NodeRange[] = []
18
17
 
19
18
  state.doc.nodesBetween(from, to, (node, pos) => {
20
- if (!node.isText) {
21
- const relativeFrom = Math.max(from, pos)
22
- const relativeTo = Math.min(to, pos + node.nodeSize)
23
-
24
- nodeRanges = [...nodeRanges, {
25
- node,
26
- from: relativeFrom,
27
- to: relativeTo,
28
- }]
19
+ if (node.isText) {
20
+ return
29
21
  }
30
- })
31
22
 
32
- if (empty) {
33
- return !!nodeRanges
34
- .filter(nodeRange => {
35
- if (!type) {
36
- return true
37
- }
38
-
39
- return type.name === nodeRange.node.type.name
40
- })
41
- .find(nodeRange => objectIncludes(nodeRange.node.attrs, attributes))
42
- }
23
+ const relativeFrom = Math.max(from, pos)
24
+ const relativeTo = Math.min(to, pos + node.nodeSize)
43
25
 
44
- const selectionRange = to - from
26
+ nodeRanges.push({
27
+ node,
28
+ from: relativeFrom,
29
+ to: relativeTo,
30
+ })
31
+ })
45
32
 
46
- const range = nodeRanges
33
+ const selectionRange = to - from
34
+ const matchedNodeRanges = nodeRanges
47
35
  .filter(nodeRange => {
48
36
  if (!type) {
49
37
  return true
@@ -51,11 +39,13 @@ export default function isNodeActive(
51
39
 
52
40
  return type.name === nodeRange.node.type.name
53
41
  })
54
- .filter(nodeRange => objectIncludes(nodeRange.node.attrs, attributes))
55
- .reduce((sum, nodeRange) => {
56
- const size = nodeRange.to - nodeRange.from
57
- return sum + size
58
- }, 0)
42
+ .filter(nodeRange => objectIncludes(nodeRange.node.attrs, attributes, { strict: false }))
43
+
44
+ if (empty) {
45
+ return !!matchedNodeRanges.length
46
+ }
47
+
48
+ const range = matchedNodeRanges.reduce((sum, nodeRange) => sum + nodeRange.to - nodeRange.from, 0)
59
49
 
60
50
  return range >= selectionRange
61
51
  }
@@ -1,6 +1,6 @@
1
- import { Node as ProseMirrorNode } from 'prosemirror-model'
1
+ import { Node as ProseMirrorNode } from '@tiptap/pm/model'
2
2
 
3
- export default function isNodeEmpty(node: ProseMirrorNode): boolean {
3
+ export function isNodeEmpty(node: ProseMirrorNode): boolean {
4
4
  const defaultContent = node.type.createAndFill()?.toJSON()
5
5
  const content = node.toJSON()
6
6
 
@@ -1,6 +1,5 @@
1
- import { NodeSelection } from 'prosemirror-state'
2
- import isObject from '../utilities/isObject'
1
+ import { NodeSelection } from '@tiptap/pm/state'
3
2
 
4
- export default function isNodeSelection(value: unknown): value is NodeSelection {
5
- return isObject(value) && value instanceof NodeSelection
3
+ export function isNodeSelection(value: unknown): value is NodeSelection {
4
+ return value instanceof NodeSelection
6
5
  }
@@ -1,6 +1,5 @@
1
- import { TextSelection } from 'prosemirror-state'
2
- import isObject from '../utilities/isObject'
1
+ import { TextSelection } from '@tiptap/pm/state'
3
2
 
4
- export default function isTextSelection(value: unknown): value is TextSelection {
5
- return isObject(value) && value instanceof TextSelection
3
+ export function isTextSelection(value: unknown): value is TextSelection {
4
+ return value instanceof TextSelection
6
5
  }
@@ -1,8 +1,14 @@
1
- import { EditorView } from 'prosemirror-view'
1
+ import { EditorView } from '@tiptap/pm/view'
2
2
 
3
- export default function posToDOMRect(view: EditorView, from: number, to: number): DOMRect {
4
- const start = view.coordsAtPos(from)
5
- const end = view.coordsAtPos(to, -1)
3
+ import { minMax } from '../utilities/minMax'
4
+
5
+ export function posToDOMRect(view: EditorView, from: number, to: number): DOMRect {
6
+ const minPos = 0
7
+ const maxPos = view.state.doc.content.size
8
+ const resolvedFrom = minMax(from, minPos, maxPos)
9
+ const resolvedEnd = minMax(to, minPos, maxPos)
10
+ const start = view.coordsAtPos(resolvedFrom)
11
+ const end = view.coordsAtPos(resolvedEnd, -1)
6
12
  const top = Math.min(start.top, end.top)
7
13
  const bottom = Math.max(start.bottom, end.bottom)
8
14
  const left = Math.min(start.left, end.left)
@@ -0,0 +1,42 @@
1
+ import { Node as ProseMirrorNode } from '@tiptap/pm/model'
2
+ import { Selection, TextSelection } from '@tiptap/pm/state'
3
+
4
+ import { FocusPosition } from '../types'
5
+ import { minMax } from '../utilities/minMax'
6
+
7
+ export function resolveFocusPosition(
8
+ doc: ProseMirrorNode,
9
+ position: FocusPosition = null,
10
+ ): Selection | null {
11
+ if (!position) {
12
+ return null
13
+ }
14
+
15
+ const selectionAtStart = Selection.atStart(doc)
16
+ const selectionAtEnd = Selection.atEnd(doc)
17
+
18
+ if (position === 'start' || position === true) {
19
+ return selectionAtStart
20
+ }
21
+
22
+ if (position === 'end') {
23
+ return selectionAtEnd
24
+ }
25
+
26
+ const minPos = selectionAtStart.from
27
+ const maxPos = selectionAtEnd.to
28
+
29
+ if (position === 'all') {
30
+ return TextSelection.create(
31
+ doc,
32
+ minMax(0, minPos, maxPos),
33
+ minMax(doc.content.size, minPos, maxPos),
34
+ )
35
+ }
36
+
37
+ return TextSelection.create(
38
+ doc,
39
+ minMax(position, minPos, maxPos),
40
+ minMax(position, minPos, maxPos),
41
+ )
42
+ }
@@ -1,8 +1,8 @@
1
- import { Selection, Transaction } from 'prosemirror-state'
2
- import { ReplaceStep, ReplaceAroundStep } from 'prosemirror-transform'
1
+ import { Selection, Transaction } from '@tiptap/pm/state'
2
+ import { ReplaceAroundStep, ReplaceStep } from '@tiptap/pm/transform'
3
3
 
4
4
  // source: https://github.com/ProseMirror/prosemirror-state/blob/master/src/selection.js#L466
5
- export default function selectionToInsertionEnd(tr: Transaction, startLen: number, bias: number) {
5
+ export function selectionToInsertionEnd(tr: Transaction, startLen: number, bias: number) {
6
6
  const last = tr.steps.length - 1
7
7
 
8
8
  if (last < startLen) {
@@ -1,9 +1,9 @@
1
- import { Extensions } from '../types'
2
1
  import { Extension } from '../Extension'
3
- import { Node } from '../Node'
4
2
  import { Mark } from '../Mark'
3
+ import { Node } from '../Node'
4
+ import { Extensions } from '../types'
5
5
 
6
- export default function splitExtensions(extensions: Extensions) {
6
+ export function splitExtensions(extensions: Extensions) {
7
7
  const baseExtensions = extensions.filter(extension => extension.type === 'extension') as Extension[]
8
8
  const nodeExtensions = extensions.filter(extension => extension.type === 'node') as Node[]
9
9
  const markExtensions = extensions.filter(extension => extension.type === 'mark') as Mark[]
package/src/index.ts CHANGED
@@ -1,52 +1,27 @@
1
+ export * from './CommandManager'
1
2
  export * from './Editor'
2
3
  export * from './Extension'
3
- export * from './Node'
4
+ export * as extensions from './extensions'
5
+ export * from './helpers'
6
+ export * from './InputRule'
7
+ export * from './inputRules'
4
8
  export * from './Mark'
9
+ export * from './Node'
5
10
  export * from './NodeView'
11
+ export * from './PasteRule'
12
+ export * from './pasteRules'
6
13
  export * from './Tracker'
7
14
  export * from './types'
8
-
9
- export { default as nodeInputRule } from './inputRules/nodeInputRule'
10
- export { default as markInputRule } from './inputRules/markInputRule'
11
- export { default as markPasteRule } from './pasteRules/markPasteRule'
12
-
13
- export { default as callOrReturn } from './utilities/callOrReturn'
14
- export { default as mergeAttributes } from './utilities/mergeAttributes'
15
-
16
- export { default as getExtensionField } from './helpers/getExtensionField'
17
- export { default as findChildren } from './helpers/findChildren'
18
- export { default as findChildrenInRange } from './helpers/findChildrenInRange'
19
- export { default as findParentNode } from './helpers/findParentNode'
20
- export { default as findParentNodeClosestToPos } from './helpers/findParentNodeClosestToPos'
21
- export { default as generateHTML } from './helpers/generateHTML'
22
- export { default as generateJSON } from './helpers/generateJSON'
23
- export { default as getSchema } from './helpers/getSchema'
24
- export { default as getHTMLFromFragment } from './helpers/getHTMLFromFragment'
25
- export { default as getDebugJSON } from './helpers/getDebugJSON'
26
- export { default as getAttributes } from './helpers/getAttributes'
27
- export { default as getMarkAttributes } from './helpers/getMarkAttributes'
28
- export { default as getMarkRange } from './helpers/getMarkRange'
29
- export { default as getMarkType } from './helpers/getMarkType'
30
- export { default as getMarksBetween } from './helpers/getMarksBetween'
31
- export { default as getNodeAttributes } from './helpers/getNodeAttributes'
32
- export { default as getNodeType } from './helpers/getNodeType'
33
- export { default as isActive } from './helpers/isActive'
34
- export { default as isList } from './helpers/isList'
35
- export { default as isMarkActive } from './helpers/isMarkActive'
36
- export { default as isNodeActive } from './helpers/isNodeActive'
37
- export { default as isNodeEmpty } from './helpers/isNodeEmpty'
38
- export { default as isNodeSelection } from './helpers/isNodeSelection'
39
- export { default as isTextSelection } from './helpers/isTextSelection'
40
- export { default as posToDOMRect } from './helpers/posToDOMRect'
15
+ export * from './utilities'
41
16
 
42
17
  // eslint-disable-next-line
43
18
  export interface Commands<ReturnType = any> {}
44
19
 
45
20
  // eslint-disable-next-line
46
- export interface ExtensionConfig<Options = any> {}
21
+ export interface ExtensionConfig<Options = any, Storage = any> {}
47
22
 
48
23
  // eslint-disable-next-line
49
- export interface NodeConfig<Options = any> {}
24
+ export interface NodeConfig<Options = any, Storage = any> {}
50
25
 
51
26
  // eslint-disable-next-line
52
- export interface MarkConfig<Options = any> {}
27
+ export interface MarkConfig<Options = any, Storage = any> {}
@@ -0,0 +1,5 @@
1
+ export * from './markInputRule'
2
+ export * from './nodeInputRule'
3
+ export * from './textblockTypeInputRule'
4
+ export * from './textInputRule'
5
+ export * from './wrappingInputRule'
@@ -1,50 +1,69 @@
1
- import { InputRule } from 'prosemirror-inputrules'
2
- import { MarkType } from 'prosemirror-model'
3
- import getMarksBetween from '../helpers/getMarksBetween'
4
-
5
- export default function (regexp: RegExp, markType: MarkType, getAttributes?: Function): InputRule {
6
- return new InputRule(regexp, (state, match, start, end) => {
7
- const attributes = getAttributes instanceof Function
8
- ? getAttributes(match)
9
- : getAttributes
10
- const { tr } = state
11
- const captureGroup = match[match.length - 1]
12
- const fullMatch = match[0]
13
- let markEnd = end
14
-
15
- if (captureGroup) {
16
- const startSpaces = fullMatch.search(/\S/)
17
- const textStart = start + fullMatch.indexOf(captureGroup)
18
- const textEnd = textStart + captureGroup.length
19
-
20
- const excludedMarks = getMarksBetween(start, end, state)
21
- .filter(item => {
22
- // TODO: PR to add excluded to MarkType
23
- // @ts-ignore
24
- const { excluded } = item.mark.type
25
- return excluded.find((type: MarkType) => type.name === markType.name)
26
- })
27
- .filter(item => item.to > textStart)
28
-
29
- if (excludedMarks.length) {
1
+ import { MarkType } from '@tiptap/pm/model'
2
+
3
+ import { getMarksBetween } from '../helpers/getMarksBetween'
4
+ import { InputRule, InputRuleFinder } from '../InputRule'
5
+ import { ExtendedRegExpMatchArray } from '../types'
6
+ import { callOrReturn } from '../utilities/callOrReturn'
7
+
8
+ /**
9
+ * Build an input rule that adds a mark when the
10
+ * matched text is typed into it.
11
+ */
12
+ export function markInputRule(config: {
13
+ find: InputRuleFinder
14
+ type: MarkType
15
+ getAttributes?:
16
+ | Record<string, any>
17
+ | ((match: ExtendedRegExpMatchArray) => Record<string, any>)
18
+ | false
19
+ | null
20
+ }) {
21
+ return new InputRule({
22
+ find: config.find,
23
+ handler: ({ state, range, match }) => {
24
+ const attributes = callOrReturn(config.getAttributes, undefined, match)
25
+
26
+ if (attributes === false || attributes === null) {
30
27
  return null
31
28
  }
32
29
 
33
- if (textEnd < end) {
34
- tr.delete(textEnd, end)
35
- }
30
+ const { tr } = state
31
+ const captureGroup = match[match.length - 1]
32
+ const fullMatch = match[0]
33
+ let markEnd = range.to
36
34
 
37
- if (textStart > start) {
38
- tr.delete(start + startSpaces, textStart)
39
- }
35
+ if (captureGroup) {
36
+ const startSpaces = fullMatch.search(/\S/)
37
+ const textStart = range.from + fullMatch.indexOf(captureGroup)
38
+ const textEnd = textStart + captureGroup.length
40
39
 
41
- markEnd = start + startSpaces + captureGroup.length
40
+ const excludedMarks = getMarksBetween(range.from, range.to, state.doc)
41
+ .filter(item => {
42
+ // @ts-ignore
43
+ const excluded = item.mark.type.excluded as MarkType[]
42
44
 
43
- tr.addMark(start + startSpaces, markEnd, markType.create(attributes))
45
+ return excluded.find(type => type === config.type && type !== item.mark.type)
46
+ })
47
+ .filter(item => item.to > textStart)
44
48
 
45
- tr.removeStoredMark(markType)
46
- }
49
+ if (excludedMarks.length) {
50
+ return null
51
+ }
47
52
 
48
- return tr
53
+ if (textEnd < range.to) {
54
+ tr.delete(textEnd, range.to)
55
+ }
56
+
57
+ if (textStart > range.from) {
58
+ tr.delete(range.from + startSpaces, textStart)
59
+ }
60
+
61
+ markEnd = range.from + startSpaces + captureGroup.length
62
+
63
+ tr.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {}))
64
+
65
+ tr.removeStoredMark(config.type)
66
+ }
67
+ },
49
68
  })
50
69
  }
@@ -1,17 +1,50 @@
1
- import { InputRule } from 'prosemirror-inputrules'
2
- import { NodeType } from 'prosemirror-model'
1
+ import { NodeType } from '@tiptap/pm/model'
3
2
 
4
- export default function (regexp: RegExp, type: NodeType, getAttributes?: (match: any) => any): InputRule {
5
- return new InputRule(regexp, (state, match, start, end) => {
6
- const attributes = getAttributes instanceof Function
7
- ? getAttributes(match)
8
- : getAttributes
9
- const { tr } = state
3
+ import { InputRule, InputRuleFinder } from '../InputRule'
4
+ import { ExtendedRegExpMatchArray } from '../types'
5
+ import { callOrReturn } from '../utilities/callOrReturn'
10
6
 
11
- if (match[0]) {
12
- tr.replaceWith(start - 1, end, type.create(attributes))
13
- }
7
+ /**
8
+ * Build an input rule that adds a node when the
9
+ * matched text is typed into it.
10
+ */
11
+ export function nodeInputRule(config: {
12
+ find: InputRuleFinder
13
+ type: NodeType
14
+ getAttributes?:
15
+ | Record<string, any>
16
+ | ((match: ExtendedRegExpMatchArray) => Record<string, any>)
17
+ | false
18
+ | null
19
+ }) {
20
+ return new InputRule({
21
+ find: config.find,
22
+ handler: ({ state, range, match }) => {
23
+ const attributes = callOrReturn(config.getAttributes, undefined, match) || {}
24
+ const { tr } = state
25
+ const start = range.from
26
+ let end = range.to
14
27
 
15
- return tr
28
+ if (match[1]) {
29
+ const offset = match[0].lastIndexOf(match[1])
30
+ let matchStart = start + offset
31
+
32
+ if (matchStart > end) {
33
+ matchStart = end
34
+ } else {
35
+ end = matchStart + match[1].length
36
+ }
37
+
38
+ // insert last typed character
39
+ const lastChar = match[0][match[0].length - 1]
40
+
41
+ tr.insertText(lastChar, start + match[0].length - 1)
42
+
43
+ // insert node from input rule
44
+ tr.replaceWith(matchStart, end, config.type.create(attributes))
45
+ } else if (match[0]) {
46
+ tr.replaceWith(start, end, config.type.create(attributes))
47
+ }
48
+ },
16
49
  })
17
50
  }
@@ -0,0 +1,35 @@
1
+ import { InputRule, InputRuleFinder } from '../InputRule'
2
+
3
+ /**
4
+ * Build an input rule that replaces text when the
5
+ * matched text is typed into it.
6
+ */
7
+ export function textInputRule(config: {
8
+ find: InputRuleFinder,
9
+ replace: string,
10
+ }) {
11
+ return new InputRule({
12
+ find: config.find,
13
+ handler: ({ state, range, match }) => {
14
+ let insert = config.replace
15
+ let start = range.from
16
+ const end = range.to
17
+
18
+ if (match[1]) {
19
+ const offset = match[0].lastIndexOf(match[1])
20
+
21
+ insert += match[0].slice(offset + match[1].length)
22
+ start += offset
23
+
24
+ const cutOff = start - end
25
+
26
+ if (cutOff > 0) {
27
+ insert = match[0].slice(offset - cutOff, offset) + insert
28
+ start = end
29
+ }
30
+ }
31
+
32
+ state.tr.insertText(insert, start, end)
33
+ },
34
+ })
35
+ }
@@ -0,0 +1,37 @@
1
+ import { NodeType } from '@tiptap/pm/model'
2
+
3
+ import { InputRule, InputRuleFinder } from '../InputRule'
4
+ import { ExtendedRegExpMatchArray } from '../types'
5
+ import { callOrReturn } from '../utilities/callOrReturn'
6
+
7
+ /**
8
+ * Build an input rule that changes the type of a textblock when the
9
+ * matched text is typed into it. When using a regular expresion you’ll
10
+ * probably want the regexp to start with `^`, so that the pattern can
11
+ * only occur at the start of a textblock.
12
+ */
13
+ export function textblockTypeInputRule(config: {
14
+ find: InputRuleFinder
15
+ type: NodeType
16
+ getAttributes?:
17
+ | Record<string, any>
18
+ | ((match: ExtendedRegExpMatchArray) => Record<string, any>)
19
+ | false
20
+ | null
21
+ }) {
22
+ return new InputRule({
23
+ find: config.find,
24
+ handler: ({ state, range, match }) => {
25
+ const $start = state.doc.resolve(range.from)
26
+ const attributes = callOrReturn(config.getAttributes, undefined, match) || {}
27
+
28
+ if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), config.type)) {
29
+ return null
30
+ }
31
+
32
+ state.tr
33
+ .delete(range.from, range.to)
34
+ .setBlockType(range.from, range.from, config.type, attributes)
35
+ },
36
+ })
37
+ }