@tiptap/core 2.0.0-beta.17 → 2.0.0-beta.170

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 (318) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +2 -2
  3. package/dist/packages/core/src/CommandManager.d.ts +13 -6
  4. package/dist/packages/core/src/Editor.d.ts +23 -18
  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 +7 -12
  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 +160 -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 +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 +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/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 +13 -0
  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 +21 -15
  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 +1 -1
  79. package/dist/packages/core/src/helpers/findParentNodeClosestToPos.d.ts +1 -1
  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 +1 -1
  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 +1 -2
  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 +1 -2
  94. package/dist/packages/core/src/helpers/getNodeType.d.ts +1 -1
  95. package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +2 -2
  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/getTextSeralizersFromSchema.d.ts +3 -0
  104. package/dist/packages/core/src/helpers/injectExtensionAttributesToParseRule.d.ts +1 -1
  105. package/dist/packages/core/src/helpers/isActive.d.ts +1 -2
  106. package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
  107. package/dist/packages/core/src/helpers/isList.d.ts +1 -1
  108. package/dist/packages/core/src/helpers/isMarkActive.d.ts +1 -2
  109. package/dist/packages/core/src/helpers/isNodeActive.d.ts +1 -2
  110. package/dist/packages/core/src/helpers/isNodeEmpty.d.ts +1 -1
  111. package/dist/packages/core/src/helpers/isNodeSelection.d.ts +1 -1
  112. package/dist/packages/core/src/helpers/isTextSelection.d.ts +1 -1
  113. package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -0
  114. package/dist/packages/core/src/helpers/resolveFocusPosition.d.ts +4 -0
  115. package/dist/packages/core/src/helpers/selectionToInsertionEnd.d.ts +1 -1
  116. package/dist/packages/core/src/helpers/splitExtensions.d.ts +4 -4
  117. package/dist/packages/core/src/index.d.ts +51 -20
  118. package/dist/packages/core/src/inputRules/markInputRule.d.ts +11 -2
  119. package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +11 -2
  120. package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
  121. package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
  122. package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +23 -0
  123. package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +11 -2
  124. package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
  125. package/dist/packages/core/src/style.d.ts +1 -2
  126. package/dist/packages/core/src/types.d.ts +105 -52
  127. package/dist/packages/core/src/utilities/callOrReturn.d.ts +2 -1
  128. package/dist/packages/core/src/utilities/createStyleTag.d.ts +1 -1
  129. package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -2
  130. package/dist/packages/core/src/utilities/elementFromString.d.ts +1 -1
  131. package/dist/packages/core/src/utilities/escapeForRegEx.d.ts +1 -0
  132. package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
  133. package/dist/packages/core/src/utilities/fromString.d.ts +1 -1
  134. package/dist/packages/core/src/utilities/isClass.d.ts +1 -1
  135. package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
  136. package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
  137. package/dist/packages/core/src/utilities/isMacOS.d.ts +1 -0
  138. package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
  139. package/dist/packages/core/src/utilities/isObject.d.ts +1 -1
  140. package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
  141. package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
  142. package/dist/packages/core/src/utilities/isiOS.d.ts +1 -0
  143. package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -2
  144. package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -2
  145. package/dist/packages/core/src/utilities/minMax.d.ts +1 -1
  146. package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -2
  147. package/dist/packages/core/src/utilities/removeDuplicates.d.ts +8 -0
  148. package/dist/tiptap-core.cjs.js +3572 -2041
  149. package/dist/tiptap-core.cjs.js.map +1 -1
  150. package/dist/tiptap-core.esm.js +3544 -2044
  151. package/dist/tiptap-core.esm.js.map +1 -1
  152. package/dist/tiptap-core.umd.js +3430 -1898
  153. package/dist/tiptap-core.umd.js.map +1 -1
  154. package/package.json +20 -16
  155. package/src/CommandManager.ts +60 -62
  156. package/src/Editor.ts +109 -74
  157. package/src/EventEmitter.ts +14 -4
  158. package/src/Extension.ts +196 -41
  159. package/src/ExtensionManager.ts +242 -78
  160. package/src/InputRule.ts +268 -0
  161. package/src/Mark.ts +242 -47
  162. package/src/Node.ts +279 -52
  163. package/src/NodeView.ts +105 -42
  164. package/src/PasteRule.ts +246 -0
  165. package/src/Tracker.ts +42 -0
  166. package/src/commands/blur.ts +12 -6
  167. package/src/commands/clearContent.ts +3 -3
  168. package/src/commands/clearNodes.ts +29 -18
  169. package/src/commands/command.ts +2 -2
  170. package/src/commands/createParagraphNear.ts +3 -3
  171. package/src/commands/deleteNode.ts +36 -0
  172. package/src/commands/deleteRange.ts +3 -3
  173. package/src/commands/deleteSelection.ts +3 -3
  174. package/src/commands/enter.ts +3 -3
  175. package/src/commands/exitCode.ts +3 -3
  176. package/src/commands/extendMarkRange.ts +10 -10
  177. package/src/commands/first.ts +3 -3
  178. package/src/commands/focus.ts +45 -44
  179. package/src/commands/forEach.ts +24 -0
  180. package/src/commands/insertContent.ts +12 -24
  181. package/src/commands/insertContentAt.ts +107 -0
  182. package/src/commands/joinBackward.ts +3 -3
  183. package/src/commands/joinForward.ts +3 -3
  184. package/src/commands/keyboardShortcut.ts +6 -6
  185. package/src/commands/lift.ts +5 -5
  186. package/src/commands/liftEmptyBlock.ts +3 -3
  187. package/src/commands/liftListItem.ts +4 -4
  188. package/src/commands/newlineInCode.ts +3 -3
  189. package/src/commands/resetAttributes.ts +61 -0
  190. package/src/commands/scrollIntoView.ts +3 -3
  191. package/src/commands/selectAll.ts +8 -6
  192. package/src/commands/selectNodeBackward.ts +3 -3
  193. package/src/commands/selectNodeForward.ts +3 -3
  194. package/src/commands/selectParentNode.ts +3 -3
  195. package/src/commands/selectTextblockEnd.ts +19 -0
  196. package/src/commands/selectTextblockStart.ts +19 -0
  197. package/src/commands/setContent.ts +7 -11
  198. package/src/commands/setMark.ts +35 -12
  199. package/src/commands/setMeta.ts +18 -0
  200. package/src/commands/setNode.ts +27 -6
  201. package/src/commands/setNodeSelection.ts +28 -0
  202. package/src/commands/setTextSelection.ts +32 -0
  203. package/src/commands/sinkListItem.ts +4 -4
  204. package/src/commands/splitBlock.ts +14 -9
  205. package/src/commands/splitListItem.ts +41 -15
  206. package/src/commands/toggleList.ts +82 -18
  207. package/src/commands/toggleMark.ts +17 -7
  208. package/src/commands/toggleNode.ts +5 -5
  209. package/src/commands/toggleWrap.ts +8 -9
  210. package/src/commands/undoInputRule.ts +34 -5
  211. package/src/commands/unsetAllMarks.ts +7 -11
  212. package/src/commands/unsetMark.ts +34 -22
  213. package/src/commands/updateAttributes.ts +72 -0
  214. package/src/commands/wrapIn.ts +4 -10
  215. package/src/commands/wrapInList.ts +4 -4
  216. package/src/extensions/clipboardTextSerializer.ts +13 -35
  217. package/src/extensions/commands.ts +30 -21
  218. package/src/extensions/focusEvents.ts +0 -3
  219. package/src/extensions/index.ts +1 -0
  220. package/src/extensions/keymap.ts +111 -13
  221. package/src/extensions/tabindex.ts +19 -0
  222. package/src/helpers/combineTransactionSteps.ts +18 -0
  223. package/src/helpers/createChainableState.ts +37 -0
  224. package/src/helpers/createDocument.ts +5 -7
  225. package/src/helpers/createNodeFromContent.ts +15 -18
  226. package/src/helpers/defaultBlockAt.ts +13 -0
  227. package/src/helpers/findChildren.ts +17 -0
  228. package/src/helpers/findChildrenInRange.ts +31 -0
  229. package/src/helpers/findParentNode.ts +2 -2
  230. package/src/helpers/findParentNodeClosestToPos.ts +1 -1
  231. package/src/helpers/generateHTML.ts +5 -5
  232. package/src/helpers/generateJSON.ts +13 -0
  233. package/src/helpers/generateText.ts +29 -0
  234. package/src/helpers/getAttributes.ts +27 -0
  235. package/src/helpers/getAttributesFromExtensions.ts +28 -7
  236. package/src/helpers/getChangedRanges.ts +82 -0
  237. package/src/helpers/getDebugJSON.ts +53 -0
  238. package/src/helpers/getExtensionField.ts +25 -0
  239. package/src/helpers/getHTMLFromFragment.ts +6 -5
  240. package/src/helpers/getMarkAttributes.ts +12 -9
  241. package/src/helpers/getMarkRange.ts +34 -6
  242. package/src/helpers/getMarkType.ts +5 -1
  243. package/src/helpers/getMarksBetween.ts +31 -10
  244. package/src/helpers/getNodeAttributes.ts +7 -8
  245. package/src/helpers/getNodeType.ts +5 -1
  246. package/src/helpers/getRenderedAttributes.ts +4 -6
  247. package/src/helpers/getSchema.ts +6 -133
  248. package/src/helpers/getSchemaByResolvedExtensions.ts +147 -0
  249. package/src/helpers/getSchemaTypeByName.ts +2 -10
  250. package/src/helpers/getSchemaTypeNameByName.ts +1 -1
  251. package/src/helpers/getSplittedAttributes.ts +4 -4
  252. package/src/helpers/getText.ts +18 -0
  253. package/src/helpers/getTextBetween.ts +45 -0
  254. package/src/helpers/getTextSeralizersFromSchema.ts +9 -0
  255. package/src/helpers/injectExtensionAttributesToParseRule.ts +15 -17
  256. package/src/helpers/isActive.ts +4 -5
  257. package/src/helpers/isExtensionRulesEnabled.ts +15 -0
  258. package/src/helpers/isList.ts +14 -7
  259. package/src/helpers/isMarkActive.ts +43 -19
  260. package/src/helpers/isNodeActive.ts +26 -34
  261. package/src/helpers/isNodeEmpty.ts +1 -1
  262. package/src/helpers/isNodeSelection.ts +2 -2
  263. package/src/helpers/isTextSelection.ts +2 -2
  264. package/src/helpers/posToDOMRect.ts +34 -0
  265. package/src/helpers/resolveFocusPosition.ts +34 -0
  266. package/src/helpers/selectionToInsertionEnd.ts +1 -1
  267. package/src/helpers/splitExtensions.ts +1 -1
  268. package/src/index.ts +53 -20
  269. package/src/inputRules/markInputRule.ts +58 -39
  270. package/src/inputRules/nodeInputRule.ts +44 -11
  271. package/src/inputRules/textInputRule.ts +35 -0
  272. package/src/inputRules/textblockTypeInputRule.ts +37 -0
  273. package/src/inputRules/wrappingInputRule.ts +59 -0
  274. package/src/pasteRules/markPasteRule.ts +61 -53
  275. package/src/pasteRules/textPasteRule.ts +35 -0
  276. package/src/style.ts +16 -3
  277. package/src/types.ts +119 -37
  278. package/src/utilities/callOrReturn.ts +6 -3
  279. package/src/utilities/createStyleTag.ts +8 -1
  280. package/src/utilities/deleteProps.ts +2 -4
  281. package/src/utilities/elementFromString.ts +4 -5
  282. package/src/utilities/escapeForRegEx.ts +4 -0
  283. package/src/utilities/findDuplicates.ts +5 -0
  284. package/src/utilities/fromString.ts +2 -2
  285. package/src/utilities/isClass.ts +2 -2
  286. package/src/utilities/isEmptyObject.ts +2 -2
  287. package/src/utilities/isFunction.ts +3 -0
  288. package/src/utilities/isMacOS.ts +5 -0
  289. package/src/utilities/isNumber.ts +3 -0
  290. package/src/utilities/isObject.ts +6 -6
  291. package/src/utilities/isPlainObject.ts +8 -5
  292. package/src/utilities/isRegExp.ts +3 -0
  293. package/src/utilities/isString.ts +3 -0
  294. package/src/utilities/isiOS.ts +12 -0
  295. package/src/utilities/mergeAttributes.ts +2 -3
  296. package/src/utilities/mergeDeep.ts +2 -3
  297. package/src/utilities/minMax.ts +1 -1
  298. package/src/utilities/objectIncludes.ts +17 -5
  299. package/src/utilities/removeDuplicates.ts +15 -0
  300. package/CHANGELOG.md +0 -324
  301. package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
  302. package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
  303. package/dist/packages/core/src/commands/insertText.d.ts +0 -12
  304. package/dist/packages/core/src/commands/replace.d.ts +0 -13
  305. package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
  306. package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
  307. package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
  308. package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
  309. package/dist/tiptap-core.bundle.umd.min.js +0 -17
  310. package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
  311. package/src/commands/insertHTML.ts +0 -30
  312. package/src/commands/insertNode.ts +0 -33
  313. package/src/commands/insertText.ts +0 -22
  314. package/src/commands/replace.ts +0 -20
  315. package/src/commands/replaceRange.ts +0 -36
  316. package/src/commands/resetNodeAttributes.ts +0 -31
  317. package/src/commands/updateNodeAttributes.ts +0 -33
  318. package/src/utilities/removeElement.ts +0 -5
