You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					797 lines
				
				26 KiB
			
		
		
			
		
	
	
					797 lines
				
				26 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } | ||
|  | 
 | ||
|  | Object.defineProperty(exports, '__esModule', { | ||
|  |   value: true | ||
|  | }); | ||
|  | 
 | ||
|  | var prosemirrorTransform = require('prosemirror-transform'); | ||
|  | 
 | ||
|  | var prosemirrorModel = require('prosemirror-model'); | ||
|  | 
 | ||
|  | var prosemirrorState = require('prosemirror-state'); | ||
|  | 
 | ||
|  | var deleteSelection = function deleteSelection(state, dispatch) { | ||
|  |   if (state.selection.empty) return false; | ||
|  |   if (dispatch) dispatch(state.tr.deleteSelection().scrollIntoView()); | ||
|  |   return true; | ||
|  | }; | ||
|  | 
 | ||
|  | function atBlockStart(state, view) { | ||
|  |   var $cursor = state.selection.$cursor; | ||
|  |   if (!$cursor || (view ? !view.endOfTextblock("backward", state) : $cursor.parentOffset > 0)) return null; | ||
|  |   return $cursor; | ||
|  | } | ||
|  | 
 | ||
|  | var joinBackward = function joinBackward(state, dispatch, view) { | ||
|  |   var $cursor = atBlockStart(state, view); | ||
|  |   if (!$cursor) return false; | ||
|  |   var $cut = findCutBefore($cursor); | ||
|  | 
 | ||
|  |   if (!$cut) { | ||
|  |     var range = $cursor.blockRange(), | ||
|  |         target = range && prosemirrorTransform.liftTarget(range); | ||
|  |     if (target == null) return false; | ||
|  |     if (dispatch) dispatch(state.tr.lift(range, target).scrollIntoView()); | ||
|  |     return true; | ||
|  |   } | ||
|  | 
 | ||
|  |   var before = $cut.nodeBefore; | ||
|  |   if (!before.type.spec.isolating && deleteBarrier(state, $cut, dispatch)) return true; | ||
|  | 
 | ||
|  |   if ($cursor.parent.content.size == 0 && (textblockAt(before, "end") || prosemirrorState.NodeSelection.isSelectable(before))) { | ||
|  |     var delStep = prosemirrorTransform.replaceStep(state.doc, $cursor.before(), $cursor.after(), prosemirrorModel.Slice.empty); | ||
|  | 
 | ||
|  |     if (delStep && delStep.slice.size < delStep.to - delStep.from) { | ||
|  |       if (dispatch) { | ||
|  |         var tr = state.tr.step(delStep); | ||
|  |         tr.setSelection(textblockAt(before, "end") ? prosemirrorState.Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos, -1)), -1) : prosemirrorState.NodeSelection.create(tr.doc, $cut.pos - before.nodeSize)); | ||
|  |         dispatch(tr.scrollIntoView()); | ||
|  |       } | ||
|  | 
 | ||
|  |       return true; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   if (before.isAtom && $cut.depth == $cursor.depth - 1) { | ||
|  |     if (dispatch) dispatch(state.tr["delete"]($cut.pos - before.nodeSize, $cut.pos).scrollIntoView()); | ||
|  |     return true; | ||
|  |   } | ||
|  | 
 | ||
|  |   return false; | ||
|  | }; | ||
|  | 
 | ||
|  | var joinTextblockBackward = function joinTextblockBackward(state, dispatch, view) { | ||
|  |   var $cursor = atBlockStart(state, view); | ||
|  |   if (!$cursor) return false; | ||
|  |   var $cut = findCutBefore($cursor); | ||
|  |   return $cut ? joinTextblocksAround(state, $cut, dispatch) : false; | ||
|  | }; | ||
|  | 
 | ||
|  | var joinTextblockForward = function joinTextblockForward(state, dispatch, view) { | ||
|  |   var $cursor = atBlockEnd(state, view); | ||
|  |   if (!$cursor) return false; | ||
|  |   var $cut = findCutAfter($cursor); | ||
|  |   return $cut ? joinTextblocksAround(state, $cut, dispatch) : false; | ||
|  | }; | ||
|  | 
 | ||
|  | function joinTextblocksAround(state, $cut, dispatch) { | ||
|  |   var before = $cut.nodeBefore, | ||
|  |       beforeText = before, | ||
|  |       beforePos = $cut.pos - 1; | ||
|  | 
 | ||
|  |   for (; !beforeText.isTextblock; beforePos--) { | ||
|  |     if (beforeText.type.spec.isolating) return false; | ||
|  |     var child = beforeText.lastChild; | ||
|  |     if (!child) return false; | ||
|  |     beforeText = child; | ||
|  |   } | ||
|  | 
 | ||
|  |   var after = $cut.nodeAfter, | ||
|  |       afterText = after, | ||
|  |       afterPos = $cut.pos + 1; | ||
|  | 
 | ||
|  |   for (; !afterText.isTextblock; afterPos++) { | ||
|  |     if (afterText.type.spec.isolating) return false; | ||
|  |     var _child = afterText.firstChild; | ||
|  |     if (!_child) return false; | ||
|  |     afterText = _child; | ||
|  |   } | ||
|  | 
 | ||
|  |   var step = prosemirrorTransform.replaceStep(state.doc, beforePos, afterPos, prosemirrorModel.Slice.empty); | ||
|  |   if (!step || step.from != beforePos || step.slice.size >= afterPos - beforePos) return false; | ||
|  | 
 | ||
|  |   if (dispatch) { | ||
|  |     var tr = state.tr.step(step); | ||
|  |     tr.setSelection(prosemirrorState.TextSelection.create(tr.doc, beforePos)); | ||
|  |     dispatch(tr.scrollIntoView()); | ||
|  |   } | ||
|  | 
 | ||
|  |   return true; | ||
|  | } | ||
|  | 
 | ||
