@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.
- package/LICENSE.md +1 -1
- package/README.md +2 -2
- package/dist/packages/core/src/CommandManager.d.ts +12 -5
- package/dist/packages/core/src/Editor.d.ts +19 -20
- package/dist/packages/core/src/EventEmitter.d.ts +8 -4
- package/dist/packages/core/src/Extension.d.ts +102 -26
- package/dist/packages/core/src/ExtensionManager.d.ts +6 -11
- package/dist/packages/core/src/InputRule.d.ts +42 -0
- package/dist/packages/core/src/Mark.d.ts +134 -30
- package/dist/packages/core/src/Node.d.ts +151 -32
- package/dist/packages/core/src/NodeView.d.ts +5 -9
- package/dist/packages/core/src/PasteRule.d.ts +42 -0
- package/dist/packages/core/src/Tracker.d.ts +11 -0
- package/dist/packages/core/src/commands/blur.d.ts +3 -3
- package/dist/packages/core/src/commands/clearContent.d.ts +3 -3
- package/dist/packages/core/src/commands/clearNodes.d.ts +3 -3
- package/dist/packages/core/src/commands/command.d.ts +2 -2
- package/dist/packages/core/src/commands/createParagraphNear.d.ts +3 -3
- package/dist/packages/core/src/commands/deleteNode.d.ts +13 -0
- package/dist/packages/core/src/commands/deleteRange.d.ts +3 -3
- package/dist/packages/core/src/commands/deleteSelection.d.ts +3 -3
- package/dist/packages/core/src/commands/enter.d.ts +3 -3
- package/dist/packages/core/src/commands/exitCode.d.ts +3 -3
- package/dist/packages/core/src/commands/extendMarkRange.d.ts +3 -3
- package/dist/packages/core/src/commands/first.d.ts +3 -3
- package/dist/packages/core/src/commands/focus.d.ts +5 -3
- package/dist/packages/core/src/commands/forEach.d.ts +14 -0
- package/dist/packages/core/src/commands/insertContent.d.ts +16 -0
- package/dist/packages/core/src/commands/insertContentAt.d.ts +16 -0
- package/dist/packages/core/src/commands/joinBackward.d.ts +3 -3
- package/dist/packages/core/src/commands/joinForward.d.ts +3 -3
- package/dist/packages/core/src/commands/keyboardShortcut.d.ts +3 -3
- package/dist/packages/core/src/commands/lift.d.ts +3 -3
- package/dist/packages/core/src/commands/liftEmptyBlock.d.ts +3 -3
- package/dist/packages/core/src/commands/liftListItem.d.ts +3 -3
- package/dist/packages/core/src/commands/newlineInCode.d.ts +3 -3
- package/dist/packages/core/src/commands/resetAttributes.d.ts +13 -0
- package/dist/packages/core/src/commands/scrollIntoView.d.ts +3 -3
- package/dist/packages/core/src/commands/selectAll.d.ts +3 -3
- package/dist/packages/core/src/commands/selectNodeBackward.d.ts +3 -3
- package/dist/packages/core/src/commands/selectNodeForward.d.ts +3 -3
- package/dist/packages/core/src/commands/selectParentNode.d.ts +3 -3
- package/dist/packages/core/src/commands/setContent.d.ts +4 -3
- package/dist/packages/core/src/commands/setMark.d.ts +3 -3
- package/dist/packages/core/src/commands/setMeta.d.ts +12 -0
- package/dist/packages/core/src/commands/setNode.d.ts +3 -3
- package/dist/packages/core/src/commands/setNodeSelection.d.ts +12 -0
- package/dist/packages/core/src/commands/setTextSelection.d.ts +12 -0
- package/dist/packages/core/src/commands/sinkListItem.d.ts +3 -3
- package/dist/packages/core/src/commands/splitBlock.d.ts +3 -3
- package/dist/packages/core/src/commands/splitListItem.d.ts +3 -3
- package/dist/packages/core/src/commands/toggleList.d.ts +3 -3
- package/dist/packages/core/src/commands/toggleMark.d.ts +8 -3
- package/dist/packages/core/src/commands/toggleNode.d.ts +3 -3
- package/dist/packages/core/src/commands/toggleWrap.d.ts +3 -3
- package/dist/packages/core/src/commands/undoInputRule.d.ts +3 -3
- package/dist/packages/core/src/commands/unsetAllMarks.d.ts +3 -3
- package/dist/packages/core/src/commands/unsetMark.d.ts +8 -3
- package/dist/packages/core/src/commands/updateAttributes.d.ts +13 -0
- package/dist/packages/core/src/commands/wrapIn.d.ts +3 -3
- package/dist/packages/core/src/commands/wrapInList.d.ts +3 -3
- package/dist/packages/core/src/extensions/clipboardTextSerializer.d.ts +1 -1
- package/dist/packages/core/src/extensions/commands.d.ts +19 -15
- package/dist/packages/core/src/extensions/editable.d.ts +1 -1
- package/dist/packages/core/src/extensions/focusEvents.d.ts +1 -1
- package/dist/packages/core/src/extensions/index.d.ts +1 -0
- package/dist/packages/core/src/extensions/keymap.d.ts +1 -1
- package/dist/packages/core/src/extensions/tabindex.d.ts +2 -0
- package/dist/packages/core/src/helpers/createChainableState.d.ts +5 -0
- package/dist/packages/core/src/helpers/createDocument.d.ts +3 -0
- package/dist/packages/core/src/helpers/createNodeFromContent.d.ts +7 -0
- package/dist/packages/core/src/helpers/defaultBlockAt.d.ts +2 -0
- package/dist/packages/core/src/helpers/findChildren.d.ts +3 -0
- package/dist/packages/core/src/helpers/findChildrenInRange.d.ts +6 -0
- package/dist/packages/core/src/helpers/generateHTML.d.ts +2 -2
- package/dist/packages/core/src/helpers/generateJSON.d.ts +2 -0
- package/dist/packages/core/src/helpers/generateText.d.ts +5 -0
- package/dist/packages/core/src/helpers/getAttributes.d.ts +3 -0
- package/dist/packages/core/src/helpers/getDebugJSON.d.ts +8 -0
- package/dist/packages/core/src/helpers/getExtensionField.d.ts +2 -0
- package/dist/packages/core/src/helpers/getHTMLFromFragment.d.ts +2 -2
- package/dist/packages/core/src/helpers/getMarkAttributes.d.ts +1 -2
- package/dist/packages/core/src/helpers/getMarkRange.d.ts +1 -1
- package/dist/packages/core/src/helpers/getNodeAttributes.d.ts +1 -2
- package/dist/packages/core/src/helpers/getRenderedAttributes.d.ts +2 -2
- package/dist/packages/core/src/helpers/getSchemaByResolvedExtensions.d.ts +3 -0
- package/dist/packages/core/src/helpers/getSplittedAttributes.d.ts +2 -2
- package/dist/packages/core/src/helpers/getText.d.ts +6 -0
- package/dist/packages/core/src/helpers/getTextBetween.d.ts +6 -0
- package/dist/packages/core/src/helpers/getTextSeralizersFromSchema.d.ts +3 -0
- package/dist/packages/core/src/helpers/isActive.d.ts +1 -2
- package/dist/packages/core/src/helpers/isExtensionRulesEnabled.d.ts +2 -0
- package/dist/packages/core/src/helpers/isMarkActive.d.ts +1 -2
- package/dist/packages/core/src/helpers/isNodeActive.d.ts +1 -2
- package/dist/packages/core/src/helpers/posToDOMRect.d.ts +2 -0
- package/dist/packages/core/src/helpers/splitExtensions.d.ts +3 -3
- package/dist/packages/core/src/index.d.ts +33 -5
- package/dist/packages/core/src/inputRules/markInputRule.d.ts +11 -2
- package/dist/packages/core/src/inputRules/nodeInputRule.d.ts +11 -2
- package/dist/packages/core/src/inputRules/textInputRule.d.ts +9 -0
- package/dist/packages/core/src/inputRules/textblockTypeInputRule.d.ts +14 -0
- package/dist/packages/core/src/inputRules/wrappingInputRule.d.ts +23 -0
- package/dist/packages/core/src/pasteRules/markPasteRule.d.ts +11 -2
- package/dist/packages/core/src/pasteRules/textPasteRule.d.ts +9 -0
- package/dist/packages/core/src/style.d.ts +1 -1
- package/dist/packages/core/src/types.d.ts +105 -52
- package/dist/packages/core/src/utilities/callOrReturn.d.ts +2 -1
- package/dist/packages/core/src/utilities/deleteProps.d.ts +1 -2
- package/dist/packages/core/src/utilities/findDuplicates.d.ts +1 -0
- package/dist/packages/core/src/utilities/isClass.d.ts +1 -1
- package/dist/packages/core/src/utilities/isEmptyObject.d.ts +1 -1
- package/dist/packages/core/src/utilities/isFunction.d.ts +1 -0
- package/dist/packages/core/src/utilities/isNumber.d.ts +1 -0
- package/dist/packages/core/src/utilities/isObject.d.ts +1 -1
- package/dist/packages/core/src/utilities/isPlainObject.d.ts +1 -1
- package/dist/packages/core/src/utilities/isRegExp.d.ts +1 -0
- package/dist/packages/core/src/utilities/isiOS.d.ts +1 -0
- package/dist/packages/core/src/utilities/mergeAttributes.d.ts +1 -2
- package/dist/packages/core/src/utilities/mergeDeep.d.ts +1 -2
- package/dist/packages/core/src/utilities/objectIncludes.d.ts +3 -2
- package/dist/tiptap-core.cjs.js +2723 -1455
- package/dist/tiptap-core.cjs.js.map +1 -1
- package/dist/tiptap-core.esm.js +3172 -1931
- package/dist/tiptap-core.esm.js.map +1 -1
- package/dist/tiptap-core.umd.js +3292 -2023
- package/dist/tiptap-core.umd.js.map +1 -1
- package/package.json +19 -16
- package/src/CommandManager.ts +59 -61
- package/src/Editor.ts +91 -95
- package/src/EventEmitter.ts +14 -4
- package/src/Extension.ts +202 -40
- package/src/ExtensionManager.ts +234 -70
- package/src/InputRule.ts +268 -0
- package/src/Mark.ts +248 -46
- package/src/Node.ts +275 -51
- package/src/NodeView.ts +105 -42
- package/src/PasteRule.ts +215 -0
- package/src/Tracker.ts +42 -0
- package/src/commands/blur.ts +9 -7
- package/src/commands/clearContent.ts +3 -3
- package/src/commands/clearNodes.ts +25 -19
- package/src/commands/command.ts +2 -2
- package/src/commands/createParagraphNear.ts +3 -3
- package/src/commands/deleteNode.ts +36 -0
- package/src/commands/deleteRange.ts +3 -3
- package/src/commands/deleteSelection.ts +3 -3
- package/src/commands/enter.ts +3 -3
- package/src/commands/exitCode.ts +3 -3
- package/src/commands/extendMarkRange.ts +8 -8
- package/src/commands/first.ts +3 -3
- package/src/commands/focus.ts +54 -12
- package/src/commands/forEach.ts +24 -0
- package/src/commands/insertContent.ts +23 -0
- package/src/commands/insertContentAt.ts +93 -0
- package/src/commands/joinBackward.ts +3 -3
- package/src/commands/joinForward.ts +3 -3
- package/src/commands/keyboardShortcut.ts +3 -3
- package/src/commands/lift.ts +3 -3
- package/src/commands/liftEmptyBlock.ts +3 -3
- package/src/commands/liftListItem.ts +3 -3
- package/src/commands/newlineInCode.ts +3 -3
- package/src/commands/resetAttributes.ts +61 -0
- package/src/commands/scrollIntoView.ts +3 -3
- package/src/commands/selectAll.ts +8 -6
- package/src/commands/selectNodeBackward.ts +3 -3
- package/src/commands/selectNodeForward.ts +3 -3
- package/src/commands/selectParentNode.ts +3 -3
- package/src/commands/setContent.ts +10 -5
- package/src/commands/setMark.ts +33 -10
- package/src/commands/setMeta.ts +18 -0
- package/src/commands/setNode.ts +3 -3
- package/src/commands/setNodeSelection.ts +28 -0
- package/src/commands/setTextSelection.ts +32 -0
- package/src/commands/sinkListItem.ts +3 -3
- package/src/commands/splitBlock.ts +13 -8
- package/src/commands/splitListItem.ts +39 -13
- package/src/commands/toggleList.ts +4 -4
- package/src/commands/toggleMark.ts +15 -5
- package/src/commands/toggleNode.ts +3 -3
- package/src/commands/toggleWrap.ts +3 -3
- package/src/commands/undoInputRule.ts +33 -5
- package/src/commands/unsetAllMarks.ts +3 -3
- package/src/commands/unsetMark.ts +32 -20
- package/src/commands/updateAttributes.ts +72 -0
- package/src/commands/wrapIn.ts +3 -3
- package/src/commands/wrapInList.ts +3 -3
- package/src/extensions/clipboardTextSerializer.ts +11 -35
- package/src/extensions/commands.ts +27 -21
- package/src/extensions/focusEvents.ts +0 -3
- package/src/extensions/index.ts +1 -0
- package/src/extensions/keymap.ts +6 -6
- package/src/extensions/tabindex.ts +19 -0
- package/src/helpers/createChainableState.ts +37 -0
- package/src/helpers/createDocument.ts +11 -0
- package/src/helpers/createNodeFromContent.ts +56 -0
- package/src/helpers/defaultBlockAt.ts +13 -0
- package/src/helpers/findChildren.ts +17 -0
- package/src/helpers/findChildrenInRange.ts +31 -0
- package/src/helpers/generateHTML.ts +3 -3
- package/src/helpers/generateJSON.ts +13 -0
- package/src/helpers/generateText.ts +29 -0
- package/src/helpers/getAttributes.ts +27 -0
- package/src/helpers/getAttributesFromExtensions.ts +26 -5
- package/src/helpers/getDebugJSON.ts +46 -0
- package/src/helpers/getExtensionField.ts +25 -0
- package/src/helpers/getHTMLFromFragment.ts +5 -5
- package/src/helpers/getMarkAttributes.ts +11 -8
- package/src/helpers/getMarkRange.ts +34 -6
- package/src/helpers/getMarkType.ts +4 -0
- package/src/helpers/getMarksBetween.ts +3 -3
- package/src/helpers/getNodeAttributes.ts +6 -7
- package/src/helpers/getNodeType.ts +4 -0
- package/src/helpers/getRenderedAttributes.ts +3 -5
- package/src/helpers/getSchema.ts +5 -132
- package/src/helpers/getSchemaByResolvedExtensions.ts +147 -0
- package/src/helpers/getSchemaTypeByName.ts +1 -9
- package/src/helpers/getSplittedAttributes.ts +3 -3
- package/src/helpers/getText.ts +18 -0
- package/src/helpers/getTextBetween.ts +45 -0
- package/src/helpers/getTextSeralizersFromSchema.ts +9 -0
- package/src/helpers/injectExtensionAttributesToParseRule.ts +12 -8
- package/src/helpers/isActive.ts +1 -2
- package/src/helpers/isExtensionRulesEnabled.ts +15 -0
- package/src/helpers/isList.ts +11 -4
- package/src/helpers/isMarkActive.ts +40 -16
- package/src/helpers/isNodeActive.ts +23 -31
- package/src/helpers/posToDOMRect.ts +34 -0
- package/src/index.ts +35 -5
- package/src/inputRules/markInputRule.ts +57 -38
- package/src/inputRules/nodeInputRule.ts +43 -11
- package/src/inputRules/textInputRule.ts +35 -0
- package/src/inputRules/textblockTypeInputRule.ts +37 -0
- package/src/inputRules/wrappingInputRule.ts +59 -0
- package/src/pasteRules/markPasteRule.ts +61 -53
- package/src/pasteRules/textPasteRule.ts +35 -0
- package/src/style.ts +15 -0
- package/src/types.ts +119 -37
- package/src/utilities/callOrReturn.ts +6 -3
- package/src/utilities/createStyleTag.ts +7 -0
- package/src/utilities/deleteProps.ts +2 -4
- package/src/utilities/elementFromString.ts +3 -4
- package/src/utilities/findDuplicates.ts +5 -0
- package/src/utilities/fromString.ts +1 -1
- package/src/utilities/isClass.ts +2 -2
- package/src/utilities/isEmptyObject.ts +2 -2
- package/src/utilities/isFunction.ts +3 -0
- package/src/utilities/isNumber.ts +3 -0
- package/src/utilities/isObject.ts +5 -5
- package/src/utilities/isPlainObject.ts +5 -5
- package/src/utilities/isRegExp.ts +3 -0
- package/src/utilities/isString.ts +3 -0
- package/src/utilities/isiOS.ts +12 -0
- package/src/utilities/mergeAttributes.ts +2 -3
- package/src/utilities/mergeDeep.ts +1 -2
- package/src/utilities/objectIncludes.ts +17 -5
- package/CHANGELOG.md +0 -294
- package/dist/packages/core/src/commands/insertHTML.d.ts +0 -12
- package/dist/packages/core/src/commands/insertNode.d.ts +0 -13
- package/dist/packages/core/src/commands/insertText.d.ts +0 -12
- package/dist/packages/core/src/commands/replace.d.ts +0 -13
- package/dist/packages/core/src/commands/replaceRange.d.ts +0 -13
- package/dist/packages/core/src/commands/resetNodeAttributes.d.ts +0 -13
- package/dist/packages/core/src/commands/updateNodeAttributes.d.ts +0 -13
- package/dist/packages/core/src/utilities/removeElement.d.ts +0 -1
- package/dist/tiptap-core.bundle.umd.min.js +0 -17
- package/dist/tiptap-core.bundle.umd.min.js.map +0 -1
- package/src/commands/insertHTML.ts +0 -28
- package/src/commands/insertNode.ts +0 -31
- package/src/commands/insertText.ts +0 -20
- package/src/commands/replace.ts +0 -20
- package/src/commands/replaceRange.ts +0 -36
- package/src/commands/resetNodeAttributes.ts +0 -31
- package/src/commands/updateNodeAttributes.ts +0 -33
- 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 {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
42
|
-
|
|
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
|
-
|
|
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
|
-
|
|
54
|
-
|
|
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 {
|
|
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
|
|
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:
|
|
31
|
-
enablePasteRules:
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
|
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:
|
|
64
|
-
parseHTML?: ((element: HTMLElement) =>
|
|
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
|
|
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:
|
|
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:
|
|
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
|
|
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]
|
|
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
|
|
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
|
|
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:
|
|
9
|
-
if (
|
|
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:
|
|
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:
|
|
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
|
-
|
|
3
|
-
const
|
|
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
|
|
5
|
+
return new window.DOMParser().parseFromString(wrappedValue, 'text/html').body
|
|
7
6
|
}
|
package/src/utilities/isClass.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export default function isEmptyObject(
|
|
2
|
-
return Object.keys(
|
|
1
|
+
export default function isEmptyObject(value = {}): boolean {
|
|
2
|
+
return Object.keys(value).length === 0 && value.constructor === Object
|
|
3
3
|
}
|