@tiptap/core 2.0.0-beta.20 → 2.0.0-beta.200

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 (333) hide show
  1. package/README.md +2 -2
  2. package/dist/packages/core/src/CommandManager.d.ts +13 -6
  3. package/dist/packages/core/src/Editor.d.ts +24 -19
  4. package/dist/packages/core/src/EventEmitter.d.ts +8 -4
  5. package/dist/packages/core/src/Extension.d.ts +99 -27
  6. package/dist/packages/core/src/ExtensionManager.d.ts +7 -13
  7. package/dist/packages/core/src/InputRule.d.ts +42 -0
  8. package/dist/packages/core/src/Mark.d.ts +139 -31
  9. package/dist/packages/core/src/Node.d.ts +157 -33
  10. package/dist/packages/core/src/NodeView.d.ts +8 -12
  11. package/dist/packages/core/src/PasteRule.d.ts +42 -0
  12. package/dist/packages/core/src/Tracker.d.ts +11 -0
  13. package/dist/packages/core/src/commands/blur.d.ts +3 -3
  14. package/dist/packages/core/src/commands/clearContent.d.ts +3 -3
  15. package/dist/packages/core/src/commands/clearNodes.d.ts +3 -3
  16. package/dist/packages/core/src/commands/command.d.ts +2 -2
  17. package/dist/packages/core/src/commands/createParagraphNear.d.ts +3 -3
  18. package/dist/packages/core/src/commands/deleteNode.d.ts +13 -0
  19. package/dist/packages/core/src/commands/deleteRange.d.ts +3 -3
  20. package/dist/packages/core/src/commands/deleteSelection.d.ts +3 -3
  21. package/dist/packages/core/src/commands/enter.d.ts +3 -3
  22. package/dist/packages/core/src/commands/exitCode.d.ts +3 -3
  23. package/dist/packages/core/src/commands/extendMarkRange.d.ts +3 -3
  24. package/dist/packages/core/src/commands/first.d.ts +3 -3
  25. package/dist/packages/core/src/commands/focus.d.ts +5 -3
  26. package/dist/packages/core/src/commands/forEach.d.ts +14 -0
  27. package/dist/packages/core/src/commands/index.d.ts +50 -0
  28. package/dist/packages/core/src/commands/insertContent.d.ts +7 -3
  29. package/dist/packages/core/src/commands/insertContentAt.d.ts +16 -0
  30. package/dist/packages/core/src/commands/joinBackward.d.ts +3 -3
  31. package/dist/packages/core/src/commands/joinForward.d.ts +3 -3
  32. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +3 -3
  33. package/dist/packages/core/src/commands/lift.d.ts +3 -3
  34. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +3 -3
  35. package/dist/packages/core/src/commands/liftListItem.d.ts +3 -3
  36. package/dist/packages/core/src/commands/newlineInCode.d.ts +3 -3
  37. package/dist/packages/core/src/commands/resetAttributes.d.ts +4 -4
  38. package/dist/packages/core/src/commands/scrollIntoView.d.ts +3 -3
  39. package/dist/packages/core/src/commands/selectAll.d.ts +3 -3
  40. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +3 -3
  41. package/dist/packages/core/src/commands/selectNodeForward.d.ts +3 -3
  42. package/dist/packages/core/src/commands/selectParentNode.d.ts +3 -3
  43. package/dist/packages/core/src/commands/selectTextblockEnd.d.ts +12 -0
  44. package/dist/packages/core/src/commands/selectTextblockStart.d.ts +12 -0
  45. package/dist/packages/core/src/commands/setContent.d.ts +4 -3
  46. package/dist/packages/core/src/commands/setMark.d.ts +3 -3
  47. package/dist/packages/core/src/commands/setMeta.d.ts +12 -0
  48. package/dist/packages/core/src/commands/setNode.d.ts +3 -3
  49. package/dist/packages/core/src/commands/setNodeSelection.d.ts +12 -0
  50. package/dist/packages/core/src/commands/setTextSelection.d.ts +12 -0
  51. package/dist/packages/core/src/commands/sinkListItem.d.ts +3 -3
  52. package/dist/packages/core/src/commands/splitBlock.d.ts +3 -3
  53. package/dist/packages/core/src/commands/splitListItem.d.ts +3 -3
  54. package/dist/packages/core/src/commands/toggleList.d.ts +3 -3
  55. package/dist/packages/core/src/commands/toggleMark.d.ts +8 -3
  56. package/dist/packages/core/src/commands/toggleNode.d.ts +3 -3
  57. package/dist/packages/core/src/commands/toggleWrap.d.ts +3 -3
  58. package/dist/packages/core/src/commands/undoInputRule.d.ts +3 -3
  59. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +3 -3
  60. package/dist/packages/core/src/commands/unsetMark.d.ts +8 -3
  61. package/dist/packages/core/src/commands/updateAttributes.d.ts +4 -4
  62. package/dist/packages/core/src/commands/wrapIn.d.ts +3 -3
  63. package/dist/packages/core/src/commands/wrapInList.d.ts +3 -3
  64. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
  65. package/dist/packages/core/src/extensions/commands.d.ts +2 -99
  66. package/dist/packages/core/src/extensions/editable.d.ts +1 -1
  67. package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
  68. package/dist/packages/core/src/extensions/index.d.ts +1 -0
  69. package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
  70. package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
  71. package/dist/packages/core/src/helpers/combineTransactionSteps.d.ts +7 -0
  72. package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
  73. package/dist/packages/core/src/helpers/createDocument.d.ts +3 -4
  74. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +4 -5
  75. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
  76. package/dist/packages/core/src/helpers/findChildren.d.ts +3 -0
  77. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +6 -0
  78. package/dist/packages/core/src/helpers/findParentNode.d.ts +2 -3
  79. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +2 -2
  80. package/dist/packages/core/src/helpers/generateHTML.d.ts +2 -2
  81. package/dist/packages/core/src/helpers/generateJSON.d.ts +2 -0
  82. package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
  83. package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -0
  84. package/dist/packages/core/src/helpers/getAttributesFromExtensions.d.ts +2 -2
  85. package/dist/packages/core/src/helpers/getChangedRanges.d.ts +11 -0
  86. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +8 -0
  87. package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -0
  88. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
  89. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +2 -3
  90. package/dist/packages/core/src/helpers/getMarkRange.d.ts +1 -1
  91. package/dist/packages/core/src/helpers/getMarkType.d.ts +1 -1
  92. package/dist/packages/core/src/helpers/getMarksBetween.d.ts +2 -2
  93. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +2 -3
  94. package/dist/packages/core/src/helpers/getNodeType.d.ts +1 -1
  95. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +3 -3
  96. package/dist/packages/core/src/helpers/getSchema.d.ts +1 -1
  97. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +3 -0
  98. package/dist/packages/core/src/helpers/getSchemaTypeByName.d.ts +1 -1
  99. package/dist/packages/core/src/helpers/getSchemaTypeNameByName.d.ts +1 -1
  100. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +2 -2
  101. package/dist/packages/core/src/helpers/getText.d.ts +6 -0
  102. package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
  103. package/dist/packages/core/src/helpers/getTextContentFromNodes.d.ts +2 -0
  104. package/dist/packages/core/src/helpers/getTextSerializersFromSchema.d.ts +3 -0
  105. package/dist/packages/core/src/helpers/index.d.ts +33 -0
  106. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +1 -1
  107. package/dist/packages/core/src/helpers/isActive.d.ts +1 -2
  108. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
  109. package/dist/packages/core/src/helpers/isList.d.ts +1 -1
  110. package/dist/packages/core/src/helpers/isMarkActive.d.ts +2 -3
  111. package/dist/packages/core/src/helpers/isNodeActive.d.ts +2 -3
  112. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +1 -1
  113. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +1 -1
  114. package/dist/packages/core/src/helpers/isTextSelection.d.ts +1 -1
  115. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -0
  116. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +4 -0
  117. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +1 -1
  118. package/dist/packages/core/src/helpers/splitExtensions.d.ts +6 -6
  119. package/dist/packages/core/src/index.d.ts +14 -21
  120. package/dist/packages/core/src/inputRules/index.d.ts +5 -0
  121. package/dist/packages/core/src/inputRules/markInputRule.d.ts +11 -2
  122. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +11 -2
  123. package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
  124. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
  125. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +23 -0
  126. package/dist/packages/core/src/pasteRules/index.d.ts +3 -0
  127. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +11 -2
  128. package/dist/packages/core/src/pasteRules/nodePasteRule.d.ts +12 -0
  129. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
  130. package/dist/packages/core/src/style.d.ts +1 -2
  131. package/dist/packages/core/src/types.d.ts +112 -56
  132. package/dist/packages/core/src/utilities/callOrReturn.d.ts +2 -1
  133. package/dist/packages/core/src/utilities/createStyleTag.d.ts +1 -1
  134. package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -2
  135. package/dist/packages/core/src/utilities/elementFromString.d.ts +1 -1
  136. package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +1 -0
  137. package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
  138. package/dist/packages/core/src/utilities/fromString.d.ts +1 -1
  139. package/dist/packages/core/src/utilities/index.d.ts +3 -0
  140. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
  141. package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
  142. package/dist/packages/core/src/utilities/isMacOS.d.ts +1 -0
  143. package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
  144. package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
  145. package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
  146. package/dist/packages/core/src/utilities/isiOS.d.ts +1 -0
  147. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -2
  148. package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -2
  149. package/dist/packages/core/src/utilities/minMax.d.ts +1 -1
  150. package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -2
  151. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +8 -0
  152. package/dist/tiptap-core.cjs.js +2755 -1460
  153. package/dist/tiptap-core.cjs.js.map +1 -1
  154. package/dist/tiptap-core.esm.js +2709 -1448
  155. package/dist/tiptap-core.esm.js.map +1 -1
  156. package/dist/tiptap-core.umd.js +2731 -1435
  157. package/dist/tiptap-core.umd.js.map +1 -1
  158. package/package.json +16 -20
  159. package/src/CommandManager.ts +64 -65
  160. package/src/Editor.ts +116 -78
  161. package/src/EventEmitter.ts +14 -4
  162. package/src/Extension.ts +193 -43
  163. package/src/ExtensionManager.ts +242 -84
  164. package/src/InputRule.ts +265 -0
  165. package/src/Mark.ts +277 -48
  166. package/src/Node.ts +279 -57
  167. package/src/NodeView.ts +115 -47
  168. package/src/PasteRule.ts +280 -0
  169. package/src/Tracker.ts +42 -0
  170. package/src/commands/blur.ts +12 -6
  171. package/src/commands/clearContent.ts +3 -3
  172. package/src/commands/clearNodes.ts +30 -18
  173. package/src/commands/command.ts +2 -2
  174. package/src/commands/createParagraphNear.ts +4 -3
  175. package/src/commands/deleteNode.ts +37 -0
  176. package/src/commands/deleteRange.ts +3 -3
  177. package/src/commands/deleteSelection.ts +4 -3
  178. package/src/commands/enter.ts +3 -3
  179. package/src/commands/exitCode.ts +4 -3
  180. package/src/commands/extendMarkRange.ts +12 -11
  181. package/src/commands/first.ts +3 -3
  182. package/src/commands/focus.ts +47 -44
  183. package/src/commands/forEach.ts +24 -0
  184. package/src/commands/index.ts +50 -0
  185. package/src/commands/insertContent.ts +13 -24
  186. package/src/commands/insertContentAt.ts +108 -0
  187. package/src/commands/joinBackward.ts +4 -3
  188. package/src/commands/joinForward.ts +4 -3
  189. package/src/commands/keyboardShortcut.ts +6 -6
  190. package/src/commands/lift.ts +6 -5
  191. package/src/commands/liftEmptyBlock.ts +4 -3
  192. package/src/commands/liftListItem.ts +6 -5
  193. package/src/commands/newlineInCode.ts +4 -3
  194. package/src/commands/resetAttributes.ts +9 -8
  195. package/src/commands/scrollIntoView.ts +3 -3
  196. package/src/commands/selectAll.ts +8 -6
  197. package/src/commands/selectNodeBackward.ts +4 -3
  198. package/src/commands/selectNodeForward.ts +4 -3
  199. package/src/commands/selectParentNode.ts +4 -3
  200. package/src/commands/selectTextblockEnd.ts +20 -0
  201. package/src/commands/selectTextblockStart.ts +20 -0
  202. package/src/commands/setContent.ts +9 -15
  203. package/src/commands/setMark.ts +80 -14
  204. package/src/commands/setMeta.ts +18 -0
  205. package/src/commands/setNode.ts +29 -7
  206. package/src/commands/setNodeSelection.ts +27 -0
  207. package/src/commands/setTextSelection.ts +33 -0
  208. package/src/commands/sinkListItem.ts +6 -5
  209. package/src/commands/splitBlock.ts +14 -19
  210. package/src/commands/splitListItem.ts +45 -18
  211. package/src/commands/toggleList.ts +83 -18
  212. package/src/commands/toggleMark.ts +18 -7
  213. package/src/commands/toggleNode.ts +6 -5
  214. package/src/commands/toggleWrap.ts +9 -9
  215. package/src/commands/undoInputRule.ts +34 -5
  216. package/src/commands/unsetAllMarks.ts +7 -11
  217. package/src/commands/unsetMark.ts +35 -22
  218. package/src/commands/updateAttributes.ts +16 -9
  219. package/src/commands/wrapIn.ts +5 -10
  220. package/src/commands/wrapInList.ts +6 -5
  221. package/src/extensions/clipboardTextSerializer.ts +14 -35
  222. package/src/extensions/commands.ts +3 -147
  223. package/src/extensions/editable.ts +1 -0
  224. package/src/extensions/focusEvents.ts +3 -5
  225. package/src/extensions/index.ts +1 -0
  226. package/src/extensions/keymap.ts +110 -13
  227. package/src/extensions/tabindex.ts +18 -0
  228. package/src/helpers/combineTransactionSteps.ts +18 -0
  229. package/src/helpers/createChainableState.ts +38 -0
  230. package/src/helpers/createDocument.ts +5 -6
  231. package/src/helpers/createNodeFromContent.ts +17 -19
  232. package/src/helpers/defaultBlockAt.ts +13 -0
  233. package/src/helpers/findChildren.ts +18 -0
  234. package/src/helpers/findChildrenInRange.ts +32 -0
  235. package/src/helpers/findParentNode.ts +3 -2
  236. package/src/helpers/findParentNodeClosestToPos.ts +3 -2
  237. package/src/helpers/generateHTML.ts +6 -5
  238. package/src/helpers/generateJSON.ts +14 -0
  239. package/src/helpers/generateText.ts +30 -0
  240. package/src/helpers/getAttributes.ts +28 -0
  241. package/src/helpers/getAttributesFromExtensions.ts +42 -14
  242. package/src/helpers/getChangedRanges.ts +83 -0
  243. package/src/helpers/getDebugJSON.ts +54 -0
  244. package/src/helpers/getExtensionField.ts +25 -0
  245. package/src/helpers/getHTMLFromFragment.ts +6 -5
  246. package/src/helpers/getMarkAttributes.ts +14 -10
  247. package/src/helpers/getMarkRange.ts +41 -8
  248. package/src/helpers/getMarkType.ts +5 -1
  249. package/src/helpers/getMarksBetween.ts +32 -10
  250. package/src/helpers/getNodeAttributes.ts +9 -9
  251. package/src/helpers/getNodeType.ts +5 -1
  252. package/src/helpers/getRenderedAttributes.ts +6 -7
  253. package/src/helpers/getSchema.ts +7 -133
  254. package/src/helpers/getSchemaByResolvedExtensions.ts +148 -0
  255. package/src/helpers/getSchemaTypeByName.ts +2 -10
  256. package/src/helpers/getSchemaTypeNameByName.ts +1 -1
  257. package/src/helpers/getSplittedAttributes.ts +4 -4
  258. package/src/helpers/getText.ts +19 -0
  259. package/src/helpers/getTextBetween.ts +49 -0
  260. package/src/helpers/getTextContentFromNodes.ts +21 -0
  261. package/src/helpers/getTextSerializersFromSchema.ts +10 -0
  262. package/src/helpers/index.ts +33 -0
  263. package/src/helpers/injectExtensionAttributesToParseRule.ts +17 -19
  264. package/src/helpers/isActive.ts +5 -5
  265. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  266. package/src/helpers/isList.ts +14 -7
  267. package/src/helpers/isMarkActive.ts +45 -20
  268. package/src/helpers/isNodeActive.ts +28 -35
  269. package/src/helpers/isNodeEmpty.ts +1 -1
  270. package/src/helpers/isNodeSelection.ts +2 -3
  271. package/src/helpers/isTextSelection.ts +2 -3
  272. package/src/helpers/posToDOMRect.ts +35 -0
  273. package/src/helpers/resolveFocusPosition.ts +43 -0
  274. package/src/helpers/selectionToInsertionEnd.ts +2 -2
  275. package/src/helpers/splitExtensions.ts +3 -3
  276. package/src/index.ts +15 -24
  277. package/src/inputRules/index.ts +5 -0
  278. package/src/inputRules/markInputRule.ts +59 -39
  279. package/src/inputRules/nodeInputRule.ts +45 -11
  280. package/src/inputRules/textInputRule.ts +35 -0
  281. package/src/inputRules/textblockTypeInputRule.ts +38 -0
  282. package/src/inputRules/wrappingInputRule.ts +60 -0
  283. package/src/pasteRules/index.ts +3 -0
  284. package/src/pasteRules/markPasteRule.ts +62 -53
  285. package/src/pasteRules/nodePasteRule.ts +39 -0
  286. package/src/pasteRules/textPasteRule.ts +35 -0
  287. package/src/style.ts +16 -3
  288. package/src/types.ts +129 -43
  289. package/src/utilities/callOrReturn.ts +6 -3
  290. package/src/utilities/createStyleTag.ts +12 -1
  291. package/src/utilities/deleteProps.ts +2 -4
  292. package/src/utilities/elementFromString.ts +4 -5
  293. package/src/utilities/escapeForRegEx.ts +4 -0
  294. package/src/utilities/findDuplicates.ts +5 -0
  295. package/src/utilities/fromString.ts +2 -2
  296. package/src/utilities/index.ts +3 -0
  297. package/src/utilities/isEmptyObject.ts +2 -2
  298. package/src/utilities/isFunction.ts +3 -0
  299. package/src/utilities/isMacOS.ts +5 -0
  300. package/src/utilities/isNumber.ts +3 -0
  301. package/src/utilities/isPlainObject.ts +8 -5
  302. package/src/utilities/isRegExp.ts +3 -0
  303. package/src/utilities/isString.ts +3 -0
  304. package/src/utilities/isiOS.ts +12 -0
  305. package/src/utilities/mergeAttributes.ts +2 -3
  306. package/src/utilities/mergeDeep.ts +2 -3
  307. package/src/utilities/minMax.ts +1 -1
  308. package/src/utilities/objectIncludes.ts +17 -5
  309. package/src/utilities/removeDuplicates.ts +15 -0
  310. package/CHANGELOG.md +0 -357
  311. package/LICENSE.md +0 -21
  312. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  313. package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
  314. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  315. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  316. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  317. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  318. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  319. package/dist/packages/core/src/utilities/isClass.d.ts +0 -1
  320. package/dist/packages/core/src/utilities/isObject.d.ts +0 -1
  321. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  322. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  323. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  324. package/src/commands/insertHTML.ts +0 -30
  325. package/src/commands/insertNode.ts +0 -33
  326. package/src/commands/insertText.ts +0 -22
  327. package/src/commands/replace.ts +0 -20
  328. package/src/commands/replaceRange.ts +0 -36
  329. package/src/commands/resetNodeAttributes.ts +0 -33
  330. package/src/commands/updateNodeAttributes.ts +0 -35
  331. package/src/utilities/isClass.ts +0 -7
  332. package/src/utilities/isObject.ts +0 -10
  333. package/src/utilities/removeElement.ts +0 -5