|  | function textblockAt(node, side) { | ||
|  |   var only = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; | ||
|  | 
 | ||
|  |   for (var scan = node; scan; scan = side == "start" ? scan.firstChild : scan.lastChild) { | ||
|  |     if (scan.isTextblock) return true; | ||
|  |     if (only && scan.childCount != 1) return false; | ||
|  |   } | ||
|  | 
 | ||
|  |   return false; | ||
|  | } | ||
|  | 
 | ||
|  | var selectNodeBackward = function selectNodeBackward(state, dispatch, view) { | ||
|  |   var _state$selection = state.selection, | ||
|  |       $head = _state$selection.$head, | ||
|  |       empty = _state$selection.empty, | ||
|  |       $cut = $head; | ||
|  |   if (!empty) return false; | ||
|  | 
 | ||
|  |   if ($head.parent.isTextblock) { | ||
|  |     if (view ? !view.endOfTextblock("backward", state) : $head.parentOffset > 0) return false; | ||
|  |     $cut = findCutBefore($head); | ||
|  |   } | ||
|  | 
 | ||
|  |   var node = $cut && $cut.nodeBefore; | ||
|  |   if (!node || !prosemirrorState.NodeSelection.isSelectable(node)) return false; | ||
|  |   if (dispatch) dispatch(state.tr.setSelection(prosemirrorState.NodeSelection.create(state.doc, $cut.pos - node.nodeSize)).scrollIntoView()); | ||
|  |   return true; | ||
|  | }; | ||
|  | 
 | ||
|  | function findCutBefore($pos) { | ||
|  |   if (!$pos.parent.type.spec.isolating) for (var i = $pos.depth - 1; i >= 0; i--) { | ||
|  |     if ($pos.index(i) > 0) return $pos.doc.resolve($pos.before(i + 1)); | ||
|  |     if ($pos.node(i).type.spec.isolating) break; | ||
|  |   } | ||
|  |   return null; | ||
|  | } | ||
|  | 
 | ||
|  | function atBlockEnd(state, view) { | ||
|  |   var $cursor = state.selection.$cursor; | ||
|  |   if (!$cursor || (view ? !view.endOfTextblock("forward", state) : $cursor.parentOffset < $cursor.parent.content.size)) return null; | ||
|  |   return $cursor; | ||
|  | } | ||
|  | 
 | ||
