@tiptap/core 2.0.0-beta.14 → 2.0.0-beta.143

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 (274) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +2 -2
  3. package/dist/packages/core/src/CommandManager.d.ts +12 -5
  4. package/dist/packages/core/src/Editor.d.ts +19 -20
  5. package/dist/packages/core/src/EventEmitter.d.ts +8 -4
  6. package/dist/packages/core/src/Extension.d.ts +102 -26
  7. package/dist/packages/core/src/ExtensionManager.d.ts +6 -11
  8. package/dist/packages/core/src/InputRule.d.ts +42 -0
  9. package/dist/packages/core/src/Mark.d.ts +134 -30
  10. package/dist/packages/core/src/Node.d.ts +151 -32
  11. package/dist/packages/core/src/NodeView.d.ts +5 -9
  12. package/dist/packages/core/src/PasteRule.d.ts +42 -0
  13. package/dist/packages/core/src/Tracker.d.ts +11 -0
  14. package/dist/packages/core/src/commands/blur.d.ts +3 -3
  15. package/dist/packages/core/src/commands/clearContent.d.ts +3 -3
  16. package/dist/packages/core/src/commands/clearNodes.d.ts +3 -3
  17. package/dist/packages/core/src/commands/command.d.ts +2 -2
  18. package/dist/packages/core/src/commands/createParagraphNear.d.ts +3 -3
  19. package/dist/packages/core/src/commands/deleteNode.d.ts +13 -0
  20. package/dist/packages/core/src/commands/deleteRange.d.ts +3 -3
  21. package/dist/packages/core/src/commands/deleteSelection.d.ts +3 -3
  22. package/dist/packages/core/src/commands/enter.d.ts +3 -3
  23. package/dist/packages/core/src/commands/exitCode.d.ts +3 -3
  24. package/dist/packages/core/src/commands/extendMarkRange.d.ts +3 -3
  25. package/dist/packages/core/src/commands/first.d.ts +3 -3
  26. package/dist/packages/core/src/commands/focus.d.ts +5 -3
  27. package/dist/packages/core/src/commands/forEach.d.ts +14 -0
  28. package/dist/packages/core/src/commands/insertContent.d.ts +16 -0
  29. package/dist/packages/core/src/commands/insertContentAt.d.ts +16 -0
  30. package/dist/packages/core/src/commands/joinBackward.d.ts +3 -3
  31. package/dist/packages/core/src/commands/joinForward.d.ts +3 -3
  32. package/dist/packages/core/src/commands/keyboardShortcut.d.ts +3 -3
  33. package/dist/packages/core/src/commands/lift.d.ts +3 -3
  34. package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +3 -3
  35. package/dist/packages/core/src/commands/liftListItem.d.ts +3 -3
  36. package/dist/packages/core/src/commands/newlineInCode.d.ts +3 -3
  37. package/dist/packages/core/src/commands/resetAttributes.d.ts +13 -0
  38. package/dist/packages/core/src/commands/scrollIntoView.d.ts +3 -3
  39. package/dist/packages/core/src/commands/selectAll.d.ts +3 -3
  40. package/dist/packages/core/src/commands/selectNodeBackward.d.ts +3 -3
  41. package/dist/packages/core/src/commands/selectNodeForward.d.ts +3 -3
  42. package/dist/packages/core/src/commands/selectParentNode.d.ts +3 -3
  43. package/dist/packages/core/src/commands/setContent.d.ts +4 -3
  44. package/dist/packages/core/src/commands/setMark.d.ts +3 -3
  45. package/dist/packages/core/src/commands/setMeta.d.ts +12 -0
  46. package/dist/packages/core/src/commands/setNode.d.ts +3 -3
  47. package/dist/packages/core/src/commands/setNodeSelection.d.ts +12 -0
  48. package/dist/packages/core/src/commands/setTextSelection.d.ts +12 -0
  49. package/dist/packages/core/src/commands/sinkListItem.d.ts +3 -3
  50. package/dist/packages/core/src/commands/splitBlock.d.ts +3 -3
  51. package/dist/packages/core/src/commands/splitListItem.d.ts +3 -3
  52. package/dist/packages/core/src/commands/toggleList.d.ts +3 -3
  53. package/dist/packages/core/src/commands/toggleMark.d.ts +8 -3
  54. package/dist/packages/core/src/commands/toggleNode.d.ts +3 -3
  55. package/dist/packages/core/src/commands/toggleWrap.d.ts +3 -3
  56. package/dist/packages/core/src/commands/undoInputRule.d.ts +3 -3
  57. package/dist/packages/core/src/commands/unsetAllMarks.d.ts +3 -3
  58. package/dist/packages/core/src/commands/unsetMark.d.ts +8 -3
  59. package/dist/packages/core/src/commands/updateAttributes.d.ts +13 -0
  60. package/dist/packages/core/src/commands/wrapIn.d.ts +3 -3
  61. package/dist/packages/core/src/commands/wrapInList.d.ts +3 -3
  62. package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
  63. package/dist/packages/core/src/extensions/commands.d.ts +19 -15
  64. package/dist/packages/core/src/extensions/editable.d.ts +1 -1
  65. package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
  66. package/dist/packages/core/src/extensions/index.d.ts +1 -0
  67. package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
  68. package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
  69. package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
  70. package/dist/packages/core/src/helpers/createDocument.d.ts +3 -0
  71. package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +7 -0
  72. package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
  73. package/dist/packages/core/src/helpers/findChildren.d.ts +3 -0
  74. package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +6 -0
  75. package/dist/packages/core/src/helpers/generateHTML.d.ts +2 -2
  76. package/dist/packages/core/src/helpers/generateJSON.d.ts +2 -0
  77. package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
  78. package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -0
  79. package/dist/packages/core/src/helpers/getDebugJSON.d.ts +8 -0
  80. package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -0
  81. package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
  82. package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +1 -2
  83. package/dist/packages/core/src/helpers/getMarkRange.d.ts +1 -1
  84. package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +1 -2
  85. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +2 -2
  86. package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +3 -0
  87. package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +2 -2
  88. package/dist/packages/core/src/helpers/getText.d.ts +6 -0
  89. package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
  90. package/dist/packages/core/src/helpers/getTextSeralizersFromSchema.d.ts +3 -0
  91. package/dist/packages/core/src/helpers/isActive.d.ts +1 -2
  92. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
  93. package/dist/packages/core/src/helpers/isMarkActive.d.ts +1 -2
  94. package/dist/packages/core/src/helpers/isNodeActive.d.ts +1 -2
  95. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -0
  96. package/dist/packages/core/src/helpers/splitExtensions.d.ts +3 -3
  97. package/dist/packages/core/src/index.d.ts +33 -5
  98. package/dist/packages/core/src/inputRules/markInputRule.d.ts +11 -2
  99. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +11 -2
  100. package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
  101. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
  102. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +23 -0
  103. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +11 -2
  104. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
  105. package/dist/packages/core/src/style.d.ts +1 -1
  106. package/dist/packages/core/src/types.d.ts +105 -52
  107. package/dist/packages/core/src/utilities/callOrReturn.d.ts +2 -1
  108. package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -2
  109. package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
  110. package/dist/packages/core/src/utilities/isClass.d.ts +1 -1
  111. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
  112. package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
  113. package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
  114. package/dist/packages/core/src/utilities/isObject.d.ts +1 -1
  115. package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
  116. package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
  117. package/dist/packages/core/src/utilities/isiOS.d.ts +1 -0
  118. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -2
  119. package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -2
  120. package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -2
  121. package/dist/tiptap-core.cjs.js +2723 -1455
  122. package/dist/tiptap-core.cjs.js.map +1 -1
  123. package/dist/tiptap-core.esm.js +3172 -1931
  124. package/dist/tiptap-core.esm.js.map +1 -1
  125. package/dist/tiptap-core.umd.js +3292 -2023
  126. package/dist/tiptap-core.umd.js.map +1 -1
  127. package/package.json +19 -16
  128. package/src/CommandManager.ts +59 -61
  129. package/src/Editor.ts +91 -95
  130. package/src/EventEmitter.ts +14 -4
  131. package/src/Extension.ts +202 -40
  132. package/src/ExtensionManager.ts +234 -70
  133. package/src/InputRule.ts +268 -0
  134. package/src/Mark.ts +248 -46
  135. package/src/Node.ts +275 -51
  136. package/src/NodeView.ts +105 -42
  137. package/src/PasteRule.ts +215 -0
  138. package/src/Tracker.ts +42 -0
  139. package/src/commands/blur.ts +9 -7
  140. package/src/commands/clearContent.ts +3 -3
  141. package/src/commands/clearNodes.ts +25 -19
  142. package/src/commands/command.ts +2 -2
  143. package/src/commands/createParagraphNear.ts +3 -3
  144. package/src/commands/deleteNode.ts +36 -0
  145. package/src/commands/deleteRange.ts +3 -3
  146. package/src/commands/deleteSelection.ts +3 -3
  147. package/src/commands/enter.ts +3 -3
  148. package/src/commands/exitCode.ts +3 -3
  149. package/src/commands/extendMarkRange.ts +8 -8
  150. package/src/commands/first.ts +3 -3
  151. package/src/commands/focus.ts +54 -12
  152. package/src/commands/forEach.ts +24 -0
  153. package/src/commands/insertContent.ts +23 -0
  154. package/src/commands/insertContentAt.ts +93 -0
  155. package/src/commands/joinBackward.ts +3 -3
  156. package/src/commands/joinForward.ts +3 -3
  157. package/src/commands/keyboardShortcut.ts +3 -3
  158. package/src/commands/lift.ts +3 -3
  159. package/src/commands/liftEmptyBlock.ts +3 -3
  160. package/src/commands/liftListItem.ts +3 -3
  161. package/src/commands/newlineInCode.ts +3 -3
  162. package/src/commands/resetAttributes.ts +61 -0
  163. package/src/commands/scrollIntoView.ts +3 -3
  164. package/src/commands/selectAll.ts +8 -6
  165. package/src/commands/selectNodeBackward.ts +3 -3
  166. package/src/commands/selectNodeForward.ts +3 -3
  167. package/src/commands/selectParentNode.ts +3 -3
  168. package/src/commands/setContent.ts +10 -5
  169. package/src/commands/setMark.ts +33 -10
  170. package/src/commands/setMeta.ts +18 -0
  171. package/src/commands/setNode.ts +3 -3
  172. package/src/commands/setNodeSelection.ts +28 -0
  173. package/src/commands/setTextSelection.ts +32 -0
  174. package/src/commands/sinkListItem.ts +3 -3
  175. package/src/commands/splitBlock.ts +13 -8
  176. package/src/commands/splitListItem.ts +39 -13
  177. package/src/commands/toggleList.ts +4 -4
  178. package/src/commands/toggleMark.ts +15 -5
  179. package/src/commands/toggleNode.ts +3 -3
  180. package/src/commands/toggleWrap.ts +3 -3
  181. package/src/commands/undoInputRule.ts +33 -5
  182. package/src/commands/unsetAllMarks.ts +3 -3
  183. package/src/commands/unsetMark.ts +32 -20
  184. package/src/commands/updateAttributes.ts +72 -0
  185. package/src/commands/wrapIn.ts +3 -3
  186. package/src/commands/wrapInList.ts +3 -3
  187. package/src/extensions/clipboardTextSerializer.ts +11 -35
  188. package/src/extensions/commands.ts +27 -21
  189. package/src/extensions/focusEvents.ts +0 -3
  190. package/src/extensions/index.ts +1 -0
  191. package/src/extensions/keymap.ts +6 -6
  192. package/src/extensions/tabindex.ts +19 -0
  193. package/src/helpers/createChainableState.ts +37 -0
  194. package/src/helpers/createDocument.ts +11 -0
  195. package/src/helpers/createNodeFromContent.ts +56 -0
  196. package/src/helpers/defaultBlockAt.ts +13 -0
  197. package/src/helpers/findChildren.ts +17 -0
  198. package/src/helpers/findChildrenInRange.ts +31 -0
  199. package/src/helpers/generateHTML.ts +3 -3
  200. package/src/helpers/generateJSON.ts +13 -0
  201. package/src/helpers/generateText.ts +29 -0
  202. package/src/helpers/getAttributes.ts +27 -0
  203. package/src/helpers/getAttributesFromExtensions.ts +26 -5
  204. package/src/helpers/getDebugJSON.ts +46 -0
  205. package/src/helpers/getExtensionField.ts +25 -0
  206. package/src/helpers/getHTMLFromFragment.ts +5 -5
  207. package/src/helpers/getMarkAttributes.ts +11 -8
  208. package/src/helpers/getMarkRange.ts +34 -6
  209. package/src/helpers/getMarkType.ts +4 -0
  210. package/src/helpers/getMarksBetween.ts +3 -3
  211. package/src/helpers/getNodeAttributes.ts +6 -7
  212. package/src/helpers/getNodeType.ts +4 -0
  213. package/src/helpers/getRenderedAttributes.ts +3 -5
  214. package/src/helpers/getSchema.ts +5 -132
  215. package/src/helpers/getSchemaByResolvedExtensions.ts +147 -0
  216. package/src/helpers/getSchemaTypeByName.ts +1 -9
  217. package/src/helpers/getSplittedAttributes.ts +3 -3
  218. package/src/helpers/getText.ts +18 -0
  219. package/src/helpers/getTextBetween.ts +45 -0
  220. package/src/helpers/getTextSeralizersFromSchema.ts +9 -0
  221. package/src/helpers/injectExtensionAttributesToParseRule.ts +12 -8
  222. package/src/helpers/isActive.ts +1 -2
  223. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  224. package/src/helpers/isList.ts +11 -4
  225. package/src/helpers/isMarkActive.ts +40 -16
  226. package/src/helpers/isNodeActive.ts +23 -31
  227. package/src/helpers/posToDOMRect.ts +34 -0
  228. package/src/index.ts +35 -5
  229. package/src/inputRules/markInputRule.ts +57 -38
  230. package/src/inputRules/nodeInputRule.ts +43 -11
  231. package/src/inputRules/textInputRule.ts +35 -0
  232. package/src/inputRules/textblockTypeInputRule.ts +37 -0
  233. package/src/inputRules/wrappingInputRule.ts +59 -0
  234. package/src/pasteRules/markPasteRule.ts +61 -53
  235. package/src/pasteRules/textPasteRule.ts +35 -0
  236. package/src/style.ts +15 -0
  237. package/src/types.ts +119 -37
  238. package/src/utilities/callOrReturn.ts +6 -3
  239. package/src/utilities/createStyleTag.ts +7 -0
  240. package/src/utilities/deleteProps.ts +2 -4
  241. package/src/utilities/elementFromString.ts +3 -4
  242. package/src/utilities/findDuplicates.ts +5 -0
  243. package/src/utilities/fromString.ts +1 -1
  244. package/src/utilities/isClass.ts +2 -2
  245. package/src/utilities/isEmptyObject.ts +2 -2
  246. package/src/utilities/isFunction.ts +3 -0
  247. package/src/utilities/isNumber.ts +3 -0
  248. package/src/utilities/isObject.ts +5 -5
  249. package/src/utilities/isPlainObject.ts +5 -5
  250. package/src/utilities/isRegExp.ts +3 -0
  251. package/src/utilities/isString.ts +3 -0
  252. package/src/utilities/isiOS.ts +12 -0
  253. package/src/utilities/mergeAttributes.ts +2 -3
  254. package/src/utilities/mergeDeep.ts +1 -2
  255. package/src/utilities/objectIncludes.ts +17 -5
  256. package/CHANGELOG.md +0 -294
  257. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  258. package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
  259. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  260. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  261. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  262. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  263. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  264. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  265. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  266. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  267. package/src/commands/insertHTML.ts +0 -28
  268. package/src/commands/insertNode.ts +0 -31
  269. package/src/commands/insertText.ts +0 -20
  270. package/src/commands/replace.ts +0 -20
  271. package/src/commands/replaceRange.ts +0 -36
  272. package/src/commands/resetNodeAttributes.ts +0 -31
  273. package/src/commands/updateNodeAttributes.ts +0 -33
  274. package/src/utilities/removeElement.ts +0 -5