@@ -0,0 +1,28 @@
1
+ import { MarkType, NodeType } from 'prosemirror-model'
2
+ import { EditorState } from 'prosemirror-state'
3
+
4
+ import { getMarkAttributes } from './getMarkAttributes'
5
+ import { getNodeAttributes } from './getNodeAttributes'
6
+ import { getSchemaTypeNameByName } from './getSchemaTypeNameByName'
7
+
8
+ export function getAttributes(
9
+ state: EditorState,
10
+ typeOrName: string | NodeType | MarkType,
11
+ ): Record<string, any> {
12
+ const schemaType = getSchemaTypeNameByName(
13
+ typeof typeOrName === 'string'
14
+ ? typeOrName
15
+ : typeOrName.name,
16
+ state.schema,
17
+ )
18
+
19
+ if (schemaType === 'node') {
20
+ return getNodeAttributes(state, typeOrName as NodeType)
21
+ }
22
+
23
+ if (schemaType === 'mark') {
24
+ return getMarkAttributes(state, typeOrName as MarkType)
25
+ }
26
+
27
+ return {}
28
+ }
@@ -1,17 +1,20 @@
1
- import splitExtensions from './splitExtensions'
1
+ import { MarkConfig, NodeConfig } from '..'
2
2
  import {
3
- Extensions,
4
- GlobalAttributes,
5
- Attributes,
3
+ AnyConfig,
6
4
  Attribute,
5
+ Attributes,
7
6
  ExtensionAttribute,
7
+ Extensions,
8
+ GlobalAttributes,
8
9
  } from '../types'
