{"version":3,"file":"js/chunk-vendors-43cd6784.047ddd24.js","mappings":"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","sources":["webpack://ida-jandaya/./node_modules/tiptap-commands/dist/commands.esm.js","webpack://ida-jandaya/./node_modules/tiptap-extensions/dist/extensions.esm.js"],"sourcesContent":["\n /*!\n * tiptap-commands v1.17.0\n * (c) 2021 überdosis GbR (limited liability)\n * @license MIT\n */\n \nimport { setBlockType, lift, wrapIn } from 'prosemirror-commands';\nexport { autoJoin, baseKeymap, chainCommands, createParagraphNear, deleteSelection, exitCode, joinBackward, joinDown, joinForward, joinUp, lift, liftEmptyBlock, macBaseKeymap, newlineInCode, pcBaseKeymap, selectAll, selectNodeBackward, selectNodeForward, selectParentNode, setBlockType, splitBlock, splitBlockKeepMarks, toggleMark, wrapIn } from 'prosemirror-commands';\nimport { liftListItem, wrapInList } from 'prosemirror-schema-list';\nexport { addListNodes, liftListItem, sinkListItem, splitListItem, wrapInList } from 'prosemirror-schema-list';\nimport { InputRule } from 'prosemirror-inputrules';\nexport { textblockTypeInputRule, wrappingInputRule } from 'prosemirror-inputrules';\nimport { Plugin } from 'prosemirror-state';\nimport { Slice, Fragment } from 'prosemirror-model';\nimport { getMarkRange, nodeIsActive, findParentNode } from 'tiptap-utils';\n\nfunction insertText (text = '') {\n return (state, dispatch) => {\n const {\n $from\n } = state.selection;\n const {\n pos\n } = $from.pos;\n dispatch(state.tr.insertText(text, pos));\n return true;\n };\n}\n\nfunction getMarksBetween(start, end, state) {\n let marks = [];\n state.doc.nodesBetween(start, end, (node, pos) => {\n marks = [...marks, ...node.marks.map(mark => ({\n start: pos,\n end: pos + node.nodeSize,\n mark\n }))];\n });\n return marks;\n}\n\nfunction markInputRule (regexp, markType, getAttrs) {\n return new InputRule(regexp, (state, match, start, end) => {\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const {\n tr\n } = state;\n const m = match.length - 1;\n let markEnd = end;\n let markStart = start;\n\n if (match[m]) {\n const matchStart = start + match[0].indexOf(match[m - 1]);\n const matchEnd = matchStart + match[m - 1].length - 1;\n const textStart = matchStart + match[m - 1].lastIndexOf(match[m]);\n const textEnd = textStart + match[m].length;\n const excludedMarks = getMarksBetween(start, end, state).filter(item => {\n const {\n excluded\n } = item.mark.type;\n return excluded.find(type => type.name === markType.name);\n }).filter(item => item.end > matchStart);\n\n if (excludedMarks.length) {\n return false;\n }\n\n if (textEnd < matchEnd) {\n tr.delete(textEnd, matchEnd);\n }\n\n if (textStart > matchStart) {\n tr.delete(matchStart, textStart);\n }\n\n markStart = matchStart;\n markEnd = markStart + match[m].length;\n }\n\n tr.addMark(markStart, markEnd, markType.create(attrs));\n tr.removeStoredMark(markType);\n return tr;\n });\n}\n\nfunction nodeInputRule (regexp, type, getAttrs) {\n return new InputRule(regexp, (state, match, start, end) => {\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const {\n tr\n } = state;\n\n if (match[0]) {\n tr.replaceWith(start - 1, end, type.create(attrs));\n }\n\n return tr;\n });\n}\n\nfunction pasteRule (regexp, type, getAttrs) {\n const handler = fragment => {\n const nodes = [];\n fragment.forEach(child => {\n if (child.isText) {\n const {\n text\n } = child;\n let pos = 0;\n let match;\n\n do {\n match = regexp.exec(text);\n\n if (match) {\n const start = match.index;\n const end = start + match[0].length;\n const attrs = getAttrs instanceof Function ? getAttrs(match[0]) : getAttrs;\n\n if (start > 0) {\n nodes.push(child.cut(pos, start));\n }\n\n nodes.push(child.cut(start, end).mark(type.create(attrs).addToSet(child.marks)));\n pos = end;\n }\n } while (match);\n\n if (pos < text.length) {\n nodes.push(child.cut(pos));\n }\n } else {\n nodes.push(child.copy(handler(child.content)));\n }\n });\n return Fragment.fromArray(nodes);\n };\n\n return new Plugin({\n props: {\n transformPasted: slice => new Slice(handler(slice.content), slice.openStart, slice.openEnd)\n }\n });\n}\n\nfunction markPasteRule (regexp, type, getAttrs) {\n const handler = (fragment, parent) => {\n const nodes = [];\n fragment.forEach(child => {\n if (child.isText) {\n const {\n text,\n marks\n } = child;\n let pos = 0;\n let match;\n const isLink = !!marks.filter(x => x.type.name === 'link')[0]; // eslint-disable-next-line\n\n while (!isLink && (match = regexp.exec(text)) !== null) {\n if (parent && parent.type.allowsMarkType(type) && match[1]) {\n const start = match.index;\n const end = start + match[0].length;\n const textStart = start + match[0].indexOf(match[1]);\n const textEnd = textStart + match[1].length;\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs; // adding text before markdown to nodes\n\n if (start > 0) {\n nodes.push(child.cut(pos, start));\n } // adding the markdown part to nodes\n\n\n nodes.push(child.cut(textStart, textEnd).mark(type.create(attrs).addToSet(child.marks)));\n pos = end;\n }\n } // adding rest of text to nodes\n\n\n if (pos < text.length) {\n nodes.push(child.cut(pos));\n }\n } else {\n nodes.push(child.copy(handler(child.content, child)));\n }\n });\n return Fragment.fromArray(nodes);\n };\n\n return new Plugin({\n props: {\n transformPasted: slice => new Slice(handler(slice.content), slice.openStart, slice.openEnd)\n }\n });\n}\n\nfunction removeMark (type) {\n return (state, dispatch) => {\n const {\n tr,\n selection\n } = state;\n let {\n from,\n to\n } = selection;\n const {\n $from,\n empty\n } = selection;\n\n if (empty) {\n const range = getMarkRange($from, type);\n from = range.from;\n to = range.to;\n }\n\n tr.removeMark(from, to, type);\n return dispatch(tr);\n };\n}\n\nfunction replaceText (range = null, type, attrs = {}, fragment = Fragment.empty) {\n return (state, dispatch) => {\n const {\n $from,\n $to\n } = state.selection;\n const index = $from.index();\n const from = range ? range.from : $from.pos;\n const to = range ? range.to : $to.pos;\n\n if (!$from.parent.canReplaceWith(index, index, type)) {\n return false;\n }\n\n if (dispatch) {\n dispatch(state.tr.replaceWith(from, to, type.create(attrs, fragment)));\n }\n\n return true;\n };\n}\n\nfunction setInlineBlockType (type, attrs = {}) {\n return (state, dispatch) => {\n const {\n $from\n } = state.selection;\n const index = $from.index();\n\n if (!$from.parent.canReplaceWith(index, index, type)) {\n return false;\n }\n\n if (dispatch) {\n dispatch(state.tr.replaceSelectionWith(type.create(attrs)));\n }\n\n return true;\n };\n}\n\n// see https://github.com/ProseMirror/prosemirror-transform/blob/main/src/structure.js\n// Since this piece of code was \"borrowed\" from prosemirror, ESLint rules are ignored.\n\n/* eslint-disable max-len, no-plusplus, no-undef, eqeqeq */\n\nfunction canSplit(doc, pos, depth = 1, typesAfter) {\n const $pos = doc.resolve(pos);\n const base = $pos.depth - depth;\n const innerType = typesAfter && typesAfter[typesAfter.length - 1] || $pos.parent;\n if (base < 0 || $pos.parent.type.spec.isolating || !$pos.parent.canReplace($pos.index(), $pos.parent.childCount) || !innerType.type.validContent($pos.parent.content.cutByIndex($pos.index(), $pos.parent.childCount))) return false;\n\n for (let d = $pos.depth - 1, i = depth - 2; d > base; d--, i--) {\n const node = $pos.node(d);\n const index = $pos.index(d);\n if (node.type.spec.isolating) return false;\n let rest = node.content.cutByIndex(index, node.childCount);\n const after = typesAfter && typesAfter[i] || node;\n if (after != node) rest = rest.replaceChild(0, after.type.create(after.attrs));\n /* Change starts from here */\n // if (!node.canReplace(index + 1, node.childCount) || !after.type.validContent(rest))\n // return false\n\n if (!node.canReplace(index + 1, node.childCount)) return false;\n /* Change ends here */\n }\n\n const index = $pos.indexAfter(base);\n const baseType = typesAfter && typesAfter[0];\n return $pos.node(base).canReplaceWith(index, index, baseType ? baseType.type : $pos.node(base + 1).type);\n} // this is a copy of splitListItem\n// see https://github.com/ProseMirror/prosemirror-schema-list/blob/main/src/schema-list.js\n\n\nfunction splitToDefaultListItem(itemType) {\n return function (state, dispatch) {\n const {\n $from,\n $to,\n node\n } = state.selection;\n if (node && node.isBlock || $from.depth < 2 || !$from.sameParent($to)) return false;\n const grandParent = $from.node(-1);\n if (grandParent.type != itemType) return false;\n\n if ($from.parent.content.size == 0) {\n // In an empty block. If this is a nested list, the wrapping\n // list item should be split. Otherwise, bail out and let next\n // command handle lifting.\n if ($from.depth == 2 || $from.node(-3).type != itemType || $from.index(-2) != $from.node(-2).childCount - 1) return false;\n\n if (dispatch) {\n let wrap = Fragment.empty;\n const keepItem = $from.index(-1) > 0; // Build a fragment containing empty versions of the structure\n // from the outer list item to the parent node of the cursor\n\n for (let d = $from.depth - (keepItem ? 1 : 2); d >= $from.depth - 3; d--) wrap = Fragment.from($from.node(d).copy(wrap)); // Add a second list item with an empty default start node\n\n\n wrap = wrap.append(Fragment.from(itemType.createAndFill()));\n const tr = state.tr.replace($from.before(keepItem ? null : -1), $from.after(-3), new Slice(wrap, keepItem ? 3 : 2, 2));\n tr.setSelection(state.selection.constructor.near(tr.doc.resolve($from.pos + (keepItem ? 3 : 2))));\n dispatch(tr.scrollIntoView());\n }\n\n return true;\n }\n\n const nextType = $to.pos == $from.end() ? grandParent.contentMatchAt($from.indexAfter(-1)).defaultType : null;\n const tr = state.tr.delete($from.pos, $to.pos);\n /* Change starts from here */\n // let types = nextType && [null, {type: nextType}]\n\n let types = nextType && [{\n type: itemType\n }, {\n type: nextType\n }];\n if (!types) types = [{\n type: itemType\n }, null];\n /* Change ends here */\n\n if (!canSplit(tr.doc, $from.pos, 2, types)) return false;\n if (dispatch) dispatch(tr.split($from.pos, 2, types).scrollIntoView());\n return true;\n };\n}\n/* eslint-enable max-len, no-plusplus, no-undef, eqeqeq */\n\nfunction toggleBlockType (type, toggletype, attrs = {}) {\n return (state, dispatch, view) => {\n const isActive = nodeIsActive(state, type, attrs);\n\n if (isActive) {\n return setBlockType(toggletype)(state, dispatch, view);\n }\n\n return setBlockType(type, attrs)(state, dispatch, view);\n };\n}\n\nfunction isList(node, schema) {\n return node.type === schema.nodes.bullet_list || node.type === schema.nodes.ordered_list || node.type === schema.nodes.todo_list;\n}\n\nfunction toggleList(listType, itemType) {\n return (state, dispatch, view) => {\n const {\n schema,\n selection\n } = state;\n const {\n $from,\n $to\n } = selection;\n const range = $from.blockRange($to);\n\n if (!range) {\n return false;\n }\n\n const parentList = findParentNode(node => isList(node, schema))(selection);\n\n if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {\n if (parentList.node.type === listType) {\n return liftListItem(itemType)(state, dispatch, view);\n }\n\n if (isList(parentList.node, schema) && listType.validContent(parentList.node.content)) {\n const {\n tr\n } = state;\n tr.setNodeMarkup(parentList.pos, listType);\n\n if (dispatch) {\n dispatch(tr);\n }\n\n return false;\n }\n }\n\n return wrapInList(listType)(state, dispatch, view);\n };\n}\n\nfunction toggleWrap (type, attrs = {}) {\n return (state, dispatch, view) => {\n const isActive = nodeIsActive(state, type, attrs);\n\n if (isActive) {\n return lift(state, dispatch);\n }\n\n return wrapIn(type, attrs)(state, dispatch, view);\n };\n}\n\nfunction updateMark (type, attrs) {\n return (state, dispatch) => {\n const {\n tr,\n selection,\n doc\n } = state;\n const {\n ranges,\n empty\n } = selection;\n\n if (empty) {\n const {\n from,\n to\n } = getMarkRange(selection.$from, type);\n\n if (doc.rangeHasMark(from, to, type)) {\n tr.removeMark(from, to, type);\n }\n\n tr.addMark(from, to, type.create(attrs));\n } else {\n ranges.forEach(ref$1 => {\n const {\n $to,\n $from\n } = ref$1;\n\n if (doc.rangeHasMark($from.pos, $to.pos, type)) {\n tr.removeMark($from.pos, $to.pos, type);\n }\n\n tr.addMark($from.pos, $to.pos, type.create(attrs));\n });\n }\n\n return dispatch(tr);\n };\n}\n\nexport { insertText, markInputRule, markPasteRule, nodeInputRule, pasteRule, removeMark, replaceText, setInlineBlockType, splitToDefaultListItem, toggleBlockType, toggleList, toggleWrap, updateMark };\n","\n /*!\n * tiptap-extensions v1.35.1\n * (c) 2021 überdosis GbR (limited liability)\n * @license MIT\n */\n \nimport { Node, Plugin, PluginKey, Mark, Extension } from 'tiptap';\nimport { toggleWrap, wrappingInputRule, toggleList, toggleBlockType, setBlockType, textblockTypeInputRule, chainCommands, exitCode, nodeInputRule, splitListItem, sinkListItem, liftListItem, insertText, replaceText, splitToDefaultListItem, toggleMark, markInputRule, markPasteRule, updateMark, removeMark, pasteRule } from 'tiptap-commands';\nimport low from 'lowlight/lib/core';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { findBlockNodes, createTable, getMarkAttrs, nodeEqualsType } from 'tiptap-utils';\nimport { Fragment } from 'prosemirror-model';\nimport { Plugin as Plugin$1, PluginKey as PluginKey$1, TextSelection } from 'prosemirror-state';\nimport { tableNodes, addColumnBefore, addColumnAfter, deleteColumn, addRowBefore, addRowAfter, deleteRow, deleteTable, mergeCells, splitCell, toggleHeaderColumn, toggleHeaderRow, toggleHeaderCell, setCellAttr, fixTables, goToNextCell, columnResizing, tableEditing } from 'prosemirror-tables';\nimport { Step } from 'prosemirror-transform';\nimport { sendableSteps, getVersion, receiveTransaction, collab } from 'prosemirror-collab';\nimport { history, undo, redo, undoDepth, redoDepth } from 'prosemirror-history';\n\nclass Blockquote extends Node {\n get name() {\n return 'blockquote';\n }\n\n get schema() {\n return {\n content: 'block*',\n group: 'block',\n defining: true,\n draggable: false,\n parseDOM: [{\n tag: 'blockquote'\n }],\n toDOM: () => ['blockquote', 0]\n };\n }\n\n commands({\n type\n }) {\n return () => toggleWrap(type);\n }\n\n keys({\n type\n }) {\n return {\n 'Ctrl->': toggleWrap(type)\n };\n }\n\n inputRules({\n type\n }) {\n return [wrappingInputRule(/^\\s*>\\s$/, type)];\n }\n\n}\n\nclass BulletList extends Node {\n get name() {\n return 'bullet_list';\n }\n\n get schema() {\n return {\n content: 'list_item+',\n group: 'block',\n parseDOM: [{\n tag: 'ul'\n }],\n toDOM: () => ['ul', 0]\n };\n }\n\n commands({\n type,\n schema\n }) {\n return () => toggleList(type, schema.nodes.list_item);\n }\n\n keys({\n type,\n schema\n }) {\n return {\n 'Shift-Ctrl-8': toggleList(type, schema.nodes.list_item)\n };\n }\n\n inputRules({\n type\n }) {\n return [wrappingInputRule(/^\\s*([-+*])\\s$/, type)];\n }\n\n}\n\nclass CodeBlock extends Node {\n get name() {\n return 'code_block';\n }\n\n get schema() {\n return {\n content: 'text*',\n marks: '',\n group: 'block',\n code: true,\n defining: true,\n draggable: false,\n parseDOM: [{\n tag: 'pre',\n preserveWhitespace: 'full'\n }],\n toDOM: () => ['pre', ['code', 0]]\n };\n }\n\n commands({\n type,\n schema\n }) {\n return () => toggleBlockType(type, schema.nodes.paragraph);\n }\n\n keys({\n type\n }) {\n return {\n 'Shift-Ctrl-\\\\': setBlockType(type)\n };\n }\n\n inputRules({\n type\n }) {\n return [textblockTypeInputRule(/^```$/, type)];\n }\n\n}\n\nfunction getDecorations({\n doc,\n name\n}) {\n const decorations = [];\n const blocks = findBlockNodes(doc).filter(item => item.node.type.name === name);\n\n const flatten = list => list.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []);\n\n function parseNodes(nodes, className = []) {\n return nodes.map(node => {\n const classes = [...className, ...(node.properties ? node.properties.className : [])];\n\n if (node.children) {\n return parseNodes(node.children, classes);\n }\n\n return {\n text: node.value,\n classes\n };\n });\n }\n\n blocks.forEach(block => {\n let startPos = block.pos + 1;\n const nodes = low.highlightAuto(block.node.textContent).value;\n flatten(parseNodes(nodes)).map(node => {\n const from = startPos;\n const to = from + node.text.length;\n startPos = to;\n return { ...node,\n from,\n to\n };\n }).forEach(node => {\n const decoration = Decoration.inline(node.from, node.to, {\n class: node.classes.join(' ')\n });\n decorations.push(decoration);\n });\n });\n return DecorationSet.create(doc, decorations);\n}\n\nfunction HighlightPlugin({\n name\n}) {\n return new Plugin({\n name: new PluginKey('highlight'),\n state: {\n init: (_, {\n doc\n }) => getDecorations({\n doc,\n name\n }),\n apply: (transaction, decorationSet, oldState, newState) => {\n // TODO: find way to cache decorations\n // https://discuss.prosemirror.net/t/how-to-update-multiple-inline-decorations-on-node-change/1493\n const oldNodeName = oldState.selection.$head.parent.type.name;\n const newNodeName = newState.selection.$head.parent.type.name;\n const oldNodes = findBlockNodes(oldState.doc).filter(item => item.node.type.name === name);\n const newNodes = findBlockNodes(newState.doc).filter(item => item.node.type.name === name); // Apply decorations if selection includes named node, or transaction changes named node.\n\n if (transaction.docChanged && ([oldNodeName, newNodeName].includes(name) || newNodes.length !== oldNodes.length)) {\n return getDecorations({\n doc: transaction.doc,\n name\n });\n }\n\n return decorationSet.map(transaction.mapping, transaction.doc);\n }\n },\n props: {\n decorations(state) {\n return this.getState(state);\n }\n\n }\n });\n}\n\nclass CodeBlockHighlight extends Node {\n constructor(options = {}) {\n super(options);\n\n try {\n Object.entries(this.options.languages).forEach(([name, mapping]) => {\n low.registerLanguage(name, mapping);\n });\n } catch (err) {\n throw new Error('Invalid syntax highlight definitions: define at least one highlight.js language mapping');\n }\n }\n\n get name() {\n return 'code_block';\n }\n\n get defaultOptions() {\n return {\n languages: {}\n };\n }\n\n get schema() {\n return {\n content: 'text*',\n marks: '',\n group: 'block',\n code: true,\n defining: true,\n draggable: false,\n parseDOM: [{\n tag: 'pre',\n preserveWhitespace: 'full'\n }],\n toDOM: () => ['pre', ['code', 0]]\n };\n }\n\n commands({\n type,\n schema\n }) {\n return () => toggleBlockType(type, schema.nodes.paragraph);\n }\n\n keys({\n type\n }) {\n return {\n 'Shift-Ctrl-\\\\': setBlockType(type)\n };\n }\n\n inputRules({\n type\n }) {\n return [textblockTypeInputRule(/^```$/, type)];\n }\n\n get plugins() {\n return [HighlightPlugin({\n name: this.name\n })];\n }\n\n}\n\nclass HardBreak extends Node {\n get name() {\n return 'hard_break';\n }\n\n get schema() {\n return {\n inline: true,\n group: 'inline',\n selectable: false,\n parseDOM: [{\n tag: 'br'\n }],\n toDOM: () => ['br']\n };\n }\n\n commands({\n type\n }) {\n return () => chainCommands(exitCode, (state, dispatch) => {\n dispatch(state.tr.replaceSelectionWith(type.create()).scrollIntoView());\n return true;\n });\n }\n\n keys({\n type\n }) {\n const command = chainCommands(exitCode, (state, dispatch) => {\n dispatch(state.tr.replaceSelectionWith(type.create()).scrollIntoView());\n return true;\n });\n return {\n 'Mod-Enter': command,\n 'Shift-Enter': command\n };\n }\n\n}\n\nclass Heading extends Node {\n get name() {\n return 'heading';\n }\n\n get defaultOptions() {\n return {\n levels: [1, 2, 3, 4, 5, 6]\n };\n }\n\n get schema() {\n return {\n attrs: {\n level: {\n default: 1\n }\n },\n content: 'inline*',\n group: 'block',\n defining: true,\n draggable: false,\n parseDOM: this.options.levels.map(level => ({\n tag: `h${level}`,\n attrs: {\n level\n }\n })),\n toDOM: node => [`h${node.attrs.level}`, 0]\n };\n }\n\n commands({\n type,\n schema\n }) {\n return attrs => toggleBlockType(type, schema.nodes.paragraph, attrs);\n }\n\n keys({\n type\n }) {\n return this.options.levels.reduce((items, level) => ({ ...items,\n ...{\n [`Shift-Ctrl-${level}`]: setBlockType(type, {\n level\n })\n }\n }), {});\n }\n\n inputRules({\n type\n }) {\n return this.options.levels.map(level => textblockTypeInputRule(new RegExp(`^(#{1,${level}})\\\\s$`), type, () => ({\n level\n })));\n }\n\n}\n\nclass HorizontalRule extends Node {\n get name() {\n return 'horizontal_rule';\n }\n\n get schema() {\n return {\n group: 'block',\n parseDOM: [{\n tag: 'hr'\n }],\n toDOM: () => ['hr']\n };\n }\n\n commands({\n type\n }) {\n return () => (state, dispatch) => dispatch(state.tr.replaceSelectionWith(type.create()));\n }\n\n inputRules({\n type\n }) {\n return [nodeInputRule(/^(?:---|___\\s|\\*\\*\\*\\s)$/, type)];\n }\n\n}\n\n/**\n * Matches following attributes in Markdown-typed image: [, alt, src, title]\n *\n * Example:\n *  -> [, \"Lorem\", \"image.jpg\"]\n *  -> [, \"\", \"image.jpg\", \"Ipsum\"]\n *  -> [, \"Lorem\", \"image.jpg\", \"Ipsum\"]\n */\n\nconst IMAGE_INPUT_REGEX = /!\\[(.+|:?)]\\((\\S+)(?:(?:\\s+)[\"'](\\S+)[\"'])?\\)/;\nclass Image extends Node {\n get name() {\n return 'image';\n }\n\n get schema() {\n return {\n inline: true,\n attrs: {\n src: {},\n alt: {\n default: null\n },\n title: {\n default: null\n }\n },\n group: 'inline',\n draggable: true,\n parseDOM: [{\n tag: 'img[src]',\n getAttrs: dom => ({\n src: dom.getAttribute('src'),\n title: dom.getAttribute('title'),\n alt: dom.getAttribute('alt')\n })\n }],\n toDOM: node => ['img', node.attrs]\n };\n }\n\n commands({\n type\n }) {\n return attrs => (state, dispatch) => {\n const {\n selection\n } = state;\n const position = selection.$cursor ? selection.$cursor.pos : selection.$to.pos;\n const node = type.create(attrs);\n const transaction = state.tr.insert(position, node);\n dispatch(transaction);\n };\n }\n\n inputRules({\n type\n }) {\n return [nodeInputRule(IMAGE_INPUT_REGEX, type, match => {\n const [, alt, src, title] = match;\n return {\n src,\n alt,\n title\n };\n })];\n }\n\n get plugins() {\n return [new Plugin({\n props: {\n handleDOMEvents: {\n drop(view, event) {\n const hasFiles = event.dataTransfer && event.dataTransfer.files && event.dataTransfer.files.length;\n\n if (!hasFiles) {\n return;\n }\n\n const images = Array.from(event.dataTransfer.files).filter(file => /image/i.test(file.type));\n\n if (images.length === 0) {\n return;\n }\n\n event.preventDefault();\n const {\n schema\n } = view.state;\n const coordinates = view.posAtCoords({\n left: event.clientX,\n top: event.clientY\n });\n images.forEach(image => {\n const reader = new FileReader();\n\n reader.onload = readerEvent => {\n const node = schema.nodes.image.create({\n src: readerEvent.target.result\n });\n const transaction = view.state.tr.insert(coordinates.pos, node);\n view.dispatch(transaction);\n };\n\n reader.readAsDataURL(image);\n });\n }\n\n }\n }\n })];\n }\n\n}\n\nclass ListItem extends Node {\n get name() {\n return 'list_item';\n }\n\n get schema() {\n return {\n content: 'paragraph block*',\n defining: true,\n draggable: false,\n parseDOM: [{\n tag: 'li'\n }],\n toDOM: () => ['li', 0]\n };\n }\n\n keys({\n type\n }) {\n return {\n Enter: splitListItem(type),\n Tab: sinkListItem(type),\n 'Shift-Tab': liftListItem(type)\n };\n }\n\n}\n\nfunction getTextBetween(node, from, to, blockSeparator, inlineSeparator, leafText = '\\0') {\n let text = '';\n let blockSeparated = true;\n let inlineNode = null;\n node.content.nodesBetween(from, to, (innerNode, pos) => {\n if (innerNode.isText) {\n if (inlineNode) {\n inlineNode = null;\n return;\n }\n\n text += innerNode.text.slice(Math.max(from, pos) - pos, to - pos);\n blockSeparated = !blockSeparator;\n } else if (innerNode.isLeaf && leafText) {\n text += leafText;\n blockSeparated = !blockSeparator;\n } else if (innerNode.isInline && !innerNode.isLeaf) {\n text += inlineSeparator;\n\n if (innerNode.textContent) {\n text += innerNode.textContent;\n inlineNode = innerNode;\n }\n\n text += inlineSeparator;\n blockSeparated = !blockSeparated;\n } else if (!blockSeparated && innerNode.isBlock) {\n text += blockSeparator;\n blockSeparated = true;\n }\n }, 0);\n return text;\n} // Create a matcher that matches when a specific character is typed. Useful for @mentions and #tags.\n\n\nfunction triggerCharacter({\n char = '@',\n allowSpaces = false,\n startOfLine = false\n}) {\n return $position => {\n // cancel if top level node\n if ($position.depth <= 0) {\n return false;\n } // Matching expressions used for later\n\n\n const escapedChar = `\\\\${char}`;\n const suffix = new RegExp(`\\\\s${escapedChar}$`);\n const prefix = startOfLine ? '^' : '';\n const regexp = allowSpaces ? new RegExp(`${prefix}${escapedChar}.*?(?=\\\\s${escapedChar}|$)`, 'gm') : new RegExp(`${prefix}(?:^)?${escapedChar}[^\\\\s${escapedChar}]*`, 'gm'); // Lookup the boundaries of the current node\n\n const textFrom = $position.before();\n const textTo = $position.end();\n const text = getTextBetween($position.doc, textFrom, textTo, '\\0', '\\0');\n let match = regexp.exec(text);\n let position;\n\n while (match !== null) {\n // JavaScript doesn't have lookbehinds; this hacks a check that first character is \" \"\n // or the line beginning\n const matchPrefix = match.input.slice(Math.max(0, match.index - 1), match.index);\n\n if (/^[\\s\\0]?$/.test(matchPrefix)) {\n // The absolute position of the match in the document\n const from = match.index + $position.start();\n let to = from + match[0].length; // Edge case handling; if spaces are allowed and we're directly in between\n // two triggers\n\n if (allowSpaces && suffix.test(text.slice(to - 1, to + 1))) {\n match[0] += ' ';\n to += 1;\n } // If the $position is located within the matched substring, return that range\n\n\n if (from < $position.pos && to >= $position.pos) {\n position = {\n range: {\n from,\n to\n },\n query: match[0].slice(char.length),\n text: match[0]\n };\n }\n }\n\n match = regexp.exec(text);\n }\n\n return position;\n };\n}\n\nfunction SuggestionsPlugin({\n matcher = {\n char: '@',\n allowSpaces: false,\n startOfLine: false\n },\n appendText = null,\n suggestionClass = 'suggestion',\n command = () => false,\n items = [],\n onEnter = () => false,\n onChange = () => false,\n onExit = () => false,\n onKeyDown = () => false,\n onFilter = (searchItems, query) => {\n if (!query) {\n return searchItems;\n }\n\n return searchItems.filter(item => JSON.stringify(item).toLowerCase().includes(query.toLowerCase()));\n }\n}) {\n return new Plugin$1({\n key: new PluginKey$1('suggestions'),\n\n view() {\n return {\n update: async (view, prevState) => {\n const prev = this.key.getState(prevState);\n const next = this.key.getState(view.state); // See how the state changed\n\n const moved = prev.active && next.active && prev.range.from !== next.range.from;\n const started = !prev.active && next.active;\n const stopped = prev.active && !next.active;\n const changed = !started && !stopped && prev.query !== next.query;\n const handleStart = started || moved;\n const handleChange = changed && !moved;\n const handleExit = stopped || moved; // Cancel when suggestion isn't active\n\n if (!handleStart && !handleChange && !handleExit) {\n return;\n }\n\n const state = handleExit ? prev : next;\n const decorationNode = document.querySelector(`[data-decoration-id=\"${state.decorationId}\"]`); // build a virtual node for popper.js or tippy.js\n // this can be used for building popups without a DOM node\n\n const virtualNode = decorationNode ? {\n getBoundingClientRect() {\n return decorationNode.getBoundingClientRect();\n },\n\n clientWidth: decorationNode.clientWidth,\n clientHeight: decorationNode.clientHeight\n } : null;\n const props = {\n view,\n range: state.range,\n query: state.query,\n text: state.text,\n decorationNode,\n virtualNode,\n items: handleChange || handleStart ? await onFilter(Array.isArray(items) ? items : await items(), state.query) : [],\n command: ({\n range,\n attrs\n }) => {\n command({\n range,\n attrs,\n schema: view.state.schema\n })(view.state, view.dispatch, view);\n\n if (appendText) {\n insertText(appendText)(view.state, view.dispatch, view);\n }\n }\n }; // Trigger the hooks when necessary\n\n if (handleExit) {\n onExit(props);\n }\n\n if (handleChange) {\n onChange(props);\n }\n\n if (handleStart) {\n onEnter(props);\n }\n }\n };\n },\n\n state: {\n // Initialize the plugin's internal state.\n init() {\n return {\n active: false,\n range: {},\n query: null,\n text: null\n };\n },\n\n // Apply changes to the plugin state from a view transaction.\n apply(tr, prev) {\n const {\n selection\n } = tr;\n const next = { ...prev\n }; // We can only be suggesting if there is no selection\n\n if (selection.from === selection.to) {\n // Reset active state if we just left the previous suggestion range\n if (selection.from < prev.range.from || selection.from > prev.range.to) {\n next.active = false;\n } // Try to match against where our cursor currently is\n\n\n const $position = selection.$from;\n const match = triggerCharacter(matcher)($position);\n const decorationId = (Math.random() + 1).toString(36).substr(2, 5); // If we found a match, update the current state to show it\n\n if (match) {\n next.active = true;\n next.decorationId = prev.decorationId ? prev.decorationId : decorationId;\n next.range = match.range;\n next.query = match.query;\n next.text = match.text;\n } else {\n next.active = false;\n }\n } else {\n next.active = false;\n } // Make sure to empty the range if suggestion is inactive\n\n\n if (!next.active) {\n next.decorationId = null;\n next.range = {};\n next.query = null;\n next.text = null;\n }\n\n return next;\n }\n\n },\n props: {\n // Call the keydown hook if suggestion is active.\n handleKeyDown(view, event) {\n const {\n active,\n range\n } = this.getState(view.state);\n if (!active) return false;\n return onKeyDown({\n view,\n event,\n range\n });\n },\n\n // Setup decorator on the currently active suggestion.\n decorations(editorState) {\n const {\n active,\n range,\n decorationId\n } = this.getState(editorState);\n if (!active) return null;\n return DecorationSet.create(editorState.doc, [Decoration.inline(range.from, range.to, {\n nodeName: 'span',\n class: suggestionClass,\n 'data-decoration-id': decorationId\n })]);\n }\n\n }\n });\n}\n\nclass Mention extends Node {\n get name() {\n return 'mention';\n }\n\n get defaultOptions() {\n return {\n matcher: {\n char: '@',\n allowSpaces: false,\n startOfLine: false\n },\n mentionClass: 'mention',\n suggestionClass: 'mention-suggestion'\n };\n }\n\n getLabel(dom) {\n return dom.innerText.split(this.options.matcher.char).join('');\n }\n\n createFragment(schema, label) {\n return Fragment.fromJSON(schema, [{\n type: 'text',\n text: `${this.options.matcher.char}${label}`\n }]);\n }\n\n insertMention(range, attrs, schema) {\n const nodeType = schema.nodes[this.name];\n const nodeFragment = this.createFragment(schema, attrs.label);\n return replaceText(range, nodeType, attrs, nodeFragment);\n }\n\n get schema() {\n return {\n attrs: {\n id: {},\n label: {}\n },\n group: 'inline',\n inline: true,\n content: 'text*',\n selectable: false,\n atom: true,\n toDOM: node => ['span', {\n class: this.options.mentionClass,\n 'data-mention-id': node.attrs.id\n }, `${this.options.matcher.char}${node.attrs.label}`],\n parseDOM: [{\n tag: 'span[data-mention-id]',\n getAttrs: dom => {\n const id = dom.getAttribute('data-mention-id');\n const label = this.getLabel(dom);\n return {\n id,\n label\n };\n },\n getContent: (dom, schema) => {\n const label = this.getLabel(dom);\n return this.createFragment(schema, label);\n }\n }]\n };\n }\n\n commands({\n schema\n }) {\n return attrs => this.insertMention(null, attrs, schema);\n }\n\n get plugins() {\n return [SuggestionsPlugin({\n command: ({\n range,\n attrs,\n schema\n }) => this.insertMention(range, attrs, schema),\n appendText: ' ',\n matcher: this.options.matcher,\n items: this.options.items,\n onEnter: this.options.onEnter,\n onChange: this.options.onChange,\n onExit: this.options.onExit,\n onKeyDown: this.options.onKeyDown,\n onFilter: this.options.onFilter,\n suggestionClass: this.options.suggestionClass\n })];\n }\n\n}\n\nclass OrderedList extends Node {\n get name() {\n return 'ordered_list';\n }\n\n get schema() {\n return {\n attrs: {\n order: {\n default: 1\n }\n },\n content: 'list_item+',\n group: 'block',\n parseDOM: [{\n tag: 'ol',\n getAttrs: dom => ({\n order: dom.hasAttribute('start') ? +dom.getAttribute('start') : 1\n })\n }],\n toDOM: node => node.attrs.order === 1 ? ['ol', 0] : ['ol', {\n start: node.attrs.order\n }, 0]\n };\n }\n\n commands({\n type,\n schema\n }) {\n return () => toggleList(type, schema.nodes.list_item);\n }\n\n keys({\n type,\n schema\n }) {\n return {\n 'Shift-Ctrl-9': toggleList(type, schema.nodes.list_item)\n };\n }\n\n inputRules({\n type\n }) {\n return [wrappingInputRule(/^(\\d+)\\.\\s$/, type, match => ({\n order: +match[1]\n }), (match, node) => node.childCount + node.attrs.order === +match[1])];\n }\n\n}\n\nvar TableNodes = tableNodes({\n tableGroup: 'block',\n cellContent: 'block+',\n cellAttributes: {\n background: {\n default: null,\n\n getFromDOM(dom) {\n return dom.style.backgroundColor || null;\n },\n\n setDOMAttr(value, attrs) {\n if (value) {\n const style = {\n style: `${attrs.style || ''}background-color: ${value};`\n };\n Object.assign(attrs, style);\n }\n }\n\n }\n }\n});\n\nclass Table extends Node {\n get name() {\n return 'table';\n }\n\n get defaultOptions() {\n return {\n resizable: false\n };\n }\n\n get schema() {\n return TableNodes.table;\n }\n\n commands({\n schema\n }) {\n return {\n createTable: ({\n rowsCount,\n colsCount,\n withHeaderRow\n }) => (state, dispatch) => {\n const offset = state.tr.selection.anchor + 1;\n const nodes = createTable(schema, rowsCount, colsCount, withHeaderRow);\n const tr = state.tr.replaceSelectionWith(nodes).scrollIntoView();\n const resolvedPos = tr.doc.resolve(offset);\n tr.setSelection(TextSelection.near(resolvedPos));\n dispatch(tr);\n },\n addColumnBefore: () => addColumnBefore,\n addColumnAfter: () => addColumnAfter,\n deleteColumn: () => deleteColumn,\n addRowBefore: () => addRowBefore,\n addRowAfter: () => addRowAfter,\n deleteRow: () => deleteRow,\n deleteTable: () => deleteTable,\n toggleCellMerge: () => (state, dispatch) => {\n if (mergeCells(state, dispatch)) {\n return;\n }\n\n splitCell(state, dispatch);\n },\n mergeCells: () => mergeCells,\n splitCell: () => splitCell,\n toggleHeaderColumn: () => toggleHeaderColumn,\n toggleHeaderRow: () => toggleHeaderRow,\n toggleHeaderCell: () => toggleHeaderCell,\n setCellAttr: ({\n name,\n value\n }) => setCellAttr(name, value),\n fixTables: () => fixTables\n };\n }\n\n keys() {\n return {\n Tab: goToNextCell(1),\n 'Shift-Tab': goToNextCell(-1)\n };\n }\n\n get plugins() {\n return [...(this.options.resizable ? [columnResizing()] : []), tableEditing()];\n }\n\n}\n\nclass TableHeader extends Node {\n get name() {\n return 'table_header';\n }\n\n get schema() {\n return TableNodes.table_header;\n }\n\n}\n\nclass TableCell extends Node {\n get name() {\n return 'table_cell';\n }\n\n get schema() {\n return TableNodes.table_cell;\n }\n\n}\n\nclass TableRow extends Node {\n get name() {\n return 'table_row';\n }\n\n get schema() {\n return TableNodes.table_row;\n }\n\n}\n\nclass TodoItem extends Node {\n get name() {\n return 'todo_item';\n }\n\n get defaultOptions() {\n return {\n nested: false\n };\n }\n\n get view() {\n return {\n props: ['node', 'updateAttrs', 'view'],\n methods: {\n onChange() {\n this.updateAttrs({\n done: !this.node.attrs.done\n });\n }\n\n },\n template: `\n