@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
@@ -0,0 +1,26 @@
1
+ import { ResolvedPos } from '@tiptap/pm/model'
2
+
3
+ export const getTextContentFromNodes = ($from: ResolvedPos, maxMatch = 500) => {
4
+ let textBefore = ''
5
+
6
+ const sliceEndPos = $from.parentOffset
7
+
8
+ $from.parent.nodesBetween(
9
+ Math.max(0, sliceEndPos - maxMatch),
10
+ sliceEndPos,
11
+ (node, pos, parent, index) => {
12
+ const chunk = node.type.spec.toText?.({
13
+ node,
14
+ pos,
15
+ parent,
16
+ index,
17
+ })
18
+ || node.textContent
19
+ || '%leaf%'
20
+
21
+ textBefore += chunk.slice(0, Math.max(0, sliceEndPos - pos))
22
+ },
23
+ )
24
+
25
+ return textBefore
26
+ }
@@ -0,0 +1,11 @@
1
+ import { Schema } from '@tiptap/pm/model'
2
+
3
+ import { TextSerializer } from '../types'
4
+
5
+ export function getTextSerializersFromSchema(schema: Schema): Record<string, TextSerializer> {
6
+ return Object.fromEntries(
7
+ Object.entries(schema.nodes)
8
+ .filter(([, node]) => node.spec.toText)
9
+ .map(([name, node]) => [name, node.spec.toText]),
10
+ )
11
+ }
@@ -0,0 +1,33 @@
1
+ export * from './combineTransactionSteps'
2
+ export * from './defaultBlockAt'
3
+ export * from './findChildren'
4
+ export * from './findChildrenInRange'
5
+ export * from './findParentNode'
6
+ export * from './findParentNodeClosestToPos'
7
+ export * from './generateHTML'
8
+ export * from './generateJSON'
9
+ export * from './generateText'
10
+ export * from './getAttributes'
11
+ export * from './getChangedRanges'
12
+ export * from './getDebugJSON'
13
+ export * from './getExtensionField'
14
+ export * from './getHTMLFromFragment'
15
+ export * from './getMarkAttributes'
16
+ export * from './getMarkRange'
17
+ export * from './getMarksBetween'
18
+ export * from './getMarkType'
19
+ export * from './getNodeAttributes'
20
+ export * from './getNodeType'
21
+ export * from './getSchema'
22
+ export * from './getText'
23
+ export * from './getTextBetween'
24
+ export * from './getTextContentFromNodes'
25
+ export * from './getTextSerializersFromSchema'
26
+ export * from './isActive'
27
+ export * from './isList'
28
+ export * from './isMarkActive'
29
+ export * from './isNodeActive'
30
+ export * from './isNodeEmpty'
31
+ export * from './isNodeSelection'
32
+ export * from './isTextSelection'
33
+ export * from './posToDOMRect'
@@ -1,6 +1,7 @@
1
- import { ParseRule } from 'prosemirror-model'
1
+ import { ParseRule } from '@tiptap/pm/model'
2
+
2
3
  import { ExtensionAttribute } from '../types'
3
- import fromString from '../utilities/fromString'
4
+ import { fromString } from '../utilities/fromString'
4
5
 
5
6
  /**
6
7
  * This function merges extension attributes into parserule attributes (`attrs` or `getAttrs`).
@@ -8,7 +9,10 @@ import fromString from '../utilities/fromString'
8
9
  * @param parseRule ProseMirror ParseRule
9
10
  * @param extensionAttributes List of attributes to inject
10
11
  */