10
+ import { getExtensionField } from './getExtensionField'
11
+ import { splitExtensions } from './splitExtensions'
9
12
 
10
13
  /**
11
14
  * Get a list of all extension attributes defined in `addAttribute` and `addGlobalAttribute`.
12
15
  * @param extensions List of extensions
13
16
  */
14
- export default function getAttributesFromExtensions(extensions: Extensions): ExtensionAttribute[] {
17
+ export function getAttributesFromExtensions(extensions: Extensions): ExtensionAttribute[] {
15
18
  const extensionAttributes: ExtensionAttribute[] = []
16
19
  const { nodeExtensions, markExtensions } = splitExtensions(extensions)
17
20
  const nodeAndMarkExtensions = [...nodeExtensions, ...markExtensions]
@@ -21,18 +24,28 @@ export default function getAttributesFromExtensions(extensions: Extensions): Ext
21
24
  renderHTML: null,
22
25
  parseHTML: null,
23
26
  keepOnSplit: true,
27
+ isRequired: false,
24
28
  }
25
29
 
26
30
  extensions.forEach(extension => {
27
31
  const context = {
32
+ name: extension.name,
28
33
  options: extension.options,
34
+ storage: extension.storage,
29
35
  }
30
36
 
31
- if (!extension.config.addGlobalAttributes) {
37
+ const addGlobalAttributes = getExtensionField<AnyConfig['addGlobalAttributes']>(
38
+ extension,
39
+ 'addGlobalAttributes',
40
+ context,
41
+ )
42
+
43
+ if (!addGlobalAttributes) {
32
44
  return
33
45
  }
34
46
 
35
- const globalAttributes = extension.config.addGlobalAttributes.bind(context)() as GlobalAttributes
47
+ // TODO: remove `as GlobalAttributes`
48
+ const globalAttributes = addGlobalAttributes() as GlobalAttributes
36
49
 
37
50
  globalAttributes.forEach(globalAttribute => {
38
51
  globalAttribute.types.forEach(type => {
@@ -54,25 +67,40 @@ export default function getAttributesFromExtensions(extensions: Extensions): Ext
54
67
 
55
68
  nodeAndMarkExtensions.forEach(extension => {
56
69
  const context = {
70
+ name: extension.name,
57
71
  options: extension.options,
72
+ storage: extension.storage,
58
73
  }
59
74
 
60
- if (!extension.config.addAttributes) {
75
+ const addAttributes = getExtensionField<NodeConfig['addAttributes'] | MarkConfig['addAttributes']>(
76
+ extension,
77
+ 'addAttributes',
78
+ context,
79
+ )
80
+
81
+ if (!addAttributes) {
61
82
  return
62
83
  }
63
84
 
64
- const attributes = extension.config.addAttributes.bind(context)() as Attributes
85
+ // TODO: remove `as Attributes`
86
+ const attributes = addAttributes() as Attributes
65
87
 
66
88
  Object
67
89
  .entries(attributes)
68
90
  .forEach(([name, attribute]) => {
91
+ const mergedAttr = {
92
+ ...defaultAttribute,
93
+ ...attribute,
94
+ }
95
+
96
+ if (attribute?.isRequired && attribute?.default === undefined) {
97
+ delete mergedAttr.default
98
+ }
99
+
69
100
  extensionAttributes.push({
70
- type: extension.config.name,
101
+ type: extension.name,
71
102
  name,
72
- attribute: {
73
- ...defaultAttribute,
74
- ...attribute,
75
- },
103
+ attribute: mergedAttr,
76
104
  })
77
105
  })
78
106
  })
@@ -0,0 +1,83 @@
1
+ import { Step, Transform } from 'prosemirror-transform'
2
+
3
+ import { Range } from '../types'
4
+ import { removeDuplicates } from '../utilities/removeDuplicates'
5
+
6
+ export type ChangedRange = {
7
+ oldRange: Range,
8
+ newRange: Range,
9
+ }
10
+
11
+ /**
12
+ * Removes duplicated ranges and ranges that are
13
+ * fully captured by other ranges.
14
+ */
15
+ function simplifyChangedRanges(changes: ChangedRange[]): ChangedRange[] {
16
+ const uniqueChanges = removeDuplicates(changes)
17
+
18
+ return uniqueChanges.length === 1
19
+ ? uniqueChanges
20
+ : uniqueChanges.filter((change, index) => {
21
+ const rest = uniqueChanges.filter((_, i) => i !== index)
22
+
23
+ return !rest.some(otherChange => {
24
+ return change.oldRange.from >= otherChange.oldRange.from
25
+ && change.oldRange.to <= otherChange.oldRange.to
26
+ && change.newRange.from >= otherChange.newRange.from
27
+ && change.newRange.to <= otherChange.newRange.to
28
+ })
29
+ })
30
+ }
31
+
32
+ /**
33
+ * Returns a list of changed ranges
34
+ * based on the first and last state of all steps.
35
+ */
36
+ export function getChangedRanges(transform: Transform): ChangedRange[] {
37
+ const { mapping, steps } = transform
38
+ const changes: ChangedRange[] = []
39
+
40
+ mapping.maps.forEach((stepMap, index) => {
41
+ const ranges: Range[] = []
42
+
43
+ // This accounts for step changes where no range was actually altered
44
+ // e.g. when setting a mark, node attribute, etc.
45
+ // @ts-ignore
46
+ if (!stepMap.ranges.length) {
47
+ const { from, to } = steps[index] as Step & {
48
+ from?: number,
49
+ to?: number,
50
+ }
51
+
52
+ if (from === undefined || to === undefined) {
53
+ return
54
+ }
55
+
56
+ ranges.push({ from, to })
57
+ } else {
58
+ stepMap.forEach((from, to) => {
59
+ ranges.push({ from, to })
60
+ })
61
+ }
62
+
63
+ ranges.forEach(({ from, to }) => {
64
+ const newStart = mapping.slice(index).map(from, -1)
65
+ const newEnd = mapping.slice(index).map(to)
66
+ const oldStart = mapping.invert().map(newStart, -1)
67
+ const oldEnd = mapping.invert().map(newEnd)
68
+
69
+ changes.push({
70
+ oldRange: {
71
+ from: oldStart,
72
+ to: oldEnd,
73
+ },
74
+ newRange: {
75
+ from: newStart,
76
+ to: newEnd,
77
+ },
78
+ })
79
+ })
80
+ })
81
+
82
+ return simplifyChangedRanges(changes)
83
+ }
@@ -0,0 +1,54 @@
1
+ import { Node as ProseMirrorNode } from 'prosemirror-model'
2
+
3
+ import { JSONContent } from '../types'
4
+
5
+ interface DebugJSONContent extends JSONContent {
6
+ from: number,
7
+ to: number,
8
+ }
9
+
10
+ export function getDebugJSON(node: ProseMirrorNode, startOffset = 0): DebugJSONContent {
11
+ const isTopNode = node.type === node.type.schema.topNodeType
12
+ const increment = isTopNode ? 0 : 1
13
+ const from = startOffset
14
+ const to = from + node.nodeSize
15
+ const marks = node.marks.map(mark => {
16
+ const output: { type: string, attrs?: Record<string, any> } = {
17
+ type: mark.type.name,
18
+ }
19
+
20
+ if (Object.keys(mark.attrs).length) {
21
+ output.attrs = { ...mark.attrs }
22
+ }
23
+
24
+ return output
25
+ })
26
+ const attrs = { ...node.attrs }
27
+ const output: DebugJSONContent = {
28
+ type: node.type.name,
29
+ from,
30
+ to,
31
+ }
32
+
33
+ if (Object.keys(attrs).length) {
34
+ output.attrs = attrs
35
+ }
36
+
37
+ if (marks.length) {
38
+ output.marks = marks
39
+ }
40
+
41
+ if (node.content.childCount) {
42
+ output.content = []
43
+
44
+ node.forEach((child, offset) => {
45
+ output.content?.push(getDebugJSON(child, startOffset + offset + increment))
46
+ })
47
+ }
48
+
49
+ if (node.text) {
50
+ output.text = node.text
51
+ }
52
+
53
+ return output
54
+ }
@@ -0,0 +1,25 @@
1
+ import { AnyExtension, MaybeThisParameterType, RemoveThis } from '../types'
2
+
3
+ export function getExtensionField<T = any>(
4
+ extension: AnyExtension,
5
+ field: string,
6
+ context?: Omit<MaybeThisParameterType<T>, 'parent'>,
7
+ ): RemoveThis<T> {
8
+
9
+ if (extension.config[field] === undefined && extension.parent) {
10
+ return getExtensionField(extension.parent, field, context)
11
+ }
12
+
13
+ if (typeof extension.config[field] === 'function') {
14
+ const value = extension.config[field].bind({
15
+ ...context,
16
+ parent: extension.parent
17
+ ? getExtensionField(extension.parent, field, context)
18
+ : null,
19
+ })
20
+
21
+ return value
22
+ }
23
+
24
+ return extension.config[field]
25
+ }
@@ -1,13 +1,14 @@
1
- import { Node, DOMSerializer, Schema } from 'prosemirror-model'
1
+ import { DOMSerializer, Fragment, Schema } from 'prosemirror-model'
2
2
 
3
- export default function getHTMLFromFragment(doc: Node, schema: Schema): string {
4
- const fragment = DOMSerializer
3
+ export function getHTMLFromFragment(fragment: Fragment, schema: Schema): string {
4
+ const documentFragment = DOMSerializer
5
5
  .fromSchema(schema)
6
- .serializeFragment(doc.content)
6
+ .serializeFragment(fragment)
7
7
 
8
8
  const temporaryDocument = document.implementation.createHTMLDocument()
9
9
  const container = temporaryDocument.createElement('div')
10
- container.appendChild(fragment)
10
+
11
+ container.appendChild(documentFragment)
11
12
 
12
13
  return container.innerHTML
13
14
  }
@@ -1,26 +1,30 @@
1
- import { EditorState } from 'prosemirror-state'
2
1
  import { Mark, MarkType } from 'prosemirror-model'
3
- import getMarkType from './getMarkType'
4
- import { AnyObject } from '../types'
2
+ import { EditorState } from 'prosemirror-state'
5
3
 
6
- export default function getMarkAttributes(state: EditorState, typeOrName: string | MarkType): AnyObject {
4
+ import { getMarkType } from './getMarkType'
5
+
6
+ export function getMarkAttributes(state: EditorState, typeOrName: string | MarkType): Record<string, any> {
7
7
  const type = getMarkType(typeOrName, state.schema)
8
8
  const { from, to, empty } = state.selection
9
- let marks: Mark[] = []
9
+ const marks: Mark[] = []
10
10
 
11
11
  if (empty) {
12
- marks = state.selection.$head.marks()
12
+ if (state.storedMarks) {
13
+ marks.push(...state.storedMarks)
14
+ }
15
+
16
+ marks.push(...state.selection.$head.marks())
13
17
  } else {
14
18
  state.doc.nodesBetween(from, to, node => {
15
- marks = [...marks, ...node.marks]
19
+ marks.push(...node.marks)
16
20
  })
17
21
  }
18
22
 
19
23
  const mark = marks.find(markItem => markItem.type.name === type.name)
20
24
 
21
- if (mark) {
22
- return { ...mark.attrs }
25
+ if (!mark) {
26
+ return {}
23
27
  }
24
28
 
25
- return {}
29
+ return { ...mark.attrs }
26
30
  }
@@ -1,34 +1,67 @@
1
- import { MarkType, ResolvedPos } from 'prosemirror-model'
1
+ import { Mark as ProseMirrorMark, MarkType, ResolvedPos } from 'prosemirror-model'
2
+
2
3
  import { Range } from '../types'
4
+ import { objectIncludes } from '../utilities/objectIncludes'
5
+
6
+ function findMarkInSet(
7
+ marks: ProseMirrorMark[],
8
+ type: MarkType,
9
+ attributes: Record<string, any> = {},
10
+ ): ProseMirrorMark | undefined {
11
+ return marks.find(item => {
12
+ return item.type === type && objectIncludes(item.attrs, attributes)
13
+ })
14
+ }
15
+
16
+ function isMarkInSet(
17
+ marks: ProseMirrorMark[],
18
+ type: MarkType,
19
+ attributes: Record<string, any> = {},
20
+ ): boolean {
21
+ return !!findMarkInSet(marks, type, attributes)
22
+ }
3
23
 
4
- export default function getMarkRange($pos: ResolvedPos, type: MarkType): Range | void {
24
+ export function getMarkRange(
25
+ $pos: ResolvedPos,
26
+ type: MarkType,
27
+ attributes: Record<string, any> = {},
28
+ ): Range | void {
5
29
  if (!$pos || !type) {
6
30
  return
7
31
  }
8
32
 
9
- const start = $pos.parent.childAfter($pos.parentOffset)
33
+ let start = $pos.parent.childAfter($pos.parentOffset)
34
+
35
+ if ($pos.parentOffset === start.offset && start.offset !== 0) {
36
+ start = $pos.parent.childBefore($pos.parentOffset)
37
+ }
10
38
 
11
39
  if (!start.node) {
12
40
  return
13
41
  }
14
42
 
15
- const link = start.node.marks.find(mark => mark.type === type)
43
+ const mark = findMarkInSet([...start.node.marks], type, attributes)
16
44
 
17
- if (!link) {
45
+ if (!mark) {
18
46
  return
19
47
  }
20
48
 
21
- let startIndex = $pos.index()
49
+ let startIndex = start.index
22
50
  let startPos = $pos.start() + start.offset
23
51
  let endIndex = startIndex + 1
24
52
  let endPos = startPos + start.node.nodeSize
25
53
 
26
- while (startIndex > 0 && link.isInSet($pos.parent.child(startIndex - 1).marks)) {
54
+ findMarkInSet([...start.node.marks], type, attributes)
55
+
56
+ while (startIndex > 0 && mark.isInSet($pos.parent.child(startIndex - 1).marks)) {
27
57
  startIndex -= 1
28
58
  startPos -= $pos.parent.child(startIndex).nodeSize
29
59
  }
30
60
 
31
- while (endIndex < $pos.parent.childCount && link.isInSet($pos.parent.child(endIndex).marks)) {
61
+ while (
62
+ endIndex < $pos.parent.childCount
63
+ && isMarkInSet([...$pos.parent.child(endIndex).marks], type, attributes)
64
+ ) {
32
65
  endPos += $pos.parent.child(endIndex).nodeSize
33
66
  endIndex += 1
34
67
  }
@@ -1,7 +1,11 @@
1
1
  import { MarkType, Schema } from 'prosemirror-model'
2
2
 
3
- export default function getMarkType(nameOrType: string | MarkType, schema: Schema): MarkType {
3
+ export function getMarkType(nameOrType: string | MarkType, schema: Schema): MarkType {
4
4
  if (typeof nameOrType === 'string') {
5
+ if (!schema.marks[nameOrType]) {
6
+ throw Error(`There is no mark type named '${nameOrType}'. Maybe you forgot to add the extension?`)
7
+ }
8
+
5
9
  return schema.marks[nameOrType]
6
10
  }
7
11
 
@@ -1,16 +1,38 @@
1
- import { EditorState } from 'prosemirror-state'
1
+ import { Node as ProseMirrorNode } from 'prosemirror-model'
2
+
2
3
  import { MarkRange } from '../types'
4
+ import { getMarkRange } from './getMarkRange'
5
+
6
+ export function getMarksBetween(from: number, to: number, doc: ProseMirrorNode): MarkRange[] {
7
+ const marks: MarkRange[] = []
8
+
9
+ // get all inclusive marks on empty selection
10
+ if (from === to) {
11
+ doc
12
+ .resolve(from)
13
+ .marks()
14
+ .forEach(mark => {
15
+ const $pos = doc.resolve(from - 1)
16
+ const range = getMarkRange($pos, mark.type)
3
17
 
4
- export default function getMarksBetween(from: number, to: number, state: EditorState): MarkRange[] {
5
- let marks: MarkRange[] = []
18
+ if (!range) {
19
+ return
20
+ }
6
21
 
7
- state.doc.nodesBetween(from, to, (node, pos) => {
8
- marks = [...marks, ...node.marks.map(mark => ({
9
- from: pos,
10
- to: pos + node.nodeSize,
11
- mark,
12
- }))]
13
- })
22
+ marks.push({
23
+ mark,
24
+ ...range,
25
+ })
26
+ })
27
+ } else {
28
+ doc.nodesBetween(from, to, (node, pos) => {
29
+ marks.push(...node.marks.map(mark => ({
30
+ from: pos,
31
+ to: pos + node.nodeSize,
32
+ mark,
33
+ })))
34
+ })
35
+ }
14
36
 
15
37
  return marks
16
38
  }
@@ -1,24 +1,24 @@
1
- import { EditorState } from 'prosemirror-state'
2
1
  import { Node, NodeType } from 'prosemirror-model'
3
- import getNodeType from './getNodeType'
4
- import { AnyObject } from '../types'
2
+ import { EditorState } from 'prosemirror-state'
3
+
4
+ import { getNodeType } from './getNodeType'
5
5
 
6
- export default function getNodeAttributes(state: EditorState, typeOrName: string | NodeType): AnyObject {
6
+ export function getNodeAttributes(state: EditorState, typeOrName: string | NodeType): Record<string, any> {
7
7
  const type = getNodeType(typeOrName, state.schema)
8
8
  const { from, to } = state.selection
9
- let nodes: Node[] = []
9
+ const nodes: Node[] = []
10
10
 
11
11
  state.doc.nodesBetween(from, to, node => {
12
- nodes = [...nodes, node]
12
+ nodes.push(node)
13
13
  })
14
14
 
15
15
  const node = nodes
16
16
  .reverse()
17
17
  .find(nodeItem => nodeItem.type.name === type.name)
18
18
 
19
- if (node) {
20
- return { ...node.attrs }
19
+ if (!node) {
20
+ return {}
21
21
  }
22
22
 
23
- return {}
23
+ return { ...node.attrs }
24
24
  }
@@ -1,7 +1,11 @@
1
1
  import { NodeType, Schema } from 'prosemirror-model'
2
2
 
3
- export default function getNodeType(nameOrType: string | NodeType, schema: Schema): NodeType {
3
+ export function getNodeType(nameOrType: string | NodeType, schema: Schema): NodeType {
4
4
  if (typeof nameOrType === 'string') {
5
+ if (!schema.nodes[nameOrType]) {
6
+ throw Error(`There is no node type named '${nameOrType}'. Maybe you forgot to add the extension?`)
7
+ }
8
+
5
9
  return schema.nodes[nameOrType]
6
10
  }
7
11
 
@@ -1,8 +1,9 @@
1
- import { Node, Mark } from 'prosemirror-model'
2
- import { ExtensionAttribute, AnyObject } from '../types'
3
- import mergeAttributes from '../utilities/mergeAttributes'
1
+ import { Mark, Node } from 'prosemirror-model'
4
2
 
5
- export default function getRenderedAttributes(nodeOrMark: Node | Mark, extensionAttributes: ExtensionAttribute[]): AnyObject {
3
+ import { ExtensionAttribute } from '../types'
4
+ import { mergeAttributes } from '../utilities/mergeAttributes'
5
+
6
+ export function getRenderedAttributes(nodeOrMark: Node | Mark, extensionAttributes: ExtensionAttribute[]): Record<string, any> {
6
7
  return extensionAttributes
7
8
  .filter(item => item.attribute.rendered)
8
9
  .map(item => {
@@ -14,7 +15,5 @@ export default function getRenderedAttributes(nodeOrMark: Node | Mark, extension
14
15
 
15
16
  return item.attribute.renderHTML(nodeOrMark.attrs) || {}
16
17
  })
17
- .reduce((attributes, attribute) => {
18
- return mergeAttributes(attributes, attribute)
19
- }, {})
18
+ .reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {})
20
19
  }