{"version":3,"sources":["webpack:///./node_modules/remixicon/fonts/remixicon.symbol.svg","webpack:///./node_modules/prosemirror-view/dist/index.js","webpack:///./node_modules/uuid/dist/esm-browser/rng.js","webpack:///./node_modules/uuid/dist/esm-browser/regex.js","webpack:///./node_modules/uuid/dist/esm-browser/validate.js","webpack:///./node_modules/uuid/dist/esm-browser/stringify.js","webpack:///./node_modules/uuid/dist/esm-browser/v4.js"],"names":["module","exports","nav","navigator","doc","document","agent","userAgent","ie_edge","exec","ie_upto10","ie_11up","ie","ie_version","documentMode","gecko","test","_chrome","chrome","chrome_version","safari","vendor","ios","maxTouchPoints","mac","platform","android","webkit","documentElement","style","webkit_version","domIndex","node","index","previousSibling","isEquivalentPosition","off","targetNode","targetOff","scanFor","atomElements","dir","nodeSize","parent","parentNode","nodeType","hasBlockDesc","nodeName","contentEditable","childNodes","nodeValue","length","isOnEdge","offset","atStart","atEnd","dom","desc","cur","pmViewDesc","isBlock","contentDOM","selectionCollapsed","domSel","collapsed","isCollapsed","rangeCount","getRangeAt","keyEvent","keyCode","key","event","createEvent","initEvent","code","OuterDecoLevel","this","prototype","Object","create","selectionFromDOM","view","origin","domSelection","state","focusNode","nearestDesc","docView","inWidget","size","head","posFromDOM","focusOffset","$anchor","selection","$head","resolve","nearestDescNode","isAtom","isSelectable","isInline","pos","posBefore","anchor","anchorNode","anchorOffset","bias","selectionBetween","editorOwnsSelection","editable","hasFocus","hasSelection","activeElement","contains","selectionToDOM","force","sel","syncNodeSelection","input","mouseDown","allowDefault","curSel","domObserver","currentSelection","delayedSelectionSync","setCurSelection","disconnectSelection","cursorWrapper","selectCursorWrapper","resetEditableFrom","resetEditableTo","brokenSelectBetweenUneditable","$from","inlineContent","temporarilyEditableNear","from","empty","to","setSelection","root","resetEditable","visible","classList","remove","add","removeClassOnSelectionChange","connectSelection","domFromPos","after","before","setEditable","element","draggable","wasDraggable","ownerDocument","removeEventListener","hideSelectionGuard","addEventListener","setTimeout","range","createRange","img","setEnd","collapse","removeAllRanges","addRange","disabled","descAt","lastSelectedViewDesc","clearNodeSelection","selectNode","deselectNode","undefined","someProp","f","between","_","moveSelectionBlock","$side","max","min","$start","depth","findFrom","apply","dispatch","tr","scrollIntoView","selectHorizontally","mods","$to","next","indexOf","endOfTextblock","textOffset","nodeBefore","nodeAfter","isText","nodePos","nodeLen","isIgnorable","nextSibling","skipIgnoredNodesLeft","moveNode","moveOffset","isBlockNode","prev","setSelFocus","skipIgnoredNodesRight","len","setStart","extend","selectVertically","side","beyond","near","stopNativeHorizontalDelete","sameParent","nextNode","delete","switchEditable","stop","start","safariDownArrowBug","parentOffset","firstChild","child","getMods","result","ctrlKey","metaKey","altKey","shiftKey","captureKeyDown","serializeForClipboard","slice","context","content","openStart","openEnd","childCount","push","type","name","attrs","defaultAttrs","serializer","fromSchema","schema","detachedDoc","wrap","createElement","appendChild","serializeFragment","needsWrap","wrappers","wrapMap","toLowerCase","i","wrapper","setAttribute","JSON","stringify","text","textBetween","parseFromClipboard","html","plainText","$context","inCode","spec","asText","replace","parsed","marks","split","forEach","block","p","serializeNode","readHTML","restoreReplacedSpaces","contextNode","querySelector","sliceData","getAttribute","parser","parseSlice","preserveWhitespace","inlineParents","ignore","addContext","closeSlice","maxOpen","normalizeSiblings","isolating","lastChild","fragment","d","lastWrap","match","contentMatchAt","inLast","findWrapping","addToSibling","closeRight","wrapped","withWrappers","matchType","sibling","inner","copy","replaceChild","append","fill","fillBefore","closeRange","thead","tbody","tfoot","caption","colgroup","col","td","th","_detachedDoc","implementation","createHTMLDocument","metas","elt","firstTag","map","n","join","reverse","innerHTML","nodes","querySelectorAll","textContent","createTextNode","array","parse","e","hasRequiredAttrs","handlers","editHandlers","setSelectionOrigin","lastSelectionOrigin","lastSelectionTime","Date","now","eventCoords","left","clientX","top","clientY","isNear","click","dx","x","dy","y","runHandlerOnContext","propName","inside","$pos","updateSelection","focused","focus","setMeta","selectClickedLeaf","selectClickedNode","selectedNode","selectAt","handleSingleClick","handleDoubleClick","handleTripleClick","defaultTripleClick","button","forceDOMFlush","endComposition","keydown","_event","inOrNearComposition","lastKeyCode","lastKeyCodeTime","forceFlush","preventDefault","lastIOSEnter","lastIOSEnterFallbackTimeout","keyup","keypress","charCode","String","fromCharCode","insertText","selectNodeModifier","mousedown","flushed","lastClick","time","posAtCoords","done","MouseDown","targetPos","mightDrag","startDoc","nodeAt","target","targetDesc","selectable","addAttr","setUneditable","hasAttribute","up","bind","move","removeAttribute","Math","abs","buttons","composing","timeStamp","compositionEndedAt","touchdown","contextmenu","timeoutComposition","scheduleComposeEnd","delay","clearTimeout","composingTimeout","clearComposition","timestampFromCustomEvent","compositionNodes","pop","markParentsDirty","forceUpdate","flushingSoon","dirty","eq","updateState","captureCopy","cssText","getSelection","selectNodeContents","blur","removeChild","compositionstart","compositionupdate","flush","storedMarks","some","m","inclusive","markCursor","compositionend","brokenClipboardAPI","sliceSingleNode","capturePaste","doPaste","value","singleNode","replaceSelectionWith","replaceSelection","cut","data","clipboardData","clearData","setData","deleteSelection","paste","getData","Dragging","dragCopyModifier","dragstart","dataTransfer","effectAllowed","dragging","dragend","window","dragover","dragenter","drop","eventPos","$mouse","insertPos","mapping","isNode","beforeInsert","replaceRangeWith","replaceRange","sameMarkup","end","maps","_from","_to","_newFrom","newTo","relatedTarget","clear","beforeinput","inputType","flushSoon","domChangeCount","$cursor","prop","compareObjs","a","b","WidgetType","toDOM","noSpec","span","oldOffset","deleted","mapResult","Decoration","other","destroy","InlineType","inclusiveStart","inclusiveEnd","NodeType","findIndex","none","DecorationSet","local","children","decorations","buildTree","predicate","findInner","childOff","options","mapInner","newLocal","mapped","valid","onRemove","mapChildren","sort","byPos","addInner","childIndex","childNode","childOffset","found","baseOffset","takeSpansForNode","splice","moveSpans","withoutNulls","concat","removeInner","j","removed","isLeaf","dec","localSet","DecorationGroup","removeOverlap","localsInner","is","members","mappedDecos","member","forChild","sorted","locals","oldChildren","shift","oldStart","oldEnd","newStart","newEnd","dSize","mustRebuild","fromLocal","toLocal","maybeChild","mapAndGatherRemainingDecorations","built","spans","gather","set","hasNulls","localStart","subtree","working","insertAhead","deco","getRandomValues","rnds8","Uint8Array","rng","crypto","msCrypto","Error","validate","uuid","byteToHex","toString","substr","arr","arguments","TypeError","v4","buf","rnds","random"],"mappings":"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","file":"js/group-homework~9c5b28f6.3153e53c.js","sourcesContent":["module.exports = __webpack_public_path__ + \"img/remixicon.symbol.f09b1c74.svg\";","import { TextSelection, NodeSelection, Selection, AllSelection } from 'prosemirror-state';\nimport { DOMSerializer, Fragment, Mark, Slice, DOMParser } from 'prosemirror-model';\nimport { dropPoint } from 'prosemirror-transform';\n\nconst nav = typeof navigator != \"undefined\" ? navigator : null;\nconst doc = typeof document != \"undefined\" ? document : null;\nconst agent = (nav && nav.userAgent) || \"\";\nconst ie_edge = /Edge\\/(\\d+)/.exec(agent);\nconst ie_upto10 = /MSIE \\d/.exec(agent);\nconst ie_11up = /Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(agent);\nconst ie = !!(ie_upto10 || ie_11up || ie_edge);\nconst ie_version = ie_upto10 ? document.documentMode : ie_11up ? +ie_11up[1] : ie_edge ? +ie_edge[1] : 0;\nconst gecko = !ie && /gecko\\/(\\d+)/i.test(agent);\ngecko && +(/Firefox\\/(\\d+)/.exec(agent) || [0, 0])[1];\nconst _chrome = !ie && /Chrome\\/(\\d+)/.exec(agent);\nconst chrome = !!_chrome;\nconst chrome_version = _chrome ? +_chrome[1] : 0;\nconst safari = !ie && !!nav && /Apple Computer/.test(nav.vendor);\n// Is true for both iOS and iPadOS for convenience\nconst ios = safari && (/Mobile\\/\\w+/.test(agent) || !!nav && nav.maxTouchPoints > 2);\nconst mac = ios || (nav ? /Mac/.test(nav.platform) : false);\nconst android = /Android \\d/.test(agent);\nconst webkit = !!doc && \"webkitFontSmoothing\" in doc.documentElement.style;\nconst webkit_version = webkit ? +(/\\bAppleWebKit\\/(\\d+)/.exec(navigator.userAgent) || [0, 0])[1] : 0;\n\nconst domIndex = function (node) {\n for (var index = 0;; index++) {\n node = node.previousSibling;\n if (!node)\n return index;\n }\n};\nconst parentNode = function (node) {\n let parent = node.assignedSlot || node.parentNode;\n return parent && parent.nodeType == 11 ? parent.host : parent;\n};\nlet reusedRange = null;\n// Note that this will always return the same range, because DOM range\n// objects are every expensive, and keep slowing down subsequent DOM\n// updates, for some reason.\nconst textRange = function (node, from, to) {\n let range = reusedRange || (reusedRange = document.createRange());\n range.setEnd(node, to == null ? node.nodeValue.length : to);\n range.setStart(node, from || 0);\n return range;\n};\n// Scans forward and backward through DOM positions equivalent to the\n// given one to see if the two are in the same place (i.e. after a\n// text node vs at the end of that text node)\nconst isEquivalentPosition = function (node, off, targetNode, targetOff) {\n return targetNode && (scanFor(node, off, targetNode, targetOff, -1) ||\n scanFor(node, off, targetNode, targetOff, 1));\n};\nconst atomElements = /^(img|br|input|textarea|hr)$/i;\nfunction scanFor(node, off, targetNode, targetOff, dir) {\n for (;;) {\n if (node == targetNode && off == targetOff)\n return true;\n if (off == (dir < 0 ? 0 : nodeSize(node))) {\n let parent = node.parentNode;\n if (!parent || parent.nodeType != 1 || hasBlockDesc(node) || atomElements.test(node.nodeName) ||\n node.contentEditable == \"false\")\n return false;\n off = domIndex(node) + (dir < 0 ? 0 : 1);\n node = parent;\n }\n else if (node.nodeType == 1) {\n node = node.childNodes[off + (dir < 0 ? -1 : 0)];\n if (node.contentEditable == \"false\")\n return false;\n off = dir < 0 ? nodeSize(node) : 0;\n }\n else {\n return false;\n }\n }\n}\nfunction nodeSize(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction isOnEdge(node, offset, parent) {\n for (let atStart = offset == 0, atEnd = offset == nodeSize(node); atStart || atEnd;) {\n if (node == parent)\n return true;\n let index = domIndex(node);\n node = node.parentNode;\n if (!node)\n return false;\n atStart = atStart && index == 0;\n atEnd = atEnd && index == nodeSize(node);\n }\n}\nfunction hasBlockDesc(dom) {\n let desc;\n for (let cur = dom; cur; cur = cur.parentNode)\n if (desc = cur.pmViewDesc)\n break;\n return desc && desc.node && desc.node.isBlock && (desc.dom == dom || desc.contentDOM == dom);\n}\n// Work around Chrome issue https://bugs.chromium.org/p/chromium/issues/detail?id=447523\n// (isCollapsed inappropriately returns true in shadow dom)\nconst selectionCollapsed = function (domSel) {\n let collapsed = domSel.isCollapsed;\n if (collapsed && chrome && domSel.rangeCount && !domSel.getRangeAt(0).collapsed)\n collapsed = false;\n return collapsed;\n};\nfunction keyEvent(keyCode, key) {\n let event = document.createEvent(\"Event\");\n event.initEvent(\"keydown\", true, true);\n event.keyCode = keyCode;\n event.key = event.code = key;\n return event;\n}\n\nfunction windowRect(doc) {\n return { left: 0, right: doc.documentElement.clientWidth,\n top: 0, bottom: doc.documentElement.clientHeight };\n}\nfunction getSide(value, side) {\n return typeof value == \"number\" ? value : value[side];\n}\nfunction clientRect(node) {\n let rect = node.getBoundingClientRect();\n // Adjust for elements with style \"transform: scale()\"\n let scaleX = (rect.width / node.offsetWidth) || 1;\n let scaleY = (rect.height / node.offsetHeight) || 1;\n // Make sure scrollbar width isn't included in the rectangle\n return { left: rect.left, right: rect.left + node.clientWidth * scaleX,\n top: rect.top, bottom: rect.top + node.clientHeight * scaleY };\n}\nfunction scrollRectIntoView(view, rect, startDOM) {\n let scrollThreshold = view.someProp(\"scrollThreshold\") || 0, scrollMargin = view.someProp(\"scrollMargin\") || 5;\n let doc = view.dom.ownerDocument;\n for (let parent = startDOM || view.dom;; parent = parentNode(parent)) {\n if (!parent)\n break;\n if (parent.nodeType != 1)\n continue;\n let elt = parent;\n let atTop = elt == doc.body;\n let bounding = atTop ? windowRect(doc) : clientRect(elt);\n let moveX = 0, moveY = 0;\n if (rect.top < bounding.top + getSide(scrollThreshold, \"top\"))\n moveY = -(bounding.top - rect.top + getSide(scrollMargin, \"top\"));\n else if (rect.bottom > bounding.bottom - getSide(scrollThreshold, \"bottom\"))\n moveY = rect.bottom - bounding.bottom + getSide(scrollMargin, \"bottom\");\n if (rect.left < bounding.left + getSide(scrollThreshold, \"left\"))\n moveX = -(bounding.left - rect.left + getSide(scrollMargin, \"left\"));\n else if (rect.right > bounding.right - getSide(scrollThreshold, \"right\"))\n moveX = rect.right - bounding.right + getSide(scrollMargin, \"right\");\n if (moveX || moveY) {\n if (atTop) {\n doc.defaultView.scrollBy(moveX, moveY);\n }\n else {\n let startX = elt.scrollLeft, startY = elt.scrollTop;\n if (moveY)\n elt.scrollTop += moveY;\n if (moveX)\n elt.scrollLeft += moveX;\n let dX = elt.scrollLeft - startX, dY = elt.scrollTop - startY;\n rect = { left: rect.left - dX, top: rect.top - dY, right: rect.right - dX, bottom: rect.bottom - dY };\n }\n }\n if (atTop)\n break;\n }\n}\n// Store the scroll position of the editor's parent nodes, along with\n// the top position of an element near the top of the editor, which\n// will be used to make sure the visible viewport remains stable even\n// when the size of the content above changes.\nfunction storeScrollPos(view) {\n let rect = view.dom.getBoundingClientRect(), startY = Math.max(0, rect.top);\n let refDOM, refTop;\n for (let x = (rect.left + rect.right) / 2, y = startY + 1; y < Math.min(innerHeight, rect.bottom); y += 5) {\n let dom = view.root.elementFromPoint(x, y);\n if (!dom || dom == view.dom || !view.dom.contains(dom))\n continue;\n let localRect = dom.getBoundingClientRect();\n if (localRect.top >= startY - 20) {\n refDOM = dom;\n refTop = localRect.top;\n break;\n }\n }\n return { refDOM: refDOM, refTop: refTop, stack: scrollStack(view.dom) };\n}\nfunction scrollStack(dom) {\n let stack = [], doc = dom.ownerDocument;\n for (let cur = dom; cur; cur = parentNode(cur)) {\n stack.push({ dom: cur, top: cur.scrollTop, left: cur.scrollLeft });\n if (dom == doc)\n break;\n }\n return stack;\n}\n// Reset the scroll position of the editor's parent nodes to that what\n// it was before, when storeScrollPos was called.\nfunction resetScrollPos({ refDOM, refTop, stack }) {\n let newRefTop = refDOM ? refDOM.getBoundingClientRect().top : 0;\n restoreScrollStack(stack, newRefTop == 0 ? 0 : newRefTop - refTop);\n}\nfunction restoreScrollStack(stack, dTop) {\n for (let i = 0; i < stack.length; i++) {\n let { dom, top, left } = stack[i];\n if (dom.scrollTop != top + dTop)\n dom.scrollTop = top + dTop;\n if (dom.scrollLeft != left)\n dom.scrollLeft = left;\n }\n}\nlet preventScrollSupported = null;\n// Feature-detects support for .focus({preventScroll: true}), and uses\n// a fallback kludge when not supported.\nfunction focusPreventScroll(dom) {\n if (dom.setActive)\n return dom.setActive(); // in IE\n if (preventScrollSupported)\n return dom.focus(preventScrollSupported);\n let stored = scrollStack(dom);\n dom.focus(preventScrollSupported == null ? {\n get preventScroll() {\n preventScrollSupported = { preventScroll: true };\n return true;\n }\n } : undefined);\n if (!preventScrollSupported) {\n preventScrollSupported = false;\n restoreScrollStack(stored, 0);\n }\n}\nfunction findOffsetInNode(node, coords) {\n let closest, dxClosest = 2e8, coordsClosest, offset = 0;\n let rowBot = coords.top, rowTop = coords.top;\n for (let child = node.firstChild, childIndex = 0; child; child = child.nextSibling, childIndex++) {\n let rects;\n if (child.nodeType == 1)\n rects = child.getClientRects();\n else if (child.nodeType == 3)\n rects = textRange(child).getClientRects();\n else\n continue;\n for (let i = 0; i < rects.length; i++) {\n let rect = rects[i];\n if (rect.top <= rowBot && rect.bottom >= rowTop) {\n rowBot = Math.max(rect.bottom, rowBot);\n rowTop = Math.min(rect.top, rowTop);\n let dx = rect.left > coords.left ? rect.left - coords.left\n : rect.right < coords.left ? coords.left - rect.right : 0;\n if (dx < dxClosest) {\n closest = child;\n dxClosest = dx;\n coordsClosest = dx && closest.nodeType == 3 ? {\n left: rect.right < coords.left ? rect.right : rect.left,\n top: coords.top\n } : coords;\n if (child.nodeType == 1 && dx)\n offset = childIndex + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0);\n continue;\n }\n }\n if (!closest && (coords.left >= rect.right && coords.top >= rect.top ||\n coords.left >= rect.left && coords.top >= rect.bottom))\n offset = childIndex + 1;\n }\n }\n if (closest && closest.nodeType == 3)\n return findOffsetInText(closest, coordsClosest);\n if (!closest || (dxClosest && closest.nodeType == 1))\n return { node, offset };\n return findOffsetInNode(closest, coordsClosest);\n}\nfunction findOffsetInText(node, coords) {\n let len = node.nodeValue.length;\n let range = document.createRange();\n for (let i = 0; i < len; i++) {\n range.setEnd(node, i + 1);\n range.setStart(node, i);\n let rect = singleRect(range, 1);\n if (rect.top == rect.bottom)\n continue;\n if (inRect(coords, rect))\n return { node, offset: i + (coords.left >= (rect.left + rect.right) / 2 ? 1 : 0) };\n }\n return { node, offset: 0 };\n}\nfunction inRect(coords, rect) {\n return coords.left >= rect.left - 1 && coords.left <= rect.right + 1 &&\n coords.top >= rect.top - 1 && coords.top <= rect.bottom + 1;\n}\nfunction targetKludge(dom, coords) {\n let parent = dom.parentNode;\n if (parent && /^li$/i.test(parent.nodeName) && coords.left < dom.getBoundingClientRect().left)\n return parent;\n return dom;\n}\nfunction posFromElement(view, elt, coords) {\n let { node, offset } = findOffsetInNode(elt, coords), bias = -1;\n if (node.nodeType == 1 && !node.firstChild) {\n let rect = node.getBoundingClientRect();\n bias = rect.left != rect.right && coords.left > (rect.left + rect.right) / 2 ? 1 : -1;\n }\n return view.docView.posFromDOM(node, offset, bias);\n}\nfunction posFromCaret(view, node, offset, coords) {\n // Browser (in caretPosition/RangeFromPoint) will agressively\n // normalize towards nearby inline nodes. Since we are interested in\n // positions between block nodes too, we first walk up the hierarchy\n // of nodes to see if there are block nodes that the coordinates\n // fall outside of. If so, we take the position before/after that\n // block. If not, we call `posFromDOM` on the raw node/offset.\n let outside = -1;\n for (let cur = node;;) {\n if (cur == view.dom)\n break;\n let desc = view.docView.nearestDesc(cur, true);\n if (!desc)\n return null;\n if (desc.node.isBlock && desc.parent) {\n let rect = desc.dom.getBoundingClientRect();\n if (rect.left > coords.left || rect.top > coords.top)\n outside = desc.posBefore;\n else if (rect.right < coords.left || rect.bottom < coords.top)\n outside = desc.posAfter;\n else\n break;\n }\n cur = desc.dom.parentNode;\n }\n return outside > -1 ? outside : view.docView.posFromDOM(node, offset, 1);\n}\nfunction elementFromPoint(element, coords, box) {\n let len = element.childNodes.length;\n if (len && box.top < box.bottom) {\n for (let startI = Math.max(0, Math.min(len - 1, Math.floor(len * (coords.top - box.top) / (box.bottom - box.top)) - 2)), i = startI;;) {\n let child = element.childNodes[i];\n if (child.nodeType == 1) {\n let rects = child.getClientRects();\n for (let j = 0; j < rects.length; j++) {\n let rect = rects[j];\n if (inRect(coords, rect))\n return elementFromPoint(child, coords, rect);\n }\n }\n if ((i = (i + 1) % len) == startI)\n break;\n }\n }\n return element;\n}\n// Given an x,y position on the editor, get the position in the document.\nfunction posAtCoords(view, coords) {\n let doc = view.dom.ownerDocument, node, offset = 0;\n if (doc.caretPositionFromPoint) {\n try { // Firefox throws for this call in hard-to-predict circumstances (#994)\n let pos = doc.caretPositionFromPoint(coords.left, coords.top);\n if (pos)\n ({ offsetNode: node, offset } = pos);\n }\n catch (_) { }\n }\n if (!node && doc.caretRangeFromPoint) {\n let range = doc.caretRangeFromPoint(coords.left, coords.top);\n if (range)\n ({ startContainer: node, startOffset: offset } = range);\n }\n let elt = (view.root.elementFromPoint ? view.root : doc)\n .elementFromPoint(coords.left, coords.top + 1);\n let pos;\n if (!elt || !view.dom.contains(elt.nodeType != 1 ? elt.parentNode : elt)) {\n let box = view.dom.getBoundingClientRect();\n if (!inRect(coords, box))\n return null;\n elt = elementFromPoint(view.dom, coords, box);\n if (!elt)\n return null;\n }\n // Safari's caretRangeFromPoint returns nonsense when on a draggable element\n if (safari) {\n for (let p = elt; node && p; p = parentNode(p))\n if (p.draggable)\n node = undefined;\n }\n elt = targetKludge(elt, coords);\n if (node) {\n if (gecko && node.nodeType == 1) {\n // Firefox will sometimes return offsets into nodes, which\n // have no actual children, from caretPositionFromPoint (#953)\n offset = Math.min(offset, node.childNodes.length);\n // It'll also move the returned position before image nodes,\n // even if those are behind it.\n if (offset < node.childNodes.length) {\n let next = node.childNodes[offset], box;\n if (next.nodeName == \"IMG\" && (box = next.getBoundingClientRect()).right <= coords.left &&\n box.bottom > coords.top)\n offset++;\n }\n }\n // Suspiciously specific kludge to work around caret*FromPoint\n // never returning a position at the end of the document\n if (node == view.dom && offset == node.childNodes.length - 1 && node.lastChild.nodeType == 1 &&\n coords.top > node.lastChild.getBoundingClientRect().bottom)\n pos = view.state.doc.content.size;\n // Ignore positions directly after a BR, since caret*FromPoint\n // 'round up' positions that would be more accurately placed\n // before the BR node.\n else if (offset == 0 || node.nodeType != 1 || node.childNodes[offset - 1].nodeName != \"BR\")\n pos = posFromCaret(view, node, offset, coords);\n }\n if (pos == null)\n pos = posFromElement(view, elt, coords);\n let desc = view.docView.nearestDesc(elt, true);\n return { pos, inside: desc ? desc.posAtStart - desc.border : -1 };\n}\nfunction singleRect(target, bias) {\n let rects = target.getClientRects();\n return !rects.length ? target.getBoundingClientRect() : rects[bias < 0 ? 0 : rects.length - 1];\n}\nconst BIDI = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/;\n// Given a position in the document model, get a bounding box of the\n// character at that position, relative to the window.\nfunction coordsAtPos(view, pos, side) {\n let { node, offset } = view.docView.domFromPos(pos, side < 0 ? -1 : 1);\n let supportEmptyRange = webkit || gecko;\n if (node.nodeType == 3) {\n // These browsers support querying empty text ranges. Prefer that in\n // bidi context or when at the end of a node.\n if (supportEmptyRange && (BIDI.test(node.nodeValue) || (side < 0 ? !offset : offset == node.nodeValue.length))) {\n let rect = singleRect(textRange(node, offset, offset), side);\n // Firefox returns bad results (the position before the space)\n // when querying a position directly after line-broken\n // whitespace. Detect this situation and and kludge around it\n if (gecko && offset && /\\s/.test(node.nodeValue[offset - 1]) && offset < node.nodeValue.length) {\n let rectBefore = singleRect(textRange(node, offset - 1, offset - 1), -1);\n if (rectBefore.top == rect.top) {\n let rectAfter = singleRect(textRange(node, offset, offset + 1), -1);\n if (rectAfter.top != rect.top)\n return flattenV(rectAfter, rectAfter.left < rectBefore.left);\n }\n }\n return rect;\n }\n else {\n let from = offset, to = offset, takeSide = side < 0 ? 1 : -1;\n if (side < 0 && !offset) {\n to++;\n takeSide = -1;\n }\n else if (side >= 0 && offset == node.nodeValue.length) {\n from--;\n takeSide = 1;\n }\n else if (side < 0) {\n from--;\n }\n else {\n to++;\n }\n return flattenV(singleRect(textRange(node, from, to), takeSide), takeSide < 0);\n }\n }\n // Return a horizontal line in block context\n if (!view.state.doc.resolve(pos).parent.inlineContent) {\n if (offset && (side < 0 || offset == nodeSize(node))) {\n let before = node.childNodes[offset - 1];\n if (before.nodeType == 1)\n return flattenH(before.getBoundingClientRect(), false);\n }\n if (offset < nodeSize(node)) {\n let after = node.childNodes[offset];\n if (after.nodeType == 1)\n return flattenH(after.getBoundingClientRect(), true);\n }\n return flattenH(node.getBoundingClientRect(), side >= 0);\n }\n // Inline, not in text node (this is not Bidi-safe)\n if (offset && (side < 0 || offset == nodeSize(node))) {\n let before = node.childNodes[offset - 1];\n let target = before.nodeType == 3 ? textRange(before, nodeSize(before) - (supportEmptyRange ? 0 : 1))\n // BR nodes tend to only return the rectangle before them.\n // Only use them if they are the last element in their parent\n : before.nodeType == 1 && (before.nodeName != \"BR\" || !before.nextSibling) ? before : null;\n if (target)\n return flattenV(singleRect(target, 1), false);\n }\n if (offset < nodeSize(node)) {\n let after = node.childNodes[offset];\n while (after.pmViewDesc && after.pmViewDesc.ignoreForCoords)\n after = after.nextSibling;\n let target = !after ? null : after.nodeType == 3 ? textRange(after, 0, (supportEmptyRange ? 0 : 1))\n : after.nodeType == 1 ? after : null;\n if (target)\n return flattenV(singleRect(target, -1), true);\n }\n // All else failed, just try to get a rectangle for the target node\n return flattenV(singleRect(node.nodeType == 3 ? textRange(node) : node, -side), side >= 0);\n}\nfunction flattenV(rect, left) {\n if (rect.width == 0)\n return rect;\n let x = left ? rect.left : rect.right;\n return { top: rect.top, bottom: rect.bottom, left: x, right: x };\n}\nfunction flattenH(rect, top) {\n if (rect.height == 0)\n return rect;\n let y = top ? rect.top : rect.bottom;\n return { top: y, bottom: y, left: rect.left, right: rect.right };\n}\nfunction withFlushedState(view, state, f) {\n let viewState = view.state, active = view.root.activeElement;\n if (viewState != state)\n view.updateState(state);\n if (active != view.dom)\n view.focus();\n try {\n return f();\n }\n finally {\n if (viewState != state)\n view.updateState(viewState);\n if (active != view.dom && active)\n active.focus();\n }\n}\n// Whether vertical position motion in a given direction\n// from a position would leave a text block.\nfunction endOfTextblockVertical(view, state, dir) {\n let sel = state.selection;\n let $pos = dir == \"up\" ? sel.$from : sel.$to;\n return withFlushedState(view, state, () => {\n let { node: dom } = view.docView.domFromPos($pos.pos, dir == \"up\" ? -1 : 1);\n for (;;) {\n let nearest = view.docView.nearestDesc(dom, true);\n if (!nearest)\n break;\n if (nearest.node.isBlock) {\n dom = nearest.dom;\n break;\n }\n dom = nearest.dom.parentNode;\n }\n let coords = coordsAtPos(view, $pos.pos, 1);\n for (let child = dom.firstChild; child; child = child.nextSibling) {\n let boxes;\n if (child.nodeType == 1)\n boxes = child.getClientRects();\n else if (child.nodeType == 3)\n boxes = textRange(child, 0, child.nodeValue.length).getClientRects();\n else\n continue;\n for (let i = 0; i < boxes.length; i++) {\n let box = boxes[i];\n if (box.bottom > box.top + 1 &&\n (dir == \"up\" ? coords.top - box.top > (box.bottom - coords.top) * 2\n : box.bottom - coords.bottom > (coords.bottom - box.top) * 2))\n return false;\n }\n }\n return true;\n });\n}\nconst maybeRTL = /[\\u0590-\\u08ac]/;\nfunction endOfTextblockHorizontal(view, state, dir) {\n let { $head } = state.selection;\n if (!$head.parent.isTextblock)\n return false;\n let offset = $head.parentOffset, atStart = !offset, atEnd = offset == $head.parent.content.size;\n let sel = view.domSelection();\n // If the textblock is all LTR, or the browser doesn't support\n // Selection.modify (Edge), fall back to a primitive approach\n if (!maybeRTL.test($head.parent.textContent) || !sel.modify)\n return dir == \"left\" || dir == \"backward\" ? atStart : atEnd;\n return withFlushedState(view, state, () => {\n // This is a huge hack, but appears to be the best we can\n // currently do: use `Selection.modify` to move the selection by\n // one character, and see if that moves the cursor out of the\n // textblock (or doesn't move it at all, when at the start/end of\n // the document).\n let oldRange = sel.getRangeAt(0), oldNode = sel.focusNode, oldOff = sel.focusOffset;\n let oldBidiLevel = sel.caretBidiLevel // Only for Firefox\n ;\n sel.modify(\"move\", dir, \"character\");\n let parentDOM = $head.depth ? view.docView.domAfterPos($head.before()) : view.dom;\n let result = !parentDOM.contains(sel.focusNode.nodeType == 1 ? sel.focusNode : sel.focusNode.parentNode) ||\n (oldNode == sel.focusNode && oldOff == sel.focusOffset);\n // Restore the previous selection\n sel.removeAllRanges();\n sel.addRange(oldRange);\n if (oldBidiLevel != null)\n sel.caretBidiLevel = oldBidiLevel;\n return result;\n });\n}\nlet cachedState = null;\nlet cachedDir = null;\nlet cachedResult = false;\nfunction endOfTextblock(view, state, dir) {\n if (cachedState == state && cachedDir == dir)\n return cachedResult;\n cachedState = state;\n cachedDir = dir;\n return cachedResult = dir == \"up\" || dir == \"down\"\n ? endOfTextblockVertical(view, state, dir)\n : endOfTextblockHorizontal(view, state, dir);\n}\n\n// View descriptions are data structures that describe the DOM that is\n// used to represent the editor's content. They are used for:\n//\n// - Incremental redrawing when the document changes\n//\n// - Figuring out what part of the document a given DOM position\n// corresponds to\n//\n// - Wiring in custom implementations of the editing interface for a\n// given node\n//\n// They form a doubly-linked mutable tree, starting at `view.docView`.\nconst NOT_DIRTY = 0, CHILD_DIRTY = 1, CONTENT_DIRTY = 2, NODE_DIRTY = 3;\n// Superclass for the various kinds of descriptions. Defines their\n// basic structure and shared methods.\nclass ViewDesc {\n constructor(parent, children, dom, \n // This is the node that holds the child views. It may be null for\n // descs that don't have children.\n contentDOM) {\n this.parent = parent;\n this.children = children;\n this.dom = dom;\n this.contentDOM = contentDOM;\n this.dirty = NOT_DIRTY;\n // An expando property on the DOM node provides a link back to its\n // description.\n dom.pmViewDesc = this;\n }\n // Used to check whether a given description corresponds to a\n // widget/mark/node.\n matchesWidget(widget) { return false; }\n matchesMark(mark) { return false; }\n matchesNode(node, outerDeco, innerDeco) { return false; }\n matchesHack(nodeName) { return false; }\n // When parsing in-editor content (in domchange.js), we allow\n // descriptions to determine the parse rules that should be used to\n // parse them.\n parseRule() { return null; }\n // Used by the editor's event handler to ignore events that come\n // from certain descs.\n stopEvent(event) { return false; }\n // The size of the content represented by this desc.\n get size() {\n let size = 0;\n for (let i = 0; i < this.children.length; i++)\n size += this.children[i].size;\n return size;\n }\n // For block nodes, this represents the space taken up by their\n // start/end tokens.\n get border() { return 0; }\n destroy() {\n this.parent = undefined;\n if (this.dom.pmViewDesc == this)\n this.dom.pmViewDesc = undefined;\n for (let i = 0; i < this.children.length; i++)\n this.children[i].destroy();\n }\n posBeforeChild(child) {\n for (let i = 0, pos = this.posAtStart;; i++) {\n let cur = this.children[i];\n if (cur == child)\n return pos;\n pos += cur.size;\n }\n }\n get posBefore() {\n return this.parent.posBeforeChild(this);\n }\n get posAtStart() {\n return this.parent ? this.parent.posBeforeChild(this) + this.border : 0;\n }\n get posAfter() {\n return this.posBefore + this.size;\n }\n get posAtEnd() {\n return this.posAtStart + this.size - 2 * this.border;\n }\n localPosFromDOM(dom, offset, bias) {\n // If the DOM position is in the content, use the child desc after\n // it to figure out a position.\n if (this.contentDOM && this.contentDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode)) {\n if (bias < 0) {\n let domBefore, desc;\n if (dom == this.contentDOM) {\n domBefore = dom.childNodes[offset - 1];\n }\n else {\n while (dom.parentNode != this.contentDOM)\n dom = dom.parentNode;\n domBefore = dom.previousSibling;\n }\n while (domBefore && !((desc = domBefore.pmViewDesc) && desc.parent == this))\n domBefore = domBefore.previousSibling;\n return domBefore ? this.posBeforeChild(desc) + desc.size : this.posAtStart;\n }\n else {\n let domAfter, desc;\n if (dom == this.contentDOM) {\n domAfter = dom.childNodes[offset];\n }\n else {\n while (dom.parentNode != this.contentDOM)\n dom = dom.parentNode;\n domAfter = dom.nextSibling;\n }\n while (domAfter && !((desc = domAfter.pmViewDesc) && desc.parent == this))\n domAfter = domAfter.nextSibling;\n return domAfter ? this.posBeforeChild(desc) : this.posAtEnd;\n }\n }\n // Otherwise, use various heuristics, falling back on the bias\n // parameter, to determine whether to return the position at the\n // start or at the end of this view desc.\n let atEnd;\n if (dom == this.dom && this.contentDOM) {\n atEnd = offset > domIndex(this.contentDOM);\n }\n else if (this.contentDOM && this.contentDOM != this.dom && this.dom.contains(this.contentDOM)) {\n atEnd = dom.compareDocumentPosition(this.contentDOM) & 2;\n }\n else if (this.dom.firstChild) {\n if (offset == 0)\n for (let search = dom;; search = search.parentNode) {\n if (search == this.dom) {\n atEnd = false;\n break;\n }\n if (search.previousSibling)\n break;\n }\n if (atEnd == null && offset == dom.childNodes.length)\n for (let search = dom;; search = search.parentNode) {\n if (search == this.dom) {\n atEnd = true;\n break;\n }\n if (search.nextSibling)\n break;\n }\n }\n return (atEnd == null ? bias > 0 : atEnd) ? this.posAtEnd : this.posAtStart;\n }\n // Scan up the dom finding the first desc that is a descendant of\n // this one.\n nearestDesc(dom, onlyNodes = false) {\n for (let first = true, cur = dom; cur; cur = cur.parentNode) {\n let desc = this.getDesc(cur), nodeDOM;\n if (desc && (!onlyNodes || desc.node)) {\n // If dom is outside of this desc's nodeDOM, don't count it.\n if (first && (nodeDOM = desc.nodeDOM) &&\n !(nodeDOM.nodeType == 1 ? nodeDOM.contains(dom.nodeType == 1 ? dom : dom.parentNode) : nodeDOM == dom))\n first = false;\n else\n return desc;\n }\n }\n }\n getDesc(dom) {\n let desc = dom.pmViewDesc;\n for (let cur = desc; cur; cur = cur.parent)\n if (cur == this)\n return desc;\n }\n posFromDOM(dom, offset, bias) {\n for (let scan = dom; scan; scan = scan.parentNode) {\n let desc = this.getDesc(scan);\n if (desc)\n return desc.localPosFromDOM(dom, offset, bias);\n }\n return -1;\n }\n // Find the desc for the node after the given pos, if any. (When a\n // parent node overrode rendering, there might not be one.)\n descAt(pos) {\n for (let i = 0, offset = 0; i < this.children.length; i++) {\n let child = this.children[i], end = offset + child.size;\n if (offset == pos && end != offset) {\n while (!child.border && child.children.length)\n child = child.children[0];\n return child;\n }\n if (pos < end)\n return child.descAt(pos - offset - child.border);\n offset = end;\n }\n }\n domFromPos(pos, side) {\n if (!this.contentDOM)\n return { node: this.dom, offset: 0 };\n // First find the position in the child array\n let i = 0, offset = 0;\n for (let curPos = 0; i < this.children.length; i++) {\n let child = this.children[i], end = curPos + child.size;\n if (end > pos || child instanceof TrailingHackViewDesc) {\n offset = pos - curPos;\n break;\n }\n curPos = end;\n }\n // If this points into the middle of a child, call through\n if (offset)\n return this.children[i].domFromPos(offset - this.children[i].border, side);\n // Go back if there were any zero-length widgets with side >= 0 before this point\n for (let prev; i && !(prev = this.children[i - 1]).size && prev instanceof WidgetViewDesc && prev.side >= 0; i--) { }\n // Scan towards the first useable node\n if (side <= 0) {\n let prev, enter = true;\n for (;; i--, enter = false) {\n prev = i ? this.children[i - 1] : null;\n if (!prev || prev.dom.parentNode == this.contentDOM)\n break;\n }\n if (prev && side && enter && !prev.border && !prev.domAtom)\n return prev.domFromPos(prev.size, side);\n return { node: this.contentDOM, offset: prev ? domIndex(prev.dom) + 1 : 0 };\n }\n else {\n let next, enter = true;\n for (;; i++, enter = false) {\n next = i < this.children.length ? this.children[i] : null;\n if (!next || next.dom.parentNode == this.contentDOM)\n break;\n }\n if (next && enter && !next.border && !next.domAtom)\n return next.domFromPos(0, side);\n return { node: this.contentDOM, offset: next ? domIndex(next.dom) : this.contentDOM.childNodes.length };\n }\n }\n // Used to find a DOM range in a single parent for a given changed\n // range.\n parseRange(from, to, base = 0) {\n if (this.children.length == 0)\n return { node: this.contentDOM, from, to, fromOffset: 0, toOffset: this.contentDOM.childNodes.length };\n let fromOffset = -1, toOffset = -1;\n for (let offset = base, i = 0;; i++) {\n let child = this.children[i], end = offset + child.size;\n if (fromOffset == -1 && from <= end) {\n let childBase = offset + child.border;\n // FIXME maybe descend mark views to parse a narrower range?\n if (from >= childBase && to <= end - child.border && child.node &&\n child.contentDOM && this.contentDOM.contains(child.contentDOM))\n return child.parseRange(from, to, childBase);\n from = offset;\n for (let j = i; j > 0; j--) {\n let prev = this.children[j - 1];\n if (prev.size && prev.dom.parentNode == this.contentDOM && !prev.emptyChildAt(1)) {\n fromOffset = domIndex(prev.dom) + 1;\n break;\n }\n from -= prev.size;\n }\n if (fromOffset == -1)\n fromOffset = 0;\n }\n if (fromOffset > -1 && (end > to || i == this.children.length - 1)) {\n to = end;\n for (let j = i + 1; j < this.children.length; j++) {\n let next = this.children[j];\n if (next.size && next.dom.parentNode == this.contentDOM && !next.emptyChildAt(-1)) {\n toOffset = domIndex(next.dom);\n break;\n }\n to += next.size;\n }\n if (toOffset == -1)\n toOffset = this.contentDOM.childNodes.length;\n break;\n }\n offset = end;\n }\n return { node: this.contentDOM, from, to, fromOffset, toOffset };\n }\n emptyChildAt(side) {\n if (this.border || !this.contentDOM || !this.children.length)\n return false;\n let child = this.children[side < 0 ? 0 : this.children.length - 1];\n return child.size == 0 || child.emptyChildAt(side);\n }\n domAfterPos(pos) {\n let { node, offset } = this.domFromPos(pos, 0);\n if (node.nodeType != 1 || offset == node.childNodes.length)\n throw new RangeError(\"No node after pos \" + pos);\n return node.childNodes[offset];\n }\n // View descs are responsible for setting any selection that falls\n // entirely inside of them, so that custom implementations can do\n // custom things with the selection. Note that this falls apart when\n // a selection starts in such a node and ends in another, in which\n // case we just use whatever domFromPos produces as a best effort.\n setSelection(anchor, head, root, force = false) {\n // If the selection falls entirely in a child, give it to that child\n let from = Math.min(anchor, head), to = Math.max(anchor, head);\n for (let i = 0, offset = 0; i < this.children.length; i++) {\n let child = this.children[i], end = offset + child.size;\n if (from > offset && to < end)\n return child.setSelection(anchor - offset - child.border, head - offset - child.border, root, force);\n offset = end;\n }\n let anchorDOM = this.domFromPos(anchor, anchor ? -1 : 1);\n let headDOM = head == anchor ? anchorDOM : this.domFromPos(head, head ? -1 : 1);\n let domSel = root.getSelection();\n let brKludge = false;\n // On Firefox, using Selection.collapse to put the cursor after a\n // BR node for some reason doesn't always work (#1073). On Safari,\n // the cursor sometimes inexplicable visually lags behind its\n // reported position in such situations (#1092).\n if ((gecko || safari) && anchor == head) {\n let { node, offset } = anchorDOM;\n if (node.nodeType == 3) {\n brKludge = !!(offset && node.nodeValue[offset - 1] == \"\\n\");\n // Issue #1128\n if (brKludge && offset == node.nodeValue.length) {\n for (let scan = node, after; scan; scan = scan.parentNode) {\n if (after = scan.nextSibling) {\n if (after.nodeName == \"BR\")\n anchorDOM = headDOM = { node: after.parentNode, offset: domIndex(after) + 1 };\n break;\n }\n let desc = scan.pmViewDesc;\n if (desc && desc.node && desc.node.isBlock)\n break;\n }\n }\n }\n else {\n let prev = node.childNodes[offset - 1];\n brKludge = prev && (prev.nodeName == \"BR\" || prev.contentEditable == \"false\");\n }\n }\n // Firefox can act strangely when the selection is in front of an\n // uneditable node. See #1163 and https://bugzilla.mozilla.org/show_bug.cgi?id=1709536\n if (gecko && domSel.focusNode && domSel.focusNode != headDOM.node && domSel.focusNode.nodeType == 1) {\n let after = domSel.focusNode.childNodes[domSel.focusOffset];\n if (after && after.contentEditable == \"false\")\n force = true;\n }\n if (!(force || brKludge && safari) &&\n isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset) &&\n isEquivalentPosition(headDOM.node, headDOM.offset, domSel.focusNode, domSel.focusOffset))\n return;\n // Selection.extend can be used to create an 'inverted' selection\n // (one where the focus is before the anchor), but not all\n // browsers support it yet.\n let domSelExtended = false;\n if ((domSel.extend || anchor == head) && !brKludge) {\n domSel.collapse(anchorDOM.node, anchorDOM.offset);\n try {\n if (anchor != head)\n domSel.extend(headDOM.node, headDOM.offset);\n domSelExtended = true;\n }\n catch (err) {\n // In some cases with Chrome the selection is empty after calling\n // collapse, even when it should be valid. This appears to be a bug, but\n // it is difficult to isolate. If this happens fallback to the old path\n // without using extend.\n if (!(err instanceof DOMException))\n throw err;\n // declare global: DOMException\n }\n }\n if (!domSelExtended) {\n if (anchor > head) {\n let tmp = anchorDOM;\n anchorDOM = headDOM;\n headDOM = tmp;\n }\n let range = document.createRange();\n range.setEnd(headDOM.node, headDOM.offset);\n range.setStart(anchorDOM.node, anchorDOM.offset);\n domSel.removeAllRanges();\n domSel.addRange(range);\n }\n }\n ignoreMutation(mutation) {\n return !this.contentDOM && mutation.type != \"selection\";\n }\n get contentLost() {\n return this.contentDOM && this.contentDOM != this.dom && !this.dom.contains(this.contentDOM);\n }\n // Remove a subtree of the element tree that has been touched\n // by a DOM change, so that the next update will redraw it.\n markDirty(from, to) {\n for (let offset = 0, i = 0; i < this.children.length; i++) {\n let child = this.children[i], end = offset + child.size;\n if (offset == end ? from <= end && to >= offset : from < end && to > offset) {\n let startInside = offset + child.border, endInside = end - child.border;\n if (from >= startInside && to <= endInside) {\n this.dirty = from == offset || to == end ? CONTENT_DIRTY : CHILD_DIRTY;\n if (from == startInside && to == endInside &&\n (child.contentLost || child.dom.parentNode != this.contentDOM))\n child.dirty = NODE_DIRTY;\n else\n child.markDirty(from - startInside, to - startInside);\n return;\n }\n else {\n child.dirty = child.dom == child.contentDOM && child.dom.parentNode == this.contentDOM && !child.children.length\n ? CONTENT_DIRTY : NODE_DIRTY;\n }\n }\n offset = end;\n }\n this.dirty = CONTENT_DIRTY;\n }\n markParentsDirty() {\n let level = 1;\n for (let node = this.parent; node; node = node.parent, level++) {\n let dirty = level == 1 ? CONTENT_DIRTY : CHILD_DIRTY;\n if (node.dirty < dirty)\n node.dirty = dirty;\n }\n }\n get domAtom() { return false; }\n get ignoreForCoords() { return false; }\n}\n// A widget desc represents a widget decoration, which is a DOM node\n// drawn between the document nodes.\nclass WidgetViewDesc extends ViewDesc {\n constructor(parent, widget, view, pos) {\n let self, dom = widget.type.toDOM;\n if (typeof dom == \"function\")\n dom = dom(view, () => {\n if (!self)\n return pos;\n if (self.parent)\n return self.parent.posBeforeChild(self);\n });\n if (!widget.type.spec.raw) {\n if (dom.nodeType != 1) {\n let wrap = document.createElement(\"span\");\n wrap.appendChild(dom);\n dom = wrap;\n }\n dom.contentEditable = \"false\";\n dom.classList.add(\"ProseMirror-widget\");\n }\n super(parent, [], dom, null);\n this.widget = widget;\n this.widget = widget;\n self = this;\n }\n matchesWidget(widget) {\n return this.dirty == NOT_DIRTY && widget.type.eq(this.widget.type);\n }\n parseRule() { return { ignore: true }; }\n stopEvent(event) {\n let stop = this.widget.spec.stopEvent;\n return stop ? stop(event) : false;\n }\n ignoreMutation(mutation) {\n return mutation.type != \"selection\" || this.widget.spec.ignoreSelection;\n }\n destroy() {\n this.widget.type.destroy(this.dom);\n super.destroy();\n }\n get domAtom() { return true; }\n get side() { return this.widget.type.side; }\n}\nclass CompositionViewDesc extends ViewDesc {\n constructor(parent, dom, textDOM, text) {\n super(parent, [], dom, null);\n this.textDOM = textDOM;\n this.text = text;\n }\n get size() { return this.text.length; }\n localPosFromDOM(dom, offset) {\n if (dom != this.textDOM)\n return this.posAtStart + (offset ? this.size : 0);\n return this.posAtStart + offset;\n }\n domFromPos(pos) {\n return { node: this.textDOM, offset: pos };\n }\n ignoreMutation(mut) {\n return mut.type === 'characterData' && mut.target.nodeValue == mut.oldValue;\n }\n}\n// A mark desc represents a mark. May have multiple children,\n// depending on how the mark is split. Note that marks are drawn using\n// a fixed nesting order, for simplicity and predictability, so in\n// some cases they will be split more often than would appear\n// necessary.\nclass MarkViewDesc extends ViewDesc {\n constructor(parent, mark, dom, contentDOM) {\n super(parent, [], dom, contentDOM);\n this.mark = mark;\n }\n static create(parent, mark, inline, view) {\n let custom = view.nodeViews[mark.type.name];\n let spec = custom && custom(mark, view, inline);\n if (!spec || !spec.dom)\n spec = DOMSerializer.renderSpec(document, mark.type.spec.toDOM(mark, inline));\n return new MarkViewDesc(parent, mark, spec.dom, spec.contentDOM || spec.dom);\n }\n parseRule() {\n if ((this.dirty & NODE_DIRTY) || this.mark.type.spec.reparseInView)\n return null;\n return { mark: this.mark.type.name, attrs: this.mark.attrs, contentElement: this.contentDOM || undefined };\n }\n matchesMark(mark) { return this.dirty != NODE_DIRTY && this.mark.eq(mark); }\n markDirty(from, to) {\n super.markDirty(from, to);\n // Move dirty info to nearest node view\n if (this.dirty != NOT_DIRTY) {\n let parent = this.parent;\n while (!parent.node)\n parent = parent.parent;\n if (parent.dirty < this.dirty)\n parent.dirty = this.dirty;\n this.dirty = NOT_DIRTY;\n }\n }\n slice(from, to, view) {\n let copy = MarkViewDesc.create(this.parent, this.mark, true, view);\n let nodes = this.children, size = this.size;\n if (to < size)\n nodes = replaceNodes(nodes, to, size, view);\n if (from > 0)\n nodes = replaceNodes(nodes, 0, from, view);\n for (let i = 0; i < nodes.length; i++)\n nodes[i].parent = copy;\n copy.children = nodes;\n return copy;\n }\n}\n// Node view descs are the main, most common type of view desc, and\n// correspond to an actual node in the document. Unlike mark descs,\n// they populate their child array themselves.\nclass NodeViewDesc extends ViewDesc {\n constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos) {\n super(parent, [], dom, contentDOM);\n this.node = node;\n this.outerDeco = outerDeco;\n this.innerDeco = innerDeco;\n this.nodeDOM = nodeDOM;\n if (contentDOM)\n this.updateChildren(view, pos);\n }\n // By default, a node is rendered using the `toDOM` method from the\n // node type spec. But client code can use the `nodeViews` spec to\n // supply a custom node view, which can influence various aspects of\n // the way the node works.\n //\n // (Using subclassing for this was intentionally decided against,\n // since it'd require exposing a whole slew of finicky\n // implementation details to the user code that they probably will\n // never need.)\n static create(parent, node, outerDeco, innerDeco, view, pos) {\n let custom = view.nodeViews[node.type.name], descObj;\n let spec = custom && custom(node, view, () => {\n // (This is a function that allows the custom view to find its\n // own position)\n if (!descObj)\n return pos;\n if (descObj.parent)\n return descObj.parent.posBeforeChild(descObj);\n }, outerDeco, innerDeco);\n let dom = spec && spec.dom, contentDOM = spec && spec.contentDOM;\n if (node.isText) {\n if (!dom)\n dom = document.createTextNode(node.text);\n else if (dom.nodeType != 3)\n throw new RangeError(\"Text must be rendered as a DOM text node\");\n }\n else if (!dom) {\n ({ dom, contentDOM } = DOMSerializer.renderSpec(document, node.type.spec.toDOM(node)));\n }\n if (!contentDOM && !node.isText && dom.nodeName != \"BR\") { // Chrome gets confused by
\n if (!dom.hasAttribute(\"contenteditable\"))\n dom.contentEditable = \"false\";\n if (node.type.spec.draggable)\n dom.draggable = true;\n }\n let nodeDOM = dom;\n dom = applyOuterDeco(dom, outerDeco, node);\n if (spec)\n return descObj = new CustomNodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, spec, view, pos + 1);\n else if (node.isText)\n return new TextViewDesc(parent, node, outerDeco, innerDeco, dom, nodeDOM, view);\n else\n return new NodeViewDesc(parent, node, outerDeco, innerDeco, dom, contentDOM || null, nodeDOM, view, pos + 1);\n }\n parseRule() {\n // Experimental kludge to allow opt-in re-parsing of nodes\n if (this.node.type.spec.reparseInView)\n return null;\n // FIXME the assumption that this can always return the current\n // attrs means that if the user somehow manages to change the\n // attrs in the dom, that won't be picked up. Not entirely sure\n // whether this is a problem\n let rule = { node: this.node.type.name, attrs: this.node.attrs };\n if (this.node.type.whitespace == \"pre\")\n rule.preserveWhitespace = \"full\";\n if (!this.contentDOM) {\n rule.getContent = () => this.node.content;\n }\n else if (!this.contentLost) {\n rule.contentElement = this.contentDOM;\n }\n else {\n // Chrome likes to randomly recreate parent nodes when\n // backspacing things. When that happens, this tries to find the\n // new parent.\n for (let i = this.children.length - 1; i >= 0; i--) {\n let child = this.children[i];\n if (this.dom.contains(child.dom.parentNode)) {\n rule.contentElement = child.dom.parentNode;\n break;\n }\n }\n if (!rule.contentElement)\n rule.getContent = () => Fragment.empty;\n }\n return rule;\n }\n matchesNode(node, outerDeco, innerDeco) {\n return this.dirty == NOT_DIRTY && node.eq(this.node) &&\n sameOuterDeco(outerDeco, this.outerDeco) && innerDeco.eq(this.innerDeco);\n }\n get size() { return this.node.nodeSize; }\n get border() { return this.node.isLeaf ? 0 : 1; }\n // Syncs `this.children` to match `this.node.content` and the local\n // decorations, possibly introducing nesting for marks. Then, in a\n // separate step, syncs the DOM inside `this.contentDOM` to\n // `this.children`.\n updateChildren(view, pos) {\n let inline = this.node.inlineContent, off = pos;\n let composition = view.composing ? this.localCompositionInfo(view, pos) : null;\n let localComposition = composition && composition.pos > -1 ? composition : null;\n let compositionInChild = composition && composition.pos < 0;\n let updater = new ViewTreeUpdater(this, localComposition && localComposition.node);\n iterDeco(this.node, this.innerDeco, (widget, i, insideNode) => {\n if (widget.spec.marks)\n updater.syncToMarks(widget.spec.marks, inline, view);\n else if (widget.type.side >= 0 && !insideNode)\n updater.syncToMarks(i == this.node.childCount ? Mark.none : this.node.child(i).marks, inline, view);\n // If the next node is a desc matching this widget, reuse it,\n // otherwise insert the widget as a new view desc.\n updater.placeWidget(widget, view, off);\n }, (child, outerDeco, innerDeco, i) => {\n // Make sure the wrapping mark descs match the node's marks.\n updater.syncToMarks(child.marks, inline, view);\n // Try several strategies for drawing this node\n let compIndex;\n if (updater.findNodeMatch(child, outerDeco, innerDeco, i)) ;\n else if (compositionInChild && view.state.selection.from > off &&\n view.state.selection.to < off + child.nodeSize &&\n (compIndex = updater.findIndexWithChild(composition.node)) > -1 &&\n updater.updateNodeAt(child, outerDeco, innerDeco, compIndex, view)) ;\n else if (updater.updateNextNode(child, outerDeco, innerDeco, view, i)) ;\n else {\n // Add it as a new view\n updater.addNode(child, outerDeco, innerDeco, view, off);\n }\n off += child.nodeSize;\n });\n // Drop all remaining descs after the current position.\n updater.syncToMarks([], inline, view);\n if (this.node.isTextblock)\n updater.addTextblockHacks();\n updater.destroyRest();\n // Sync the DOM if anything changed\n if (updater.changed || this.dirty == CONTENT_DIRTY) {\n // May have to protect focused DOM from being changed if a composition is active\n if (localComposition)\n this.protectLocalComposition(view, localComposition);\n renderDescs(this.contentDOM, this.children, view);\n if (ios)\n iosHacks(this.dom);\n }\n }\n localCompositionInfo(view, pos) {\n // Only do something if both the selection and a focused text node\n // are inside of this node\n let { from, to } = view.state.selection;\n if (!(view.state.selection instanceof TextSelection) || from < pos || to > pos + this.node.content.size)\n return null;\n let sel = view.domSelection();\n let textNode = nearbyTextNode(sel.focusNode, sel.focusOffset);\n if (!textNode || !this.dom.contains(textNode.parentNode))\n return null;\n if (this.node.inlineContent) {\n // Find the text in the focused node in the node, stop if it's not\n // there (may have been modified through other means, in which\n // case it should overwritten)\n let text = textNode.nodeValue;\n let textPos = findTextInFragment(this.node.content, text, from - pos, to - pos);\n return textPos < 0 ? null : { node: textNode, pos: textPos, text };\n }\n else {\n return { node: textNode, pos: -1, text: \"\" };\n }\n }\n protectLocalComposition(view, { node, pos, text }) {\n // The node is already part of a local view desc, leave it there\n if (this.getDesc(node))\n return;\n // Create a composition view for the orphaned nodes\n let topNode = node;\n for (;; topNode = topNode.parentNode) {\n if (topNode.parentNode == this.contentDOM)\n break;\n while (topNode.previousSibling)\n topNode.parentNode.removeChild(topNode.previousSibling);\n while (topNode.nextSibling)\n topNode.parentNode.removeChild(topNode.nextSibling);\n if (topNode.pmViewDesc)\n topNode.pmViewDesc = undefined;\n }\n let desc = new CompositionViewDesc(this, topNode, node, text);\n view.input.compositionNodes.push(desc);\n // Patch up this.children to contain the composition view\n this.children = replaceNodes(this.children, pos, pos + text.length, view, desc);\n }\n // If this desc must be updated to match the given node decoration,\n // do so and return true.\n update(node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY ||\n !node.sameMarkup(this.node))\n return false;\n this.updateInner(node, outerDeco, innerDeco, view);\n return true;\n }\n updateInner(node, outerDeco, innerDeco, view) {\n this.updateOuterDeco(outerDeco);\n this.node = node;\n this.innerDeco = innerDeco;\n if (this.contentDOM)\n this.updateChildren(view, this.posAtStart);\n this.dirty = NOT_DIRTY;\n }\n updateOuterDeco(outerDeco) {\n if (sameOuterDeco(outerDeco, this.outerDeco))\n return;\n let needsWrap = this.nodeDOM.nodeType != 1;\n let oldDOM = this.dom;\n this.dom = patchOuterDeco(this.dom, this.nodeDOM, computeOuterDeco(this.outerDeco, this.node, needsWrap), computeOuterDeco(outerDeco, this.node, needsWrap));\n if (this.dom != oldDOM) {\n oldDOM.pmViewDesc = undefined;\n this.dom.pmViewDesc = this;\n }\n this.outerDeco = outerDeco;\n }\n // Mark this node as being the selected node.\n selectNode() {\n if (this.nodeDOM.nodeType == 1)\n this.nodeDOM.classList.add(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable)\n this.dom.draggable = true;\n }\n // Remove selected node marking from this node.\n deselectNode() {\n if (this.nodeDOM.nodeType == 1)\n this.nodeDOM.classList.remove(\"ProseMirror-selectednode\");\n if (this.contentDOM || !this.node.type.spec.draggable)\n this.dom.removeAttribute(\"draggable\");\n }\n get domAtom() { return this.node.isAtom; }\n}\n// Create a view desc for the top-level document node, to be exported\n// and used by the view class.\nfunction docViewDesc(doc, outerDeco, innerDeco, dom, view) {\n applyOuterDeco(dom, outerDeco, doc);\n return new NodeViewDesc(undefined, doc, outerDeco, innerDeco, dom, dom, dom, view, 0);\n}\nclass TextViewDesc extends NodeViewDesc {\n constructor(parent, node, outerDeco, innerDeco, dom, nodeDOM, view) {\n super(parent, node, outerDeco, innerDeco, dom, null, nodeDOM, view, 0);\n }\n parseRule() {\n let skip = this.nodeDOM.parentNode;\n while (skip && skip != this.dom && !skip.pmIsDeco)\n skip = skip.parentNode;\n return { skip: (skip || true) };\n }\n update(node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY || (this.dirty != NOT_DIRTY && !this.inParent()) ||\n !node.sameMarkup(this.node))\n return false;\n this.updateOuterDeco(outerDeco);\n if ((this.dirty != NOT_DIRTY || node.text != this.node.text) && node.text != this.nodeDOM.nodeValue) {\n this.nodeDOM.nodeValue = node.text;\n if (view.trackWrites == this.nodeDOM)\n view.trackWrites = null;\n }\n this.node = node;\n this.dirty = NOT_DIRTY;\n return true;\n }\n inParent() {\n let parentDOM = this.parent.contentDOM;\n for (let n = this.nodeDOM; n; n = n.parentNode)\n if (n == parentDOM)\n return true;\n return false;\n }\n domFromPos(pos) {\n return { node: this.nodeDOM, offset: pos };\n }\n localPosFromDOM(dom, offset, bias) {\n if (dom == this.nodeDOM)\n return this.posAtStart + Math.min(offset, this.node.text.length);\n return super.localPosFromDOM(dom, offset, bias);\n }\n ignoreMutation(mutation) {\n return mutation.type != \"characterData\" && mutation.type != \"selection\";\n }\n slice(from, to, view) {\n let node = this.node.cut(from, to), dom = document.createTextNode(node.text);\n return new TextViewDesc(this.parent, node, this.outerDeco, this.innerDeco, dom, dom, view);\n }\n markDirty(from, to) {\n super.markDirty(from, to);\n if (this.dom != this.nodeDOM && (from == 0 || to == this.nodeDOM.nodeValue.length))\n this.dirty = NODE_DIRTY;\n }\n get domAtom() { return false; }\n}\n// A dummy desc used to tag trailing BR or IMG nodes created to work\n// around contentEditable terribleness.\nclass TrailingHackViewDesc extends ViewDesc {\n parseRule() { return { ignore: true }; }\n matchesHack(nodeName) { return this.dirty == NOT_DIRTY && this.dom.nodeName == nodeName; }\n get domAtom() { return true; }\n get ignoreForCoords() { return this.dom.nodeName == \"IMG\"; }\n}\n// A separate subclass is used for customized node views, so that the\n// extra checks only have to be made for nodes that are actually\n// customized.\nclass CustomNodeViewDesc extends NodeViewDesc {\n constructor(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, spec, view, pos) {\n super(parent, node, outerDeco, innerDeco, dom, contentDOM, nodeDOM, view, pos);\n this.spec = spec;\n }\n // A custom `update` method gets to decide whether the update goes\n // through. If it does, and there's a `contentDOM` node, our logic\n // updates the children.\n update(node, outerDeco, innerDeco, view) {\n if (this.dirty == NODE_DIRTY)\n return false;\n if (this.spec.update) {\n let result = this.spec.update(node, outerDeco, innerDeco);\n if (result)\n this.updateInner(node, outerDeco, innerDeco, view);\n return result;\n }\n else if (!this.contentDOM && !node.isLeaf) {\n return false;\n }\n else {\n return super.update(node, outerDeco, innerDeco, view);\n }\n }\n selectNode() {\n this.spec.selectNode ? this.spec.selectNode() : super.selectNode();\n }\n deselectNode() {\n this.spec.deselectNode ? this.spec.deselectNode() : super.deselectNode();\n }\n setSelection(anchor, head, root, force) {\n this.spec.setSelection ? this.spec.setSelection(anchor, head, root)\n : super.setSelection(anchor, head, root, force);\n }\n destroy() {\n if (this.spec.destroy)\n this.spec.destroy();\n super.destroy();\n }\n stopEvent(event) {\n return this.spec.stopEvent ? this.spec.stopEvent(event) : false;\n }\n ignoreMutation(mutation) {\n return this.spec.ignoreMutation ? this.spec.ignoreMutation(mutation) : super.ignoreMutation(mutation);\n }\n}\n// Sync the content of the given DOM node with the nodes associated\n// with the given array of view descs, recursing into mark descs\n// because this should sync the subtree for a whole node at a time.\nfunction renderDescs(parentDOM, descs, view) {\n let dom = parentDOM.firstChild, written = false;\n for (let i = 0; i < descs.length; i++) {\n let desc = descs[i], childDOM = desc.dom;\n if (childDOM.parentNode == parentDOM) {\n while (childDOM != dom) {\n dom = rm(dom);\n written = true;\n }\n dom = dom.nextSibling;\n }\n else {\n written = true;\n parentDOM.insertBefore(childDOM, dom);\n }\n if (desc instanceof MarkViewDesc) {\n let pos = dom ? dom.previousSibling : parentDOM.lastChild;\n renderDescs(desc.contentDOM, desc.children, view);\n dom = pos ? pos.nextSibling : parentDOM.firstChild;\n }\n }\n while (dom) {\n dom = rm(dom);\n written = true;\n }\n if (written && view.trackWrites == parentDOM)\n view.trackWrites = null;\n}\nconst OuterDecoLevel = function (nodeName) {\n if (nodeName)\n this.nodeName = nodeName;\n};\nOuterDecoLevel.prototype = Object.create(null);\nconst noDeco = [new OuterDecoLevel];\nfunction computeOuterDeco(outerDeco, node, needsWrap) {\n if (outerDeco.length == 0)\n return noDeco;\n let top = needsWrap ? noDeco[0] : new OuterDecoLevel, result = [top];\n for (let i = 0; i < outerDeco.length; i++) {\n let attrs = outerDeco[i].type.attrs;\n if (!attrs)\n continue;\n if (attrs.nodeName)\n result.push(top = new OuterDecoLevel(attrs.nodeName));\n for (let name in attrs) {\n let val = attrs[name];\n if (val == null)\n continue;\n if (needsWrap && result.length == 1)\n result.push(top = new OuterDecoLevel(node.isInline ? \"span\" : \"div\"));\n if (name == \"class\")\n top.class = (top.class ? top.class + \" \" : \"\") + val;\n else if (name == \"style\")\n top.style = (top.style ? top.style + \";\" : \"\") + val;\n else if (name != \"nodeName\")\n top[name] = val;\n }\n }\n return result;\n}\nfunction patchOuterDeco(outerDOM, nodeDOM, prevComputed, curComputed) {\n // Shortcut for trivial case\n if (prevComputed == noDeco && curComputed == noDeco)\n return nodeDOM;\n let curDOM = nodeDOM;\n for (let i = 0; i < curComputed.length; i++) {\n let deco = curComputed[i], prev = prevComputed[i];\n if (i) {\n let parent;\n if (prev && prev.nodeName == deco.nodeName && curDOM != outerDOM &&\n (parent = curDOM.parentNode) && parent.nodeName.toLowerCase() == deco.nodeName) {\n curDOM = parent;\n }\n else {\n parent = document.createElement(deco.nodeName);\n parent.pmIsDeco = true;\n parent.appendChild(curDOM);\n prev = noDeco[0];\n curDOM = parent;\n }\n }\n patchAttributes(curDOM, prev || noDeco[0], deco);\n }\n return curDOM;\n}\nfunction patchAttributes(dom, prev, cur) {\n for (let name in prev)\n if (name != \"class\" && name != \"style\" && name != \"nodeName\" && !(name in cur))\n dom.removeAttribute(name);\n for (let name in cur)\n if (name != \"class\" && name != \"style\" && name != \"nodeName\" && cur[name] != prev[name])\n dom.setAttribute(name, cur[name]);\n if (prev.class != cur.class) {\n let prevList = prev.class ? prev.class.split(\" \").filter(Boolean) : [];\n let curList = cur.class ? cur.class.split(\" \").filter(Boolean) : [];\n for (let i = 0; i < prevList.length; i++)\n if (curList.indexOf(prevList[i]) == -1)\n dom.classList.remove(prevList[i]);\n for (let i = 0; i < curList.length; i++)\n if (prevList.indexOf(curList[i]) == -1)\n dom.classList.add(curList[i]);\n if (dom.classList.length == 0)\n dom.removeAttribute(\"class\");\n }\n if (prev.style != cur.style) {\n if (prev.style) {\n let prop = /\\s*([\\w\\-\\xa1-\\uffff]+)\\s*:(?:\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|\\(.*?\\)|[^;])*/g, m;\n while (m = prop.exec(prev.style))\n dom.style.removeProperty(m[1]);\n }\n if (cur.style)\n dom.style.cssText += cur.style;\n }\n}\nfunction applyOuterDeco(dom, deco, node) {\n return patchOuterDeco(dom, dom, noDeco, computeOuterDeco(deco, node, dom.nodeType != 1));\n}\nfunction sameOuterDeco(a, b) {\n if (a.length != b.length)\n return false;\n for (let i = 0; i < a.length; i++)\n if (!a[i].type.eq(b[i].type))\n return false;\n return true;\n}\n// Remove a DOM node and return its next sibling.\nfunction rm(dom) {\n let next = dom.nextSibling;\n dom.parentNode.removeChild(dom);\n return next;\n}\n// Helper class for incrementally updating a tree of mark descs and\n// the widget and node descs inside of them.\nclass ViewTreeUpdater {\n constructor(top, lock) {\n this.lock = lock;\n // Index into `this.top`'s child array, represents the current\n // update position.\n this.index = 0;\n // When entering a mark, the current top and index are pushed\n // onto this.\n this.stack = [];\n // Tracks whether anything was changed\n this.changed = false;\n this.top = top;\n this.preMatch = preMatch(top.node.content, top);\n }\n // Destroy and remove the children between the given indices in\n // `this.top`.\n destroyBetween(start, end) {\n if (start == end)\n return;\n for (let i = start; i < end; i++)\n this.top.children[i].destroy();\n this.top.children.splice(start, end - start);\n this.changed = true;\n }\n // Destroy all remaining children in `this.top`.\n destroyRest() {\n this.destroyBetween(this.index, this.top.children.length);\n }\n // Sync the current stack of mark descs with the given array of\n // marks, reusing existing mark descs when possible.\n syncToMarks(marks, inline, view) {\n let keep = 0, depth = this.stack.length >> 1;\n let maxKeep = Math.min(depth, marks.length);\n while (keep < maxKeep &&\n (keep == depth - 1 ? this.top : this.stack[(keep + 1) << 1])\n .matchesMark(marks[keep]) && marks[keep].type.spec.spanning !== false)\n keep++;\n while (keep < depth) {\n this.destroyRest();\n this.top.dirty = NOT_DIRTY;\n this.index = this.stack.pop();\n this.top = this.stack.pop();\n depth--;\n }\n while (depth < marks.length) {\n this.stack.push(this.top, this.index + 1);\n let found = -1;\n for (let i = this.index; i < Math.min(this.index + 3, this.top.children.length); i++) {\n if (this.top.children[i].matchesMark(marks[depth])) {\n found = i;\n break;\n }\n }\n if (found > -1) {\n if (found > this.index) {\n this.changed = true;\n this.destroyBetween(this.index, found);\n }\n this.top = this.top.children[this.index];\n }\n else {\n let markDesc = MarkViewDesc.create(this.top, marks[depth], inline, view);\n this.top.children.splice(this.index, 0, markDesc);\n this.top = markDesc;\n this.changed = true;\n }\n this.index = 0;\n depth++;\n }\n }\n // Try to find a node desc matching the given data. Skip over it and\n // return true when successful.\n findNodeMatch(node, outerDeco, innerDeco, index) {\n let found = -1, targetDesc;\n if (index >= this.preMatch.index &&\n (targetDesc = this.preMatch.matches[index - this.preMatch.index]).parent == this.top &&\n targetDesc.matchesNode(node, outerDeco, innerDeco)) {\n found = this.top.children.indexOf(targetDesc, this.index);\n }\n else {\n for (let i = this.index, e = Math.min(this.top.children.length, i + 5); i < e; i++) {\n let child = this.top.children[i];\n if (child.matchesNode(node, outerDeco, innerDeco) && !this.preMatch.matched.has(child)) {\n found = i;\n break;\n }\n }\n }\n if (found < 0)\n return false;\n this.destroyBetween(this.index, found);\n this.index++;\n return true;\n }\n updateNodeAt(node, outerDeco, innerDeco, index, view) {\n let child = this.top.children[index];\n if (child.dirty == NODE_DIRTY && child.dom == child.contentDOM)\n child.dirty = CONTENT_DIRTY;\n if (!child.update(node, outerDeco, innerDeco, view))\n return false;\n this.destroyBetween(this.index, index);\n this.index = index + 1;\n return true;\n }\n findIndexWithChild(domNode) {\n for (;;) {\n let parent = domNode.parentNode;\n if (!parent)\n return -1;\n if (parent == this.top.contentDOM) {\n let desc = domNode.pmViewDesc;\n if (desc)\n for (let i = this.index; i < this.top.children.length; i++) {\n if (this.top.children[i] == desc)\n return i;\n }\n return -1;\n }\n domNode = parent;\n }\n }\n // Try to update the next node, if any, to the given data. Checks\n // pre-matches to avoid overwriting nodes that could still be used.\n updateNextNode(node, outerDeco, innerDeco, view, index) {\n for (let i = this.index; i < this.top.children.length; i++) {\n let next = this.top.children[i];\n if (next instanceof NodeViewDesc) {\n let preMatch = this.preMatch.matched.get(next);\n if (preMatch != null && preMatch != index)\n return false;\n let nextDOM = next.dom;\n // Can't update if nextDOM is or contains this.lock, except if\n // it's a text node whose content already matches the new text\n // and whose decorations match the new ones.\n let locked = this.lock && (nextDOM == this.lock || nextDOM.nodeType == 1 && nextDOM.contains(this.lock.parentNode)) &&\n !(node.isText && next.node && next.node.isText && next.nodeDOM.nodeValue == node.text &&\n next.dirty != NODE_DIRTY && sameOuterDeco(outerDeco, next.outerDeco));\n if (!locked && next.update(node, outerDeco, innerDeco, view)) {\n this.destroyBetween(this.index, i);\n if (next.dom != nextDOM)\n this.changed = true;\n this.index++;\n return true;\n }\n break;\n }\n }\n return false;\n }\n // Insert the node as a newly created node desc.\n addNode(node, outerDeco, innerDeco, view, pos) {\n this.top.children.splice(this.index++, 0, NodeViewDesc.create(this.top, node, outerDeco, innerDeco, view, pos));\n this.changed = true;\n }\n placeWidget(widget, view, pos) {\n let next = this.index < this.top.children.length ? this.top.children[this.index] : null;\n if (next && next.matchesWidget(widget) &&\n (widget == next.widget || !next.widget.type.toDOM.parentNode)) {\n this.index++;\n }\n else {\n let desc = new WidgetViewDesc(this.top, widget, view, pos);\n this.top.children.splice(this.index++, 0, desc);\n this.changed = true;\n }\n }\n // Make sure a textblock looks and behaves correctly in\n // contentEditable.\n addTextblockHacks() {\n let lastChild = this.top.children[this.index - 1], parent = this.top;\n while (lastChild instanceof MarkViewDesc) {\n parent = lastChild;\n lastChild = parent.children[parent.children.length - 1];\n }\n if (!lastChild || // Empty textblock\n !(lastChild instanceof TextViewDesc) ||\n /\\n$/.test(lastChild.node.text)) {\n // Avoid bugs in Safari's cursor drawing (#1165) and Chrome's mouse selection (#1152)\n if ((safari || chrome) && lastChild && lastChild.dom.contentEditable == \"false\")\n this.addHackNode(\"IMG\", parent);\n this.addHackNode(\"BR\", this.top);\n }\n }\n addHackNode(nodeName, parent) {\n if (parent == this.top && this.index < parent.children.length && parent.children[this.index].matchesHack(nodeName)) {\n this.index++;\n }\n else {\n let dom = document.createElement(nodeName);\n if (nodeName == \"IMG\") {\n dom.className = \"ProseMirror-separator\";\n dom.alt = \"\";\n }\n if (nodeName == \"BR\")\n dom.className = \"ProseMirror-trailingBreak\";\n let hack = new TrailingHackViewDesc(this.top, [], dom, null);\n if (parent != this.top)\n parent.children.push(hack);\n else\n parent.children.splice(this.index++, 0, hack);\n this.changed = true;\n }\n }\n}\n// Iterate from the end of the fragment and array of descs to find\n// directly matching ones, in order to avoid overeagerly reusing those\n// for other nodes. Returns the fragment index of the first node that\n// is part of the sequence of matched nodes at the end of the\n// fragment.\nfunction preMatch(frag, parentDesc) {\n let curDesc = parentDesc, descI = curDesc.children.length;\n let fI = frag.childCount, matched = new Map, matches = [];\n outer: while (fI > 0) {\n let desc;\n for (;;) {\n if (descI) {\n let next = curDesc.children[descI - 1];\n if (next instanceof MarkViewDesc) {\n curDesc = next;\n descI = next.children.length;\n }\n else {\n desc = next;\n descI--;\n break;\n }\n }\n else if (curDesc == parentDesc) {\n break outer;\n }\n else {\n // FIXME\n descI = curDesc.parent.children.indexOf(curDesc);\n curDesc = curDesc.parent;\n }\n }\n let node = desc.node;\n if (!node)\n continue;\n if (node != frag.child(fI - 1))\n break;\n --fI;\n matched.set(desc, fI);\n matches.push(desc);\n }\n return { index: fI, matched, matches: matches.reverse() };\n}\nfunction compareSide(a, b) {\n return a.type.side - b.type.side;\n}\n// This function abstracts iterating over the nodes and decorations in\n// a fragment. Calls `onNode` for each node, with its local and child\n// decorations. Splits text nodes when there is a decoration starting\n// or ending inside of them. Calls `onWidget` for each widget.\nfunction iterDeco(parent, deco, onWidget, onNode) {\n let locals = deco.locals(parent), offset = 0;\n // Simple, cheap variant for when there are no local decorations\n if (locals.length == 0) {\n for (let i = 0; i < parent.childCount; i++) {\n let child = parent.child(i);\n onNode(child, locals, deco.forChild(offset, child), i);\n offset += child.nodeSize;\n }\n return;\n }\n let decoIndex = 0, active = [], restNode = null;\n for (let parentIndex = 0;;) {\n if (decoIndex < locals.length && locals[decoIndex].to == offset) {\n let widget = locals[decoIndex++], widgets;\n while (decoIndex < locals.length && locals[decoIndex].to == offset)\n (widgets || (widgets = [widget])).push(locals[decoIndex++]);\n if (widgets) {\n widgets.sort(compareSide);\n for (let i = 0; i < widgets.length; i++)\n onWidget(widgets[i], parentIndex, !!restNode);\n }\n else {\n onWidget(widget, parentIndex, !!restNode);\n }\n }\n let child, index;\n if (restNode) {\n index = -1;\n child = restNode;\n restNode = null;\n }\n else if (parentIndex < parent.childCount) {\n index = parentIndex;\n child = parent.child(parentIndex++);\n }\n else {\n break;\n }\n for (let i = 0; i < active.length; i++)\n if (active[i].to <= offset)\n active.splice(i--, 1);\n while (decoIndex < locals.length && locals[decoIndex].from <= offset && locals[decoIndex].to > offset)\n active.push(locals[decoIndex++]);\n let end = offset + child.nodeSize;\n if (child.isText) {\n let cutAt = end;\n if (decoIndex < locals.length && locals[decoIndex].from < cutAt)\n cutAt = locals[decoIndex].from;\n for (let i = 0; i < active.length; i++)\n if (active[i].to < cutAt)\n cutAt = active[i].to;\n if (cutAt < end) {\n restNode = child.cut(cutAt - offset);\n child = child.cut(0, cutAt - offset);\n end = cutAt;\n index = -1;\n }\n }\n let outerDeco = child.isInline && !child.isLeaf ? active.filter(d => !d.inline) : active.slice();\n onNode(child, outerDeco, deco.forChild(offset, child), index);\n offset = end;\n }\n}\n// List markers in Mobile Safari will mysteriously disappear\n// sometimes. This works around that.\nfunction iosHacks(dom) {\n if (dom.nodeName == \"UL\" || dom.nodeName == \"OL\") {\n let oldCSS = dom.style.cssText;\n dom.style.cssText = oldCSS + \"; list-style: square !important\";\n window.getComputedStyle(dom).listStyle;\n dom.style.cssText = oldCSS;\n }\n}\nfunction nearbyTextNode(node, offset) {\n for (;;) {\n if (node.nodeType == 3)\n return node;\n if (node.nodeType == 1 && offset > 0) {\n if (node.childNodes.length > offset && node.childNodes[offset].nodeType == 3)\n return node.childNodes[offset];\n node = node.childNodes[offset - 1];\n offset = nodeSize(node);\n }\n else if (node.nodeType == 1 && offset < node.childNodes.length) {\n node = node.childNodes[offset];\n offset = 0;\n }\n else {\n return null;\n }\n }\n}\n// Find a piece of text in an inline fragment, overlapping from-to\nfunction findTextInFragment(frag, text, from, to) {\n for (let i = 0, pos = 0; i < frag.childCount && pos <= to;) {\n let child = frag.child(i++), childStart = pos;\n pos += child.nodeSize;\n if (!child.isText)\n continue;\n let str = child.text;\n while (i < frag.childCount) {\n let next = frag.child(i++);\n pos += next.nodeSize;\n if (!next.isText)\n break;\n str += next.text;\n }\n if (pos >= from) {\n let found = childStart < to ? str.lastIndexOf(text, to - childStart - 1) : -1;\n if (found >= 0 && found + text.length + childStart >= from)\n return childStart + found;\n if (from == to && str.length >= (to + text.length) - childStart &&\n str.slice(to - childStart, to - childStart + text.length) == text)\n return to;\n }\n }\n return -1;\n}\n// Replace range from-to in an array of view descs with replacement\n// (may be null to just delete). This goes very much against the grain\n// of the rest of this code, which tends to create nodes with the\n// right shape in one go, rather than messing with them after\n// creation, but is necessary in the composition hack.\nfunction replaceNodes(nodes, from, to, view, replacement) {\n let result = [];\n for (let i = 0, off = 0; i < nodes.length; i++) {\n let child = nodes[i], start = off, end = off += child.size;\n if (start >= to || end <= from) {\n result.push(child);\n }\n else {\n if (start < from)\n result.push(child.slice(0, from - start, view));\n if (replacement) {\n result.push(replacement);\n replacement = undefined;\n }\n if (end > to)\n result.push(child.slice(to - start, child.size, view));\n }\n }\n return result;\n}\n\nfunction selectionFromDOM(view, origin = null) {\n let domSel = view.domSelection(), doc = view.state.doc;\n if (!domSel.focusNode)\n return null;\n let nearestDesc = view.docView.nearestDesc(domSel.focusNode), inWidget = nearestDesc && nearestDesc.size == 0;\n let head = view.docView.posFromDOM(domSel.focusNode, domSel.focusOffset, 1);\n if (head < 0)\n return null;\n let $head = doc.resolve(head), $anchor, selection;\n if (selectionCollapsed(domSel)) {\n $anchor = $head;\n while (nearestDesc && !nearestDesc.node)\n nearestDesc = nearestDesc.parent;\n let nearestDescNode = nearestDesc.node;\n if (nearestDesc && nearestDescNode.isAtom && NodeSelection.isSelectable(nearestDescNode) && nearestDesc.parent\n && !(nearestDescNode.isInline && isOnEdge(domSel.focusNode, domSel.focusOffset, nearestDesc.dom))) {\n let pos = nearestDesc.posBefore;\n selection = new NodeSelection(head == pos ? $head : doc.resolve(pos));\n }\n }\n else {\n let anchor = view.docView.posFromDOM(domSel.anchorNode, domSel.anchorOffset, 1);\n if (anchor < 0)\n return null;\n $anchor = doc.resolve(anchor);\n }\n if (!selection) {\n let bias = origin == \"pointer\" || (view.state.selection.head < $head.pos && !inWidget) ? 1 : -1;\n selection = selectionBetween(view, $anchor, $head, bias);\n }\n return selection;\n}\nfunction editorOwnsSelection(view) {\n return view.editable ? view.hasFocus() :\n hasSelection(view) && document.activeElement && document.activeElement.contains(view.dom);\n}\nfunction selectionToDOM(view, force = false) {\n let sel = view.state.selection;\n syncNodeSelection(view, sel);\n if (!editorOwnsSelection(view))\n return;\n // The delayed drag selection causes issues with Cell Selections\n // in Safari. And the drag selection delay is to workarond issues\n // which only present in Chrome.\n if (!force && view.input.mouseDown && view.input.mouseDown.allowDefault && chrome) {\n let domSel = view.domSelection(), curSel = view.domObserver.currentSelection;\n if (domSel.anchorNode && curSel.anchorNode &&\n isEquivalentPosition(domSel.anchorNode, domSel.anchorOffset, curSel.anchorNode, curSel.anchorOffset)) {\n view.input.mouseDown.delayedSelectionSync = true;\n view.domObserver.setCurSelection();\n return;\n }\n }\n view.domObserver.disconnectSelection();\n if (view.cursorWrapper) {\n selectCursorWrapper(view);\n }\n else {\n let { anchor, head } = sel, resetEditableFrom, resetEditableTo;\n if (brokenSelectBetweenUneditable && !(sel instanceof TextSelection)) {\n if (!sel.$from.parent.inlineContent)\n resetEditableFrom = temporarilyEditableNear(view, sel.from);\n if (!sel.empty && !sel.$from.parent.inlineContent)\n resetEditableTo = temporarilyEditableNear(view, sel.to);\n }\n view.docView.setSelection(anchor, head, view.root, force);\n if (brokenSelectBetweenUneditable) {\n if (resetEditableFrom)\n resetEditable(resetEditableFrom);\n if (resetEditableTo)\n resetEditable(resetEditableTo);\n }\n if (sel.visible) {\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n }\n else {\n view.dom.classList.add(\"ProseMirror-hideselection\");\n if (\"onselectionchange\" in document)\n removeClassOnSelectionChange(view);\n }\n }\n view.domObserver.setCurSelection();\n view.domObserver.connectSelection();\n}\n// Kludge to work around Webkit not allowing a selection to start/end\n// between non-editable block nodes. We briefly make something\n// editable, set the selection, then set it uneditable again.\nconst brokenSelectBetweenUneditable = safari || chrome && chrome_version < 63;\nfunction temporarilyEditableNear(view, pos) {\n let { node, offset } = view.docView.domFromPos(pos, 0);\n let after = offset < node.childNodes.length ? node.childNodes[offset] : null;\n let before = offset ? node.childNodes[offset - 1] : null;\n if (safari && after && after.contentEditable == \"false\")\n return setEditable(after);\n if ((!after || after.contentEditable == \"false\") &&\n (!before || before.contentEditable == \"false\")) {\n if (after)\n return setEditable(after);\n else if (before)\n return setEditable(before);\n }\n}\nfunction setEditable(element) {\n element.contentEditable = \"true\";\n if (safari && element.draggable) {\n element.draggable = false;\n element.wasDraggable = true;\n }\n return element;\n}\nfunction resetEditable(element) {\n element.contentEditable = \"false\";\n if (element.wasDraggable) {\n element.draggable = true;\n element.wasDraggable = null;\n }\n}\nfunction removeClassOnSelectionChange(view) {\n let doc = view.dom.ownerDocument;\n doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n let domSel = view.domSelection();\n let node = domSel.anchorNode, offset = domSel.anchorOffset;\n doc.addEventListener(\"selectionchange\", view.input.hideSelectionGuard = () => {\n if (domSel.anchorNode != node || domSel.anchorOffset != offset) {\n doc.removeEventListener(\"selectionchange\", view.input.hideSelectionGuard);\n setTimeout(() => {\n if (!editorOwnsSelection(view) || view.state.selection.visible)\n view.dom.classList.remove(\"ProseMirror-hideselection\");\n }, 20);\n }\n });\n}\nfunction selectCursorWrapper(view) {\n let domSel = view.domSelection(), range = document.createRange();\n let node = view.cursorWrapper.dom, img = node.nodeName == \"IMG\";\n if (img)\n range.setEnd(node.parentNode, domIndex(node) + 1);\n else\n range.setEnd(node, 0);\n range.collapse(false);\n domSel.removeAllRanges();\n domSel.addRange(range);\n // Kludge to kill 'control selection' in IE11 when selecting an\n // invisible cursor wrapper, since that would result in those weird\n // resize handles and a selection that considers the absolutely\n // positioned wrapper, rather than the root editable node, the\n // focused element.\n if (!img && !view.state.selection.visible && ie && ie_version <= 11) {\n node.disabled = true;\n node.disabled = false;\n }\n}\nfunction syncNodeSelection(view, sel) {\n if (sel instanceof NodeSelection) {\n let desc = view.docView.descAt(sel.from);\n if (desc != view.lastSelectedViewDesc) {\n clearNodeSelection(view);\n if (desc)\n desc.selectNode();\n view.lastSelectedViewDesc = desc;\n }\n }\n else {\n clearNodeSelection(view);\n }\n}\n// Clear all DOM statefulness of the last node selection.\nfunction clearNodeSelection(view) {\n if (view.lastSelectedViewDesc) {\n if (view.lastSelectedViewDesc.parent)\n view.lastSelectedViewDesc.deselectNode();\n view.lastSelectedViewDesc = undefined;\n }\n}\nfunction selectionBetween(view, $anchor, $head, bias) {\n return view.someProp(\"createSelectionBetween\", f => f(view, $anchor, $head))\n || TextSelection.between($anchor, $head, bias);\n}\nfunction hasFocusAndSelection(view) {\n if (view.editable && view.root.activeElement != view.dom)\n return false;\n return hasSelection(view);\n}\nfunction hasSelection(view) {\n let sel = view.domSelection();\n if (!sel.anchorNode)\n return false;\n try {\n // Firefox will raise 'permission denied' errors when accessing\n // properties of `sel.anchorNode` when it's in a generated CSS\n // element.\n return view.dom.contains(sel.anchorNode.nodeType == 3 ? sel.anchorNode.parentNode : sel.anchorNode) &&\n (view.editable || view.dom.contains(sel.focusNode.nodeType == 3 ? sel.focusNode.parentNode : sel.focusNode));\n }\n catch (_) {\n return false;\n }\n}\nfunction anchorInRightPlace(view) {\n let anchorDOM = view.docView.domFromPos(view.state.selection.anchor, 0);\n let domSel = view.domSelection();\n return isEquivalentPosition(anchorDOM.node, anchorDOM.offset, domSel.anchorNode, domSel.anchorOffset);\n}\n\nfunction moveSelectionBlock(state, dir) {\n let { $anchor, $head } = state.selection;\n let $side = dir > 0 ? $anchor.max($head) : $anchor.min($head);\n let $start = !$side.parent.inlineContent ? $side : $side.depth ? state.doc.resolve(dir > 0 ? $side.after() : $side.before()) : null;\n return $start && Selection.findFrom($start, dir);\n}\nfunction apply(view, sel) {\n view.dispatch(view.state.tr.setSelection(sel).scrollIntoView());\n return true;\n}\nfunction selectHorizontally(view, dir, mods) {\n let sel = view.state.selection;\n if (sel instanceof TextSelection) {\n if (!sel.empty || mods.indexOf(\"s\") > -1) {\n return false;\n }\n else if (view.endOfTextblock(dir > 0 ? \"right\" : \"left\")) {\n let next = moveSelectionBlock(view.state, dir);\n if (next && (next instanceof NodeSelection))\n return apply(view, next);\n return false;\n }\n else if (!(mac && mods.indexOf(\"m\") > -1)) {\n let $head = sel.$head, node = $head.textOffset ? null : dir < 0 ? $head.nodeBefore : $head.nodeAfter, desc;\n if (!node || node.isText)\n return false;\n let nodePos = dir < 0 ? $head.pos - node.nodeSize : $head.pos;\n if (!(node.isAtom || (desc = view.docView.descAt(nodePos)) && !desc.contentDOM))\n return false;\n if (NodeSelection.isSelectable(node)) {\n return apply(view, new NodeSelection(dir < 0 ? view.state.doc.resolve($head.pos - node.nodeSize) : $head));\n }\n else if (webkit) {\n // Chrome and Safari will introduce extra pointless cursor\n // positions around inline uneditable nodes, so we have to\n // take over and move the cursor past them (#937)\n return apply(view, new TextSelection(view.state.doc.resolve(dir < 0 ? nodePos : nodePos + node.nodeSize)));\n }\n else {\n return false;\n }\n }\n }\n else if (sel instanceof NodeSelection && sel.node.isInline) {\n return apply(view, new TextSelection(dir > 0 ? sel.$to : sel.$from));\n }\n else {\n let next = moveSelectionBlock(view.state, dir);\n if (next)\n return apply(view, next);\n return false;\n }\n}\nfunction nodeLen(node) {\n return node.nodeType == 3 ? node.nodeValue.length : node.childNodes.length;\n}\nfunction isIgnorable(dom) {\n let desc = dom.pmViewDesc;\n return desc && desc.size == 0 && (dom.nextSibling || dom.nodeName != \"BR\");\n}\n// Make sure the cursor isn't directly after one or more ignored\n// nodes, which will confuse the browser's cursor motion logic.\nfunction skipIgnoredNodesLeft(view) {\n let sel = view.domSelection();\n let node = sel.focusNode, offset = sel.focusOffset;\n if (!node)\n return;\n let moveNode, moveOffset, force = false;\n // Gecko will do odd things when the selection is directly in front\n // of a non-editable node, so in that case, move it into the next\n // node if possible. Issue prosemirror/prosemirror#832.\n if (gecko && node.nodeType == 1 && offset < nodeLen(node) && isIgnorable(node.childNodes[offset]))\n force = true;\n for (;;) {\n if (offset > 0) {\n if (node.nodeType != 1) {\n break;\n }\n else {\n let before = node.childNodes[offset - 1];\n if (isIgnorable(before)) {\n moveNode = node;\n moveOffset = --offset;\n }\n else if (before.nodeType == 3) {\n node = before;\n offset = node.nodeValue.length;\n }\n else\n break;\n }\n }\n else if (isBlockNode(node)) {\n break;\n }\n else {\n let prev = node.previousSibling;\n while (prev && isIgnorable(prev)) {\n moveNode = node.parentNode;\n moveOffset = domIndex(prev);\n prev = prev.previousSibling;\n }\n if (!prev) {\n node = node.parentNode;\n if (node == view.dom)\n break;\n offset = 0;\n }\n else {\n node = prev;\n offset = nodeLen(node);\n }\n }\n }\n if (force)\n setSelFocus(view, sel, node, offset);\n else if (moveNode)\n setSelFocus(view, sel, moveNode, moveOffset);\n}\n// Make sure the cursor isn't directly before one or more ignored\n// nodes.\nfunction skipIgnoredNodesRight(view) {\n let sel = view.domSelection();\n let node = sel.focusNode, offset = sel.focusOffset;\n if (!node)\n return;\n let len = nodeLen(node);\n let moveNode, moveOffset;\n for (;;) {\n if (offset < len) {\n if (node.nodeType != 1)\n break;\n let after = node.childNodes[offset];\n if (isIgnorable(after)) {\n moveNode = node;\n moveOffset = ++offset;\n }\n else\n break;\n }\n else if (isBlockNode(node)) {\n break;\n }\n else {\n let next = node.nextSibling;\n while (next && isIgnorable(next)) {\n moveNode = next.parentNode;\n moveOffset = domIndex(next) + 1;\n next = next.nextSibling;\n }\n if (!next) {\n node = node.parentNode;\n if (node == view.dom)\n break;\n offset = len = 0;\n }\n else {\n node = next;\n offset = 0;\n len = nodeLen(node);\n }\n }\n }\n if (moveNode)\n setSelFocus(view, sel, moveNode, moveOffset);\n}\nfunction isBlockNode(dom) {\n let desc = dom.pmViewDesc;\n return desc && desc.node && desc.node.isBlock;\n}\nfunction setSelFocus(view, sel, node, offset) {\n if (selectionCollapsed(sel)) {\n let range = document.createRange();\n range.setEnd(node, offset);\n range.setStart(node, offset);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n else if (sel.extend) {\n sel.extend(node, offset);\n }\n view.domObserver.setCurSelection();\n let { state } = view;\n // If no state update ends up happening, reset the selection.\n setTimeout(() => {\n if (view.state == state)\n selectionToDOM(view);\n }, 50);\n}\n// Check whether vertical selection motion would involve node\n// selections. If so, apply it (if not, the result is left to the\n// browser)\nfunction selectVertically(view, dir, mods) {\n let sel = view.state.selection;\n if (sel instanceof TextSelection && !sel.empty || mods.indexOf(\"s\") > -1)\n return false;\n if (mac && mods.indexOf(\"m\") > -1)\n return false;\n let { $from, $to } = sel;\n if (!$from.parent.inlineContent || view.endOfTextblock(dir < 0 ? \"up\" : \"down\")) {\n let next = moveSelectionBlock(view.state, dir);\n if (next && (next instanceof NodeSelection))\n return apply(view, next);\n }\n if (!$from.parent.inlineContent) {\n let side = dir < 0 ? $from : $to;\n let beyond = sel instanceof AllSelection ? Selection.near(side, dir) : Selection.findFrom(side, dir);\n return beyond ? apply(view, beyond) : false;\n }\n return false;\n}\nfunction stopNativeHorizontalDelete(view, dir) {\n if (!(view.state.selection instanceof TextSelection))\n return true;\n let { $head, $anchor, empty } = view.state.selection;\n if (!$head.sameParent($anchor))\n return true;\n if (!empty)\n return false;\n if (view.endOfTextblock(dir > 0 ? \"forward\" : \"backward\"))\n return true;\n let nextNode = !$head.textOffset && (dir < 0 ? $head.nodeBefore : $head.nodeAfter);\n if (nextNode && !nextNode.isText) {\n let tr = view.state.tr;\n if (dir < 0)\n tr.delete($head.pos - nextNode.nodeSize, $head.pos);\n else\n tr.delete($head.pos, $head.pos + nextNode.nodeSize);\n view.dispatch(tr);\n return true;\n }\n return false;\n}\nfunction switchEditable(view, node, state) {\n view.domObserver.stop();\n node.contentEditable = state;\n view.domObserver.start();\n}\n// Issue #867 / #1090 / https://bugs.chromium.org/p/chromium/issues/detail?id=903821\n// In which Safari (and at some point in the past, Chrome) does really\n// wrong things when the down arrow is pressed when the cursor is\n// directly at the start of a textblock and has an uneditable node\n// after it\nfunction safariDownArrowBug(view) {\n if (!safari || view.state.selection.$head.parentOffset > 0)\n return false;\n let { focusNode, focusOffset } = view.domSelection();\n if (focusNode && focusNode.nodeType == 1 && focusOffset == 0 &&\n focusNode.firstChild && focusNode.firstChild.contentEditable == \"false\") {\n let child = focusNode.firstChild;\n switchEditable(view, child, \"true\");\n setTimeout(() => switchEditable(view, child, \"false\"), 20);\n }\n return false;\n}\n// A backdrop key mapping used to make sure we always suppress keys\n// that have a dangerous default effect, even if the commands they are\n// bound to return false, and to make sure that cursor-motion keys\n// find a cursor (as opposed to a node selection) when pressed. For\n// cursor-motion keys, the code in the handlers also takes care of\n// block selections.\nfunction getMods(event) {\n let result = \"\";\n if (event.ctrlKey)\n result += \"c\";\n if (event.metaKey)\n result += \"m\";\n if (event.altKey)\n result += \"a\";\n if (event.shiftKey)\n result += \"s\";\n return result;\n}\nfunction captureKeyDown(view, event) {\n let code = event.keyCode, mods = getMods(event);\n if (code == 8 || (mac && code == 72 && mods == \"c\")) { // Backspace, Ctrl-h on Mac\n return stopNativeHorizontalDelete(view, -1) || skipIgnoredNodesLeft(view);\n }\n else if (code == 46 || (mac && code == 68 && mods == \"c\")) { // Delete, Ctrl-d on Mac\n return stopNativeHorizontalDelete(view, 1) || skipIgnoredNodesRight(view);\n }\n else if (code == 13 || code == 27) { // Enter, Esc\n return true;\n }\n else if (code == 37 || (mac && code == 66 && mods == \"c\")) { // Left arrow, Ctrl-b on Mac\n return selectHorizontally(view, -1, mods) || skipIgnoredNodesLeft(view);\n }\n else if (code == 39 || (mac && code == 70 && mods == \"c\")) { // Right arrow, Ctrl-f on Mac\n return selectHorizontally(view, 1, mods) || skipIgnoredNodesRight(view);\n }\n else if (code == 38 || (mac && code == 80 && mods == \"c\")) { // Up arrow, Ctrl-p on Mac\n return selectVertically(view, -1, mods) || skipIgnoredNodesLeft(view);\n }\n else if (code == 40 || (mac && code == 78 && mods == \"c\")) { // Down arrow, Ctrl-n on Mac\n return safariDownArrowBug(view) || selectVertically(view, 1, mods) || skipIgnoredNodesRight(view);\n }\n else if (mods == (mac ? \"m\" : \"c\") &&\n (code == 66 || code == 73 || code == 89 || code == 90)) { // Mod-[biyz]\n return true;\n }\n return false;\n}\n\nfunction serializeForClipboard(view, slice) {\n let context = [], { content, openStart, openEnd } = slice;\n while (openStart > 1 && openEnd > 1 && content.childCount == 1 && content.firstChild.childCount == 1) {\n openStart--;\n openEnd--;\n let node = content.firstChild;\n context.push(node.type.name, node.attrs != node.type.defaultAttrs ? node.attrs : null);\n content = node.content;\n }\n let serializer = view.someProp(\"clipboardSerializer\") || DOMSerializer.fromSchema(view.state.schema);\n let doc = detachedDoc(), wrap = doc.createElement(\"div\");\n wrap.appendChild(serializer.serializeFragment(content, { document: doc }));\n let firstChild = wrap.firstChild, needsWrap, wrappers = 0;\n while (firstChild && firstChild.nodeType == 1 && (needsWrap = wrapMap[firstChild.nodeName.toLowerCase()])) {\n for (let i = needsWrap.length - 1; i >= 0; i--) {\n let wrapper = doc.createElement(needsWrap[i]);\n while (wrap.firstChild)\n wrapper.appendChild(wrap.firstChild);\n wrap.appendChild(wrapper);\n wrappers++;\n }\n firstChild = wrap.firstChild;\n }\n if (firstChild && firstChild.nodeType == 1)\n firstChild.setAttribute(\"data-pm-slice\", `${openStart} ${openEnd}${wrappers ? ` -${wrappers}` : \"\"} ${JSON.stringify(context)}`);\n let text = view.someProp(\"clipboardTextSerializer\", f => f(slice)) ||\n slice.content.textBetween(0, slice.content.size, \"\\n\\n\");\n return { dom: wrap, text };\n}\n// Read a slice of content from the clipboard (or drop data).\nfunction parseFromClipboard(view, text, html, plainText, $context) {\n let inCode = $context.parent.type.spec.code;\n let dom, slice;\n if (!html && !text)\n return null;\n let asText = text && (plainText || inCode || !html);\n if (asText) {\n view.someProp(\"transformPastedText\", f => { text = f(text, inCode || plainText); });\n if (inCode)\n return text ? new Slice(Fragment.from(view.state.schema.text(text.replace(/\\r\\n?/g, \"\\n\"))), 0, 0) : Slice.empty;\n let parsed = view.someProp(\"clipboardTextParser\", f => f(text, $context, plainText));\n if (parsed) {\n slice = parsed;\n }\n else {\n let marks = $context.marks();\n let { schema } = view.state, serializer = DOMSerializer.fromSchema(schema);\n dom = document.createElement(\"div\");\n text.split(/(?:\\r\\n?|\\n)+/).forEach(block => {\n let p = dom.appendChild(document.createElement(\"p\"));\n if (block)\n p.appendChild(serializer.serializeNode(schema.text(block, marks)));\n });\n }\n }\n else {\n view.someProp(\"transformPastedHTML\", f => { html = f(html); });\n dom = readHTML(html);\n if (webkit)\n restoreReplacedSpaces(dom);\n }\n let contextNode = dom && dom.querySelector(\"[data-pm-slice]\");\n let sliceData = contextNode && /^(\\d+) (\\d+)(?: -(\\d+))? (.*)/.exec(contextNode.getAttribute(\"data-pm-slice\") || \"\");\n if (sliceData && sliceData[3])\n for (let i = +sliceData[3]; i > 0 && dom.firstChild; i--)\n dom = dom.firstChild;\n if (!slice) {\n let parser = view.someProp(\"clipboardParser\") || view.someProp(\"domParser\") || DOMParser.fromSchema(view.state.schema);\n slice = parser.parseSlice(dom, {\n preserveWhitespace: !!(asText || sliceData),\n context: $context,\n ruleFromNode(dom) {\n if (dom.nodeName == \"BR\" && !dom.nextSibling &&\n dom.parentNode && !inlineParents.test(dom.parentNode.nodeName))\n return { ignore: true };\n return null;\n }\n });\n }\n if (sliceData) {\n slice = addContext(closeSlice(slice, +sliceData[1], +sliceData[2]), sliceData[4]);\n }\n else { // HTML wasn't created by ProseMirror. Make sure top-level siblings are coherent\n slice = Slice.maxOpen(normalizeSiblings(slice.content, $context), true);\n if (slice.openStart || slice.openEnd) {\n let openStart = 0, openEnd = 0;\n for (let node = slice.content.firstChild; openStart < slice.openStart && !node.type.spec.isolating; openStart++, node = node.firstChild) { }\n for (let node = slice.content.lastChild; openEnd < slice.openEnd && !node.type.spec.isolating; openEnd++, node = node.lastChild) { }\n slice = closeSlice(slice, openStart, openEnd);\n }\n }\n view.someProp(\"transformPasted\", f => { slice = f(slice); });\n return slice;\n}\nconst inlineParents = /^(a|abbr|acronym|b|cite|code|del|em|i|ins|kbd|label|output|q|ruby|s|samp|span|strong|sub|sup|time|u|tt|var)$/i;\n// Takes a slice parsed with parseSlice, which means there hasn't been\n// any content-expression checking done on the top nodes, tries to\n// find a parent node in the current context that might fit the nodes,\n// and if successful, rebuilds the slice so that it fits into that parent.\n//\n// This addresses the problem that Transform.replace expects a\n// coherent slice, and will fail to place a set of siblings that don't\n// fit anywhere in the schema.\nfunction normalizeSiblings(fragment, $context) {\n if (fragment.childCount < 2)\n return fragment;\n for (let d = $context.depth; d >= 0; d--) {\n let parent = $context.node(d);\n let match = parent.contentMatchAt($context.index(d));\n let lastWrap, result = [];\n fragment.forEach(node => {\n if (!result)\n return;\n let wrap = match.findWrapping(node.type), inLast;\n if (!wrap)\n return result = null;\n if (inLast = result.length && lastWrap.length && addToSibling(wrap, lastWrap, node, result[result.length - 1], 0)) {\n result[result.length - 1] = inLast;\n }\n else {\n if (result.length)\n result[result.length - 1] = closeRight(result[result.length - 1], lastWrap.length);\n let wrapped = withWrappers(node, wrap);\n result.push(wrapped);\n match = match.matchType(wrapped.type);\n lastWrap = wrap;\n }\n });\n if (result)\n return Fragment.from(result);\n }\n return fragment;\n}\nfunction withWrappers(node, wrap, from = 0) {\n for (let i = wrap.length - 1; i >= from; i--)\n node = wrap[i].create(null, Fragment.from(node));\n return node;\n}\n// Used to group adjacent nodes wrapped in similar parents by\n// normalizeSiblings into the same parent node\nfunction addToSibling(wrap, lastWrap, node, sibling, depth) {\n if (depth < wrap.length && depth < lastWrap.length && wrap[depth] == lastWrap[depth]) {\n let inner = addToSibling(wrap, lastWrap, node, sibling.lastChild, depth + 1);\n if (inner)\n return sibling.copy(sibling.content.replaceChild(sibling.childCount - 1, inner));\n let match = sibling.contentMatchAt(sibling.childCount);\n if (match.matchType(depth == wrap.length - 1 ? node.type : wrap[depth + 1]))\n return sibling.copy(sibling.content.append(Fragment.from(withWrappers(node, wrap, depth + 1))));\n }\n}\nfunction closeRight(node, depth) {\n if (depth == 0)\n return node;\n let fragment = node.content.replaceChild(node.childCount - 1, closeRight(node.lastChild, depth - 1));\n let fill = node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true);\n return node.copy(fragment.append(fill));\n}\nfunction closeRange(fragment, side, from, to, depth, openEnd) {\n let node = side < 0 ? fragment.firstChild : fragment.lastChild, inner = node.content;\n if (depth < to - 1)\n inner = closeRange(inner, side, from, to, depth + 1, openEnd);\n if (depth >= from)\n inner = side < 0 ? node.contentMatchAt(0).fillBefore(inner, fragment.childCount > 1 || openEnd <= depth).append(inner)\n : inner.append(node.contentMatchAt(node.childCount).fillBefore(Fragment.empty, true));\n return fragment.replaceChild(side < 0 ? 0 : fragment.childCount - 1, node.copy(inner));\n}\nfunction closeSlice(slice, openStart, openEnd) {\n if (openStart < slice.openStart)\n slice = new Slice(closeRange(slice.content, -1, openStart, slice.openStart, 0, slice.openEnd), openStart, slice.openEnd);\n if (openEnd < slice.openEnd)\n slice = new Slice(closeRange(slice.content, 1, openEnd, slice.openEnd, 0, 0), slice.openStart, openEnd);\n return slice;\n}\n// Trick from jQuery -- some elements must be wrapped in other\n// elements for innerHTML to work. I.e. if you do `div.innerHTML =\n// \"