11
- export default function injectExtensionAttributesToParseRule(parseRule: ParseRule, extensionAttributes: ExtensionAttribute[]): ParseRule {
12
+ export function injectExtensionAttributesToParseRule(
13
+ parseRule: ParseRule,
14
+ extensionAttributes: ExtensionAttribute[],
15
+ ): ParseRule {
12
16
  if (parseRule.style) {
13
17
  return parseRule
14
18
  }
@@ -16,31 +20,26 @@ export default function injectExtensionAttributesToParseRule(parseRule: ParseRul
16
20
  return {
17
21
  ...parseRule,
18
22
  getAttrs: node => {
19
- const oldAttributes = parseRule.getAttrs
20
- ? parseRule.getAttrs(node)
21
- : parseRule.attrs
23
+ const oldAttributes = parseRule.getAttrs ? parseRule.getAttrs(node) : parseRule.attrs
22
24
 
23
25
  if (oldAttributes === false) {
24
26
  return false
25
27
  }
26
28
 
27
- const newAttributes = extensionAttributes
28
- .filter(item => item.attribute.rendered)
29
- .reduce((items, item) => {
30
- const attributes = item.attribute.parseHTML
31
- ? item.attribute.parseHTML(node as HTMLElement) || {}
32
- : {
33
- [item.name]: fromString((node as HTMLElement).getAttribute(item.name)),
34
- }
35
-
36
- const filteredAttributes = Object.fromEntries(Object.entries(attributes)
37
- .filter(([, value]) => value !== undefined && value !== null))
38
-
39
- return {
40
- ...items,
41
- ...filteredAttributes,
42
- }
43
- }, {})
29
+ const newAttributes = extensionAttributes.reduce((items, item) => {
30
+ const value = item.attribute.parseHTML
31
+ ? item.attribute.parseHTML(node as HTMLElement)
32
+ : fromString((node as HTMLElement).getAttribute(item.name))
33
+
34
+ if (value === null || value === undefined) {
35
+ return items
36
+ }
37
+
38
+ return {
39
+ ...items,
40
+ [item.name]: value,
41
+ }
42
+ }, {})
44
43
 
45
44
  return { ...oldAttributes, ...newAttributes }
46
45
  },
@@ -1,10 +1,14 @@
1
- import { EditorState } from 'prosemirror-state'
2
- import isNodeActive from './isNodeActive'
3
- import isMarkActive from './isMarkActive'
4
- import getSchemaTypeNameByName from './getSchemaTypeNameByName'
5
- import { AnyObject } from '../types'
1
+ import { EditorState } from '@tiptap/pm/state'
6
2
 
7
- export default function isActive(state: EditorState, name: string | null, attributes: AnyObject = {}): boolean {
3
+ import { getSchemaTypeNameByName } from './getSchemaTypeNameByName'
4
+ import { isMarkActive } from './isMarkActive'
5
+ import { isNodeActive } from './isNodeActive'
6
+
7
+ export function isActive(
8
+ state: EditorState,
9
+ name: string | null,
10
+ attributes: Record<string, any> = {},
11
+ ): boolean {
8
12
  if (!name) {
9
13
  return isNodeActive(state, null, attributes) || isMarkActive(state, null, attributes)
10
14
  }
@@ -0,0 +1,15 @@
1
+ import { AnyExtension, EnableRules } from '../types'
2
+
3
+ export function isExtensionRulesEnabled(extension: AnyExtension, enabled: EnableRules): boolean {
4
+ if (Array.isArray(enabled)) {
5
+ return enabled.some(enabledExtension => {
6
+ const name = typeof enabledExtension === 'string'
7
+ ? enabledExtension
8
+ : enabledExtension.name
9
+
10
+ return name === extension.name
11
+ })
12
+ }
13
+
14
+ return enabled
15
+ }
@@ -1,20 +1,27 @@
1
+ import { NodeConfig } from '..'
2
+ import { getExtensionField } from '../helpers/getExtensionField'
1
3
  import { Extensions } from '../types'
2
- import splitExtensions from './splitExtensions'
3
- import callOrReturn from '../utilities/callOrReturn'
4
+ import { callOrReturn } from '../utilities/callOrReturn'
5
+ import { splitExtensions } from './splitExtensions'
4
6
 
5
- export default function isList(name: string, extensions: Extensions): boolean {
7
+ export function isList(name: string, extensions: Extensions): boolean {
6
8
  const { nodeExtensions } = splitExtensions(extensions)
7
- const extension = nodeExtensions.find(item => item.config.name === name)
9
+ const extension = nodeExtensions.find(item => item.name === name)
8
10
 
9
11
  if (!extension) {
10
12
  return false
11
13
  }
12
14
 
13
- const groups = callOrReturn(extension.config.group, { options: extension.options })
15
+ const context = {
16
+ name: extension.name,
17
+ options: extension.options,
18
+ storage: extension.storage,
19
+ }
20
+ const group = callOrReturn(getExtensionField<NodeConfig['group']>(extension, 'group', context))
14
21
 
15
- if (typeof groups !== 'string') {
22
+ if (typeof group !== 'string') {
16
23
  return false
17
24
  }
18
25
 
19
- return groups.split(' ').includes('list')
26
+ return group.split(' ').includes('list')
20
27
  }
@@ -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'
5
- import { AnyObject, MarkRange } from '../types'
1
+ import { MarkType } from '@tiptap/pm/model'
2
+ import { EditorState } from '@tiptap/pm/state'
6
3
 
7
- export default function isMarkActive(
4
+ import { MarkRange } from '../types'
5
+ import { objectIncludes } from '../utilities/objectIncludes'
6
+ import { getMarkType } from './getMarkType'
7
+
8
+ export function isMarkActive(
8
9
  state: EditorState,
9
10
  typeOrName: MarkType | string | null,
10
- attributes: AnyObject = {},
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,33 +22,43 @@ 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) {
49
57
  return false
50
58
  }
51
59
 
52
- const range = markRanges
60
+ // calculate range of matched mark
61
+ const matchedRange = markRanges
53
62
  .filter(markRange => {
54
63
  if (!type) {
55
64
  return true
@@ -57,11 +66,24 @@ export default function isMarkActive(
57
66
 
58
67
  return type.name === markRange.mark.type.name
59
68
  })
60
- .filter(markRange => objectIncludes(markRange.mark.attrs, attributes))
61
- .reduce((sum, markRange) => {
62
- const size = markRange.to - markRange.from
63
- return sum + size
64
- }, 0)
69
+ .filter(markRange => objectIncludes(markRange.mark.attrs, attributes, { strict: false }))
70
+ .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0)
71
+
72
+ // calculate range of marks that excludes the searched mark
73
+ // for example `code` doesn’t allow any other marks
74
+ const excludedRange = markRanges
75
+ .filter(markRange => {
76
+ if (!type) {
77
+ return true
78
+ }
79
+
80
+ return markRange.mark.type !== type && markRange.mark.type.excludes(type)
81
+ })
82
+ .reduce((sum, markRange) => sum + markRange.to - markRange.from, 0)
83
+
84
+ // we only include the result of `excludedRange`
85
+ // if there is a match at all
86
+ const range = matchedRange > 0 ? matchedRange + excludedRange : matchedRange
65
87
 
66
88
  return range >= selectionRange
67
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'
5
- import { AnyObject, NodeRange } from '../types'
1
+ import { NodeType } from '@tiptap/pm/model'
2
+ import { EditorState } from '@tiptap/pm/state'
6
3
 
7
- export default function isNodeActive(
4
+ import { NodeRange } from '../types'
5
+ import { objectIncludes } from '../utilities/objectIncludes'
6
+ import { getNodeType } from './getNodeType'
7
+
8
+ export function isNodeActive(
8
9
  state: EditorState,
9
10
  typeOrName: NodeType | string | null,
10
- attributes: AnyObject = {},
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
  }
@@ -0,0 +1,35 @@
1
+ import { EditorView } from '@tiptap/pm/view'
2
+
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)
12
+ const top = Math.min(start.top, end.top)
13
+ const bottom = Math.max(start.bottom, end.bottom)
14
+ const left = Math.min(start.left, end.left)
15
+ const right = Math.max(start.right, end.right)
16
+ const width = right - left
17
+ const height = bottom - top
18
+ const x = left
19
+ const y = top
20
+ const data = {
21
+ top,
22
+ bottom,
23
+ left,
24
+ right,
25
+ width,
26
+ height,
27
+ x,
28
+ y,
29
+ }
30
+
31
+ return {
32
+ ...data,
33
+ toJSON: () => data,
34
+ }
35
+ }
@@ -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,36 +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'
13
+ export * from './Tracker'
6
14
  export * from './types'
15
+ export * from './utilities'
7
16
 
8
- export { default as nodeInputRule } from './inputRules/nodeInputRule'
9
- export { default as markInputRule } from './inputRules/markInputRule'
10
- export { default as markPasteRule } from './pasteRules/markPasteRule'
11
-
12
- export { default as callOrReturn } from './utilities/callOrReturn'
13
- export { default as mergeAttributes } from './utilities/mergeAttributes'
14
-
15
- export { default as generateHTML } from './helpers/generateHTML'
16
- export { default as getSchema } from './helpers/getSchema'
17
- export { default as getHTMLFromFragment } from './helpers/getHTMLFromFragment'
18
- export { default as getMarkAttributes } from './helpers/getMarkAttributes'
19
- export { default as isActive } from './helpers/isActive'
20
- export { default as isMarkActive } from './helpers/isMarkActive'
21
- export { default as isNodeActive } from './helpers/isNodeActive'
22
- export { default as isNodeEmpty } from './helpers/isNodeEmpty'
23
- export { default as isNodeSelection } from './helpers/isNodeSelection'
24
- export { default as isTextSelection } from './helpers/isTextSelection'
25
- export { default as findParentNodeClosestToPos } from './helpers/findParentNodeClosestToPos'
26
-
27
- export interface Commands {}
17
+ // eslint-disable-next-line
18
+ export interface Commands<ReturnType = any> {}
28
19
 
29
20
  // eslint-disable-next-line
30
- export interface ExtensionConfig<Options = any> {}
21
+ export interface ExtensionConfig<Options = any, Storage = any> {}
31
22
 
32
23
  // eslint-disable-next-line
33
- export interface NodeConfig<Options = any> {}
24
+ export interface NodeConfig<Options = any, Storage = any> {}
34
25
 
35
26
  // eslint-disable-next-line
36
- 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'