|  | var joinForward = function joinForward(state, dispatch, view) { | ||
|  |   var $cursor = atBlockEnd(state, view); | ||
|  |   if (!$cursor) return false; | ||
|  |   var $cut = findCutAfter($cursor); | ||
|  |   if (!$cut) return false; | ||
|  |   var after = $cut.nodeAfter; | ||
|  |   if (deleteBarrier(state, $cut, dispatch)) return true; | ||
|  | 
 | ||
|  |   if ($cursor.parent.content.size == 0 && (textblockAt(after, "start") || prosemirrorState.NodeSelection.isSelectable(after))) { | ||
|  |     var delStep = prosemirrorTransform.replaceStep(state.doc, $cursor.before(), $cursor.after(), prosemirrorModel.Slice.empty); | ||
|  | 
 | ||
|  |     if (delStep && delStep.slice.size < delStep.to - delStep.from) { | ||
|  |       if (dispatch) { | ||
|  |         var tr = state.tr.step(delStep); | ||
|  |         tr.setSelection(textblockAt(after, "start") ? prosemirrorState.Selection.findFrom(tr.doc.resolve(tr.mapping.map($cut.pos)), 1) : prosemirrorState.NodeSelection.create(tr.doc, tr.mapping.map($cut.pos))); | ||
|  |         dispatch(tr.scrollIntoView()); | ||
|  |       } | ||
|  | 
 | ||
|  |       return true; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   if (after.isAtom && $cut.depth == $cursor.depth - 1) { | ||
|  |     if (dispatch) dispatch(state.tr["delete"]($cut.pos, $cut.pos + after.nodeSize).scrollIntoView()); | ||
|  |     return true; | ||
|  |   } | ||
|  | 
 | ||
|  |   return false; | ||
|  | }; | ||
|  | 
 | ||
|  | var selectNodeForward = function selectNodeForward(state, dispatch, view) { | ||
|  |   var _state$selection2 = state.selection, | ||
|  |       $head = _state$selection2.$head, | ||
|  |       empty = _state$selection2.empty, | ||
|  |       $cut = $head; | ||
|  |   if (!empty) return false; | ||
|  | 
 | ||
|  |   if ($head.parent.isTextblock) { | ||
|  |     if (view ? !view.endOfTextblock("forward", state) : $head.parentOffset < $head.parent.content.size) return false; | ||
|  |     $cut = findCutAfter($head); | ||
|  |   } | ||
|  | 
 | ||
|  |   var node = $cut && $cut.nodeAfter; | ||
|  |   if (!node || !prosemirrorState.NodeSelection.isSelectable(node)) return false; | ||
|  |   if (dispatch) dispatch(state.tr.setSelection(prosemirrorState.NodeSelection.create(state.doc, $cut.pos)).scrollIntoView()); | ||
|  |   return true; | ||
|  | }; | ||
|  | 
 | ||
|  | function findCutAfter($pos) { | ||
|  |   if (!$pos.parent.type.spec.isolating) for (var i = $pos.depth - 1; i >= 0; i--) { | ||
|  |     var parent = $pos.node(i); | ||
|  |     if ($pos.index(i) + 1 < parent.childCount) return $pos.doc.resolve($pos.after(i + 1)); | ||
|  |     if (parent.type.spec.isolating) break; | ||
|  |   } | ||
|  |   return null; | ||
|  | } | ||
|  | 
 | ||
|  | var joinUp = function joinUp(state, dispatch) { | ||
|  |   var sel = state.selection, | ||
|  |       nodeSel = sel instanceof prosemirrorState.NodeSelection, | ||
|  |       point; | ||
|  | 
 | ||
|  |   if (nodeSel) { | ||
|  |     if (sel.node.isTextblock || !prosemirrorTransform.canJoin(state.doc, sel.from)) return false; | ||
|  |     point = sel.from; | ||
|  |   } else { | ||
|  |     point = prosemirrorTransform.joinPoint(state.doc, sel.from, -1); | ||
|  |     if (point == null) return false; | ||
|  |   } | ||
|  | 
 | ||
|  |   if (dispatch) { | ||
|  |     var tr = state.tr.join(point); | ||
|  |     if (nodeSel) tr.setSelection(prosemirrorState.NodeSelection.create(tr.doc, point - state.doc.resolve(point).nodeBefore.nodeSize)); | ||
|  |     dispatch(tr.scrollIntoView()); | ||
|  |   } | ||
|  | 
 | ||
|  |   return true; | ||
|  | }; | ||
|  | 
 | ||
|  | var joinDown = function joinDown(state, dispatch) { | ||
|  |   var sel = state.selection, | ||
|  |       point; | ||
|  | 
 | ||
|  |   if (sel instanceof prosemirrorState.NodeSelection) { | ||
|  |     if (sel.node.isTextblock || !prosemirrorTransform.canJoin(state.doc, sel.to)) return false; | ||
|  |     point = sel.to; | ||
|  |   } else { | ||
|  |     point = prosemirrorTransform.joinPoint(state.doc, sel.to, 1); | ||
|  |     if (point == null) return false; | ||
|  |   } | ||
|  | 
 | ||
|  |   if (dispatch) dispatch(state.tr.join(point).scrollIntoView()); | ||
|  |   return true; | ||
|  | }; | ||
|  | 
 | ||
|  | var lift = function lift(state, dispatch) { | ||
|  |   var _state$selection3 = state.selection, | ||
|  |       $from = _state$selection3.$from, | ||
|  |       $to = _state$selection3.$to; | ||
|  |   var range = $from.blockRange($to), | ||
|  |       target = range && prosemirrorTransform.liftTarget(range); | ||
|  |   if (target == null) return false; | ||
|  |   if (dispatch) dispatch(state.tr.lift(range, target).scrollIntoView()); | ||
|  |   return true; | ||
|  | }; | ||
|  | 
 | ||
|  | var newlineInCode = function newlineInCode(state, dispatch) { | ||
|  |   var _state$selection4 = state.selection, | ||
|  |       $head = _state$selection4.$head, | ||
|  |       $anchor = _state$selection4.$anchor; | ||
|  |   if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) return false; | ||
|  |   if (dispatch) dispatch(state.tr.insertText("\n").scrollIntoView()); | ||
|  |   return true; | ||
|  | }; | ||
|  | 
 | ||
|  | function defaultBlockAt(match) { | ||
|  |   for (var i = 0; i < match.edgeCount; i++) { | ||
|  |     var _match$edge = match.edge(i), | ||
|  |         type = _match$edge.type; | ||
|  | 
 | ||
|  |     if (type.isTextblock && !type.hasRequiredAttrs()) return type; | ||
|  |   } | ||
|  | 
 | ||
|  |   return null; | ||
|  | } | ||
|  | 
 | ||
|  | var exitCode = function exitCode(state, dispatch) { | ||
|  |   var _state$selection5 = state.selection, | ||
|  |       $head = _state$selection5.$head, | ||
|  |       $anchor = _state$selection5.$anchor; | ||
|  |   if (!$head.parent.type.spec.code || !$head.sameParent($anchor)) return false; | ||
|  |   var above = $head.node(-1), | ||
|  |       after = $head.indexAfter(-1), | ||
|  |       type = defaultBlockAt(above.contentMatchAt(after)); | ||
|  |   if (!type || !above.canReplaceWith(after, after, type)) return false; | ||
|  | 
 | ||
|  |   if (dispatch) { | ||
|  |     var pos = $head.after(), | ||
|  |         tr = state.tr.replaceWith(pos, pos, type.createAndFill()); | ||
|  |     tr.setSelection(prosemirrorState.Selection.near(tr.doc.resolve(pos), 1)); | ||
|  |     dispatch(tr.scrollIntoView()); | ||
|  |   } | ||
|  | 
 | ||
|  |   return true; | ||
|  | }; | ||
|  | 
 | ||
|  | var createParagraphNear = function createParagraphNear(state, dispatch) { | ||
|  |   var sel = state.selection, | ||
|  |       $from = sel.$from, | ||
|  |       $to = sel.$to; | ||
|  |   if (sel instanceof prosemirrorState.AllSelection || $from.parent.inlineContent || $to.parent.inlineContent) return false; | ||
|  |   var type = defaultBlockAt($to.parent.contentMatchAt($to.indexAfter())); | ||
|  |   if (!type || !type.isTextblock) return false; | ||
|  | 
 | ||
|  |   if (dispatch) { | ||
|  |     var side = (!$from.parentOffset && $to.index() < $to.parent.childCount ? $from : $to).pos; | ||
|  |     var tr = state.tr.insert(side, type.createAndFill()); | ||
|  |     tr.setSelection(prosemirrorState.TextSelection.create(tr.doc, side + 1)); | ||
|  |     dispatch(tr.scrollIntoView()); | ||
|  |   } | ||
|  | 
 | ||
|  |   return true; | ||
|  | }; | ||
|  | 
 | ||
|  | var liftEmptyBlock = function liftEmptyBlock(state, dispatch) { | ||
|  |   var $cursor = state.selection.$cursor; | ||
|  |   if (!$cursor || $cursor.parent.content.size) return false; | ||
|  | 
 | ||
|  |   if ($cursor.depth > 1 && $cursor.after() != $cursor.end(-1)) { | ||
|  |     var before = $cursor.before(); | ||
|  | 
 | ||
|  |     if (prosemirrorTransform.canSplit(state.doc, before)) { | ||
|  |       if (dispatch) dispatch(state.tr.split(before).scrollIntoView()); | ||
|  |       return true; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   var range = $cursor.blockRange(), | ||
|  |       target = range && prosemirrorTransform.liftTarget(range); | ||
|  |   if (target == null) return false; | ||
|  |   if (dispatch) dispatch(state.tr.lift(range, target).scrollIntoView()); | ||
|  |   return true; | ||
|  | }; | ||
|  | 
 | ||
|  | function splitBlockAs(splitNode) { | ||
|  |   return function (state, dispatch) { | ||
|  |     var _state$selection6 = state.selection, | ||
|  |         $from = _state$selection6.$from, | ||
|  |         $to = _state$selection6.$to; | ||
|  | 
 | ||
|  |     if (state.selection instanceof prosemirrorState.NodeSelection && state.selection.node.isBlock) { | ||
|  |       if (!$from.parentOffset || !prosemirrorTransform.canSplit(state.doc, $from.pos)) return false; | ||
|  |       if (dispatch) dispatch(state.tr.split($from.pos).scrollIntoView()); | ||
|  |       return true; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (!$from.parent.isBlock) return false; | ||
|  | 
 | ||
|  |     if (dispatch) { | ||
|  |       var atEnd = $to.parentOffset == $to.parent.content.size; | ||
|  |       var tr = state.tr; | ||
|  |       if (state.selection instanceof prosemirrorState.TextSelection || state.selection instanceof prosemirrorState.AllSelection) tr.deleteSelection(); | ||
|  |       var deflt = $from.depth == 0 ? null : defaultBlockAt($from.node(-1).contentMatchAt($from.indexAfter(-1))); | ||
|  |       var splitType = splitNode && splitNode($to.parent, atEnd); | ||
|  |       var types = splitType ? [splitType] : atEnd && deflt ? [{ | ||
|  |         type: deflt | ||
|  |       }] : undefined; | ||
|  |       var can = prosemirrorTransform.canSplit(tr.doc, tr.mapping.map($from.pos), 1, types); | ||
|  | 
 | ||
|  |       if (!types && !can && prosemirrorTransform.canSplit(tr.doc, tr.mapping.map($from.pos), 1, deflt ? [{ | ||
|  |         type: deflt | ||
|  |       }] : undefined)) { | ||
|  |         if (deflt) types = [{ | ||
|  |           type: deflt | ||
|  |         }]; | ||
|  |         can = true; | ||
|  |       } | ||
|  | 
 | ||
|  |       if (can) { | ||
|  |         tr.split(tr.mapping.map($from.pos), 1, types); | ||
|  | 
 | ||
|  |         if (!atEnd && !$from.parentOffset && $from.parent.type != deflt) { | ||
|  |           var first = tr.mapping.map($from.before()), | ||
|  |               $first = tr.doc.resolve(first); | ||
|  |           if (deflt && $from.node(-1).canReplaceWith($first.index(), $first.index() + 1, deflt)) tr.setNodeMarkup(tr.mapping.map($from.before()), deflt); | ||
|  |         } | ||
|  |       } | ||
|  | 
 | ||
|  |       dispatch(tr.scrollIntoView()); | ||
|  |     } | ||
|  | 
 | ||
|  |     return true; | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | var splitBlock = splitBlockAs(); | ||
|  | 
 | ||
|  | var splitBlockKeepMarks = function splitBlockKeepMarks(state, dispatch) { | ||
|  |   return splitBlock(state, dispatch && function (tr) { | ||
|  |     var marks = state.storedMarks || state.selection.$to.parentOffset && state.selection.$from.marks(); | ||
|  |     if (marks) tr.ensureMarks(marks); | ||
|  |     dispatch(tr); | ||
|  |   }); | ||
|  | }; | ||
|  | 
 | ||
|  | var selectParentNode = function selectParentNode(state, dispatch) { | ||
|  |   var _state$selection7 = state.selection, | ||
|  |       $from = _state$selection7.$from, | ||
|  |       to = _state$selection7.to, | ||
|  |       pos; | ||
|  |   var same = $from.sharedDepth(to); | ||
|  |   if (same == 0) return false; | ||
|  |   pos = $from.before(same); | ||
|  |   if (dispatch) dispatch(state.tr.setSelection(prosemirrorState.NodeSelection.create(state.doc, pos))); | ||
|  |   return true; | ||
|  | }; | ||
|  | 
 | ||
|  | var selectAll = function selectAll(state, dispatch) { | ||
|  |   if (dispatch) dispatch(state.tr.setSelection(new prosemirrorState.AllSelection(state.doc))); | ||
|  |   return true; | ||
|  | }; | ||
|  | 
 | ||
|  | function joinMaybeClear(state, $pos, dispatch) { | ||
|  |   var before = $pos.nodeBefore, | ||
|  |       after = $pos.nodeAfter, | ||
|  |       index = $pos.index(); | ||
|  |   if (!before || !after || !before.type.compatibleContent(after.type)) return false; | ||
|  | 
 | ||
|  |   if (!before.content.size && $pos.parent.canReplace(index - 1, index)) { | ||
|  |     if (dispatch) dispatch(state.tr["delete"]($pos.pos - before.nodeSize, $pos.pos).scrollIntoView()); | ||
|  |     return true; | ||
|  |   } | ||
|  | 
 | ||
|  |   if (!$pos.parent.canReplace(index, index + 1) || !(after.isTextblock || prosemirrorTransform.canJoin(state.doc, $pos.pos))) return false; | ||
|  |   if (dispatch) dispatch(state.tr.clearIncompatible($pos.pos, before.type, before.contentMatchAt(before.childCount)).join($pos.pos).scrollIntoView()); | ||
|  |   return true; | ||
|  | } | ||
|  | 
 | ||
|  | function deleteBarrier(state, $cut, dispatch) { | ||
|  |   var before = $cut.nodeBefore, | ||
|  |       after = $cut.nodeAfter, | ||
|  |       conn, | ||
|  |       match; | ||
|  |   if (before.type.spec.isolating || after.type.spec.isolating) return false; | ||
|  |   if (joinMaybeClear(state, $cut, dispatch)) return true; | ||
|  |   var canDelAfter = $cut.parent.canReplace($cut.index(), $cut.index() + 1); | ||
|  | 
 | ||
|  |   if (canDelAfter && (conn = (match = before.contentMatchAt(before.childCount)).findWrapping(after.type)) && match.matchType(conn[0] || after.type).validEnd) { | ||
|  |     if (dispatch) { | ||
|  |       var end = $cut.pos + after.nodeSize, | ||
|  |           wrap = prosemirrorModel.Fragment.empty; | ||
|  | 
 | ||
|  |       for (var i = conn.length - 1; i >= 0; i--) { | ||
|  |         wrap = prosemirrorModel.Fragment.from(conn[i].create(null, wrap)); | ||
|  |       } | ||
|  | 
 | ||
|  |       wrap = prosemirrorModel.Fragment.from(before.copy(wrap)); | ||
|  |       var tr = state.tr.step(new prosemirrorTransform.ReplaceAroundStep($cut.pos - 1, end, $cut.pos, end, new prosemirrorModel.Slice(wrap, 1, 0), conn.length, true)); | ||
|  |       var joinAt = end + 2 * conn.length; | ||
|  |       if (prosemirrorTransform.canJoin(tr.doc, joinAt)) tr.join(joinAt); | ||
|  |       dispatch(tr.scrollIntoView()); | ||
|  |     } | ||
|  | 
 | ||
|  |     return true; | ||
|  |   } | ||
|  | 
 | ||
|  |   var selAfter = prosemirrorState.Selection.findFrom($cut, 1); | ||
|  |   var range = selAfter && selAfter.$from.blockRange(selAfter.$to), | ||
|  |       target = range && prosemirrorTransform.liftTarget(range); | ||
|  | 
 | ||
|  |   if (target != null && target >= $cut.depth) { | ||
|  |     if (dispatch) dispatch(state.tr.lift(range, target).scrollIntoView()); | ||
|  |     return true; | ||
|  |   } | ||
|  | 
 | ||
|  |   if (canDelAfter && textblockAt(after, "start", true) && textblockAt(before, "end")) { | ||
|  |     var at = before, | ||
|  |         _wrap = []; | ||
|  | 
 | ||
|  |     for (;;) { | ||
|  |       _wrap.push(at); | ||
|  | 
 | ||
|  |       if (at.isTextblock) break; | ||
|  |       at = at.lastChild; | ||
|  |     } | ||
|  | 
 | ||
|  |     var afterText = after, | ||
|  |         afterDepth = 1; | ||
|  | 
 | ||
|  |     for (; !afterText.isTextblock; afterText = afterText.firstChild) { | ||
|  |       afterDepth++; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (at.canReplace(at.childCount, at.childCount, afterText.content)) { | ||
|  |       if (dispatch) { | ||
|  |         var _end = prosemirrorModel.Fragment.empty; | ||
|  | 
 | ||
|  |         for (var _i = _wrap.length - 1; _i >= 0; _i--) { | ||
|  |           _end = prosemirrorModel.Fragment.from(_wrap[_i].copy(_end)); | ||
|  |         } | ||
|  | 
 | ||
|  |         var _tr = state.tr.step(new prosemirrorTransform.ReplaceAroundStep($cut.pos - _wrap.length, $cut.pos + after.nodeSize, $cut.pos + afterDepth, $cut.pos + after.nodeSize - afterDepth, new prosemirrorModel.Slice(_end, _wrap.length, 0), 0, true)); | ||
|  | 
 | ||
|  |         dispatch(_tr.scrollIntoView()); | ||
|  |       } | ||
|  | 
 | ||
|  |       return true; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   return false; | ||
|  | } | ||
|  | 
 | ||
|  | function selectTextblockSide(side) { | ||
|  |   return function (state, dispatch) { | ||
|  |     var sel = state.selection, | ||
|  |         $pos = side < 0 ? sel.$from : sel.$to; | ||
|  |     var depth = $pos.depth; | ||
|  | 
 | ||
|  |     while ($pos.node(depth).isInline) { | ||
|  |       if (!depth) return false; | ||
|  |       depth--; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (!$pos.node(depth).isTextblock) return false; | ||
|  |     if (dispatch) dispatch(state.tr.setSelection(prosemirrorState.TextSelection.create(state.doc, side < 0 ? $pos.start(depth) : $pos.end(depth)))); | ||
|  |     return true; | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | var selectTextblockStart = selectTextblockSide(-1); | ||
|  | var selectTextblockEnd = selectTextblockSide(1); | ||
|  | 
 | ||
|  | function wrapIn(nodeType) { | ||
|  |   var attrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; | ||
|  |   return function (state, dispatch) { | ||
|  |     var _state$selection8 = state.selection, | ||
|  |         $from = _state$selection8.$from, | ||
|  |         $to = _state$selection8.$to; | ||
|  |     var range = $from.blockRange($to), | ||
|  |         wrapping = range && prosemirrorTransform.findWrapping(range, nodeType, attrs); | ||
|  |     if (!wrapping) return false; | ||
|  |     if (dispatch) dispatch(state.tr.wrap(range, wrapping).scrollIntoView()); | ||
|  |     return true; | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | function setBlockType(nodeType) { | ||
|  |   var attrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; | ||
|  |   return function (state, dispatch) { | ||
|  |     var applicable = false; | ||
|  | 
 | ||
|  |     for (var i = 0; i < state.selection.ranges.length && !applicable; i++) { | ||
|  |       var _state$selection$rang = state.selection.ranges[i], | ||
|  |           from = _state$selection$rang.$from.pos, | ||
|  |           to = _state$selection$rang.$to.pos; | ||
|  |       state.doc.nodesBetween(from, to, function (node, pos) { | ||
|  |         if (applicable) return false; | ||
|  |         if (!node.isTextblock || node.hasMarkup(nodeType, attrs)) return; | ||
|  | 
 | ||
|  |         if (node.type == nodeType) { | ||
|  |           applicable = true; | ||
|  |         } else { | ||
|  |           var $pos = state.doc.resolve(pos), | ||
|  |               index = $pos.index(); | ||
|  |           applicable = $pos.parent.canReplaceWith(index, index + 1, nodeType); | ||
|  |         } | ||
|  |       }); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (!applicable) return false; | ||
|  | 
 | ||
|  |     if (dispatch) { | ||
|  |       var tr = state.tr; | ||
|  | 
 | ||
|  |       for (var _i2 = 0; _i2 < state.selection.ranges.length; _i2++) { | ||
|  |         var _state$selection$rang2 = state.selection.ranges[_i2], | ||
|  |             _from = _state$selection$rang2.$from.pos, | ||
|  |             _to = _state$selection$rang2.$to.pos; | ||
|  |         tr.setBlockType(_from, _to, nodeType, attrs); | ||
|  |       } | ||
|  | 
 | ||
|  |       dispatch(tr.scrollIntoView()); | ||
|  |     } | ||
|  | 
 | ||
|  |     return true; | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | function markApplies(doc, ranges, type) { | ||
|  |   var _loop = function _loop(i) { | ||
|  |     var _ranges$i = ranges[i], | ||
|  |         $from = _ranges$i.$from, | ||
|  |         $to = _ranges$i.$to; | ||
|  |     var can = $from.depth == 0 ? doc.inlineContent && doc.type.allowsMarkType(type) : false; | ||
|  |     doc.nodesBetween($from.pos, $to.pos, function (node) { | ||
|  |       if (can) return false; | ||
|  |       can = node.inlineContent && node.type.allowsMarkType(type); | ||
|  |     }); | ||
|  |     if (can) return { | ||
|  |       v: true | ||
|  |     }; | ||
|  |   }; | ||
|  | 
 | ||
|  |   for (var i = 0; i < ranges.length; i++) { | ||
|  |     var _ret = _loop(i); | ||
|  | 
 | ||
|  |     if (_typeof(_ret) === "object") return _ret.v; | ||
|  |   } | ||
|  | 
 | ||
|  |   return false; | ||
|  | } | ||
|  | 
 | ||
|  | function toggleMark(markType) { | ||
|  |   var attrs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; | ||
|  |   return function (state, dispatch) { | ||
|  |     var _state$selection9 = state.selection, | ||
|  |         empty = _state$selection9.empty, | ||
|  |         $cursor = _state$selection9.$cursor, | ||
|  |         ranges = _state$selection9.ranges; | ||
|  |     if (empty && !$cursor || !markApplies(state.doc, ranges, markType)) return false; | ||
|  | 
 | ||
|  |     if (dispatch) { | ||
|  |       if ($cursor) { | ||
|  |         if (markType.isInSet(state.storedMarks || $cursor.marks())) dispatch(state.tr.removeStoredMark(markType));else dispatch(state.tr.addStoredMark(markType.create(attrs))); | ||
|  |       } else { | ||
|  |         var has = false, | ||
|  |             tr = state.tr; | ||
|  | 
 | ||
|  |         for (var i = 0; !has && i < ranges.length; i++) { | ||
|  |           var _ranges$i2 = ranges[i], | ||
|  |               $from = _ranges$i2.$from, | ||
|  |               $to = _ranges$i2.$to; | ||
|  |           has = state.doc.rangeHasMark($from.pos, $to.pos, markType); | ||
|  |         } | ||
|  | 
 | ||
|  |         for (var _i3 = 0; _i3 < ranges.length; _i3++) { | ||
|  |           var _ranges$_i = ranges[_i3], | ||
|  |               _$from = _ranges$_i.$from, | ||
|  |               _$to = _ranges$_i.$to; | ||
|  | 
 | ||
|  |           if (has) { | ||
|  |             tr.removeMark(_$from.pos, _$to.pos, markType); | ||
|  |           } else { | ||
|  |             var from = _$from.pos, | ||
|  |                 to = _$to.pos, | ||
|  |                 start = _$from.nodeAfter, | ||
|  |                 end = _$to.nodeBefore; | ||
|  |             var spaceStart = start && start.isText ? /^\s*/.exec(start.text)[0].length : 0; | ||
|  |             var spaceEnd = end && end.isText ? /\s*$/.exec(end.text)[0].length : 0; | ||
|  | 
 | ||
|  |             if (from + spaceStart < to) { | ||
|  |               from += spaceStart; | ||
|  |               to -= spaceEnd; | ||
|  |             } | ||
|  | 
 | ||
|  |             tr.addMark(from, to, markType.create(attrs)); | ||
|  |           } | ||
|  |         } | ||
|  | 
 | ||
|  |         dispatch(tr.scrollIntoView()); | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     return true; | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | function wrapDispatchForJoin(dispatch, isJoinable) { | ||
|  |   return function (tr) { | ||
|  |     if (!tr.isGeneric) return dispatch(tr); | ||
|  |     var ranges = []; | ||
|  | 
 | ||
|  |     for (var i = 0; i < tr.mapping.maps.length; i++) { | ||
|  |       var map = tr.mapping.maps[i]; | ||
|  | 
 | ||
|  |       for (var j = 0; j < ranges.length; j++) { | ||
|  |         ranges[j] = map.map(ranges[j]); | ||
|  |       } | ||
|  | 
 | ||
|  |       map.forEach(function (_s, _e, from, to) { | ||
|  |         return ranges.push(from, to); | ||
|  |       }); | ||
|  |     } | ||
|  | 
 | ||
|  |     var joinable = []; | ||
|  | 
 | ||
|  |     for (var _i4 = 0; _i4 < ranges.length; _i4 += 2) { | ||
|  |       var from = ranges[_i4], | ||
|  |           to = ranges[_i4 + 1]; | ||
|  |       var $from = tr.doc.resolve(from), | ||
|  |           depth = $from.sharedDepth(to), | ||
|  |           parent = $from.node(depth); | ||
|  | 
 | ||
|  |       for (var index = $from.indexAfter(depth), pos = $from.after(depth + 1); pos <= to; ++index) { | ||
|  |         var after = parent.maybeChild(index); | ||
|  |         if (!after) break; | ||
|  | 
 | ||
|  |         if (index && joinable.indexOf(pos) == -1) { | ||
|  |           var before = parent.child(index - 1); | ||
|  |           if (before.type == after.type && isJoinable(before, after)) joinable.push(pos); | ||
|  |         } | ||
|  | 
 | ||
|  |         pos += after.nodeSize; | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     joinable.sort(function (a, b) { | ||
|  |       return a - b; | ||
|  |     }); | ||
|  | 
 | ||
|  |     for (var _i5 = joinable.length - 1; _i5 >= 0; _i5--) { | ||
|  |       if (prosemirrorTransform.canJoin(tr.doc, joinable[_i5])) tr.join(joinable[_i5]); | ||
|  |     } | ||
|  | 
 | ||
|  |     dispatch(tr); | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | function autoJoin(command, isJoinable) { | ||
|  |   var canJoin = Array.isArray(isJoinable) ? function (node) { | ||
|  |     return isJoinable.indexOf(node.type.name) > -1; | ||
|  |   } : isJoinable; | ||
|  |   return function (state, dispatch, view) { | ||
|  |     return command(state, dispatch && wrapDispatchForJoin(dispatch, canJoin), view); | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | function chainCommands() { | ||
|  |   for (var _len = arguments.length, commands = new Array(_len), _key = 0; _key < _len; _key++) { | ||
|  |     commands[_key] = arguments[_key]; | ||
|  |   } | ||
|  | 
 | ||
|  |   return function (state, dispatch, view) { | ||
|  |     for (var i = 0; i < commands.length; i++) { | ||
|  |       if (commands[i](state, dispatch, view)) return true; | ||
|  |     } | ||
|  | 
 | ||
|  |     return false; | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | var backspace = chainCommands(deleteSelection, joinBackward, selectNodeBackward); | ||
|  | var del = chainCommands(deleteSelection, joinForward, selectNodeForward); | ||
|  | var pcBaseKeymap = { | ||
|  |   "Enter": chainCommands(newlineInCode, createParagraphNear, liftEmptyBlock, splitBlock), | ||
|  |   "Mod-Enter": exitCode, | ||
|  |   "Backspace": backspace, | ||
|  |   "Mod-Backspace": backspace, | ||
|  |   "Shift-Backspace": backspace, | ||
|  |   "Delete": del, | ||
|  |   "Mod-Delete": del, | ||
|  |   "Mod-a": selectAll | ||
|  | }; | ||
|  | var macBaseKeymap = { | ||
|  |   "Ctrl-h": pcBaseKeymap["Backspace"], | ||
|  |   "Alt-Backspace": pcBaseKeymap["Mod-Backspace"], | ||
|  |   "Ctrl-d": pcBaseKeymap["Delete"], | ||
|  |   "Ctrl-Alt-Backspace": pcBaseKeymap["Mod-Delete"], | ||
|  |   "Alt-Delete": pcBaseKeymap["Mod-Delete"], | ||
|  |   "Alt-d": pcBaseKeymap["Mod-Delete"], | ||
|  |   "Ctrl-a": selectTextblockStart, | ||
|  |   "Ctrl-e": selectTextblockEnd | ||
|  | }; | ||
|  | 
 | ||
|  | for (var key in pcBaseKeymap) { | ||
|  |   macBaseKeymap[key] = pcBaseKeymap[key]; | ||
|  | } | ||
|  | 
 | ||
|  | var mac = typeof navigator != "undefined" ? /Mac|iP(hone|[oa]d)/.test(navigator.platform) : typeof os != "undefined" && os.platform ? os.platform() == "darwin" : false; | ||
|  | var baseKeymap = mac ? macBaseKeymap : pcBaseKeymap; | ||
|  | exports.autoJoin = autoJoin; | ||
|  | exports.baseKeymap = baseKeymap; | ||
|  | exports.chainCommands = chainCommands; | ||
|  | exports.createParagraphNear = createParagraphNear; | ||
|  | exports.deleteSelection = deleteSelection; | ||
|  | exports.exitCode = exitCode; | ||
|  | exports.joinBackward = joinBackward; | ||
|  | exports.joinDown = joinDown; | ||
|  | exports.joinForward = joinForward; | ||
|  | exports.joinTextblockBackward = joinTextblockBackward; | ||
|  | exports.joinTextblockForward = joinTextblockForward; | ||
|  | exports.joinUp = joinUp; | ||
|  | exports.lift = lift; | ||
|  | exports.liftEmptyBlock = liftEmptyBlock; | ||
|  | exports.macBaseKeymap = macBaseKeymap; | ||
|  | exports.newlineInCode = newlineInCode; | ||
|  | exports.pcBaseKeymap = pcBaseKeymap; | ||
|  | exports.selectAll = selectAll; | ||
|  | exports.selectNodeBackward = selectNodeBackward; | ||
|  | exports.selectNodeForward = selectNodeForward; | ||
|  | exports.selectParentNode = selectParentNode; | ||
|  | exports.selectTextblockEnd = selectTextblockEnd; | ||
|  | exports.selectTextblockStart = selectTextblockStart; | ||
|  | exports.setBlockType = setBlockType; | ||
|  | exports.splitBlock = splitBlock; | ||
|  | exports.splitBlockAs = splitBlockAs; | ||
|  | exports.splitBlockKeepMarks = splitBlockKeepMarks; | ||
|  | exports.toggleMark = toggleMark; | ||
|  | exports.wrapIn = wrapIn; |