@@ -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 default 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 { InputRule, InputRuleFinder } from '../InputRule'
2
+ import { NodeType } from 'prosemirror-model'
3
+ import { ExtendedRegExpMatchArray } from '../types'
4
+ import callOrReturn from '../utilities/callOrReturn'
5
+
6
+ /**
7
+ * Build an input rule that changes the type of a textblock when the
8
+ * matched text is typed into it. When using a regular expresion you’ll
9
+ * probably want the regexp to start with `^`, so that the pattern can
10
+ * only occur at the start of a textblock.
11
+ */
12
+ export default function textblockTypeInputRule(config: {
13
+ find: InputRuleFinder,
14
+ type: NodeType,
15
+ getAttributes?:
16
+ | Record<string, any>
17
+ | ((match: ExtendedRegExpMatchArray) => Record<string, any>)
18
+ | false
19
+ | null
20
+ ,
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
+ }
@@ -0,0 +1,59 @@
1
+ import { InputRule, InputRuleFinder } from '../InputRule'
2
+ import { NodeType, Node as ProseMirrorNode } from 'prosemirror-model'
3
+ import { findWrapping, canJoin } from 'prosemirror-transform'
4
+ import { ExtendedRegExpMatchArray } from '../types'
5
+ import callOrReturn from '../utilities/callOrReturn'
6
+
7
+ /**
8
+ * Build an input rule for automatically wrapping a textblock when a
9
+ * given string is typed. 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
+ * `type` is the type of node to wrap in.
14
+ *
15
+ * By default, if there’s a node with the same type above the newly
16
+ * wrapped node, the rule will try to join those
17
+ * two nodes. You can pass a join predicate, which takes a regular
18
+ * expression match and the node before the wrapped node, and can
19
+ * return a boolean to indicate whether a join should happen.
20
+ */
21
+ export default function wrappingInputRule(config: {
22
+ find: InputRuleFinder,
23
+ type: NodeType,
24
+ getAttributes?:
25
+ | Record<string, any>
26
+ | ((match: ExtendedRegExpMatchArray) => Record<string, any>)
27
+ | false
28
+ | null
29
+ ,
30
+ joinPredicate?: (match: ExtendedRegExpMatchArray, node: ProseMirrorNode) => boolean,
31
+ }) {
32
+ return new InputRule({
33
+ find: config.find,
34
+ handler: ({ state, range, match }) => {
35
+ const attributes = callOrReturn(config.getAttributes, undefined, match) || {}
36
+ const tr = state.tr.delete(range.from, range.to)
37
+ const $start = tr.doc.resolve(range.from)
38
+ const blockRange = $start.blockRange()
39
+ const wrapping = blockRange && findWrapping(blockRange, config.type, attributes)
40
+
41
+ if (!wrapping) {
42
+ return null
43
+ }
44
+
45
+ tr.wrap(blockRange, wrapping)
46
+
47
+ const before = tr.doc.resolve(range.from - 1).nodeBefore
48
+
49
+ if (
50
+ before
51
+ && before.type === config.type
52
+ && canJoin(tr.doc, range.from - 1)
53
+ && (!config.joinPredicate || config.joinPredicate(match, before))
54
+ ) {
55
+ tr.join(range.from - 1)
56
+ }
57
+ },
58
+ })
59
+ }
@@ -1,61 +1,69 @@
1
- import { Plugin, PluginKey } from 'prosemirror-state'
2
- import { Slice, Fragment, MarkType } from 'prosemirror-model'
3
-
4
- export default function (regexp: RegExp, type: MarkType, getAttrs?: (match: any) => any): Plugin {
5
- const handler = (fragment: Fragment, parent?: any) => {
6
- const nodes: any[] = []
7
-
8
- fragment.forEach(child => {
9
- if (child.isText && child.text) {
10
- const { text } = child
11
- let pos = 0
12
- let match
13
-
14
- // eslint-disable-next-line
15
- while ((match = regexp.exec(text)) !== null) {
16
- const outerMatch = Math.max(match.length - 2, 0)
17
- const innerMatch = Math.max(match.length - 1, 0)
18
-
19
- if (parent?.type.allowsMarkType(type)) {
20
- const start = match.index
21
- const matchStart = start + match[0].indexOf(match[outerMatch])
22
- const matchEnd = matchStart + match[outerMatch].length
23
- const textStart = matchStart + match[outerMatch].lastIndexOf(match[innerMatch])
24
- const textEnd = textStart + match[innerMatch].length
25
- const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs
26
-
27
- // adding text before markdown to nodes
28
- if (matchStart > 0) {
29
- nodes.push(child.cut(pos, matchStart))
30
- }
31
-
32
- // adding the markdown part to nodes
33
- nodes.push(child
34
- .cut(textStart, textEnd)
35
- .mark(type.create(attrs).addToSet(child.marks)))
36
-
37
- pos = matchEnd
38
- }
1
+ import { PasteRule, PasteRuleFinder } from '../PasteRule'
2
+ import { MarkType } from 'prosemirror-model'
3
+ import getMarksBetween from '../helpers/getMarksBetween'
4
+ import callOrReturn from '../utilities/callOrReturn'
5
+ import { ExtendedRegExpMatchArray } from '../types'
6
+
7
+ /**
8
+ * Build an paste rule that adds a mark when the
9
+ * matched text is pasted into it.
10
+ */
11
+ export default function markPasteRule(config: {
12
+ find: PasteRuleFinder,
13
+ type: MarkType,
14
+ getAttributes?:
15
+ | Record<string, any>
16
+ | ((match: ExtendedRegExpMatchArray) => Record<string, any>)
17
+ | false
18
+ | null
19
+ ,
20
+ }) {
21
+ return new PasteRule({
22
+ find: config.find,
23
+ handler: ({ state, range, match }) => {
24
+ const attributes = callOrReturn(config.getAttributes, undefined, match)
25
+
26
+ if (attributes === false || attributes === null) {
27
+ return
28
+ }
29
+
30
+ const { tr } = state
31
+ const captureGroup = match[match.length - 1]
32
+ const fullMatch = match[0]
33
+ let markEnd = range.to
34
+
35
+ if (captureGroup) {
36
+ const startSpaces = fullMatch.search(/\S/)
37
+ const textStart = range.from + fullMatch.indexOf(captureGroup)
38
+ const textEnd = textStart + captureGroup.length
39
+
40
+ const excludedMarks = getMarksBetween(range.from, range.to, state)
41
+ .filter(item => {
42
+ // @ts-ignore
43
+ const excluded = item.mark.type.excluded as MarkType[]
44
+
45
+ return excluded.find(type => type === config.type && type !== item.mark.type)
46
+ })
47
+ .filter(item => item.to > textStart)
48
+
49
+ if (excludedMarks.length) {
50
+ return null
39
51
  }
40
52
 
41
- // adding rest of text to nodes
42
- if (pos < text.length) {
43
- nodes.push(child.cut(pos))
53
+ if (textEnd < range.to) {
54
+ tr.delete(textEnd, range.to)
44
55
  }
45
- } else {
46
- nodes.push(child.copy(handler(child.content, child)))
47
- }
48
- })
49
56
 
50
- return Fragment.fromArray(nodes)
51
- }
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 || {}))
52
64
 
53
- return new Plugin({
54
- key: new PluginKey('markPasteRule'),
55
- props: {
56
- transformPasted: slice => {
57
- return new Slice(handler(slice.content), slice.openStart, slice.openEnd)
58
- },
65
+ tr.removeStoredMark(config.type)
66
+ }
59
67
  },
60
68
  })
61
69
  }
@@ -0,0 +1,35 @@
1
+ import { PasteRule, PasteRuleFinder } from '../PasteRule'
2
+
3
+ /**
4
+ * Build an paste rule that replaces text when the
5
+ * matched text is pasted into it.
6
+ */
7
+ export default function textPasteRule(config: {
8
+ find: PasteRuleFinder,
9
+ replace: string,
10
+ }) {
11
+ return new PasteRule({
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
+ }
package/src/style.ts CHANGED
@@ -5,8 +5,10 @@ const style = `.ProseMirror {
5
5
  .ProseMirror {
6
6
  word-wrap: break-word;
7
7
  white-space: pre-wrap;
8
+ white-space: break-spaces;
8
9
  -webkit-font-variant-ligatures: none;
9
10
  font-variant-ligatures: none;
11
+ font-feature-settings: "liga" 0; /* the above doesn't seem to work in Edge */
10
12
  }
11
13
 
12
14
  .ProseMirror [contenteditable="false"] {
@@ -21,10 +23,19 @@ const style = `.ProseMirror {
21
23
  white-space: pre-wrap;
22
24
  }
23
25
 
26
+ img.ProseMirror-separator {
27
+ display: inline !important;
28
+ border: none !important;
29
+ margin: 0 !important;
30
+ width: 1px !important;
31
+ height: 1px !important;
32
+ }
33
+
24
34
  .ProseMirror-gapcursor {
25
35
  display: none;
26
36
  pointer-events: none;
27
37
  position: absolute;
38
+ margin: 0;
28
39
  }
29
40
 
30
41
  .ProseMirror-gapcursor:after {
@@ -57,6 +68,10 @@ const style = `.ProseMirror {
57
68
 
58
69
  .ProseMirror-focused .ProseMirror-gapcursor {
59
70
  display: block;
71
+ }
72
+
73
+ .tippy-box[data-animation=fade][data-state=hidden] {
74
+ opacity: 0
60
75
  }`
61
76
 
62
77
  export default style
package/src/types.ts CHANGED
@@ -14,9 +14,56 @@ import { Extension } from './Extension'
14
14
  import { Node } from './Node'
15
15
  import { Mark } from './Mark'
16
16
  import { Editor } from './Editor'
17
- import { Commands } from '.'
17
+ import {
18
+ Commands,
19
+ ExtensionConfig,
20
+ NodeConfig,
21
+ MarkConfig,
22
+ } from '.'
23
+
24
+ export type AnyConfig = ExtensionConfig | NodeConfig | MarkConfig
25
+ export type AnyExtension = Extension | Node | Mark
26
+ export type Extensions = AnyExtension[]
27
+
28
+ export type ParentConfig<T> = Partial<{
29
+ [P in keyof T]: Required<T>[P] extends (...args: any) => any
30
+ ? (...args: Parameters<Required<T>[P]>) => ReturnType<Required<T>[P]>
31
+ : T[P]
32
+ }>
33
+
34
+ export type Primitive =
35
+ | null
36
+ | undefined
37
+ | string
38
+ | number
39
+ | boolean
40
+ | symbol
41
+ | bigint
42
+
43
+ export type RemoveThis<T> = T extends (...args: any) => any
44
+ ? (...args: Parameters<T>) => ReturnType<T>
45
+ : T
46
+
47
+ export type MaybeReturnType<T> = T extends (...args: any) => any
48
+ ? ReturnType<T>
49
+ : T
50
+
51
+ export type MaybeThisParameterType<T> = Exclude<T, Primitive> extends (...args: any) => any
52
+ ? ThisParameterType<Exclude<T, Primitive>>
53
+ : any
54
+
55
+ export interface EditorEvents {
56
+ beforeCreate: { editor: Editor },
57
+ create: { editor: Editor },
58
+ update: { editor: Editor, transaction: Transaction },
59
+ selectionUpdate: { editor: Editor, transaction: Transaction },
60
+ transaction: { editor: Editor, transaction: Transaction },
61
+ focus: { editor: Editor, event: FocusEvent, transaction: Transaction },
62
+ blur: { editor: Editor, event: FocusEvent, transaction: Transaction },
63
+ destroy: void,
64
+ }
18
65
 
19
- export type Extensions = (Extension | Node | Mark)[]
66
+ export type EnableRules = (AnyExtension | string)[] | boolean
20
67
 
21
68
  export interface EditorOptions {
22
69
  element: Element,
@@ -27,20 +74,35 @@ export interface EditorOptions {
27
74
  editable: boolean,
28
75
  editorProps: EditorProps,
29
76
  parseOptions: ParseOptions,
30
- enableInputRules: boolean,
31
- enablePasteRules: boolean,
32
- onCreate: (props: { editor: Editor }) => void,
33
- onUpdate: (props: { editor: Editor }) => void,
34
- onViewUpdate: (props: { editor: Editor }) => void,
35
- onSelectionUpdate: (props: { editor: Editor }) => void,
36
- onTransaction: (props: { editor: Editor, transaction: Transaction }) => void,
37
- onFocus: (props: { editor: Editor, event: FocusEvent }) => void,
38
- onBlur: (props: { editor: Editor, event: FocusEvent }) => void,
39
- onResize: (props: { editor: Editor }) => void,
40
- onDestroy: () => void,
77
+ enableInputRules: EnableRules,
78
+ enablePasteRules: EnableRules,
79
+ enableCoreExtensions: boolean,
80
+ onBeforeCreate: (props: EditorEvents['beforeCreate']) => void,
81
+ onCreate: (props: EditorEvents['create']) => void,
82
+ onUpdate: (props: EditorEvents['update']) => void,
83
+ onSelectionUpdate: (props: EditorEvents['selectionUpdate']) => void,
84
+ onTransaction: (props: EditorEvents['transaction']) => void,
85
+ onFocus: (props: EditorEvents['focus']) => void,
86
+ onBlur: (props: EditorEvents['blur']) => void,
87
+ onDestroy: (props: EditorEvents['destroy']) => void,
41
88
  }
42
89
 
43
- export type Content = string | JSON | null
90
+ export type HTMLContent = string
91
+
92
+ export type JSONContent = {
93
+ type?: string,
94
+ attrs?: Record<string, any>,
95
+ content?: JSONContent[],
96
+ marks?: {
97
+ type: string,
98
+ attrs?: Record<string, any>,
99
+ [key: string]: any,
100
+ }[],
101
+ text?: string,
102
+ [key: string]: any,
103
+ }
104
+
105
+ export type Content = HTMLContent | JSONContent | JSONContent[] | null
44
106
 
45
107
  export type CommandProps = {
46
108
  editor: Editor,
@@ -57,11 +119,13 @@ export type Command = (props: CommandProps) => boolean
57
119
 
58
120
  export type CommandSpec = (...args: any[]) => Command
59
121
 
122
+ export type KeyboardShortcutCommand = (props: { editor: Editor }) => boolean
123
+
60
124
  export type Attribute = {
61
125
  default: any,
62
126
  rendered?: boolean,
63
- renderHTML?: ((attributes: { [key: string]: any }) => { [key: string]: any } | null) | null,
64
- parseHTML?: ((element: HTMLElement) => { [key: string]: any } | null) | null,
127
+ renderHTML?: ((attributes: Record<string, any>) => Record<string, any> | null) | null,
128
+ parseHTML?: ((element: HTMLElement) => any | null) | null,
65
129
  keepOnSplit: boolean,
66
130
  }
67
131
 
@@ -84,22 +148,18 @@ export type GlobalAttributes = {
84
148
 
85
149
  export type PickValue<T, K extends keyof T> = T[K]
86
150
 
87
- export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I)=>void)
151
+ export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void)
88
152
  ? I
89
153
  : never
90
154
 
91
155
  export type Diff<T extends keyof any, U extends keyof any> =
92
156
  ({ [P in T]: P } & { [P in U]: never } & { [x: string]: never })[T]
93
157
 
94
- export type Overwrite<T, U> = Pick<T, Diff<keyof T, keyof U>> & U;
158
+ export type Overwrite<T, U> = Pick<T, Diff<keyof T, keyof U>> & U
95
159
 
96
- export type AnyObject = {
97
- [key: string]: any
98
- }
99
-
100
- export type ValuesOf<T> = T[keyof T];
160
+ export type ValuesOf<T> = T[keyof T]
101
161
 
102
- export type KeysWithTypeOf<T, Type> = ({[P in keyof T]: T[P] extends Type ? P : never })[keyof T]
162
+ export type KeysWithTypeOf<T, Type> = ({ [P in keyof T]: T[P] extends Type ? P : never })[keyof T]
103
163
 
104
164
  export type NodeViewProps = {
105
165
  editor: Editor,
@@ -108,45 +168,51 @@ export type NodeViewProps = {
108
168
  selected: boolean,
109
169
  extension: Node,
110
170
  getPos: () => number,
111
- updateAttributes: (attributes: AnyObject) => void,
171
+ updateAttributes: (attributes: Record<string, any>) => void,
172
+ deleteNode: () => void,
173
+ }
174
+
175
+ export interface NodeViewRendererOptions {
176
+ stopEvent: ((props: {
177
+ event: Event
178
+ }) => boolean) | null,
179
+ ignoreMutation: ((props: {
180
+ mutation: MutationRecord | { type: 'selection', target: Element }
181
+ }) => boolean) | null,
112
182
  }
113
183
 
114
184
  export type NodeViewRendererProps = {
115
185
  editor: Editor,
116
186
  node: ProseMirrorNode,
117
187
  getPos: (() => number) | boolean,
118
- HTMLAttributes: { [key: string]: any },
188
+ HTMLAttributes: Record<string, any>,
119
189
  decorations: Decoration[],
120
190
  extension: Node,
121
191
  }
122
192
 
123
193
  export type NodeViewRenderer = (props: NodeViewRendererProps) => (NodeView | {})
124
194
 
125
- export type UnionCommands = UnionToIntersection<ValuesOf<Pick<Commands, KeysWithTypeOf<Commands, {}>>>>
195
+ export type AnyCommands = Record<string, (...args: any[]) => Command>
196
+
197
+ export type UnionCommands<T = Command> = UnionToIntersection<ValuesOf<Pick<Commands<T>, KeysWithTypeOf<Commands<T>, {}>>>>
126
198
 
127
199
  export type RawCommands = {
128
- [Item in keyof UnionCommands]: UnionCommands[Item] extends (...args: any[]) => any
129
- ? (...args: Parameters<UnionCommands[Item]>) => Command
130
- : never
200
+ [Item in keyof UnionCommands]: UnionCommands<Command>[Item]
131
201
  }
132
202
 
133
203
  export type SingleCommands = {
134
- [Item in keyof RawCommands]: RawCommands[Item] extends (...args: any[]) => any
135
- ? (...args: Parameters<RawCommands[Item]>) => boolean
136
- : never
204
+ [Item in keyof UnionCommands]: UnionCommands<boolean>[Item]
137
205
  }
138
206
 
139
207
  export type ChainedCommands = {
140
- [Item in keyof RawCommands]: RawCommands[Item] extends (...args: any[]) => any
141
- ? (...args: Parameters<RawCommands[Item]>) => ChainedCommands
142
- : never
208
+ [Item in keyof UnionCommands]: UnionCommands<ChainedCommands>[Item]
143
209
  } & {
144
210
  run: () => boolean
145
211
  }
146
212
 
147
213
  export type CanCommands = SingleCommands & { chain: () => ChainedCommands }
148
214
 
149
- export type FocusPosition = 'start' | 'end' | number | boolean | null
215
+ export type FocusPosition = 'start' | 'end' | 'all' | number | boolean | null
150
216
 
151
217
  export type Range = {
152
218
  from: number,
@@ -166,3 +232,19 @@ export type MarkRange = {
166
232
  }
167
233
 
168
234
  export type Predicate = (node: ProseMirrorNode) => boolean
235
+
236
+ export type NodeWithPos = {
237
+ node: ProseMirrorNode,
238
+ pos: number,
239
+ }
240
+
241
+ export type TextSerializer = (props: {
242
+ node: ProseMirrorNode,
243
+ pos: number,
244
+ parent: ProseMirrorNode,
245
+ index: number,
246
+ }) => string
247
+
248
+ export type ExtendedRegExpMatchArray = RegExpMatchArray & {
249
+ data?: Record<string, any>,
250
+ }
@@ -1,3 +1,6 @@
1
+ import { MaybeReturnType } from '../types'
2
+ import isFunction from './isFunction'
3
+
1
4
  /**
2
5
  * Optionally calls `value` as a function.
3
6
  * Otherwise it is returned directly.
@@ -5,8 +8,8 @@
5
8
  * @param context Optional context to bind to function.
6
9
  * @param props Optional props to pass to function.
7
10
  */
8
- export default function callOrReturn(value: any, context: any = undefined, ...props: any[]): any {
9
- if (typeof value === 'function') {
11
+ export default function callOrReturn<T>(value: T, context: any = undefined, ...props: any[]): MaybeReturnType<T> {
12
+ if (isFunction(value)) {
10
13
  if (context) {
11
14
  return value.bind(context)(...props)
12
15
  }
@@ -14,5 +17,5 @@ export default function callOrReturn(value: any, context: any = undefined, ...pr
14
17
  return value(...props)
15
18
  }
16
19
 
17
- return value
20
+ return value as MaybeReturnType<T>
18
21
  }
@@ -1,6 +1,13 @@
1
1
  export default function createStyleTag(style: string): HTMLStyleElement {
2
+ const tipTapStyleTag = (<HTMLStyleElement>document.querySelector('style[data-tiptap-style]'))
3
+
4
+ if (tipTapStyleTag !== null) {
5
+ return tipTapStyleTag
6
+ }
7
+
2
8
  const styleNode = document.createElement('style')
3
9
 
10
+ styleNode.setAttribute('data-tiptap-style', '')
4
11
  styleNode.innerHTML = style
5
12
  document.getElementsByTagName('head')[0].appendChild(styleNode)
6
13
 
@@ -1,18 +1,16 @@
1
- import { AnyObject } from '../types'
2
-
3
1
  /**
4
2
  * Remove a property or an array of properties from an object
5
3
  * @param obj Object
6
4
  * @param key Key to remove
7
5
  */
8
- export default function deleteProps(obj: AnyObject, propOrProps: string | string[]): AnyObject {
6
+ export default function deleteProps(obj: Record<string, any>, propOrProps: string | string[]): Record<string, any> {
9
7
  const props = typeof propOrProps === 'string'
10
8
  ? [propOrProps]
11
9
  : propOrProps
12
10
 
13
11
  return Object
14
12
  .keys(obj)
15
- .reduce((newObj: AnyObject, prop) => {
13
+ .reduce((newObj: Record<string, any>, prop) => {
16
14
  if (!props.includes(prop)) {
17
15
  newObj[prop] = obj[prop]
18
16
  }
@@ -1,7 +1,6 @@
1
1
  export default function elementFromString(value: string): HTMLElement {
2
- const htmlString = `<div>${value}</div>`
3
- const parser = new window.DOMParser()
4
- const element = parser.parseFromString(htmlString, 'text/html').body
2
+ // add a wrapper to preserve leading and trailing whitespace
3
+ const wrappedValue = `<body>${value}</body>`
5
4
 
6
- return element
5
+ return new window.DOMParser().parseFromString(wrappedValue, 'text/html').body
7
6
  }
@@ -0,0 +1,5 @@
1
+ export default function findDuplicates(items: any[]): any[] {
2
+ const filtered = items.filter((el, index) => items.indexOf(el) !== index)
3
+
4
+ return [...new Set(filtered)]
5
+ }
@@ -3,7 +3,7 @@ export default function fromString(value: any): any {
3
3
  return value
4
4
  }
5
5
 
6
- if (value.match(/^\d*(\.\d+)?$/)) {
6
+ if (value.match(/^[+-]?(?:\d*\.)?\d+$/)) {
7
7
  return Number(value)
8
8
  }
9
9
 
@@ -1,5 +1,5 @@
1
- export default function isClass(item: any): boolean {
2
- if (item.constructor?.toString().substring(0, 5) !== 'class') {
1
+ export default function isClass(value: any): boolean {
2
+ if (value.constructor?.toString().substring(0, 5) !== 'class') {
3
3
  return false
4
4
  }
5
5
 
@@ -1,3 +1,3 @@
1
- export default function isEmptyObject(object = {}): boolean {
2
- return Object.keys(object).length === 0 && object.constructor === Object
1
+ export default function isEmptyObject(value = {}): boolean {
2
+ return Object.keys(value).length === 0 && value.constructor === Object
3
3
  }