@@ -1,50 +1,69 @@
1
- import { InputRule } from 'prosemirror-inputrules'
1
+ import { InputRule, InputRuleFinder } from '../InputRule'
2
2
  import { MarkType } from 'prosemirror-model'
3
- import getMarksBetween from '../helpers/getMarksBetween'
4
-
5
- export default function (regexp: RegExp, markType: MarkType, getAttributes?: Function): InputRule {
6
- return new InputRule(regexp, (state, match, start, end) => {
7
- const attributes = getAttributes instanceof Function
8
- ? getAttributes(match)
9
- : getAttributes
10
- const { tr } = state
11
- const captureGroup = match[match.length - 1]
12
- const fullMatch = match[0]
13
- let markEnd = end
14
-
15
- if (captureGroup) {
16
- const startSpaces = fullMatch.search(/\S/)
17
- const textStart = start + fullMatch.indexOf(captureGroup)
18
- const textEnd = textStart + captureGroup.length
19
-
20
- const excludedMarks = getMarksBetween(start, end, state)
21
- .filter(item => {
22
- // TODO: PR to add excluded to MarkType
23
- // @ts-ignore
24
- const { excluded } = item.mark.type
25
- return excluded.find((type: MarkType) => type.name === markType.name)
26
- })
27
- .filter(item => item.to > textStart)
28
-
29
- if (excludedMarks.length) {
3
+ import { getMarksBetween } from '../helpers/getMarksBetween'
4
+ import { callOrReturn } from '../utilities/callOrReturn'
5
+ import { ExtendedRegExpMatchArray } from '../types'
6
+
7
+ /**
8
+ * Build an input rule that adds a mark when the
9
+ * matched text is typed into it.
10
+ */
11
+ export function markInputRule(config: {
12
+ find: InputRuleFinder,
13
+ type: MarkType,
14
+ getAttributes?:
15
+ | Record<string, any>
16
+ | ((match: ExtendedRegExpMatchArray) => Record<string, any>)
17
+ | false
18
+ | null
19
+ ,
20
+ }) {
21
+ return new InputRule({
22
+ find: config.find,
23
+ handler: ({ state, range, match }) => {
24
+ const attributes = callOrReturn(config.getAttributes, undefined, match)
25
+
26
+ if (attributes === false || attributes === null) {
30
27
  return null
31
28
  }
32
29
 
33
- if (textEnd < end) {
34
- tr.delete(textEnd, end)
35
- }
30
+ const { tr } = state
31
+ const captureGroup = match[match.length - 1]
32
+ const fullMatch = match[0]
33
+ let markEnd = range.to
36
34
 
37
- if (textStart > start) {
38
- tr.delete(start + startSpaces, textStart)
39
- }
35
+ if (captureGroup) {
36
+ const startSpaces = fullMatch.search(/\S/)
37
+ const textStart = range.from + fullMatch.indexOf(captureGroup)
38
+ const textEnd = textStart + captureGroup.length
39
+
40
+ const excludedMarks = getMarksBetween(range.from, range.to, state.doc)
41
+ .filter(item => {
42
+ // @ts-ignore
43
+ const excluded = item.mark.type.excluded as MarkType[]
40
44
 
41
- markEnd = start + startSpaces + captureGroup.length
45
+ return excluded.find(type => type === config.type && type !== item.mark.type)
46
+ })
47
+ .filter(item => item.to > textStart)
42
48
 
43
- tr.addMark(start + startSpaces, markEnd, markType.create(attributes))
49
+ if (excludedMarks.length) {
50
+ return null
51
+ }
44
52
 
45
- tr.removeStoredMark(markType)
46
- }
53
+ if (textEnd < range.to) {
54
+ tr.delete(textEnd, range.to)
55
+ }
47
56
 
48
- return tr
57
+ if (textStart > range.from) {
58
+ tr.delete(range.from + startSpaces, textStart)
59
+ }
60
+
61
+ markEnd = range.from + startSpaces + captureGroup.length
62
+
63
+ tr.addMark(range.from + startSpaces, markEnd, config.type.create(attributes || {}))
64
+
65
+ tr.removeStoredMark(config.type)
66
+ }
67
+ },
49
68
  })
50
69
  }
@@ -1,17 +1,50 @@
1
- import { InputRule } from 'prosemirror-inputrules'
2
1
  import { NodeType } from 'prosemirror-model'
2
+ import { InputRule, InputRuleFinder } from '../InputRule'
3
+ import { ExtendedRegExpMatchArray } from '../types'
4
+ import { callOrReturn } from '../utilities/callOrReturn'
3
5
 
4
- export default function (regexp: RegExp, type: NodeType, getAttributes?: (match: any) => any): InputRule {
5
- return new InputRule(regexp, (state, match, start, end) => {
6
- const attributes = getAttributes instanceof Function
7
- ? getAttributes(match)
8
- : getAttributes
9
- const { tr } = state
6
+ /**
7
+ * Build an input rule that adds a node when the
8
+ * matched text is typed into it.
9
+ */
10
+ export function nodeInputRule(config: {
11
+ find: InputRuleFinder,
12
+ type: NodeType,
13
+ getAttributes?:
14
+ | Record<string, any>
15
+ | ((match: ExtendedRegExpMatchArray) => Record<string, any>)
16
+ | false
17
+ | null
18
+ ,
19
+ }) {
20
+ return new InputRule({
21
+ find: config.find,
22
+ handler: ({ state, range, match }) => {
23
+ const attributes = callOrReturn(config.getAttributes, undefined, match) || {}
24
+ const { tr } = state
25
+ const start = range.from
26
+ let end = range.to
10
27
 
11
- if (match[0]) {
12
- tr.replaceWith(start - 1, end, type.create(attributes))
13
- }
28
+ if (match[1]) {
29
+ const offset = match[0].lastIndexOf(match[1])
30
+ let matchStart = start + offset
14
31
 
15
- return tr
32
+ if (matchStart > end) {
33
+ matchStart = end
34
+ } else {
35
+ end = matchStart + match[1].length
36
+ }
37
+
38
+ // insert last typed character
39
+ const lastChar = match[0][match[0].length - 1]
40
+
41
+ tr.insertText(lastChar, start + match[0].length - 1)
42
+
43
+ // insert node from input rule
44
+ tr.replaceWith(matchStart, end, config.type.create(attributes))
45
+ } else if (match[0]) {
46
+ tr.replaceWith(start, end, config.type.create(attributes))
47
+ }
48
+ },
16
49
  })
17
50
  }
@@ -0,0 +1,35 @@
1
+ import { InputRule, InputRuleFinder } from '../InputRule'
2
+
3
+ /**
4
+ * Build an input rule that replaces text when the
5
+ * matched text is typed into it.
6
+ */
7
+ export function textInputRule(config: {
8
+ find: InputRuleFinder,
9
+ replace: string,
10
+ }) {
11
+ return new InputRule({
12
+ find: config.find,
13
+ handler: ({ state, range, match }) => {
14
+ let insert = config.replace
15
+ let start = range.from
16
+ const end = range.to
17
+
18
+ if (match[1]) {
19
+ const offset = match[0].lastIndexOf(match[1])
20
+
21
+ insert += match[0].slice(offset + match[1].length)
22
+ start += offset
23
+
24
+ const cutOff = start - end
25
+
26
+ if (cutOff > 0) {
27
+ insert = match[0].slice(offset - cutOff, offset) + insert
28
+ start = end
29
+ }
30
+ }
31
+
32
+ state.tr.insertText(insert, start, end)
33
+ },
34
+ })
35
+ }
@@ -0,0 +1,37 @@
1
+ import { 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 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 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 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 null
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.doc)
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 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
@@ -1,12 +1,14 @@
1
- const style = `.ProseMirror {
1
+ export const style = `.ProseMirror {
2
2
  position: relative;
3
3
  }
4
4
 
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,8 @@ const style = `.ProseMirror {
57
68
 
58
69
  .ProseMirror-focused .ProseMirror-gapcursor {
59
70
  display: block;
60
- }`
71
+ }
61
72
 
62
- export default style
73
+ .tippy-box[data-animation=fade][data-state=hidden] {
74
+ opacity: 0
75
+ }`