slate 0.47.4 → 0.47.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/slate.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"slate.js","sources":["../src/utils/key-utils.js","../src/utils/path-utils.js","../src/models/point.js","../src/models/data.js","../src/models/mark.js","../src/models/decoration.js","../src/models/selection.js","../src/utils/is-object.js","../src/models/range.js","../src/models/annotation.js","../src/models/document.js","../src/models/inline.js","../src/models/text.js","../src/models/node.js","../src/models/block.js","../src/models/value.js","../src/operations/apply.js","../src/operations/invert.js","../src/models/operation.js","../src/models/change.js","../src/plugins/commands.js","../src/utils/text-utils.js","../src/commands/at-range.js","../src/commands/by-path.js","../src/commands/on-history.js","../src/commands/on-selection.js","../src/commands/on-value.js","../src/plugins/queries.js","../src/utils/slate-error.js","../src/plugins/schema.js","../src/commands/with-intent.js","../src/plugins/core.js","../src/controllers/editor.js","../src/models/leaf.js","../src/utils/mixin.js","../src/interfaces/object.js","../src/interfaces/model.js","../src/utils/memoize.js","../src/interfaces/node.js","../../../node_modules/rollup-plugin-node-globals/src/global.js","../src/utils/identity.js","../src/interfaces/element.js","../src/interfaces/range.js","../src/index.js"],"sourcesContent":["/**\n * An auto-incrementing index for generating keys.\n *\n * @type {Number}\n */\n\nlet n\n\n/**\n * The global key generating function.\n *\n * @type {Function}\n */\n\nlet generate\n\n/**\n * Create a key, using a provided key if available.\n *\n * @param {String|Void} key\n * @return {String}\n */\n\nfunction create(key) {\n if (key == null) {\n return generate()\n }\n\n if (typeof key === 'string') {\n return key\n }\n\n throw new Error(`Keys must be strings, but you passed: ${key}`)\n}\n\n/**\n * Set a different unique ID generating `function`.\n *\n * @param {Function} func\n */\n\nfunction setGenerator(func) {\n generate = func\n}\n\n/**\n * Reset the key generating function to its initial state.\n */\n\nfunction resetGenerator() {\n n = 0\n generate = () => `${n++}`\n}\n\n/**\n * Set the initial state.\n */\n\nresetGenerator()\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default {\n create,\n setGenerator,\n resetGenerator,\n}\n","import { List } from 'immutable'\n\n/**\n * Compare paths `path` and `target` to see which is before or after.\n *\n * @param {List} path\n * @param {List} target\n * @return {Number|Null}\n */\n\nfunction compare(path, target) {\n const m = min(path, target)\n\n for (let i = 0; i < m; i++) {\n const pv = path.get(i)\n const tv = target.get(i)\n\n // If the path's value is ever less than the target's, it's before.\n if (pv < tv) return -1\n\n // If the target's value is ever less than the path's, it's after.\n if (pv > tv) return 1\n }\n\n // Paths should now be equal, otherwise something is wrong\n return path.size === target.size ? 0 : null\n}\n\n/**\n * Create a path from `attrs`.\n *\n * @param {Array|List} attrs\n * @return {List}\n */\n\nfunction create(attrs) {\n if (attrs == null) {\n return null\n }\n\n if (List.isList(attrs)) {\n return attrs\n }\n\n if (Array.isArray(attrs)) {\n return List(attrs)\n }\n\n throw new Error(\n `Paths can only be created from arrays or lists, but you passed: ${attrs}`\n )\n}\n\n/**\n * Crop paths `a` and `b` to an equal size, defaulting to the shortest.\n *\n * @param {List} a\n * @param {List} b\n */\n\nfunction crop(a, b, size = min(a, b)) {\n const ca = a.slice(0, size)\n const cb = b.slice(0, size)\n return [ca, cb]\n}\n\n/**\n * Decrement a `path` by `n` at `index`, defaulting to the last index.\n *\n * @param {List} path\n * @param {Number} n\n * @param {Number} index\n */\n\nfunction decrement(path, n = 1, index = path.size - 1) {\n return increment(path, 0 - n, index)\n}\n\n/**\n * Get all ancestor paths of th given path.\n *\n * @param {List} path\n * @returns {List}\n */\n\nfunction getAncestors(path) {\n const ancestors = List().withMutations(list => {\n for (let i = 0; i < path.size; i++) {\n list.push(path.slice(0, i))\n }\n })\n\n return ancestors\n}\n\n/**\n * Increment a `path` by `n` at `index`, defaulting to the last index.\n *\n * @param {List} path\n * @param {Number} n\n * @param {Number} index\n */\n\nfunction increment(path, n = 1, index = path.size - 1) {\n const value = path.get(index)\n const newValue = value + n\n const newPath = path.set(index, newValue)\n return newPath\n}\n\n/**\n * Is a `path` above another `target` path?\n *\n * @param {List} path\n * @param {List} target\n * @return {Boolean}\n */\n\nfunction isAbove(path, target) {\n const [p, t] = crop(path, target)\n return path.size < target.size && compare(p, t) === 0\n}\n\n/**\n * Is a `path` after another `target` path in a document?\n *\n * @param {List} path\n * @param {List} target\n * @return {Boolean}\n */\n\nfunction isAfter(path, target) {\n const [p, t] = crop(path, target)\n return compare(p, t) === 1\n}\n\n/**\n * Is a `path` before another `target` path in a document?\n *\n * @param {List} path\n * @param {List} target\n * @return {Boolean}\n */\n\nfunction isBefore(path, target) {\n const [p, t] = crop(path, target)\n return compare(p, t) === -1\n}\n\n/**\n * Is a `path` equal to another `target` path in a document?\n *\n * @param {List} path\n * @param {List} target\n * @return {Boolean}\n */\n\nfunction isEqual(path, target) {\n return path.equals(target)\n}\n\n/**\n * Is a `path` older than a `target` path? Meaning that it ends as an older\n * sibling of one of the indexes in the target.\n *\n * @param {List} path\n * @param {List} target\n * @return {Boolean}\n */\n\nfunction isOlder(path, target) {\n const index = path.size - 1\n const [p, t] = crop(path, target, index)\n const pl = path.get(index)\n const tl = target.get(index)\n return isEqual(p, t) && pl > tl\n}\n\n/**\n * Is an `any` object a path?\n *\n * @param {Mixed} any\n * @return {Boolean}\n */\n\nfunction isPath(any) {\n return (\n (List.isList(any) || Array.isArray(any)) &&\n any.every(n => typeof n === 'number')\n )\n}\n\n/**\n * Is a `path` a sibling of a `target` path?\n *\n * @param {List} path\n * @param {List} target\n * @return {Boolean}\n */\n\nfunction isSibling(path, target) {\n if (path.size !== target.size) return false\n const p = path.butLast()\n const t = target.butLast()\n return p.equals(t)\n}\n\n/**\n * Is a `path` younger than a `target` path? Meaning that it ends as a younger\n * sibling of one of the indexes in the target.\n *\n * @param {List} path\n * @param {List} target\n * @return {Boolean}\n */\n\nfunction isYounger(path, target) {\n const index = path.size - 1\n const [p, t] = crop(path, target, index)\n const pl = path.get(index)\n const tl = target.get(index)\n return isEqual(p, t) && pl < tl\n}\n\n/**\n * Lift a `path` to refer to its `n`th ancestor.\n *\n * @param {List} path\n * @return {List}\n */\n\nfunction lift(path, n = 1) {\n const ancestor = path.slice(0, -1 * n)\n return ancestor\n}\n\n/**\n * Drop a `path`, returning a relative path from a depth of `n`.\n *\n * @param {List} path\n * @param {Number} n\n * @return {List}\n */\n\nfunction drop(path, n = 1) {\n const relative = path.slice(n)\n return relative\n}\n\n/**\n * Get the maximum length of paths `a` and `b`.\n *\n * @param {List} path\n * @param {List} path\n * @return {Number}\n */\n\nfunction max(a, b) {\n const n = Math.max(a.size, b.size)\n return n\n}\n\n/**\n * Get the minimum length of paths `a` and `b`.\n *\n * @param {List} path\n * @param {List} path\n * @return {Number}\n */\n\nfunction min(a, b) {\n const n = Math.min(a.size, b.size)\n return n\n}\n\n/**\n * Get the common ancestor path of path `a` and path `b`.\n *\n * @param {List} a\n * @param {List} b\n * @return {List}\n */\n\nfunction relate(a, b) {\n const array = []\n\n for (let i = 0; i < a.size && i < b.size; i++) {\n const av = a.get(i)\n const bv = b.get(i)\n\n // If the values aren't equal, they've diverged and don't share an ancestor.\n if (av !== bv) break\n\n // Otherwise, the current value is still a common ancestor.\n array.push(av)\n }\n\n const path = create(array)\n return path\n}\n\n/**\n * Transform a `path` by an `operation`, adjusting it to stay current.\n *\n * @param {List} path\n * @param {Operation} operation\n * @return {List<List>}\n */\n\nfunction transform(path, operation) {\n const { type, position, path: p } = operation\n\n if (\n type === 'add_mark' ||\n type === 'insert_text' ||\n type === 'remove_mark' ||\n type === 'remove_text' ||\n type === 'set_mark' ||\n type === 'set_node' ||\n type === 'set_selection' ||\n type === 'set_value' ||\n path.size === 0\n ) {\n return List([path])\n }\n\n const pIndex = p.size - 1\n const pEqual = isEqual(p, path)\n const pYounger = isYounger(p, path)\n const pAbove = isAbove(p, path)\n\n if (type === 'insert_node') {\n if (pEqual || pYounger || pAbove) {\n path = increment(path, 1, pIndex)\n }\n }\n\n if (type === 'remove_node') {\n if (pYounger) {\n path = decrement(path, 1, pIndex)\n } else if (pEqual || pAbove) {\n path = []\n }\n }\n\n if (type === 'merge_node') {\n if (pEqual || pYounger) {\n path = decrement(path, 1, pIndex)\n } else if (pAbove) {\n path = decrement(path, 1, pIndex)\n path = increment(path, position, pIndex + 1)\n }\n }\n\n if (type === 'split_node') {\n if (pEqual) {\n path = [path, increment(path)]\n } else if (pYounger) {\n path = increment(path, 1, pIndex)\n } else if (pAbove) {\n if (path.get(pIndex + 1) >= position) {\n path = increment(path, 1, pIndex)\n path = decrement(path, position, pIndex + 1)\n }\n }\n }\n\n if (type === 'move_node') {\n const { newPath: np } = operation\n\n if (isEqual(p, np)) {\n return List([path])\n }\n\n if (pAbove || pEqual) {\n // We are comparing something that was moved\n // The new path is unaffected unless the old path was the left-sibling of an ancestor\n if (isYounger(p, np) && p.size < np.size) {\n path = decrement(np, 1, min(np, p) - 1).concat(path.slice(p.size))\n } else {\n path = np.concat(path.slice(p.size))\n }\n } else {\n // This is equivalent logic to remove_node for path\n if (pYounger) {\n path = decrement(path, 1, pIndex)\n }\n\n // This is the equivalent logic to insert_node for newPath\n if (isYounger(np, path) || isEqual(np, path) || isAbove(np, path)) {\n path = increment(path, 1, np.size - 1)\n }\n }\n }\n\n const paths = Array.isArray(path) ? path : [path]\n return List(paths)\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default {\n compare,\n create,\n crop,\n decrement,\n getAncestors,\n increment,\n isAbove,\n isAfter,\n isBefore,\n isEqual,\n isOlder,\n isPath,\n isSibling,\n isYounger,\n lift,\n drop,\n max,\n min,\n relate,\n transform,\n}\n","import isPlainObject from 'is-plain-object'\nimport warning from 'tiny-warning'\nimport { Record } from 'immutable'\n\nimport KeyUtils from '../utils/key-utils'\nimport PathUtils from '../utils/path-utils'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n key: undefined,\n offset: undefined,\n path: undefined,\n}\n\n/**\n * Point.\n *\n * @type {Point}\n */\n\nclass Point extends Record(DEFAULTS) {\n /**\n * Create a new `Point` with `attrs`.\n *\n * @param {Object|Point} attrs\n * @return {Point}\n */\n\n static create(attrs = {}) {\n if (Point.isPoint(attrs)) {\n return attrs\n }\n\n if (isPlainObject(attrs)) {\n return Point.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Point.create\\` only accepts objects or points, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a dictionary of settable point properties from `attrs`.\n *\n * @param {Object|Point} attrs\n * @return {Object}\n */\n\n static createProperties(a = {}) {\n if (Point.isPoint(a)) {\n return {\n key: a.key,\n offset: a.offset,\n path: a.path,\n }\n }\n\n if (isPlainObject(a)) {\n const p = {}\n if ('key' in a) p.key = a.key\n if ('offset' in a) p.offset = a.offset\n if ('path' in a) p.path = PathUtils.create(a.path)\n\n // If only a path is set, or only a key is set, ensure that the other is\n // set to null so that it can be normalized back to the right value.\n // Otherwise we won't realize that the path and key don't match anymore.\n if ('path' in a && !('key' in a)) p.key = null\n if ('key' in a && !('path' in a)) p.path = null\n\n return p\n }\n\n throw new Error(\n `\\`Point.createProperties\\` only accepts objects or points, but you passed it: ${a}`\n )\n }\n\n /**\n * Create a `Point` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Point}\n */\n\n static fromJSON(object) {\n const { key = null, offset = null, path = null } = object\n\n const point = new Point({\n key,\n offset,\n path: PathUtils.create(path),\n })\n\n return point\n }\n\n /**\n * Check whether all properties of the point are set.\n *\n * @return {Boolean}\n */\n\n get isSet() {\n return this.key != null && this.offset != null && this.path != null\n }\n\n /**\n * Check whether any property of the point is not set.\n *\n * @return {Boolean}\n */\n\n get isUnset() {\n return !this.isSet\n }\n\n /**\n * Check whether the point is after another `point`.\n *\n * @return {Boolean}\n */\n\n isAfterPoint(point) {\n if (this.isUnset) return false\n const is =\n (this.key === point.key && this.offset > point.offset) ||\n PathUtils.compare(this.path, point.path) === 1\n return is\n }\n\n /**\n * Check whether the point is after a `range`.\n *\n * @return {Boolean}\n */\n\n isAfterRange(range) {\n if (this.isUnset) return false\n const is = this.isAfterPoint(range.end)\n return is\n }\n\n /**\n * Check whether the point is at the end of a `range`.\n *\n * @return {Boolean}\n */\n\n isAtEndOfRange(range) {\n if (this.isUnset) return false\n const is = this.equals(range.end)\n return is\n }\n\n /**\n * Check whether the point is at the start of a `range`.\n *\n * @return {Boolean}\n */\n\n isAtStartOfRange(range) {\n if (this.isUnset) return false\n const is = this.equals(range.start)\n return is\n }\n\n /**\n * Check whether the point is before another `point`.\n *\n * @return {Boolean}\n */\n\n isBeforePoint(point) {\n if (this.isUnset) return false\n const is =\n (this.key === point.key && this.offset < point.offset) ||\n PathUtils.compare(this.path, point.path) === -1\n return is\n }\n\n /**\n * Check whether the point is before a `range`.\n *\n * @return {Boolean}\n */\n\n isBeforeRange(range) {\n if (this.isUnset) return false\n const is = this.isBeforePoint(range.start)\n return is\n }\n\n /**\n * Check whether the point is inside a `range`.\n *\n * @return {Boolean}\n */\n\n isInRange(range) {\n if (this.isUnset) return false\n const is =\n this.equals(range.start) ||\n this.equals(range.end) ||\n (this.isAfterPoint(range.start) && this.isBeforePoint(range.end))\n return is\n }\n\n /**\n * Check whether the point is at the end of a `node`.\n *\n * @param {Node} node\n * @return {Boolean}\n */\n\n isAtEndOfNode(node) {\n if (this.isUnset) return false\n const last = node.getLastText()\n const is = this.key === last.key && this.offset === last.text.length\n return is\n }\n\n /**\n * Check whether the point is at the start of a `node`.\n *\n * @param {Node} node\n * @return {Boolean}\n */\n\n isAtStartOfNode(node) {\n if (this.isUnset) return false\n\n // PERF: Do a check for a `0` offset first since it's quickest.\n if (this.offset !== 0) return false\n\n const first = node.getFirstText()\n const is = this.key === first.key\n return is\n }\n\n /**\n * Check whether the point is in a `node`.\n *\n * @param {Node} node\n * @return {Boolean}\n */\n\n isInNode(node) {\n if (this.isUnset) return false\n if (node.object === 'text' && node.key === this.key) return true\n if (node.hasNode(this.key)) return true\n return false\n }\n\n /**\n * Move the point's offset backward `n` characters.\n *\n * @param {Number} n (optional)\n * @return {Point}\n */\n\n moveBackward(n = 1) {\n if (n === 0) return this\n if (n < 0) return this.moveForward(-n)\n const point = this.setOffset(this.offset - n)\n return point\n }\n\n /**\n * Move the point's offset forward `n` characters.\n *\n * @param {Number} n (optional)\n * @return {Point}\n */\n\n moveForward(n = 1) {\n if (n === 0) return this\n if (n < 0) return this.moveBackward(-n)\n const point = this.setOffset(this.offset + n)\n return point\n }\n\n /**\n * Move the point's anchor point to a new `path` and `offset`.\n *\n * Optionally, the `path` can be a key string, or omitted entirely in which\n * case it would be the offset number.\n *\n * @param {List|String|Number} path\n * @param {Number} offset\n * @return {Point}\n */\n\n moveTo(path, offset = 0) {\n let key = this.key\n\n if (typeof path === 'number') {\n offset = path\n path = this.path\n } else if (typeof path === 'string') {\n key = path\n path = key === this.key ? this.path : null\n } else {\n key = path.equals(this.path) ? this.key : null\n }\n\n const point = this.merge({ key, path, offset })\n return point\n }\n\n /**\n * Move the point's anchor point to the start of a `node`.\n *\n * @param {Node} node\n * @return {Point}\n */\n\n moveToStartOfNode(node) {\n const first = node.getFirstText()\n const point = this.moveTo(first.key, 0)\n return point\n }\n\n /**\n * Move the point's anchor point to the end of a `node`.\n *\n * @param {Node} node\n * @return {Point}\n */\n\n moveToEndOfNode(node) {\n const last = node.getLastText()\n const point = this.moveTo(last.key, last.text.length)\n return point\n }\n\n /**\n * Normalize the point relative to a `node`, ensuring that its key and path\n * reference a text node, or that it gets unset.\n *\n * @param {Node} node\n * @return {Point}\n */\n\n normalize(node) {\n // If both the key and path are null, there's no reference to a node, so\n // make sure it is entirely unset.\n if (this.key == null && this.path == null) {\n return this.setOffset(null)\n }\n\n const { key, offset, path } = this\n\n // PERF: this function gets called a lot.\n // to avoid creating the key -> path lookup table, we attempt to look up by path first.\n let target = path && node.getNode(path)\n\n if (!target) {\n target = node.getNode(key)\n\n if (target) {\n // There is a misalignment of path and key\n const point = this.merge({\n path: node.getPath(key),\n })\n\n return point\n }\n }\n\n if (!target) {\n warning(false, \"A point's `path` or `key` invalid and was reset!\")\n\n const text = node.getFirstText()\n if (!text) return Point.create()\n\n const point = this.merge({\n key: text.key,\n offset: 0,\n path: node.getPath(text.key),\n })\n\n return point\n }\n\n if (target.object !== 'text') {\n warning(false, 'A point should not reference a non-text node!')\n\n const text = target.getTextAtOffset(offset)\n const before = target.getOffset(text.key)\n const point = this.merge({\n offset: offset - before,\n key: text.key,\n path: node.getPath(text.key),\n })\n\n return point\n }\n\n if (target && path && key && key !== target.key) {\n warning(false, \"A point's `key` did not match its `path`!\")\n\n // TODO: if we look up by path above and it differs by key, do we want to reset it to looking up by key?\n }\n\n let point = this.merge({\n key: target.key,\n path: path == null ? node.getPath(target.key) : path,\n offset: offset == null ? 0 : Math.min(offset, target.text.length),\n })\n\n // COMPAT: There is an ambiguity, since a point can exist at the end of a\n // text node, or at the start of the following one. To eliminate it we\n // enforce that if there is a following text node, we always move it there.\n if (point.offset === target.text.length) {\n const block = node.getClosestBlock(point.path)\n // TODO: this next line is broken because `getNextText` takes a path\n const next = block.getNextText()\n\n if (next) {\n point = point.merge({\n key: next.key,\n path: node.getPath(next.key),\n offset: 0,\n })\n }\n }\n\n return point\n }\n\n /**\n * Set the point's key to a new `key`.\n *\n * @param {String} key\n * @return {Point}\n */\n\n setKey(key) {\n if (key != null) {\n key = KeyUtils.create(key)\n }\n\n const point = this.set('key', key)\n return point\n }\n\n /**\n * Set the point's offset to a new `offset`.\n *\n * @param {Number} offset\n * @return {Point}\n */\n\n setOffset(offset) {\n const point = this.set('offset', offset)\n return point\n }\n\n /**\n * Set the point's path to a new `path`.\n *\n * @param {List|Array} path\n * @return {Point}\n */\n\n setPath(path) {\n if (path != null) {\n path = PathUtils.create(path)\n }\n\n const point = this.set('path', path)\n return point\n }\n\n /**\n * Return a JSON representation of the point.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n key: this.key,\n offset: this.offset,\n path: this.path && this.path.toArray(),\n }\n\n if (!options.preserveKeys) {\n delete object.key\n }\n\n return object\n }\n\n /**\n * Unset the point.\n *\n * @return {Point}\n */\n\n unset() {\n return this.merge({\n key: null,\n offset: null,\n path: null,\n })\n }\n}\n\n/**\n * Export.\n *\n * @type {Point}\n */\n\nexport default Point\n","import isPlainObject from 'is-plain-object'\nimport { Map } from 'immutable'\n\n/**\n * Data.\n *\n * This isn't an immutable record, it's just a thin wrapper around `Map` so that\n * we can allow for more convenient creation.\n *\n * @type {Object}\n */\n\nclass Data {\n /**\n * Create a new `Data` with `attrs`.\n *\n * @param {Object|Data|Map} attrs\n * @return {Data} data\n */\n\n static create(attrs = {}) {\n if (Map.isMap(attrs)) {\n return attrs\n }\n\n if (isPlainObject(attrs)) {\n return Data.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Data.create\\` only accepts objects or maps, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a `Data` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Data}\n */\n\n static fromJSON(object) {\n return new Map(object)\n }\n\n /**\n * Alias `fromJS`.\n */\n\n static fromJS = Data.fromJSON\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default Data\n","import isPlainObject from 'is-plain-object'\nimport { Map, Record, Set } from 'immutable'\n\nimport Data from './data'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n data: undefined,\n type: undefined,\n}\n\n/**\n * Mark.\n *\n * @type {Mark}\n */\n\nclass Mark extends Record(DEFAULTS) {\n /**\n * Create a new `Mark` with `attrs`.\n *\n * @param {Object|Mark} attrs\n * @return {Mark}\n */\n\n static create(attrs = {}) {\n if (Mark.isMark(attrs)) {\n return attrs\n }\n\n if (typeof attrs === 'string') {\n attrs = { type: attrs }\n }\n\n if (isPlainObject(attrs)) {\n return Mark.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Mark.create\\` only accepts objects, strings or marks, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a set of marks.\n *\n * @param {Array<Object|Mark>} elements\n * @return {Set<Mark>}\n */\n\n static createSet(elements) {\n if (Set.isSet(elements) || Array.isArray(elements)) {\n const marks = new Set(elements.map(Mark.create))\n return marks\n }\n\n if (elements == null) {\n return Set()\n }\n\n throw new Error(\n `\\`Mark.createSet\\` only accepts sets, arrays or null, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a dictionary of settable mark properties from `attrs`.\n *\n * @param {Object|String|Mark} attrs\n * @return {Object}\n */\n\n static createProperties(attrs = {}) {\n if (Mark.isMark(attrs)) {\n return {\n data: attrs.data,\n type: attrs.type,\n }\n }\n\n if (typeof attrs === 'string') {\n return { type: attrs }\n }\n\n if (isPlainObject(attrs)) {\n const props = {}\n if ('type' in attrs) props.type = attrs.type\n if ('data' in attrs) props.data = Data.create(attrs.data)\n return props\n }\n\n throw new Error(\n `\\`Mark.createProperties\\` only accepts objects, strings or marks, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a `Mark` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Mark}\n */\n\n static fromJSON(object) {\n const { data = {}, type } = object\n\n if (typeof type !== 'string') {\n throw new Error('`Mark.fromJS` requires a `type` string.')\n }\n\n const mark = new Mark({\n type,\n data: new Map(data),\n })\n\n return mark\n }\n\n /**\n * Check if `any` is a set of marks.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isMarkSet(any) {\n return Set.isSet(any) && any.every(item => Mark.isMark(item))\n }\n\n /**\n * Return a JSON representation of the mark.\n *\n * @return {Object}\n */\n\n toJSON() {\n const object = {\n object: this.object,\n type: this.type,\n data: this.data.toJSON(),\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Mark}\n */\n\nexport default Mark\n","import isPlainObject from 'is-plain-object'\nimport warning from 'tiny-warning'\nimport { List, Record } from 'immutable'\n\nimport Mark from './mark'\nimport Point from './point'\nimport Data from './data'\nimport Range from './range'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n type: undefined,\n data: undefined,\n anchor: undefined,\n focus: undefined,\n}\n\n/**\n * Decoration.\n *\n * @type {Decoration}\n */\n\nclass Decoration extends Record(DEFAULTS) {\n /**\n * Create a new `Decoration` with `attrs`.\n *\n * @param {Object|Decoration} attrs\n * @return {Decoration}\n */\n\n static create(attrs = {}) {\n if (Decoration.isDecoration(attrs)) {\n return attrs\n }\n\n if (Range.isRange(attrs)) {\n return Decoration.fromJSON(Range.createProperties(attrs))\n }\n\n if (isPlainObject(attrs)) {\n return Decoration.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Decoration.create\\` only accepts objects or decorations, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a list of `Ranges` from `elements`.\n *\n * @param {Array<Decoration|Object>|List<Decoration|Object>} elements\n * @return {List<Decoration>}\n */\n\n static createList(elements = []) {\n if (List.isList(elements) || Array.isArray(elements)) {\n const list = new List(elements.map(Decoration.create))\n return list\n }\n\n throw new Error(\n `\\`Decoration.createList\\` only accepts arrays or lists, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a dictionary of settable decoration properties from `attrs`.\n *\n * @param {Object|String|Decoration} attrs\n * @return {Object}\n */\n\n static createProperties(a = {}) {\n if (Decoration.isDecoration(a)) {\n return {\n type: a.type,\n data: a.data,\n anchor: Point.createProperties(a.anchor),\n focus: Point.createProperties(a.focus),\n mark: Mark.create(a.mark),\n }\n }\n\n if (isPlainObject(a)) {\n const p = {}\n if ('type' in a) p.type = a.type\n if ('data' in a) p.data = Data.create(a.data)\n if ('anchor' in a) p.anchor = Point.create(a.anchor)\n if ('focus' in a) p.focus = Point.create(a.focus)\n return p\n }\n\n throw new Error(\n `\\`Decoration.createProperties\\` only accepts objects or decorations, but you passed it: ${a}`\n )\n }\n\n /**\n * Create a `Decoration` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Decoration}\n */\n\n static fromJSON(object) {\n const { anchor, focus } = object\n let { type, data } = object\n\n if (object.mark && !type) {\n warning(\n false,\n 'As of slate@0.47 the `decoration.mark` property has been changed to `decoration.type` and `decoration.data` directly.'\n )\n\n type = object.mark.type\n data = object.mark.data\n }\n\n if (!type) {\n throw new Error(\n `Decorations must be created with a \\`type\\`, but you passed: ${JSON.stringify(\n object\n )}`\n )\n }\n\n const decoration = new Decoration({\n type,\n data: Data.create(data || {}),\n anchor: Point.fromJSON(anchor || {}),\n focus: Point.fromJSON(focus || {}),\n })\n\n return decoration\n }\n\n /**\n * Set new `properties` on the decoration.\n *\n * @param {Object|Range|Selection} properties\n * @return {Range}\n */\n\n setProperties(properties) {\n properties = Decoration.createProperties(properties)\n const decoration = this.merge(properties)\n return decoration\n }\n\n /**\n * Return a JSON representation of the decoration.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n type: this.type,\n data: this.data.toJSON(),\n anchor: this.anchor.toJSON(options),\n focus: this.focus.toJSON(options),\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Decoration}\n */\n\nexport default Decoration\n","import isPlainObject from 'is-plain-object'\nimport { Record, Set } from 'immutable'\n\nimport Mark from './mark'\nimport Point from './point'\nimport Range from './range'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n anchor: undefined,\n focus: undefined,\n isFocused: undefined,\n marks: undefined,\n}\n\n/**\n * Selection.\n *\n * @type {Selection}\n */\n\nclass Selection extends Record(DEFAULTS) {\n /**\n * Create a new `Selection` with `attrs`.\n *\n * @param {Object|Selection} attrs\n * @return {Selection}\n */\n\n static create(attrs = {}) {\n if (Selection.isSelection(attrs)) {\n return attrs\n }\n\n if (Range.isRange(attrs)) {\n return Selection.fromJSON(Range.createProperties(attrs))\n }\n\n if (isPlainObject(attrs)) {\n return Selection.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Selection.create\\` only accepts objects, ranges or selections, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a dictionary of settable selection properties from `attrs`.\n *\n * @param {Object|String|Selection} attrs\n * @return {Object}\n */\n\n static createProperties(a = {}) {\n if (Selection.isSelection(a)) {\n return {\n anchor: Point.createProperties(a.anchor),\n focus: Point.createProperties(a.focus),\n isFocused: a.isFocused,\n marks: a.marks,\n }\n }\n\n if (Range.isRange(a)) {\n return {\n anchor: Point.createProperties(a.anchor),\n focus: Point.createProperties(a.focus),\n }\n }\n\n if (isPlainObject(a)) {\n const p = {}\n if ('anchor' in a) p.anchor = Point.create(a.anchor)\n if ('focus' in a) p.focus = Point.create(a.focus)\n if ('isFocused' in a) p.isFocused = a.isFocused\n if ('marks' in a)\n p.marks = a.marks == null ? null : Mark.createSet(a.marks)\n return p\n }\n\n throw new Error(\n `\\`Selection.createProperties\\` only accepts objects, ranges or selections, but you passed it: ${a}`\n )\n }\n\n /**\n * Create a `Selection` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Selection}\n */\n\n static fromJSON(object) {\n const { anchor, focus, isFocused = false, marks = null } = object\n const selection = new Selection({\n anchor: Point.fromJSON(anchor || {}),\n focus: Point.fromJSON(focus || {}),\n isFocused,\n marks: marks == null ? null : new Set(marks.map(Mark.fromJSON)),\n })\n\n return selection\n }\n\n /**\n * Check whether the selection is blurred.\n *\n * @return {Boolean}\n */\n\n get isBlurred() {\n return !this.isFocused\n }\n\n /**\n * Set the `isFocused` property to a new `value`.\n *\n * @param {Boolean} value\n * @return {Selection}\n */\n\n setIsFocused(value) {\n const selection = this.set('isFocused', value)\n return selection\n }\n\n /**\n * Set the `marks` property to a new set of `marks`.\n *\n * @param {Set} marks\n * @return {Selection}\n */\n\n setMarks(marks) {\n const selection = this.set('marks', marks)\n return selection\n }\n\n /**\n * Set new `properties` on the selection.\n *\n * @param {Object|Range|Selection} properties\n * @return {Range}\n */\n\n setProperties(properties) {\n properties = Selection.createProperties(properties)\n const { anchor, focus, ...props } = properties\n\n if (anchor) {\n props.anchor = Point.create(anchor)\n }\n\n if (focus) {\n props.focus = Point.create(focus)\n }\n\n const selection = this.merge(props)\n return selection\n }\n\n /**\n * Return a JSON representation of the selection.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n anchor: this.anchor.toJSON(options),\n focus: this.focus.toJSON(options),\n isFocused: this.isFocused,\n marks:\n this.marks == null ? null : this.marks.toArray().map(m => m.toJSON()),\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Selection}\n */\n\nexport default Selection\n","/**\n * Slate-specific object types.\n *\n * @type {Object}\n */\n\nexport const TYPES = {\n annotation: '@@__SLATE_ANNOTATION__@@',\n block: '@@__SLATE_BLOCK__@@',\n change: '@@__SLATE_CHANGE__@@',\n decoration: '@@__SLATE_DECORATION__@@',\n document: '@@__SLATE_DOCUMENT__@@',\n editor: '@@__SLATE_EDITOR__@@',\n inline: '@@__SLATE_INLINE__@@',\n leaf: '@@__SLATE_LEAF__@@',\n mark: '@@__SLATE_MARK__@@',\n operation: '@@__SLATE_OPERATION__@@',\n point: '@@__SLATE_POINT__@@',\n range: '@@__SLATE_RANGE__@@',\n selection: '@@__SLATE_SELECTION__@@',\n text: '@@__SLATE_TEXT__@@',\n value: '@@__SLATE_VALUE__@@',\n}\n\n/**\n * Determine whether a `value` is of `type`.\n *\n * @param {string} type\n * @param {any} value\n * @return {boolean}\n */\n\nexport default function isObject(type, value) {\n return !!(value && value[TYPES[type]])\n}\n","import isPlainObject from 'is-plain-object'\nimport { List, Record } from 'immutable'\n\nimport Decoration from './decoration'\nimport Point from './point'\nimport Selection from './selection'\nimport isObject from '../utils/is-object'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n anchor: undefined,\n focus: undefined,\n}\n\n/**\n * Range.\n *\n * @type {Range}\n */\n\nclass Range extends Record(DEFAULTS) {\n /**\n * Create a new `Range` with `attrs`.\n *\n * @param {Object|Range} attrs\n * @return {Range}\n */\n\n static create(attrs = {}) {\n if (Range.isRange(attrs)) {\n if (attrs.object === 'range') {\n return attrs\n } else {\n return Range.fromJSON(Range.createProperties(attrs))\n }\n }\n\n if (isPlainObject(attrs)) {\n return Range.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Range.create\\` only accepts objects or ranges, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a list of `Ranges` from `elements`.\n *\n * @param {Array<Range|Object>|List<Range|Object>} elements\n * @return {List<Range>}\n */\n\n static createList(elements = []) {\n if (List.isList(elements) || Array.isArray(elements)) {\n const list = new List(elements.map(Range.create))\n return list\n }\n\n throw new Error(\n `\\`Range.createList\\` only accepts arrays or lists, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a dictionary of settable range properties from `attrs`.\n *\n * @param {Object|String|Range} attrs\n * @return {Object}\n */\n\n static createProperties(a = {}) {\n if (Range.isRange(a)) {\n return {\n anchor: Point.createProperties(a.anchor),\n focus: Point.createProperties(a.focus),\n }\n }\n\n if (isPlainObject(a)) {\n const p = {}\n if ('anchor' in a) p.anchor = Point.create(a.anchor)\n if ('focus' in a) p.focus = Point.create(a.focus)\n return p\n }\n\n throw new Error(\n `\\`Range.createProperties\\` only accepts objects, annotations, decorations, ranges or selections, but you passed it: ${a}`\n )\n }\n\n /**\n * Create a `Range` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Range}\n */\n\n static fromJSON(object) {\n const { anchor, focus } = object\n const range = new Range({\n anchor: Point.fromJSON(anchor || {}),\n focus: Point.fromJSON(focus || {}),\n })\n\n return range\n }\n\n /**\n * Check if a `value` is a `Range`, or is range-like.\n *\n * @param {Any} value\n * @return {Boolean}\n */\n\n static isRange(value) {\n return (\n isObject('range', value) ||\n Decoration.isDecoration(value) ||\n Selection.isSelection(value)\n )\n }\n\n /**\n * Return a JSON representation of the range.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n anchor: this.anchor.toJSON(options),\n focus: this.focus.toJSON(options),\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Range}\n */\n\nexport default Range\n","import isPlainObject from 'is-plain-object'\nimport { Map, Record } from 'immutable'\n\nimport Point from './point'\nimport Range from './range'\nimport Data from './data'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n key: undefined,\n type: undefined,\n data: undefined,\n anchor: undefined,\n focus: undefined,\n}\n\n/**\n * Annotation.\n *\n * @type {Annotation}\n */\n\nclass Annotation extends Record(DEFAULTS) {\n /**\n * Create a new `Annotation` with `attrs`.\n *\n * @param {Object|Annotation} attrs\n * @return {Annotation}\n */\n\n static create(attrs = {}) {\n if (Annotation.isAnnotation(attrs)) {\n return attrs\n }\n\n if (Range.isRange(attrs)) {\n return Annotation.fromJSON(Range.createProperties(attrs))\n }\n\n if (isPlainObject(attrs)) {\n return Annotation.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Annotation.create\\` only accepts objects or annotations, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a map of annotations from `elements`.\n *\n * @param {Object<String,Annotation>|Map<String,Annotation>} elements\n * @return {Map<String,Annotation>}\n */\n\n static createMap(elements = []) {\n if (Map.isMap(elements)) {\n return elements\n }\n\n if (isPlainObject(elements)) {\n const obj = {}\n\n for (const key in elements) {\n const value = elements[key]\n const annotation = Annotation.create(value)\n obj[key] = annotation\n }\n\n return Map(obj)\n }\n\n throw new Error(\n `\\`Annotation.createMap\\` only accepts arrays or lists, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a dictionary of settable annotation properties from `attrs`.\n *\n * @param {Object|String|Annotation} attrs\n * @return {Object}\n */\n\n static createProperties(a = {}) {\n if (Annotation.isAnnotation(a)) {\n return {\n key: a.key,\n type: a.type,\n data: a.data,\n anchor: Point.createProperties(a.anchor),\n focus: Point.createProperties(a.focus),\n }\n }\n\n if (isPlainObject(a)) {\n const p = {}\n if ('key' in a) p.key = a.key\n if ('type' in a) p.type = a.type\n if ('data' in a) p.data = Data.create(a.data)\n if ('anchor' in a) p.anchor = Point.create(a.anchor)\n if ('focus' in a) p.focus = Point.create(a.focus)\n return p\n }\n\n throw new Error(\n `\\`Annotation.createProperties\\` only accepts objects or annotations, but you passed it: ${a}`\n )\n }\n\n /**\n * Create a `Annotation` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Annotation}\n */\n\n static fromJSON(object) {\n const { key, type, data, anchor, focus } = object\n\n if (!key) {\n throw new Error(\n `Annotations must be created with a \\`key\\`, but you passed: ${JSON.stringify(\n object\n )}`\n )\n }\n\n if (!type) {\n throw new Error(\n `Annotations must be created with a \\`type\\`, but you passed: ${JSON.stringify(\n object\n )}`\n )\n }\n\n const annotation = new Annotation({\n key,\n type,\n data: Data.create(data || {}),\n anchor: Point.fromJSON(anchor || {}),\n focus: Point.fromJSON(focus || {}),\n })\n\n return annotation\n }\n\n /**\n * Set new `properties` on the annotation.\n *\n * @param {Object|Range|Selection} properties\n * @return {Range}\n */\n\n setProperties(properties) {\n properties = Annotation.createProperties(properties)\n const annotation = this.merge(properties)\n return annotation\n }\n\n /**\n * Return a JSON representation of the annotation.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n key: this.key,\n type: this.type,\n data: this.data.toJSON(),\n anchor: this.anchor.toJSON(options),\n focus: this.focus.toJSON(options),\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Annotation}\n */\n\nexport default Annotation\n","import isPlainObject from 'is-plain-object'\nimport { List, Map, Record } from 'immutable'\n\nimport KeyUtils from '../utils/key-utils'\nimport Node from './node'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n data: undefined,\n key: undefined,\n nodes: undefined,\n}\n\n/**\n * Document.\n *\n * @type {Document}\n */\n\nclass Document extends Record(DEFAULTS) {\n /**\n * Create a new `Document` with `attrs`.\n *\n * @param {Object|Array|List|Text} attrs\n * @return {Document}\n */\n\n static create(attrs = {}) {\n if (Document.isDocument(attrs)) {\n return attrs\n }\n\n if (List.isList(attrs) || Array.isArray(attrs)) {\n attrs = { nodes: attrs }\n }\n\n if (isPlainObject(attrs)) {\n return Document.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Document.create\\` only accepts objects, arrays, lists or documents, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a `Document` from a JSON `object`.\n *\n * @param {Object|Document} object\n * @return {Document}\n */\n\n static fromJSON(object) {\n if (Document.isDocument(object)) {\n return object\n }\n\n const { data = {}, key = KeyUtils.create(), nodes = [] } = object\n\n const document = new Document({\n key,\n data: new Map(data),\n nodes: Node.createList(nodes),\n })\n\n return document\n }\n\n /**\n * Return a JSON representation of the document.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n data: this.data.toJSON(),\n nodes: this.nodes.toArray().map(n => n.toJSON(options)),\n }\n\n if (options.preserveKeys) {\n object.key = this.key\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Document}\n */\n\nexport default Document\n","import isPlainObject from 'is-plain-object'\nimport { List, Map, Record } from 'immutable'\n\nimport KeyUtils from '../utils/key-utils'\nimport Node from './node'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n data: undefined,\n key: undefined,\n nodes: undefined,\n type: undefined,\n}\n\n/**\n * Inline.\n *\n * @type {Inline}\n */\n\nclass Inline extends Record(DEFAULTS) {\n /**\n * Create a new `Inline` with `attrs`.\n *\n * @param {Object|String|Inline} attrs\n * @return {Inline}\n */\n\n static create(attrs = {}) {\n if (Inline.isInline(attrs)) {\n return attrs\n }\n\n if (typeof attrs === 'string') {\n attrs = { type: attrs }\n }\n\n if (isPlainObject(attrs)) {\n return Inline.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Inline.create\\` only accepts objects, strings or inlines, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a list of `Inlines` from an array.\n *\n * @param {Array<Inline|Object>|List<Inline|Object>} elements\n * @return {List<Inline>}\n */\n\n static createList(elements = []) {\n if (List.isList(elements) || Array.isArray(elements)) {\n const list = new List(elements.map(Inline.create))\n return list\n }\n\n throw new Error(\n `\\`Inline.createList\\` only accepts arrays or lists, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a `Inline` from a JSON `object`.\n *\n * @param {Object|Inline} object\n * @return {Inline}\n */\n\n static fromJSON(object) {\n if (Inline.isInline(object)) {\n return object\n }\n\n const { data = {}, key = KeyUtils.create(), nodes = [], type } = object\n\n if (typeof type !== 'string') {\n throw new Error('`Inline.fromJS` requires a `type` string.')\n }\n\n const inline = new Inline({\n key,\n type,\n data: new Map(data),\n nodes: Node.createList(nodes),\n })\n\n return inline\n }\n\n /**\n * Check if `any` is a list of inlines.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isInlineList(any) {\n return List.isList(any) && any.every(item => Inline.isInline(item))\n }\n\n /**\n * Return a JSON representation of the inline.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n type: this.type,\n data: this.data.toJSON(),\n nodes: this.nodes.toArray().map(n => n.toJSON(options)),\n }\n\n if (options.preserveKeys) {\n object.key = this.key\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Inline}\n */\n\nexport default Inline\n","import isPlainObject from 'is-plain-object'\nimport invariant from 'tiny-invariant'\nimport { List, Record } from 'immutable'\n\nimport Mark from './mark'\nimport KeyUtils from '../utils/key-utils'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n key: undefined,\n marks: undefined,\n text: undefined,\n}\n\nconst Leaf = Record({\n text: undefined,\n marks: undefined,\n annotations: undefined,\n decorations: undefined,\n})\n\n/**\n * Text.\n *\n * @type {Text}\n */\n\nclass Text extends Record(DEFAULTS) {\n /**\n * Create a new `Text` with `attrs`.\n *\n * @param {Object|Array|List|String|Text} attrs\n * @return {Text}\n */\n\n static create(attrs = '') {\n if (Text.isText(attrs)) {\n return attrs\n }\n\n if (typeof attrs === 'string') {\n attrs = { text: attrs }\n }\n\n if (isPlainObject(attrs)) {\n return Text.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Text.create\\` only accepts objects, arrays, strings or texts, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a list of `Texts` from `elements`.\n *\n * @param {Array<Text|Object>|List<Text|Object>} elements\n * @return {List<Text>}\n */\n\n static createList(elements = []) {\n if (List.isList(elements) || Array.isArray(elements)) {\n const list = new List(elements.map(Text.create))\n return list\n }\n\n throw new Error(\n `\\`Text.createList\\` only accepts arrays or lists, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a `Text` from a JSON `object`.\n *\n * @param {Object|Text} object\n * @return {Text}\n */\n\n static fromJSON(object) {\n if (Text.isText(object)) {\n return object\n }\n\n invariant(\n object.leaves == null,\n 'As of slate@0.46, the `leaves` property of text nodes has been removed! Each individual leaf should be created as a text node instead.'\n )\n\n const { text = '', marks = [], key = KeyUtils.create() } = object\n const node = new Text({\n key,\n text,\n marks: Mark.createSet(marks),\n })\n\n return node\n }\n\n /**\n * Check if `any` is a list of texts.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isTextList(any) {\n return List.isList(any) && any.every(item => Text.isText(item))\n }\n\n /**\n * Add a `mark`.\n *\n * @param {Mark} mark\n * @return {Text}\n */\n\n addMark(mark) {\n mark = Mark.create(mark)\n const { marks } = this\n const next = marks.add(mark)\n const node = this.set('marks', next)\n return node\n }\n\n /**\n * Add a set of `marks`.\n *\n * @param {Set<Mark>} marks\n * @return {Text}\n */\n\n addMarks(marks) {\n marks = Mark.createSet(marks)\n const node = this.set('marks', this.marks.union(marks))\n return node\n }\n\n /**\n * Get a list of uniquely-formatted leaves for the text node, given its\n * existing marks, and its current `annotations` and `decorations`.\n *\n * @param {Map<String,Annotation>} annotations\n * @param {List<Decoration>} decorations\n * @return {List<Leaf>}\n */\n\n getLeaves(annotations, decorations) {\n const { text, marks } = this\n let leaves = [{ text, marks, annotations: [], decorations: [] }]\n\n // Helper to split a leaf into two `at` an offset.\n const split = (leaf, at) => {\n return [\n {\n text: leaf.text.slice(0, at),\n marks: leaf.marks,\n annotations: [...leaf.annotations],\n decorations: [...leaf.decorations],\n },\n {\n text: leaf.text.slice(at),\n marks: leaf.marks,\n annotations: [...leaf.annotations],\n decorations: [...leaf.decorations],\n },\n ]\n }\n\n // Helper to compile the leaves for a `kind` of format.\n const compile = kind => {\n const formats =\n kind === 'annotations' ? annotations.values() : decorations\n\n for (const format of formats) {\n const { start, end } = format\n const next = []\n let o = 0\n\n for (const leaf of leaves) {\n const { length } = leaf.text\n const offset = o\n o += length\n\n // If the range encompases the entire leaf, add the format.\n if (start.offset <= offset && end.offset >= offset + length) {\n leaf[kind].push(format)\n next.push(leaf)\n continue\n }\n\n // If the range starts after the leaf, or ends before it, continue.\n if (start.offset > offset + length || end.offset <= offset) {\n next.push(leaf)\n continue\n }\n\n // Otherwise we need to split the leaf, at the start, end, or both,\n // and add the format to the middle intersecting section. Do the end\n // split first since we don't need to update the offset that way.\n let middle = leaf\n let before\n let after\n\n if (end.offset < offset + length) {\n ;[middle, after] = split(middle, end.offset - offset)\n }\n\n if (start.offset > offset) {\n ;[before, middle] = split(middle, start.offset - offset)\n }\n\n middle[kind].push(format)\n\n if (before) {\n next.push(before)\n }\n\n next.push(middle)\n\n if (after) {\n next.push(after)\n }\n }\n\n leaves = next\n }\n }\n\n compile('annotations')\n compile('decorations')\n\n leaves = leaves.map(leaf => {\n return new Leaf({\n ...leaf,\n annotations: List(leaf.annotations),\n decorations: List(leaf.decorations),\n })\n })\n\n const list = List(leaves)\n return list\n }\n\n /**\n * Insert `text` at `index`.\n *\n * @param {Number} index\n * @param {String} string\n * @return {Text}\n */\n\n insertText(index, string) {\n const { text } = this\n const next = text.slice(0, index) + string + text.slice(index)\n const node = this.set('text', next)\n return node\n }\n\n /**\n * Remove a `mark`.\n *\n * @param {Mark} mark\n * @return {Text}\n */\n\n removeMark(mark) {\n mark = Mark.create(mark)\n const { marks } = this\n const next = marks.remove(mark)\n const node = this.set('marks', next)\n return node\n }\n\n /**\n * Remove text from the text node at `index` for `length`.\n *\n * @param {Number} index\n * @param {Number} length\n * @return {Text}\n */\n\n removeText(index, length) {\n const { text } = this\n const next = text.slice(0, index) + text.slice(index + length)\n const node = this.set('text', next)\n return node\n }\n\n /**\n * Return a JSON representation of the text.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n text: this.text,\n marks: this.marks.toArray().map(m => m.toJSON()),\n }\n\n if (options.preserveKeys) {\n object.key = this.key\n }\n\n return object\n }\n\n /**\n * Set a `newProperties` on an existing `mark`.\n *\n * @param {Object} mark\n * @param {Object} newProperties\n * @return {Text}\n */\n\n setMark(properties, newProperties) {\n const { marks } = this\n const mark = Mark.create(properties)\n const newMark = mark.merge(newProperties)\n const next = marks.remove(mark).add(newMark)\n const node = this.set('marks', next)\n return node\n }\n\n /**\n * Split the node into two at `index`.\n *\n * @param {Number} index\n * @returns {Array<Text>}\n */\n\n splitText(index) {\n const { text } = this\n const one = this.set('text', text.slice(0, index))\n const two = this.set('text', text.slice(index)).regenerateKey()\n return [one, two]\n }\n\n /**\n * Merge the node with an `other` text node.\n *\n * @param {Text} other\n * @returns {Text}\n */\n\n mergeText(other) {\n const next = this.text + other.text\n const node = this.set('text', next)\n return node\n }\n}\n\n/**\n * Export.\n *\n * @type {Text}\n */\n\nexport default Text\n","import isPlainObject from 'is-plain-object'\nimport warning from 'tiny-warning'\nimport { List } from 'immutable'\n\nimport Block from './block'\nimport Data from './data'\nimport Document from './document'\nimport Inline from './inline'\nimport Text from './text'\n\n/**\n * A pseudo-model that is used for its static methods only.\n *\n * @type {Node}\n */\n\nclass Node {\n /**\n * Create a new `Node` with `attrs`.\n *\n * @param {Object|Node} attrs\n * @return {Node}\n */\n\n static create(attrs = {}) {\n if (Node.isNode(attrs)) {\n return attrs\n }\n\n if (isPlainObject(attrs)) {\n let { object } = attrs\n\n if (!object && attrs.kind) {\n warning(\n false,\n 'As of slate@0.32.0, the `kind` property of Slate objects has been renamed to `object`.'\n )\n\n object = attrs.kind\n }\n\n switch (object) {\n case 'block':\n return Block.create(attrs)\n case 'document':\n return Document.create(attrs)\n case 'inline':\n return Inline.create(attrs)\n case 'text':\n return Text.create(attrs)\n\n default: {\n throw new Error('`Node.create` requires a `object` string.')\n }\n }\n }\n\n throw new Error(\n `\\`Node.create\\` only accepts objects or nodes but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a list of `Nodes` from an array.\n *\n * @param {Array<Object|Node>} elements\n * @return {List<Node>}\n */\n\n static createList(elements = []) {\n if (List.isList(elements) || Array.isArray(elements)) {\n let array = []\n\n elements.forEach(el => {\n if (\n el &&\n el.object === 'text' &&\n el.leaves &&\n Array.isArray(el.leaves)\n ) {\n warning(\n false,\n 'As of slate@0.46, the `leaves` property of Text nodes has been removed. Instead, each text node contains a string of text and a unique set of marks and leaves are unnecessary.'\n )\n\n const texts = Text.createList(el.leaves).toArray()\n array = array.concat(texts)\n return\n }\n\n const node = Node.create(el)\n array.push(node)\n })\n\n const list = List(array)\n return list\n }\n\n throw new Error(\n `\\`Node.createList\\` only accepts lists or arrays, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a dictionary of settable node properties from `attrs`.\n *\n * @param {Object|String|Node} attrs\n * @return {Object}\n */\n\n static createProperties(attrs = {}) {\n if (Block.isBlock(attrs) || Inline.isInline(attrs)) {\n return {\n data: attrs.data,\n type: attrs.type,\n }\n }\n\n if (typeof attrs === 'string') {\n return { type: attrs }\n }\n\n if (isPlainObject(attrs)) {\n const props = {}\n if ('type' in attrs) props.type = attrs.type\n if ('data' in attrs) props.data = Data.create(attrs.data)\n return props\n }\n\n throw new Error(\n `\\`Node.createProperties\\` only accepts objects, strings, blocks or inlines, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a `Node` from a JSON `value`.\n *\n * @param {Object} value\n * @return {Node}\n */\n\n static fromJSON(value) {\n let { object } = value\n\n if (!object && value.kind) {\n warning(\n false,\n 'As of slate@0.32.0, the `kind` property of Slate objects has been renamed to `object`.'\n )\n\n object = value.kind\n }\n\n switch (object) {\n case 'block':\n return Block.fromJSON(value)\n case 'document':\n return Document.fromJSON(value)\n case 'inline':\n return Inline.fromJSON(value)\n case 'text':\n return Text.fromJSON(value)\n\n default: {\n throw new Error(\n `\\`Node.fromJSON\\` requires an \\`object\\` of either 'block', 'document', 'inline' or 'text', but you passed: ${value}`\n )\n }\n }\n }\n\n /**\n * Check if `any` is a `Node`.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isNode(any) {\n return (\n Block.isBlock(any) ||\n Document.isDocument(any) ||\n Inline.isInline(any) ||\n Text.isText(any)\n )\n }\n\n /**\n * Check if `any` is a list of nodes.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isNodeList(any) {\n return List.isList(any) && any.every(item => Node.isNode(item))\n }\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default Node\n","import isPlainObject from 'is-plain-object'\nimport { List, Map, Record } from 'immutable'\n\nimport KeyUtils from '../utils/key-utils'\nimport Node from './node'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n data: undefined,\n key: undefined,\n nodes: undefined,\n type: undefined,\n}\n\n/**\n * Block.\n *\n * @type {Block}\n */\n\nclass Block extends Record(DEFAULTS) {\n /**\n * Create a new `Block` from `attrs`.\n *\n * @param {Object|String|Block} attrs\n * @return {Block}\n */\n\n static create(attrs = {}) {\n if (Block.isBlock(attrs)) {\n return attrs\n }\n\n if (typeof attrs === 'string') {\n attrs = { type: attrs }\n }\n\n if (isPlainObject(attrs)) {\n return Block.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Block.create\\` only accepts objects, strings or blocks, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a list of `Blocks` from `attrs`.\n *\n * @param {Array<Block|Object>|List<Block|Object>} attrs\n * @return {List<Block>}\n */\n\n static createList(attrs = []) {\n if (List.isList(attrs) || Array.isArray(attrs)) {\n const list = new List(attrs.map(Block.create))\n return list\n }\n\n throw new Error(\n `\\`Block.createList\\` only accepts arrays or lists, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a `Block` from a JSON `object`.\n *\n * @param {Object|Block} object\n * @return {Block}\n */\n\n static fromJSON(object) {\n if (Block.isBlock(object)) {\n return object\n }\n\n const { data = {}, key = KeyUtils.create(), nodes = [], type } = object\n\n if (typeof type !== 'string') {\n throw new Error('`Block.fromJSON` requires a `type` string.')\n }\n\n const block = new Block({\n key,\n type,\n data: Map(data),\n nodes: Node.createList(nodes),\n })\n\n return block\n }\n\n /**\n * Check if `any` is a block list.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isBlockList(any) {\n return List.isList(any) && any.every(item => Block.isBlock(item))\n }\n\n /**\n * Return a JSON representation of the block.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n type: this.type,\n data: this.data.toJSON(),\n nodes: this.nodes.toArray().map(n => n.toJSON(options)),\n }\n\n if (options.preserveKeys) {\n object.key = this.key\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Block}\n */\n\nexport default Block\n","import isPlainObject from 'is-plain-object'\nimport invariant from 'tiny-invariant'\nimport { Record, Set, List } from 'immutable'\n\nimport Annotation from './annotation'\nimport Data from './data'\nimport Document from './document'\nimport Mark from './mark'\nimport PathUtils from '../utils/path-utils'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n annotations: undefined,\n data: undefined,\n document: undefined,\n selection: undefined,\n}\n\n/**\n * Value.\n *\n * @type {Value}\n */\n\nclass Value extends Record(DEFAULTS) {\n /**\n * Create a new `Value` with `attrs`.\n *\n * @param {Object|Value} attrs\n * @param {Object} options\n * @return {Value}\n */\n\n static create(attrs = {}, options = {}) {\n if (Value.isValue(attrs)) {\n return attrs\n }\n\n if (isPlainObject(attrs)) {\n return Value.fromJSON(attrs, options)\n }\n\n throw new Error(\n `\\`Value.create\\` only accepts objects or values, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a dictionary of settable value properties from `attrs`.\n *\n * @param {Object|Value} attrs\n * @return {Object}\n */\n\n static createProperties(a = {}) {\n if (Value.isValue(a)) {\n return {\n annotations: a.annotations,\n data: a.data,\n }\n }\n\n if (isPlainObject(a)) {\n const p = {}\n if ('annotations' in a)\n p.annotations = Annotation.createList(a.annotations)\n if ('data' in a) p.data = Data.create(a.data)\n return p\n }\n\n throw new Error(\n `\\`Value.createProperties\\` only accepts objects or values, but you passed it: ${a}`\n )\n }\n\n /**\n * Create a `Value` from a JSON `object`.\n *\n * @param {Object} object\n * @param {Object} options\n * @property {Boolean} normalize\n * @property {Array} plugins\n * @return {Value}\n */\n\n static fromJSON(object, options = {}) {\n let { data = {}, annotations = {}, document = {}, selection = {} } = object\n data = Data.fromJSON(data)\n document = Document.fromJSON(document)\n selection = document.createSelection(selection)\n annotations = Annotation.createMap(annotations)\n\n if (selection.isUnset) {\n const text = document.getFirstText()\n if (text) selection = selection.moveToStartOfNode(text)\n selection = document.createSelection(selection)\n }\n\n const value = new Value({\n annotations,\n data,\n document,\n selection,\n })\n\n return value\n }\n\n /**\n * Get the current start text node's closest block parent.\n *\n * @return {Block}\n */\n\n get startBlock() {\n return (\n this.selection.start.key &&\n this.document.getClosestBlock(this.selection.start.key)\n )\n }\n\n /**\n * Get the current end text node's closest block parent.\n *\n * @return {Block}\n */\n\n get endBlock() {\n return (\n this.selection.end.key &&\n this.document.getClosestBlock(this.selection.end.key)\n )\n }\n\n /**\n * Get the current anchor text node's closest block parent.\n *\n * @return {Block}\n */\n\n get anchorBlock() {\n return (\n this.selection.anchor.key &&\n this.document.getClosestBlock(this.selection.anchor.key)\n )\n }\n\n /**\n * Get the current focus text node's closest block parent.\n *\n * @return {Block}\n */\n\n get focusBlock() {\n return (\n this.selection.focus.key &&\n this.document.getClosestBlock(this.selection.focus.key)\n )\n }\n\n /**\n * Get the current start text node's closest inline parent.\n *\n * @return {Inline}\n */\n\n get startInline() {\n return (\n this.selection.start.key &&\n this.document.getClosestInline(this.selection.start.key)\n )\n }\n\n /**\n * Get the current end text node's closest inline parent.\n *\n * @return {Inline}\n */\n\n get endInline() {\n return (\n this.selection.end.key &&\n this.document.getClosestInline(this.selection.end.key)\n )\n }\n\n /**\n * Get the current anchor text node's closest inline parent.\n *\n * @return {Inline}\n */\n\n get anchorInline() {\n return (\n this.selection.anchor.key &&\n this.document.getClosestInline(this.selection.anchor.key)\n )\n }\n\n /**\n * Get the current focus text node's closest inline parent.\n *\n * @return {Inline}\n */\n\n get focusInline() {\n return (\n this.selection.focus.key &&\n this.document.getClosestInline(this.selection.focus.key)\n )\n }\n\n /**\n * Get the current start text node.\n *\n * @return {Text}\n */\n\n get startText() {\n return (\n this.selection.start.key &&\n this.document.getDescendant(this.selection.start.key)\n )\n }\n\n /**\n * Get the current end node.\n *\n * @return {Text}\n */\n\n get endText() {\n return (\n this.selection.end.key &&\n this.document.getDescendant(this.selection.end.key)\n )\n }\n\n /**\n * Get the current anchor node.\n *\n * @return {Text}\n */\n\n get anchorText() {\n return (\n this.selection.anchor.key &&\n this.document.getDescendant(this.selection.anchor.key)\n )\n }\n\n /**\n * Get the current focus node.\n *\n * @return {Text}\n */\n\n get focusText() {\n return (\n this.selection.focus.key &&\n this.document.getDescendant(this.selection.focus.key)\n )\n }\n\n /**\n * Get the next block node.\n *\n * @return {Block}\n */\n\n get nextBlock() {\n return (\n this.selection.end.key &&\n this.document.getNextBlock(this.selection.end.key)\n )\n }\n\n /**\n * Get the previous block node.\n *\n * @return {Block}\n */\n\n get previousBlock() {\n return (\n this.selection.start.key &&\n this.document.getPreviousBlock(this.selection.start.key)\n )\n }\n\n /**\n * Get the next inline node.\n *\n * @return {Inline}\n */\n\n get nextInline() {\n return (\n this.selection.end.key &&\n this.document.getNextInline(this.selection.end.key)\n )\n }\n\n /**\n * Get the previous inline node.\n *\n * @return {Inline}\n */\n\n get previousInline() {\n return (\n this.selection.start.key &&\n this.document.getPreviousInline(this.selection.start.key)\n )\n }\n\n /**\n * Get the next text node.\n *\n * @return {Text}\n */\n\n get nextText() {\n return (\n this.selection.end.key &&\n this.document.getNextText(this.selection.end.key)\n )\n }\n\n /**\n * Get the previous text node.\n *\n * @return {Text}\n */\n\n get previousText() {\n return (\n this.selection.start.key &&\n this.document.getPreviousText(this.selection.start.key)\n )\n }\n\n /**\n * Get the marks of the current selection.\n *\n * @return {Set<Mark>}\n */\n\n get marks() {\n return this.selection.isUnset\n ? new Set()\n : this.selection.marks || this.document.getMarksAtRange(this.selection)\n }\n\n /**\n * Get the active marks of the current selection.\n *\n * @return {Set<Mark>}\n */\n\n get activeMarks() {\n return this.selection.isUnset\n ? new Set()\n : this.selection.marks ||\n this.document.getActiveMarksAtRange(this.selection)\n }\n\n /**\n * Get the block nodes in the current selection.\n *\n * @return {List<Block>}\n */\n\n get blocks() {\n return this.selection.isUnset\n ? new List()\n : this.document.getLeafBlocksAtRange(this.selection)\n }\n\n /**\n * Get the fragment of the current selection.\n *\n * @return {Document}\n */\n\n get fragment() {\n return this.selection.isUnset\n ? Document.create()\n : this.document.getFragmentAtRange(this.selection)\n }\n\n /**\n * Get the bottom-most inline nodes in the current selection.\n *\n * @return {List<Inline>}\n */\n\n get inlines() {\n return this.selection.isUnset\n ? new List()\n : this.document.getLeafInlinesAtRange(this.selection)\n }\n\n /**\n * Get the text nodes in the current selection.\n *\n * @return {List<Text>}\n */\n\n get texts() {\n return this.selection.isUnset\n ? new List()\n : this.document.getTextsAtRange(this.selection)\n }\n\n /**\n * Add an `annotation` to the value.\n *\n * @param {Annotation} annotation\n * @param {Mark} mark\n * @return {Value}\n */\n\n addAnnotation(annotation) {\n annotation = Annotation.create(annotation)\n let value = this\n let { annotations } = value\n const { key } = annotation\n annotations = annotations.set(key, annotation)\n value = value.set('annotations', annotations)\n return value\n }\n\n /**\n * Add `mark` to text at `path`.\n *\n * @param {List|String} path\n * @param {Mark} mark\n * @return {Value}\n */\n\n addMark(path, mark) {\n mark = Mark.create(mark)\n let value = this\n let { document } = value\n document = document.addMark(path, mark)\n value = value.set('document', document)\n return value\n }\n\n /**\n * Insert a `node`.\n *\n * @param {List|String} path\n * @param {Node} node\n * @return {Value}\n */\n\n insertNode(path, node) {\n let value = this\n let { document } = value\n document = document.insertNode(path, node)\n value = value.set('document', document)\n\n value = value.mapRanges(range =>\n range.updatePoints(point => point.setPath(null))\n )\n\n return value\n }\n\n /**\n * Insert `text` at `offset` in node by `path`.\n *\n * @param {List|String} path\n * @param {Number} offset\n * @param {String} text\n * @return {Value}\n */\n\n insertText(path, offset, text) {\n let value = this\n let { document } = value\n let node = document.assertNode(path)\n document = document.insertText(path, offset, text)\n node = document.assertNode(path)\n value = value.set('document', document)\n\n value = value.mapPoints(point => {\n if (point.key === node.key && point.offset >= offset) {\n return point.setOffset(point.offset + text.length)\n } else {\n return point\n }\n })\n\n return value\n }\n\n /**\n * Merge a node backwards its previous sibling.\n *\n * @param {List|Key} path\n * @return {Value}\n */\n\n mergeNode(path) {\n let value = this\n const { document } = value\n const newDocument = document.mergeNode(path)\n path = document.resolvePath(path)\n const withPath = PathUtils.decrement(path)\n const one = document.getNode(withPath)\n const two = document.getNode(path)\n value = value.set('document', newDocument)\n\n value = value.mapRanges(range => {\n if (two.object === 'text') {\n const max = one.text.length\n\n if (range.anchor.key === two.key) {\n range = range.moveAnchorTo(one.key, max + range.anchor.offset)\n }\n\n if (range.focus.key === two.key) {\n range = range.moveFocusTo(one.key, max + range.focus.offset)\n }\n }\n\n range = range.updatePoints(point => point.setPath(null))\n\n return range\n })\n\n return value\n }\n\n /**\n * Move a node by `path` to `newPath`.\n *\n * A `newIndex` can be provided when move nodes by `key`, to account for not\n * being able to have a key for a location in the tree that doesn't exist yet.\n *\n * @param {List|Key} path\n * @param {List|Key} newPath\n * @param {Number} newIndex\n * @return {Value}\n */\n\n moveNode(path, newPath, newIndex = 0) {\n let value = this\n let { document } = value\n\n if (PathUtils.isEqual(path, newPath)) {\n return value\n }\n\n document = document.moveNode(path, newPath, newIndex)\n value = value.set('document', document)\n value = value.mapPoints(point => point.setPath(null))\n return value\n }\n\n /**\n * Remove an `annotation` from the value.\n *\n * @param {Annotation} annotation\n * @param {Mark} mark\n * @return {Value}\n */\n\n removeAnnotation(annotation) {\n annotation = Annotation.create(annotation)\n let value = this\n let { annotations } = value\n const { key } = annotation\n annotations = annotations.delete(key)\n value = value.set('annotations', annotations)\n return value\n }\n\n /**\n * Remove `mark` at `path`.\n *\n * @param {List|String} path\n * @param {Mark} mark\n * @return {Value}\n */\n\n removeMark(path, mark) {\n mark = Mark.create(mark)\n let value = this\n let { document } = value\n document = document.removeMark(path, mark)\n value = value.set('document', document)\n return value\n }\n\n /**\n * Remove a node by `path`.\n *\n * @param {List|String} path\n * @return {Value}\n */\n\n removeNode(path) {\n let value = this\n let { document } = value\n const node = document.assertNode(path)\n const first = node.object === 'text' ? node : node.getFirstText() || node\n const last = node.object === 'text' ? node : node.getLastText() || node\n const prev = document.getPreviousText(first.key)\n const next = document.getNextText(last.key)\n\n document = document.removeNode(path)\n value = value.set('document', document)\n\n value = value.mapRanges(range => {\n const { start, end } = range\n\n if (node.hasNode(start.key)) {\n range = prev\n ? range.moveStartTo(prev.key, prev.text.length)\n : next ? range.moveStartTo(next.key, 0) : range.unset()\n }\n\n if (node.hasNode(end.key)) {\n range = prev\n ? range.moveEndTo(prev.key, prev.text.length)\n : next ? range.moveEndTo(next.key, 0) : range.unset()\n }\n\n range = range.updatePoints(point => point.setPath(null))\n\n return range\n })\n\n return value\n }\n\n /**\n * Remove `text` at `offset` in node by `path`.\n *\n * @param {List|Key} path\n * @param {Number} offset\n * @param {String} text\n * @return {Value}\n */\n\n removeText(path, offset, text) {\n let value = this\n let { document } = value\n const node = document.assertNode(path)\n document = document.removeText(path, offset, text)\n value = value.set('document', document)\n\n const { length } = text\n const start = offset\n const end = offset + length\n\n value = value.mapPoints(point => {\n if (point.key !== node.key) {\n return point\n }\n\n if (point.offset >= end) {\n return point.setOffset(point.offset - length)\n }\n\n if (point.offset > start) {\n return point.setOffset(start)\n }\n\n return point\n })\n\n return value\n }\n\n /**\n * Add an `annotation` to the value.\n *\n * @param {Annotation} annotation\n * @param {Mark} mark\n * @return {Value}\n */\n\n setAnnotation(properties, newProperties) {\n newProperties = Annotation.createProperties(newProperties)\n const annotation = Annotation.create(properties)\n const next = annotation.merge(newProperties)\n let value = this\n let { annotations } = value\n const { key } = annotation\n annotations = annotations.set(key, next)\n value = value.set('annotations', annotations)\n return value\n }\n\n /**\n * Set `properties` on a node.\n *\n * @param {List|String} path\n * @param {Object} properties\n * @return {Value}\n */\n\n setNode(path, properties) {\n let value = this\n let { document } = value\n document = document.setNode(path, properties)\n value = value.set('document', document)\n return value\n }\n\n /**\n * Set `properties` on `mark` on text at `offset` and `length` in node.\n *\n * @param {List|String} path\n * @param {Mark} mark\n * @param {Object} properties\n * @return {Value}\n */\n\n setMark(path, mark, properties) {\n let value = this\n let { document } = value\n document = document.setMark(path, mark, properties)\n value = value.set('document', document)\n return value\n }\n\n /**\n * Set `properties` on the value.\n *\n * @param {Object} properties\n * @return {Value}\n */\n\n setProperties(properties) {\n let value = this\n const { document } = value\n const { data, annotations } = properties\n const props = {}\n\n if (data) {\n props.data = data\n }\n\n if (annotations) {\n props.annotations = annotations.map(a => {\n return a.isSet ? a : document.resolveAnnotation(a)\n })\n }\n\n value = value.merge(props)\n return value\n }\n\n /**\n * Set `properties` on the selection.\n *\n * @param {Value} value\n * @param {Operation} operation\n * @return {Value}\n */\n\n setSelection(properties) {\n let value = this\n let { document, selection } = value\n const next = selection.setProperties(properties)\n selection = document.resolveSelection(next)\n value = value.set('selection', selection)\n return value\n }\n\n /**\n * Split a node by `path` at `position` with optional `properties` to apply\n * to the newly split node.\n *\n * @param {List|String} path\n * @param {Number} position\n * @param {Object} properties\n * @return {Value}\n */\n\n splitNode(path, position, properties) {\n let value = this\n const { document } = value\n const newDocument = document.splitNode(path, position, properties)\n const node = document.assertNode(path)\n value = value.set('document', newDocument)\n\n value = value.mapRanges(range => {\n const next = newDocument.getNextText(node.key)\n const { start, end } = range\n\n // If the start was after the split, move it to the next node.\n if (node.key === start.key && position <= start.offset) {\n range = range.moveStartTo(next.key, start.offset - position)\n }\n\n // If the end was after the split, move it to the next node.\n if (node.key === end.key && position <= end.offset) {\n range = range.moveEndTo(next.key, end.offset - position)\n }\n\n range = range.updatePoints(point => point.setPath(null))\n\n return range\n })\n\n return value\n }\n\n /**\n * Map all range objects to apply adjustments with an `iterator`.\n *\n * @param {Function} iterator\n * @return {Value}\n */\n\n mapRanges(iterator) {\n let value = this\n const { document, selection, annotations } = value\n\n let sel = selection.isSet ? iterator(selection) : selection\n if (!sel) sel = selection.unset()\n if (sel !== selection) sel = document.createSelection(sel)\n value = value.set('selection', sel)\n\n let anns = annotations.map(annotation => {\n let n = annotation.isSet ? iterator(annotation) : annotation\n if (n && n !== annotation) n = document.createAnnotation(n)\n return n\n })\n\n anns = anns.filter(annotation => !!annotation)\n value = value.set('annotations', anns)\n return value\n }\n\n mapPoints(iterator) {\n return this.mapRanges(range => range.updatePoints(iterator))\n }\n\n /**\n * Return a JSON representation of the value.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n document: this.document.toJSON(options),\n }\n\n if (options.preserveData) {\n object.data = this.data.toJSON(options)\n }\n\n if (options.preserveAnnotations) {\n object.annotations = this.annotations\n .map(a => a.toJSON(options))\n .toObject()\n }\n\n if (options.preserveSelection) {\n object.selection = this.selection.toJSON(options)\n }\n\n return object\n }\n\n /**\n * Deprecated.\n */\n\n get history() {\n invariant(\n false,\n 'As of Slate 0.42.0, the `value.history` model no longer exists, and the history is stored in `value.data` instead using plugins.'\n )\n }\n\n change() {\n invariant(\n false,\n 'As of Slate 0.42.0, value object are no longer schema-aware, and the `value.change()` method is no longer available. Use the `editor.change()` method on the new `Editor` controller instead.'\n )\n }\n}\n\n/**\n * Export.\n */\n\nexport default Value\n","import Debug from 'debug'\n\nimport Operation from '../models/operation'\n\n/**\n * Debug.\n *\n * @type {Function}\n */\n\nconst debug = Debug('slate:operation:apply')\n\n/**\n * Apply an `op` to a `value`.\n *\n * @param {Value} value\n * @param {Object|Operation} op\n * @return {Value} value\n */\n\nfunction applyOperation(value, op) {\n op = Operation.create(op)\n const { type } = op\n debug(type, op)\n\n switch (type) {\n case 'add_annotation': {\n const { annotation } = op\n const next = value.addAnnotation(annotation)\n return next\n }\n\n case 'add_mark': {\n const { path, mark } = op\n const next = value.addMark(path, mark)\n return next\n }\n\n case 'insert_node': {\n const { path, node } = op\n const next = value.insertNode(path, node)\n return next\n }\n\n case 'insert_text': {\n const { path, offset, text, marks } = op\n const next = value.insertText(path, offset, text, marks)\n return next\n }\n\n case 'merge_node': {\n const { path } = op\n const next = value.mergeNode(path)\n return next\n }\n\n case 'move_node': {\n const { path, newPath } = op\n const next = value.moveNode(path, newPath)\n return next\n }\n\n case 'remove_annotation': {\n const { annotation } = op\n const next = value.removeAnnotation(annotation)\n return next\n }\n\n case 'remove_mark': {\n const { path, mark } = op\n const next = value.removeMark(path, mark)\n return next\n }\n\n case 'remove_node': {\n const { path } = op\n const next = value.removeNode(path)\n return next\n }\n\n case 'remove_text': {\n const { path, offset, text } = op\n const next = value.removeText(path, offset, text)\n return next\n }\n\n case 'set_annotation': {\n const { properties, newProperties } = op\n const next = value.setAnnotation(properties, newProperties)\n return next\n }\n\n case 'set_mark': {\n const { path, properties, newProperties } = op\n const next = value.setMark(path, properties, newProperties)\n return next\n }\n\n case 'set_node': {\n const { path, newProperties } = op\n const next = value.setNode(path, newProperties)\n return next\n }\n\n case 'set_selection': {\n const { newProperties } = op\n const next = value.setSelection(newProperties)\n return next\n }\n\n case 'set_value': {\n const { newProperties } = op\n const next = value.setProperties(newProperties)\n return next\n }\n\n case 'split_node': {\n const { path, position, properties } = op\n const next = value.splitNode(path, position, properties)\n return next\n }\n\n default: {\n throw new Error(`Unknown operation type: \"${type}\".`)\n }\n }\n}\n\n/**\n * Export.\n *\n * @type {Function}\n */\n\nexport default applyOperation\n","import Debug from 'debug'\n\nimport Operation from '../models/operation'\nimport PathUtils from '../utils/path-utils'\n\n/**\n * Debug.\n *\n * @type {Function}\n */\n\nconst debug = Debug('slate:operation:invert')\n\n/**\n * Invert an `op`.\n *\n * @param {Object} op\n * @return {Object}\n */\n\nfunction invertOperation(op) {\n op = Operation.create(op)\n const { type } = op\n debug(type, op)\n\n switch (type) {\n case 'move_node': {\n const { newPath, path } = op\n\n // PERF: this case can exit early.\n if (PathUtils.isEqual(newPath, path)) {\n return op\n }\n\n const inversePath = PathUtils.transform(path, op).first()\n\n // Get the true path we are trying to move back to\n // We transform the right-sibling of the path\n // This will end up at the operation.path most of the time\n // But if the newPath is a left-sibling or left-ancestor-sibling, this will account for it\n const inverseNewPath = PathUtils.transform(\n PathUtils.increment(path),\n op\n ).first()\n\n const inverse = op.set('path', inversePath).set('newPath', inverseNewPath)\n return inverse\n }\n\n case 'merge_node': {\n const { path } = op\n const inversePath = PathUtils.decrement(path)\n const inverse = op.set('type', 'split_node').set('path', inversePath)\n return inverse\n }\n\n case 'split_node': {\n const { path } = op\n const inversePath = PathUtils.increment(path)\n const inverse = op.set('type', 'merge_node').set('path', inversePath)\n return inverse\n }\n\n case 'set_annotation':\n case 'set_node':\n case 'set_value':\n case 'set_selection':\n case 'set_mark': {\n const { properties, newProperties } = op\n const inverse = op\n .set('properties', newProperties)\n .set('newProperties', properties)\n return inverse\n }\n\n case 'insert_node':\n case 'insert_text': {\n const inverse = op.set('type', type.replace('insert_', 'remove_'))\n return inverse\n }\n\n case 'remove_node':\n case 'remove_text': {\n const inverse = op.set('type', type.replace('remove_', 'insert_'))\n return inverse\n }\n\n case 'add_annotation':\n case 'add_mark': {\n const inverse = op.set('type', type.replace('add_', 'remove_'))\n return inverse\n }\n\n case 'remove_annotation':\n case 'remove_mark': {\n const inverse = op.set('type', type.replace('remove_', 'add_'))\n return inverse\n }\n\n default: {\n throw new Error(`Unknown operation type: \"${type}\".`)\n }\n }\n}\n\n/**\n * Export.\n *\n * @type {Function}\n */\n\nexport default invertOperation\n","import isPlainObject from 'is-plain-object'\nimport { List, Record, Map } from 'immutable'\n\nimport Annotation from './annotation'\nimport Mark from './mark'\nimport Node from './node'\nimport PathUtils from '../utils/path-utils'\nimport Selection from './selection'\nimport Value from './value'\nimport apply from '../operations/apply'\nimport invert from '../operations/invert'\n\n/**\n * Operation attributes.\n *\n * @type {Array}\n */\n\nconst OPERATION_ATTRIBUTES = {\n add_mark: ['path', 'mark', 'data'],\n add_annotation: ['annotation', 'data'],\n insert_node: ['path', 'node', 'data'],\n insert_text: ['path', 'offset', 'text', 'data'],\n merge_node: ['path', 'position', 'properties', 'target', 'data'],\n move_node: ['path', 'newPath', 'data'],\n remove_annotation: ['annotation', 'data'],\n remove_mark: ['path', 'mark', 'data'],\n remove_node: ['path', 'node', 'data'],\n remove_text: ['path', 'offset', 'text', 'data'],\n set_annotation: ['properties', 'newProperties', 'data'],\n set_mark: ['path', 'properties', 'newProperties', 'data'],\n set_node: ['path', 'properties', 'newProperties', 'data'],\n set_selection: ['properties', 'newProperties', 'data'],\n set_value: ['properties', 'newProperties', 'data'],\n split_node: ['path', 'position', 'properties', 'target', 'data'],\n}\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n annotation: undefined,\n data: undefined,\n length: undefined,\n mark: undefined,\n marks: undefined,\n newPath: undefined,\n newProperties: undefined,\n node: undefined,\n offset: undefined,\n path: undefined,\n position: undefined,\n properties: undefined,\n target: undefined,\n text: undefined,\n type: undefined,\n}\n\n/**\n * Operation.\n *\n * @type {Operation}\n */\n\nclass Operation extends Record(DEFAULTS) {\n /**\n * Create a new `Operation` with `attrs`.\n *\n * @param {Object|Array|List|String|Operation} attrs\n * @return {Operation}\n */\n\n static create(attrs = {}) {\n if (Operation.isOperation(attrs)) {\n return attrs\n }\n\n if (isPlainObject(attrs)) {\n return Operation.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Operation.create\\` only accepts objects or operations, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a list of `Operations` from `elements`.\n *\n * @param {Array<Operation|Object>|List<Operation|Object>} elements\n * @return {List<Operation>}\n */\n\n static createList(elements = []) {\n if (List.isList(elements) || Array.isArray(elements)) {\n const list = new List(elements.map(Operation.create))\n return list\n }\n\n throw new Error(\n `\\`Operation.createList\\` only accepts arrays or lists, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a `Operation` from a JSON `object`.\n *\n * @param {Object|Operation} object\n * @return {Operation}\n */\n\n static fromJSON(object) {\n if (Operation.isOperation(object)) {\n return object\n }\n\n const { type } = object\n const ATTRIBUTES = OPERATION_ATTRIBUTES[type]\n const attrs = { type }\n\n if (!ATTRIBUTES) {\n throw new Error(\n `\\`Operation.fromJSON\\` was passed an unrecognized operation type: \"${type}\"`\n )\n }\n\n for (const key of ATTRIBUTES) {\n let v = object[key]\n\n // Default `data` to an empty object.\n if (key === 'data' && v === undefined) {\n v = {}\n }\n\n if (v === undefined) {\n throw new Error(\n `\\`Operation.fromJSON\\` was passed a \"${type}\" operation without the required \"${key}\" attribute.`\n )\n }\n\n if (key === 'annotation') {\n v = Annotation.create(v)\n }\n\n if (key === 'path' || key === 'newPath') {\n v = PathUtils.create(v)\n }\n\n if (key === 'mark') {\n v = Mark.create(v)\n }\n\n if (key === 'node') {\n v = Node.create(v)\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_annotation'\n ) {\n v = Annotation.createProperties(v)\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_mark'\n ) {\n v = Mark.createProperties(v)\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n (type === 'set_node' || type === 'merge_node' || type === 'split_node')\n ) {\n v = Node.createProperties(v)\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_selection'\n ) {\n v = Selection.createProperties(v)\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_value'\n ) {\n v = Value.createProperties(v)\n }\n\n if (key === 'data') {\n v = Map(v)\n }\n\n attrs[key] = v\n }\n\n const op = new Operation(attrs)\n return op\n }\n\n /**\n * Check if `any` is a list of operations.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isOperationList(any) {\n return List.isList(any) && any.every(item => Operation.isOperation(item))\n }\n\n /**\n * Apply the operation to a `value`.\n *\n * @param {Value} value\n * @return {Value}\n */\n\n apply(value) {\n const next = apply(value, this)\n return next\n }\n\n /**\n * Invert the operation.\n *\n * @return {Operation}\n */\n\n invert() {\n const inverted = invert(this)\n return inverted\n }\n\n /**\n * Return a JSON representation of the operation.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const { object, type } = this\n const json = { object, type }\n const ATTRIBUTES = OPERATION_ATTRIBUTES[type]\n\n for (const key of ATTRIBUTES) {\n let value = this[key]\n\n if (\n key === 'annotation' ||\n key === 'mark' ||\n key === 'marks' ||\n key === 'node' ||\n key === 'path' ||\n key === 'newPath'\n ) {\n value = value.toJSON()\n }\n\n if (key === 'properties' && type === 'merge_node') {\n const v = {}\n if ('data' in value) v.data = value.data.toJS()\n if ('type' in value) v.type = value.type\n value = v\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_annotation'\n ) {\n const v = {}\n if ('anchor' in value) v.anchor = value.anchor.toJS()\n if ('focus' in value) v.focus = value.focus.toJS()\n if ('key' in value) v.key = value.key\n if ('mark' in value) v.mark = value.mark.toJS()\n value = v\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_mark'\n ) {\n const v = {}\n if ('data' in value) v.data = value.data.toJS()\n if ('type' in value) v.type = value.type\n value = v\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_node'\n ) {\n const v = {}\n if ('data' in value) v.data = value.data.toJS()\n if ('type' in value) v.type = value.type\n value = v\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_selection'\n ) {\n const v = {}\n if ('anchor' in value) v.anchor = value.anchor.toJSON()\n if ('focus' in value) v.focus = value.focus.toJSON()\n if ('isFocused' in value) v.isFocused = value.isFocused\n if ('marks' in value) v.marks = value.marks && value.marks.toJSON()\n value = v\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_value'\n ) {\n const v = {}\n if ('data' in value) v.data = value.data.toJS()\n value = v\n }\n\n if (key === 'properties' && type === 'split_node') {\n const v = {}\n if ('data' in value) v.data = value.data.toJS()\n if ('type' in value) v.type = value.type\n value = v\n }\n\n if (key === 'data') {\n value = value.toJSON()\n }\n\n json[key] = value\n }\n\n return json\n }\n}\n\n/**\n * Export.\n *\n * @type {Operation}\n */\n\nexport default Operation\n","import isPlainObject from 'is-plain-object'\nimport { Record } from 'immutable'\n\nimport Operation from './operation'\nimport Value from './value'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n operations: undefined,\n value: undefined,\n}\n\n/**\n * Change.\n *\n * @type {Change}\n */\n\nclass Change extends Record(DEFAULTS) {\n /**\n * Create a new `Change` with `attrs`.\n *\n * @param {Object|Change} attrs\n * @return {Change}\n */\n\n static create(attrs = {}) {\n if (Change.isChange(attrs)) {\n return attrs\n }\n\n if (isPlainObject(attrs)) {\n return Change.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Change.create\\` only accepts objects or changes, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a `Change` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Change}\n */\n\n static fromJSON(object) {\n const { value, operations = [] } = object\n\n const change = new Change({\n value: Value.create(value),\n operations: Operation.createList(operations),\n })\n\n return change\n }\n\n /**\n * Return a JSON representation of the change.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n value: this.value.toJSON(options),\n operations: this.operations.toArray().map(o => o.toJSON(options)),\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Change}\n */\n\nexport default Change\n","/**\n * A plugin that adds a set of commands to the editor.\n *\n * @param {Object} commands\n * @return {Object}\n */\n\nfunction CommandsPlugin(commands = {}) {\n /**\n * On command, if it exists in our list of commands, call it.\n *\n * @param {Object} command\n * @param {Editor} editor\n * @param {Function} next\n */\n\n function onCommand(command, editor, next) {\n const { type, args } = command\n const fn = commands[type]\n if (!fn) return next()\n editor.command(fn, ...args)\n }\n\n /**\n * On construct, register all the commands.\n *\n * @param {Editor} editor\n * @param {Function} next\n */\n\n function onConstruct(editor, next) {\n for (const command in commands) {\n editor.registerCommand(command)\n }\n\n return next()\n }\n\n /**\n * Return the plugin.\n *\n * @type {Object}\n */\n\n return {\n onCommand,\n onConstruct,\n }\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default CommandsPlugin\n","import { reverse } from 'esrever'\n\n/**\n * Surrogate pair start and end points.\n *\n * @type {Number}\n */\n\nconst SURROGATE_START = 0xd800\nconst SURROGATE_END = 0xdfff\n\n/**\n * A regex to match space characters.\n *\n * @type {RegExp}\n */\n\nconst SPACE = /\\s/\n\n/**\n * A regex to match chameleon characters, that count as word characters as long\n * as they are inside of a word.\n *\n * @type {RegExp}\n */\n\nconst CHAMELEON = /['\\u2018\\u2019]/\n\n/**\n * A regex that matches punctuation.\n *\n * @type {RegExp}\n */\n\nconst PUNCTUATION = /[\\u0021-\\u0023\\u0025-\\u002A\\u002C-\\u002F\\u003A\\u003B\\u003F\\u0040\\u005B-\\u005D\\u005F\\u007B\\u007D\\u00A1\\u00A7\\u00AB\\u00B6\\u00B7\\u00BB\\u00BF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E3B\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]/\n\n/**\n * Is a character `code` in a surrogate character.\n *\n * @param {Number} code\n * @return {Boolean}\n */\n\nfunction isSurrogate(code) {\n return SURROGATE_START <= code && code <= SURROGATE_END\n}\n\n/**\n * Is a character a word character? Needs the `remaining` characters too.\n *\n * @param {String} char\n * @param {String|Void} remaining\n * @return {Boolean}\n */\n\nfunction isWord(char, remaining) {\n if (SPACE.test(char)) return false\n\n // If it's a chameleon character, recurse to see if the next one is or not.\n if (CHAMELEON.test(char)) {\n let next = remaining.charAt(0)\n const length = getCharLength(next)\n next = remaining.slice(0, length)\n const rest = remaining.slice(length)\n if (isWord(next, rest)) return true\n }\n\n if (PUNCTUATION.test(char)) return false\n return true\n}\n\n/**\n * Get the length of a `character`.\n *\n * @param {String} char\n * @return {Number}\n */\n\nfunction getCharLength(char) {\n return isSurrogate(char.charCodeAt(0)) ? 2 : 1\n}\n\n/**\n * Get the offset to the end of the first character in `text`.\n *\n * @param {String} text\n * @return {Number}\n */\n\nfunction getCharOffset(text) {\n const char = text.charAt(0)\n return getCharLength(char)\n}\n\n/**\n * Get the offset to the end of the character before an `offset` in `text`.\n *\n * @param {String} text\n * @param {Number} offset\n * @return {Number}\n */\n\nfunction getCharOffsetBackward(text, offset) {\n text = text.slice(0, offset)\n text = reverse(text)\n return getCharOffset(text)\n}\n\n/**\n * Get the offset to the end of the character after an `offset` in `text`.\n *\n * @param {String} text\n * @param {Number} offset\n * @return {Number}\n */\n\nfunction getCharOffsetForward(text, offset) {\n text = text.slice(offset)\n return getCharOffset(text)\n}\n\n/**\n * Get the offset to the end of the first word in `text`.\n *\n * @param {String} text\n * @return {Number}\n */\n\nfunction getWordOffset(text) {\n let length = 0\n let i = 0\n let started = false\n let char\n\n while ((char = text.charAt(i))) {\n const l = getCharLength(char)\n char = text.slice(i, i + l)\n const rest = text.slice(i + l)\n\n if (isWord(char, rest)) {\n started = true\n length += l\n } else if (!started) {\n length += l\n } else {\n break\n }\n\n i += l\n }\n\n return length\n}\n\n/**\n * Get the offset to the end of the word before an `offset` in `text`.\n *\n * @param {String} text\n * @param {Number} offset\n * @return {Number}\n */\n\nfunction getWordOffsetBackward(text, offset) {\n text = text.slice(0, offset)\n text = reverse(text)\n const o = getWordOffset(text)\n return o\n}\n\n/**\n * Get the offset to the end of the word after an `offset` in `text`.\n *\n * @param {String} text\n * @param {Number} offset\n * @return {Number}\n */\n\nfunction getWordOffsetForward(text, offset) {\n text = text.slice(offset)\n const o = getWordOffset(text)\n return o\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default {\n getCharLength,\n getCharOffset,\n getCharOffsetBackward,\n getCharOffsetForward,\n getWordOffset,\n getWordOffsetBackward,\n getWordOffsetForward,\n isSurrogate,\n isWord,\n}\n","import { List } from 'immutable'\nimport Block from '../models/block'\nimport Inline from '../models/inline'\nimport Mark from '../models/mark'\nimport Node from '../models/node'\nimport TextUtils from '../utils/text-utils'\n\n/**\n * Ensure that an expanded selection is deleted first, and return the updated\n * range to account for the deleted part.\n *\n * @param {Editor}\n */\n\nfunction deleteExpandedAtRange(editor, range) {\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n }\n\n const { value } = editor\n const { document } = value\n const { start, end } = range\n\n if (document.hasDescendant(start.path)) {\n range = range.moveToStart()\n } else {\n range = range.moveTo(end.path, 0).normalize(document)\n }\n\n return range\n}\n\n/**\n * Commands.\n *\n * @type {Object}\n */\n\nconst Commands = {}\n\n/**\n * Add a new `mark` to the characters at `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Mixed} mark\n */\n\nCommands.addMarkAtRange = (editor, range, mark) => {\n if (range.isCollapsed) return\n\n const { value } = editor\n const { document } = value\n const { start, end } = range\n const texts = document.getTextsAtRange(range)\n\n editor.withoutNormalizing(() => {\n texts.forEach(node => {\n const { key } = node\n let index = 0\n let length = node.text.length\n\n if (key === start.key) index = start.offset\n if (key === end.key) length = end.offset\n if (key === start.key && key === end.key)\n length = end.offset - start.offset\n\n editor.addMarkByKey(key, index, length, mark)\n })\n })\n}\n\n/**\n * Add a list of `marks` to the characters at `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Array<Mixed>} mark\n */\n\nCommands.addMarksAtRange = (editor, range, marks) => {\n marks.forEach(mark => editor.addMarkAtRange(range, mark))\n}\n\n/**\n * Delete everything in a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nCommands.deleteAtRange = (editor, range) => {\n // Snapshot the selection, which creates an extra undo save point, so that\n // when you undo a delete, the expanded selection will be retained.\n editor.snapshotSelection()\n\n const { value } = editor\n const { start, end } = range\n let startKey = start.key\n let startOffset = start.offset\n let endKey = end.key\n let endOffset = end.offset\n let { document } = value\n let isStartVoid = document.hasVoidParent(startKey, editor)\n let isEndVoid = document.hasVoidParent(endKey, editor)\n let startBlock = document.getClosestBlock(startKey)\n let endBlock = document.getClosestBlock(endKey)\n\n // Check if we have a \"hanging\" selection case where the even though the\n // selection extends into the start of the end node, we actually want to\n // ignore that for UX reasons.\n const isHanging =\n startOffset === 0 &&\n endOffset === 0 &&\n isStartVoid === false &&\n startKey === startBlock.getFirstText().key &&\n endKey === endBlock.getFirstText().key &&\n startKey !== endKey\n\n // If it's a hanging selection, nudge it back to end in the previous text.\n if (isHanging && isEndVoid) {\n const prevText = document.getPreviousText(endKey)\n endKey = prevText.key\n endOffset = prevText.text.length\n isEndVoid = document.hasVoidParent(endKey, editor)\n }\n\n editor.withoutNormalizing(() => {\n // If the start node is inside a void node, remove the void node and update\n // the starting point to be right after it, continuously until the start point\n // is not a void, or until the entire range is handled.\n while (isStartVoid) {\n const startVoid = document.getClosestVoid(startKey, editor)\n const nextText = document.getNextText(startKey)\n editor.removeNodeByKey(startVoid.key)\n\n // If the start and end keys are the same, we're done.\n if (startKey === endKey) return\n\n // If there is no next text node, we're done.\n if (!nextText) return\n\n // Continue...\n document = editor.value.document\n startKey = nextText.key\n startOffset = 0\n isStartVoid = document.hasVoidParent(startKey, editor)\n }\n\n // If the end node is inside a void node, do the same thing but backwards. But\n // we don't need any aborting checks because if we've gotten this far there\n // must be a non-void node that will exit the loop.\n while (isEndVoid) {\n const endVoid = document.getClosestVoid(endKey, editor)\n const prevText = document.getPreviousText(endKey)\n editor.removeNodeByKey(endVoid.key)\n\n // Continue...\n document = editor.value.document\n endKey = prevText.key\n endOffset = prevText.text.length\n isEndVoid = document.hasVoidParent(endKey, editor)\n }\n\n // If the start and end key are the same, and it was a hanging selection, we\n // can just remove the entire block.\n if (startKey === endKey && isHanging) {\n editor.removeNodeByKey(startBlock.key)\n return\n } else if (startKey === endKey) {\n // Otherwise, if it wasn't hanging, we're inside a single text node, so we can\n // simply remove the text in the range.\n const index = startOffset\n const length = endOffset - startOffset\n editor.removeTextByKey(startKey, index, length)\n return\n } else {\n // Otherwise, we need to recursively remove text and nodes inside the start\n // block after the start offset and inside the end block before the end\n // offset. Then remove any blocks that are in between the start and end\n // blocks. Then finally merge the start and end nodes.\n startBlock = document.getClosestBlock(startKey)\n endBlock = document.getClosestBlock(endKey)\n const startText = document.getNode(startKey)\n const endText = document.getNode(endKey)\n const startLength = startText.text.length - startOffset\n const endLength = endOffset\n\n const ancestor = document.getCommonAncestor(startKey, endKey)\n const startChild = ancestor.getFurthestChild(startKey)\n const endChild = ancestor.getFurthestChild(endKey)\n\n const startParent = document.getParent(startBlock.key)\n const startParentIndex = startParent.nodes.indexOf(startBlock)\n const endParentIndex = startParent.nodes.indexOf(endBlock)\n\n let child\n\n // Iterate through all of the nodes in the tree after the start text node\n // but inside the end child, and remove them.\n child = startText\n\n while (child.key !== startChild.key) {\n const parent = document.getParent(child.key)\n const index = parent.nodes.indexOf(child)\n const afters = parent.nodes.slice(index + 1)\n\n afters.reverse().forEach(node => {\n editor.removeNodeByKey(node.key)\n })\n\n child = parent\n }\n\n // Remove all of the middle children.\n const startChildIndex = ancestor.nodes.indexOf(startChild)\n const endChildIndex = ancestor.nodes.indexOf(endChild)\n const middles = ancestor.nodes.slice(startChildIndex + 1, endChildIndex)\n\n middles.reverse().forEach(node => {\n editor.removeNodeByKey(node.key)\n })\n\n // Remove the nodes before the end text node in the tree.\n child = endText\n\n while (child.key !== endChild.key) {\n const parent = document.getParent(child.key)\n const index = parent.nodes.indexOf(child)\n const befores = parent.nodes.slice(0, index)\n\n befores.reverse().forEach(node => {\n editor.removeNodeByKey(node.key)\n })\n\n child = parent\n }\n\n // Remove any overlapping text content from the leaf text nodes.\n if (startLength !== 0) {\n editor.removeTextByKey(startKey, startOffset, startLength)\n }\n\n if (endLength !== 0) {\n editor.removeTextByKey(endKey, 0, endOffset)\n }\n\n // If the start and end blocks aren't the same, move and merge the end block\n // into the start block.\n if (startBlock.key !== endBlock.key) {\n document = editor.value.document\n let onlyChildAncestor\n\n for (const [node] of document.ancestors(endBlock.key)) {\n if (node.nodes.size > 1) {\n break\n } else {\n onlyChildAncestor = node\n }\n }\n\n // Move the end block to be right after the start block.\n if (endParentIndex !== startParentIndex + 1) {\n editor.moveNodeByKey(\n endBlock.key,\n startParent.key,\n startParentIndex + 1\n )\n }\n\n // If the selection is hanging, just remove the start block, otherwise\n // merge the end block into it.\n if (isHanging) {\n editor.removeNodeByKey(startBlock.key)\n } else {\n editor.mergeNodeByKey(endBlock.key)\n }\n\n // If nested empty blocks are left over above the end block, remove them.\n if (onlyChildAncestor) {\n editor.removeNodeByKey(onlyChildAncestor.key)\n }\n }\n }\n })\n}\n\n/**\n * Delete backward `n` characters at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Number} n (optional)\n */\n\nCommands.deleteBackwardAtRange = (editor, range, n = 1) => {\n if (n === 0) return\n const { value } = editor\n const { document } = value\n const { start, focus } = range\n\n // If the range is expanded, perform a regular delete instead.\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const voidParent = document.getClosestVoid(start.path, editor)\n\n // If there is a void parent, delete it.\n if (voidParent) {\n editor.removeNodeByKey(voidParent.key)\n return\n }\n\n // If the range is at the start of the document, abort.\n if (start.isAtStartOfNode(document)) {\n return\n }\n\n const block = document.getClosestBlock(start.path)\n\n // PERF: If the closest block is empty, remove it. This is just a shortcut,\n // since merging it would result in the same outcome.\n if (\n document.nodes.size !== 1 &&\n block &&\n block.text === '' &&\n block.nodes.size === 1\n ) {\n editor.removeNodeByKey(block.key)\n return\n }\n\n // If the range is at the start of the text node, we need to figure out what\n // is behind it to know how to delete...\n const text = document.getDescendant(start.path)\n\n if (start.isAtStartOfNode(text)) {\n let prev = document.getPreviousText(text.key)\n const inline = document.getClosestInline(text.key)\n\n // If the range is at the start of the inline node, and previous text node\n // is empty, take the text node before that, or \"prevBlock\" would be the\n // same node as \"block\"\n if (inline && prev.text === '') {\n prev = document.getPreviousText(prev.key)\n }\n\n const prevBlock = document.getClosestBlock(prev.key)\n const prevVoid = document.getClosestVoid(prev.key, editor)\n\n // If the previous text node has a void parent, remove it.\n if (prevVoid) {\n editor.removeNodeByKey(prevVoid.key)\n return\n }\n\n // If we're deleting by one character and the previous text node is not\n // inside the current block, we need to merge the two blocks together.\n if (n === 1 && prevBlock !== block) {\n range = range.moveAnchorTo(prev.key, prev.text.length)\n editor.deleteAtRange(range)\n return\n }\n }\n\n // If the focus offset is farther than the number of characters to delete,\n // just remove the characters backwards inside the current node.\n if (n < focus.offset) {\n range = range.moveFocusBackward(n)\n editor.deleteAtRange(range)\n return\n }\n\n // Otherwise, we need to see how many nodes backwards to go.\n let node = text\n let offset = 0\n let traversed = focus.offset\n\n while (n > traversed) {\n node = document.getPreviousText(node.key)\n const next = traversed + node.text.length\n\n if (n <= next) {\n offset = next - n\n break\n } else {\n traversed = next\n }\n }\n\n range = range.moveAnchorTo(node.key, offset)\n editor.deleteAtRange(range)\n}\n\n/**\n * Delete backward until the character boundary at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nCommands.deleteCharBackwardAtRange = (editor, range) => {\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const startBlock = document.getClosestBlock(start.path)\n const offset = startBlock.getOffset(start.key)\n const o = offset + start.offset\n const { text } = startBlock\n const n = TextUtils.getCharOffsetBackward(text, o)\n editor.deleteBackwardAtRange(range, n)\n}\n\n/**\n * Delete forward until the character boundary at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nCommands.deleteCharForwardAtRange = (editor, range) => {\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const startBlock = document.getClosestBlock(start.path)\n const offset = startBlock.getOffset(start.key)\n const o = offset + start.offset\n const { text } = startBlock\n const n = TextUtils.getCharOffsetForward(text, o)\n editor.deleteForwardAtRange(range, n)\n}\n\n/**\n * Delete forward `n` characters at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Number} n (optional)\n */\n\nCommands.deleteForwardAtRange = (editor, range, n = 1) => {\n if (n === 0) return\n const { value } = editor\n const { document } = value\n const { start, focus } = range\n\n // If the range is expanded, perform a regular delete instead.\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const voidParent = document.getClosestVoid(start.path, editor)\n\n // If the node has a void parent, delete it.\n if (voidParent) {\n editor.removeNodeByKey(voidParent.key)\n return\n }\n\n const block = document.getClosestBlock(start.path)\n\n // If the closest is not void, but empty, remove it\n if (\n block &&\n !editor.isVoid(block) &&\n block.text === '' &&\n document.nodes.size !== 1\n ) {\n const nextBlock = document.getNextBlock(block.key)\n editor.removeNodeByKey(block.key)\n\n if (nextBlock && nextBlock.key) {\n editor.moveToStartOfNode(nextBlock)\n }\n\n return\n }\n\n // If the range is at the start of the document, abort.\n if (start.isAtEndOfNode(document)) {\n return\n }\n\n // If the range is at the start of the text node, we need to figure out what\n // is behind it to know how to delete...\n const text = document.getDescendant(start.path)\n\n if (start.isAtEndOfNode(text)) {\n const next = document.getNextText(text.key)\n const nextBlock = document.getClosestBlock(next.key)\n const nextVoid = document.getClosestVoid(next.key, editor)\n\n // If the next text node has a void parent, remove it.\n if (nextVoid) {\n editor.removeNodeByKey(nextVoid.key)\n return\n }\n\n // If we're deleting by one character and the previous text node is not\n // inside the current block, we need to merge the two blocks together.\n if (n === 1 && nextBlock !== block) {\n range = range.moveFocusTo(next.key, 0)\n editor.deleteAtRange(range)\n return\n }\n }\n\n // If the remaining characters to the end of the node is greater than or equal\n // to the number of characters to delete, just remove the characters forwards\n // inside the current node.\n if (n <= text.text.length - focus.offset) {\n range = range.moveFocusForward(n)\n editor.deleteAtRange(range)\n return\n }\n\n // Otherwise, we need to see how many nodes forwards to go.\n let node = text\n let offset = focus.offset\n let traversed = text.text.length - focus.offset\n\n while (n > traversed) {\n node = document.getNextText(node.key)\n const next = traversed + node.text.length\n\n if (n <= next) {\n offset = n - traversed\n break\n } else {\n traversed = next\n }\n }\n\n range = range.moveFocusTo(node.key, offset)\n editor.deleteAtRange(range)\n}\n\n/**\n * Delete backward until the line boundary at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nCommands.deleteLineBackwardAtRange = (editor, range) => {\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const startBlock = document.getClosestBlock(start.path)\n const offset = startBlock.getOffset(start.key)\n const o = offset + start.offset\n editor.deleteBackwardAtRange(range, o)\n}\n\n/**\n * Delete forward until the line boundary at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nCommands.deleteLineForwardAtRange = (editor, range) => {\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const startBlock = document.getClosestBlock(start.path)\n const offset = startBlock.getOffset(start.key)\n const o = offset + start.offset\n editor.deleteForwardAtRange(range, startBlock.text.length - o)\n}\n\n/**\n * Delete backward until the word boundary at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nCommands.deleteWordBackwardAtRange = (editor, range) => {\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const startBlock = document.getClosestBlock(start.path)\n const offset = startBlock.getOffset(start.key)\n const o = offset + start.offset\n const { text } = startBlock\n const n = o === 0 ? 1 : TextUtils.getWordOffsetBackward(text, o)\n editor.deleteBackwardAtRange(range, n)\n}\n\n/**\n * Delete forward until the word boundary at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nCommands.deleteWordForwardAtRange = (editor, range) => {\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const startBlock = document.getClosestBlock(start.path)\n const offset = startBlock.getOffset(start.key)\n const o = offset + start.offset\n const { text } = startBlock\n const wordOffset = TextUtils.getWordOffsetForward(text, o)\n const n = wordOffset === 0 ? 1 : wordOffset\n editor.deleteForwardAtRange(range, n)\n}\n\n/**\n * Insert a `block` node at `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Block|String|Object} block\n */\n\nCommands.insertBlockAtRange = (editor, range, block) => {\n range = deleteExpandedAtRange(editor, range)\n block = Block.create(block)\n\n const { value } = editor\n const { document } = value\n const { start } = range\n let startKey = start.key\n let startOffset = start.offset\n const startBlock = document.getClosestBlock(startKey)\n const startInline = document.getClosestInline(startKey)\n const parent = document.getParent(startBlock.key)\n const index = parent.nodes.indexOf(startBlock)\n const insertionMode = getInsertionMode(editor, range)\n\n if (insertionMode === 'before') {\n editor.insertNodeByKey(parent.key, index, block)\n } else if (insertionMode === 'behind') {\n editor.insertNodeByKey(parent.key, index + 1, block)\n } else {\n if (startInline && editor.isVoid(startInline)) {\n const atEnd = start.isAtEndOfNode(startInline)\n const siblingText = atEnd\n ? document.getNextText(startKey)\n : document.getPreviousText(startKey)\n\n const splitRange = atEnd\n ? range.moveToStartOfNode(siblingText)\n : range.moveToEndOfNode(siblingText)\n\n startKey = splitRange.start.key\n startOffset = splitRange.start.offset\n }\n\n editor.withoutNormalizing(() => {\n editor.splitDescendantsByKey(startBlock.key, startKey, startOffset)\n editor.insertNodeByKey(parent.key, index + 1, block)\n })\n }\n}\n\n/**\n * Check if current block should be split or new block should be added before or behind it.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nconst getInsertionMode = (editor, range) => {\n const { value } = editor\n const { document } = value\n const { start } = range\n const startKey = start.key\n const startBlock = document.getClosestBlock(startKey)\n const startInline = document.getClosestInline(startKey)\n\n if (editor.isVoid(startBlock)) {\n if (start.isAtEndOfNode(startBlock)) return 'behind'\n else return 'before'\n } else if (!startInline && startBlock.text === '') {\n return 'behind'\n } else if (start.isAtStartOfNode(startBlock)) {\n return 'before'\n } else if (start.isAtEndOfNode(startBlock)) {\n return 'behind'\n }\n return 'split'\n}\n\n/**\n * Insert a `fragment` at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Document} fragment\n */\n\nCommands.insertFragmentAtRange = (editor, range, fragment) => {\n editor.withoutNormalizing(() => {\n range = deleteExpandedAtRange(editor, range)\n\n // If the fragment is empty, there's nothing to do after deleting.\n if (!fragment.nodes.size) return\n\n // Regenerate the keys for all of the fragments nodes, so that they're\n // guaranteed not to collide with the existing keys in the document. Otherwise\n // they will be rengerated automatically and we won't have an easy way to\n // reference them.\n fragment = fragment.mapDescendants(child => child.regenerateKey())\n\n // Calculate a few things...\n const { start } = range\n const { value } = editor\n let { document } = value\n let startText = document.getDescendant(start.path)\n let startBlock = document.getClosestBlock(startText.key)\n let startChild = startBlock.getFurthestChild(startText.key)\n const isAtStart = start.isAtStartOfNode(startBlock)\n const parent = document.getParent(startBlock.key)\n const index = parent.nodes.indexOf(startBlock)\n const blocks = fragment.getBlocks()\n const firstChild = fragment.nodes.first()\n const lastChild = fragment.nodes.last()\n const firstBlock = blocks.first()\n const lastBlock = blocks.last()\n const insertionNode = findInsertionNode(fragment, document, startBlock.key)\n\n // If the fragment only contains a void block, use `insertBlock` instead.\n if (firstBlock === lastBlock && editor.isVoid(firstBlock)) {\n editor.insertBlockAtRange(range, firstBlock)\n return\n }\n\n // If inserting the entire fragment and it starts or ends with a single\n // nested block, e.g. a table, we do not merge it with existing blocks.\n if (\n insertionNode === fragment &&\n (firstChild.hasBlockChildren() || lastChild.hasBlockChildren())\n ) {\n // check if reversal is necessary or not\n const insertionMode = getInsertionMode(editor, range)\n const nodes =\n insertionMode === 'before' ? fragment.nodes : fragment.nodes.reverse()\n\n nodes.forEach(node => {\n editor.insertBlockAtRange(range, node)\n })\n return\n }\n\n // If the first and last block aren't the same, we need to insert all of the\n // nodes after the insertion node's first block at the index.\n if (firstBlock !== lastBlock) {\n const lonelyParent = insertionNode.getFurthest(\n firstBlock.key,\n p => p.nodes.size === 1\n )\n const lonelyChild = lonelyParent || firstBlock\n\n const startIndex = parent.nodes.indexOf(startBlock)\n const excludingLonelyChild = insertionNode.removeNode(lonelyChild.key)\n\n excludingLonelyChild.nodes.forEach((node, i) => {\n const newIndex = startIndex + i + 1\n editor.insertNodeByKey(parent.key, newIndex, node)\n })\n }\n\n // Check if we need to split the node.\n if (start.offset !== 0) {\n editor.splitDescendantsByKey(startChild.key, start.key, start.offset)\n }\n\n // Update our variables with the new value.\n document = editor.value.document\n startText = document.getDescendant(start.key)\n startBlock = document.getClosestBlock(start.key)\n startChild = startBlock.getFurthestChild(startText.key)\n\n // If the first and last block aren't the same, we need to move any of the\n // starting block's children after the split into the last block of the\n // fragment, which has already been inserted.\n if (firstBlock !== lastBlock) {\n const nextChild = isAtStart\n ? startChild\n : startBlock.getNextSibling(startChild.key)\n const nextNodes = nextChild\n ? startBlock.nodes.skipUntil(n => n.key === nextChild.key)\n : List()\n const lastIndex = lastBlock.nodes.size\n\n nextNodes.forEach((node, i) => {\n const newIndex = lastIndex + i\n editor.moveNodeByKey(node.key, lastBlock.key, newIndex)\n })\n }\n\n // If the starting block is empty, we replace it entirely with the first block\n // of the fragment, since this leads to a more expected behavior for the user.\n if (\n !editor.isVoid(startBlock) &&\n startBlock.text === '' &&\n !startBlock.findDescendant(n => editor.isVoid(n))\n ) {\n editor.removeNodeByKey(startBlock.key)\n editor.insertNodeByKey(parent.key, index, firstBlock)\n } else {\n // Otherwise, we maintain the starting block, and insert all of the first\n // block's inline nodes into it at the split point.\n const inlineChild = startBlock.getFurthestChild(startText.key)\n const inlineIndex = startBlock.nodes.indexOf(inlineChild)\n\n firstBlock.nodes.forEach((inline, i) => {\n const o = start.offset === 0 ? 0 : 1\n const newIndex = inlineIndex + i + o\n editor.insertNodeByKey(startBlock.key, newIndex, inline)\n })\n }\n })\n}\n\nconst findInsertionNode = (fragment, document, startKey) => {\n const hasSingleNode = object => {\n if (!object || object.object === 'text') return\n return object.nodes.size === 1\n }\n\n const firstNode = object => object && object.nodes.first()\n let node = fragment\n\n if (hasSingleNode(fragment)) {\n let fragmentInner = firstNode(fragment)\n\n const matches = documentNode => documentNode.type === fragmentInner.type\n let documentInner = document.getFurthest(startKey, matches)\n\n if (documentInner === document.getParent(startKey)) node = fragmentInner\n\n while (hasSingleNode(fragmentInner) && hasSingleNode(documentInner)) {\n fragmentInner = firstNode(fragmentInner)\n documentInner = firstNode(documentInner)\n\n if (fragmentInner.type === documentInner.type) {\n node = fragmentInner\n } else {\n break\n }\n }\n }\n\n return node\n}\n\n/**\n * Insert an `inline` node at `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Inline|String|Object} inline\n */\n\nCommands.insertInlineAtRange = (editor, range, inline) => {\n inline = Inline.create(inline)\n\n editor.withoutNormalizing(() => {\n range = deleteExpandedAtRange(editor, range)\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const parent = document.getParent(start.path)\n const startText = document.assertDescendant(start.path)\n const index = parent.nodes.indexOf(startText)\n\n if (editor.isVoid(parent)) {\n return\n }\n\n editor.splitNodeByPath(start.path, start.offset)\n editor.insertNodeByKey(parent.key, index + 1, inline)\n })\n}\n\n/**\n * Insert `text` at a `range`, with optional `marks`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {String} text\n * @param {Set<Mark>} marks (optional)\n */\n\nCommands.insertTextAtRange = (editor, range, text, marks) => {\n editor.withoutNormalizing(() => {\n range = deleteExpandedAtRange(editor, range)\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const offset = start.offset\n const parent = document.getParent(start.path)\n\n if (editor.isVoid(parent)) {\n return\n }\n\n editor.insertTextByPath(start.path, offset, text, marks)\n })\n}\n\n/**\n * Remove an existing `mark` to the characters at `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Mark|String} mark (optional)\n */\n\nCommands.removeMarkAtRange = (editor, range, mark) => {\n if (range.isCollapsed) return\n\n const { value } = editor\n const { document } = value\n const texts = document.getTextsAtRange(range)\n const { start, end } = range\n\n editor.withoutNormalizing(() => {\n texts.forEach(node => {\n const { key } = node\n let index = 0\n let length = node.text.length\n\n if (key === start.key) index = start.offset\n if (key === end.key) length = end.offset\n if (key === start.key && key === end.key)\n length = end.offset - start.offset\n\n editor.removeMarkByKey(key, index, length, mark)\n })\n })\n}\n\n/**\n * Set the `properties` of block nodes in a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Object|String} properties\n */\n\nCommands.setBlocksAtRange = (editor, range, properties) => {\n const { value } = editor\n const { document } = value\n const blocks = document.getLeafBlocksAtRange(range)\n\n const { start, end, isCollapsed } = range\n const isStartVoid = document.hasVoidParent(start.path, editor)\n const startBlock = document.getClosestBlock(start.path)\n const endBlock = document.getClosestBlock(end.key)\n\n // Check if we have a \"hanging\" selection case where the even though the\n // selection extends into the start of the end node, we actually want to\n // ignore that for UX reasons.\n const isHanging =\n isCollapsed === false &&\n start.offset === 0 &&\n end.offset === 0 &&\n isStartVoid === false &&\n start.key === startBlock.getFirstText().key &&\n end.key === endBlock.getFirstText().key\n\n // If it's a hanging selection, ignore the last block.\n const sets = isHanging ? blocks.slice(0, -1) : blocks\n\n editor.withoutNormalizing(() => {\n sets.forEach(block => {\n editor.setNodeByKey(block.key, properties)\n })\n })\n}\n\n/**\n * Set the `properties` of inline nodes in a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Object|String} properties\n */\n\nCommands.setInlinesAtRange = (editor, range, properties) => {\n const { value } = editor\n const { document } = value\n const inlines = document.getLeafInlinesAtRange(range)\n\n editor.withoutNormalizing(() => {\n inlines.forEach(inline => {\n editor.setNodeByKey(inline.key, properties)\n })\n })\n}\n\n/**\n * Split the block nodes at a `range`, to optional `height`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Number} height (optional)\n */\n\nCommands.splitBlockAtRange = (editor, range, height = 1) => {\n range = deleteExpandedAtRange(editor, range)\n\n const { start, end } = range\n let { value } = editor\n let { document } = value\n let node = document.assertDescendant(start.path)\n let parent = document.getClosestBlock(node.key)\n let h = 0\n\n while (parent && parent.object === 'block' && h < height) {\n node = parent\n parent = document.getClosestBlock(parent.key)\n h++\n }\n\n editor.withoutNormalizing(() => {\n editor.splitDescendantsByKey(node.key, start.path, start.offset)\n\n value = editor.value\n document = value.document\n\n if (range.isExpanded) {\n if (range.isBackward) range = range.flip()\n const nextBlock = document.getNextBlock(node.key)\n range = range.moveAnchorToStartOfNode(nextBlock)\n range = range.setFocus(range.focus.setPath(null))\n\n if (start.path.equals(end.path)) {\n range = range.moveFocusTo(range.anchor.key, end.offset - start.offset)\n }\n\n range = document.resolveRange(range)\n editor.deleteAtRange(range)\n }\n })\n}\n\n/**\n * Split the inline nodes at a `range`, to optional `height`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Number} height (optional)\n */\n\nCommands.splitInlineAtRange = (editor, range, height = Infinity) => {\n range = deleteExpandedAtRange(editor, range)\n\n const { start } = range\n const { value } = editor\n const { document } = value\n let node = document.assertDescendant(start.path)\n let parent = document.getClosestInline(node.key)\n let h = 0\n\n while (parent && parent.object === 'inline' && h < height) {\n node = parent\n parent = document.getClosestInline(parent.key)\n h++\n }\n\n editor.splitDescendantsByKey(node.key, start.path, start.offset)\n}\n\n/**\n * Add or remove a `mark` from the characters at `range`, depending on whether\n * it's already there.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Mixed} mark\n */\n\nCommands.toggleMarkAtRange = (editor, range, mark) => {\n if (range.isCollapsed) return\n\n mark = Mark.create(mark)\n\n const { value } = editor\n const { document } = value\n const marks = document.getActiveMarksAtRange(range)\n const exists = marks.some(m => m.equals(mark))\n\n if (exists) {\n editor.removeMarkAtRange(range, mark)\n } else {\n editor.addMarkAtRange(range, mark)\n }\n}\n\n/**\n * Unwrap all of the block nodes in a `range` from a block with `properties`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {String|Object} properties\n */\n\nCommands.unwrapBlockAtRange = (editor, range, properties) => {\n properties = Node.createProperties(properties)\n\n const { value } = editor\n let { document } = value\n const blocks = document.getLeafBlocksAtRange(range)\n const wrappers = blocks\n .map(block => {\n return document.getClosest(block.key, parent => {\n if (parent.object !== 'block') return false\n if (properties.type != null && parent.type !== properties.type)\n return false\n if (properties.data != null && !parent.data.isSuperset(properties.data))\n return false\n return true\n })\n })\n .filter(exists => exists)\n .toOrderedSet()\n .toList()\n\n editor.withoutNormalizing(() => {\n wrappers.forEach(block => {\n const first = block.nodes.first()\n const last = block.nodes.last()\n const parent = editor.value.document.getParent(block.key)\n const index = parent.nodes.indexOf(block)\n\n const children = block.nodes.filter(child => {\n return blocks.some(b => child === b || child.hasDescendant(b.key))\n })\n\n const firstMatch = children.first()\n const lastMatch = children.last()\n\n if (first === firstMatch && last === lastMatch) {\n block.nodes.forEach((child, i) => {\n editor.moveNodeByKey(child.key, parent.key, index + i)\n })\n\n editor.removeNodeByKey(block.key)\n } else if (last === lastMatch) {\n block.nodes.skipUntil(n => n === firstMatch).forEach((child, i) => {\n editor.moveNodeByKey(child.key, parent.key, index + 1 + i)\n })\n } else if (first === firstMatch) {\n block.nodes\n .takeUntil(n => n === lastMatch)\n .push(lastMatch)\n .forEach((child, i) => {\n editor.moveNodeByKey(child.key, parent.key, index + i)\n })\n } else {\n const firstText = firstMatch.getFirstText()\n\n editor.splitDescendantsByKey(block.key, firstText.key, 0)\n\n document = editor.value.document\n\n children.forEach((child, i) => {\n if (i === 0) {\n const extra = child\n child = document.getNextBlock(child.key)\n editor.removeNodeByKey(extra.key)\n }\n\n editor.moveNodeByKey(child.key, parent.key, index + 1 + i)\n })\n }\n })\n })\n}\n\n/**\n * Unwrap the inline nodes in a `range` from an inline with `properties`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {String|Object} properties\n */\n\nCommands.unwrapInlineAtRange = (editor, range, properties) => {\n properties = Node.createProperties(properties)\n\n const { value } = editor\n const { document } = value\n const texts = document.getTextsAtRange(range)\n const inlines = texts\n .map(text => {\n return document.getClosest(text.key, parent => {\n if (parent.object !== 'inline') return false\n if (properties.type != null && parent.type !== properties.type)\n return false\n if (properties.data != null && !parent.data.isSuperset(properties.data))\n return false\n return true\n })\n })\n .filter(exists => exists)\n .toOrderedSet()\n .toList()\n\n editor.withoutNormalizing(() => {\n inlines.forEach(inline => {\n const parent = editor.value.document.getParent(inline.key)\n const index = parent.nodes.indexOf(inline)\n\n inline.nodes.forEach((child, i) => {\n editor.moveNodeByKey(child.key, parent.key, index + i)\n })\n\n editor.removeNodeByKey(inline.key)\n })\n })\n}\n\n/**\n * Wrap all of the blocks in a `range` in a new `block`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Block|Object|String} block\n */\n\nCommands.wrapBlockAtRange = (editor, range, block) => {\n block = Block.create(block)\n block = block.set('nodes', block.nodes.clear())\n\n const { value } = editor\n const { document } = value\n\n const blocks = document.getLeafBlocksAtRange(range)\n const firstblock = blocks.first()\n const lastblock = blocks.last()\n let parent, siblings, index\n\n // If there is only one block in the selection then we know the parent and\n // siblings.\n if (blocks.length === 1) {\n parent = document.getParent(firstblock.key)\n siblings = blocks\n } else {\n // Determine closest shared parent to all blocks in selection.\n parent = document.getClosest(firstblock.key, p1 => {\n return !!document.getClosest(lastblock.key, p2 => p1 === p2)\n })\n }\n\n // If no shared parent could be found then the parent is the document.\n if (parent == null) parent = document\n\n // Create a list of direct children siblings of parent that fall in the\n // selection.\n if (siblings == null) {\n const indexes = parent.nodes.reduce((ind, node, i) => {\n if (node === firstblock || node.hasDescendant(firstblock.key)) ind[0] = i\n if (node === lastblock || node.hasDescendant(lastblock.key)) ind[1] = i\n return ind\n }, [])\n\n index = indexes[0]\n siblings = parent.nodes.slice(indexes[0], indexes[1] + 1)\n }\n\n // Get the index to place the new wrapped node at.\n if (index == null) {\n index = parent.nodes.indexOf(siblings.first())\n }\n\n editor.withoutNormalizing(() => {\n // Inject the new block node into the parent.\n editor.insertNodeByKey(parent.key, index, block)\n\n // Move the sibling nodes into the new block node.\n siblings.forEach((node, i) => {\n editor.moveNodeByKey(node.key, block.key, i)\n })\n })\n}\n\n/**\n * Wrap the text and inlines in a `range` in a new `inline`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Inline|Object|String} inline\n */\n\nCommands.wrapInlineAtRange = (editor, range, inline) => {\n const { value } = editor\n let { document } = value\n const { start, end } = range\n\n if (range.isCollapsed) {\n // Wrapping an inline void\n const inlineParent = document.getClosestInline(start.path)\n\n if (!inlineParent) {\n return\n }\n\n if (!editor.isVoid(inlineParent)) {\n return\n }\n\n return editor.wrapInlineByKey(inlineParent.key, inline)\n }\n\n inline = Inline.create(inline)\n inline = inline.set('nodes', inline.nodes.clear())\n\n const blocks = document.getLeafBlocksAtRange(range)\n let startBlock = document.getClosestBlock(start.path)\n let endBlock = document.getClosestBlock(end.path)\n const startInline = document.getClosestInline(start.path)\n const endInline = document.getClosestInline(end.path)\n let startChild = startBlock.getFurthestChild(start.key)\n let endChild = endBlock.getFurthestChild(end.key)\n\n editor.withoutNormalizing(() => {\n if (!startInline || startInline !== endInline) {\n editor.splitDescendantsByKey(endChild.key, end.key, end.offset)\n editor.splitDescendantsByKey(startChild.key, start.key, start.offset)\n }\n\n document = editor.value.document\n startBlock = document.getDescendant(startBlock.key)\n endBlock = document.getDescendant(endBlock.key)\n startChild = startBlock.getFurthestChild(start.key)\n endChild = endBlock.getFurthestChild(end.key)\n const startIndex = startBlock.nodes.indexOf(startChild)\n const endIndex = endBlock.nodes.indexOf(endChild)\n\n if (startInline && startInline === endInline) {\n const texts = startBlock.getTextsAtRange(range).map(text => {\n if (start.key === text.key && end.key === text.key) {\n return text\n .splitText(start.offset)[1]\n .splitText(end.offset - start.offset)[0]\n .regenerateKey()\n } else if (start.key === text.key) {\n return text.splitText(start.offset)[1].regenerateKey()\n } else if (end.key === text.key) {\n return text.splitText(end.offset)[0].regenerateKey()\n } else {\n return text.regenerateKey()\n }\n })\n\n inline = inline.set('nodes', texts)\n editor.insertInlineAtRange(range, inline)\n } else if (startBlock === endBlock) {\n document = editor.value.document\n startBlock = document.getClosestBlock(start.key)\n startChild = startBlock.getFurthestChild(start.key)\n\n const startInner = document.getNextSibling(startChild.key)\n const startInnerIndex = startBlock.nodes.indexOf(startInner)\n const endInner =\n start.key === end.key\n ? startInner\n : startBlock.getFurthestChild(end.key)\n const inlines = startBlock.nodes\n .skipUntil(n => n === startInner)\n .takeUntil(n => n === endInner)\n .push(endInner)\n\n const node = inline.regenerateKey()\n\n editor.insertNodeByKey(startBlock.key, startInnerIndex, node)\n\n inlines.forEach((child, i) => {\n editor.moveNodeByKey(child.key, node.key, i)\n })\n } else {\n const startInlines = startBlock.nodes.slice(startIndex + 1)\n const endInlines = endBlock.nodes.slice(0, endIndex + 1)\n const startNode = inline.regenerateKey()\n const endNode = inline.regenerateKey()\n\n editor.insertNodeByKey(startBlock.key, startIndex + 1, startNode)\n editor.insertNodeByKey(endBlock.key, endIndex, endNode)\n\n startInlines.forEach((child, i) => {\n editor.moveNodeByKey(child.key, startNode.key, i)\n })\n\n endInlines.forEach((child, i) => {\n editor.moveNodeByKey(child.key, endNode.key, i)\n })\n\n blocks.slice(1, -1).forEach(block => {\n const node = inline.regenerateKey()\n editor.insertNodeByKey(block.key, 0, node)\n\n block.nodes.forEach((child, i) => {\n editor.moveNodeByKey(child.key, node.key, i)\n })\n })\n }\n })\n}\n\n/**\n * Wrap the text in a `range` in a prefix/suffix.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {String} prefix\n * @param {String} suffix (optional)\n */\n\nCommands.wrapTextAtRange = (editor, range, prefix, suffix = prefix) => {\n const { start, end } = range\n const startRange = range.moveToStart()\n let endRange = range.moveToEnd()\n\n if (start.path.equals(end.path)) {\n endRange = endRange.moveForward(prefix.length)\n }\n\n editor.withoutNormalizing(() => {\n editor.insertTextAtRange(startRange, prefix)\n editor.insertTextAtRange(endRange, suffix)\n })\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default Commands\n","import pick from 'lodash/pick'\nimport Block from '../models/block'\nimport Inline from '../models/inline'\nimport Mark from '../models/mark'\nimport Node from '../models/node'\nimport PathUtils from '../utils/path-utils'\n\n/**\n * Commands.\n *\n * @type {Object}\n */\n\nconst Commands = {}\n\n/**\n * Add mark to text at `offset` and `length` in node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} offset\n * @param {Number} length\n * @param {Mixed} mark\n */\n\nCommands.addMarkByPath = (editor, path, offset, length, mark) => {\n mark = Mark.create(mark)\n editor.addMarksByPath(path, offset, length, [mark])\n}\n\nCommands.addMarksByPath = (editor, path, offset, length, marks) => {\n marks = Mark.createSet(marks)\n\n if (!marks.size) {\n return\n }\n\n const { value } = editor\n const { document } = value\n const node = document.assertNode(path)\n\n editor.withoutNormalizing(() => {\n // If it ends before the end of the node, we'll need to split to create a new\n // text with different marks.\n if (offset + length < node.text.length) {\n editor.splitNodeByPath(path, offset + length)\n }\n\n // Same thing if it starts after the start. But in that case, we need to\n // update our path and offset to point to the new start.\n if (offset > 0) {\n editor.splitNodeByPath(path, offset)\n path = PathUtils.increment(path)\n offset = 0\n }\n\n marks.forEach(mark => {\n editor.applyOperation({\n type: 'add_mark',\n path,\n mark: Mark.create(mark),\n })\n })\n })\n}\n\n/**\n * Insert a `fragment` at `index` in a node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} index\n * @param {Fragment} fragment\n */\n\nCommands.insertFragmentByPath = (editor, path, index, fragment) => {\n fragment.nodes.forEach((node, i) => {\n editor.insertNodeByPath(path, index + i, node)\n })\n}\n\n/**\n * Insert a `node` at `index` in a node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} index\n * @param {Node} node\n */\n\nCommands.insertNodeByPath = (editor, path, index, node) => {\n editor.applyOperation({\n type: 'insert_node',\n path: path.concat(index),\n node,\n })\n}\n\n/**\n * Insert `text` at `offset` in node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} offset\n * @param {String} text\n * @param {Set<Mark>} marks (optional)\n */\n\nCommands.insertTextByPath = (editor, path, offset, text, marks) => {\n marks = Mark.createSet(marks)\n const { value } = editor\n const { annotations, document } = value\n document.assertNode(path)\n\n editor.withoutNormalizing(() => {\n for (const annotation of annotations.values()) {\n const { start, end } = annotation\n const isAtomic = editor.isAtomic(annotation)\n\n if (!isAtomic) {\n continue\n }\n\n if (!start.path.equals(path)) {\n continue\n }\n\n if (\n start.offset < offset &&\n (!end.path.equals(path) || end.offset > offset)\n ) {\n editor.removeAnnotation(annotation)\n }\n }\n\n editor.applyOperation({\n type: 'insert_text',\n path,\n offset,\n text,\n })\n\n if (marks.size) {\n editor.addMarksByPath(path, offset, text.length, marks)\n }\n })\n}\n\n/**\n * Merge a node by `path` with the previous node.\n *\n * @param {Editor} editor\n * @param {Array} path\n */\n\nCommands.mergeNodeByPath = (editor, path) => {\n const { value } = editor\n const { document } = value\n const original = document.getDescendant(path)\n const previous = document.getPreviousSibling(path)\n\n if (!previous) {\n throw new Error(\n `Unable to merge node with path \"${path}\", because it has no previous sibling.`\n )\n }\n\n const position =\n previous.object === 'text' ? previous.text.length : previous.nodes.size\n\n editor.applyOperation({\n type: 'merge_node',\n path,\n position,\n // for undos to succeed we only need the type and data because\n // these are the only properties that get changed in the merge operation\n properties: {\n type: original.type,\n data: original.data,\n },\n target: null,\n })\n}\n\n/**\n * Move a node by `path` to a new parent by `newParentPath` and `newIndex`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {String} newParentPath\n * @param {Number} newIndex\n */\n\nCommands.moveNodeByPath = (editor, path, newParentPath, newIndex) => {\n // If the operation path and newParentPath are the same,\n // this should be considered a NOOP\n if (PathUtils.isEqual(path, newParentPath)) {\n return editor\n }\n\n const newPath = newParentPath.concat(newIndex)\n\n if (PathUtils.isEqual(path, newPath)) {\n return editor\n }\n\n editor.applyOperation({\n type: 'move_node',\n path,\n newPath,\n })\n}\n\n/**\n * Remove mark from text at `offset` and `length` in node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} offset\n * @param {Number} length\n * @param {Mark} mark\n */\n\nCommands.removeMarkByPath = (editor, path, offset, length, mark) => {\n mark = Mark.create(mark)\n editor.removeMarksByPath(path, offset, length, [mark])\n}\n\nCommands.removeMarksByPath = (editor, path, offset, length, marks) => {\n marks = Mark.createSet(marks)\n\n if (!marks.size) {\n return\n }\n\n const { value } = editor\n const { document } = value\n const node = document.assertNode(path)\n\n editor.withoutNormalizing(() => {\n // If it ends before the end of the node, we'll need to split to create a new\n // text with different marks.\n if (offset + length < node.text.length) {\n editor.splitNodeByPath(path, offset + length)\n }\n\n // Same thing if it starts after the start. But in that case, we need to\n // update our path and offset to point to the new start.\n if (offset > 0) {\n editor.splitNodeByPath(path, offset)\n path = PathUtils.increment(path)\n offset = 0\n }\n\n marks.forEach(mark => {\n editor.applyOperation({\n type: 'remove_mark',\n path,\n offset,\n length,\n mark,\n })\n })\n })\n}\n\n/**\n * Remove all `marks` from node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n */\n\nCommands.removeAllMarksByPath = (editor, path) => {\n const { state } = editor\n const { document } = state\n const node = document.assertNode(path)\n\n editor.withoutNormalizing(() => {\n if (node.object === 'text') {\n editor.removeMarksByPath(path, 0, node.text.length, node.marks)\n return\n }\n\n for (const [n, p] of node.texts()) {\n const pth = path.concat(p)\n editor.removeMarksByPath(pth, 0, n.text.length, n.marks)\n }\n })\n}\n\n/**\n * Remove a node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n */\n\nCommands.removeNodeByPath = (editor, path) => {\n const { value } = editor\n const { document } = value\n const node = document.assertNode(path)\n\n editor.applyOperation({\n type: 'remove_node',\n path,\n node,\n })\n}\n\n/**\n * Remove text at `offset` and `length` in node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} offset\n * @param {Number} length\n */\n\nCommands.removeTextByPath = (editor, path, offset, length) => {\n const { value } = editor\n const { document, annotations } = value\n const node = document.assertNode(path)\n const text = node.text.slice(offset, offset + length)\n\n editor.withoutNormalizing(() => {\n for (const annotation of annotations.values()) {\n const { start, end } = annotation\n const isAtomic = editor.isAtomic(annotation)\n\n if (!isAtomic) {\n continue\n }\n\n if (!start.path.equals(path)) {\n continue\n }\n\n if (\n start.offset < offset &&\n (!end.path.equals(path) || end.offset > offset)\n ) {\n editor.removeAnnotation(annotation)\n }\n }\n\n editor.applyOperation({\n type: 'remove_text',\n path,\n offset,\n text,\n })\n })\n}\n\n/**\n`* Replace a `node` with another `node`\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Object|Node} node\n */\n\nCommands.replaceNodeByPath = (editor, path, newNode) => {\n newNode = Node.create(newNode)\n const index = path.last()\n const parentPath = PathUtils.lift(path)\n\n editor.withoutNormalizing(() => {\n editor.removeNodeByPath(path)\n editor.insertNodeByPath(parentPath, index, newNode)\n })\n}\n\n/**\n * Replace a `length` of text at `offset` with new `text` and optional `marks`.\n *\n * @param {Editor} editor\n * @param {String} key\n * @param {Number} offset\n * @param {Number} length\n * @param {string} text\n * @param {Set<Mark>} marks (optional)\n */\n\nCommands.replaceTextByPath = (editor, path, offset, length, text, marks) => {\n editor.withoutNormalizing(() => {\n editor.removeTextByPath(path, offset, length)\n editor.insertTextByPath(path, offset, text, marks)\n })\n}\n\n/**\n * Set `newProperties` on mark on text at `offset` and `length` in node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} offset\n * @param {Number} length\n * @param {Object|Mark} properties\n * @param {Object} newProperties\n */\n\nCommands.setMarkByPath = (\n editor,\n path,\n offset,\n length,\n properties,\n newProperties\n) => {\n properties = Mark.create(properties)\n newProperties = Mark.createProperties(newProperties)\n\n const { value } = editor\n const { document } = value\n const node = document.assertNode(path)\n\n editor.withoutNormalizing(() => {\n // If it ends before the end of the node, we'll need to split to create a new\n // text with different marks.\n if (offset + length < node.text.length) {\n editor.splitNodeByPath(path, offset + length)\n }\n\n // Same thing if it starts after the start. But in that case, we need to\n // update our path and offset to point to the new start.\n if (offset > 0) {\n editor.splitNodeByPath(path, offset)\n path = PathUtils.increment(path)\n offset = 0\n }\n\n editor.applyOperation({\n type: 'set_mark',\n path,\n properties,\n newProperties,\n })\n })\n}\n\n/**\n * Set `properties` on a node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Object|String} newProperties\n */\n\nCommands.setNodeByPath = (editor, path, newProperties) => {\n const { value } = editor\n const { document } = value\n const node = document.assertNode(path)\n newProperties = Node.createProperties(newProperties)\n const prevProperties = pick(node, Object.keys(newProperties))\n\n editor.applyOperation({\n type: 'set_node',\n path,\n properties: prevProperties,\n newProperties,\n })\n}\n\n/**\n * Insert `text` at `offset` in node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {String} text\n * @param {Set<Mark>} marks (optional)\n */\n\nCommands.setTextByPath = (editor, path, text, marks) => {\n const { value } = editor\n const { document } = value\n const node = document.assertNode(path)\n const end = node.text.length\n editor.replaceTextByPath(path, 0, end, text, marks)\n}\n\n/**\n * Split a node by `path` at `position`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} position\n * @param {Object} options\n */\n\nCommands.splitNodeByPath = (editor, path, position, options = {}) => {\n const { target = null } = options\n const { value } = editor\n const { document } = value\n const node = document.getDescendant(path)\n\n editor.applyOperation({\n type: 'split_node',\n path,\n position,\n target,\n properties: {\n type: node.type,\n data: node.data,\n },\n })\n}\n\n/**\n * Split a node deeply down the tree by `path`, `textPath` and `textOffset`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Array} textPath\n * @param {Number} textOffset\n */\n\nCommands.splitDescendantsByPath = (editor, path, textPath, textOffset) => {\n if (path.equals(textPath)) {\n editor.splitNodeByPath(textPath, textOffset)\n return\n }\n\n const { value } = editor\n const { document } = value\n let index = textOffset\n let lastPath = textPath\n\n editor.withoutNormalizing(() => {\n editor.splitNodeByKey(textPath, textOffset)\n\n for (const [, ancestorPath] of document.ancestors(textPath)) {\n const target = index\n index = lastPath.last() + 1\n lastPath = ancestorPath\n editor.splitNodeByPath(ancestorPath, index, { target })\n\n if (ancestorPath.equals(path)) {\n break\n }\n }\n })\n}\n\n/**\n * Unwrap content from an inline parent with `properties`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Object|String} properties\n */\n\nCommands.unwrapInlineByPath = (editor, path, properties) => {\n const { value } = editor\n const { document, selection } = value\n const node = document.assertNode(path)\n const first = node.getFirstText()\n const last = node.getLastText()\n const range = selection.moveToRangeOfNode(first, last)\n editor.unwrapInlineAtRange(range, properties)\n}\n\n/**\n * Unwrap content from a block parent with `properties`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Object|String} properties\n */\n\nCommands.unwrapBlockByPath = (editor, path, properties) => {\n const { value } = editor\n const { document, selection } = value\n const node = document.assertNode(path)\n const first = node.getFirstText()\n const last = node.getLastText()\n const range = selection.moveToRangeOfNode(first, last)\n editor.unwrapBlockAtRange(range, properties)\n}\n\n/**\n * Unwrap a single node from its parent.\n *\n * If the node is surrounded with siblings, its parent will be\n * split. If the node is the only child, the parent is removed, and\n * simply replaced by the node itself. Cannot unwrap a root node.\n *\n * @param {Editor} editor\n * @param {Array} path\n */\n\nCommands.unwrapNodeByPath = (editor, path) => {\n const { value } = editor\n const { document } = value\n document.assertNode(path)\n\n const parentPath = PathUtils.lift(path)\n const parent = document.assertNode(parentPath)\n const index = path.last()\n const parentIndex = parentPath.last()\n const grandPath = PathUtils.lift(parentPath)\n const isFirst = index === 0\n const isLast = index === parent.nodes.size - 1\n\n editor.withoutNormalizing(() => {\n if (parent.nodes.size === 1) {\n editor.moveNodeByPath(path, grandPath, parentIndex + 1)\n editor.removeNodeByPath(parentPath)\n } else if (isFirst) {\n editor.moveNodeByPath(path, grandPath, parentIndex)\n } else if (isLast) {\n editor.moveNodeByPath(path, grandPath, parentIndex + 1)\n } else {\n let updatedPath = PathUtils.increment(path, 1, parentPath.size - 1)\n updatedPath = updatedPath.set(updatedPath.size - 1, 0)\n editor.splitNodeByPath(parentPath, index)\n editor.moveNodeByPath(updatedPath, grandPath, parentIndex + 1)\n }\n })\n}\n\n/**\n * Unwrap all of the children of a node, by removing the node and replacing it\n * with the children in the tree.\n *\n * @param {Editor} editor\n * @param {Array} path\n */\n\nCommands.unwrapChildrenByPath = (editor, path) => {\n path = PathUtils.create(path)\n const { value } = editor\n const { document } = value\n const node = document.assertNode(path)\n const parentPath = PathUtils.lift(path)\n const index = path.last()\n const { nodes } = node\n\n editor.withoutNormalizing(() => {\n nodes.reverse().forEach((child, i) => {\n const childIndex = nodes.size - i - 1\n const childPath = path.push(childIndex)\n editor.moveNodeByPath(childPath, parentPath, index + 1)\n })\n\n editor.removeNodeByPath(path)\n })\n}\n\n/**\n * Wrap a node in a block with `properties`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Block|Object|String} block\n */\n\nCommands.wrapBlockByPath = (editor, path, block) => {\n block = Block.create(block)\n block = block.set('nodes', block.nodes.clear())\n const parentPath = PathUtils.lift(path)\n const index = path.last()\n const newPath = PathUtils.increment(path)\n\n editor.withoutNormalizing(() => {\n editor.insertNodeByPath(parentPath, index, block)\n editor.moveNodeByPath(newPath, path, 0)\n })\n}\n\n/**\n * Wrap a node in an inline with `properties`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Block|Object|String} inline\n */\n\nCommands.wrapInlineByPath = (editor, path, inline) => {\n inline = Inline.create(inline)\n inline = inline.set('nodes', inline.nodes.clear())\n const parentPath = PathUtils.lift(path)\n const index = path.last()\n const newPath = PathUtils.increment(path)\n\n editor.withoutNormalizing(() => {\n editor.insertNodeByPath(parentPath, index, inline)\n editor.moveNodeByPath(newPath, path, 0)\n })\n}\n\n/**\n * Wrap a node by `path` with `node`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Node|Object} node\n */\n\nCommands.wrapNodeByPath = (editor, path, node) => {\n node = Node.create(node)\n\n if (node.object === 'block') {\n editor.wrapBlockByPath(path, node)\n } else if (node.object === 'inline') {\n editor.wrapInlineByPath(path, node)\n }\n}\n\n/**\n * Mix in `*ByKey` variants.\n */\n\nconst COMMANDS = [\n 'addMark',\n 'insertFragment',\n 'insertNode',\n 'insertText',\n 'mergeNode',\n 'removeAllMarks',\n 'removeMark',\n 'removeNode',\n 'removeText',\n 'replaceNode',\n 'replaceText',\n 'setMark',\n 'setNode',\n 'setText',\n 'splitNode',\n 'unwrapBlock',\n 'unwrapChildren',\n 'unwrapInline',\n 'unwrapNode',\n 'wrapBlock',\n 'wrapInline',\n 'wrapNode',\n]\n\nfor (const method of COMMANDS) {\n Commands[`${method}ByKey`] = (editor, key, ...args) => {\n const { value } = editor\n const { document } = value\n const path = document.assertPath(key)\n editor[`${method}ByPath`](path, ...args)\n }\n}\n\n// Moving nodes takes two keys, so it's slightly different.\nCommands.moveNodeByKey = (editor, key, newKey, ...args) => {\n const { value } = editor\n const { document } = value\n const path = document.assertPath(key)\n const newPath = document.assertPath(newKey)\n editor.moveNodeByPath(path, newPath, ...args)\n}\n\n// Splitting descendants takes two keys, so it's slightly different.\nCommands.splitDescendantsByKey = (editor, key, textKey, ...args) => {\n const { value } = editor\n const { document } = value\n const path = document.assertPath(key)\n const textPath = document.assertPath(textKey)\n editor.splitDescendantsByPath(path, textPath, ...args)\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default Commands\n","import omit from 'lodash/omit'\nimport { List } from 'immutable'\n\n/**\n * Commands.\n *\n * @type {Object}\n */\n\nconst Commands = {}\n\n/**\n * Save an `operation` into the history.\n *\n * @param {Editor} editor\n * @param {Object} operation\n */\n\nCommands.save = (editor, operation) => {\n const { operations, value } = editor\n const { data } = value\n let { save, merge } = editor.tmp\n if (save === false) return\n\n let undos = data.get('undos') || List()\n const lastBatch = undos.last()\n const lastOperation = lastBatch && lastBatch.last()\n\n // If `merge` is non-commital, and this is not the first operation in a new\n // editor, then merge, otherwise merge based on the last operation.\n if (merge == null) {\n if (operations.size !== 0) {\n merge = true\n } else {\n merge = shouldMerge(operation, lastOperation)\n }\n }\n\n // If the `merge` flag is true, add the operation to the last batch.\n if (merge && lastBatch) {\n const batch = lastBatch.push(operation)\n undos = undos.pop()\n undos = undos.push(batch)\n } else {\n // Otherwise, create a new batch with the operation.\n const batch = List([operation])\n undos = undos.push(batch)\n }\n\n // Constrain the history to 100 entries for memory's sake.\n if (undos.size > 100) {\n undos = undos.takeLast(100)\n }\n\n // Clear the redos and update the history.\n editor.withoutSaving(() => {\n const redos = List()\n const newData = data.set('undos', undos).set('redos', redos)\n editor.setData(newData)\n })\n}\n\n/**\n * Redo to the next value in the history.\n *\n * @param {Editor} editor\n */\n\nCommands.redo = editor => {\n const { value } = editor\n const { data } = value\n let redos = data.get('redos') || List()\n let undos = data.get('undos') || List()\n const batch = redos.last()\n if (!batch) return\n\n editor.withoutSaving(() => {\n editor.withoutNormalizing(() => {\n // Replay the batch of operations.\n batch.forEach(op => {\n const { type, properties } = op\n\n // When the operation mutates the selection, omit its `isFocused` value to\n // prevent the editor focus from changing during redoing.\n if (type === 'set_selection') {\n op = op.set('properties', omit(properties, 'isFocused'))\n }\n\n editor.applyOperation(op)\n })\n\n // Shift the next value into the undo stack.\n redos = redos.pop()\n undos = undos.push(batch)\n const newData = data.set('undos', undos).set('redos', redos)\n editor.setData(newData)\n })\n })\n}\n\n/**\n * Undo the previous operations in the history.\n *\n * @param {Editor} editor\n */\n\nCommands.undo = editor => {\n const { value } = editor\n const { data } = value\n let redos = data.get('redos') || List()\n let undos = data.get('undos') || List()\n const batch = undos.last()\n if (!batch) return\n\n editor.withoutSaving(() => {\n editor.withoutNormalizing(() => {\n // Replay the inverse of the previous operations.\n batch\n .slice()\n .reverse()\n .map(op => op.invert())\n .forEach(inverse => {\n const { type, properties } = inverse\n\n // When the operation mutates the selection, omit its `isFocused` value to\n // prevent the editor focus from changing during undoing.\n if (type === 'set_selection') {\n inverse = inverse.set('properties', omit(properties, 'isFocused'))\n }\n\n editor.applyOperation(inverse)\n })\n\n // Shift the previous operations into the redo stack.\n redos = redos.push(batch)\n undos = undos.pop()\n const newData = data.set('undos', undos).set('redos', redos)\n editor.setData(newData)\n })\n })\n}\n\n/**\n * Apply a series of changes inside a synchronous `fn`, without merging any of\n * the new operations into previous save point in the history.\n *\n * @param {Editor} editor\n * @param {Function} fn\n */\n\nCommands.withoutMerging = (editor, fn) => {\n const value = editor.tmp.merge\n editor.tmp.merge = false\n fn(editor)\n editor.tmp.merge = value\n}\n\n/**\n * Apply a series of changes inside a synchronous `fn`, without saving any of\n * their operations into the history.\n *\n * @param {Editor} editor\n * @param {Function} fn\n */\n\nCommands.withoutSaving = (editor, fn) => {\n const value = editor.tmp.save\n editor.tmp.save = false\n fn(editor)\n editor.tmp.save = value\n}\n\n/**\n * Check whether to merge a new operation `o` into the previous operation `p`.\n *\n * @param {Object} o\n * @param {Object} p\n * @return {Boolean}\n */\n\nfunction shouldMerge(o, p) {\n if (!p) return false\n\n const merge =\n (o.type === 'set_selection' && p.type === 'set_selection') ||\n (o.type === 'insert_text' &&\n p.type === 'insert_text' &&\n o.offset === p.offset + p.text.length &&\n o.path.equals(p.path)) ||\n (o.type === 'remove_text' &&\n p.type === 'remove_text' &&\n o.offset + o.text.length === p.offset &&\n o.path.equals(p.path))\n\n return merge\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default Commands\n","import { is } from 'immutable'\nimport pick from 'lodash/pick'\n\nimport Selection from '../models/selection'\nimport TextUtils from '../utils/text-utils'\n\nconst Commands = {}\n\nCommands.blur = editor => {\n editor.select({ isFocused: false })\n}\n\nCommands.deselect = editor => {\n const range = Selection.create()\n editor.select(range)\n}\n\nCommands.focus = editor => {\n editor.select({ isFocused: true })\n}\n\nCommands.flip = editor => {\n editor.command(proxy, 'flip')\n}\n\nCommands.moveAnchorBackward = (editor, ...args) => {\n editor.command(pointBackward, 'anchor', ...args)\n}\n\nCommands.moveAnchorWordBackward = (editor, ...args) => {\n editor.command(pointWordBackward, 'anchor', ...args)\n}\n\nCommands.moveAnchorForward = (editor, ...args) => {\n editor.command(pointForward, 'anchor', ...args)\n}\n\nCommands.moveAnchorWordForward = (editor, ...args) => {\n editor.command(pointWordForward, 'anchor', ...args)\n}\n\nCommands.moveAnchorTo = (editor, ...args) => {\n editor.command(proxy, 'moveAnchorTo', ...args)\n}\n\nCommands.moveAnchorToEndOfBlock = editor => {\n editor.command(pointEdgeObject, 'anchor', 'end', 'block')\n}\n\nCommands.moveAnchorToEndOfInline = editor => {\n editor.command(pointEdgeObject, 'anchor', 'end', 'inline')\n}\n\nCommands.moveAnchorToEndOfDocument = editor => {\n editor.moveAnchorToEndOfNode(editor.value.document).moveToAnchor()\n}\n\nCommands.moveAnchorToEndOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'end', 'next', 'block')\n}\n\nCommands.moveAnchorToEndOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'end', 'next', 'inline')\n}\n\nCommands.moveAnchorToEndOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'end', 'next', 'text')\n}\n\nCommands.moveAnchorToEndOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveAnchorToEndOfNode', ...args)\n}\n\nCommands.moveAnchorToEndOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'end', 'previous', 'block')\n}\n\nCommands.moveAnchorToEndOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'end', 'previous', 'inline')\n}\n\nCommands.moveAnchorToEndOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'end', 'previous', 'text')\n}\n\nCommands.moveAnchorToEndOfText = editor => {\n editor.command(pointEdgeObject, 'anchor', 'end', 'text')\n}\n\nCommands.moveAnchorToStartOfBlock = editor => {\n editor.command(pointEdgeObject, 'anchor', 'start', 'block')\n}\n\nCommands.moveAnchorToStartOfDocument = editor => {\n editor.moveAnchorToStartOfNode(editor.value.document).moveToAnchor()\n}\n\nCommands.moveAnchorToStartOfInline = editor => {\n editor.command(pointEdgeObject, 'anchor', 'start', 'inline')\n}\n\nCommands.moveAnchorToStartOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'start', 'next', 'block')\n}\n\nCommands.moveAnchorToStartOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'start', 'next', 'inline')\n}\n\nCommands.moveAnchorToStartOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'start', 'next', 'text')\n}\n\nCommands.moveAnchorToStartOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveAnchorToStartOfNode', ...args)\n}\n\nCommands.moveAnchorToStartOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'start', 'previous', 'block')\n}\n\nCommands.moveAnchorToStartOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'start', 'previous', 'inline')\n}\n\nCommands.moveAnchorToStartOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'start', 'previous', 'text')\n}\n\nCommands.moveAnchorToStartOfText = editor => {\n editor.command(pointEdgeObject, 'anchor', 'start', 'text')\n}\n\nCommands.moveBackward = (editor, ...args) => {\n editor.moveAnchorBackward(...args).moveFocusBackward(...args)\n}\n\nCommands.moveWordBackward = (editor, ...args) => {\n editor.moveFocusWordBackward(...args).moveToFocus()\n}\n\nCommands.moveEndBackward = (editor, ...args) => {\n editor.command(pointBackward, 'end', ...args)\n}\n\nCommands.moveEndWordBackward = (editor, ...args) => {\n editor.command(pointWordBackward, 'end', ...args)\n}\n\nCommands.moveEndForward = (editor, ...args) => {\n editor.command(pointForward, 'end', ...args)\n}\n\nCommands.moveEndWordForward = (editor, ...args) => {\n editor.command(pointWordForward, 'end', ...args)\n}\n\nCommands.moveEndTo = (editor, ...args) => {\n editor.command(proxy, 'moveEndTo', ...args)\n}\n\nCommands.moveEndToEndOfBlock = editor => {\n editor.command(pointEdgeObject, 'end', 'end', 'block')\n}\n\nCommands.moveEndToEndOfDocument = editor => {\n editor.moveEndToEndOfNode(editor.value.document).moveToEnd()\n}\n\nCommands.moveEndToEndOfInline = editor => {\n editor.command(pointEdgeObject, 'end', 'end', 'inline')\n}\n\nCommands.moveEndToEndOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'end', 'end', 'next', 'block')\n}\n\nCommands.moveEndToEndOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'end', 'end', 'next', 'inline')\n}\n\nCommands.moveEndToEndOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'end', 'end', 'next', 'text')\n}\n\nCommands.moveEndToEndOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveEndToEndOfNode', ...args)\n}\n\nCommands.moveEndToEndOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'end', 'end', 'previous', 'block')\n}\n\nCommands.moveEndToEndOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'end', 'end', 'previous', 'inline')\n}\n\nCommands.moveEndToEndOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'end', 'end', 'previous', 'text')\n}\n\nCommands.moveEndToEndOfText = editor => {\n editor.command(pointEdgeObject, 'end', 'end', 'text')\n}\n\nCommands.moveEndToStartOfBlock = editor => {\n editor.command(pointEdgeObject, 'end', 'start', 'block')\n}\n\nCommands.moveEndToStartOfDocument = editor => {\n editor.moveEndToStartOfNode(editor.value.document).moveToEnd()\n}\n\nCommands.moveEndToStartOfInline = editor => {\n editor.command(pointEdgeObject, 'end', 'start', 'inline')\n}\n\nCommands.moveEndToStartOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'end', 'start', 'next', 'block')\n}\n\nCommands.moveEndToStartOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'end', 'start', 'next', 'inline')\n}\n\nCommands.moveEndToStartOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'end', 'start', 'next', 'text')\n}\n\nCommands.moveEndToStartOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveEndToStartOfNode', ...args)\n}\n\nCommands.moveEndToStartOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'end', 'start', 'previous', 'block')\n}\n\nCommands.moveEndToStartOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'end', 'start', 'previous', 'inline')\n}\n\nCommands.moveEndToStartOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'end', 'start', 'previous', 'text')\n}\n\nCommands.moveEndToStartOfText = editor => {\n editor.command(pointEdgeObject, 'end', 'start', 'text')\n}\n\nCommands.moveFocusBackward = (editor, ...args) => {\n editor.command(pointBackward, 'focus', ...args)\n}\n\nCommands.moveFocusWordBackward = (editor, ...args) => {\n editor.command(pointWordBackward, 'focus', ...args)\n}\n\nCommands.moveFocusForward = (editor, ...args) => {\n editor.command(pointForward, 'focus', ...args)\n}\n\nCommands.moveFocusWordForward = (editor, ...args) => {\n editor.command(pointWordForward, 'focus', ...args)\n}\n\nCommands.moveFocusTo = (editor, ...args) => {\n editor.command(proxy, 'moveFocusTo', ...args)\n}\n\nCommands.moveFocusToEndOfBlock = editor => {\n editor.command(pointEdgeObject, 'focus', 'end', 'block')\n}\n\nCommands.moveFocusToEndOfDocument = editor => {\n editor.moveFocusToEndOfNode(editor.value.document).moveToFocus()\n}\n\nCommands.moveFocusToEndOfInline = editor => {\n editor.command(pointEdgeObject, 'focus', 'end', 'inline')\n}\n\nCommands.moveFocusToEndOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'end', 'next', 'block')\n}\n\nCommands.moveFocusToEndOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'end', 'next', 'inline')\n}\n\nCommands.moveFocusToEndOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'end', 'next', 'text')\n}\n\nCommands.moveFocusToEndOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveFocusToEndOfNode', ...args)\n}\n\nCommands.moveFocusToEndOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'end', 'previous', 'block')\n}\n\nCommands.moveFocusToEndOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'end', 'previous', 'inline')\n}\n\nCommands.moveFocusToEndOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'end', 'previous', 'text')\n}\n\nCommands.moveFocusToEndOfText = editor => {\n editor.command(pointEdgeObject, 'focus', 'end', 'text')\n}\n\nCommands.moveFocusToStartOfBlock = editor => {\n editor.command(pointEdgeObject, 'focus', 'start', 'block')\n}\n\nCommands.moveFocusToStartOfDocument = editor => {\n editor.moveFocusToStartOfNode(editor.value.document).moveToFocus()\n}\n\nCommands.moveFocusToStartOfInline = editor => {\n editor.command(pointEdgeObject, 'focus', 'start', 'inline')\n}\n\nCommands.moveFocusToStartOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'start', 'next', 'block')\n}\n\nCommands.moveFocusToStartOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'start', 'next', 'inline')\n}\n\nCommands.moveFocusToStartOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'start', 'next', 'text')\n}\n\nCommands.moveFocusToStartOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveFocusToStartOfNode', ...args)\n}\n\nCommands.moveFocusToStartOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'start', 'previous', 'block')\n}\n\nCommands.moveFocusToStartOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'start', 'previous', 'inline')\n}\n\nCommands.moveFocusToStartOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'start', 'previous', 'text')\n}\n\nCommands.moveFocusToStartOfText = editor => {\n editor.command(pointEdgeObject, 'focus', 'start', 'text')\n}\n\nCommands.moveForward = (editor, ...args) => {\n editor.moveAnchorForward(...args).moveFocusForward(...args)\n}\n\nCommands.moveWordForward = (editor, ...args) => {\n editor.moveFocusWordForward(...args).moveToFocus(...args)\n}\n\nCommands.moveStartBackward = (editor, ...args) => {\n editor.command(pointBackward, 'start', ...args)\n}\n\nCommands.moveStartWordBackward = (editor, ...args) => {\n editor.command(pointWordBackward, 'start', ...args)\n}\n\nCommands.moveStartForward = (editor, ...args) => {\n editor.command(pointForward, 'start', ...args)\n}\n\nCommands.moveStartWordForward = (editor, ...args) => {\n editor.command(pointWordForward, 'start', ...args)\n}\n\nCommands.moveStartTo = (editor, ...args) => {\n editor.command(proxy, 'moveStartTo', ...args)\n}\n\nCommands.moveStartToEndOfBlock = editor => {\n editor.command(pointEdgeObject, 'start', 'end', 'block')\n}\n\nCommands.moveStartToEndOfDocument = editor => {\n editor.moveStartToEndOfNode(editor.value.document).moveToStart()\n}\n\nCommands.moveStartToEndOfInline = editor => {\n editor.command(pointEdgeObject, 'start', 'end', 'inline')\n}\n\nCommands.moveStartToEndOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'start', 'end', 'next', 'block')\n}\n\nCommands.moveStartToEndOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'start', 'end', 'next', 'inline')\n}\n\nCommands.moveStartToEndOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'start', 'end', 'next', 'text')\n}\n\nCommands.moveStartToEndOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveStartToEndOfNode', ...args)\n}\n\nCommands.moveStartToEndOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'start', 'end', 'previous', 'block')\n}\n\nCommands.moveStartToEndOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'start', 'end', 'previous', 'inline')\n}\n\nCommands.moveStartToEndOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'start', 'end', 'previous', 'text')\n}\n\nCommands.moveStartToEndOfText = editor => {\n editor.command(pointEdgeObject, 'start', 'end', 'text')\n}\n\nCommands.moveStartToStartOfBlock = editor => {\n editor.command(pointEdgeObject, 'start', 'start', 'block')\n}\n\nCommands.moveStartToStartOfDocument = editor => {\n editor.moveStartToStartOfNode(editor.value.document).moveToStart()\n}\n\nCommands.moveStartToStartOfInline = editor => {\n editor.command(pointEdgeObject, 'start', 'start', 'inline')\n}\n\nCommands.moveStartToStartOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'start', 'start', 'next', 'block')\n}\n\nCommands.moveStartToStartOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'start', 'start', 'next', 'inline')\n}\n\nCommands.moveStartToStartOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'start', 'start', 'next', 'text')\n}\n\nCommands.moveStartToStartOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveStartToStartOfNode', ...args)\n}\n\nCommands.moveStartToStartOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'start', 'start', 'previous', 'block')\n}\n\nCommands.moveStartToStartOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'start', 'start', 'previous', 'inline')\n}\n\nCommands.moveStartToStartOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'start', 'start', 'previous', 'text')\n}\n\nCommands.moveStartToStartOfText = editor => {\n editor.command(pointEdgeObject, 'start', 'start', 'text')\n}\n\nCommands.moveTo = (editor, ...args) => {\n editor.command(proxy, 'moveTo', ...args)\n}\n\nCommands.moveToAnchor = editor => {\n editor.command(proxy, 'moveToAnchor')\n}\n\nCommands.moveToEnd = editor => {\n editor.command(proxy, 'moveToEnd')\n}\n\nCommands.moveToEndOfBlock = editor => {\n editor.moveEndToEndOfBlock().moveToEnd()\n}\n\nCommands.moveToEndOfDocument = editor => {\n editor.moveEndToEndOfNode(editor.value.document).moveToEnd()\n}\n\nCommands.moveToEndOfInline = editor => {\n editor.moveEndToEndOfInline().moveToEnd()\n}\n\nCommands.moveToEndOfNextBlock = editor => {\n editor.moveEndToEndOfNextBlock().moveToEnd()\n}\n\nCommands.moveToEndOfNextInline = editor => {\n editor.moveEndToEndOfNextInline().moveToEnd()\n}\n\nCommands.moveToEndOfNextText = editor => {\n editor.moveEndToEndOfNextText().moveToEnd()\n}\n\nCommands.moveToEndOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveToEndOfNode', ...args)\n}\n\nCommands.moveToEndOfPreviousBlock = editor => {\n editor.moveStartToEndOfPreviousBlock().moveToStart()\n}\n\nCommands.moveToEndOfPreviousInline = editor => {\n editor.moveStartToEndOfPreviousInline().moveToStart()\n}\n\nCommands.moveToEndOfPreviousText = editor => {\n editor.moveStartToEndOfPreviousText().moveToStart()\n}\n\nCommands.moveToEndOfText = editor => {\n editor.moveEndToEndOfText().moveToEnd()\n}\n\nCommands.moveToFocus = editor => {\n editor.command(proxy, 'moveToFocus')\n}\n\nCommands.moveToRangeOfDocument = editor => {\n editor.moveToRangeOfNode(editor.value.document)\n}\n\nCommands.moveToRangeOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveToRangeOfNode', ...args)\n}\n\nCommands.moveToStart = editor => {\n editor.command(proxy, 'moveToStart')\n}\n\nCommands.moveToStartOfBlock = editor => {\n editor.moveStartToStartOfBlock().moveToStart()\n}\n\nCommands.moveToStartOfDocument = editor => {\n editor.moveStartToStartOfNode(editor.value.document).moveToStart()\n}\n\nCommands.moveToStartOfInline = editor => {\n editor.moveStartToStartOfInline().moveToStart()\n}\n\nCommands.moveToStartOfNextBlock = editor => {\n editor.moveEndToStartOfNextBlock().moveToEnd()\n}\n\nCommands.moveToStartOfNextInline = editor => {\n editor.moveEndToStartOfNextInline().moveToEnd()\n}\n\nCommands.moveToStartOfNextText = editor => {\n editor.moveEndToStartOfNextText().moveToEnd()\n}\n\nCommands.moveToStartOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveToStartOfNode', ...args)\n}\n\nCommands.moveToStartOfPreviousBlock = editor => {\n editor.moveStartToStartOfPreviousBlock().moveToStart()\n}\n\nCommands.moveToStartOfPreviousInline = editor => {\n editor.moveStartToStartOfPreviousInline().moveToStart()\n}\n\nCommands.moveToStartOfPreviousText = editor => {\n editor.moveStartToStartOfPreviousText().moveToStart()\n}\n\nCommands.moveToStartOfText = editor => {\n editor.moveStartToStartOfText().moveToStart()\n}\n\nCommands.select = (editor, properties, options = {}) => {\n properties = Selection.createProperties(properties)\n const { snapshot = false } = options\n const { value } = editor\n const { document, selection } = value\n const newProperties = {}\n let next = selection.setProperties(properties)\n next = document.resolveSelection(next)\n\n // Re-compute the properties, to ensure that we get their normalized values.\n properties = pick(next, Object.keys(properties))\n\n // Remove any properties that are already equal to the current selection. And\n // create a dictionary of the previous values for all of the properties that\n // are being changed, for the inverse operation.\n for (const k in properties) {\n if (snapshot === true || !is(properties[k], selection[k])) {\n newProperties[k] = properties[k]\n }\n }\n\n // If the selection moves, clear any marks, unless the new selection\n // properties change the marks in some way.\n if (\n selection.marks &&\n !newProperties.marks &&\n (newProperties.anchor || newProperties.focus)\n ) {\n newProperties.marks = null\n }\n\n // If there are no new properties to set, abort to avoid extra operations.\n if (Object.keys(newProperties).length === 0) {\n return\n }\n\n // TODO: for some reason toJSON() is required here (it breaks selections between blocks)? - 2018-10-10\n const prevProperties = pick(selection.toJSON(), Object.keys(newProperties))\n\n editor.applyOperation(\n {\n type: 'set_selection',\n value,\n properties: prevProperties,\n newProperties,\n },\n snapshot ? { skip: false, merge: false } : {}\n )\n}\n\nCommands.setAnchor = (editor, ...args) => {\n editor.command(proxy, 'setAnchor', ...args)\n}\n\nCommands.setEnd = (editor, ...args) => {\n editor.command(proxy, 'setEnd', ...args)\n}\n\nCommands.setFocus = (editor, ...args) => {\n editor.command(proxy, 'setFocus', ...args)\n}\n\nCommands.setStart = (editor, ...args) => {\n editor.command(proxy, 'setStart', ...args)\n}\n\nCommands.snapshotSelection = editor => {\n editor.withoutMerging(() => {\n editor.select(editor.value.selection, { snapshot: true })\n })\n}\n\n/**\n * Helpers.\n */\n\nfunction proxy(editor, method, ...args) {\n const range = editor.value.selection[method](...args)\n editor.select(range)\n}\n\nfunction pointEdgeObject(editor, point, edge, object) {\n const Point = point.slice(0, 1).toUpperCase() + point.slice(1)\n const Edge = edge.slice(0, 1).toUpperCase() + edge.slice(1)\n const Object = object.slice(0, 1).toUpperCase() + object.slice(1)\n const method = `move${Point}To${Edge}OfNode`\n const getNode = object === 'text' ? 'getNode' : `getClosest${Object}`\n const { value } = editor\n const { document, selection } = value\n const p = selection[point]\n const node = document[getNode](p.key)\n if (!node) return\n editor[method](node)\n}\n\nfunction pointEdgeSideObject(editor, point, edge, side, object) {\n const Point = point.slice(0, 1).toUpperCase() + point.slice(1)\n const Edge = edge.slice(0, 1).toUpperCase() + edge.slice(1)\n const Side = side.slice(0, 1).toUpperCase() + side.slice(1)\n const Object = object.slice(0, 1).toUpperCase() + object.slice(1)\n const method = `move${Point}To${Edge}OfNode`\n const getNode = object === 'text' ? 'getNode' : `getClosest${Object}`\n const getDirectionNode = `get${Side}${Object}`\n const { value } = editor\n const { document, selection } = value\n const p = selection[point]\n const node = document[getNode](p.key)\n if (!node) return\n const target = document[getDirectionNode](node.key)\n if (!target) return\n editor[method](target)\n}\n\nfunction pointBackward(editor, point, n = 1) {\n if (n === 0) return\n if (n < 0) return pointForward(editor, point, -n)\n\n const Point = point.slice(0, 1).toUpperCase() + point.slice(1)\n const { value } = editor\n const { document, selection } = value\n const p = selection[point]\n const hasVoidParent = document.hasVoidParent(p.path, editor)\n\n // what is this?\n if (!hasVoidParent && p.offset - n >= 0) {\n const range = selection[`move${Point}Backward`](n)\n editor.select(range)\n return\n }\n\n const previous = document.getPreviousText(p.path)\n if (!previous) return\n\n const block = document.getClosestBlock(p.path)\n const isInBlock = block.hasNode(previous.key)\n const isPreviousInVoid =\n previous && document.hasVoidParent(previous.key, editor)\n editor[`move${Point}ToEndOfNode`](previous)\n\n // when is this called?\n if (!hasVoidParent && !isPreviousInVoid && isInBlock) {\n const range = editor.value.selection[`move${Point}Backward`](n)\n editor.select(range)\n }\n}\n\nfunction pointForward(editor, point, n = 1) {\n if (n === 0) return\n if (n < 0) return pointBackward(editor, point, -n)\n\n const Point = point.slice(0, 1).toUpperCase() + point.slice(1)\n const { value } = editor\n const { document, selection } = value\n const p = selection[point]\n const text = document.getNode(p.path)\n const hasVoidParent = document.hasVoidParent(p.path, editor)\n\n // what is this?\n if (!hasVoidParent && p.offset + n <= text.text.length) {\n const range = selection[`move${Point}Forward`](n)\n editor.select(range)\n return\n }\n\n const next = document.getNextText(p.path)\n if (!next) return\n\n const block = document.getClosestBlock(p.path)\n const isInBlock = block.hasNode(next.key)\n const isNextInVoid = document.hasVoidParent(next.key, editor)\n editor[`move${Point}ToStartOfNode`](next)\n\n // when is this called?\n if (!hasVoidParent && !isNextInVoid && isInBlock) {\n const range = editor.value.selection[`move${Point}Forward`](n)\n editor.select(range)\n }\n}\n\nfunction pointWordBackward(editor, pointName) {\n const { value } = editor\n const { document, selection } = value\n const point = selection[pointName]\n const block = document.getClosestBlock(point.key)\n const offset = block.getOffset(point.key)\n const o = offset + point.offset\n const { text } = block\n const n = TextUtils.getWordOffsetBackward(text, o)\n editor.command(pointBackward, pointName, n > 0 ? n : 1)\n}\n\nfunction pointWordForward(editor, pointName) {\n const { value } = editor\n const { document, selection } = value\n const point = selection[pointName]\n const block = document.getClosestBlock(point.key)\n const offset = block.getOffset(point.key)\n const o = offset + point.offset\n const { text } = block\n const n = TextUtils.getWordOffsetForward(text, o)\n editor.command(pointForward, pointName, n > 0 ? n : 1)\n}\n\nexport default Commands\n","import pick from 'lodash/pick'\nimport Annotation from '../models/annotation'\nimport Value from '../models/value'\n\n/**\n * Commands.\n *\n * @type {Object}\n */\n\nconst Commands = {}\n\n/**\n * Set `properties` on the value.\n *\n * @param {Editor} editor\n * @param {Object|Value} properties\n */\n\nCommands.setData = (editor, data = {}) => {\n const { value } = editor\n const newProperties = Value.createProperties({ data })\n const prevProperties = pick(value, Object.keys(newProperties))\n\n editor.applyOperation({\n type: 'set_value',\n properties: prevProperties,\n newProperties,\n })\n}\n\nCommands.addAnnotation = (editor, annotation) => {\n annotation = Annotation.create(annotation)\n\n editor.applyOperation({\n type: 'add_annotation',\n annotation,\n })\n}\n\nCommands.removeAnnotation = (editor, annotation) => {\n annotation = Annotation.create(annotation)\n\n editor.applyOperation({\n type: 'remove_annotation',\n annotation,\n })\n}\n\nCommands.setAnnotation = (editor, annotation, newProperties) => {\n annotation = Annotation.create(annotation)\n newProperties = Annotation.createProperties(newProperties)\n\n editor.applyOperation({\n type: 'set_annotation',\n properties: annotation,\n newProperties,\n })\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default Commands\n","/**\n * A plugin that adds a set of queries to the editor.\n *\n * @param {Object} queries\n * @return {Object}\n */\n\nfunction QueriesPlugin(queries = {}) {\n /**\n * On construct, register all the queries.\n *\n * @param {Editor} editor\n * @param {Function} next\n */\n\n function onConstruct(editor, next) {\n for (const query in queries) {\n editor.registerQuery(query)\n }\n\n return next()\n }\n\n /**\n * On query, if it exists in our list of queries, call it.\n *\n * @param {Object} query\n * @param {Editor} editor\n * @param {Function} next\n */\n\n function onQuery(query, editor, next) {\n const { type, args } = query\n const fn = queries[type]\n if (!fn) return next()\n const ret = fn(editor, ...args)\n return ret === undefined ? next() : ret\n }\n\n /**\n * Return the plugin.\n *\n * @type {Object}\n */\n\n return {\n onConstruct,\n onQuery,\n }\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default QueriesPlugin\n","/**\n * Define a Slate error.\n *\n * @type {SlateError}\n */\n\nclass SlateError extends Error {\n constructor(code, attrs = {}) {\n super(code)\n this.code = code\n\n for (const key in attrs) {\n this[key] = attrs[key]\n }\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor)\n } else {\n this.stack = new Error().stack\n }\n }\n}\n\n/**\n * Export.\n *\n * @type {SlateError}\n */\n\nexport default SlateError\n","import SlateError from '../utils/slate-error'\nimport Queries from './queries'\n\n/**\n * Create a plugin from a `schema` definition.\n *\n * @param {Object} schema\n * @return {Object}\n */\n\nfunction SchemaPlugin(schema) {\n const {\n rules,\n document,\n blocks,\n inlines,\n marks,\n annotations,\n decorations,\n } = schema\n let schemaRules = []\n\n if (rules) {\n schemaRules = schemaRules.concat(rules)\n }\n\n if (document) {\n schemaRules.push({\n match: [{ object: 'document' }],\n ...document,\n })\n }\n\n if (blocks) {\n for (const key in blocks) {\n schemaRules.push({\n match: [{ object: 'block', type: key }],\n ...blocks[key],\n })\n }\n }\n\n if (inlines) {\n for (const key in inlines) {\n schemaRules.push({\n match: [{ object: 'inline', type: key }],\n ...inlines[key],\n })\n }\n }\n\n if (marks) {\n for (const key in marks) {\n schemaRules.push({\n match: [{ object: 'mark', type: key }],\n ...marks[key],\n })\n }\n }\n\n if (annotations) {\n for (const key in annotations) {\n schemaRules.push({\n match: [{ object: 'annotation', type: key }],\n ...annotations[key],\n })\n }\n }\n\n if (decorations) {\n for (const key in decorations) {\n schemaRules.push({\n match: [{ object: 'decoration', type: key }],\n ...decorations[key],\n })\n }\n }\n\n /**\n * Check if a `format` is atomic based on the schema rules.\n *\n * @param {Editor} editor\n * @param {Format} format\n * @return {Boolean}\n */\n\n function isAtomic(editor, format) {\n const rule = schemaRules.find(\n r => 'isAtomic' in r && testRules(format, r.match)\n )\n\n return rule && rule.isAtomic\n }\n\n /**\n * Check if a `node` is void based on the schema rules.\n *\n * @param {Editor} editor\n * @param {Node} node\n * @return {Boolean}\n */\n\n function isVoid(editor, node) {\n const rule = schemaRules.find(\n r => 'isVoid' in r && testRules(node, r.match)\n )\n\n return rule && rule.isVoid\n }\n\n /**\n * Normalize a `node` with the schema rules, returning a function that will\n * fix the invalid node, or void if the node is valid.\n *\n * @param {Node} node\n * @param {Editor} editor\n * @param {Function} next\n * @return {Function|Void}\n */\n\n function normalizeNode(node, editor, next) {\n const error = validateNode(node, editor, () => {})\n if (!error) return next()\n\n return () => {\n const { rule } = error\n const { size } = editor.operations\n\n // First run the user-provided `normalize` function if one exists...\n if (rule.normalize) {\n rule.normalize(editor, error)\n }\n\n // If the `normalize` function did not add any operations to the editor\n // object, it can't have normalized, so run the default one.\n if (editor.operations.size === size) {\n defaultNormalize(editor, error)\n }\n }\n }\n\n /**\n * Validate a `node` with the schema rules, returning a `SlateError` if it's\n * invalid.\n *\n * @param {Node} node\n * @param {Editor} editor\n * @param {Function} next\n * @return {Error|Void}\n */\n\n function validateNode(node, editor, next) {\n const matches = schemaRules.filter(r => testRules(node, r.match))\n const failure = validateRules(node, matches, schemaRules, { every: true })\n if (!failure) return next()\n const error = new SlateError(failure.code, failure)\n return error\n }\n\n /**\n * On schema-related queries, respond if we can.\n *\n * @param {Object} query\n * @param {Function} next\n */\n\n const queries = Queries({ isAtomic, isVoid })\n\n /**\n * Return the plugins.\n *\n * @type {Object}\n */\n\n return [{ normalizeNode, validateNode }, queries]\n}\n\n/**\n * Normalize an invalid value with `error` with default remedies.\n *\n * @param {Editor} editor\n * @param {SlateError} error\n */\n\nfunction defaultNormalize(editor, error) {\n const { code, node, child, next, previous, key, mark } = error\n\n switch (code) {\n case 'child_max_invalid':\n case 'child_object_invalid':\n case 'child_type_invalid':\n case 'child_unknown':\n case 'first_child_object_invalid':\n case 'first_child_type_invalid':\n case 'last_child_object_invalid':\n case 'last_child_type_invalid': {\n return child.object === 'text' &&\n node.object === 'block' &&\n node.nodes.size === 1\n ? editor.removeNodeByKey(node.key)\n : editor.removeNodeByKey(child.key)\n }\n\n case 'previous_sibling_object_invalid':\n case 'previous_sibling_type_invalid': {\n return previous.object === 'text' &&\n node.object === 'block' &&\n node.nodes.size === 1\n ? editor.removeNodeByKey(node.key)\n : editor.removeNodeByKey(previous.key)\n }\n\n case 'next_sibling_object_invalid':\n case 'next_sibling_type_invalid': {\n return next.object === 'text' &&\n node.object === 'block' &&\n node.nodes.size === 1\n ? editor.removeNodeByKey(node.key)\n : editor.removeNodeByKey(next.key)\n }\n\n case 'child_min_invalid':\n case 'node_text_invalid':\n case 'parent_object_invalid':\n case 'parent_type_invalid': {\n return node.object === 'document'\n ? node.nodes.forEach(n => editor.removeNodeByKey(n.key))\n : editor.removeNodeByKey(node.key)\n }\n\n case 'node_data_invalid': {\n return node.data.get(key) === undefined && node.object !== 'document'\n ? editor.removeNodeByKey(node.key)\n : editor.setNodeByKey(node.key, { data: node.data.delete(key) })\n }\n\n case 'node_mark_invalid': {\n return node\n .getTexts()\n .forEach(t => editor.removeMarkByKey(t.key, 0, t.text.length, mark))\n }\n\n default: {\n return editor.removeNodeByKey(node.key)\n }\n }\n}\n\n/**\n * Check that an `object` matches one of a set of `rules`.\n *\n * @param {Mixed} object\n * @param {Object|Array} rules\n * @return {Boolean}\n */\n\nfunction testRules(object, rules) {\n const error = validateRules(object, rules)\n return !error\n}\n\n/**\n * Validate that a `object` matches a `rule` object or array.\n *\n * @param {Mixed} object\n * @param {Object|Array} rule\n * @param {Array|Void} rules\n * @return {Error|Void}\n */\n\nfunction validateRules(object, rule, rules, options = {}) {\n const { every = false, match = null } = options\n\n if (typeof rule === 'function') {\n const valid = rule(object, match)\n return valid ? null : fail('node_invalid', { rule, node: object })\n }\n\n if (Array.isArray(rule)) {\n const array = rule.length ? rule : [{}]\n let first\n\n for (const r of array) {\n const error = validateRules(object, r, rules)\n first = first || error\n if (every && error) return error\n if (!every && !error) return\n }\n\n return first\n }\n\n const error =\n validateObject(object, rule) ||\n validateType(object, rule) ||\n validateData(object, rule) ||\n validateMarks(object, rule) ||\n validateText(object, rule) ||\n validateFirst(object, rule) ||\n validateLast(object, rule) ||\n validateNodes(object, rule, rules)\n\n return error\n}\n\nfunction validateObject(node, rule) {\n if (rule.object == null) return\n if (rule.object === node.object) return\n if (typeof rule.object === 'function' && rule.object(node.object)) return\n return fail('node_object_invalid', { rule, node })\n}\n\nfunction validateType(node, rule) {\n if (rule.type == null) return\n if (rule.type === node.type) return\n if (typeof rule.type === 'function' && rule.type(node.type)) return\n return fail('node_type_invalid', { rule, node })\n}\n\nfunction validateData(node, rule) {\n if (rule.data == null) return\n if (node.data == null) return\n\n if (typeof rule.data === 'function') {\n if (rule.data(node.data)) return\n return fail('node_data_invalid', { rule, node })\n }\n\n for (const key in rule.data) {\n const fn = rule.data[key]\n const value = node.data && node.data.get(key)\n const valid = typeof fn === 'function' ? fn(value) : fn === value\n if (valid) continue\n return fail('node_data_invalid', { rule, node, key, value })\n }\n}\n\nfunction validateMarks(node, rule) {\n if (rule.marks == null) return\n\n const marks =\n node.object === 'text' ? node.marks.toArray() : node.getMarks().toArray()\n\n for (const mark of marks) {\n const valid = rule.marks.some(\n def =>\n typeof def.type === 'function'\n ? def.type(mark.type)\n : def.type === mark.type\n )\n if (valid) continue\n return fail('node_mark_invalid', { rule, node, mark })\n }\n}\n\nfunction validateText(node, rule) {\n if (rule.text == null) return\n const { text } = node\n const valid =\n typeof rule.text === 'function' ? rule.text(text) : rule.text.test(text)\n if (valid) return\n return fail('node_text_invalid', { rule, node, text })\n}\n\nfunction validateFirst(node, rule) {\n if (rule.first == null) return\n const first = node.nodes.first()\n if (!first) return\n const error = validateRules(first, rule.first)\n if (!error) return\n error.rule = rule\n error.node = node\n error.child = first\n error.code = error.code.replace('node_', 'first_child_')\n return error\n}\n\nfunction validateLast(node, rule) {\n if (rule.last == null) return\n const last = node.nodes.last()\n if (!last) return\n const error = validateRules(last, rule.last)\n if (!error) return\n error.rule = rule\n error.node = node\n error.child = last\n error.code = error.code.replace('node_', 'last_child_')\n return error\n}\n\nfunction validateNodes(node, rule, rules = []) {\n if (node.nodes == null) return\n\n const children = node.nodes\n const defs = rule.nodes != null ? rule.nodes.slice() : []\n let count = 0\n let lastCount = 0\n let min = null\n let index = -1\n let def = null\n let max = null\n let child = null\n let previous = null\n let next = null\n\n function nextDef() {\n if (defs.length === 0) return false\n def = defs.shift()\n lastCount = count\n count = 0\n min = def.min || null\n max = def.max || null\n return true\n }\n\n function nextChild() {\n index += 1\n previous = index ? children.get(index - 1) : null\n child = children.get(index)\n next = children.get(index + 1)\n if (!child) return false\n lastCount = count\n count += 1\n return true\n }\n\n function rewind() {\n if (index > 0) {\n index -= 1\n count = lastCount\n }\n }\n\n if (rule.nodes != null) {\n nextDef()\n }\n\n while (nextChild()) {\n const err =\n validateParent(node, child, rules) ||\n validatePrevious(node, child, previous, index, rules) ||\n validateNext(node, child, next, index, rules)\n\n if (err) return err\n\n if (rule.nodes != null) {\n if (!def) {\n return fail('child_unknown', { rule, node, child, index })\n }\n\n if (def.match) {\n const error = validateRules(child, def.match)\n\n if (error) {\n // Since we want to report overflow on last matching child we don't\n // immediately check for count > max, but instead do so once we find\n // a child that doesn't match.\n if (max != null && count - 1 > max) {\n rewind()\n return fail('child_max_invalid', {\n rule,\n node,\n index,\n child: children.get(index),\n count,\n limit: max,\n })\n }\n\n const lastMin = min\n\n // If there are more groups after this one then child might actually\n // be valid.\n if (nextDef()) {\n // If we've already satisfied the minimum for the current group,\n // then we can rewind and proceed to the next group.\n if (lastCount - 1 >= lastMin) {\n index -= 1\n continue\n }\n\n // Otherwise we know that current value is underflowing. There are\n // three possible causes for this...\n\n // 1. There might just not be enough elements for current group, and\n // current child is in fact the first of the next group. If so, the\n // next def will not report errors, in which case we can rewind and\n // report an minimum error.\n if (validateRules(child, def.match) == null) {\n rewind()\n return fail('child_min_invalid', {\n rule,\n node,\n index,\n count: lastCount - 1,\n limit: lastMin,\n })\n }\n\n // 2. The current group is underflowing, but there is also an\n // invalid child before the next group.\n // 3. Or the current group is not underflowing but it appears so\n // because there's an invalid child between its members.\n // It's either the second or third case. If it's the second then\n // we could report an underflow, but presence of an invalid child\n // is arguably more important, so we report it first. It also lets\n // us avoid checking for which case exactly is it.\n error.rule = rule\n error.node = node\n error.child = child\n error.index = index\n error.code = error.code.replace('node_', 'child_')\n return error\n }\n\n // Otherwise either we exhausted the last group, in which case it's\n // an unknown child, ...\n if (max != null && count > max) {\n return fail('child_unknown', { rule, node, child, index })\n }\n\n // ... or it's an invalid child for the last group.\n error.rule = rule\n error.node = node\n error.child = child\n error.index = index\n error.code = error.code.replace('node_', 'child_')\n return error\n }\n }\n }\n }\n\n // Since we want to report overflow on last matching child we don't\n // immediately check for count > max, but do so after processing all nodes.\n if (max != null && count > max) {\n return fail('child_max_invalid', {\n rule,\n node,\n index: index - 1,\n count,\n child: children.get(index - 1),\n limit: max,\n })\n }\n\n if (rule.nodes != null) {\n do {\n if (count < min) {\n return fail('child_min_invalid', {\n rule,\n node,\n index,\n count,\n limit: min,\n })\n }\n } while (nextDef())\n }\n}\n\nfunction validateParent(node, child, rules) {\n for (const rule of rules) {\n if (rule.parent == null) continue\n if (!testRules(child, rule.match)) continue\n\n const error = validateRules(node, rule.parent)\n if (!error) continue\n\n error.rule = rule\n error.parent = node\n error.node = child\n error.code = error.code.replace('node_', 'parent_')\n return error\n }\n}\n\nfunction validatePrevious(node, child, previous, index, rules) {\n if (!previous) return\n\n for (const rule of rules) {\n if (rule.previous == null) continue\n if (!testRules(child, rule.match)) continue\n\n const error = validateRules(previous, rule.previous)\n if (!error) continue\n\n error.rule = rule\n error.node = node\n error.child = child\n error.index = index\n error.previous = previous\n error.code = error.code.replace('node_', 'previous_sibling_')\n return error\n }\n}\n\nfunction validateNext(node, child, next, index, rules) {\n if (!next) return\n\n for (const rule of rules) {\n if (rule.next == null) continue\n if (!testRules(child, rule.match)) continue\n\n const error = validateRules(next, rule.next, [], { match: child })\n if (!error) continue\n\n error.rule = rule\n error.node = node\n error.child = child\n error.index = index\n error.next = next\n error.code = error.code.replace('node_', 'next_sibling_')\n return error\n }\n}\n\n/**\n * Create an interim failure object with `code` and `attrs`.\n *\n * @param {String} code\n * @param {Object} attrs\n * @return {Object}\n */\n\nfunction fail(code, attrs) {\n return { code, ...attrs }\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default SchemaPlugin\n","import Block from '../models/block'\nimport Inline from '../models/inline'\nimport Mark from '../models/mark'\n\n/**\n * Ensure that an expanded selection is deleted first using the `editor.delete`\n * command. This guarantees that it uses the proper semantic \"intent\" instead of\n * using `deleteAtRange` under the covers and skipping `delete`.\n *\n * @param {Editor}\n */\n\nfunction deleteExpanded(editor) {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n }\n}\n\n/**\n * Commands.\n *\n * @type {Object}\n */\n\nconst Commands = {}\n\n/**\n * Add a `mark` to the characters in the current selection.\n *\n * @param {Editor} editor\n * @param {Mark} mark\n */\n\nCommands.addMark = (editor, mark) => {\n mark = Mark.create(mark)\n const { value } = editor\n const { document, selection } = value\n\n if (selection.isExpanded) {\n editor.addMarkAtRange(selection, mark)\n } else if (selection.marks) {\n const marks = selection.marks.add(mark)\n const sel = selection.set('marks', marks)\n editor.select(sel)\n } else {\n const marks = document.getActiveMarksAtRange(selection).add(mark)\n const sel = selection.set('marks', marks)\n editor.select(sel)\n }\n}\n\n/**\n * Add a list of `marks` to the characters in the current selection.\n *\n * @param {Editor} editor\n * @param {Set<Mark>|Array<Object>} marks\n */\n\nCommands.addMarks = (editor, marks) => {\n marks.forEach(mark => editor.addMark(mark))\n}\n\n/**\n * Delete at the current selection.\n *\n * @param {Editor} editor\n */\n\nCommands.delete = editor => {\n const { value } = editor\n const { selection } = value\n editor.deleteAtRange(selection)\n\n // COMPAT: Ensure that the selection is collapsed, because in certain cases\n // when deleting across inline nodes, when splitting the inline node the end\n // point of the selection will end up after the split point.\n editor.moveToFocus()\n}\n\n/**\n * Delete backward `n` characters.\n *\n * @param {Editor} editor\n * @param {Number} n (optional)\n */\n\nCommands.deleteBackward = (editor, n = 1) => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteBackwardAtRange(selection, n)\n }\n}\n\n/**\n * Delete backward one character.\n *\n * @param {Editor} editor\n */\n\nCommands.deleteCharBackward = editor => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteCharBackwardAtRange(selection)\n }\n}\n\n/**\n * Delete backward one line.\n *\n * @param {Editor} editor\n */\n\nCommands.deleteLineBackward = editor => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteLineBackwardAtRange(selection)\n }\n}\n\n/**\n * Delete backward one word.\n *\n * @param {Editor} editor\n */\n\nCommands.deleteWordBackward = editor => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteWordBackwardAtRange(selection)\n }\n}\n\n/**\n * Delete backward `n` characters.\n *\n * @param {Editor} editor\n * @param {Number} n (optional)\n */\n\nCommands.deleteForward = (editor, n = 1) => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteForwardAtRange(selection, n)\n }\n}\n\n/**\n * Delete backward one character.\n *\n * @param {Editor} editor\n */\n\nCommands.deleteCharForward = editor => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteCharForwardAtRange(selection)\n }\n}\n\n/**\n * Delete backward one line.\n *\n * @param {Editor} editor\n */\n\nCommands.deleteLineForward = editor => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteLineForwardAtRange(selection)\n }\n}\n\n/**\n * Delete backward one word.\n *\n * @param {Editor} editor\n */\n\nCommands.deleteWordForward = editor => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteWordForwardAtRange(selection)\n }\n}\n\n/**\n * Insert a `block` at the current selection.\n *\n * @param {Editor} editor\n * @param {String|Object|Block} block\n */\n\nCommands.insertBlock = (editor, block) => {\n deleteExpanded(editor)\n\n block = Block.create(block)\n const { value } = editor\n const { selection } = value\n editor.insertBlockAtRange(selection, block)\n\n // If the node was successfully inserted, update the selection.\n const node = editor.value.document.getNode(block.key)\n if (node) editor.moveToEndOfNode(node)\n}\n\n/**\n * Insert a `fragment` at the current selection.\n *\n * @param {Editor} editor\n * @param {Document} fragment\n */\n\nCommands.insertFragment = (editor, fragment) => {\n if (!fragment.nodes.size) return\n\n deleteExpanded(editor)\n\n let { value } = editor\n let { document, selection } = value\n const { start, end } = selection\n const { startText, endText, startInline } = value\n const lastText = fragment.getLastText()\n const lastInline = fragment.getClosestInline(lastText.key)\n const lastBlock = fragment.getClosestBlock(lastText.key)\n const firstChild = fragment.nodes.first()\n const lastChild = fragment.nodes.last()\n const keys = Array.from(document.texts(), ([text]) => text.key)\n const isAppending =\n !startInline ||\n (start.isAtStartOfNode(startText) || end.isAtStartOfNode(startText)) ||\n (start.isAtEndOfNode(endText) || end.isAtEndOfNode(endText))\n\n const isInserting =\n firstChild.hasBlockChildren() || lastChild.hasBlockChildren()\n\n editor.insertFragmentAtRange(selection, fragment)\n value = editor.value\n document = value.document\n\n const newTexts = document.getTexts().filter(n => !keys.includes(n.key))\n const newText = isAppending ? newTexts.last() : newTexts.takeLast(2).first()\n\n if (newText && (lastInline || isInserting)) {\n editor.moveToEndOfNode(newText)\n } else if (newText) {\n // The position within the last text node needs to be calculated. This is the length\n // of all text nodes within the last block, but if the last block contains inline nodes,\n // these have to be skipped.\n const { nodes } = lastBlock\n const lastIndex = nodes.findLastIndex(\n node => node && node.object === 'inline'\n )\n const remainingTexts = nodes.takeLast(nodes.size - lastIndex - 1)\n const remainingTextLength = remainingTexts.reduce(\n (acc, val) => acc + val.text.length,\n 0\n )\n editor.moveToStartOfNode(newText).moveForward(remainingTextLength)\n }\n}\n\n/**\n * Insert an `inline` at the current selection.\n *\n * @param {Editor} editor\n * @param {String|Object|Inline} inline\n */\n\nCommands.insertInline = (editor, inline) => {\n deleteExpanded(editor)\n\n inline = Inline.create(inline)\n const { value } = editor\n const { selection } = value\n editor.insertInlineAtRange(selection, inline)\n\n // If the node was successfully inserted, update the selection.\n const node = editor.value.document.getNode(inline.key)\n if (node) editor.moveToEndOfNode(node)\n}\n\n/**\n * Insert a string of `text` with optional `marks` at the current selection.\n *\n * @param {Editor} editor\n * @param {String} text\n * @param {Set<Mark>} marks (optional)\n */\n\nCommands.insertText = (editor, text, marks) => {\n deleteExpanded(editor)\n\n const { value } = editor\n const { document, selection } = value\n marks = marks || selection.marks || document.getInsertMarksAtRange(selection)\n\n editor.withoutNormalizing(() => {\n editor.insertTextAtRange(selection, text, marks)\n\n // If the text was successfully inserted, and the selection had marks on it,\n // unset the selection's marks.\n if (selection.marks && document !== editor.value.document) {\n editor.select({ marks: null })\n }\n })\n}\n\n/**\n * Remove a `mark` from the characters in the current selection.\n *\n * @param {Editor} editor\n * @param {Mark} mark\n */\n\nCommands.removeMark = (editor, mark) => {\n mark = Mark.create(mark)\n const { value } = editor\n const { document, selection } = value\n\n if (selection.isExpanded) {\n editor.removeMarkAtRange(selection, mark)\n } else if (selection.marks) {\n const marks = selection.marks.remove(mark)\n const sel = selection.set('marks', marks)\n editor.select(sel)\n } else {\n const marks = document.getActiveMarksAtRange(selection).remove(mark)\n const sel = selection.set('marks', marks)\n editor.select(sel)\n }\n}\n\n/**\n * Replace an `oldMark` with a `newMark` in the characters in the current selection.\n *\n * @param {Editor} editor\n * @param {Mark} oldMark\n * @param {Mark} newMark\n */\n\nCommands.replaceMark = (editor, oldMark, newMark) => {\n editor.removeMark(oldMark)\n editor.addMark(newMark)\n}\n\n/**\n * Set the `properties` of block nodes.\n *\n * @param {Editor} editor\n * @param {Object|String} properties\n */\n\nCommands.setBlocks = (editor, properties) => {\n const { value } = editor\n const { selection } = value\n editor.setBlocksAtRange(selection, properties)\n}\n\n/**\n * Set the `properties` of inline nodes.\n *\n * @param {Editor} editor\n * @param {Object|String} properties\n */\n\nCommands.setInlines = (editor, properties) => {\n const { value } = editor\n const { selection } = value\n editor.setInlinesAtRange(selection, properties)\n}\n\n/**\n * Split the block node at the current selection, to optional `depth`.\n *\n * @param {Editor} editor\n * @param {Number} depth (optional)\n */\n\nCommands.splitBlock = (editor, depth = 1) => {\n deleteExpanded(editor)\n\n const { value } = editor\n const { selection, document } = value\n const marks = selection.marks || document.getInsertMarksAtRange(selection)\n editor.splitBlockAtRange(selection, depth).moveToEnd()\n\n if (marks && marks.size !== 0) {\n editor.select({ marks })\n }\n}\n\n/**\n * Split the inline nodes to optional `height`.\n *\n * @param {Editor} editor\n * @param {Number} height (optional)\n */\n\nCommands.splitInline = (editor, height) => {\n deleteExpanded(editor)\n const { value } = editor\n const { selection } = value\n editor.splitInlineAtRange(selection, height)\n}\n\n/**\n * Add or remove a `mark` from the characters in the current selection,\n * depending on whether it's already there.\n *\n * @param {Editor} editor\n * @param {Mark} mark\n */\n\nCommands.toggleMark = (editor, mark) => {\n mark = Mark.create(mark)\n const { value } = editor\n const exists = value.activeMarks.has(mark)\n\n if (exists) {\n editor.removeMark(mark)\n } else {\n editor.addMark(mark)\n }\n}\n\n/**\n * Unwrap nodes from a block with `properties`.\n *\n * @param {Editor} editor\n * @param {String|Object} properties\n */\n\nCommands.unwrapBlock = (editor, properties) => {\n const { value } = editor\n const { selection } = value\n editor.unwrapBlockAtRange(selection, properties)\n}\n\n/**\n * Unwrap nodes from an inline with `properties`.\n *\n * @param {Editor} editor\n * @param {String|Object} properties\n */\n\nCommands.unwrapInline = (editor, properties) => {\n const { value } = editor\n const { selection } = value\n editor.unwrapInlineAtRange(selection, properties)\n}\n\n/**\n * Wrap nodes in a new `block`.\n *\n * @param {Editor} editor\n * @param {Block|Object|String} block\n */\n\nCommands.wrapBlock = (editor, block) => {\n const { value } = editor\n const { selection } = value\n editor.wrapBlockAtRange(selection, block)\n}\n\n/**\n * Wrap nodes in a new `inline`.\n *\n * @param {Editor} editor\n * @param {Inline|Object|String} inline\n */\n\nCommands.wrapInline = (editor, inline) => {\n const { value } = editor\n const { selection } = value\n editor.wrapInlineAtRange(selection, inline)\n}\n\n/**\n * Wrap the current selection with prefix/suffix.\n *\n * @param {Editor} editor\n * @param {String} prefix\n * @param {String} suffix\n */\n\nCommands.wrapText = (editor, prefix, suffix = prefix) => {\n const { value } = editor\n const { selection } = value\n editor.wrapTextAtRange(selection, prefix, suffix)\n\n // If the selection was collapsed, it will have moved the start offset too.\n if (selection.isCollapsed) {\n editor.moveStartBackward(prefix.length)\n }\n\n // Adding the suffix will have pushed the end of the selection further on, so\n // we need to move it back to account for this.\n editor.moveEndBackward(suffix.length)\n\n // There's a chance that the selection points moved \"through\" each other,\n // resulting in a now-incorrect selection direction.\n if (selection.isForward !== editor.value.selection.isForward) {\n editor.flip()\n }\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default Commands\n","import AtRange from '../commands/at-range'\nimport ByPath from '../commands/by-path'\nimport Commands from './commands'\nimport OnHistory from '../commands/on-history'\nimport OnSelection from '../commands/on-selection'\nimport OnValue from '../commands/on-value'\nimport Queries from './queries'\nimport Schema from './schema'\nimport Text from '../models/text'\nimport WithIntent from '../commands/with-intent'\n\n/**\n * A plugin that defines the core Slate logic.\n *\n * @param {Object} options\n * @return {Object}\n */\n\nfunction CorePlugin(options = {}) {\n const { plugins = [] } = options\n\n /**\n * The core Slate commands.\n *\n * @type {Object}\n */\n\n const commands = Commands({\n ...AtRange,\n ...ByPath,\n ...OnHistory,\n ...OnSelection,\n ...OnValue,\n ...WithIntent,\n })\n\n /**\n * The core Slate queries.\n *\n * @type {Object}\n */\n\n const queries = Queries({\n isAtomic: () => false,\n isVoid: () => false,\n })\n\n /**\n * The core Slate schema.\n *\n * @type {Object}\n */\n\n const schema = Schema({\n rules: [\n // Only allow block nodes in documents.\n {\n match: { object: 'document' },\n nodes: [\n {\n match: { object: 'block' },\n },\n ],\n },\n\n // Only allow block nodes or inline and text nodes in blocks.\n {\n match: {\n object: 'block',\n first: { object: 'block' },\n },\n nodes: [\n {\n match: { object: 'block' },\n },\n ],\n },\n {\n match: {\n object: 'block',\n first: [{ object: 'inline' }, { object: 'text' }],\n },\n nodes: [\n {\n match: [{ object: 'inline' }, { object: 'text' }],\n },\n ],\n },\n\n // Only allow inline and text nodes in inlines.\n {\n match: { object: 'inline' },\n nodes: [{ match: [{ object: 'inline' }, { object: 'text' }] }],\n },\n\n // Ensure that block and inline nodes have at least one text child.\n {\n match: [{ object: 'block' }, { object: 'inline' }],\n nodes: [{ min: 1 }],\n normalize: (editor, error) => {\n const { code, node } = error\n\n if (code === 'child_min_invalid' && node.nodes.isEmpty()) {\n editor.insertNodeByKey(node.key, 0, Text.create())\n }\n },\n },\n\n // Ensure that inline nodes are surrounded by text nodes.\n {\n match: { object: 'block' },\n first: [{ object: 'block' }, { object: 'text' }],\n last: [{ object: 'block' }, { object: 'text' }],\n normalize: (editor, error) => {\n const { code, node } = error\n const text = Text.create()\n let i\n\n if (code === 'first_child_object_invalid') {\n i = 0\n } else if (code === 'last_child_object_invalid') {\n i = node.nodes.size\n } else {\n return\n }\n\n editor.insertNodeByKey(node.key, i, text)\n },\n },\n {\n match: { object: 'inline' },\n first: [{ object: 'block' }, { object: 'text' }],\n last: [{ object: 'block' }, { object: 'text' }],\n previous: [{ object: 'block' }, { object: 'text' }],\n next: [{ object: 'block' }, { object: 'text' }],\n normalize: (editor, error) => {\n const { code, node, index } = error\n const text = Text.create()\n let i\n\n if (code === 'first_child_object_invalid') {\n i = 0\n } else if (code === 'last_child_object_invalid') {\n i = node.nodes.size\n } else if (code === 'previous_sibling_object_invalid') {\n i = index\n } else if (code === 'next_sibling_object_invalid') {\n i = index + 1\n } else {\n return\n }\n\n editor.insertNodeByKey(node.key, i, text)\n },\n },\n\n // Merge adjacent text nodes with the same marks.\n {\n match: { object: 'text' },\n next: (next, match) => {\n return next.object !== 'text' || !match.marks.equals(next.marks)\n },\n normalize: (editor, error) => {\n const { code, next } = error\n\n if (code === 'next_sibling_invalid') {\n editor.mergeNodeByKey(next.key)\n }\n },\n },\n\n // Remove extra adjacent empty text nodes.\n {\n match: { object: 'text' },\n previous: prev => {\n return prev.object !== 'text' || prev.text !== ''\n },\n next: next => {\n return next.object !== 'text' || next.text !== ''\n },\n normalize: (editor, error) => {\n const { code, next, previous } = error\n\n if (code === 'next_sibling_invalid') {\n editor.removeNodeByKey(next.key)\n } else if (code === 'previous_sibling_invalid') {\n editor.removeNodeByKey(previous.key)\n }\n },\n },\n ],\n })\n\n /**\n * Return the plugins.\n *\n * @type {Array}\n */\n\n return [schema, ...plugins, commands, queries]\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default CorePlugin\n","import Debug from 'debug'\nimport invariant from 'tiny-invariant'\nimport isPlainObject from 'is-plain-object'\nimport warning from 'tiny-warning'\nimport { List } from 'immutable'\n\nimport CommandsPlugin from '../plugins/commands'\nimport CorePlugin from '../plugins/core'\nimport Operation from '../models/operation'\nimport PathUtils from '../utils/path-utils'\nimport QueriesPlugin from '../plugins/queries'\nimport SchemaPlugin from '../plugins/schema'\nimport Value from '../models/value'\n\n/**\n * Debug.\n *\n * @type {Function}\n */\n\nconst debug = Debug('slate:editor')\n\n/**\n * Editor.\n *\n * @type {Editor}\n */\n\nclass Editor {\n /**\n * Create a new `Editor` with `attrs`.\n *\n * @param {Object} attrs\n * @param {Object} options\n */\n\n constructor(attrs = {}, options = {}) {\n const { controller = this, construct = true } = options\n const {\n onChange = () => {},\n plugins = [],\n readOnly = false,\n value = Value.create(),\n } = attrs\n\n this.controller = controller\n this.middleware = {}\n this.onChange = onChange\n this.operations = List()\n this.readOnly = null\n this.value = null\n\n this.tmp = {\n dirty: [],\n flushing: false,\n merge: null,\n normalize: true,\n save: true,\n }\n\n const core = CorePlugin({ plugins })\n registerPlugin(this, core)\n\n if (construct) {\n this.run('onConstruct')\n this.setReadOnly(readOnly)\n this.setValue(value, options)\n }\n }\n\n /**\n * Apply an `operation` to the editor, updating its value.\n *\n * @param {Operation|Object} operation\n * @return {Editor}\n */\n\n applyOperation(operation) {\n const { operations, controller } = this\n let value = this.value\n\n // Add in the current `value` in case the operation was serialized.\n if (isPlainObject(operation)) {\n operation = { ...operation, value }\n }\n\n operation = Operation.create(operation)\n\n // Save the operation into the history. Since `save` is a command, we need\n // to do it without normalizing, since it would have side effects.\n this.withoutNormalizing(() => {\n controller.save(operation)\n value = this.value\n })\n\n // Apply the operation to the value.\n debug('apply', { operation })\n this.value = operation.apply(value)\n this.operations = operations.push(operation)\n\n // Get the paths of the affected nodes, and mark them as dirty.\n const newDirtyPaths = getDirtyPaths(operation)\n const dirty = this.tmp.dirty.reduce((memo, path) => {\n path = PathUtils.create(path)\n const transformed = PathUtils.transform(path, operation)\n memo = memo.concat(transformed.toArray())\n return memo\n }, newDirtyPaths)\n\n this.tmp.dirty = dirty\n\n // If we're not already, queue the flushing process on the next tick.\n if (!this.tmp.flushing) {\n this.tmp.flushing = true\n Promise.resolve().then(() => this.flush())\n }\n\n return controller\n }\n\n /**\n * Flush the editor's current change.\n *\n * @return {Editor}\n */\n\n flush() {\n this.run('onChange')\n const { value, operations, controller } = this\n const change = { value, operations }\n this.operations = List()\n this.tmp.flushing = false\n this.onChange(change)\n return controller\n }\n\n /**\n * Trigger a command by `type` with `...args`.\n *\n * @param {String|Function} type\n * @param {Any} ...args\n * @return {Editor}\n */\n\n command(type, ...args) {\n const { controller } = this\n\n if (typeof type === 'function') {\n type(controller, ...args)\n normalizeDirtyPaths(this)\n return controller\n }\n\n debug('command', { type, args })\n const obj = { type, args }\n this.run('onCommand', obj)\n normalizeDirtyPaths(this)\n return controller\n }\n\n /**\n * Checks if a command by `type` has been registered.\n *\n * @param {String} type\n * @return {Boolean}\n */\n\n hasCommand(type) {\n const { controller } = this\n const has = type in controller && controller[type].__command\n\n return has\n }\n\n /**\n * Checks if a query by `type` has been registered.\n *\n * @param {String} type\n * @return {Boolean}\n */\n\n hasQuery(type) {\n const { controller } = this\n const has = type in controller && controller[type].__query\n\n return has\n }\n\n /**\n * Normalize all of the nodes in the document from scratch.\n *\n * @return {Editor}\n */\n\n normalize() {\n const { value, controller } = this\n let { document } = value\n const table = document.getKeysToPathsTable()\n const paths = Object.values(table).map(PathUtils.create)\n this.tmp.dirty = this.tmp.dirty.concat(paths)\n normalizeDirtyPaths(this)\n\n const { selection } = value\n document = value.document\n\n if (selection.isUnset && document.nodes.size) {\n controller.moveToStartOfDocument()\n }\n\n return controller\n }\n\n /**\n * Ask a query by `type` with `...args`.\n *\n * @param {String|Function} type\n * @param {Any} ...args\n * @return {Any}\n */\n\n query(type, ...args) {\n const { controller } = this\n\n if (typeof type === 'function') {\n return type(controller, ...args)\n }\n\n debug('query', { type, args })\n const obj = { type, args }\n return this.run('onQuery', obj)\n }\n\n /**\n * Register a command `type` with the editor.\n *\n * @param {String} type\n * @return {Editor}\n */\n\n registerCommand(type) {\n const { controller } = this\n\n if (type in controller && controller[type].__command) {\n return controller\n }\n\n invariant(\n !(type in controller),\n `You cannot register a \\`${type}\\` command because it would overwrite an existing property of the \\`Editor\\`.`\n )\n\n const method = (...args) => this.command(type, ...args)\n controller[type] = method\n method.__command = true\n return controller\n }\n\n /**\n * Register a query `type` with the editor.\n *\n * @param {String} type\n * @return {Editor}\n */\n\n registerQuery(type) {\n const { controller } = this\n\n if (type in controller && controller[type].__query) {\n return controller\n }\n\n invariant(\n !(type in controller),\n `You cannot register a \\`${type}\\` query because it would overwrite an existing property of the \\`Editor\\`.`\n )\n\n const method = (...args) => this.query(type, ...args)\n controller[type] = method\n method.__query = true\n return controller\n }\n\n /**\n * Run through the middleware stack by `key` with `args`.\n *\n * @param {String} key\n * @param {Any} ...args\n * @return {Any}\n */\n\n run(key, ...args) {\n const { controller, middleware } = this\n const fns = middleware[key] || []\n let i = 0\n\n function next(...overrides) {\n const fn = fns[i++]\n if (!fn) return\n\n if (overrides.length) {\n args = overrides\n }\n\n const ret = fn(...args, controller, next)\n return ret\n }\n\n Object.defineProperty(next, 'change', {\n get() {\n invariant(\n false,\n 'As of Slate 0.42, the `editor` is no longer passed as the third argument to event handlers. You can access it via `change.editor` instead.'\n )\n },\n })\n\n Object.defineProperty(next, 'onChange', {\n get() {\n invariant(\n false,\n 'As of Slate 0.42, the `editor` is no longer passed as the third argument to event handlers. You can access it via `change.editor` instead.'\n )\n },\n })\n\n Object.defineProperty(next, 'props', {\n get() {\n invariant(\n false,\n 'As of Slate 0.42, the `editor` is no longer passed as the third argument to event handlers. You can access it via `change.editor` instead.'\n )\n },\n })\n\n Object.defineProperty(next, 'schema', {\n get() {\n invariant(\n false,\n 'As of Slate 0.42, the `editor` is no longer passed as the third argument to event handlers. You can access it via `change.editor` instead.'\n )\n },\n })\n\n Object.defineProperty(next, 'stack', {\n get() {\n invariant(\n false,\n 'As of Slate 0.42, the `editor` is no longer passed as the third argument to event handlers. You can access it via `change.editor` instead.'\n )\n },\n })\n\n return next()\n }\n\n /**\n * Set the `readOnly` flag.\n *\n * @param {Boolean} readOnly\n * @return {Editor}\n */\n\n setReadOnly(readOnly) {\n this.readOnly = readOnly\n return this\n }\n\n /**\n * Set the editor's `value`.\n *\n * @param {Value} value\n * @param {Options} options\n * @return {Editor}\n */\n\n setValue(value, options = {}) {\n const { normalize = value !== this.value } = options\n this.value = value\n\n if (normalize) {\n this.normalize()\n }\n\n return this\n }\n\n /**\n * Apply a series of changes inside a synchronous `fn`, deferring\n * normalization until after the function has finished executing.\n *\n * @param {Function} fn\n * @return {Editor}\n */\n\n withoutNormalizing(fn) {\n const { controller } = this\n const value = this.tmp.normalize\n this.tmp.normalize = false\n fn(controller)\n this.tmp.normalize = value\n normalizeDirtyPaths(this)\n return controller\n }\n\n /**\n * Deprecated.\n */\n\n get editor() {\n warning(\n false,\n \"As of Slate 0.43 the `change` object has been replaced with `editor`, so you don't need to access `change.editor`.\"\n )\n\n return this.controller\n }\n\n change(fn, ...args) {\n warning(\n false,\n 'As of Slate 0.43 the `change` object has been replaced with `editor`, so the `editor.change()` method is deprecated.`'\n )\n\n fn(this.controller, ...args)\n }\n\n call(fn, ...args) {\n warning(\n false,\n 'As of Slate 0.43 the `editor.call(fn)` method has been deprecated, please use `editor.command(fn)` instead.'\n )\n\n fn(this.controller, ...args)\n return this.controller\n }\n\n applyOperations(operations) {\n warning(\n false,\n 'As of Slate 0.43 the `applyOperations` method is deprecated, please apply each operation in a loop instead.'\n )\n\n operations.forEach(op => this.applyOperation(op))\n return this.controller\n }\n\n setOperationFlag(key, value) {\n warning(\n false,\n 'As of slate@0.41 the `change.setOperationFlag` method has been deprecated.'\n )\n\n this.tmp[key] = value\n return this\n }\n\n getFlag(key, options = {}) {\n warning(\n false,\n 'As of slate@0.41 the `change.getFlag` method has been deprecated.'\n )\n\n return options[key] !== undefined ? options[key] : this.tmp[key]\n }\n\n unsetOperationFlag(key) {\n warning(\n false,\n 'As of slate@0.41 the `change.unsetOperationFlag` method has been deprecated.'\n )\n\n delete this.tmp[key]\n return this\n }\n\n withoutNormalization(fn) {\n warning(\n false,\n 'As of slate@0.41 the `change.withoutNormalization` helper has been renamed to `change.withoutNormalizing`.'\n )\n\n return this.withoutNormalizing(fn)\n }\n}\n\n/**\n * Get the \"dirty\" paths for a given `operation`.\n *\n * @param {Operation} operation\n * @return {Array}\n */\n\nfunction getDirtyPaths(operation) {\n const { type, node, path, newPath } = operation\n\n switch (type) {\n case 'add_mark':\n case 'insert_text':\n case 'remove_mark':\n case 'remove_text':\n case 'set_mark':\n case 'set_node': {\n const ancestors = PathUtils.getAncestors(path).toArray()\n return [...ancestors, path]\n }\n\n case 'insert_node': {\n const table = node.getKeysToPathsTable()\n const paths = Object.values(table).map(p => path.concat(p))\n const ancestors = PathUtils.getAncestors(path).toArray()\n return [...ancestors, path, ...paths]\n }\n\n case 'split_node': {\n const ancestors = PathUtils.getAncestors(path).toArray()\n const nextPath = PathUtils.increment(path)\n return [...ancestors, path, nextPath]\n }\n\n case 'merge_node': {\n const ancestors = PathUtils.getAncestors(path).toArray()\n const previousPath = PathUtils.decrement(path)\n return [...ancestors, previousPath]\n }\n\n case 'move_node': {\n if (PathUtils.isEqual(path, newPath)) {\n return []\n }\n\n const oldAncestors = PathUtils.getAncestors(path).reduce((arr, p) => {\n arr.push(...PathUtils.transform(p, operation).toArray())\n return arr\n }, [])\n\n const newAncestors = PathUtils.getAncestors(newPath).reduce((arr, p) => {\n arr.push(...PathUtils.transform(p, operation).toArray())\n return arr\n }, [])\n\n return [...oldAncestors, ...newAncestors]\n }\n\n case 'remove_node': {\n const ancestors = PathUtils.getAncestors(path).toArray()\n return [...ancestors]\n }\n\n default: {\n return []\n }\n }\n}\n\n/**\n * Normalize any new \"dirty\" paths that have been added to the change.\n *\n * @param {Editor}\n */\n\nfunction normalizeDirtyPaths(editor) {\n if (!editor.tmp.normalize) {\n return\n }\n\n if (!editor.tmp.dirty.length) {\n return\n }\n\n editor.withoutNormalizing(() => {\n while (editor.tmp.dirty.length) {\n const path = editor.tmp.dirty.pop()\n normalizeNodeByPath(editor, path)\n }\n })\n}\n\n/**\n * Normalize the node at a specific `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n */\n\nfunction normalizeNodeByPath(editor, path) {\n const { controller } = editor\n let { value } = editor\n let { document } = value\n let node = document.assertNode(path)\n let iterations = 0\n const max = 100 + (node.object === 'text' ? 1 : node.nodes.size)\n\n while (node) {\n const fn = node.normalize(controller)\n\n if (!fn) {\n break\n }\n\n // Run the normalize `fn` to fix the node.\n fn(controller)\n\n // Attempt to re-find the node by path, or by key if it has changed\n // locations in the tree continue iterating.\n value = editor.value\n document = value.document\n const { key } = node\n let found = document.getDescendant(path)\n\n if (found && found.key === key) {\n node = found\n } else {\n found = document.getDescendant(key)\n\n if (found) {\n node = found\n path = document.getPath(key)\n } else {\n // If it no longer exists by key, it was removed, so we're done.\n break\n }\n }\n\n // Increment the iterations counter, and check to make sure that we haven't\n // exceeded the max. Without this check, it's easy for the `normalize`\n // function of a schema rule to be written incorrectly and for an infinite\n // invalid loop to occur.\n iterations++\n\n if (iterations > max) {\n throw new Error(\n 'A schema rule could not be normalized after sufficient iterations. This is usually due to a `rule.normalize` or `plugin.normalizeNode` function of a schema being incorrectly written, causing an infinite loop.'\n )\n }\n }\n}\n\n/**\n * Register a `plugin` with the editor.\n *\n * @param {Editor} editor\n * @param {Object|Array|Null} plugin\n */\n\nfunction registerPlugin(editor, plugin) {\n if (Array.isArray(plugin)) {\n plugin.forEach(p => registerPlugin(editor, p))\n return\n }\n\n if (plugin == null) {\n return\n }\n\n const { commands, queries, schema, ...rest } = plugin\n\n if (commands) {\n const commandsPlugin = CommandsPlugin(commands)\n registerPlugin(editor, commandsPlugin)\n }\n\n if (queries) {\n const queriesPlugin = QueriesPlugin(queries)\n registerPlugin(editor, queriesPlugin)\n }\n\n if (schema) {\n const schemaPlugin = SchemaPlugin(schema)\n registerPlugin(editor, schemaPlugin)\n }\n\n for (const key in rest) {\n const fn = rest[key]\n const middleware = (editor.middleware[key] = editor.middleware[key] || [])\n middleware.push(fn)\n }\n}\n\n/**\n * Export.\n *\n * @type {Editor}\n */\n\nexport default Editor\n","import isPlainObject from 'is-plain-object'\nimport warning from 'tiny-warning'\nimport { List, Record, Set } from 'immutable'\n\nimport Mark from './mark'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n marks: undefined,\n text: undefined,\n}\n\n/**\n * Leaf.\n *\n * @type {Leaf}\n */\n\nclass Leaf extends Record(DEFAULTS) {\n /**\n * Create a new `Leaf` with `attrs`.\n *\n * @param {Object|Leaf} attrs\n * @return {Leaf}\n */\n\n static create(attrs = {}) {\n warning(false, 'As of slate@0.47 the `Leaf` model is deprecated.')\n\n if (Leaf.isLeaf(attrs)) {\n return attrs\n }\n\n if (typeof attrs === 'string') {\n attrs = { text: attrs }\n }\n\n if (isPlainObject(attrs)) {\n return Leaf.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Leaf.create\\` only accepts objects, strings or leaves, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a valid List of `Leaf` from `leaves`\n *\n * @param {List<Leaf>} leaves\n * @return {List<Leaf>}\n */\n\n static createLeaves(leaves) {\n if (leaves.size <= 1) return leaves\n\n let invalid = false\n\n // TODO: we can make this faster with [List] and then flatten\n const result = List().withMutations(cache => {\n // Search from the leaves left end to find invalid node;\n leaves.findLast((leaf, index) => {\n const firstLeaf = cache.first()\n\n // If the first leaf of cache exist, check whether the first leaf is connectable with the current leaf\n if (firstLeaf) {\n // If marks equals, then the two leaves can be connected\n if (firstLeaf.marks.equals(leaf.marks)) {\n invalid = true\n cache.set(0, firstLeaf.set('text', `${leaf.text}${firstLeaf.text}`))\n return\n }\n\n // If the cached leaf is empty, drop the empty leaf with the upcoming leaf\n if (firstLeaf.text === '') {\n invalid = true\n cache.set(0, leaf)\n return\n }\n\n // If the current leaf is empty, drop the leaf\n if (leaf.text === '') {\n invalid = true\n return\n }\n }\n\n cache.unshift(leaf)\n })\n })\n\n if (!invalid) return leaves\n return result\n }\n\n /**\n * Split a list of leaves to two lists; if the leaves are valid leaves, the returned leaves are also valid\n * Corner Cases:\n * 1. if offset is smaller than 0, then return [List(), leaves]\n * 2. if offset is bigger than the text length, then return [leaves, List()]\n *\n * @param {List<Leaf> leaves\n * @return {Array<List<Leaf>>}\n */\n\n static splitLeaves(leaves, offset) {\n if (offset < 0) return [List(), leaves]\n\n if (leaves.size === 0) {\n return [List(), List()]\n }\n\n let endOffset = 0\n let index = -1\n let left, right\n\n leaves.find(leaf => {\n index++\n const startOffset = endOffset\n const { text } = leaf\n endOffset += text.length\n\n if (endOffset < offset) return false\n if (startOffset > offset) return false\n\n const length = offset - startOffset\n left = leaf.set('text', text.slice(0, length))\n right = leaf.set('text', text.slice(length))\n return true\n })\n\n if (!left) return [leaves, List()]\n\n if (left.text === '') {\n if (index === 0) {\n return [List.of(left), leaves]\n }\n\n return [leaves.take(index), leaves.skip(index)]\n }\n\n if (right.text === '') {\n if (index === leaves.size - 1) {\n return [leaves, List.of(right)]\n }\n\n return [leaves.take(index + 1), leaves.skip(index + 1)]\n }\n\n return [\n leaves.take(index).push(left),\n leaves.skip(index + 1).unshift(right),\n ]\n }\n\n /**\n * Create a `Leaf` list from `attrs`.\n *\n * @param {Array<Leaf|Object>|List<Leaf|Object>} attrs\n * @return {List<Leaf>}\n */\n\n static createList(attrs = []) {\n if (List.isList(attrs) || Array.isArray(attrs)) {\n const list = new List(attrs.map(Leaf.create))\n return list\n }\n\n throw new Error(\n `\\`Leaf.createList\\` only accepts arrays or lists, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a `Leaf` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Leaf}\n */\n\n static fromJSON(object) {\n const { text = '', marks = [] } = object\n\n const leaf = new Leaf({\n text,\n marks: Set(marks.map(Mark.fromJSON)),\n })\n\n return leaf\n }\n\n /**\n * Check if `any` is a list of leaves.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isLeafList(any) {\n return List.isList(any) && any.every(item => Leaf.isLeaf(item))\n }\n\n /**\n * Update a `mark` at leaf, replace with newMark\n *\n * @param {Mark} mark\n * @param {Mark} newMark\n * @returns {Leaf}\n */\n\n updateMark(mark, newMark) {\n const { marks } = this\n if (newMark.equals(mark)) return this\n if (!marks.has(mark)) return this\n const newMarks = marks.withMutations(collection => {\n collection.remove(mark).add(newMark)\n })\n return this.set('marks', newMarks)\n }\n\n /**\n * Add a `mark` to the leaf.\n *\n * @param {Mark} mark\n * @returns {Text}\n */\n\n addMark(mark) {\n const { marks } = this\n return this.set('marks', marks.add(mark))\n }\n\n /**\n * Add a `set` of marks to the leaf.\n *\n * @param {Set<Mark>} set\n * @returns {Text}\n */\n\n addMarks(set) {\n const { marks } = this\n return this.set('marks', marks.union(set))\n }\n\n /**\n * Insert a text `string` into the leaf at `offset`.\n *\n * @param {Number} offset\n * @param {String} string\n * @return {Leaf}\n */\n\n insertText(offset, string) {\n const { text } = this\n const next = text.slice(0, offset) + string + text.slice(offset)\n return this.set('text', next)\n }\n\n /**\n * Remove a `mark` from the leaf.\n *\n * @param {Mark} mark\n * @returns {Text}\n */\n\n removeMark(mark) {\n const { marks } = this\n return this.set('marks', marks.remove(mark))\n }\n\n /**\n * Return a JSON representation of the leaf.\n *\n * @return {Object}\n */\n\n toJSON() {\n const object = {\n object: this.object,\n text: this.text,\n marks: this.marks.toArray().map(m => m.toJSON()),\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Leaf}\n */\n\nexport default Leaf\n","/**\n * Mix in an `Interface` to a `Class`.\n *\n * @param {Class} Interface\n * @param {Class} Class\n */\n\nexport default function mixin(Interface, Classes) {\n for (const Class of Classes) {\n // Copy static properties from the interface.\n for (const name of Object.getOwnPropertyNames(Interface)) {\n if (Class.hasOwnProperty(name)) continue\n const desc = Object.getOwnPropertyDescriptor(Interface, name)\n Object.defineProperty(Class, name, desc)\n }\n\n // Copy instance properties from the interface.\n for (const name of Object.getOwnPropertyNames(Interface.prototype)) {\n if (Class.prototype.hasOwnProperty(name)) continue\n const desc = Object.getOwnPropertyDescriptor(Interface.prototype, name)\n Object.defineProperty(Class.prototype, name, desc)\n }\n }\n}\n","import Annotation from '../models/annotation'\nimport Block from '../models/block'\nimport Change from '../models/change'\nimport Decoration from '../models/decoration'\nimport Document from '../models/document'\nimport Editor from '../controllers/editor'\nimport Inline from '../models/inline'\nimport Leaf from '../models/leaf'\nimport Mark from '../models/mark'\nimport Node from '../models/node'\nimport Operation from '../models/operation'\nimport Point from '../models/point'\nimport Range from '../models/range'\nimport Selection from '../models/selection'\nimport Text from '../models/text'\nimport Value from '../models/value'\nimport isObject, { TYPES } from '../utils/is-object'\nimport mixin from '../utils/mixin'\n\n/**\n * A factory for the interface that all Slate objects implement.\n *\n * @type {Function}\n */\n\nfunction create(type) {\n const TYPE = TYPES[type]\n const camel = `${type.charAt(0).toUpperCase()}${type.slice(1)}`\n const is = `is${camel}`\n\n class ObjectInterface {\n /**\n * Return the type of the object.\n *\n * @return {String}\n */\n\n get object() {\n return type\n }\n }\n\n ObjectInterface[is] = isObject.bind(null, type)\n ObjectInterface.prototype[TYPE] = true\n return ObjectInterface\n}\n\n/**\n * Mix in the object interfaces.\n */\n\nObject.entries({\n Annotation,\n Block,\n Change,\n Decoration,\n Document,\n Editor,\n Inline,\n Leaf,\n Mark,\n Node,\n Operation,\n Point,\n Range,\n Selection,\n Text,\n Value,\n}).forEach(([camel, obj]) => mixin(create(camel.toLowerCase()), [obj]))\n","import mixin from '../utils/mixin'\nimport Annotation from '../models/annotation'\nimport Block from '../models/block'\nimport Decoration from '../models/decoration'\nimport Document from '../models/document'\nimport Inline from '../models/inline'\nimport Leaf from '../models/leaf'\nimport Mark from '../models/mark'\nimport Node from '../models/node'\nimport Operation from '../models/operation'\nimport Point from '../models/point'\nimport Range from '../models/range'\nimport Selection from '../models/selection'\nimport Text from '../models/text'\nimport Value from '../models/value'\n\n/**\n * The interface that all Slate models implement.\n *\n * @type {Class}\n */\n\nclass ModelInterface {\n /**\n * Alias `fromJS`.\n */\n\n static fromJS(...args) {\n return this.fromJSON(...args)\n }\n\n /**\n * Alias `toJS`.\n */\n\n toJS(...args) {\n return this.toJSON(...args)\n }\n}\n\n/**\n * Mix in the common interface.\n *\n * @param {Record}\n */\n\nmixin(ModelInterface, [\n Annotation,\n Block,\n Decoration,\n Document,\n Inline,\n Leaf,\n Mark,\n Node,\n Operation,\n Point,\n Range,\n Selection,\n Text,\n Value,\n])\n","/* global WeakMap, Map, Symbol */\n\n/**\n * GLOBAL: True if memoization should is enabled.\n *\n * @type {Boolean}\n */\n\nlet ENABLED = true\n\n/**\n * The leaf node of a cache tree. Used to support variable argument length. A\n * unique object, so that native Maps will key it by reference.\n *\n * @type {Symbol}\n */\n\nconst LEAF = Symbol('LEAF')\n\n/**\n * The node of a cache tree for a WeakMap to store cache visited by objects\n *\n * @type {Symbol}\n */\n\nconst STORE_KEY = Symbol('STORE_KEY')\n\n/**\n * Values to represent a memoized undefined and null value. Allows efficient value\n * retrieval using Map.get only.\n *\n * @type {Symbol}\n */\n\nconst UNDEFINED = Symbol('undefined')\nconst NULL = Symbol('null')\n\n/**\n * Default value for unset keys in native Maps\n *\n * @type {Undefined}\n */\n\nconst UNSET = undefined\n\n/**\n * Global Store for all cached values\n *\n * @type {WeakMap}\n */\n\nlet memoizeStore = new WeakMap()\n\n/**\n * Memoize all of the `properties` on a `object`.\n *\n * @param {Object} object\n * @param {Array} properties\n * @return {Record}\n */\n\nfunction memoize(object, properties) {\n for (const property of properties) {\n const original = object[property]\n\n if (!original) {\n throw new Error(`Object does not have a property named \"${property}\".`)\n }\n\n object[property] = function(...args) {\n // If memoization is disabled, call into the original method.\n if (!ENABLED) return original.apply(this, args)\n\n if (!memoizeStore.has(this)) {\n memoizeStore.set(this, {\n noArgs: {},\n hasArgs: {},\n })\n }\n\n const { noArgs, hasArgs } = memoizeStore.get(this)\n\n const takesArguments = args.length !== 0\n\n let cachedValue\n let keys\n\n if (takesArguments) {\n keys = [property, ...args]\n cachedValue = getIn(hasArgs, keys)\n } else {\n cachedValue = noArgs[property]\n }\n\n // If we've got a result already, return it.\n if (cachedValue !== UNSET) {\n return cachedValue === UNDEFINED ? undefined : cachedValue\n }\n\n // Otherwise calculate what it should be once and cache it.\n const value = original.apply(this, args)\n const v = value === undefined ? UNDEFINED : value\n\n if (takesArguments) {\n setIn(hasArgs, keys, v)\n } else {\n noArgs[property] = v\n }\n\n return value\n }\n }\n}\n\n/**\n * Get a value at a key path in a tree of Map.\n *\n * If not set, returns UNSET.\n * If the set value is undefined, returns UNDEFINED.\n *\n * @param {Map} map\n * @param {Array} keys\n * @return {Any|UNSET|UNDEFINED}\n */\n\nfunction getIn(map, keys) {\n for (let key of keys) {\n if (key === undefined) {\n key = UNDEFINED\n } else if (key == null) {\n key = NULL\n }\n\n if (typeof key === 'object') {\n map = map[STORE_KEY] && map[STORE_KEY].get(key)\n } else {\n map = map[key]\n }\n\n if (map === UNSET) return UNSET\n }\n\n return map[LEAF]\n}\n\n/**\n * Set a value at a key path in a tree of Map, creating Maps on the go.\n *\n * @param {Map} map\n * @param {Array} keys\n * @param {Any} value\n * @return {Map}\n */\n\nfunction setIn(map, keys, value) {\n let child = map\n\n for (let key of keys) {\n if (key === undefined) {\n key = UNDEFINED\n } else if (key == null) {\n key = NULL\n }\n\n if (typeof key !== 'object') {\n if (!child[key]) {\n child[key] = {}\n }\n\n child = child[key]\n continue\n }\n\n if (!child[STORE_KEY]) {\n child[STORE_KEY] = new WeakMap()\n }\n\n if (!child[STORE_KEY].has(key)) {\n const newChild = {}\n child[STORE_KEY].set(key, newChild)\n child = newChild\n continue\n }\n\n child = child[STORE_KEY].get(key)\n }\n\n // The whole path has been created, so set the value to the bottom most map.\n child[LEAF] = value\n return map\n}\n\n/**\n * In DEV mode, clears the previously memoized values, globally.\n *\n * @return {Void}\n */\n\nfunction resetMemoization() {\n memoizeStore = new WeakMap()\n}\n\n/**\n * In DEV mode, enable or disable the use of memoize values, globally.\n *\n * @param {Boolean} enabled\n * @return {Void}\n */\n\nfunction useMemoization(enabled) {\n ENABLED = enabled\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default memoize\nexport { resetMemoization, useMemoization }\n","import warning from 'tiny-warning'\nimport { List } from 'immutable'\n\nimport mixin from '../utils/mixin'\nimport Block from '../models/block'\nimport Document from '../models/document'\nimport Inline from '../models/inline'\nimport Node from '../models/node'\nimport KeyUtils from '../utils/key-utils'\nimport memoize from '../utils/memoize'\nimport PathUtils from '../utils/path-utils'\nimport Text from '../models/text'\n\n/**\n * The interface that `Document`, `Block` and `Inline` all implement, to make\n * working with the recursive node tree easier.\n *\n * @type {Class}\n */\n\nclass NodeInterface {\n /**\n * Get the first text node of a node, or the node itself.\n *\n * @return {Node|Null}\n */\n\n getFirstText() {\n if (this.object === 'text') {\n return this\n }\n\n let descendant = null\n\n const found = this.nodes.find(node => {\n if (node.object === 'text') return true\n descendant = node.getFirstText()\n return !!descendant\n })\n\n return descendant || found\n }\n\n /**\n * Get an object mapping all the keys in the node to their paths.\n *\n * @return {Object}\n */\n\n getKeysToPathsTable() {\n const ret = {\n [this.key]: [],\n }\n\n if (this.nodes) {\n this.nodes.forEach((node, i) => {\n const nested = node.getKeysToPathsTable()\n\n for (const key in nested) {\n const path = nested[key]\n\n warning(\n !(key in ret),\n `A node with a duplicate key of \"${key}\" was found! Duplicate keys are not allowed, you should use \\`node.regenerateKey\\` before inserting if you are reusing an existing node.`\n )\n\n ret[key] = [i, ...path]\n }\n })\n }\n\n return ret\n }\n\n /**\n * Get the last text node of a node, or the node itself.\n *\n * @return {Node|Null}\n */\n\n getLastText() {\n if (this.object === 'text') {\n return this\n }\n\n let descendant = null\n\n const found = this.nodes.findLast(node => {\n if (node.object === 'text') return true\n descendant = node.getLastText()\n return descendant\n })\n\n return descendant || found\n }\n\n /**\n * Get a node in the tree, or the node itself.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getNode(path) {\n path = this.resolvePath(path)\n if (!path) return null\n if (this.object === 'text' && path.size) return null\n const node = path.size ? this.getDescendant(path) : this\n return node\n }\n\n /**\n * Find the path to a node.\n *\n * @param {String|List} key\n * @return {List}\n */\n\n getPath(key) {\n // COMPAT: Handle passing in a path, to match other methods.\n if (List.isList(key)) {\n return key\n }\n\n // COMPAT: Handle a node object by iterating the descendants tree, so that\n // we avoid using keys for the future.\n if (Node.isNode(key) && this.descendants) {\n for (const [node, path] of this.descendants()) {\n if (key === node) return path\n }\n }\n\n const dict = this.getKeysToPathsTable()\n const path = dict[key]\n return path ? List(path) : null\n }\n\n /**\n * Get the concatenated text string of a node.\n *\n * @return {String}\n */\n\n getText() {\n if (this.object === 'text') {\n return this.text\n }\n\n const text = this.nodes.reduce((memo, c) => memo + c.text, '')\n return text\n }\n\n /**\n * Check if a node exists.\n *\n * @param {List|String} path\n * @return {Boolean}\n */\n\n hasNode(path) {\n const node = this.getNode(path)\n return !!node\n }\n\n /**\n * Normalize the text node with an `editor`.\n *\n * @param {Editor} editor\n * @return {Function|Void}\n */\n\n normalize(editor) {\n const normalizer = editor.run('normalizeNode', this)\n return normalizer\n }\n\n /**\n * Regenerate the node's key.\n *\n * @return {Node}\n */\n\n regenerateKey() {\n const key = KeyUtils.create()\n const node = this.set('key', key)\n return node\n }\n\n /**\n * Resolve a path from a path list or key string.\n *\n * An `index` can be provided, in which case paths created from a key string\n * will have the index pushed onto them. This is helpful in cases where you\n * want to accept either a `path` or a `key, index` combination for targeting\n * a location in the tree that doesn't exist yet, like when inserting.\n *\n * @param {List|String} value\n * @param {Number} index\n * @return {List}\n */\n\n resolvePath(path, index) {\n if (typeof path === 'string') {\n path = this.getPath(path)\n\n if (index != null) {\n path = path.concat(index)\n }\n } else {\n path = PathUtils.create(path)\n }\n\n return path\n }\n\n /**\n * Validate the node with an `editor`.\n *\n * @param {Editor} editor\n * @return {Error|Void}\n */\n\n validate(editor) {\n const error = editor.run('validateNode', this)\n return error\n }\n}\n\n/**\n * Memoize read methods.\n */\n\nmemoize(NodeInterface.prototype, [\n 'getFirstText',\n 'getKeysToPathsTable',\n 'getLastText',\n 'getText',\n 'normalize',\n 'validate',\n])\n\n/**\n * Mix in the node interface.\n */\n\nmixin(NodeInterface, [Block, Document, Inline, Text])\n","export default typeof global !== \"undefined\" ? global :\n typeof self !== \"undefined\" ? self :\n typeof window !== \"undefined\" ? window : {}\n","export default function identity() {\n return true\n}\n","import getDirection from 'direction'\nimport invariant from 'tiny-invariant'\nimport warning from 'tiny-warning'\nimport { List, OrderedSet, Set } from 'immutable'\n\nimport Annotation from '../models/annotation'\nimport Block from '../models/block'\nimport Decoration from '../models/decoration'\nimport Document from '../models/document'\nimport Inline from '../models/inline'\nimport Operation from '../models/operation'\nimport PathUtils from '../utils/path-utils'\nimport Point from '../models/point'\nimport Range from '../models/range'\nimport Selection from '../models/selection'\nimport Value from '../models/value'\nimport identity from '../utils/identity'\nimport memoize from '../utils/memoize'\nimport mixin from '../utils/mixin'\n\n/**\n * The interface that `Document`, `Block` and `Inline` all implement, to make\n * working with the recursive node tree easier.\n *\n * @type {Class}\n */\n\nclass ElementInterface {\n /**\n * Get the concatenated text of the node.\n *\n * @return {String}\n */\n\n get text() {\n return this.getText()\n }\n\n /**\n * Add `mark` to text at `path`.\n *\n * @param {List|String} path\n * @param {Mark} mark\n * @return {Node}\n */\n\n addMark(path, mark) {\n path = this.resolvePath(path)\n let node = this.assertDescendant(path)\n node = node.addMark(mark)\n const ret = this.replaceNode(path, node)\n return ret\n }\n\n /**\n * Create an iteratable for all of the ancestors of the node.\n *\n * @return {Iterable}\n */\n\n ancestors(path) {\n const iterable = this.createIterable({\n path,\n direction: null,\n downward: false,\n includeTargetAncestors: true,\n includeRoot: true,\n })\n\n return iterable\n }\n\n /**\n * Create an iteratable for all of the blocks of a node with `options`.\n *\n * @param {Options}\n * @return {Iterable}\n */\n\n blocks(options = {}) {\n const { onlyLeaves, onlyRoots, onlyTypes, match, ...rest } = options\n const iterable = this.descendants({\n includeDocument: false,\n includeInlines: false,\n includeTexts: false,\n ...rest,\n match: (node, path) => {\n if (onlyTypes && !onlyTypes.includes(node.type)) {\n return false\n } else if (onlyRoots && path.size !== 1) {\n return false\n } else if (onlyLeaves && !node.isLeafBlock()) {\n return false\n } else if (match && !match(node, path)) {\n return false\n } else {\n return true\n }\n },\n })\n\n return iterable\n }\n\n /**\n * Create an annotation with `properties` relative to the node.\n *\n * @param {Object|Annotation} properties\n * @return {Annotation}\n */\n\n createAnnotation(properties) {\n properties = Annotation.createProperties(properties)\n const annotation = this.resolveAnnotation(properties)\n return annotation\n }\n\n /**\n * Create a decoration with `properties` relative to the node.\n *\n * @param {Object|Decoration} properties\n * @return {Decoration}\n */\n\n createDecoration(properties) {\n properties = Decoration.createProperties(properties)\n const decoration = this.resolveDecoration(properties)\n return decoration\n }\n\n /**\n * Create an iteratable function starting at `target` path with `options`.\n *\n * @param {Object} options (optional)\n * @return {Function}\n */\n\n createIterable(options = {}) {\n const {\n direction = 'forward',\n downward = true,\n upward = true,\n includeBlocks = true,\n includeDocument = true,\n includeInlines = true,\n includeRoot = false,\n includeTarget = !!options.range,\n includeTargetAncestors = false,\n includeTexts = true,\n match = null,\n } = options\n\n const root = this\n let targetPath = null\n let targetRange = null\n\n // You can iterate over either a range or a path, but not both.\n if (options.range) {\n targetRange = root.resolveRange(options.range)\n targetPath = root.resolvePath(targetRange.start.path)\n } else if (options.path) {\n targetPath = root.resolvePath(options.path)\n }\n\n const targetNode = targetPath && root.assertNode(targetPath)\n const NativeSet = typeof window === 'undefined' ? global.Set : window.Set\n\n // Return an object that implements the iterable interface.\n return {\n [Symbol.iterator]() {\n const visited = new NativeSet()\n const startPath = targetRange && targetRange.start.path\n const endPath = targetRange && targetRange.end.path\n let path = targetPath\n let node = targetNode\n let includedTarget = false\n let includedStart = false\n let includingStart = false\n\n const result = () => {\n // When these are nulled out we've finished iterating.\n if (!path || !node) {\n return { done: true }\n }\n\n // We often don't want to include the root node itself.\n if (!includeRoot && node === root) {\n return next()\n }\n\n if (!includeBlocks && node.object === 'block') {\n return next()\n }\n\n if (!includeDocument && node.object === 'document') {\n return next()\n }\n\n if (!includeInlines && node.object === 'inline') {\n return next()\n }\n\n if (!includeTexts && node.object === 'text') {\n return next()\n }\n\n if (match && !match(node, path)) {\n return next()\n }\n\n return { value: [node, path], done: false }\n }\n\n const next = () => {\n if (!path || !node) {\n return result()\n }\n\n // When iterating over a range, we need to include the specific\n // ancestors in the start path of the range manually.\n if (startPath && !includedStart) {\n if (!includingStart) {\n includingStart = true\n path = PathUtils.create([])\n node = root\n return result()\n }\n\n if (path.size === startPath.size - 1) {\n includedStart = true\n path = targetPath\n node = targetNode\n return next()\n }\n\n path = startPath.slice(0, path.size + 1)\n node = root.assertNode(path)\n return result()\n }\n\n // Sometimes we want to include the target itself.\n if (includeTarget && !includedTarget) {\n includedTarget = true\n return result()\n }\n\n // When iterating over a range, if we get to the end path then exit.\n if (endPath && path.equals(endPath)) {\n node = null\n path = null\n return next()\n }\n\n // If we're allowed to go downward, and we haven't decsended yet, do so.\n if (downward && node.nodes && node.nodes.size && !visited.has(node)) {\n visited.add(node)\n const nextIndex = direction === 'forward' ? 0 : node.nodes.size - 1\n path = path.push(nextIndex)\n node = root.assertNode(path)\n return result()\n }\n\n // If we're going forward...\n if (direction === 'forward') {\n const newPath = PathUtils.increment(path)\n const newNode = root.getNode(newPath)\n\n if (newNode) {\n path = newPath\n node = newNode\n return result()\n }\n }\n\n // If we're going backward...\n if (direction === 'backward' && path.last() !== 0) {\n const newPath = PathUtils.decrement(path)\n const newNode = root.getNode(newPath)\n\n if (newNode) {\n path = newPath\n node = newNode\n return result()\n }\n }\n\n // If we're going upward...\n if (upward && path.size) {\n path = PathUtils.lift(path)\n node = root.assertNode(path)\n\n // Sometimes we'll have already visited the node on the way down\n // so we don't want to double count it.\n if (visited.has(node)) {\n return next()\n }\n\n visited.add(node)\n\n // If ancestors of the target node shouldn't be included, skip them.\n if (!includeTargetAncestors) {\n return next()\n } else {\n return result()\n }\n }\n\n path = null\n node = null\n return next()\n }\n\n return { next }\n },\n }\n }\n\n /**\n * Create a point with `properties` relative to the node.\n *\n * @param {Object|Point} properties\n * @return {Range}\n */\n\n createPoint(properties) {\n properties = Point.createProperties(properties)\n const point = this.resolvePoint(properties)\n return point\n }\n\n /**\n * Create a range with `properties` relative to the node.\n *\n * @param {Object|Range} properties\n * @return {Range}\n */\n\n createRange(properties) {\n properties = Range.createProperties(properties)\n const range = this.resolveRange(properties)\n return range\n }\n\n /**\n * Create a selection with `properties` relative to the node.\n *\n * @param {Object|Selection} properties\n * @return {Selection}\n */\n\n createSelection(properties) {\n properties = Selection.createProperties(properties)\n const selection = this.resolveSelection(properties)\n return selection\n }\n\n /**\n * Create an iteratable for all of the descendants of the node.\n *\n * @param {Object} options\n * @return {Iterable}\n */\n\n descendants(options) {\n const iterable = this.createIterable({ path: [], ...options })\n return iterable\n }\n\n /**\n * Find all of the descendants that match a `predicate`.\n *\n * @param {Function} predicate\n * @return {List<Node>}\n */\n\n filterDescendants(predicate = identity) {\n const matches = []\n\n for (const [node, path] of this.descendants()) {\n if (predicate(node, path)) {\n matches.push(node)\n }\n }\n\n return List(matches)\n }\n\n /**\n * Find the first descendant that matches a `predicate`.\n *\n * @param {Function} predicate\n * @return {Node|Null}\n */\n\n findDescendant(predicate = identity) {\n for (const [node, path] of this.descendants()) {\n if (predicate(node, path)) {\n return node\n }\n }\n\n return null\n }\n\n /**\n * Iterate over all descendants, breaking if `predicate` returns false.\n *\n * @param {Function} predicate\n */\n\n forEachDescendant(predicate = identity) {\n for (const next of this.descendants()) {\n const ret = predicate(...next)\n\n if (ret === false) {\n return\n }\n }\n }\n\n /**\n * Get a set of the active marks in a `range`. Active marks are marks that are\n * on every text node in a given range. This is a common distinction for\n * highlighting toolbar buttons for example.\n *\n * TODO: this method needs to be cleaned up, it's very hard to follow and\n * probably doing unnecessary work.\n *\n * @param {Range} range\n * @return {Set<Mark>}\n */\n\n getActiveMarksAtRange(range) {\n range = this.resolveRange(range)\n\n if (range.isUnset) {\n return Set()\n }\n\n if (range.isCollapsed) {\n const { start } = range\n return this.getInsertMarksAtPoint(start)\n }\n\n const { start, end } = range\n let startPath = start.path\n let startOffset = start.offset\n let endPath = end.path\n let endOffset = end.offset\n let startText = this.getDescendant(startPath)\n let endText = this.getDescendant(endPath)\n\n if (!startPath.equals(endPath)) {\n while (!startPath.equals(endPath) && endOffset === 0) {\n ;[[endText, endPath]] = this.texts({\n path: endPath,\n direction: 'backward',\n })\n\n endOffset = endText.text.length\n }\n\n while (\n !startPath.equals(endPath) &&\n startOffset === startText.text.length\n ) {\n ;[[startText, startPath]] = this.texts({ path: startPath })\n startOffset = 0\n }\n }\n\n if (startPath.equals(endPath)) {\n return startText.marks\n }\n\n const startMarks = startText.marks\n\n // PERF: if start marks is empty we can return early.\n if (startMarks.size === 0) {\n return Set()\n }\n\n const endMarks = endText.marks\n let marks = startMarks.intersect(endMarks)\n\n // If marks is already empty, the active marks is empty\n if (marks.size === 0) {\n return marks\n }\n\n ;[[startText, startPath]] = this.texts({ path: startPath })\n\n while (!startPath.equals(endPath)) {\n if (startText.text.length !== 0) {\n marks = marks.intersect(startText.marks)\n\n if (marks.size === 0) {\n return Set()\n }\n }\n\n ;[[startText, startPath]] = this.texts({ path: startPath })\n }\n\n return marks\n }\n\n /**\n * Get a list of the ancestors of a descendant.\n *\n * @param {List|String} path\n * @return {List<Node>|Null}\n */\n\n getAncestors(path) {\n const iterable = this.ancestors(path)\n const array = Array.from(iterable, ([node]) => node).reverse()\n const list = List(array)\n return list\n }\n\n /**\n * Get the leaf block descendants of the node.\n *\n * @return {List<Node>}\n */\n\n getBlocks() {\n const iterable = this.blocks({ onlyLeaves: true })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get all of the leaf blocks that match a `type`.\n *\n * @param {String} type\n * @return {List<Node>}\n */\n\n getBlocksByType(type) {\n const iterable = this.blocks({ onlyLeaves: true, onlyTypes: [type] })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get a child node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getChild(path) {\n path = this.resolvePath(path)\n\n if (!path || path.size > 1) {\n return null\n }\n\n const child = this.nodes.get(path.first())\n return child\n }\n\n /**\n * Get closest parent of node that matches a `predicate`.\n *\n * @param {List|String} path\n * @param {Function} predicate\n * @return {Node|Null}\n */\n\n getClosest(path, predicate) {\n for (const [n, p] of this.ancestors(path)) {\n if (predicate(n, p)) {\n return n\n }\n }\n\n return null\n }\n\n /**\n * Get the closest block parent of a node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getClosestBlock(path) {\n const closest = this.getClosest(path, n => n.object === 'block')\n return closest\n }\n\n /**\n * Get the closest inline parent of a node by `path`.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getClosestInline(path) {\n const closest = this.getClosest(path, n => n.object === 'inline')\n return closest\n }\n\n /**\n * Get the closest void parent of a node by `path`.\n *\n * @param {List|String} path\n * @param {Editor} editor\n * @return {Node|Null}\n */\n\n getClosestVoid(path, editor) {\n invariant(\n !Value.isValue(editor),\n 'As of Slate 0.42.0, the `node.getClosestVoid` method takes an `editor` instead of a `value`.'\n )\n\n const closest = this.getClosest(path, n => editor.isVoid(n))\n return closest\n }\n\n /**\n * Get the common ancestor of nodes `a` and `b`.\n *\n * @param {List} a\n * @param {List} b\n * @return {Node}\n */\n\n getCommonAncestor(a, b) {\n a = this.resolvePath(a)\n b = this.resolvePath(b)\n\n if (!a || !b) {\n return null\n }\n\n const path = PathUtils.relate(a, b)\n const node = this.getNode(path)\n return node\n }\n\n /**\n * Get the decorations for the node from an `editor`.\n *\n * @param {Editor} editor\n * @return {List}\n */\n\n getDecorations(editor) {\n let decorations = editor.run('decorateNode', this)\n decorations = Decoration.createList(decorations)\n return decorations\n }\n\n /**\n * Get the depth of a descendant, with optional `startAt`.\n *\n * @param {List|String} path\n * @param {Number} startAt\n * @return {Number|Null}\n */\n\n getDepth(path, startAt = 1) {\n path = this.resolvePath(path)\n\n if (!path) {\n return null\n }\n\n const node = this.getNode(path)\n const depth = node ? path.size - 1 + startAt : null\n return depth\n }\n\n /**\n * Get a descendant node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getDescendant(path) {\n path = this.resolvePath(path)\n\n if (!path || !path.size) {\n return null\n }\n\n let node = this\n\n path.forEach(index => {\n node = node.getIn(['nodes', index])\n return !!node\n })\n\n return node\n }\n\n /**\n * Get all of the descendant nodes in a `range`.\n *\n * @param {Range} range\n * @return {List<Node>}\n */\n\n getDescendantsAtRange(range) {\n const iterable = this.descendants({ range })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get a fragment of the node at a `range`.\n *\n * @param {Range} range\n * @return {Document}\n */\n\n getFragmentAtRange(range) {\n range = this.resolveRange(range)\n\n if (range.isUnset) {\n return Document.create()\n }\n\n const { start, end } = range\n let node = this\n let targetPath = end.path\n let targetPosition = end.offset\n let side = 'end'\n\n while (targetPath.size) {\n const index = targetPath.last()\n node = node.splitNode(targetPath, targetPosition)\n targetPosition = index + 1\n targetPath = PathUtils.lift(targetPath)\n\n if (!targetPath.size && side === 'end') {\n targetPath = start.path\n targetPosition = start.offset\n side = 'start'\n }\n }\n\n const startIndex = start.path.first() + 1\n const endIndex = end.path.first() + 2\n const nodes = node.nodes.slice(startIndex, endIndex)\n const fragment = Document.create({ nodes })\n return fragment\n }\n\n /**\n * Get the furthest ancestors of a node that matches a `predicate`.\n *\n * @param {Path} path\n * @param {Function} predicate\n * @return {Node|Null}\n */\n\n getFurthest(path, predicate = identity) {\n const iterable = this.ancestors(path)\n const results = Array.from(iterable).reverse()\n\n for (const [n, p] of results) {\n if (predicate(n, p)) {\n return n\n }\n }\n\n return null\n }\n\n /**\n * Get the furthest block parent of a node.\n *\n * @param {Path} path\n * @return {Node|Null}\n */\n\n getFurthestBlock(path) {\n const furthest = this.getFurthest(path, n => n.object === 'block')\n return furthest\n }\n\n /**\n * Get the furthest child ancestor of a node at `path`.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getFurthestChild(path) {\n path = this.resolvePath(path)\n\n if (!path || !path.size) {\n return null\n }\n\n const furthest = this.nodes.get(path.first())\n return furthest\n }\n\n /**\n * Get the furthest inline parent of a node.\n *\n * @param {Path} path\n * @return {Node|Null}\n */\n\n getFurthestInline(path) {\n const furthest = this.getFurthest(path, n => n.object === 'inline')\n return furthest\n }\n\n /**\n * Get the closest inline nodes for each text node in the node.\n *\n * @return {List<Node>}\n */\n\n getInlines() {\n const iterable = this.inlines({ onlyLeaves: true })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get all of the leaf inline nodes that match a `type`.\n *\n * @param {String} type\n * @return {List<Node>}\n */\n\n getInlinesByType(type) {\n const iterable = this.inlines({ onlyLeaves: true, onlyTypes: [type] })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get a set of marks that would occur on the next insert at a `point` in the\n * node. This mimics expected rich text editing behaviors of mark contiuation.\n *\n * @param {Point} point\n * @return {Set<Mark>}\n */\n\n getInsertMarksAtPoint(point) {\n point = this.resolvePoint(point)\n const { path, offset } = point\n const text = this.getDescendant(path)\n\n // PERF: we can exit early if the offset isn't at the start of the node.\n if (offset !== 0) {\n return text.marks\n }\n\n let blockNode\n let blockPath\n\n for (const entry of this.ancestors(path)) {\n const [n, p] = entry\n\n if (n.object === 'block') {\n blockNode = n\n blockPath = p\n }\n }\n\n const relativePath = PathUtils.drop(path, blockPath.size)\n const [previous] = blockNode.texts({\n path: relativePath,\n direction: 'backward',\n })\n\n // If there's no previous text, we're at the start of the block, so use\n // the current text nodes marks.\n if (!previous) {\n return text.marks\n }\n\n // Otherwise, continue with the previous text node's marks instead.\n const [previousText] = previous\n return previousText.marks\n }\n\n /**\n * Get a set of marks that would occur on the next insert at a `range`.\n * This mimics expected rich text editing behaviors of mark contiuation.\n *\n * @param {Range} range\n * @return {Set<Mark>}\n */\n\n getInsertMarksAtRange(range) {\n range = this.resolveRange(range)\n const { start } = range\n\n if (range.isUnset) {\n return Set()\n }\n\n if (range.isCollapsed) {\n return this.getInsertMarksAtPoint(start)\n }\n\n const text = this.getDescendant(start.path)\n return text.marks\n }\n\n /**\n * Get the bottom-most block descendants in a `range`.\n *\n * @param {Range} range\n * @return {List<Node>}\n */\n\n getLeafBlocksAtRange(range) {\n const iterable = this.blocks({ range, onlyLeaves: true })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get the bottom-most inline nodes for each text node in a `range`.\n *\n * @param {Range} range\n * @return {List<Node>}\n */\n\n getLeafInlinesAtRange(range) {\n const iterable = this.inlines({ range, onlyLeaves: true })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get an object mapping all the keys in the node to their paths.\n *\n * @return {Map}\n */\n\n getNodesToPathsMap() {\n const root = this\n const map =\n typeof window === 'undefined' ? new global.Map() : new window.Map()\n\n map.set(root, PathUtils.create([]))\n\n root.forEachDescendant((node, path) => {\n map.set(node, path)\n })\n\n return map\n }\n\n /**\n * Get all of the marks for all of the characters of every text node.\n *\n * @return {OrderedSet<Mark>}\n */\n\n getMarks() {\n const iterable = this.marks()\n const array = Array.from(iterable, ([mark]) => mark)\n return OrderedSet(array)\n }\n\n /**\n * Get a set of the marks in a `range`.\n *\n * @param {Range} range\n * @return {OrderedSet<Mark>}\n */\n\n getMarksAtRange(range) {\n const iterable = this.marks({ range })\n const array = Array.from(iterable, ([mark]) => mark)\n return OrderedSet(array)\n }\n\n /**\n * Get all of the marks that match a `type`.\n *\n * @param {String} type\n * @return {OrderedSet<Mark>}\n */\n\n getMarksByType(type) {\n const iterable = this.marks({ onlyTypes: [type] })\n const array = Array.from(iterable, ([mark]) => mark)\n return OrderedSet(array)\n }\n\n /**\n * Get the block node after a descendant text node by `path`.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getNextBlock(path) {\n const [entry] = this.blocks({ path, onlyLeaves: true })\n const block = entry ? entry[0] : null\n return block\n }\n\n /**\n * Get the next node in the tree, returning siblings or ancestor siblings.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getNextNode(path) {\n const iterable = this.createIterable({ path, downward: false })\n const [entry] = iterable\n const node = entry ? entry[0] : null\n return node\n }\n\n /**\n * Get the next sibling of a node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getNextSibling(path) {\n const [entry] = this.siblings(path)\n const node = entry ? entry[0] : null\n return node\n }\n\n /**\n * Get the text node after a descendant text node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getNextText(path) {\n const [entry] = this.texts({ path })\n const node = entry ? entry[0] : null\n return node\n }\n\n /**\n * Get the offset for a descendant text node by `path` or `key`.\n *\n * @param {List|string} path\n * @return {Number}\n */\n\n getOffset(path) {\n path = this.resolvePath(path)\n this.assertDescendant(path)\n\n // Calculate the offset of the nodes before the highest child.\n const index = path.first()\n\n const offset = this.nodes\n .slice(0, index)\n .reduce((memo, n) => memo + n.text.length, 0)\n\n // Recurse if need be.\n const ret =\n path.size === 1\n ? offset\n : offset + this.nodes.get(index).getOffset(PathUtils.drop(path))\n\n return ret\n }\n\n /**\n * Get the offset from a `range`.\n *\n * @param {Range} range\n * @return {Number}\n */\n\n getOffsetAtRange(range) {\n range = this.resolveRange(range)\n\n if (range.isUnset) {\n throw new Error('The range cannot be unset to calculcate its offset.')\n }\n\n if (range.isExpanded) {\n throw new Error('The range must be collapsed to calculcate its offset.')\n }\n\n const { start } = range\n const offset = this.getOffset(start.path) + start.offset\n return offset\n }\n\n /**\n * Get the parent of a descendant node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getParent(path) {\n path = this.resolvePath(path)\n if (!path) return null\n if (!path.size) return null\n const parentPath = PathUtils.lift(path)\n const parent = this.getNode(parentPath)\n return parent\n }\n\n /**\n * Get the block node before a descendant text node by `path`.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getPreviousBlock(path) {\n const [entry] = this.blocks({\n path,\n onlyLeaves: true,\n direction: 'backward',\n })\n const block = entry ? entry[0] : null\n return block\n }\n\n /**\n * Get the previous node from a node in the tree.\n *\n * This will not only check for siblings but instead move up the tree\n * returning the previous ancestor if no sibling is found.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getPreviousNode(path) {\n const iterable = this.createIterable({\n path,\n downward: false,\n direction: 'backward',\n })\n\n const [entry] = iterable\n const node = entry ? entry[0] : null\n return node\n }\n\n /**\n * Get the previous sibling of a node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getPreviousSibling(path) {\n const [entry] = this.siblings(path, { direction: 'backward' })\n const node = entry ? entry[0] : null\n return node\n }\n\n /**\n * Get the text node before a descendant text node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getPreviousText(path) {\n const [entry] = this.texts({ path, direction: 'backward' })\n const node = entry ? entry[0] : null\n return node\n }\n\n /**\n * Get only the root block nodes in a `range`.\n *\n * @param {Range} range\n * @return {List}\n */\n\n getRootBlocksAtRange(range) {\n const iterable = this.blocks({ range, onlyRoots: true })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get only the root inline nodes in a `range`.\n *\n * @param {Range} range\n * @return {List}\n */\n\n getRootInlinesAtRange(range) {\n const iterable = this.inlines({ range, onlyRoots: true })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get the descendent text node at an `offset`.\n *\n * @param {String} offset\n * @return {Node|Null}\n */\n\n getTextAtOffset(offset) {\n // PERF: Add a few shortcuts for the obvious cases.\n if (offset === 0) return this.getFirstText()\n if (offset === this.text.length) return this.getLastText()\n if (offset < 0 || offset > this.text.length) return null\n\n let length = 0\n\n for (const [node] of this.texts()) {\n length += node.text.length\n\n if (length > offset) {\n return node\n }\n }\n\n return null\n }\n\n /**\n * Get the direction of the node's text.\n *\n * @return {String}\n */\n\n getTextDirection() {\n const dir = getDirection(this.text)\n return dir === 'neutral' ? null : dir\n }\n\n /**\n * Recursively get all of the child text nodes in order of appearance.\n *\n * @return {List<Node>}\n */\n\n getTexts() {\n const iterable = this.texts()\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get all of the text nodes in a `range` as a List.\n *\n * @param {Range} range\n * @return {List<Node>}\n */\n\n getTextsAtRange(range) {\n const iterable = this.texts({ range })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Check if the node has block children.\n *\n * @return {Boolean}\n */\n\n hasBlockChildren() {\n return !!(this.nodes && this.nodes.find(n => n.object === 'block'))\n }\n\n /**\n * Check if a child node exists.\n *\n * @param {List|String} path\n * @return {Boolean}\n */\n\n hasChild(path) {\n const child = this.getChild(path)\n return !!child\n }\n\n /**\n * Check if a node has inline children.\n *\n * @return {Boolean}\n */\n\n hasInlineChildren() {\n return !!(\n this.nodes &&\n this.nodes.find(n => n.object === 'inline' || n.object === 'text')\n )\n }\n\n /**\n * Recursively check if a child node exists.\n *\n * @param {List|String} path\n * @return {Boolean}\n */\n\n hasDescendant(path) {\n const descendant = this.getDescendant(path)\n return !!descendant\n }\n\n /**\n * Check if a node has a void parent.\n *\n * @param {List|String} path\n * @param {Editor} editor\n * @return {Boolean}\n */\n\n hasVoidParent(path, editor) {\n invariant(\n !Value.isValue(editor),\n 'As of Slate 0.42.0, the `node.hasVoidParent` method takes an `editor` instead of a `value`.'\n )\n\n const closest = this.getClosestVoid(path, editor)\n return !!closest\n }\n\n /**\n * Create an iteratable for all of the inlines of a node with `options`.\n *\n * @param {Options}\n * @return {Iterable}\n */\n\n inlines(options = {}) {\n const { onlyLeaves, onlyRoots, onlyTypes, match, ...rest } = options\n const iterable = this.descendants({\n includeBlocks: false,\n includeTexts: false,\n includeDocument: false,\n ...rest,\n match: (node, path) => {\n if (onlyTypes && !onlyTypes.includes(node.type)) {\n return false\n } else if (onlyLeaves && !node.isLeafInline()) {\n return false\n } else if (onlyRoots && this.getParent(path).object !== 'block') {\n return false\n } else if (match && !match(node, path)) {\n return false\n } else {\n return true\n }\n },\n })\n\n return iterable\n }\n\n /**\n * Insert a `node`.\n *\n * @param {List|String} path\n * @param {Node} node\n * @return {Node}\n */\n\n insertNode(path, node) {\n path = this.resolvePath(path)\n const index = path.last()\n const parentPath = PathUtils.lift(path)\n let parent = this.assertNode(parentPath)\n const nodes = parent.nodes.splice(index, 0, node)\n parent = parent.set('nodes', nodes)\n const ret = this.replaceNode(parentPath, parent)\n return ret\n }\n\n /**\n * Insert `text` at `offset` in node by `path`.\n *\n * @param {List|String} path\n * @param {Number} offset\n * @param {String} text\n * @return {Node}\n */\n\n insertText(path, offset, text) {\n path = this.resolvePath(path)\n let node = this.assertDescendant(path)\n node = node.insertText(offset, text)\n const ret = this.replaceNode(path, node)\n return ret\n }\n\n /**\n * Check whether the node is a leaf block.\n *\n * @return {Boolean}\n */\n\n isLeafBlock() {\n if (this.object !== 'block') {\n return false\n }\n\n if (this.nodes.some(n => n.object === 'block')) {\n return false\n }\n\n return true\n }\n\n /**\n * Check whether the node is a leaf inline.\n *\n * @return {Boolean}\n */\n\n isLeafInline() {\n if (this.object !== 'inline') {\n return false\n }\n\n if (this.nodes.some(n => n.object === 'inline')) {\n return false\n }\n\n return true\n }\n\n /**\n * Check whether a descendant node is inside a `range` by `path`.\n *\n * @param {List|String} path\n * @param {Range} range\n * @return {Node}\n */\n\n isInRange(path, range) {\n path = this.resolvePath(path)\n range = this.resolveRange(range)\n\n if (range.isUnset) {\n return false\n }\n\n const toStart = PathUtils.compare(path, range.start.path)\n const toEnd = PathUtils.compare(path, range.end.path)\n const isInRange = toStart !== -1 && toEnd !== 1\n return isInRange\n }\n\n /**\n * Map all child nodes, updating them in their parents. This method is\n * optimized to not return a new node if no changes are made.\n *\n * @param {Function} predicate\n * @return {Node}\n */\n\n mapChildren(predicate = identity) {\n let { nodes } = this\n\n nodes.forEach((node, i) => {\n const ret = predicate(node, i, this.nodes)\n if (ret !== node) nodes = nodes.set(ret.key, ret)\n })\n\n const ret = this.set('nodes', nodes)\n return ret\n }\n\n /**\n * Map all descendant nodes, updating them in their parents. This method is\n * optimized to not return a new node if no changes are made.\n *\n * @param {Function} predicate\n * @return {Node}\n */\n\n mapDescendants(predicate = identity) {\n let { nodes } = this\n\n nodes.forEach((node, index) => {\n let ret = node\n if (ret.object !== 'text') ret = ret.mapDescendants(predicate)\n ret = predicate(ret, index, this.nodes)\n if (ret === node) return\n\n nodes = nodes.set(index, ret)\n })\n\n const ret = this.set('nodes', nodes)\n return ret\n }\n\n /**\n * Create an iteratable for all the marks in text nodes with `options`.\n *\n * @param {Options}\n * @return {Iterable}\n */\n\n marks(options = {}) {\n const { onlyTypes = null, match, ...rest } = options\n const texts = this.texts(rest)\n\n return {\n [Symbol.iterator]() {\n const iterator = texts[Symbol.iterator]()\n let node = null\n let path = null\n let remaining = []\n\n const next = () => {\n if (remaining.length) {\n const mark = remaining.shift()\n\n if (onlyTypes && !onlyTypes.includes(mark.type)) {\n return next()\n } else if (match && !match(mark, node, path)) {\n return next()\n }\n\n return { value: [mark, node, path], done: false }\n }\n\n const { value, done } = iterator.next()\n\n if (done) {\n return { done: true }\n }\n\n ;[node, path] = value\n remaining = node.marks.toArray()\n return next()\n }\n\n return { next }\n },\n }\n }\n\n /**\n * Merge a node backwards its previous sibling.\n *\n * @param {List|Key} path\n * @return {Node}\n */\n\n mergeNode(path) {\n const b = this.assertNode(path)\n path = this.resolvePath(path)\n\n if (path.last() === 0) {\n throw new Error(\n `Unable to merge node because it has no previous sibling: ${b}`\n )\n }\n\n const withPath = PathUtils.decrement(path)\n const a = this.assertNode(withPath)\n\n if (a.object !== b.object) {\n throw new Error(\n `Unable to merge two different kinds of nodes: ${a} and ${b}`\n )\n }\n\n const newNode =\n a.object === 'text'\n ? a.mergeText(b)\n : a.set('nodes', a.nodes.concat(b.nodes))\n\n let ret = this\n ret = ret.removeNode(path)\n ret = ret.removeNode(withPath)\n ret = ret.insertNode(withPath, newNode)\n return ret\n }\n\n /**\n * Move a node by `path` to `newPath`.\n *\n * A `newIndex` can be provided when move nodes by `key`, to account for not\n * being able to have a key for a location in the tree that doesn't exist yet.\n *\n * @param {List|Key} path\n * @param {List|Key} newPath\n * @param {Number} newIndex\n * @return {Node}\n */\n\n moveNode(path, newPath, newIndex = 0) {\n const node = this.assertNode(path)\n path = this.resolvePath(path)\n newPath = this.resolvePath(newPath, newIndex)\n\n const newParentPath = PathUtils.lift(newPath)\n this.assertNode(newParentPath)\n\n // TODO: this is a bit hacky, re-creating the operation that led to this method being called\n // Alternative 1: pass the operation through from apply -> value.moveNode\n // Alternative 2: add a third property to the operation called \"transformedNewPath\", pass that through\n const op = Operation.create({\n type: 'move_node',\n path,\n newPath,\n })\n newPath = PathUtils.transform(path, op).first()\n\n let ret = this\n ret = ret.removeNode(path)\n ret = ret.insertNode(newPath, node)\n return ret\n }\n\n /**\n * Remove `mark` from text at `path`.\n *\n * @param {List} path\n * @param {Mark} mark\n * @return {Node}\n */\n\n removeMark(path, mark) {\n path = this.resolvePath(path)\n let node = this.assertDescendant(path)\n node = node.removeMark(mark)\n const ret = this.replaceNode(path, node)\n return ret\n }\n\n /**\n * Remove a node.\n *\n * @param {List|String} path\n * @return {Node}\n */\n\n removeNode(path) {\n this.assertDescendant(path)\n path = this.resolvePath(path)\n const deep = path.flatMap(x => ['nodes', x])\n const ret = this.deleteIn(deep)\n return ret\n }\n\n /**\n * Remove `text` at `offset` in node.\n *\n * @param {List|Key} path\n * @param {Number} offset\n * @param {String} text\n * @return {Node}\n */\n\n removeText(path, offset, text) {\n let node = this.assertDescendant(path)\n node = node.removeText(offset, text.length)\n const ret = this.replaceNode(path, node)\n return ret\n }\n\n /**\n * Replace a `node` in the tree.\n *\n * @param {List|Key} path\n * @param {Node} node\n * @return {Node}\n */\n\n replaceNode(path, node) {\n path = this.resolvePath(path)\n\n if (!path) {\n throw new Error(\n `Unable to replace a node because it could not be found in the first place: ${path}`\n )\n }\n\n if (!path.size) return node\n this.assertNode(path)\n const deep = path.flatMap(x => ['nodes', x])\n const ret = this.setIn(deep, node)\n return ret\n }\n\n /**\n * Resolve a `annotation`, relative to the node, ensuring that the keys and\n * offsets in the annotation exist and that they are synced with the paths.\n *\n * @param {Annotation|Object} annotation\n * @return {Annotation}\n */\n\n resolveAnnotation(annotation) {\n annotation = Annotation.create(annotation)\n annotation = annotation.normalize(this)\n return annotation\n }\n\n /**\n * Resolve a `decoration`, relative to the node, ensuring that the keys and\n * offsets in the decoration exist and that they are synced with the paths.\n *\n * @param {Decoration|Object} decoration\n * @return {Decoration}\n */\n\n resolveDecoration(decoration) {\n decoration = Decoration.create(decoration)\n decoration = decoration.normalize(this)\n return decoration\n }\n\n /**\n * Resolve a `point`, relative to the node, ensuring that the keys and\n * offsets in the point exist and that they are synced with the paths.\n *\n * @param {Point|Object} point\n * @return {Point}\n */\n\n resolvePoint(point) {\n point = Point.create(point)\n point = point.normalize(this)\n return point\n }\n\n /**\n * Resolve a `range`, relative to the node, ensuring that the keys and\n * offsets in the range exist and that they are synced with the paths.\n *\n * @param {Range|Object} range\n * @return {Range}\n */\n\n resolveRange(range) {\n range = Range.create(range)\n range = range.normalize(this)\n return range\n }\n\n /**\n * Resolve a `selection`, relative to the node, ensuring that the keys and\n * offsets in the selection exist and that they are synced with the paths.\n *\n * @param {Selection|Object} selection\n * @return {Selection}\n */\n\n resolveSelection(selection) {\n selection = Selection.create(selection)\n selection = selection.normalize(this)\n return selection\n }\n\n /**\n * Set `properties` on a node.\n *\n * @param {List|String} path\n * @param {Object} properties\n * @return {Node}\n */\n\n setNode(path, properties) {\n let node = this.assertNode(path)\n node = node.merge(properties)\n const ret = this.replaceNode(path, node)\n return ret\n }\n\n /**\n * Set `properties` on `mark` on text at `offset` and `length` in node.\n *\n * @param {List|String} path\n * @param {Number} offset\n * @param {Number} length\n * @param {Mark} mark\n * @param {Object} properties\n * @return {Node}\n */\n\n setMark(path, properties, newProperties) {\n path = this.resolvePath(path)\n let node = this.assertDescendant(path)\n node = node.setMark(properties, newProperties)\n const ret = this.replaceNode(path, node)\n return ret\n }\n\n /**\n * Create an iteratable for the siblings in the tree at `path`.\n *\n * @param {List|Array} path\n * @return {Iterable}\n */\n\n siblings(path, options) {\n const iterable = this.createIterable({\n path,\n upward: false,\n downward: false,\n ...options,\n })\n\n return iterable\n }\n\n /**\n * Split a node by `path` at `position` with optional `properties` to apply\n * to the newly split node.\n *\n * @param {List|String} path\n * @param {Number} position\n * @param {Object} properties\n * @return {Node}\n */\n\n splitNode(path, position, properties) {\n const child = this.assertNode(path)\n path = this.resolvePath(path)\n let a\n let b\n\n if (child.object === 'text') {\n ;[a, b] = child.splitText(position)\n } else {\n const befores = child.nodes.take(position)\n const afters = child.nodes.skip(position)\n a = child.set('nodes', befores)\n b = child.set('nodes', afters).regenerateKey()\n }\n\n if (properties && child.object !== 'text') {\n b = b.merge(properties)\n }\n\n let ret = this\n ret = ret.removeNode(path)\n ret = ret.insertNode(path, b)\n ret = ret.insertNode(path, a)\n return ret\n }\n\n /**\n * Create an iteratable for all the text node descendants.\n *\n * @param {Object} options\n * @return {Iterable}\n */\n\n texts(options) {\n const iterable = this.descendants({\n includeBlocks: false,\n includeInlines: false,\n includeDocument: false,\n ...options,\n })\n\n return iterable\n }\n\n /**\n * Deprecated.\n */\n\n getBlocksAtRange(range) {\n warning(\n false,\n 'As of slate@0.44 the `node.getBlocksAtRange` method has been renamed to `getLeafBlocksAtRange`.'\n )\n\n return this.getLeafBlocksAtRange(range)\n }\n\n getBlocksAtRangeAsArray(range) {\n warning(\n false,\n 'As of slate@0.44 the `node.getBlocksAtRangeAsArray` method has been renamed to `getLeafBlocksAtRangeAsArray`.'\n )\n\n return this.getLeafBlocksAtRangeAsArray(range)\n }\n\n getInlinesAtRange(range) {\n warning(\n false,\n 'As of slate@0.44 the `node.getInlinesAtRange` method has been renamed to `getLeafInlinesAtRange`.'\n )\n\n return this.getLeafInlinesAtRange(range)\n }\n\n getInlinesAtRangeAsArray(range) {\n warning(\n false,\n 'As of slate@0.44 the `node.getInlinesAtRangeAsArray` method has been renamed to `getLeafInlinesAtRangeAsArray`.'\n )\n\n return this.getLeafInlinesAtRangeAsArray(range)\n }\n\n getNextTextAndPath(path) {\n warning(\n false,\n 'As of slate@0.47, the `getNextTextAndPath` method has been renamed to `getNextTextEntry`.'\n )\n\n return this.getNextTextEntry(path)\n }\n\n getNextDeepMatchingNodeAndPath(path, iterator = () => true) {\n warning(\n false,\n 'As of slate@0.47, the `getNextDeepMatchingNodeAndPath` method is deprecated.'\n )\n\n const match = this.getNextMatchingNodeAndPath(path)\n\n if (!match) return null\n\n let [nextNode, nextPath] = match\n\n let childMatch\n\n const assign = () => {\n childMatch =\n nextNode.object !== 'text' &&\n nextNode.findFirstDescendantAndPath(iterator, nextPath)\n return childMatch\n }\n\n while (assign(childMatch)) {\n ;[nextNode, nextPath] = childMatch\n }\n\n if (!nextNode) return null\n\n return iterator(nextNode)\n ? [nextNode, nextPath]\n : this.getNextDeepMatchingNodeAndPath(match[1], iterator)\n }\n\n getPreviousTextAndPath(path) {\n warning(\n false,\n 'As of slate@0.47, the `getPreviousTextAndPath` method has been renamed to `getPreviousTextEntry`.'\n )\n\n return this.getPreviousTextEntry(path)\n }\n\n findFirstDescendantAndPath(iterator, pathToThisNode) {\n warning(\n false,\n 'As of slate@0.47, the `findFirstDescendantAndPath` method is deprecated.'\n )\n\n return this.findDescendantAndPath(iterator, pathToThisNode, false)\n }\n\n getPreviousMatchingNodeAndPath(path, iterator = () => true) {\n warning(\n false,\n 'As of slate@0.47, the `getPreviousMatchingNodeAndPath` method is deprecated.'\n )\n\n if (!path) return null\n\n for (let i = path.size; i > 0; i--) {\n const p = path.slice(0, i)\n if (p.last() === 0) continue\n\n let previousPath = PathUtils.decrement(p)\n let previousNode = this.getNode(previousPath)\n\n while (previousNode && !iterator(previousNode)) {\n previousPath = PathUtils.decrement(previousPath)\n previousNode = this.getNode(previousPath)\n }\n\n if (previousNode) return [previousNode, previousPath]\n }\n\n return null\n }\n\n getPreviousDeepMatchingNodeAndPath(path, iterator = () => true) {\n warning(\n false,\n 'As of slate@0.47, the `getPreviousDeepMatchingNodeAndPath` method is deprecated.'\n )\n\n const match = this.getPreviousMatchingNodeAndPath(path)\n\n if (!match) return null\n\n let [previousNode, previousPath] = match\n\n let childMatch\n\n const assign = () => {\n childMatch =\n previousNode.object !== 'text' &&\n previousNode.findLastDescendantAndPath(iterator, previousPath)\n return childMatch\n }\n\n while (assign(childMatch)) {\n ;[previousNode, previousPath] = childMatch\n }\n\n if (!previousNode) return null\n\n return iterator(previousNode)\n ? [previousNode, previousPath]\n : this.getPreviousDeepMatchingNodeAndPath(match[1], iterator)\n }\n\n findLastDescendantAndPath(iterator, pathToThisNode) {\n warning(\n false,\n 'As of slate@0.47, the `findLastDescendantAndPath` method is deprecated.'\n )\n\n return this.findDescendantAndPath(iterator, pathToThisNode, true)\n }\n\n findDescendantAndPath(\n iterator,\n pathToThisNode = PathUtils.create([]),\n findLast = false\n ) {\n warning(\n false,\n 'As of slate@0.47, the `findDescendantAndPath` method is deprecated.'\n )\n\n let found\n let foundPath\n\n this.forEachDescendantWithPath(\n (node, path, nodes) => {\n if (iterator(node, path, nodes)) {\n found = node\n foundPath = path\n return false\n }\n },\n pathToThisNode,\n findLast\n )\n\n return found ? [found, foundPath] : null\n }\n\n forEachDescendantWithPath(iterator, path = PathUtils.create([]), findLast) {\n warning(\n false,\n 'As of slate@0.47, the `forEachDescendantWithPath` method is deprecated.'\n )\n\n let nodes = this.nodes\n let ret\n\n if (findLast) nodes = nodes.reverse()\n\n nodes.forEach((child, i) => {\n const childPath = path.concat(i)\n\n if (iterator(child, childPath, nodes) === false) {\n ret = false\n return false\n }\n\n if (child.object !== 'text') {\n ret = child.forEachDescendantWithPath(iterator, childPath, findLast)\n return ret\n }\n })\n\n return ret\n }\n\n getNextMatchingNodeAndPath(path, iterator = () => true) {\n warning(\n false,\n 'As of slate@0.47, the `getNextMatchingNodeAndPath` method is deprecated.'\n )\n\n if (!path) return null\n\n for (let i = path.size; i > 0; i--) {\n const p = path.slice(0, i)\n\n let nextPath = PathUtils.increment(p)\n let nextNode = this.getNode(nextPath)\n\n while (nextNode && !iterator(nextNode)) {\n nextPath = PathUtils.increment(nextPath)\n nextNode = this.getNode(nextPath)\n }\n\n if (nextNode) return [nextNode, nextPath]\n }\n\n return null\n }\n\n getSelectionIndexes(range, isSelected = true) {\n warning(\n false,\n 'As of slate@0.47, the `getSelectionIndexes` method is deprecated.'\n )\n\n const { start, end } = range\n\n // PERF: if we're not selected, we can exit early.\n if (!isSelected) {\n return null\n }\n\n // PERF: if we've been given an invalid selection we can exit early.\n if (range.isUnset) {\n return null\n }\n\n // PERF: if the start and end keys are the same, just check for the child\n // that contains that single key.\n if (start.path.equals(end.path)) {\n const child = this.getFurthestAncestor(start.path)\n const index = child ? this.nodes.indexOf(child) : null\n return { start: index, end: index + 1 }\n }\n\n // Otherwise, check all of the children...\n let startIndex = null\n let endIndex = null\n\n this.nodes.forEach((child, i) => {\n if (child.object === 'text') {\n if (startIndex == null && child.key === start.key) startIndex = i\n if (endIndex == null && child.key === end.key) endIndex = i + 1\n } else {\n if (startIndex == null && child.hasDescendant(start.key)) startIndex = i\n if (endIndex == null && child.hasDescendant(end.key)) endIndex = i + 1\n }\n\n // PERF: exit early if both start and end have been found.\n return startIndex == null || endIndex == null\n })\n\n if (isSelected && startIndex == null) {\n startIndex = 0\n }\n\n if (isSelected && endIndex == null) {\n endIndex = this.nodes.size\n }\n\n if (startIndex == null) {\n return null\n }\n\n return { start: startIndex, end: endIndex }\n }\n\n getTextsBetweenPositionsAsArray(startPath, endPath) {\n warning(\n false,\n 'As of slate@0.47, the `getTextsBetweenPositionsAsArray` method is deprecated.'\n )\n\n startPath = this.resolvePath(startPath)\n endPath = this.resolvePath(endPath)\n\n return this.getTextsBetweenPathPositionsAsArray(startPath, endPath)\n }\n\n getOrderedMarksBetweenPositions(startPath, startOffset, endPath, endOffset) {\n warning(\n false,\n 'As of slate@0.47, the `getOrderedMarksBetweenPositions` method is deprecated.'\n )\n\n startPath = this.resolvePath(startPath)\n endPath = this.resolvePath(endPath)\n const startText = this.getDescendant(startPath)\n\n // PERF: if the paths are equal, we can just use the start.\n if (PathUtils.isEqual(startPath, endPath)) {\n return startText.marks\n }\n\n const texts = this.getTextsBetweenPathPositionsAsArray(startPath, endPath)\n\n return OrderedSet().withMutations(result => {\n texts.forEach(text => {\n result.union(text.marks)\n })\n })\n }\n\n getTextsBetweenPathPositionsAsArray(startPath, endPath) {\n warning(\n false,\n 'As of slate@0.47, the `getTextsBetweenPathPositionsAsArray` method is deprecated.'\n )\n\n // PERF: the most common case is when the range is in a single text node,\n // where we can avoid a lot of iterating of the tree.\n if (startPath && endPath && PathUtils.isEqual(startPath, endPath)) {\n return [this.getDescendant(startPath)]\n } else if (!startPath && !endPath) {\n return this.getTextsAsArray()\n }\n\n const startIndex = startPath ? startPath.get(0, 0) : 0\n const endIndex = endPath\n ? endPath.get(0, this.nodes.size - 1)\n : this.nodes.size - 1\n\n let array = []\n\n this.nodes.slice(startIndex, endIndex + 1).forEach((node, i) => {\n if (node.object === 'text') {\n array.push(node)\n } else {\n // For the node at start and end of this list, we want to provide a start and end path\n // For other nodes, we can just get all their text nodes, they are between the paths\n const childStartPath =\n startPath && i === 0 ? PathUtils.drop(startPath) : null\n const childEndPath =\n endPath && i === endIndex - startIndex\n ? PathUtils.drop(endPath)\n : null\n\n array = array.concat(\n node.getTextsBetweenPathPositionsAsArray(childStartPath, childEndPath)\n )\n }\n })\n\n return array\n }\n\n getFurthestAncestor(path) {\n warning(\n false,\n 'As of slate@0.47, the `getFurthestAncestor` method has been renamed to `getFurthestChild`.'\n )\n\n return this.getFurthestChild(path)\n }\n\n getLeafBlocksAtRangeAsArray(range) {\n warning(\n false,\n 'As of slate@0.47, the `getLeafBlocksAtRangeAsArray` method is deprecated.'\n )\n\n range = this.resolveRange(range)\n if (range.isUnset) return []\n\n const { start, end } = range\n\n return this.getLeafBlocksBetweenPathPositionsAsArray(start.path, end.path)\n }\n\n getLeafBlocksBetweenPathPositionsAsArray(startPath, endPath) {\n warning(\n false,\n 'As of slate@0.47, the `getLeafBlocksBetweenPathPositionsAsArray` method is deprecated.'\n )\n\n // PERF: the most common case is when the range is in a single block node,\n // where we can avoid a lot of iterating of the tree.\n if (startPath && endPath && PathUtils.isEqual(startPath, endPath)) {\n return [this.getClosestBlock(startPath)]\n } else if (!startPath && !endPath) {\n return this.getBlocksAsArray()\n }\n\n const startIndex = startPath ? startPath.get(0, 0) : 0\n const endIndex = endPath\n ? endPath.get(0, this.nodes.size - 1)\n : this.nodes.size - 1\n\n let array = []\n\n this.nodes.slice(startIndex, endIndex + 1).forEach((node, i) => {\n if (node.object !== 'block') {\n return\n } else if (node.isLeafBlock()) {\n array.push(node)\n } else {\n const childStartPath =\n startPath && i === 0 ? PathUtils.drop(startPath) : null\n const childEndPath =\n endPath && i === endIndex - startIndex\n ? PathUtils.drop(endPath)\n : null\n\n array = array.concat(\n node.getLeafBlocksBetweenPathPositionsAsArray(\n childStartPath,\n childEndPath\n )\n )\n }\n })\n\n return array\n }\n\n getBlocksAsArray() {\n warning(\n false,\n 'As of slate@0.47, the `getBlocksAsArray` method is deprecated.'\n )\n\n const iterable = this.blocks({ onlyLeaves: true })\n const array = Array.from(iterable, ([node]) => node)\n return array\n }\n\n getBlocksByTypeAsArray(type) {\n warning(\n false,\n 'As of slate@0.47, the `getBlocksByTypeAsArray` method is deprecated.'\n )\n\n const iterable = this.blocks({ onlyLeaves: true, onlyTypes: [type] })\n const array = Array.from(iterable, ([node]) => node)\n return array\n }\n\n getFurthestOnlyChildAncestor(path) {\n warning(\n false,\n 'As of slate@0.47, the `getFurthestOnlyChildAncestor` method is deprecated.'\n )\n\n const ancestors = this.getAncestors(path)\n if (!ancestors) return null\n\n const furthest = ancestors\n .rest()\n .reverse()\n .takeUntil(p => p.nodes.size > 1)\n .last()\n\n return furthest || null\n }\n\n getInlinesAsArray() {\n warning(\n false,\n 'As of slate@0.47, the `getInlinesAsArray` method is deprecated.'\n )\n\n const array = Array.from(\n this.inlines({ onlyLeaves: true }),\n ([node]) => node\n )\n return array\n }\n\n getInlinesByTypeAsArray(type) {\n warning(\n false,\n 'As of slate@0.47, the `getInlinesByTypeAsArray` method is deprecated.'\n )\n\n const array = Array.from(\n this.inlines({ onlyLeaves: true, onlyTypes: [type] }),\n ([node]) => node\n )\n return array\n }\n\n getLeafInlinesAtRangeAsArray(range) {\n warning(\n false,\n 'As of slate@0.47, the `getLeafInlinesAtRangeAsArray` method is deprecated.'\n )\n\n range = this.resolveRange(range)\n if (range.isUnset) return []\n\n const array = this.getTextsAtRangeAsArray(range)\n .map(text => this.getClosestInline(text.key))\n .filter(exists => exists)\n\n return array\n }\n\n getOrderedMarks() {\n warning(\n false,\n 'As of slate@0.47, the `getOrderedMarks` method has been folded into `getMarks`, which will now return an ordered set.'\n )\n return this.getMarks()\n }\n\n getOrderedMarksAtRange(range) {\n warning(\n false,\n 'As of slate@0.47, the `getOrderedMarksAtRange` method has been folded into `getMarksAtRange`, which will now return an ordered set.'\n )\n return this.getMarksAtRange(range)\n }\n\n getOrderedMarksByType(type) {\n warning(\n false,\n 'As of slate@0.47, the `getOrderedMarksByType` method has been folded into `getMarksByType`, which will now return an ordered set.'\n )\n return this.getMarksByType(type)\n }\n\n getMarksByTypeAsArray(type) {\n warning(\n false,\n 'As of slate@0.47, the `getMarksByTypeAsArray` method is deprecated.'\n )\n\n const array = this.nodes.reduce((memo, node) => {\n return node.object === 'text'\n ? memo.concat(node.marks.filter(m => m.type === type))\n : memo.concat(node.getMarksByTypeAsArray(type))\n }, [])\n\n return array\n }\n\n getMarksAsArray() {\n warning(\n false,\n 'As of slate@0.47, the `getMarksAsArray` method is deprecated.'\n )\n\n const result = []\n\n for (const [node] of this.texts()) {\n result.push(node.marks.toArray())\n }\n\n // PERF: use only one concat rather than multiple for speed.\n const array = [].concat(...result)\n return array\n }\n\n getRootInlinesAtRangeAsArray(range) {\n warning(\n false,\n 'As of slate@0.47, the `getRootInlinesAtRangeAsArray` method is deprecated.'\n )\n\n range = this.resolveRange(range)\n if (range.isUnset) return List()\n\n const array = this.getTextsAtRangeAsArray(range)\n .map(text => this.getFurthestInline(text.key))\n .filter(exists => exists)\n\n return array\n }\n\n getTextsAsArray() {\n warning(\n false,\n 'As of slate@0.47, the `getTextsAsArray` method is deprecated.'\n )\n\n const iterable = this.texts()\n const array = Array.from(iterable, ([node]) => node)\n return array\n }\n\n getTextsAtRangeAsArray(range) {\n warning(\n false,\n 'As of slate@0.47, the `getTextsAtRangeAsArray` method is deprecated.'\n )\n\n const iterable = this.texts({ range })\n const array = Array.from(iterable, ([node]) => node)\n return array\n }\n\n getMarksAtPosition(path, offset) {\n warning(\n false,\n 'As of slate@0.47, the `getMarksAtPosition` method is deprecated.'\n )\n\n path = this.resolvePath(path)\n const text = this.getDescendant(path)\n const currentMarks = text.marks\n\n if (offset !== 0) {\n return OrderedSet(currentMarks)\n }\n\n const closestBlock = this.getClosestBlock(path)\n\n // insert mark for empty block; the empty block are often created by split node or add marks in a range including empty blocks\n if (closestBlock.text === '') {\n return OrderedSet(currentMarks)\n }\n\n const [previous] = this.texts({ path, direction: 'backward' })\n\n if (!previous) {\n return OrderedSet()\n }\n\n const [previousText, previousPath] = previous\n\n if (closestBlock.hasDescendant(previousPath)) {\n return OrderedSet(previousText.marks)\n }\n\n return OrderedSet(currentMarks)\n }\n\n getNodesAtRange(range) {\n warning(\n false,\n 'As of slate@0.47, the `getNodesAtRange` method has been renamed to `getDescendantsAtRange`.'\n )\n\n const iterable = this.descendants({ range })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n isNodeInRange(path, range) {\n warning(\n false,\n 'As of slate@0.47, the `isNodeInRange` method has been renamed to `isInRange`.'\n )\n\n return this.isInRange(path, range)\n }\n}\n\n/**\n * Mix in assertion variants.\n */\n\nconst ASSERTS = ['Child', 'Depth', 'Descendant', 'Node', 'Parent', 'Path']\n\nfor (const method of ASSERTS) {\n ElementInterface.prototype[`assert${method}`] = function(path, ...args) {\n const ret = this[`get${method}`](path, ...args)\n\n if (ret == null) {\n throw new Error(\n `\\`Node.assert${method}\\` could not find node with path or key: ${path}`\n )\n }\n\n return ret\n }\n}\n\n/**\n * Memoize read methods.\n */\n\nmemoize(ElementInterface.prototype, [\n 'getBlocksAsArray',\n 'getBlocksByTypeAsArray',\n 'getDecorations',\n 'getFragmentAtRange',\n 'getInlinesAsArray',\n 'getInlinesByTypeAsArray',\n 'getInsertMarksAtRange',\n 'getLeafBlocksAtRangeAsArray',\n 'getLeafBlocksAtRangeAsArray',\n 'getLeafInlinesAtRangeAsArray',\n 'getMarksAsArray',\n 'getMarksAtPosition',\n 'getMarksByTypeAsArray',\n 'getNextBlock',\n 'getNodesAtRange',\n 'getNodesToPathsMap',\n 'getOffset',\n 'getOffsetAtRange',\n 'getOrderedMarksBetweenPositions',\n 'getPreviousBlock',\n 'getRootBlocksAtRange',\n 'getRootInlinesAtRangeAsArray',\n 'getTextAtOffset',\n 'getTextDirection',\n 'getTextsAsArray',\n 'getTextsBetweenPathPositionsAsArray',\n])\n\n/**\n * Mix in the element interface.\n */\n\nmixin(ElementInterface, [Block, Document, Inline])\n","import mixin from '../utils/mixin'\nimport Annotation from '../models/annotation'\nimport Decoration from '../models/decoration'\nimport PathUtils from '../utils/path-utils'\nimport Point from '../models/point'\nimport Range from '../models/range'\nimport Selection from '../models/selection'\n\n/**\n * The interface that `Decoration`, `Range` and `Selection` all implement, to make\n * working anchor and focus points easier.\n *\n * @type {Class}\n */\n\nclass RangeInterface {\n /**\n * Check whether the range is collapsed.\n *\n * @return {Boolean}\n */\n\n get isCollapsed() {\n return (\n this.anchor === this.focus ||\n (this.anchor.key === this.focus.key &&\n this.anchor.offset === this.focus.offset)\n )\n }\n\n /**\n * Check whether the range is expanded.\n *\n * @return {Boolean}\n */\n\n get isExpanded() {\n return !this.isCollapsed\n }\n\n /**\n * Check whether the range is backward.\n *\n * @return {Boolean}\n */\n\n get isBackward() {\n const { isUnset, anchor, focus } = this\n\n if (isUnset) {\n return null\n }\n\n if (anchor.key === focus.key) {\n return anchor.offset > focus.offset\n }\n\n const isBackward = PathUtils.isBefore(focus.path, anchor.path)\n return isBackward\n }\n\n /**\n * Check whether the range is forward.\n *\n * @return {Boolean}\n */\n\n get isForward() {\n const { isBackward } = this\n const isForward = isBackward == null ? null : !isBackward\n return isForward\n }\n\n /**\n * Check whether the range isn't set.\n *\n * @return {Boolean}\n */\n\n get isUnset() {\n const { anchor, focus } = this\n const isUnset = anchor.isUnset || focus.isUnset\n return isUnset\n }\n\n /**\n * Check whether the range is set.\n *\n * @return {Boolean}\n */\n\n get isSet() {\n return !this.isUnset\n }\n\n /**\n * Get the start point.\n *\n * @return {String}\n */\n\n get start() {\n return this.isBackward ? this.focus : this.anchor\n }\n\n /**\n * Get the end point.\n *\n * @return {String}\n */\n\n get end() {\n return this.isBackward ? this.anchor : this.focus\n }\n\n /**\n * Flip the range.\n *\n * @return {Range}\n */\n\n flip() {\n const range = this.setPoints([this.focus, this.anchor])\n return range\n }\n\n /**\n * Move the anchor and focus offsets forward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveForward(n) {\n return this.updatePoints(point => point.moveForward(n))\n }\n\n /**\n * Move the anchor and focus offsets backward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveBackward(n) {\n return this.updatePoints(point => point.moveBackward(n))\n }\n\n /**\n * Move the anchor offset backward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveAnchorBackward(n) {\n const range = this.setAnchor(this.anchor.moveBackward(n))\n return range\n }\n\n /**\n * Move the anchor offset forward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveAnchorForward(n) {\n const range = this.setAnchor(this.anchor.moveForward(n))\n return range\n }\n\n /**\n * Move the range's anchor point to a new `path` and `offset`.\n *\n * Optionally, the `path` can be a key string, or omitted entirely in which\n * case it would be the offset number.\n *\n * @param {List|String} path\n * @param {Number} offset\n * @return {Range}\n */\n\n moveAnchorTo(path, offset) {\n const range = this.setAnchor(this.anchor.moveTo(path, offset))\n return range\n }\n\n /**\n * Move the range's anchor point to the start of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveAnchorToStartOfNode(node) {\n const range = this.setAnchor(this.anchor.moveToStartOfNode(node))\n return range\n }\n\n /**\n * Move the range's anchor point to the end of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveAnchorToEndOfNode(node) {\n const range = this.setAnchor(this.anchor.moveToEndOfNode(node))\n return range\n }\n\n /**\n * Move the end offset backward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveEndBackward(n) {\n const range = this.setEnd(this.end.moveBackward(n))\n return range\n }\n\n /**\n * Move the end offset forward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveEndForward(n) {\n const range = this.setEnd(this.end.moveForward(n))\n return range\n }\n\n /**\n * Move the range's end point to a new `path` and `offset`.\n *\n * Optionally, the `path` can be a key string, or omitted entirely in which\n * case it would be the offset number.\n *\n * @param {List|String} path\n * @param {Number} offset\n * @return {Range}\n */\n\n moveEndTo(path, offset) {\n const range = this.setEnd(this.end.moveTo(path, offset))\n return range\n }\n\n /**\n * Move the range's end point to the start of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveEndToStartOfNode(node) {\n const range = this.setEnd(this.end.moveToStartOfNode(node))\n return range\n }\n\n /**\n * Move the range's end point to the end of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveEndToEndOfNode(node) {\n const range = this.setEnd(this.end.moveToEndOfNode(node))\n return range\n }\n\n /**\n * Move the focus offset backward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveFocusBackward(n) {\n const range = this.setFocus(this.focus.moveBackward(n))\n return range\n }\n\n /**\n * Move the focus offset forward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveFocusForward(n) {\n const range = this.setFocus(this.focus.moveForward(n))\n return range\n }\n\n /**\n * Move the range's focus point to a new `path` and `offset`.\n *\n * Optionally, the `path` can be a key string, or omitted entirely in which\n * case it would be the offset number.\n *\n * @param {List|String} path\n * @param {Number} offset\n * @return {Range}\n */\n\n moveFocusTo(path, offset) {\n const range = this.setFocus(this.focus.moveTo(path, offset))\n return range\n }\n\n /**\n * Move the range's focus point to the start of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveFocusToStartOfNode(node) {\n const range = this.setFocus(this.focus.moveToStartOfNode(node))\n return range\n }\n\n /**\n * Move the range's focus point to the end of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveFocusToEndOfNode(node) {\n const range = this.setFocus(this.focus.moveToEndOfNode(node))\n return range\n }\n\n /**\n * Move the start offset backward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveStartBackward(n) {\n const range = this.setStart(this.start.moveBackward(n))\n return range\n }\n\n /**\n * Move the start offset forward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveStartForward(n) {\n const range = this.setStart(this.start.moveForward(n))\n return range\n }\n\n /**\n * Move the range's start point to a new `path` and `offset`.\n *\n * Optionally, the `path` can be a key string, or omitted entirely in which\n * case it would be the offset number.\n *\n * @param {List|String} path\n * @param {Number} offset\n * @return {Range}\n */\n\n moveStartTo(path, offset) {\n const range = this.setStart(this.start.moveTo(path, offset))\n return range\n }\n\n /**\n * Move the range's start point to the start of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveStartToStartOfNode(node) {\n const range = this.setStart(this.start.moveToStartOfNode(node))\n return range\n }\n\n /**\n * Move the range's start point to the end of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveStartToEndOfNode(node) {\n const range = this.setStart(this.start.moveToEndOfNode(node))\n return range\n }\n\n /**\n * Move range's points to a new `path` and `offset`.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveTo(path, offset) {\n return this.updatePoints(point => point.moveTo(path, offset))\n }\n\n /**\n * Move the focus point to the anchor point.\n *\n * @return {Range}\n */\n\n moveToAnchor() {\n const range = this.setFocus(this.anchor)\n return range\n }\n\n /**\n * Move the start point to the end point.\n *\n * @return {Range}\n */\n\n moveToEnd() {\n const range = this.setStart(this.end)\n return range\n }\n\n /**\n * Move the range's points to the end of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveToEndOfNode(node) {\n return this.updatePoints(point => point.moveToEndOfNode(node))\n }\n\n /**\n * Move the anchor point to the focus point.\n *\n * @return {Range}\n */\n\n moveToFocus() {\n const range = this.setAnchor(this.focus)\n return range\n }\n\n /**\n * Move to the entire range of `start` and `end` nodes.\n *\n * @param {Node} start\n * @param {Node} end (optional)\n * @return {Range}\n */\n\n moveToRangeOfNode(start, end = start) {\n const range = this.setPoints([\n this.anchor.moveToStartOfNode(start),\n this.focus.moveToEndOfNode(end),\n ])\n\n return range\n }\n\n /**\n * Move the end point to the start point.\n *\n * @return {Range}\n */\n\n moveToStart() {\n const range = this.setEnd(this.start)\n return range\n }\n\n /**\n * Move the range's points to the start of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveToStartOfNode(node) {\n return this.updatePoints(point => point.moveToStartOfNode(node))\n }\n\n /**\n * Normalize the range, relative to a `node`, ensuring that the anchor\n * and focus nodes of the range always refer to leaf text nodes.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n normalize(node) {\n return this.updatePoints(point => point.normalize(node))\n }\n\n /**\n * Set the anchor point to a new `anchor`.\n *\n * @param {Point} anchor\n * @return {Range}\n */\n\n setAnchor(anchor) {\n const range = this.set('anchor', anchor)\n return range\n }\n\n /**\n * Set the end point to a new `point`.\n *\n * @param {Point} point\n * @return {Range}\n */\n\n setEnd(point) {\n const range = this.isBackward ? this.setAnchor(point) : this.setFocus(point)\n return range\n }\n\n /**\n * Set the focus point to a new `focus`.\n *\n * @param {Point} focus\n * @return {Range}\n */\n\n setFocus(focus) {\n const range = this.set('focus', focus)\n return range\n }\n\n /**\n * Set the anchor and focus points to new `values`.\n *\n * @param {Array<Point>} values\n * @return {Range}\n */\n\n setPoints(values) {\n const [anchor, focus] = values\n const range = this.set('anchor', anchor).set('focus', focus)\n return range\n }\n\n /**\n * Set the anchor and focus points with `updater` callback\n *\n * @param {Function} updater\n * @return {Range}\n */\n\n updatePoints(updater) {\n let { anchor, focus } = this\n anchor = updater(anchor)\n focus = updater(focus)\n return this.merge({ anchor, focus })\n }\n\n /**\n * Set the start point to a new `point`.\n *\n * @param {Point} point\n * @return {Range}\n */\n\n setStart(point) {\n const range = this.isBackward ? this.setFocus(point) : this.setAnchor(point)\n return range\n }\n\n /**\n * Set new `properties` on the range.\n *\n * @param {Object|Range} properties\n * @return {Range}\n */\n\n setProperties(properties) {\n properties = Range.createProperties(properties)\n const { anchor, focus, ...props } = properties\n\n if (anchor) {\n props.anchor = Point.create(anchor)\n }\n\n if (focus) {\n props.focus = Point.create(focus)\n }\n\n const range = this.merge(props)\n return range\n }\n\n /**\n * Return a JSON representation of the range.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n anchor: this.anchor.toJSON(options),\n focus: this.focus.toJSON(options),\n }\n\n return object\n }\n\n /**\n * Return a `Range` instance from any range-like instance.\n *\n * @return {Range}\n */\n\n toRange() {\n const properties = Range.createProperties(this)\n const range = Range.create(properties)\n return range\n }\n\n /**\n * Unset the range.\n *\n * @return {Range}\n */\n\n unset() {\n const range = this.updatePoints(p => p.unset())\n return range\n }\n}\n\n/**\n * Mix in the range interface.\n *\n * @param {Record}\n */\n\nmixin(RangeInterface, [Annotation, Decoration, Range, Selection])\n","import './interfaces/object'\nimport './interfaces/model'\nimport './interfaces/node'\nimport './interfaces/element'\nimport './interfaces/range'\n\nimport Annotation from './models/annotation'\nimport Block from './models/block'\nimport Change from './models/change'\nimport Data from './models/data'\nimport Decoration from './models/decoration'\nimport Document from './models/document'\nimport Editor from './controllers/editor'\nimport Inline from './models/inline'\nimport KeyUtils from './utils/key-utils'\nimport Leaf from './models/leaf'\nimport Mark from './models/mark'\nimport Node from './models/node'\nimport Operation from './models/operation'\nimport PathUtils from './utils/path-utils'\nimport Point from './models/point'\nimport Range from './models/range'\nimport Selection from './models/selection'\nimport Text from './models/text'\nimport TextUtils from './utils/text-utils'\nimport Value from './models/value'\nimport { resetMemoization, useMemoization } from './utils/memoize'\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport {\n Annotation,\n Block,\n Change,\n Data,\n Decoration,\n Document,\n Editor,\n Inline,\n KeyUtils,\n Leaf,\n Mark,\n Node,\n Operation,\n PathUtils,\n Point,\n Range,\n resetMemoization,\n Selection,\n Text,\n TextUtils,\n useMemoization,\n Value,\n}\n\nexport default {\n Annotation,\n Block,\n Change,\n Data,\n Decoration,\n Document,\n Editor,\n Inline,\n KeyUtils,\n Leaf,\n Mark,\n Node,\n Operation,\n PathUtils,\n Point,\n Range,\n resetMemoization,\n Selection,\n Text,\n TextUtils,\n useMemoization,\n Value,\n}\n"],"names":["n","generate","create","key","Error","setGenerator","func","resetGenerator","compare","path","target","m","min","i","pv","get","tv","size","attrs","List","isList","Array","isArray","crop","a","b","ca","slice","cb","decrement","index","increment","getAncestors","ancestors","withMutations","push","value","newValue","newPath","set","isAbove","p","t","isAfter","isBefore","isEqual","equals","isOlder","pl","tl","isPath","any","every","isSibling","butLast","isYounger","lift","ancestor","drop","relative","max","Math","relate","array","av","bv","transform","operation","type","position","pIndex","pEqual","pYounger","pAbove","np","concat","paths","DEFAULTS","undefined","Point","point","isUnset","is","offset","PathUtils","range","isAfterPoint","end","start","isBeforePoint","node","last","getLastText","text","length","first","getFirstText","object","hasNode","moveForward","setOffset","moveBackward","merge","moveTo","getNode","getPath","getTextAtOffset","before","getOffset","block","getClosestBlock","next","getNextText","KeyUtils","options","toArray","preserveKeys","isSet","isPoint","isPlainObject","fromJSON","Record","Data","Map","isMap","fromJS","Mark","data","toJSON","isMark","elements","Set","marks","map","props","mark","item","Decoration","properties","createProperties","decoration","anchor","focus","isDecoration","Range","isRange","list","JSON","stringify","Selection","selection","isFocused","isSelection","createSet","TYPES","isObject","Annotation","annotation","isAnnotation","obj","Document","nodes","isDocument","document","Node","createList","Inline","isInline","inline","Leaf","Text","add","union","annotations","decorations","leaves","split","leaf","at","compile","formats","kind","values","format","o","middle","after","string","remove","newProperties","newMark","one","two","regenerateKey","other","isText","isNode","Block","forEach","el","texts","isBlock","Value","addMark","insertNode","mapRanges","updatePoints","setPath","assertNode","insertText","mapPoints","newDocument","mergeNode","resolvePath","withPath","moveAnchorTo","moveFocusTo","newIndex","moveNode","delete","removeMark","prev","getPreviousText","removeNode","moveStartTo","unset","moveEndTo","removeText","setNode","setMark","resolveAnnotation","setProperties","resolveSelection","splitNode","iterator","sel","createSelection","anns","createAnnotation","filter","preserveData","preserveAnnotations","toObject","preserveSelection","getClosestInline","getDescendant","getNextBlock","getPreviousBlock","getNextInline","getPreviousInline","getMarksAtRange","getActiveMarksAtRange","getLeafBlocksAtRange","getFragmentAtRange","getLeafInlinesAtRange","getTextsAtRange","isValue","createMap","moveToStartOfNode","debug","Debug","applyOperation","op","Operation","addAnnotation","removeAnnotation","setAnnotation","setSelection","invertOperation","inversePath","inverseNewPath","inverse","replace","OPERATION_ATTRIBUTES","apply","inverted","invert","json","ATTRIBUTES","v","toJS","isOperation","Change","operations","isChange","change","CommandsPlugin","commands","onCommand","command","editor","args","fn","onConstruct","registerCommand","SURROGATE_START","SURROGATE_END","SPACE","CHAMELEON","PUNCTUATION","isSurrogate","code","isWord","char","remaining","test","charAt","getCharLength","rest","charCodeAt","getCharOffset","getCharOffsetBackward","reverse","getCharOffsetForward","getWordOffset","started","l","getWordOffsetBackward","getWordOffsetForward","deleteExpandedAtRange","isExpanded","deleteAtRange","hasDescendant","moveToStart","normalize","Commands","addMarkAtRange","isCollapsed","withoutNormalizing","addMarkByKey","addMarksAtRange","snapshotSelection","startKey","startOffset","endKey","endOffset","isStartVoid","hasVoidParent","isEndVoid","startBlock","endBlock","isHanging","prevText","startVoid","getClosestVoid","nextText","removeNodeByKey","endVoid","removeTextByKey","startText","endText","startLength","endLength","getCommonAncestor","startChild","getFurthestChild","endChild","startParent","getParent","startParentIndex","indexOf","endParentIndex","child","parent","afters","startChildIndex","endChildIndex","middles","befores","onlyChildAncestor","moveNodeByKey","mergeNodeByKey","deleteBackwardAtRange","voidParent","isAtStartOfNode","prevBlock","prevVoid","moveFocusBackward","traversed","deleteCharBackwardAtRange","TextUtils","deleteCharForwardAtRange","deleteForwardAtRange","isVoid","nextBlock","isAtEndOfNode","nextVoid","moveFocusForward","deleteLineBackwardAtRange","deleteLineForwardAtRange","deleteWordBackwardAtRange","deleteWordForwardAtRange","wordOffset","insertBlockAtRange","startInline","insertionMode","getInsertionMode","insertNodeByKey","atEnd","siblingText","splitRange","moveToEndOfNode","splitDescendantsByKey","insertFragmentAtRange","fragment","mapDescendants","isAtStart","blocks","getBlocks","firstChild","lastChild","firstBlock","lastBlock","insertionNode","findInsertionNode","hasBlockChildren","lonelyParent","getFurthest","lonelyChild","startIndex","excludingLonelyChild","nextChild","getNextSibling","nextNodes","skipUntil","lastIndex","findDescendant","inlineChild","inlineIndex","hasSingleNode","firstNode","fragmentInner","matches","documentNode","documentInner","insertInlineAtRange","assertDescendant","splitNodeByPath","insertTextAtRange","insertTextByPath","removeMarkAtRange","removeMarkByKey","setBlocksAtRange","sets","setNodeByKey","setInlinesAtRange","inlines","splitBlockAtRange","height","h","isBackward","flip","moveAnchorToStartOfNode","setFocus","resolveRange","splitInlineAtRange","Infinity","toggleMarkAtRange","exists","some","unwrapBlockAtRange","wrappers","getClosest","isSuperset","toOrderedSet","toList","children","firstMatch","lastMatch","takeUntil","firstText","extra","unwrapInlineAtRange","wrapBlockAtRange","clear","firstblock","lastblock","siblings","p1","p2","indexes","reduce","ind","wrapInlineAtRange","inlineParent","wrapInlineByKey","endInline","endIndex","splitText","startInner","startInnerIndex","endInner","startInlines","endInlines","startNode","endNode","wrapTextAtRange","prefix","suffix","startRange","endRange","moveToEnd","addMarkByPath","addMarksByPath","insertFragmentByPath","insertNodeByPath","isAtomic","mergeNodeByPath","original","previous","getPreviousSibling","moveNodeByPath","newParentPath","removeMarkByPath","removeMarksByPath","removeAllMarksByPath","state","pth","removeNodeByPath","removeTextByPath","replaceNodeByPath","newNode","parentPath","replaceTextByPath","setMarkByPath","setNodeByPath","prevProperties","pick","Object","keys","setTextByPath","splitDescendantsByPath","textPath","textOffset","lastPath","splitNodeByKey","ancestorPath","unwrapInlineByPath","moveToRangeOfNode","unwrapBlockByPath","unwrapNodeByPath","parentIndex","grandPath","isFirst","isLast","updatedPath","unwrapChildrenByPath","childIndex","childPath","wrapBlockByPath","wrapInlineByPath","wrapNodeByPath","COMMANDS","method","assertPath","newKey","textKey","save","tmp","undos","lastBatch","lastOperation","shouldMerge","batch","pop","takeLast","withoutSaving","redos","newData","setData","redo","omit","undo","withoutMerging","blur","select","deselect","proxy","moveAnchorBackward","pointBackward","moveAnchorWordBackward","pointWordBackward","moveAnchorForward","pointForward","moveAnchorWordForward","pointWordForward","moveAnchorToEndOfBlock","pointEdgeObject","moveAnchorToEndOfInline","moveAnchorToEndOfDocument","moveAnchorToEndOfNode","moveToAnchor","moveAnchorToEndOfNextBlock","pointEdgeSideObject","moveAnchorToEndOfNextInline","moveAnchorToEndOfNextText","moveAnchorToEndOfPreviousBlock","moveAnchorToEndOfPreviousInline","moveAnchorToEndOfPreviousText","moveAnchorToEndOfText","moveAnchorToStartOfBlock","moveAnchorToStartOfDocument","moveAnchorToStartOfInline","moveAnchorToStartOfNextBlock","moveAnchorToStartOfNextInline","moveAnchorToStartOfNextText","moveAnchorToStartOfPreviousBlock","moveAnchorToStartOfPreviousInline","moveAnchorToStartOfPreviousText","moveAnchorToStartOfText","moveWordBackward","moveFocusWordBackward","moveToFocus","moveEndBackward","moveEndWordBackward","moveEndForward","moveEndWordForward","moveEndToEndOfBlock","moveEndToEndOfDocument","moveEndToEndOfNode","moveEndToEndOfInline","moveEndToEndOfNextBlock","moveEndToEndOfNextInline","moveEndToEndOfNextText","moveEndToEndOfPreviousBlock","moveEndToEndOfPreviousInline","moveEndToEndOfPreviousText","moveEndToEndOfText","moveEndToStartOfBlock","moveEndToStartOfDocument","moveEndToStartOfNode","moveEndToStartOfInline","moveEndToStartOfNextBlock","moveEndToStartOfNextInline","moveEndToStartOfNextText","moveEndToStartOfPreviousBlock","moveEndToStartOfPreviousInline","moveEndToStartOfPreviousText","moveEndToStartOfText","moveFocusWordForward","moveFocusToEndOfBlock","moveFocusToEndOfDocument","moveFocusToEndOfNode","moveFocusToEndOfInline","moveFocusToEndOfNextBlock","moveFocusToEndOfNextInline","moveFocusToEndOfNextText","moveFocusToEndOfPreviousBlock","moveFocusToEndOfPreviousInline","moveFocusToEndOfPreviousText","moveFocusToEndOfText","moveFocusToStartOfBlock","moveFocusToStartOfDocument","moveFocusToStartOfNode","moveFocusToStartOfInline","moveFocusToStartOfNextBlock","moveFocusToStartOfNextInline","moveFocusToStartOfNextText","moveFocusToStartOfPreviousBlock","moveFocusToStartOfPreviousInline","moveFocusToStartOfPreviousText","moveFocusToStartOfText","moveWordForward","moveStartBackward","moveStartWordBackward","moveStartForward","moveStartWordForward","moveStartToEndOfBlock","moveStartToEndOfDocument","moveStartToEndOfNode","moveStartToEndOfInline","moveStartToEndOfNextBlock","moveStartToEndOfNextInline","moveStartToEndOfNextText","moveStartToEndOfPreviousBlock","moveStartToEndOfPreviousInline","moveStartToEndOfPreviousText","moveStartToEndOfText","moveStartToStartOfBlock","moveStartToStartOfDocument","moveStartToStartOfNode","moveStartToStartOfInline","moveStartToStartOfNextBlock","moveStartToStartOfNextInline","moveStartToStartOfNextText","moveStartToStartOfPreviousBlock","moveStartToStartOfPreviousInline","moveStartToStartOfPreviousText","moveStartToStartOfText","moveToEndOfBlock","moveToEndOfDocument","moveToEndOfInline","moveToEndOfNextBlock","moveToEndOfNextInline","moveToEndOfNextText","moveToEndOfPreviousBlock","moveToEndOfPreviousInline","moveToEndOfPreviousText","moveToEndOfText","moveToRangeOfDocument","moveToStartOfBlock","moveToStartOfDocument","moveToStartOfInline","moveToStartOfNextBlock","moveToStartOfNextInline","moveToStartOfNextText","moveToStartOfPreviousBlock","moveToStartOfPreviousInline","moveToStartOfPreviousText","moveToStartOfText","snapshot","k","skip","setAnchor","setEnd","setStart","edge","toUpperCase","Edge","side","Side","getDirectionNode","isInBlock","isPreviousInVoid","isNextInVoid","pointName","QueriesPlugin","queries","query","registerQuery","onQuery","ret","SlateError","captureStackTrace","constructor","stack","SchemaPlugin","schema","rules","schemaRules","rule","find","r","testRules","match","normalizeNode","error","validateNode","failure","validateRules","Queries","defaultNormalize","getTexts","valid","fail","validateObject","validateType","validateData","validateMarks","validateText","validateFirst","validateLast","validateNodes","getMarks","def","defs","count","lastCount","nextDef","shift","rewind","err","validateParent","validatePrevious","validateNext","lastMin","deleteExpanded","addMarks","deleteBackward","deleteCharBackward","deleteLineBackward","deleteWordBackward","deleteForward","deleteCharForward","deleteLineForward","deleteWordForward","insertBlock","insertFragment","lastText","lastInline","from","isAppending","isInserting","newTexts","includes","newText","findLastIndex","remainingTexts","remainingTextLength","acc","val","insertInline","getInsertMarksAtRange","replaceMark","oldMark","setBlocks","setInlines","splitBlock","depth","splitInline","toggleMark","activeMarks","has","unwrapBlock","unwrapInline","wrapBlock","wrapInline","wrapText","isForward","CorePlugin","plugins","AtRange","ByPath","OnHistory","OnSelection","OnValue","WithIntent","Schema","isEmpty","Editor","controller","construct","onChange","readOnly","middleware","core","run","setReadOnly","setValue","newDirtyPaths","getDirtyPaths","dirty","memo","transformed","flushing","resolve","then","flush","__command","__query","table","getKeysToPathsTable","fns","overrides","defineProperty","nextPath","previousPath","oldAncestors","arr","newAncestors","normalizeDirtyPaths","normalizeNodeByPath","iterations","found","registerPlugin","plugin","commandsPlugin","queriesPlugin","schemaPlugin","newMarks","isLeaf","invalid","result","findLast","firstLeaf","cache","unshift","left","right","of","take","mixin","Interface","Classes","Class","getOwnPropertyNames","name","hasOwnProperty","desc","getOwnPropertyDescriptor","prototype","TYPE","camel","ObjectInterface","bind","entries","toLowerCase","ModelInterface","ENABLED","LEAF","Symbol","STORE_KEY","UNDEFINED","NULL","UNSET","memoizeStore","WeakMap","memoize","property","noArgs","hasArgs","takesArguments","cachedValue","getIn","setIn","newChild","resetMemoization","useMemoization","enabled","NodeInterface","descendant","nested","descendants","dict","c","normalizer","identity","ElementInterface","replaceNode","iterable","createIterable","onlyLeaves","onlyRoots","onlyTypes","isLeafBlock","resolveDecoration","direction","downward","upward","includeBlocks","includeDocument","includeInlines","includeRoot","includeTarget","includeTargetAncestors","includeTexts","root","targetPath","targetRange","targetNode","NativeSet","window","global","visited","startPath","endPath","includedTarget","includedStart","includingStart","done","nextIndex","resolvePoint","predicate","getInsertMarksAtPoint","startMarks","endMarks","intersect","closest","startAt","targetPosition","results","furthest","blockNode","blockPath","entry","relativePath","previousText","forEachDescendant","OrderedSet","dir","getDirection","getChild","isLeafInline","splice","toStart","toEnd","isInRange","mergeText","deep","flatMap","x","deleteIn","getLeafBlocksAtRangeAsArray","getLeafInlinesAtRangeAsArray","getNextTextEntry","getNextMatchingNodeAndPath","nextNode","childMatch","assign","findFirstDescendantAndPath","getNextDeepMatchingNodeAndPath","getPreviousTextEntry","pathToThisNode","findDescendantAndPath","previousNode","getPreviousMatchingNodeAndPath","findLastDescendantAndPath","getPreviousDeepMatchingNodeAndPath","foundPath","forEachDescendantWithPath","isSelected","getFurthestAncestor","getTextsBetweenPathPositionsAsArray","getTextsAsArray","childStartPath","childEndPath","getLeafBlocksBetweenPathPositionsAsArray","getBlocksAsArray","getTextsAtRangeAsArray","getMarksByType","getMarksByTypeAsArray","getFurthestInline","currentMarks","closestBlock","getText","ASSERTS","RangeInterface","setPoints","updater"],"mappings":"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"}
1
+ {"version":3,"file":"slate.js","sources":["../src/utils/key-utils.js","../src/utils/path-utils.js","../src/models/point.js","../src/models/data.js","../src/models/mark.js","../src/models/decoration.js","../src/models/selection.js","../src/utils/is-object.js","../src/models/range.js","../src/models/annotation.js","../src/models/document.js","../src/models/inline.js","../src/models/text.js","../src/models/node.js","../src/models/block.js","../src/models/value.js","../src/operations/apply.js","../src/operations/invert.js","../src/models/operation.js","../src/models/change.js","../src/plugins/commands.js","../src/utils/text-utils.js","../src/commands/at-range.js","../src/commands/by-path.js","../src/commands/on-history.js","../src/commands/on-selection.js","../src/commands/on-value.js","../src/plugins/queries.js","../src/utils/slate-error.js","../src/plugins/schema.js","../src/commands/with-intent.js","../src/plugins/core.js","../src/controllers/editor.js","../src/models/leaf.js","../src/utils/mixin.js","../src/interfaces/object.js","../src/interfaces/model.js","../src/utils/memoize.js","../src/interfaces/node.js","../../../node_modules/rollup-plugin-node-globals/src/global.js","../src/utils/identity.js","../src/interfaces/element.js","../src/interfaces/range.js","../src/index.js"],"sourcesContent":["/**\n * An auto-incrementing index for generating keys.\n *\n * @type {Number}\n */\n\nlet n\n\n/**\n * The global key generating function.\n *\n * @type {Function}\n */\n\nlet generate\n\n/**\n * Create a key, using a provided key if available.\n *\n * @param {String|Void} key\n * @return {String}\n */\n\nfunction create(key) {\n if (key == null) {\n return generate()\n }\n\n if (typeof key === 'string') {\n return key\n }\n\n throw new Error(`Keys must be strings, but you passed: ${key}`)\n}\n\n/**\n * Set a different unique ID generating `function`.\n *\n * @param {Function} func\n */\n\nfunction setGenerator(func) {\n generate = func\n}\n\n/**\n * Reset the key generating function to its initial state.\n */\n\nfunction resetGenerator() {\n n = 0\n generate = () => `${n++}`\n}\n\n/**\n * Set the initial state.\n */\n\nresetGenerator()\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default {\n create,\n setGenerator,\n resetGenerator,\n}\n","import { List } from 'immutable'\n\n/**\n * Compare paths `path` and `target` to see which is before or after.\n *\n * @param {List} path\n * @param {List} target\n * @return {Number|Null}\n */\n\nfunction compare(path, target) {\n const m = min(path, target)\n\n for (let i = 0; i < m; i++) {\n const pv = path.get(i)\n const tv = target.get(i)\n\n // If the path's value is ever less than the target's, it's before.\n if (pv < tv) return -1\n\n // If the target's value is ever less than the path's, it's after.\n if (pv > tv) return 1\n }\n\n // Paths should now be equal, otherwise something is wrong\n return path.size === target.size ? 0 : null\n}\n\n/**\n * Create a path from `attrs`.\n *\n * @param {Array|List} attrs\n * @return {List}\n */\n\nfunction create(attrs) {\n if (attrs == null) {\n return null\n }\n\n if (List.isList(attrs)) {\n return attrs\n }\n\n if (Array.isArray(attrs)) {\n return List(attrs)\n }\n\n throw new Error(\n `Paths can only be created from arrays or lists, but you passed: ${attrs}`\n )\n}\n\n/**\n * Crop paths `a` and `b` to an equal size, defaulting to the shortest.\n *\n * @param {List} a\n * @param {List} b\n */\n\nfunction crop(a, b, size = min(a, b)) {\n const ca = a.slice(0, size)\n const cb = b.slice(0, size)\n return [ca, cb]\n}\n\n/**\n * Decrement a `path` by `n` at `index`, defaulting to the last index.\n *\n * @param {List} path\n * @param {Number} n\n * @param {Number} index\n */\n\nfunction decrement(path, n = 1, index = path.size - 1) {\n return increment(path, 0 - n, index)\n}\n\n/**\n * Get all ancestor paths of th given path.\n *\n * @param {List} path\n * @returns {List}\n */\n\nfunction getAncestors(path) {\n const ancestors = List().withMutations(list => {\n for (let i = 0; i < path.size; i++) {\n list.push(path.slice(0, i))\n }\n })\n\n return ancestors\n}\n\n/**\n * Increment a `path` by `n` at `index`, defaulting to the last index.\n *\n * @param {List} path\n * @param {Number} n\n * @param {Number} index\n */\n\nfunction increment(path, n = 1, index = path.size - 1) {\n const value = path.get(index)\n const newValue = value + n\n const newPath = path.set(index, newValue)\n return newPath\n}\n\n/**\n * Is a `path` above another `target` path?\n *\n * @param {List} path\n * @param {List} target\n * @return {Boolean}\n */\n\nfunction isAbove(path, target) {\n const [p, t] = crop(path, target)\n return path.size < target.size && compare(p, t) === 0\n}\n\n/**\n * Is a `path` after another `target` path in a document?\n *\n * @param {List} path\n * @param {List} target\n * @return {Boolean}\n */\n\nfunction isAfter(path, target) {\n const [p, t] = crop(path, target)\n return compare(p, t) === 1\n}\n\n/**\n * Is a `path` before another `target` path in a document?\n *\n * @param {List} path\n * @param {List} target\n * @return {Boolean}\n */\n\nfunction isBefore(path, target) {\n const [p, t] = crop(path, target)\n return compare(p, t) === -1\n}\n\n/**\n * Is a `path` equal to another `target` path in a document?\n *\n * @param {List} path\n * @param {List} target\n * @return {Boolean}\n */\n\nfunction isEqual(path, target) {\n return path.equals(target)\n}\n\n/**\n * Is a `path` older than a `target` path? Meaning that it ends as an older\n * sibling of one of the indexes in the target.\n *\n * @param {List} path\n * @param {List} target\n * @return {Boolean}\n */\n\nfunction isOlder(path, target) {\n const index = path.size - 1\n const [p, t] = crop(path, target, index)\n const pl = path.get(index)\n const tl = target.get(index)\n return isEqual(p, t) && pl > tl\n}\n\n/**\n * Is an `any` object a path?\n *\n * @param {Mixed} any\n * @return {Boolean}\n */\n\nfunction isPath(any) {\n return (\n (List.isList(any) || Array.isArray(any)) &&\n any.every(n => typeof n === 'number')\n )\n}\n\n/**\n * Is a `path` a sibling of a `target` path?\n *\n * @param {List} path\n * @param {List} target\n * @return {Boolean}\n */\n\nfunction isSibling(path, target) {\n if (path.size !== target.size) return false\n const p = path.butLast()\n const t = target.butLast()\n return p.equals(t)\n}\n\n/**\n * Is a `path` younger than a `target` path? Meaning that it ends as a younger\n * sibling of one of the indexes in the target.\n *\n * @param {List} path\n * @param {List} target\n * @return {Boolean}\n */\n\nfunction isYounger(path, target) {\n const index = path.size - 1\n const [p, t] = crop(path, target, index)\n const pl = path.get(index)\n const tl = target.get(index)\n return isEqual(p, t) && pl < tl\n}\n\n/**\n * Lift a `path` to refer to its `n`th ancestor.\n *\n * @param {List} path\n * @return {List}\n */\n\nfunction lift(path, n = 1) {\n const ancestor = path.slice(0, -1 * n)\n return ancestor\n}\n\n/**\n * Drop a `path`, returning a relative path from a depth of `n`.\n *\n * @param {List} path\n * @param {Number} n\n * @return {List}\n */\n\nfunction drop(path, n = 1) {\n const relative = path.slice(n)\n return relative\n}\n\n/**\n * Get the maximum length of paths `a` and `b`.\n *\n * @param {List} path\n * @param {List} path\n * @return {Number}\n */\n\nfunction max(a, b) {\n const n = Math.max(a.size, b.size)\n return n\n}\n\n/**\n * Get the minimum length of paths `a` and `b`.\n *\n * @param {List} path\n * @param {List} path\n * @return {Number}\n */\n\nfunction min(a, b) {\n const n = Math.min(a.size, b.size)\n return n\n}\n\n/**\n * Get the common ancestor path of path `a` and path `b`.\n *\n * @param {List} a\n * @param {List} b\n * @return {List}\n */\n\nfunction relate(a, b) {\n const array = []\n\n for (let i = 0; i < a.size && i < b.size; i++) {\n const av = a.get(i)\n const bv = b.get(i)\n\n // If the values aren't equal, they've diverged and don't share an ancestor.\n if (av !== bv) break\n\n // Otherwise, the current value is still a common ancestor.\n array.push(av)\n }\n\n const path = create(array)\n return path\n}\n\n/**\n * Transform a `path` by an `operation`, adjusting it to stay current.\n *\n * @param {List} path\n * @param {Operation} operation\n * @return {List<List>}\n */\n\nfunction transform(path, operation) {\n const { type, position, path: p } = operation\n\n if (\n type === 'add_mark' ||\n type === 'insert_text' ||\n type === 'remove_mark' ||\n type === 'remove_text' ||\n type === 'set_mark' ||\n type === 'set_node' ||\n type === 'set_selection' ||\n type === 'set_value' ||\n type === 'add_annotation' ||\n type === 'remove_annotation' ||\n type === 'set_annotation' ||\n path.size === 0\n ) {\n return List([path])\n }\n\n const pIndex = p.size - 1\n const pEqual = isEqual(p, path)\n const pYounger = isYounger(p, path)\n const pAbove = isAbove(p, path)\n\n if (type === 'insert_node') {\n if (pEqual || pYounger || pAbove) {\n path = increment(path, 1, pIndex)\n }\n }\n\n if (type === 'remove_node') {\n if (pYounger) {\n path = decrement(path, 1, pIndex)\n } else if (pEqual || pAbove) {\n path = []\n }\n }\n\n if (type === 'merge_node') {\n if (pEqual || pYounger) {\n path = decrement(path, 1, pIndex)\n } else if (pAbove) {\n path = decrement(path, 1, pIndex)\n path = increment(path, position, pIndex + 1)\n }\n }\n\n if (type === 'split_node') {\n if (pEqual) {\n path = [path, increment(path)]\n } else if (pYounger) {\n path = increment(path, 1, pIndex)\n } else if (pAbove) {\n if (path.get(pIndex + 1) >= position) {\n path = increment(path, 1, pIndex)\n path = decrement(path, position, pIndex + 1)\n }\n }\n }\n\n if (type === 'move_node') {\n const { newPath: np } = operation\n\n if (isEqual(p, np)) {\n return List([path])\n }\n\n if (pAbove || pEqual) {\n // We are comparing something that was moved\n // The new path is unaffected unless the old path was the left-sibling of an ancestor\n if (isYounger(p, np) && p.size < np.size) {\n path = decrement(np, 1, min(np, p) - 1).concat(path.slice(p.size))\n } else {\n path = np.concat(path.slice(p.size))\n }\n } else {\n // This is equivalent logic to remove_node for path\n if (pYounger) {\n path = decrement(path, 1, pIndex)\n }\n\n // This is the equivalent logic to insert_node for newPath\n if (isYounger(np, path) || isEqual(np, path) || isAbove(np, path)) {\n path = increment(path, 1, np.size - 1)\n }\n }\n }\n\n const paths = Array.isArray(path) ? path : [path]\n return List(paths)\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default {\n compare,\n create,\n crop,\n decrement,\n getAncestors,\n increment,\n isAbove,\n isAfter,\n isBefore,\n isEqual,\n isOlder,\n isPath,\n isSibling,\n isYounger,\n lift,\n drop,\n max,\n min,\n relate,\n transform,\n}\n","import isPlainObject from 'is-plain-object'\nimport warning from 'tiny-warning'\nimport { Record } from 'immutable'\n\nimport KeyUtils from '../utils/key-utils'\nimport PathUtils from '../utils/path-utils'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n key: undefined,\n offset: undefined,\n path: undefined,\n}\n\n/**\n * Point.\n *\n * @type {Point}\n */\n\nclass Point extends Record(DEFAULTS) {\n /**\n * Create a new `Point` with `attrs`.\n *\n * @param {Object|Point} attrs\n * @return {Point}\n */\n\n static create(attrs = {}) {\n if (Point.isPoint(attrs)) {\n return attrs\n }\n\n if (isPlainObject(attrs)) {\n return Point.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Point.create\\` only accepts objects or points, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a dictionary of settable point properties from `attrs`.\n *\n * @param {Object|Point} attrs\n * @return {Object}\n */\n\n static createProperties(a = {}) {\n if (Point.isPoint(a)) {\n return {\n key: a.key,\n offset: a.offset,\n path: a.path,\n }\n }\n\n if (isPlainObject(a)) {\n const p = {}\n if ('key' in a) p.key = a.key\n if ('offset' in a) p.offset = a.offset\n if ('path' in a) p.path = PathUtils.create(a.path)\n\n // If only a path is set, or only a key is set, ensure that the other is\n // set to null so that it can be normalized back to the right value.\n // Otherwise we won't realize that the path and key don't match anymore.\n if ('path' in a && !('key' in a)) p.key = null\n if ('key' in a && !('path' in a)) p.path = null\n\n return p\n }\n\n throw new Error(\n `\\`Point.createProperties\\` only accepts objects or points, but you passed it: ${a}`\n )\n }\n\n /**\n * Create a `Point` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Point}\n */\n\n static fromJSON(object) {\n const { key = null, offset = null, path = null } = object\n\n const point = new Point({\n key,\n offset,\n path: PathUtils.create(path),\n })\n\n return point\n }\n\n /**\n * Check whether all properties of the point are set.\n *\n * @return {Boolean}\n */\n\n get isSet() {\n return this.key != null && this.offset != null && this.path != null\n }\n\n /**\n * Check whether any property of the point is not set.\n *\n * @return {Boolean}\n */\n\n get isUnset() {\n return !this.isSet\n }\n\n /**\n * Check whether the point is after another `point`.\n *\n * @return {Boolean}\n */\n\n isAfterPoint(point) {\n if (this.isUnset) return false\n const is =\n (this.key === point.key && this.offset > point.offset) ||\n PathUtils.compare(this.path, point.path) === 1\n return is\n }\n\n /**\n * Check whether the point is after a `range`.\n *\n * @return {Boolean}\n */\n\n isAfterRange(range) {\n if (this.isUnset) return false\n const is = this.isAfterPoint(range.end)\n return is\n }\n\n /**\n * Check whether the point is at the end of a `range`.\n *\n * @return {Boolean}\n */\n\n isAtEndOfRange(range) {\n if (this.isUnset) return false\n const is = this.equals(range.end)\n return is\n }\n\n /**\n * Check whether the point is at the start of a `range`.\n *\n * @return {Boolean}\n */\n\n isAtStartOfRange(range) {\n if (this.isUnset) return false\n const is = this.equals(range.start)\n return is\n }\n\n /**\n * Check whether the point is before another `point`.\n *\n * @return {Boolean}\n */\n\n isBeforePoint(point) {\n if (this.isUnset) return false\n const is =\n (this.key === point.key && this.offset < point.offset) ||\n PathUtils.compare(this.path, point.path) === -1\n return is\n }\n\n /**\n * Check whether the point is before a `range`.\n *\n * @return {Boolean}\n */\n\n isBeforeRange(range) {\n if (this.isUnset) return false\n const is = this.isBeforePoint(range.start)\n return is\n }\n\n /**\n * Check whether the point is inside a `range`.\n *\n * @return {Boolean}\n */\n\n isInRange(range) {\n if (this.isUnset) return false\n const is =\n this.equals(range.start) ||\n this.equals(range.end) ||\n (this.isAfterPoint(range.start) && this.isBeforePoint(range.end))\n return is\n }\n\n /**\n * Check whether the point is at the end of a `node`.\n *\n * @param {Node} node\n * @return {Boolean}\n */\n\n isAtEndOfNode(node) {\n if (this.isUnset) return false\n const last = node.getLastText()\n const is = this.key === last.key && this.offset === last.text.length\n return is\n }\n\n /**\n * Check whether the point is at the start of a `node`.\n *\n * @param {Node} node\n * @return {Boolean}\n */\n\n isAtStartOfNode(node) {\n if (this.isUnset) return false\n\n // PERF: Do a check for a `0` offset first since it's quickest.\n if (this.offset !== 0) return false\n\n const first = node.getFirstText()\n const is = this.key === first.key\n return is\n }\n\n /**\n * Check whether the point is in a `node`.\n *\n * @param {Node} node\n * @return {Boolean}\n */\n\n isInNode(node) {\n if (this.isUnset) return false\n if (node.object === 'text' && node.key === this.key) return true\n if (node.hasNode(this.key)) return true\n return false\n }\n\n /**\n * Move the point's offset backward `n` characters.\n *\n * @param {Number} n (optional)\n * @return {Point}\n */\n\n moveBackward(n = 1) {\n if (n === 0) return this\n if (n < 0) return this.moveForward(-n)\n const point = this.setOffset(this.offset - n)\n return point\n }\n\n /**\n * Move the point's offset forward `n` characters.\n *\n * @param {Number} n (optional)\n * @return {Point}\n */\n\n moveForward(n = 1) {\n if (n === 0) return this\n if (n < 0) return this.moveBackward(-n)\n const point = this.setOffset(this.offset + n)\n return point\n }\n\n /**\n * Move the point's anchor point to a new `path` and `offset`.\n *\n * Optionally, the `path` can be a key string, or omitted entirely in which\n * case it would be the offset number.\n *\n * @param {List|String|Number} path\n * @param {Number} offset\n * @return {Point}\n */\n\n moveTo(path, offset = 0) {\n let key = this.key\n\n if (typeof path === 'number') {\n offset = path\n path = this.path\n } else if (typeof path === 'string') {\n key = path\n path = key === this.key ? this.path : null\n } else {\n key = path.equals(this.path) ? this.key : null\n }\n\n const point = this.merge({ key, path, offset })\n return point\n }\n\n /**\n * Move the point's anchor point to the start of a `node`.\n *\n * @param {Node} node\n * @return {Point}\n */\n\n moveToStartOfNode(node) {\n const first = node.getFirstText()\n const point = this.moveTo(first.key, 0)\n return point\n }\n\n /**\n * Move the point's anchor point to the end of a `node`.\n *\n * @param {Node} node\n * @return {Point}\n */\n\n moveToEndOfNode(node) {\n const last = node.getLastText()\n const point = this.moveTo(last.key, last.text.length)\n return point\n }\n\n /**\n * Normalize the point relative to a `node`, ensuring that its key and path\n * reference a text node, or that it gets unset.\n *\n * @param {Node} node\n * @return {Point}\n */\n\n normalize(node) {\n // If both the key and path are null, there's no reference to a node, so\n // make sure it is entirely unset.\n if (this.key == null && this.path == null) {\n return this.setOffset(null)\n }\n\n const { key, offset, path } = this\n\n // PERF: this function gets called a lot.\n // to avoid creating the key -> path lookup table, we attempt to look up by path first.\n let target = path && node.getNode(path)\n\n if (!target) {\n target = node.getNode(key)\n\n if (target) {\n // There is a misalignment of path and key\n const point = this.merge({\n path: node.getPath(key),\n })\n\n return point\n }\n }\n\n if (!target) {\n warning(false, \"A point's `path` or `key` invalid and was reset!\")\n\n const text = node.getFirstText()\n if (!text) return Point.create()\n\n const point = this.merge({\n key: text.key,\n offset: 0,\n path: node.getPath(text.key),\n })\n\n return point\n }\n\n if (target.object !== 'text') {\n warning(false, 'A point should not reference a non-text node!')\n\n const text = target.getTextAtOffset(offset)\n const before = target.getOffset(text.key)\n const point = this.merge({\n offset: offset - before,\n key: text.key,\n path: node.getPath(text.key),\n })\n\n return point\n }\n\n if (target && path && key && key !== target.key) {\n warning(false, \"A point's `key` did not match its `path`!\")\n\n // TODO: if we look up by path above and it differs by key, do we want to reset it to looking up by key?\n }\n\n let point = this.merge({\n key: target.key,\n path: path == null ? node.getPath(target.key) : path,\n offset: offset == null ? 0 : Math.min(offset, target.text.length),\n })\n\n // COMPAT: There is an ambiguity, since a point can exist at the end of a\n // text node, or at the start of the following one. To eliminate it we\n // enforce that if there is a following text node, we always move it there.\n if (point.offset === target.text.length) {\n const block = node.getClosestBlock(point.path)\n // TODO: this next line is broken because `getNextText` takes a path\n const next = block.getNextText()\n\n if (next) {\n point = point.merge({\n key: next.key,\n path: node.getPath(next.key),\n offset: 0,\n })\n }\n }\n\n return point\n }\n\n /**\n * Set the point's key to a new `key`.\n *\n * @param {String} key\n * @return {Point}\n */\n\n setKey(key) {\n if (key != null) {\n key = KeyUtils.create(key)\n }\n\n const point = this.set('key', key)\n return point\n }\n\n /**\n * Set the point's offset to a new `offset`.\n *\n * @param {Number} offset\n * @return {Point}\n */\n\n setOffset(offset) {\n const point = this.set('offset', offset)\n return point\n }\n\n /**\n * Set the point's path to a new `path`.\n *\n * @param {List|Array} path\n * @return {Point}\n */\n\n setPath(path) {\n if (path != null) {\n path = PathUtils.create(path)\n }\n\n const point = this.set('path', path)\n return point\n }\n\n /**\n * Return a JSON representation of the point.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n key: this.key,\n offset: this.offset,\n path: this.path && this.path.toArray(),\n }\n\n if (!options.preserveKeys) {\n delete object.key\n }\n\n return object\n }\n\n /**\n * Unset the point.\n *\n * @return {Point}\n */\n\n unset() {\n return this.merge({\n key: null,\n offset: null,\n path: null,\n })\n }\n}\n\n/**\n * Export.\n *\n * @type {Point}\n */\n\nexport default Point\n","import isPlainObject from 'is-plain-object'\nimport { Map } from 'immutable'\n\n/**\n * Data.\n *\n * This isn't an immutable record, it's just a thin wrapper around `Map` so that\n * we can allow for more convenient creation.\n *\n * @type {Object}\n */\n\nclass Data {\n /**\n * Create a new `Data` with `attrs`.\n *\n * @param {Object|Data|Map} attrs\n * @return {Data} data\n */\n\n static create(attrs = {}) {\n if (Map.isMap(attrs)) {\n return attrs\n }\n\n if (isPlainObject(attrs)) {\n return Data.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Data.create\\` only accepts objects or maps, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a `Data` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Data}\n */\n\n static fromJSON(object) {\n return new Map(object)\n }\n\n /**\n * Alias `fromJS`.\n */\n\n static fromJS = Data.fromJSON\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default Data\n","import isPlainObject from 'is-plain-object'\nimport { Map, Record, Set } from 'immutable'\n\nimport Data from './data'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n data: undefined,\n type: undefined,\n}\n\n/**\n * Mark.\n *\n * @type {Mark}\n */\n\nclass Mark extends Record(DEFAULTS) {\n /**\n * Create a new `Mark` with `attrs`.\n *\n * @param {Object|Mark} attrs\n * @return {Mark}\n */\n\n static create(attrs = {}) {\n if (Mark.isMark(attrs)) {\n return attrs\n }\n\n if (typeof attrs === 'string') {\n attrs = { type: attrs }\n }\n\n if (isPlainObject(attrs)) {\n return Mark.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Mark.create\\` only accepts objects, strings or marks, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a set of marks.\n *\n * @param {Array<Object|Mark>} elements\n * @return {Set<Mark>}\n */\n\n static createSet(elements) {\n if (Set.isSet(elements) || Array.isArray(elements)) {\n const marks = new Set(elements.map(Mark.create))\n return marks\n }\n\n if (elements == null) {\n return Set()\n }\n\n throw new Error(\n `\\`Mark.createSet\\` only accepts sets, arrays or null, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a dictionary of settable mark properties from `attrs`.\n *\n * @param {Object|String|Mark} attrs\n * @return {Object}\n */\n\n static createProperties(attrs = {}) {\n if (Mark.isMark(attrs)) {\n return {\n data: attrs.data,\n type: attrs.type,\n }\n }\n\n if (typeof attrs === 'string') {\n return { type: attrs }\n }\n\n if (isPlainObject(attrs)) {\n const props = {}\n if ('type' in attrs) props.type = attrs.type\n if ('data' in attrs) props.data = Data.create(attrs.data)\n return props\n }\n\n throw new Error(\n `\\`Mark.createProperties\\` only accepts objects, strings or marks, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a `Mark` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Mark}\n */\n\n static fromJSON(object) {\n const { data = {}, type } = object\n\n if (typeof type !== 'string') {\n throw new Error('`Mark.fromJS` requires a `type` string.')\n }\n\n const mark = new Mark({\n type,\n data: new Map(data),\n })\n\n return mark\n }\n\n /**\n * Check if `any` is a set of marks.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isMarkSet(any) {\n return Set.isSet(any) && any.every(item => Mark.isMark(item))\n }\n\n /**\n * Return a JSON representation of the mark.\n *\n * @return {Object}\n */\n\n toJSON() {\n const object = {\n object: this.object,\n type: this.type,\n data: this.data.toJSON(),\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Mark}\n */\n\nexport default Mark\n","import isPlainObject from 'is-plain-object'\nimport warning from 'tiny-warning'\nimport { List, Record } from 'immutable'\n\nimport Mark from './mark'\nimport Point from './point'\nimport Data from './data'\nimport Range from './range'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n type: undefined,\n data: undefined,\n anchor: undefined,\n focus: undefined,\n}\n\n/**\n * Decoration.\n *\n * @type {Decoration}\n */\n\nclass Decoration extends Record(DEFAULTS) {\n /**\n * Create a new `Decoration` with `attrs`.\n *\n * @param {Object|Decoration} attrs\n * @return {Decoration}\n */\n\n static create(attrs = {}) {\n if (Decoration.isDecoration(attrs)) {\n return attrs\n }\n\n if (Range.isRange(attrs)) {\n return Decoration.fromJSON(Range.createProperties(attrs))\n }\n\n if (isPlainObject(attrs)) {\n return Decoration.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Decoration.create\\` only accepts objects or decorations, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a list of `Ranges` from `elements`.\n *\n * @param {Array<Decoration|Object>|List<Decoration|Object>} elements\n * @return {List<Decoration>}\n */\n\n static createList(elements = []) {\n if (List.isList(elements) || Array.isArray(elements)) {\n const list = new List(elements.map(Decoration.create))\n return list\n }\n\n throw new Error(\n `\\`Decoration.createList\\` only accepts arrays or lists, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a dictionary of settable decoration properties from `attrs`.\n *\n * @param {Object|String|Decoration} attrs\n * @return {Object}\n */\n\n static createProperties(a = {}) {\n if (Decoration.isDecoration(a)) {\n return {\n type: a.type,\n data: a.data,\n anchor: Point.createProperties(a.anchor),\n focus: Point.createProperties(a.focus),\n mark: Mark.create(a.mark),\n }\n }\n\n if (isPlainObject(a)) {\n const p = {}\n if ('type' in a) p.type = a.type\n if ('data' in a) p.data = Data.create(a.data)\n if ('anchor' in a) p.anchor = Point.create(a.anchor)\n if ('focus' in a) p.focus = Point.create(a.focus)\n return p\n }\n\n throw new Error(\n `\\`Decoration.createProperties\\` only accepts objects or decorations, but you passed it: ${a}`\n )\n }\n\n /**\n * Create a `Decoration` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Decoration}\n */\n\n static fromJSON(object) {\n const { anchor, focus } = object\n let { type, data } = object\n\n if (object.mark && !type) {\n warning(\n false,\n 'As of slate@0.47 the `decoration.mark` property has been changed to `decoration.type` and `decoration.data` directly.'\n )\n\n type = object.mark.type\n data = object.mark.data\n }\n\n if (!type) {\n throw new Error(\n `Decorations must be created with a \\`type\\`, but you passed: ${JSON.stringify(\n object\n )}`\n )\n }\n\n const decoration = new Decoration({\n type,\n data: Data.create(data || {}),\n anchor: Point.fromJSON(anchor || {}),\n focus: Point.fromJSON(focus || {}),\n })\n\n return decoration\n }\n\n /**\n * Set new `properties` on the decoration.\n *\n * @param {Object|Range|Selection} properties\n * @return {Range}\n */\n\n setProperties(properties) {\n properties = Decoration.createProperties(properties)\n const decoration = this.merge(properties)\n return decoration\n }\n\n /**\n * Return a JSON representation of the decoration.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n type: this.type,\n data: this.data.toJSON(),\n anchor: this.anchor.toJSON(options),\n focus: this.focus.toJSON(options),\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Decoration}\n */\n\nexport default Decoration\n","import isPlainObject from 'is-plain-object'\nimport { Record, Set } from 'immutable'\n\nimport Mark from './mark'\nimport Point from './point'\nimport Range from './range'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n anchor: undefined,\n focus: undefined,\n isFocused: undefined,\n marks: undefined,\n}\n\n/**\n * Selection.\n *\n * @type {Selection}\n */\n\nclass Selection extends Record(DEFAULTS) {\n /**\n * Create a new `Selection` with `attrs`.\n *\n * @param {Object|Selection} attrs\n * @return {Selection}\n */\n\n static create(attrs = {}) {\n if (Selection.isSelection(attrs)) {\n return attrs\n }\n\n if (Range.isRange(attrs)) {\n return Selection.fromJSON(Range.createProperties(attrs))\n }\n\n if (isPlainObject(attrs)) {\n return Selection.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Selection.create\\` only accepts objects, ranges or selections, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a dictionary of settable selection properties from `attrs`.\n *\n * @param {Object|String|Selection} attrs\n * @return {Object}\n */\n\n static createProperties(a = {}) {\n if (Selection.isSelection(a)) {\n return {\n anchor: Point.createProperties(a.anchor),\n focus: Point.createProperties(a.focus),\n isFocused: a.isFocused,\n marks: a.marks,\n }\n }\n\n if (Range.isRange(a)) {\n return {\n anchor: Point.createProperties(a.anchor),\n focus: Point.createProperties(a.focus),\n }\n }\n\n if (isPlainObject(a)) {\n const p = {}\n if ('anchor' in a) p.anchor = Point.create(a.anchor)\n if ('focus' in a) p.focus = Point.create(a.focus)\n if ('isFocused' in a) p.isFocused = a.isFocused\n if ('marks' in a)\n p.marks = a.marks == null ? null : Mark.createSet(a.marks)\n return p\n }\n\n throw new Error(\n `\\`Selection.createProperties\\` only accepts objects, ranges or selections, but you passed it: ${a}`\n )\n }\n\n /**\n * Create a `Selection` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Selection}\n */\n\n static fromJSON(object) {\n const { anchor, focus, isFocused = false, marks = null } = object\n const selection = new Selection({\n anchor: Point.fromJSON(anchor || {}),\n focus: Point.fromJSON(focus || {}),\n isFocused,\n marks: marks == null ? null : new Set(marks.map(Mark.fromJSON)),\n })\n\n return selection\n }\n\n /**\n * Check whether the selection is blurred.\n *\n * @return {Boolean}\n */\n\n get isBlurred() {\n return !this.isFocused\n }\n\n /**\n * Set the `isFocused` property to a new `value`.\n *\n * @param {Boolean} value\n * @return {Selection}\n */\n\n setIsFocused(value) {\n const selection = this.set('isFocused', value)\n return selection\n }\n\n /**\n * Set the `marks` property to a new set of `marks`.\n *\n * @param {Set} marks\n * @return {Selection}\n */\n\n setMarks(marks) {\n const selection = this.set('marks', marks)\n return selection\n }\n\n /**\n * Set new `properties` on the selection.\n *\n * @param {Object|Range|Selection} properties\n * @return {Range}\n */\n\n setProperties(properties) {\n properties = Selection.createProperties(properties)\n const { anchor, focus, ...props } = properties\n\n if (anchor) {\n props.anchor = Point.create(anchor)\n }\n\n if (focus) {\n props.focus = Point.create(focus)\n }\n\n const selection = this.merge(props)\n return selection\n }\n\n /**\n * Return a JSON representation of the selection.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n anchor: this.anchor.toJSON(options),\n focus: this.focus.toJSON(options),\n isFocused: this.isFocused,\n marks:\n this.marks == null ? null : this.marks.toArray().map(m => m.toJSON()),\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Selection}\n */\n\nexport default Selection\n","/**\n * Slate-specific object types.\n *\n * @type {Object}\n */\n\nexport const TYPES = {\n annotation: '@@__SLATE_ANNOTATION__@@',\n block: '@@__SLATE_BLOCK__@@',\n change: '@@__SLATE_CHANGE__@@',\n decoration: '@@__SLATE_DECORATION__@@',\n document: '@@__SLATE_DOCUMENT__@@',\n editor: '@@__SLATE_EDITOR__@@',\n inline: '@@__SLATE_INLINE__@@',\n leaf: '@@__SLATE_LEAF__@@',\n mark: '@@__SLATE_MARK__@@',\n operation: '@@__SLATE_OPERATION__@@',\n point: '@@__SLATE_POINT__@@',\n range: '@@__SLATE_RANGE__@@',\n selection: '@@__SLATE_SELECTION__@@',\n text: '@@__SLATE_TEXT__@@',\n value: '@@__SLATE_VALUE__@@',\n}\n\n/**\n * Determine whether a `value` is of `type`.\n *\n * @param {string} type\n * @param {any} value\n * @return {boolean}\n */\n\nexport default function isObject(type, value) {\n return !!(value && value[TYPES[type]])\n}\n","import isPlainObject from 'is-plain-object'\nimport { List, Record } from 'immutable'\n\nimport Decoration from './decoration'\nimport Point from './point'\nimport Selection from './selection'\nimport isObject from '../utils/is-object'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n anchor: undefined,\n focus: undefined,\n}\n\n/**\n * Range.\n *\n * @type {Range}\n */\n\nclass Range extends Record(DEFAULTS) {\n /**\n * Create a new `Range` with `attrs`.\n *\n * @param {Object|Range} attrs\n * @return {Range}\n */\n\n static create(attrs = {}) {\n if (Range.isRange(attrs)) {\n if (attrs.object === 'range') {\n return attrs\n } else {\n return Range.fromJSON(Range.createProperties(attrs))\n }\n }\n\n if (isPlainObject(attrs)) {\n return Range.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Range.create\\` only accepts objects or ranges, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a list of `Ranges` from `elements`.\n *\n * @param {Array<Range|Object>|List<Range|Object>} elements\n * @return {List<Range>}\n */\n\n static createList(elements = []) {\n if (List.isList(elements) || Array.isArray(elements)) {\n const list = new List(elements.map(Range.create))\n return list\n }\n\n throw new Error(\n `\\`Range.createList\\` only accepts arrays or lists, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a dictionary of settable range properties from `attrs`.\n *\n * @param {Object|String|Range} attrs\n * @return {Object}\n */\n\n static createProperties(a = {}) {\n if (Range.isRange(a)) {\n return {\n anchor: Point.createProperties(a.anchor),\n focus: Point.createProperties(a.focus),\n }\n }\n\n if (isPlainObject(a)) {\n const p = {}\n if ('anchor' in a) p.anchor = Point.create(a.anchor)\n if ('focus' in a) p.focus = Point.create(a.focus)\n return p\n }\n\n throw new Error(\n `\\`Range.createProperties\\` only accepts objects, annotations, decorations, ranges or selections, but you passed it: ${a}`\n )\n }\n\n /**\n * Create a `Range` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Range}\n */\n\n static fromJSON(object) {\n const { anchor, focus } = object\n const range = new Range({\n anchor: Point.fromJSON(anchor || {}),\n focus: Point.fromJSON(focus || {}),\n })\n\n return range\n }\n\n /**\n * Check if a `value` is a `Range`, or is range-like.\n *\n * @param {Any} value\n * @return {Boolean}\n */\n\n static isRange(value) {\n return (\n isObject('range', value) ||\n Decoration.isDecoration(value) ||\n Selection.isSelection(value)\n )\n }\n\n /**\n * Return a JSON representation of the range.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n anchor: this.anchor.toJSON(options),\n focus: this.focus.toJSON(options),\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Range}\n */\n\nexport default Range\n","import isPlainObject from 'is-plain-object'\nimport { Map, Record } from 'immutable'\n\nimport Point from './point'\nimport Range from './range'\nimport Data from './data'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n key: undefined,\n type: undefined,\n data: undefined,\n anchor: undefined,\n focus: undefined,\n}\n\n/**\n * Annotation.\n *\n * @type {Annotation}\n */\n\nclass Annotation extends Record(DEFAULTS) {\n /**\n * Create a new `Annotation` with `attrs`.\n *\n * @param {Object|Annotation} attrs\n * @return {Annotation}\n */\n\n static create(attrs = {}) {\n if (Annotation.isAnnotation(attrs)) {\n return attrs\n }\n\n if (Range.isRange(attrs)) {\n return Annotation.fromJSON(Range.createProperties(attrs))\n }\n\n if (isPlainObject(attrs)) {\n return Annotation.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Annotation.create\\` only accepts objects or annotations, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a map of annotations from `elements`.\n *\n * @param {Object<String,Annotation>|Map<String,Annotation>} elements\n * @return {Map<String,Annotation>}\n */\n\n static createMap(elements = []) {\n if (Map.isMap(elements)) {\n return elements\n }\n\n if (isPlainObject(elements)) {\n const obj = {}\n\n for (const key in elements) {\n const value = elements[key]\n const annotation = Annotation.create(value)\n obj[key] = annotation\n }\n\n return Map(obj)\n }\n\n throw new Error(\n `\\`Annotation.createMap\\` only accepts arrays or lists, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a dictionary of settable annotation properties from `attrs`.\n *\n * @param {Object|String|Annotation} attrs\n * @return {Object}\n */\n\n static createProperties(a = {}) {\n if (Annotation.isAnnotation(a)) {\n return {\n key: a.key,\n type: a.type,\n data: a.data,\n anchor: Point.createProperties(a.anchor),\n focus: Point.createProperties(a.focus),\n }\n }\n\n if (isPlainObject(a)) {\n const p = {}\n if ('key' in a) p.key = a.key\n if ('type' in a) p.type = a.type\n if ('data' in a) p.data = Data.create(a.data)\n if ('anchor' in a) p.anchor = Point.create(a.anchor)\n if ('focus' in a) p.focus = Point.create(a.focus)\n return p\n }\n\n throw new Error(\n `\\`Annotation.createProperties\\` only accepts objects or annotations, but you passed it: ${a}`\n )\n }\n\n /**\n * Create a `Annotation` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Annotation}\n */\n\n static fromJSON(object) {\n const { key, type, data, anchor, focus } = object\n\n if (!key) {\n throw new Error(\n `Annotations must be created with a \\`key\\`, but you passed: ${JSON.stringify(\n object\n )}`\n )\n }\n\n if (!type) {\n throw new Error(\n `Annotations must be created with a \\`type\\`, but you passed: ${JSON.stringify(\n object\n )}`\n )\n }\n\n const annotation = new Annotation({\n key,\n type,\n data: Data.create(data || {}),\n anchor: Point.fromJSON(anchor || {}),\n focus: Point.fromJSON(focus || {}),\n })\n\n return annotation\n }\n\n /**\n * Set new `properties` on the annotation.\n *\n * @param {Object|Range|Selection} properties\n * @return {Range}\n */\n\n setProperties(properties) {\n properties = Annotation.createProperties(properties)\n const annotation = this.merge(properties)\n return annotation\n }\n\n /**\n * Return a JSON representation of the annotation.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n key: this.key,\n type: this.type,\n data: this.data.toJSON(),\n anchor: this.anchor.toJSON(options),\n focus: this.focus.toJSON(options),\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Annotation}\n */\n\nexport default Annotation\n","import isPlainObject from 'is-plain-object'\nimport { List, Map, Record } from 'immutable'\n\nimport KeyUtils from '../utils/key-utils'\nimport Node from './node'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n data: undefined,\n key: undefined,\n nodes: undefined,\n}\n\n/**\n * Document.\n *\n * @type {Document}\n */\n\nclass Document extends Record(DEFAULTS) {\n /**\n * Create a new `Document` with `attrs`.\n *\n * @param {Object|Array|List|Text} attrs\n * @return {Document}\n */\n\n static create(attrs = {}) {\n if (Document.isDocument(attrs)) {\n return attrs\n }\n\n if (List.isList(attrs) || Array.isArray(attrs)) {\n attrs = { nodes: attrs }\n }\n\n if (isPlainObject(attrs)) {\n return Document.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Document.create\\` only accepts objects, arrays, lists or documents, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a `Document` from a JSON `object`.\n *\n * @param {Object|Document} object\n * @return {Document}\n */\n\n static fromJSON(object) {\n if (Document.isDocument(object)) {\n return object\n }\n\n const { data = {}, key = KeyUtils.create(), nodes = [] } = object\n\n const document = new Document({\n key,\n data: new Map(data),\n nodes: Node.createList(nodes),\n })\n\n return document\n }\n\n /**\n * Return a JSON representation of the document.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n data: this.data.toJSON(),\n nodes: this.nodes.toArray().map(n => n.toJSON(options)),\n }\n\n if (options.preserveKeys) {\n object.key = this.key\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Document}\n */\n\nexport default Document\n","import isPlainObject from 'is-plain-object'\nimport { List, Map, Record } from 'immutable'\n\nimport KeyUtils from '../utils/key-utils'\nimport Node from './node'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n data: undefined,\n key: undefined,\n nodes: undefined,\n type: undefined,\n}\n\n/**\n * Inline.\n *\n * @type {Inline}\n */\n\nclass Inline extends Record(DEFAULTS) {\n /**\n * Create a new `Inline` with `attrs`.\n *\n * @param {Object|String|Inline} attrs\n * @return {Inline}\n */\n\n static create(attrs = {}) {\n if (Inline.isInline(attrs)) {\n return attrs\n }\n\n if (typeof attrs === 'string') {\n attrs = { type: attrs }\n }\n\n if (isPlainObject(attrs)) {\n return Inline.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Inline.create\\` only accepts objects, strings or inlines, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a list of `Inlines` from an array.\n *\n * @param {Array<Inline|Object>|List<Inline|Object>} elements\n * @return {List<Inline>}\n */\n\n static createList(elements = []) {\n if (List.isList(elements) || Array.isArray(elements)) {\n const list = new List(elements.map(Inline.create))\n return list\n }\n\n throw new Error(\n `\\`Inline.createList\\` only accepts arrays or lists, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a `Inline` from a JSON `object`.\n *\n * @param {Object|Inline} object\n * @return {Inline}\n */\n\n static fromJSON(object) {\n if (Inline.isInline(object)) {\n return object\n }\n\n const { data = {}, key = KeyUtils.create(), nodes = [], type } = object\n\n if (typeof type !== 'string') {\n throw new Error('`Inline.fromJS` requires a `type` string.')\n }\n\n const inline = new Inline({\n key,\n type,\n data: new Map(data),\n nodes: Node.createList(nodes),\n })\n\n return inline\n }\n\n /**\n * Check if `any` is a list of inlines.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isInlineList(any) {\n return List.isList(any) && any.every(item => Inline.isInline(item))\n }\n\n /**\n * Return a JSON representation of the inline.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n type: this.type,\n data: this.data.toJSON(),\n nodes: this.nodes.toArray().map(n => n.toJSON(options)),\n }\n\n if (options.preserveKeys) {\n object.key = this.key\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Inline}\n */\n\nexport default Inline\n","import isPlainObject from 'is-plain-object'\nimport invariant from 'tiny-invariant'\nimport { List, Record } from 'immutable'\n\nimport Mark from './mark'\nimport KeyUtils from '../utils/key-utils'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n key: undefined,\n marks: undefined,\n text: undefined,\n}\n\nconst Leaf = Record({\n text: undefined,\n marks: undefined,\n annotations: undefined,\n decorations: undefined,\n})\n\n/**\n * Text.\n *\n * @type {Text}\n */\n\nclass Text extends Record(DEFAULTS) {\n /**\n * Create a new `Text` with `attrs`.\n *\n * @param {Object|Array|List|String|Text} attrs\n * @return {Text}\n */\n\n static create(attrs = '') {\n if (Text.isText(attrs)) {\n return attrs\n }\n\n if (typeof attrs === 'string') {\n attrs = { text: attrs }\n }\n\n if (isPlainObject(attrs)) {\n return Text.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Text.create\\` only accepts objects, arrays, strings or texts, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a list of `Texts` from `elements`.\n *\n * @param {Array<Text|Object>|List<Text|Object>} elements\n * @return {List<Text>}\n */\n\n static createList(elements = []) {\n if (List.isList(elements) || Array.isArray(elements)) {\n const list = new List(elements.map(Text.create))\n return list\n }\n\n throw new Error(\n `\\`Text.createList\\` only accepts arrays or lists, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a `Text` from a JSON `object`.\n *\n * @param {Object|Text} object\n * @return {Text}\n */\n\n static fromJSON(object) {\n if (Text.isText(object)) {\n return object\n }\n\n invariant(\n object.leaves == null,\n 'As of slate@0.46, the `leaves` property of text nodes has been removed! Each individual leaf should be created as a text node instead.'\n )\n\n const { text = '', marks = [], key = KeyUtils.create() } = object\n const node = new Text({\n key,\n text,\n marks: Mark.createSet(marks),\n })\n\n return node\n }\n\n /**\n * Check if `any` is a list of texts.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isTextList(any) {\n return List.isList(any) && any.every(item => Text.isText(item))\n }\n\n /**\n * Add a `mark`.\n *\n * @param {Mark} mark\n * @return {Text}\n */\n\n addMark(mark) {\n mark = Mark.create(mark)\n const { marks } = this\n const next = marks.add(mark)\n const node = this.set('marks', next)\n return node\n }\n\n /**\n * Add a set of `marks`.\n *\n * @param {Set<Mark>} marks\n * @return {Text}\n */\n\n addMarks(marks) {\n marks = Mark.createSet(marks)\n const node = this.set('marks', this.marks.union(marks))\n return node\n }\n\n /**\n * Get a list of uniquely-formatted leaves for the text node, given its\n * existing marks, and its current `annotations` and `decorations`.\n *\n * @param {Map<String,Annotation>} annotations\n * @param {List<Decoration>} decorations\n * @return {List<Leaf>}\n */\n\n getLeaves(annotations, decorations) {\n const { text, marks } = this\n let leaves = [{ text, marks, annotations: [], decorations: [] }]\n\n // Helper to split a leaf into two `at` an offset.\n const split = (leaf, at) => {\n return [\n {\n text: leaf.text.slice(0, at),\n marks: leaf.marks,\n annotations: [...leaf.annotations],\n decorations: [...leaf.decorations],\n },\n {\n text: leaf.text.slice(at),\n marks: leaf.marks,\n annotations: [...leaf.annotations],\n decorations: [...leaf.decorations],\n },\n ]\n }\n\n // Helper to compile the leaves for a `kind` of format.\n const compile = kind => {\n const formats =\n kind === 'annotations' ? annotations.values() : decorations\n\n for (const format of formats) {\n const { start, end } = format\n const next = []\n let o = 0\n\n for (const leaf of leaves) {\n const { length } = leaf.text\n const offset = o\n o += length\n\n // If the range encompases the entire leaf, add the format.\n if (start.offset <= offset && end.offset >= offset + length) {\n leaf[kind].push(format)\n next.push(leaf)\n continue\n }\n\n // If the range starts after the leaf, or ends before it, continue.\n if (\n start.offset > offset + length ||\n end.offset < offset ||\n (end.offset === offset && offset !== 0)\n ) {\n next.push(leaf)\n continue\n }\n\n // Otherwise we need to split the leaf, at the start, end, or both,\n // and add the format to the middle intersecting section. Do the end\n // split first since we don't need to update the offset that way.\n let middle = leaf\n let before\n let after\n\n if (end.offset < offset + length) {\n ;[middle, after] = split(middle, end.offset - offset)\n }\n\n if (start.offset > offset) {\n ;[before, middle] = split(middle, start.offset - offset)\n }\n\n middle[kind].push(format)\n\n if (before) {\n next.push(before)\n }\n\n next.push(middle)\n\n if (after) {\n next.push(after)\n }\n }\n\n leaves = next\n }\n }\n\n compile('annotations')\n compile('decorations')\n\n leaves = leaves.map(leaf => {\n return new Leaf({\n ...leaf,\n annotations: List(leaf.annotations),\n decorations: List(leaf.decorations),\n })\n })\n\n const list = List(leaves)\n return list\n }\n\n /**\n * Insert `text` at `index`.\n *\n * @param {Number} index\n * @param {String} string\n * @return {Text}\n */\n\n insertText(index, string) {\n const { text } = this\n const next = text.slice(0, index) + string + text.slice(index)\n const node = this.set('text', next)\n return node\n }\n\n /**\n * Remove a `mark`.\n *\n * @param {Mark} mark\n * @return {Text}\n */\n\n removeMark(mark) {\n mark = Mark.create(mark)\n const { marks } = this\n const next = marks.remove(mark)\n const node = this.set('marks', next)\n return node\n }\n\n /**\n * Remove text from the text node at `index` for `length`.\n *\n * @param {Number} index\n * @param {Number} length\n * @return {Text}\n */\n\n removeText(index, length) {\n const { text } = this\n const next = text.slice(0, index) + text.slice(index + length)\n const node = this.set('text', next)\n return node\n }\n\n /**\n * Return a JSON representation of the text.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n text: this.text,\n marks: this.marks.toArray().map(m => m.toJSON()),\n }\n\n if (options.preserveKeys) {\n object.key = this.key\n }\n\n return object\n }\n\n /**\n * Set a `newProperties` on an existing `mark`.\n *\n * @param {Object} mark\n * @param {Object} newProperties\n * @return {Text}\n */\n\n setMark(properties, newProperties) {\n const { marks } = this\n const mark = Mark.create(properties)\n const newMark = mark.merge(newProperties)\n const next = marks.remove(mark).add(newMark)\n const node = this.set('marks', next)\n return node\n }\n\n /**\n * Split the node into two at `index`.\n *\n * @param {Number} index\n * @returns {Array<Text>}\n */\n\n splitText(index) {\n const { text } = this\n const one = this.set('text', text.slice(0, index))\n const two = this.set('text', text.slice(index)).regenerateKey()\n return [one, two]\n }\n\n /**\n * Merge the node with an `other` text node.\n *\n * @param {Text} other\n * @returns {Text}\n */\n\n mergeText(other) {\n const next = this.text + other.text\n const node = this.set('text', next)\n return node\n }\n}\n\n/**\n * Export.\n *\n * @type {Text}\n */\n\nexport default Text\n","import isPlainObject from 'is-plain-object'\nimport warning from 'tiny-warning'\nimport { List } from 'immutable'\n\nimport Block from './block'\nimport Data from './data'\nimport Document from './document'\nimport Inline from './inline'\nimport Text from './text'\n\n/**\n * A pseudo-model that is used for its static methods only.\n *\n * @type {Node}\n */\n\nclass Node {\n /**\n * Create a new `Node` with `attrs`.\n *\n * @param {Object|Node} attrs\n * @return {Node}\n */\n\n static create(attrs = {}) {\n if (Node.isNode(attrs)) {\n return attrs\n }\n\n if (isPlainObject(attrs)) {\n let { object } = attrs\n\n if (!object && attrs.kind) {\n warning(\n false,\n 'As of slate@0.32.0, the `kind` property of Slate objects has been renamed to `object`.'\n )\n\n object = attrs.kind\n }\n\n switch (object) {\n case 'block':\n return Block.create(attrs)\n case 'document':\n return Document.create(attrs)\n case 'inline':\n return Inline.create(attrs)\n case 'text':\n return Text.create(attrs)\n\n default: {\n throw new Error('`Node.create` requires a `object` string.')\n }\n }\n }\n\n throw new Error(\n `\\`Node.create\\` only accepts objects or nodes but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a list of `Nodes` from an array.\n *\n * @param {Array<Object|Node>} elements\n * @return {List<Node>}\n */\n\n static createList(elements = []) {\n if (List.isList(elements) || Array.isArray(elements)) {\n let array = []\n\n elements.forEach(el => {\n if (\n el &&\n el.object === 'text' &&\n el.leaves &&\n Array.isArray(el.leaves)\n ) {\n warning(\n false,\n 'As of slate@0.46, the `leaves` property of Text nodes has been removed. Instead, each text node contains a string of text and a unique set of marks and leaves are unnecessary.'\n )\n\n const texts = Text.createList(el.leaves).toArray()\n array = array.concat(texts)\n return\n }\n\n const node = Node.create(el)\n array.push(node)\n })\n\n const list = List(array)\n return list\n }\n\n throw new Error(\n `\\`Node.createList\\` only accepts lists or arrays, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a dictionary of settable node properties from `attrs`.\n *\n * @param {Object|String|Node} attrs\n * @return {Object}\n */\n\n static createProperties(attrs = {}) {\n if (Block.isBlock(attrs) || Inline.isInline(attrs)) {\n return {\n data: attrs.data,\n type: attrs.type,\n }\n }\n\n if (typeof attrs === 'string') {\n return { type: attrs }\n }\n\n if (isPlainObject(attrs)) {\n const props = {}\n if ('type' in attrs) props.type = attrs.type\n if ('data' in attrs) props.data = Data.create(attrs.data)\n return props\n }\n\n throw new Error(\n `\\`Node.createProperties\\` only accepts objects, strings, blocks or inlines, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a `Node` from a JSON `value`.\n *\n * @param {Object} value\n * @return {Node}\n */\n\n static fromJSON(value) {\n let { object } = value\n\n if (!object && value.kind) {\n warning(\n false,\n 'As of slate@0.32.0, the `kind` property of Slate objects has been renamed to `object`.'\n )\n\n object = value.kind\n }\n\n switch (object) {\n case 'block':\n return Block.fromJSON(value)\n case 'document':\n return Document.fromJSON(value)\n case 'inline':\n return Inline.fromJSON(value)\n case 'text':\n return Text.fromJSON(value)\n\n default: {\n throw new Error(\n `\\`Node.fromJSON\\` requires an \\`object\\` of either 'block', 'document', 'inline' or 'text', but you passed: ${value}`\n )\n }\n }\n }\n\n /**\n * Check if `any` is a `Node`.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isNode(any) {\n return (\n Block.isBlock(any) ||\n Document.isDocument(any) ||\n Inline.isInline(any) ||\n Text.isText(any)\n )\n }\n\n /**\n * Check if `any` is a list of nodes.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isNodeList(any) {\n return List.isList(any) && any.every(item => Node.isNode(item))\n }\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default Node\n","import isPlainObject from 'is-plain-object'\nimport { List, Map, Record } from 'immutable'\n\nimport KeyUtils from '../utils/key-utils'\nimport Node from './node'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n data: undefined,\n key: undefined,\n nodes: undefined,\n type: undefined,\n}\n\n/**\n * Block.\n *\n * @type {Block}\n */\n\nclass Block extends Record(DEFAULTS) {\n /**\n * Create a new `Block` from `attrs`.\n *\n * @param {Object|String|Block} attrs\n * @return {Block}\n */\n\n static create(attrs = {}) {\n if (Block.isBlock(attrs)) {\n return attrs\n }\n\n if (typeof attrs === 'string') {\n attrs = { type: attrs }\n }\n\n if (isPlainObject(attrs)) {\n return Block.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Block.create\\` only accepts objects, strings or blocks, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a list of `Blocks` from `attrs`.\n *\n * @param {Array<Block|Object>|List<Block|Object>} attrs\n * @return {List<Block>}\n */\n\n static createList(attrs = []) {\n if (List.isList(attrs) || Array.isArray(attrs)) {\n const list = new List(attrs.map(Block.create))\n return list\n }\n\n throw new Error(\n `\\`Block.createList\\` only accepts arrays or lists, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a `Block` from a JSON `object`.\n *\n * @param {Object|Block} object\n * @return {Block}\n */\n\n static fromJSON(object) {\n if (Block.isBlock(object)) {\n return object\n }\n\n const { data = {}, key = KeyUtils.create(), nodes = [], type } = object\n\n if (typeof type !== 'string') {\n throw new Error('`Block.fromJSON` requires a `type` string.')\n }\n\n const block = new Block({\n key,\n type,\n data: Map(data),\n nodes: Node.createList(nodes),\n })\n\n return block\n }\n\n /**\n * Check if `any` is a block list.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isBlockList(any) {\n return List.isList(any) && any.every(item => Block.isBlock(item))\n }\n\n /**\n * Return a JSON representation of the block.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n type: this.type,\n data: this.data.toJSON(),\n nodes: this.nodes.toArray().map(n => n.toJSON(options)),\n }\n\n if (options.preserveKeys) {\n object.key = this.key\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Block}\n */\n\nexport default Block\n","import isPlainObject from 'is-plain-object'\nimport invariant from 'tiny-invariant'\nimport { Record, Set, List } from 'immutable'\n\nimport Annotation from './annotation'\nimport Data from './data'\nimport Document from './document'\nimport Mark from './mark'\nimport PathUtils from '../utils/path-utils'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n annotations: undefined,\n data: undefined,\n document: undefined,\n selection: undefined,\n}\n\n/**\n * Value.\n *\n * @type {Value}\n */\n\nclass Value extends Record(DEFAULTS) {\n /**\n * Create a new `Value` with `attrs`.\n *\n * @param {Object|Value} attrs\n * @param {Object} options\n * @return {Value}\n */\n\n static create(attrs = {}, options = {}) {\n if (Value.isValue(attrs)) {\n return attrs\n }\n\n if (isPlainObject(attrs)) {\n return Value.fromJSON(attrs, options)\n }\n\n throw new Error(\n `\\`Value.create\\` only accepts objects or values, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a dictionary of settable value properties from `attrs`.\n *\n * @param {Object|Value} attrs\n * @return {Object}\n */\n\n static createProperties(a = {}) {\n if (Value.isValue(a)) {\n return {\n annotations: a.annotations,\n data: a.data,\n }\n }\n\n if (isPlainObject(a)) {\n const p = {}\n if ('annotations' in a)\n p.annotations = Annotation.createMap(a.annotations)\n if ('data' in a) p.data = Data.create(a.data)\n return p\n }\n\n throw new Error(\n `\\`Value.createProperties\\` only accepts objects or values, but you passed it: ${a}`\n )\n }\n\n /**\n * Create a `Value` from a JSON `object`.\n *\n * @param {Object} object\n * @param {Object} options\n * @property {Boolean} normalize\n * @property {Array} plugins\n * @return {Value}\n */\n\n static fromJSON(object, options = {}) {\n let { data = {}, annotations = {}, document = {}, selection = {} } = object\n data = Data.fromJSON(data)\n document = Document.fromJSON(document)\n selection = document.createSelection(selection)\n annotations = Annotation.createMap(annotations)\n\n if (selection.isUnset) {\n const text = document.getFirstText()\n if (text) selection = selection.moveToStartOfNode(text)\n selection = document.createSelection(selection)\n }\n\n const value = new Value({\n annotations,\n data,\n document,\n selection,\n })\n\n return value\n }\n\n /**\n * Get the current start text node's closest block parent.\n *\n * @return {Block}\n */\n\n get startBlock() {\n return (\n this.selection.start.key &&\n this.document.getClosestBlock(this.selection.start.key)\n )\n }\n\n /**\n * Get the current end text node's closest block parent.\n *\n * @return {Block}\n */\n\n get endBlock() {\n return (\n this.selection.end.key &&\n this.document.getClosestBlock(this.selection.end.key)\n )\n }\n\n /**\n * Get the current anchor text node's closest block parent.\n *\n * @return {Block}\n */\n\n get anchorBlock() {\n return (\n this.selection.anchor.key &&\n this.document.getClosestBlock(this.selection.anchor.key)\n )\n }\n\n /**\n * Get the current focus text node's closest block parent.\n *\n * @return {Block}\n */\n\n get focusBlock() {\n return (\n this.selection.focus.key &&\n this.document.getClosestBlock(this.selection.focus.key)\n )\n }\n\n /**\n * Get the current start text node's closest inline parent.\n *\n * @return {Inline}\n */\n\n get startInline() {\n return (\n this.selection.start.key &&\n this.document.getClosestInline(this.selection.start.key)\n )\n }\n\n /**\n * Get the current end text node's closest inline parent.\n *\n * @return {Inline}\n */\n\n get endInline() {\n return (\n this.selection.end.key &&\n this.document.getClosestInline(this.selection.end.key)\n )\n }\n\n /**\n * Get the current anchor text node's closest inline parent.\n *\n * @return {Inline}\n */\n\n get anchorInline() {\n return (\n this.selection.anchor.key &&\n this.document.getClosestInline(this.selection.anchor.key)\n )\n }\n\n /**\n * Get the current focus text node's closest inline parent.\n *\n * @return {Inline}\n */\n\n get focusInline() {\n return (\n this.selection.focus.key &&\n this.document.getClosestInline(this.selection.focus.key)\n )\n }\n\n /**\n * Get the current start text node.\n *\n * @return {Text}\n */\n\n get startText() {\n return (\n this.selection.start.key &&\n this.document.getDescendant(this.selection.start.key)\n )\n }\n\n /**\n * Get the current end node.\n *\n * @return {Text}\n */\n\n get endText() {\n return (\n this.selection.end.key &&\n this.document.getDescendant(this.selection.end.key)\n )\n }\n\n /**\n * Get the current anchor node.\n *\n * @return {Text}\n */\n\n get anchorText() {\n return (\n this.selection.anchor.key &&\n this.document.getDescendant(this.selection.anchor.key)\n )\n }\n\n /**\n * Get the current focus node.\n *\n * @return {Text}\n */\n\n get focusText() {\n return (\n this.selection.focus.key &&\n this.document.getDescendant(this.selection.focus.key)\n )\n }\n\n /**\n * Get the next block node.\n *\n * @return {Block}\n */\n\n get nextBlock() {\n return (\n this.selection.end.key &&\n this.document.getNextBlock(this.selection.end.key)\n )\n }\n\n /**\n * Get the previous block node.\n *\n * @return {Block}\n */\n\n get previousBlock() {\n return (\n this.selection.start.key &&\n this.document.getPreviousBlock(this.selection.start.key)\n )\n }\n\n /**\n * Get the next inline node.\n *\n * @return {Inline}\n */\n\n get nextInline() {\n return (\n this.selection.end.key &&\n this.document.getNextInline(this.selection.end.key)\n )\n }\n\n /**\n * Get the previous inline node.\n *\n * @return {Inline}\n */\n\n get previousInline() {\n return (\n this.selection.start.key &&\n this.document.getPreviousInline(this.selection.start.key)\n )\n }\n\n /**\n * Get the next text node.\n *\n * @return {Text}\n */\n\n get nextText() {\n return (\n this.selection.end.key &&\n this.document.getNextText(this.selection.end.key)\n )\n }\n\n /**\n * Get the previous text node.\n *\n * @return {Text}\n */\n\n get previousText() {\n return (\n this.selection.start.key &&\n this.document.getPreviousText(this.selection.start.key)\n )\n }\n\n /**\n * Get the marks of the current selection.\n *\n * @return {Set<Mark>}\n */\n\n get marks() {\n return this.selection.isUnset\n ? new Set()\n : this.selection.marks || this.document.getMarksAtRange(this.selection)\n }\n\n /**\n * Get the active marks of the current selection.\n *\n * @return {Set<Mark>}\n */\n\n get activeMarks() {\n return this.selection.isUnset\n ? new Set()\n : this.selection.marks ||\n this.document.getActiveMarksAtRange(this.selection)\n }\n\n /**\n * Get the block nodes in the current selection.\n *\n * @return {List<Block>}\n */\n\n get blocks() {\n return this.selection.isUnset\n ? new List()\n : this.document.getLeafBlocksAtRange(this.selection)\n }\n\n /**\n * Get the fragment of the current selection.\n *\n * @return {Document}\n */\n\n get fragment() {\n return this.selection.isUnset\n ? Document.create()\n : this.document.getFragmentAtRange(this.selection)\n }\n\n /**\n * Get the bottom-most inline nodes in the current selection.\n *\n * @return {List<Inline>}\n */\n\n get inlines() {\n return this.selection.isUnset\n ? new List()\n : this.document.getLeafInlinesAtRange(this.selection)\n }\n\n /**\n * Get the text nodes in the current selection.\n *\n * @return {List<Text>}\n */\n\n get texts() {\n return this.selection.isUnset\n ? new List()\n : this.document.getTextsAtRange(this.selection)\n }\n\n /**\n * Add an `annotation` to the value.\n *\n * @param {Annotation} annotation\n * @param {Mark} mark\n * @return {Value}\n */\n\n addAnnotation(annotation) {\n annotation = Annotation.create(annotation)\n let value = this\n let { annotations, document } = value\n const { key } = annotation\n annotation = annotation.updatePoints(point => point.normalize(document))\n annotations = annotations.set(key, annotation)\n value = value.set('annotations', annotations)\n return value\n }\n\n /**\n * Add `mark` to text at `path`.\n *\n * @param {List|String} path\n * @param {Mark} mark\n * @return {Value}\n */\n\n addMark(path, mark) {\n mark = Mark.create(mark)\n let value = this\n let { document } = value\n document = document.addMark(path, mark)\n value = value.set('document', document)\n return value\n }\n\n /**\n * Insert a `node`.\n *\n * @param {List|String} path\n * @param {Node} node\n * @return {Value}\n */\n\n insertNode(path, node) {\n let value = this\n let { document } = value\n document = document.insertNode(path, node)\n value = value.set('document', document)\n\n value = value.mapRanges(range =>\n range.updatePoints(point => point.setPath(null))\n )\n\n return value\n }\n\n /**\n * Insert `text` at `offset` in node by `path`.\n *\n * @param {List|String} path\n * @param {Number} offset\n * @param {String} text\n * @return {Value}\n */\n\n insertText(path, offset, text) {\n let value = this\n let { document } = value\n let node = document.assertNode(path)\n document = document.insertText(path, offset, text)\n node = document.assertNode(path)\n value = value.set('document', document)\n\n value = value.mapPoints(point => {\n if (point.key === node.key && point.offset >= offset) {\n return point.setOffset(point.offset + text.length)\n } else {\n return point\n }\n })\n\n return value\n }\n\n /**\n * Merge a node backwards its previous sibling.\n *\n * @param {List|Key} path\n * @return {Value}\n */\n\n mergeNode(path) {\n let value = this\n const { document } = value\n const newDocument = document.mergeNode(path)\n path = document.resolvePath(path)\n const withPath = PathUtils.decrement(path)\n const one = document.getNode(withPath)\n const two = document.getNode(path)\n value = value.set('document', newDocument)\n\n value = value.mapRanges(range => {\n if (two.object === 'text') {\n const max = one.text.length\n\n if (range.anchor.key === two.key) {\n range = range.moveAnchorTo(one.key, max + range.anchor.offset)\n }\n\n if (range.focus.key === two.key) {\n range = range.moveFocusTo(one.key, max + range.focus.offset)\n }\n }\n\n range = range.updatePoints(point => point.setPath(null))\n\n return range\n })\n\n return value\n }\n\n /**\n * Move a node by `path` to `newPath`.\n *\n * A `newIndex` can be provided when move nodes by `key`, to account for not\n * being able to have a key for a location in the tree that doesn't exist yet.\n *\n * @param {List|Key} path\n * @param {List|Key} newPath\n * @param {Number} newIndex\n * @return {Value}\n */\n\n moveNode(path, newPath, newIndex = 0) {\n let value = this\n let { document } = value\n\n if (PathUtils.isEqual(path, newPath)) {\n return value\n }\n\n document = document.moveNode(path, newPath, newIndex)\n value = value.set('document', document)\n value = value.mapPoints(point => point.setPath(null))\n return value\n }\n\n /**\n * Remove an `annotation` from the value.\n *\n * @param {Annotation} annotation\n * @param {Mark} mark\n * @return {Value}\n */\n\n removeAnnotation(annotation) {\n annotation = Annotation.create(annotation)\n let value = this\n let { annotations } = value\n const { key } = annotation\n annotations = annotations.delete(key)\n value = value.set('annotations', annotations)\n return value\n }\n\n /**\n * Remove `mark` at `path`.\n *\n * @param {List|String} path\n * @param {Mark} mark\n * @return {Value}\n */\n\n removeMark(path, mark) {\n mark = Mark.create(mark)\n let value = this\n let { document } = value\n document = document.removeMark(path, mark)\n value = value.set('document', document)\n return value\n }\n\n /**\n * Remove a node by `path`.\n *\n * @param {List|String} path\n * @return {Value}\n */\n\n removeNode(path) {\n let value = this\n let { document } = value\n const node = document.assertNode(path)\n const first = node.object === 'text' ? node : node.getFirstText() || node\n const last = node.object === 'text' ? node : node.getLastText() || node\n const prev = document.getPreviousText(first.key)\n const next = document.getNextText(last.key)\n\n document = document.removeNode(path)\n value = value.set('document', document)\n\n value = value.mapRanges(range => {\n const { anchor, focus } = range\n\n if (node.hasNode(anchor.key)) {\n range = prev\n ? range.moveAnchorTo(prev.key, prev.text.length)\n : next ? range.moveAnchorTo(next.key, 0) : range.unset()\n }\n\n if (node.hasNode(focus.key)) {\n range = prev\n ? range.moveFocusTo(prev.key, prev.text.length)\n : next ? range.moveFocusTo(next.key, 0) : range.unset()\n }\n\n range = range.updatePoints(point => point.setPath(null))\n\n return range\n })\n\n return value\n }\n\n /**\n * Remove `text` at `offset` in node by `path`.\n *\n * @param {List|Key} path\n * @param {Number} offset\n * @param {String} text\n * @return {Value}\n */\n\n removeText(path, offset, text) {\n let value = this\n let { document } = value\n const node = document.assertNode(path)\n document = document.removeText(path, offset, text)\n value = value.set('document', document)\n\n const { length } = text\n const start = offset\n const end = offset + length\n\n value = value.mapPoints(point => {\n if (point.key !== node.key) {\n return point\n }\n\n if (point.offset >= end) {\n return point.setOffset(point.offset - length)\n }\n\n if (point.offset > start) {\n return point.setOffset(start)\n }\n\n return point\n })\n\n return value\n }\n\n /**\n * Add an `annotation` to the value.\n *\n * @param {Annotation} annotation\n * @param {Mark} mark\n * @return {Value}\n */\n\n setAnnotation(properties, newProperties) {\n newProperties = Annotation.createProperties(newProperties)\n const annotation = Annotation.create(properties)\n const next = annotation.merge(newProperties)\n let value = this\n let { annotations } = value\n const { key } = annotation\n annotations = annotations.set(key, next)\n value = value.set('annotations', annotations)\n return value\n }\n\n /**\n * Set `properties` on a node.\n *\n * @param {List|String} path\n * @param {Object} properties\n * @return {Value}\n */\n\n setNode(path, properties) {\n let value = this\n let { document } = value\n document = document.setNode(path, properties)\n value = value.set('document', document)\n return value\n }\n\n /**\n * Set `properties` on `mark` on text at `offset` and `length` in node.\n *\n * @param {List|String} path\n * @param {Mark} mark\n * @param {Object} properties\n * @return {Value}\n */\n\n setMark(path, mark, properties) {\n let value = this\n let { document } = value\n document = document.setMark(path, mark, properties)\n value = value.set('document', document)\n return value\n }\n\n /**\n * Set `properties` on the value.\n *\n * @param {Object} properties\n * @return {Value}\n */\n\n setProperties(properties) {\n let value = this\n const { document } = value\n const { data, annotations } = properties\n const props = {}\n\n if (data) {\n props.data = data\n }\n\n if (annotations) {\n props.annotations = annotations.map(a => {\n return a.isSet ? a : document.resolveAnnotation(a)\n })\n }\n\n value = value.merge(props)\n return value\n }\n\n /**\n * Set `properties` on the selection.\n *\n * @param {Value} value\n * @param {Operation} operation\n * @return {Value}\n */\n\n setSelection(properties) {\n let value = this\n let { document, selection } = value\n const next = selection.setProperties(properties)\n selection = document.resolveSelection(next)\n value = value.set('selection', selection)\n return value\n }\n\n /**\n * Split a node by `path` at `position` with optional `properties` to apply\n * to the newly split node.\n *\n * @param {List|String} path\n * @param {Number} position\n * @param {Object} properties\n * @return {Value}\n */\n\n splitNode(path, position, properties) {\n let value = this\n const { document } = value\n const newDocument = document.splitNode(path, position, properties)\n const node = document.assertNode(path)\n value = value.set('document', newDocument)\n\n value = value.mapRanges(range => {\n const next = newDocument.getNextText(node.key)\n const { anchor, focus } = range\n\n // If the anchor was after the split, move it to the next node.\n if (node.key === anchor.key && position <= anchor.offset) {\n range = range.moveAnchorTo(next.key, anchor.offset - position)\n }\n\n // If the focus was after the split, move it to the next node.\n if (node.key === focus.key && position <= focus.offset) {\n range = range.moveFocusTo(next.key, focus.offset - position)\n }\n\n range = range.updatePoints(point => point.setPath(null))\n\n return range\n })\n\n return value\n }\n\n /**\n * Map all range objects to apply adjustments with an `iterator`.\n *\n * @param {Function} iterator\n * @return {Value}\n */\n\n mapRanges(iterator) {\n let value = this\n const { document, selection, annotations } = value\n\n let sel = selection.isSet ? iterator(selection) : selection\n if (!sel) sel = selection.unset()\n if (sel !== selection) sel = document.createSelection(sel)\n value = value.set('selection', sel)\n\n let anns = annotations.map(annotation => {\n let n = annotation.isSet ? iterator(annotation) : annotation\n if (n && n !== annotation) n = document.createAnnotation(n)\n return n\n })\n\n anns = anns.filter(annotation => !!annotation)\n value = value.set('annotations', anns)\n return value\n }\n\n mapPoints(iterator) {\n return this.mapRanges(range => range.updatePoints(iterator))\n }\n\n /**\n * Return a JSON representation of the value.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n document: this.document.toJSON(options),\n }\n\n if (options.preserveData) {\n object.data = this.data.toJSON(options)\n }\n\n if (options.preserveAnnotations) {\n object.annotations = this.annotations\n .map(a => a.toJSON(options))\n .toObject()\n }\n\n if (options.preserveSelection) {\n object.selection = this.selection.toJSON(options)\n }\n\n return object\n }\n\n /**\n * Deprecated.\n */\n\n get history() {\n invariant(\n false,\n 'As of Slate 0.42.0, the `value.history` model no longer exists, and the history is stored in `value.data` instead using plugins.'\n )\n }\n\n change() {\n invariant(\n false,\n 'As of Slate 0.42.0, value object are no longer schema-aware, and the `value.change()` method is no longer available. Use the `editor.change()` method on the new `Editor` controller instead.'\n )\n }\n}\n\n/**\n * Export.\n */\n\nexport default Value\n","import Debug from 'debug'\n\nimport Operation from '../models/operation'\n\n/**\n * Debug.\n *\n * @type {Function}\n */\n\nconst debug = Debug('slate:operation:apply')\n\n/**\n * Apply an `op` to a `value`.\n *\n * @param {Value} value\n * @param {Object|Operation} op\n * @return {Value} value\n */\n\nfunction applyOperation(value, op) {\n op = Operation.create(op)\n const { type } = op\n debug(type, op)\n\n switch (type) {\n case 'add_annotation': {\n const { annotation } = op\n const next = value.addAnnotation(annotation)\n return next\n }\n\n case 'add_mark': {\n const { path, mark } = op\n const next = value.addMark(path, mark)\n return next\n }\n\n case 'insert_node': {\n const { path, node } = op\n const next = value.insertNode(path, node)\n return next\n }\n\n case 'insert_text': {\n const { path, offset, text, marks } = op\n const next = value.insertText(path, offset, text, marks)\n return next\n }\n\n case 'merge_node': {\n const { path } = op\n const next = value.mergeNode(path)\n return next\n }\n\n case 'move_node': {\n const { path, newPath } = op\n const next = value.moveNode(path, newPath)\n return next\n }\n\n case 'remove_annotation': {\n const { annotation } = op\n const next = value.removeAnnotation(annotation)\n return next\n }\n\n case 'remove_mark': {\n const { path, mark } = op\n const next = value.removeMark(path, mark)\n return next\n }\n\n case 'remove_node': {\n const { path } = op\n const next = value.removeNode(path)\n return next\n }\n\n case 'remove_text': {\n const { path, offset, text } = op\n const next = value.removeText(path, offset, text)\n return next\n }\n\n case 'set_annotation': {\n const { properties, newProperties } = op\n const next = value.setAnnotation(properties, newProperties)\n return next\n }\n\n case 'set_mark': {\n const { path, properties, newProperties } = op\n const next = value.setMark(path, properties, newProperties)\n return next\n }\n\n case 'set_node': {\n const { path, newProperties } = op\n const next = value.setNode(path, newProperties)\n return next\n }\n\n case 'set_selection': {\n const { newProperties } = op\n const next = value.setSelection(newProperties)\n return next\n }\n\n case 'set_value': {\n const { newProperties } = op\n const next = value.setProperties(newProperties)\n return next\n }\n\n case 'split_node': {\n const { path, position, properties } = op\n const next = value.splitNode(path, position, properties)\n return next\n }\n\n default: {\n throw new Error(`Unknown operation type: \"${type}\".`)\n }\n }\n}\n\n/**\n * Export.\n *\n * @type {Function}\n */\n\nexport default applyOperation\n","import Debug from 'debug'\n\nimport Operation from '../models/operation'\nimport PathUtils from '../utils/path-utils'\n\n/**\n * Debug.\n *\n * @type {Function}\n */\n\nconst debug = Debug('slate:operation:invert')\n\n/**\n * Invert an `op`.\n *\n * @param {Object} op\n * @return {Object}\n */\n\nfunction invertOperation(op) {\n op = Operation.create(op)\n const { type } = op\n debug(type, op)\n\n switch (type) {\n case 'move_node': {\n const { newPath, path } = op\n\n // PERF: this case can exit early.\n if (PathUtils.isEqual(newPath, path)) {\n return op\n }\n\n const inversePath = PathUtils.transform(path, op).first()\n\n // Get the true path we are trying to move back to\n // We transform the right-sibling of the path\n // This will end up at the operation.path most of the time\n // But if the newPath is a left-sibling or left-ancestor-sibling, this will account for it\n const inverseNewPath = PathUtils.transform(\n PathUtils.increment(path),\n op\n ).first()\n\n const inverse = op.set('path', inversePath).set('newPath', inverseNewPath)\n return inverse\n }\n\n case 'merge_node': {\n const { path } = op\n const inversePath = PathUtils.decrement(path)\n const inverse = op.set('type', 'split_node').set('path', inversePath)\n return inverse\n }\n\n case 'split_node': {\n const { path } = op\n const inversePath = PathUtils.increment(path)\n const inverse = op.set('type', 'merge_node').set('path', inversePath)\n return inverse\n }\n\n case 'set_annotation':\n case 'set_node':\n case 'set_value':\n case 'set_selection':\n case 'set_mark': {\n const { properties, newProperties } = op\n const inverse = op\n .set('properties', newProperties)\n .set('newProperties', properties)\n return inverse\n }\n\n case 'insert_node':\n case 'insert_text': {\n const inverse = op.set('type', type.replace('insert_', 'remove_'))\n return inverse\n }\n\n case 'remove_node':\n case 'remove_text': {\n const inverse = op.set('type', type.replace('remove_', 'insert_'))\n return inverse\n }\n\n case 'add_annotation':\n case 'add_mark': {\n const inverse = op.set('type', type.replace('add_', 'remove_'))\n return inverse\n }\n\n case 'remove_annotation':\n case 'remove_mark': {\n const inverse = op.set('type', type.replace('remove_', 'add_'))\n return inverse\n }\n\n default: {\n throw new Error(`Unknown operation type: \"${type}\".`)\n }\n }\n}\n\n/**\n * Export.\n *\n * @type {Function}\n */\n\nexport default invertOperation\n","import isPlainObject from 'is-plain-object'\nimport { List, Record, Map } from 'immutable'\n\nimport Annotation from './annotation'\nimport Mark from './mark'\nimport Node from './node'\nimport PathUtils from '../utils/path-utils'\nimport Selection from './selection'\nimport Value from './value'\nimport apply from '../operations/apply'\nimport invert from '../operations/invert'\n\n/**\n * Operation attributes.\n *\n * @type {Array}\n */\n\nconst OPERATION_ATTRIBUTES = {\n add_mark: ['path', 'mark', 'data'],\n add_annotation: ['annotation', 'data'],\n insert_node: ['path', 'node', 'data'],\n insert_text: ['path', 'offset', 'text', 'data'],\n merge_node: ['path', 'position', 'properties', 'target', 'data'],\n move_node: ['path', 'newPath', 'data'],\n remove_annotation: ['annotation', 'data'],\n remove_mark: ['path', 'mark', 'data'],\n remove_node: ['path', 'node', 'data'],\n remove_text: ['path', 'offset', 'text', 'data'],\n set_annotation: ['properties', 'newProperties', 'data'],\n set_mark: ['path', 'properties', 'newProperties', 'data'],\n set_node: ['path', 'properties', 'newProperties', 'data'],\n set_selection: ['properties', 'newProperties', 'data'],\n set_value: ['properties', 'newProperties', 'data'],\n split_node: ['path', 'position', 'properties', 'target', 'data'],\n}\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n annotation: undefined,\n data: undefined,\n length: undefined,\n mark: undefined,\n marks: undefined,\n newPath: undefined,\n newProperties: undefined,\n node: undefined,\n offset: undefined,\n path: undefined,\n position: undefined,\n properties: undefined,\n target: undefined,\n text: undefined,\n type: undefined,\n}\n\n/**\n * Operation.\n *\n * @type {Operation}\n */\n\nclass Operation extends Record(DEFAULTS) {\n /**\n * Create a new `Operation` with `attrs`.\n *\n * @param {Object|Array|List|String|Operation} attrs\n * @return {Operation}\n */\n\n static create(attrs = {}) {\n if (Operation.isOperation(attrs)) {\n return attrs\n }\n\n if (isPlainObject(attrs)) {\n return Operation.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Operation.create\\` only accepts objects or operations, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a list of `Operations` from `elements`.\n *\n * @param {Array<Operation|Object>|List<Operation|Object>} elements\n * @return {List<Operation>}\n */\n\n static createList(elements = []) {\n if (List.isList(elements) || Array.isArray(elements)) {\n const list = new List(elements.map(Operation.create))\n return list\n }\n\n throw new Error(\n `\\`Operation.createList\\` only accepts arrays or lists, but you passed it: ${elements}`\n )\n }\n\n /**\n * Create a `Operation` from a JSON `object`.\n *\n * @param {Object|Operation} object\n * @return {Operation}\n */\n\n static fromJSON(object) {\n if (Operation.isOperation(object)) {\n return object\n }\n\n const { type } = object\n const ATTRIBUTES = OPERATION_ATTRIBUTES[type]\n const attrs = { type }\n\n if (!ATTRIBUTES) {\n throw new Error(\n `\\`Operation.fromJSON\\` was passed an unrecognized operation type: \"${type}\"`\n )\n }\n\n for (const key of ATTRIBUTES) {\n let v = object[key]\n\n // Default `data` to an empty object.\n if (key === 'data' && v === undefined) {\n v = {}\n }\n\n if (v === undefined) {\n throw new Error(\n `\\`Operation.fromJSON\\` was passed a \"${type}\" operation without the required \"${key}\" attribute.`\n )\n }\n\n if (key === 'annotation') {\n v = Annotation.create(v)\n }\n\n if (key === 'path' || key === 'newPath') {\n v = PathUtils.create(v)\n }\n\n if (key === 'mark') {\n v = Mark.create(v)\n }\n\n if (key === 'node') {\n v = Node.create(v)\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_annotation'\n ) {\n v = Annotation.createProperties(v)\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_mark'\n ) {\n v = Mark.createProperties(v)\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n (type === 'set_node' || type === 'merge_node' || type === 'split_node')\n ) {\n v = Node.createProperties(v)\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_selection'\n ) {\n v = Selection.createProperties(v)\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_value'\n ) {\n v = Value.createProperties(v)\n }\n\n if (key === 'data') {\n v = Map(v)\n }\n\n attrs[key] = v\n }\n\n const op = new Operation(attrs)\n return op\n }\n\n /**\n * Check if `any` is a list of operations.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isOperationList(any) {\n return List.isList(any) && any.every(item => Operation.isOperation(item))\n }\n\n /**\n * Apply the operation to a `value`.\n *\n * @param {Value} value\n * @return {Value}\n */\n\n apply(value) {\n const next = apply(value, this)\n return next\n }\n\n /**\n * Invert the operation.\n *\n * @return {Operation}\n */\n\n invert() {\n const inverted = invert(this)\n return inverted\n }\n\n /**\n * Return a JSON representation of the operation.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const { object, type } = this\n const json = { object, type }\n const ATTRIBUTES = OPERATION_ATTRIBUTES[type]\n\n for (const key of ATTRIBUTES) {\n let value = this[key]\n\n if (\n key === 'annotation' ||\n key === 'mark' ||\n key === 'marks' ||\n key === 'node' ||\n key === 'path' ||\n key === 'newPath'\n ) {\n value = value.toJSON()\n }\n\n if (key === 'properties' && type === 'merge_node') {\n const v = {}\n if ('data' in value) v.data = value.data.toJS()\n if ('type' in value) v.type = value.type\n value = v\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_annotation'\n ) {\n const v = {}\n if ('anchor' in value) v.anchor = value.anchor.toJS()\n if ('focus' in value) v.focus = value.focus.toJS()\n if ('key' in value) v.key = value.key\n if ('mark' in value) v.mark = value.mark.toJS()\n value = v\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_mark'\n ) {\n const v = {}\n if ('data' in value) v.data = value.data.toJS()\n if ('type' in value) v.type = value.type\n value = v\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_node'\n ) {\n const v = {}\n if ('data' in value) v.data = value.data.toJS()\n if ('type' in value) v.type = value.type\n value = v\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_selection'\n ) {\n const v = {}\n if ('anchor' in value) v.anchor = value.anchor.toJSON()\n if ('focus' in value) v.focus = value.focus.toJSON()\n if ('isFocused' in value) v.isFocused = value.isFocused\n if ('marks' in value) v.marks = value.marks && value.marks.toJSON()\n value = v\n }\n\n if (\n (key === 'properties' || key === 'newProperties') &&\n type === 'set_value'\n ) {\n const v = {}\n if ('data' in value) v.data = value.data.toJS()\n value = v\n }\n\n if (key === 'properties' && type === 'split_node') {\n const v = {}\n if ('data' in value) v.data = value.data.toJS()\n if ('type' in value) v.type = value.type\n value = v\n }\n\n if (key === 'data') {\n value = value.toJSON()\n }\n\n json[key] = value\n }\n\n return json\n }\n}\n\n/**\n * Export.\n *\n * @type {Operation}\n */\n\nexport default Operation\n","import isPlainObject from 'is-plain-object'\nimport { Record } from 'immutable'\n\nimport Operation from './operation'\nimport Value from './value'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n operations: undefined,\n value: undefined,\n}\n\n/**\n * Change.\n *\n * @type {Change}\n */\n\nclass Change extends Record(DEFAULTS) {\n /**\n * Create a new `Change` with `attrs`.\n *\n * @param {Object|Change} attrs\n * @return {Change}\n */\n\n static create(attrs = {}) {\n if (Change.isChange(attrs)) {\n return attrs\n }\n\n if (isPlainObject(attrs)) {\n return Change.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Change.create\\` only accepts objects or changes, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a `Change` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Change}\n */\n\n static fromJSON(object) {\n const { value, operations = [] } = object\n\n const change = new Change({\n value: Value.create(value),\n operations: Operation.createList(operations),\n })\n\n return change\n }\n\n /**\n * Return a JSON representation of the change.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n value: this.value.toJSON(options),\n operations: this.operations.toArray().map(o => o.toJSON(options)),\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Change}\n */\n\nexport default Change\n","/**\n * A plugin that adds a set of commands to the editor.\n *\n * @param {Object} commands\n * @return {Object}\n */\n\nfunction CommandsPlugin(commands = {}) {\n /**\n * On command, if it exists in our list of commands, call it.\n *\n * @param {Object} command\n * @param {Editor} editor\n * @param {Function} next\n */\n\n function onCommand(command, editor, next) {\n const { type, args } = command\n const fn = commands[type]\n if (!fn) return next()\n editor.command(fn, ...args)\n }\n\n /**\n * On construct, register all the commands.\n *\n * @param {Editor} editor\n * @param {Function} next\n */\n\n function onConstruct(editor, next) {\n for (const command in commands) {\n editor.registerCommand(command)\n }\n\n return next()\n }\n\n /**\n * Return the plugin.\n *\n * @type {Object}\n */\n\n return {\n onCommand,\n onConstruct,\n }\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default CommandsPlugin\n","import { reverse } from 'esrever'\n\n/**\n * Surrogate pair start and end points.\n *\n * @type {Number}\n */\n\nconst SURROGATE_START = 0xd800\nconst SURROGATE_END = 0xdfff\n\n/**\n * A regex to match space characters.\n *\n * @type {RegExp}\n */\n\nconst SPACE = /\\s/\n\n/**\n * A regex to match chameleon characters, that count as word characters as long\n * as they are inside of a word.\n *\n * @type {RegExp}\n */\n\nconst CHAMELEON = /['\\u2018\\u2019]/\n\n/**\n * A regex that matches punctuation.\n *\n * @type {RegExp}\n */\n\nconst PUNCTUATION = /[\\u0021-\\u0023\\u0025-\\u002A\\u002C-\\u002F\\u003A\\u003B\\u003F\\u0040\\u005B-\\u005D\\u005F\\u007B\\u007D\\u00A1\\u00A7\\u00AB\\u00B6\\u00B7\\u00BB\\u00BF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E3B\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]/\n\n/**\n * Is a character `code` in a surrogate character.\n *\n * @param {Number} code\n * @return {Boolean}\n */\n\nfunction isSurrogate(code) {\n return SURROGATE_START <= code && code <= SURROGATE_END\n}\n\n/**\n * Is a character a word character? Needs the `remaining` characters too.\n *\n * @param {String} char\n * @param {String|Void} remaining\n * @return {Boolean}\n */\n\nfunction isWord(char, remaining) {\n if (SPACE.test(char)) return false\n\n // If it's a chameleon character, recurse to see if the next one is or not.\n if (CHAMELEON.test(char)) {\n let next = remaining.charAt(0)\n const length = getCharLength(next)\n next = remaining.slice(0, length)\n const rest = remaining.slice(length)\n if (isWord(next, rest)) return true\n }\n\n if (PUNCTUATION.test(char)) return false\n return true\n}\n\n/**\n * Get the length of a `character`.\n *\n * @param {String} char\n * @return {Number}\n */\n\nfunction getCharLength(char) {\n return isSurrogate(char.charCodeAt(0)) ? 2 : 1\n}\n\n/**\n * Get the offset to the end of the first character in `text`.\n *\n * @param {String} text\n * @return {Number}\n */\n\nfunction getCharOffset(text) {\n const char = text.charAt(0)\n return getCharLength(char)\n}\n\n/**\n * Get the offset to the end of the character before an `offset` in `text`.\n *\n * @param {String} text\n * @param {Number} offset\n * @return {Number}\n */\n\nfunction getCharOffsetBackward(text, offset) {\n text = text.slice(0, offset)\n text = reverse(text)\n return getCharOffset(text)\n}\n\n/**\n * Get the offset to the end of the character after an `offset` in `text`.\n *\n * @param {String} text\n * @param {Number} offset\n * @return {Number}\n */\n\nfunction getCharOffsetForward(text, offset) {\n text = text.slice(offset)\n return getCharOffset(text)\n}\n\n/**\n * Get the offset to the end of the first word in `text`.\n *\n * @param {String} text\n * @return {Number}\n */\n\nfunction getWordOffset(text) {\n let length = 0\n let i = 0\n let started = false\n let char\n\n while ((char = text.charAt(i))) {\n const l = getCharLength(char)\n char = text.slice(i, i + l)\n const rest = text.slice(i + l)\n\n if (isWord(char, rest)) {\n started = true\n length += l\n } else if (!started) {\n length += l\n } else {\n break\n }\n\n i += l\n }\n\n return length\n}\n\n/**\n * Get the offset to the end of the word before an `offset` in `text`.\n *\n * @param {String} text\n * @param {Number} offset\n * @return {Number}\n */\n\nfunction getWordOffsetBackward(text, offset) {\n text = text.slice(0, offset)\n text = reverse(text)\n const o = getWordOffset(text)\n return o\n}\n\n/**\n * Get the offset to the end of the word after an `offset` in `text`.\n *\n * @param {String} text\n * @param {Number} offset\n * @return {Number}\n */\n\nfunction getWordOffsetForward(text, offset) {\n text = text.slice(offset)\n const o = getWordOffset(text)\n return o\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default {\n getCharLength,\n getCharOffset,\n getCharOffsetBackward,\n getCharOffsetForward,\n getWordOffset,\n getWordOffsetBackward,\n getWordOffsetForward,\n isSurrogate,\n isWord,\n}\n","import { List } from 'immutable'\nimport Block from '../models/block'\nimport Inline from '../models/inline'\nimport Mark from '../models/mark'\nimport Node from '../models/node'\nimport TextUtils from '../utils/text-utils'\n\n/**\n * Ensure that an expanded selection is deleted first, and return the updated\n * range to account for the deleted part.\n *\n * @param {Editor}\n */\n\nfunction deleteExpandedAtRange(editor, range) {\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n }\n\n const { value } = editor\n const { document } = value\n const { start, end } = range\n\n if (document.hasDescendant(start.path)) {\n range = range.moveToStart()\n } else {\n range = range.moveTo(end.path, 0).normalize(document)\n }\n\n return range\n}\n\n/**\n * Commands.\n *\n * @type {Object}\n */\n\nconst Commands = {}\n\n/**\n * Add a new `mark` to the characters at `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Mixed} mark\n */\n\nCommands.addMarkAtRange = (editor, range, mark) => {\n if (range.isCollapsed) return\n\n const { value } = editor\n const { document } = value\n const { start, end } = range\n const texts = document.getTextsAtRange(range)\n\n editor.withoutNormalizing(() => {\n texts.forEach(node => {\n const { key } = node\n let index = 0\n let length = node.text.length\n\n if (key === start.key) index = start.offset\n if (key === end.key) length = end.offset\n if (key === start.key && key === end.key)\n length = end.offset - start.offset\n\n editor.addMarkByKey(key, index, length, mark)\n })\n })\n}\n\n/**\n * Add a list of `marks` to the characters at `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Array<Mixed>} mark\n */\n\nCommands.addMarksAtRange = (editor, range, marks) => {\n marks.forEach(mark => editor.addMarkAtRange(range, mark))\n}\n\n/**\n * Delete everything in a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nCommands.deleteAtRange = (editor, range) => {\n // Snapshot the selection, which creates an extra undo save point, so that\n // when you undo a delete, the expanded selection will be retained.\n editor.snapshotSelection()\n\n const { value } = editor\n const { start, end } = range\n let startKey = start.key\n let startOffset = start.offset\n let endKey = end.key\n let endOffset = end.offset\n let { document } = value\n let isStartVoid = document.hasVoidParent(startKey, editor)\n let isEndVoid = document.hasVoidParent(endKey, editor)\n let startBlock = document.getClosestBlock(startKey)\n let endBlock = document.getClosestBlock(endKey)\n\n // Check if we have a \"hanging\" selection case where the even though the\n // selection extends into the start of the end node, we actually want to\n // ignore that for UX reasons.\n const isHanging =\n startOffset === 0 &&\n endOffset === 0 &&\n isStartVoid === false &&\n startKey === startBlock.getFirstText().key &&\n endKey === endBlock.getFirstText().key &&\n startKey !== endKey\n\n // If it's a hanging selection, nudge it back to end in the previous text.\n if (isHanging && isEndVoid) {\n const prevText = document.getPreviousText(endKey)\n endKey = prevText.key\n endOffset = prevText.text.length\n isEndVoid = document.hasVoidParent(endKey, editor)\n }\n\n editor.withoutNormalizing(() => {\n // If the start node is inside a void node, remove the void node and update\n // the starting point to be right after it, continuously until the start point\n // is not a void, or until the entire range is handled.\n while (isStartVoid) {\n const startVoid = document.getClosestVoid(startKey, editor)\n const nextText = document.getNextText(startKey)\n editor.removeNodeByKey(startVoid.key)\n\n // If the start and end keys are the same, we're done.\n if (startKey === endKey) return\n\n // If there is no next text node, we're done.\n if (!nextText) return\n\n // Continue...\n document = editor.value.document\n startKey = nextText.key\n startOffset = 0\n isStartVoid = document.hasVoidParent(startKey, editor)\n }\n\n // If the end node is inside a void node, do the same thing but backwards. But\n // we don't need any aborting checks because if we've gotten this far there\n // must be a non-void node that will exit the loop.\n while (isEndVoid) {\n const endVoid = document.getClosestVoid(endKey, editor)\n const prevText = document.getPreviousText(endKey)\n editor.removeNodeByKey(endVoid.key)\n\n // Continue...\n document = editor.value.document\n endKey = prevText.key\n endOffset = prevText.text.length\n isEndVoid = document.hasVoidParent(endKey, editor)\n }\n\n // If the start and end key are the same, and it was a hanging selection, we\n // can just remove the entire block.\n if (startKey === endKey && isHanging) {\n editor.removeNodeByKey(startBlock.key)\n return\n } else if (startKey === endKey) {\n // Otherwise, if it wasn't hanging, we're inside a single text node, so we can\n // simply remove the text in the range.\n const index = startOffset\n const length = endOffset - startOffset\n editor.removeTextByKey(startKey, index, length)\n return\n } else {\n // Otherwise, we need to recursively remove text and nodes inside the start\n // block after the start offset and inside the end block before the end\n // offset. Then remove any blocks that are in between the start and end\n // blocks. Then finally merge the start and end nodes.\n startBlock = document.getClosestBlock(startKey)\n endBlock = document.getClosestBlock(endKey)\n const startText = document.getNode(startKey)\n const endText = document.getNode(endKey)\n const startLength = startText.text.length - startOffset\n const endLength = endOffset\n\n const ancestor = document.getCommonAncestor(startKey, endKey)\n const startChild = ancestor.getFurthestChild(startKey)\n const endChild = ancestor.getFurthestChild(endKey)\n\n const startParent = document.getParent(startBlock.key)\n const startParentIndex = startParent.nodes.indexOf(startBlock)\n const endParentIndex = startParent.nodes.indexOf(endBlock)\n\n let child\n\n // Iterate through all of the nodes in the tree after the start text node\n // but inside the end child, and remove them.\n child = startText\n\n while (child.key !== startChild.key) {\n const parent = document.getParent(child.key)\n const index = parent.nodes.indexOf(child)\n const afters = parent.nodes.slice(index + 1)\n\n afters.reverse().forEach(node => {\n editor.removeNodeByKey(node.key)\n })\n\n child = parent\n }\n\n // Remove all of the middle children.\n const startChildIndex = ancestor.nodes.indexOf(startChild)\n const endChildIndex = ancestor.nodes.indexOf(endChild)\n const middles = ancestor.nodes.slice(startChildIndex + 1, endChildIndex)\n\n middles.reverse().forEach(node => {\n editor.removeNodeByKey(node.key)\n })\n\n // Remove the nodes before the end text node in the tree.\n child = endText\n\n while (child.key !== endChild.key) {\n const parent = document.getParent(child.key)\n const index = parent.nodes.indexOf(child)\n const befores = parent.nodes.slice(0, index)\n\n befores.reverse().forEach(node => {\n editor.removeNodeByKey(node.key)\n })\n\n child = parent\n }\n\n // Remove any overlapping text content from the leaf text nodes.\n if (startLength !== 0) {\n editor.removeTextByKey(startKey, startOffset, startLength)\n }\n\n if (endLength !== 0) {\n editor.removeTextByKey(endKey, 0, endOffset)\n }\n\n // If the start and end blocks aren't the same, move and merge the end block\n // into the start block.\n if (startBlock.key !== endBlock.key) {\n document = editor.value.document\n let onlyChildAncestor\n\n for (const [node] of document.ancestors(endBlock.key)) {\n if (node.nodes.size > 1) {\n break\n } else {\n onlyChildAncestor = node\n }\n }\n\n // Move the end block to be right after the start block.\n if (endParentIndex !== startParentIndex + 1) {\n editor.moveNodeByKey(\n endBlock.key,\n startParent.key,\n startParentIndex + 1\n )\n }\n\n // If the selection is hanging, just remove the start block, otherwise\n // merge the end block into it.\n if (isHanging) {\n editor.removeNodeByKey(startBlock.key)\n } else {\n editor.mergeNodeByKey(endBlock.key)\n }\n\n // If nested empty blocks are left over above the end block, remove them.\n if (onlyChildAncestor) {\n editor.removeNodeByKey(onlyChildAncestor.key)\n }\n }\n }\n })\n}\n\n/**\n * Delete backward `n` characters at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Number} n (optional)\n */\n\nCommands.deleteBackwardAtRange = (editor, range, n = 1) => {\n if (n === 0) return\n const { value } = editor\n const { document } = value\n const { start, focus } = range\n\n // If the range is expanded, perform a regular delete instead.\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const voidParent = document.getClosestVoid(start.path, editor)\n\n // If there is a void parent, delete it.\n if (voidParent) {\n editor.removeNodeByKey(voidParent.key)\n return\n }\n\n // If the range is at the start of the document, abort.\n if (start.isAtStartOfNode(document)) {\n return\n }\n\n const block = document.getClosestBlock(start.path)\n\n // PERF: If the closest block is empty, remove it. This is just a shortcut,\n // since merging it would result in the same outcome.\n if (\n document.nodes.size !== 1 &&\n block &&\n block.text === '' &&\n block.nodes.size === 1\n ) {\n editor.removeNodeByKey(block.key)\n return\n }\n\n // If the range is at the start of the text node, we need to figure out what\n // is behind it to know how to delete...\n const text = document.getDescendant(start.path)\n\n if (start.isAtStartOfNode(text)) {\n let prev = document.getPreviousText(text.key)\n const inline = document.getClosestInline(text.key)\n\n // If the range is at the start of the inline node, and previous text node\n // is empty, take the text node before that, or \"prevBlock\" would be the\n // same node as \"block\"\n if (inline && prev.text === '') {\n prev = document.getPreviousText(prev.key)\n }\n\n const prevBlock = document.getClosestBlock(prev.key)\n const prevVoid = document.getClosestVoid(prev.key, editor)\n\n // If the previous text node has a void parent, remove it.\n if (prevVoid) {\n editor.removeNodeByKey(prevVoid.key)\n return\n }\n\n // If we're deleting by one character and the previous text node is not\n // inside the current block, we need to merge the two blocks together.\n if (n === 1 && prevBlock !== block) {\n range = range.moveAnchorTo(prev.key, prev.text.length)\n editor.deleteAtRange(range)\n return\n }\n }\n\n // If the focus offset is farther than the number of characters to delete,\n // just remove the characters backwards inside the current node.\n if (n <= focus.offset) {\n range = range.moveFocusBackward(n)\n editor.deleteAtRange(range)\n return\n }\n\n // Otherwise, we need to see how many nodes backwards to go.\n let node = text\n let offset = 0\n let traversed = focus.offset\n\n while (n > traversed) {\n node = document.getPreviousText(node.key)\n const next = traversed + node.text.length\n\n if (n <= next) {\n offset = next - n\n break\n } else {\n traversed = next\n }\n }\n\n range = range.moveAnchorTo(node.key, offset)\n editor.deleteAtRange(range)\n}\n\n/**\n * Delete backward until the character boundary at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nCommands.deleteCharBackwardAtRange = (editor, range) => {\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const startBlock = document.getClosestBlock(start.path)\n const offset = startBlock.getOffset(start.key)\n const o = offset + start.offset\n const { text } = startBlock\n const n = TextUtils.getCharOffsetBackward(text, o)\n editor.deleteBackwardAtRange(range, n)\n}\n\n/**\n * Delete forward until the character boundary at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nCommands.deleteCharForwardAtRange = (editor, range) => {\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const startBlock = document.getClosestBlock(start.path)\n const offset = startBlock.getOffset(start.key)\n const o = offset + start.offset\n const { text } = startBlock\n const n = TextUtils.getCharOffsetForward(text, o)\n editor.deleteForwardAtRange(range, n)\n}\n\n/**\n * Delete forward `n` characters at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Number} n (optional)\n */\n\nCommands.deleteForwardAtRange = (editor, range, n = 1) => {\n if (n === 0) return\n const { value } = editor\n const { document } = value\n const { start, focus } = range\n\n // If the range is expanded, perform a regular delete instead.\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const voidParent = document.getClosestVoid(start.path, editor)\n\n // If the node has a void parent, delete it.\n if (voidParent) {\n editor.removeNodeByKey(voidParent.key)\n return\n }\n\n const block = document.getClosestBlock(start.path)\n\n // If the closest is not void, but empty, remove it\n if (\n block &&\n !editor.isVoid(block) &&\n block.text === '' &&\n document.nodes.size !== 1\n ) {\n const nextBlock = document.getNextBlock(block.key)\n editor.removeNodeByKey(block.key)\n\n if (nextBlock && nextBlock.key) {\n editor.moveToStartOfNode(nextBlock)\n }\n\n return\n }\n\n // If the range is at the start of the document, abort.\n if (start.isAtEndOfNode(document)) {\n return\n }\n\n // If the range is at the start of the text node, we need to figure out what\n // is behind it to know how to delete...\n const text = document.getDescendant(start.path)\n\n if (start.isAtEndOfNode(text)) {\n const next = document.getNextText(text.key)\n const nextBlock = document.getClosestBlock(next.key)\n const nextVoid = document.getClosestVoid(next.key, editor)\n\n // If the next text node has a void parent, remove it.\n if (nextVoid) {\n editor.removeNodeByKey(nextVoid.key)\n return\n }\n\n // If we're deleting by one character and the previous text node is not\n // inside the current block, we need to merge the two blocks together.\n if (n === 1 && nextBlock !== block) {\n range = range.moveFocusTo(next.key, 0)\n editor.deleteAtRange(range)\n return\n }\n }\n\n // If the remaining characters to the end of the node is greater than or equal\n // to the number of characters to delete, just remove the characters forwards\n // inside the current node.\n if (n <= text.text.length - focus.offset) {\n range = range.moveFocusForward(n)\n editor.deleteAtRange(range)\n return\n }\n\n // Otherwise, we need to see how many nodes forwards to go.\n let node = text\n let offset = focus.offset\n let traversed = text.text.length - focus.offset\n\n while (n > traversed) {\n node = document.getNextText(node.key)\n const next = traversed + node.text.length\n\n if (n <= next) {\n offset = n - traversed\n break\n } else {\n traversed = next\n }\n }\n\n range = range.moveFocusTo(node.key, offset)\n editor.deleteAtRange(range)\n}\n\n/**\n * Delete backward until the line boundary at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nCommands.deleteLineBackwardAtRange = (editor, range) => {\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const startBlock = document.getClosestBlock(start.path)\n const offset = startBlock.getOffset(start.key)\n const o = offset + start.offset\n editor.deleteBackwardAtRange(range, o)\n}\n\n/**\n * Delete forward until the line boundary at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nCommands.deleteLineForwardAtRange = (editor, range) => {\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const startBlock = document.getClosestBlock(start.path)\n const offset = startBlock.getOffset(start.key)\n const o = offset + start.offset\n editor.deleteForwardAtRange(range, startBlock.text.length - o)\n}\n\n/**\n * Delete backward until the word boundary at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nCommands.deleteWordBackwardAtRange = (editor, range) => {\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const startBlock = document.getClosestBlock(start.path)\n const offset = startBlock.getOffset(start.key)\n const o = offset + start.offset\n const { text } = startBlock\n const n = o === 0 ? 1 : TextUtils.getWordOffsetBackward(text, o)\n editor.deleteBackwardAtRange(range, n)\n}\n\n/**\n * Delete forward until the word boundary at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nCommands.deleteWordForwardAtRange = (editor, range) => {\n if (range.isExpanded) {\n editor.deleteAtRange(range)\n return\n }\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const startBlock = document.getClosestBlock(start.path)\n const offset = startBlock.getOffset(start.key)\n const o = offset + start.offset\n const { text } = startBlock\n const wordOffset = TextUtils.getWordOffsetForward(text, o)\n const n = wordOffset === 0 ? 1 : wordOffset\n editor.deleteForwardAtRange(range, n)\n}\n\n/**\n * Insert a `block` node at `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Block|String|Object} block\n */\n\nCommands.insertBlockAtRange = (editor, range, block) => {\n range = deleteExpandedAtRange(editor, range)\n block = Block.create(block)\n\n const { value } = editor\n const { document } = value\n const { start } = range\n let startKey = start.key\n let startOffset = start.offset\n const startBlock = document.getClosestBlock(startKey)\n const startInline = document.getClosestInline(startKey)\n const parent = document.getParent(startBlock.key)\n const index = parent.nodes.indexOf(startBlock)\n const insertionMode = getInsertionMode(editor, range)\n\n if (insertionMode === 'before') {\n editor.insertNodeByKey(parent.key, index, block)\n } else if (insertionMode === 'behind') {\n editor.insertNodeByKey(parent.key, index + 1, block)\n } else {\n if (startInline && editor.isVoid(startInline)) {\n const atEnd = start.isAtEndOfNode(startInline)\n const siblingText = atEnd\n ? document.getNextText(startKey)\n : document.getPreviousText(startKey)\n\n const splitRange = atEnd\n ? range.moveToStartOfNode(siblingText)\n : range.moveToEndOfNode(siblingText)\n\n startKey = splitRange.start.key\n startOffset = splitRange.start.offset\n }\n\n editor.withoutNormalizing(() => {\n editor.splitDescendantsByKey(startBlock.key, startKey, startOffset)\n editor.insertNodeByKey(parent.key, index + 1, block)\n })\n }\n}\n\n/**\n * Check if current block should be split or new block should be added before or behind it.\n *\n * @param {Editor} editor\n * @param {Range} range\n */\n\nconst getInsertionMode = (editor, range) => {\n const { value } = editor\n const { document } = value\n const { start } = range\n const startKey = start.key\n const startBlock = document.getClosestBlock(startKey)\n const startInline = document.getClosestInline(startKey)\n\n if (editor.isVoid(startBlock)) {\n if (start.isAtEndOfNode(startBlock)) return 'behind'\n else return 'before'\n } else if (!startInline && startBlock.text === '') {\n return 'behind'\n } else if (start.isAtStartOfNode(startBlock)) {\n return 'before'\n } else if (start.isAtEndOfNode(startBlock)) {\n return 'behind'\n }\n return 'split'\n}\n\n/**\n * Insert a `fragment` at a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Document} fragment\n */\n\nCommands.insertFragmentAtRange = (editor, range, fragment) => {\n editor.withoutNormalizing(() => {\n range = deleteExpandedAtRange(editor, range)\n\n // If the fragment is empty, there's nothing to do after deleting.\n if (!fragment.nodes.size) return\n\n // Regenerate the keys for all of the fragments nodes, so that they're\n // guaranteed not to collide with the existing keys in the document. Otherwise\n // they will be regenerated automatically and we won't have an easy way to\n // reference them.\n fragment = fragment.mapDescendants(child => child.regenerateKey())\n\n // Calculate a few things...\n const { start } = range\n const { value } = editor\n let { document } = value\n let startText = document.getDescendant(start.path)\n let startBlock = document.getClosestBlock(startText.key)\n let startChild = startBlock.getFurthestChild(startText.key)\n const isAtStart = start.isAtStartOfNode(startBlock)\n const parent = document.getParent(startBlock.key)\n const index = parent.nodes.indexOf(startBlock)\n const blocks = fragment.getBlocks()\n const firstChild = fragment.nodes.first()\n const lastChild = fragment.nodes.last()\n const firstBlock = blocks.first()\n const lastBlock = blocks.last()\n const insertionNode = findInsertionNode(fragment, document, startBlock.key)\n\n // If the fragment only contains a void block, use `insertBlock` instead.\n if (firstBlock === lastBlock && editor.isVoid(firstBlock)) {\n editor.insertBlockAtRange(range, firstBlock)\n return\n }\n\n // If inserting the entire fragment and it starts or ends with a single\n // nested block, e.g. a table, we do not merge it with existing blocks.\n if (\n insertionNode === fragment &&\n (firstChild.hasBlockChildren() || lastChild.hasBlockChildren())\n ) {\n // check if reversal is necessary or not\n const insertionMode = getInsertionMode(editor, range)\n const nodes =\n insertionMode === 'before' ? fragment.nodes : fragment.nodes.reverse()\n\n nodes.forEach(node => {\n editor.insertBlockAtRange(range, node)\n })\n return\n }\n\n // If the first and last block aren't the same, we need to insert all of the\n // nodes after the insertion node's first block at the index.\n if (firstBlock !== lastBlock) {\n const lonelyParent = insertionNode.getFurthest(\n firstBlock.key,\n p => p.nodes.size === 1\n )\n const lonelyChild = lonelyParent || firstBlock\n\n const startIndex = parent.nodes.indexOf(startBlock)\n const excludingLonelyChild = insertionNode.removeNode(lonelyChild.key)\n\n excludingLonelyChild.nodes.forEach((node, i) => {\n const newIndex = startIndex + i + 1\n editor.insertNodeByKey(parent.key, newIndex, node)\n })\n }\n\n // Check if we need to split the node.\n if (start.offset !== 0) {\n editor.splitDescendantsByKey(startChild.key, start.key, start.offset)\n }\n\n // Update our variables with the new value.\n document = editor.value.document\n startText = document.getDescendant(start.key)\n startBlock = document.getClosestBlock(start.key)\n startChild = startBlock.getFurthestChild(startText.key)\n\n // If the first and last block aren't the same, we need to move any of the\n // starting block's children after the split into the last block of the\n // fragment, which has already been inserted.\n if (firstBlock !== lastBlock) {\n const nextChild = isAtStart\n ? startChild\n : startBlock.getNextSibling(startChild.key)\n const nextNodes = nextChild\n ? startBlock.nodes.skipUntil(n => n.key === nextChild.key)\n : List()\n const lastIndex = lastBlock.nodes.size\n\n nextNodes.forEach((node, i) => {\n const newIndex = lastIndex + i\n editor.moveNodeByKey(node.key, lastBlock.key, newIndex)\n })\n }\n\n // If the starting block is empty, we replace it entirely with the first block\n // of the fragment, since this leads to a more expected behavior for the user.\n if (\n !editor.isVoid(startBlock) &&\n startBlock.text === '' &&\n !startBlock.findDescendant(n => editor.isVoid(n))\n ) {\n editor.removeNodeByKey(startBlock.key)\n editor.insertNodeByKey(parent.key, index, firstBlock)\n } else {\n // Otherwise, we maintain the starting block, and insert all of the first\n // block's inline nodes into it at the split point.\n const inlineChild = startBlock.getFurthestChild(startText.key)\n const inlineIndex = startBlock.nodes.indexOf(inlineChild)\n\n firstBlock.nodes.forEach((inline, i) => {\n const o = start.offset === 0 ? 0 : 1\n const newIndex = inlineIndex + i + o\n editor.insertNodeByKey(startBlock.key, newIndex, inline)\n })\n }\n })\n}\n\nconst findInsertionNode = (fragment, document, startKey) => {\n const hasSingleNode = object => {\n if (!object || object.object === 'text') return\n return object.nodes.size === 1\n }\n\n const firstNode = object => object && object.nodes.first()\n let node = fragment\n\n if (hasSingleNode(fragment)) {\n let fragmentInner = firstNode(fragment)\n\n const matches = documentNode => documentNode.type === fragmentInner.type\n let documentInner = document.getFurthest(startKey, matches)\n\n if (documentInner === document.getParent(startKey)) node = fragmentInner\n\n while (hasSingleNode(fragmentInner) && hasSingleNode(documentInner)) {\n fragmentInner = firstNode(fragmentInner)\n documentInner = firstNode(documentInner)\n\n if (fragmentInner.type === documentInner.type) {\n node = fragmentInner\n } else {\n break\n }\n }\n }\n\n return node\n}\n\n/**\n * Insert an `inline` node at `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Inline|String|Object} inline\n */\n\nCommands.insertInlineAtRange = (editor, range, inline) => {\n inline = Inline.create(inline)\n\n editor.withoutNormalizing(() => {\n range = deleteExpandedAtRange(editor, range)\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const parent = document.getParent(start.path)\n const startText = document.assertDescendant(start.path)\n const index = parent.nodes.indexOf(startText)\n\n if (editor.isVoid(parent)) {\n return\n }\n\n editor.splitNodeByPath(start.path, start.offset)\n editor.insertNodeByKey(parent.key, index + 1, inline)\n })\n}\n\n/**\n * Insert `text` at a `range`, with optional `marks`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {String} text\n * @param {Set<Mark>} marks (optional)\n */\n\nCommands.insertTextAtRange = (editor, range, text, marks) => {\n editor.withoutNormalizing(() => {\n range = deleteExpandedAtRange(editor, range)\n\n const { value } = editor\n const { document } = value\n const { start } = range\n const offset = start.offset\n const parent = document.getParent(start.path)\n\n if (editor.isVoid(parent)) {\n return\n }\n\n editor.insertTextByPath(start.path, offset, text, marks)\n })\n}\n\n/**\n * Remove an existing `mark` to the characters at `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Mark|String} mark (optional)\n */\n\nCommands.removeMarkAtRange = (editor, range, mark) => {\n if (range.isCollapsed) return\n\n const { value } = editor\n const { document } = value\n const texts = document.getTextsAtRange(range)\n const { start, end } = range\n\n editor.withoutNormalizing(() => {\n texts.forEach(node => {\n const { key } = node\n let index = 0\n let length = node.text.length\n\n if (key === start.key) index = start.offset\n if (key === end.key) length = end.offset\n if (key === start.key && key === end.key)\n length = end.offset - start.offset\n\n editor.removeMarkByKey(key, index, length, mark)\n })\n })\n}\n\n/**\n * Set the `properties` of block nodes in a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Object|String} properties\n */\n\nCommands.setBlocksAtRange = (editor, range, properties) => {\n const { value } = editor\n const { document } = value\n const blocks = document.getLeafBlocksAtRange(range)\n\n const { start, end, isCollapsed } = range\n const isStartVoid = document.hasVoidParent(start.path, editor)\n const startBlock = document.getClosestBlock(start.path)\n const endBlock = document.getClosestBlock(end.key)\n\n // Check if we have a \"hanging\" selection case where the even though the\n // selection extends into the start of the end node, we actually want to\n // ignore that for UX reasons.\n const isHanging =\n isCollapsed === false &&\n start.offset === 0 &&\n end.offset === 0 &&\n isStartVoid === false &&\n start.key === startBlock.getFirstText().key &&\n end.key === endBlock.getFirstText().key\n\n // If it's a hanging selection, ignore the last block.\n const sets = isHanging ? blocks.slice(0, -1) : blocks\n\n editor.withoutNormalizing(() => {\n sets.forEach(block => {\n editor.setNodeByKey(block.key, properties)\n })\n })\n}\n\n/**\n * Set the `properties` of inline nodes in a `range`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Object|String} properties\n */\n\nCommands.setInlinesAtRange = (editor, range, properties) => {\n const { value } = editor\n const { document } = value\n const inlines = document.getLeafInlinesAtRange(range)\n\n editor.withoutNormalizing(() => {\n inlines.forEach(inline => {\n editor.setNodeByKey(inline.key, properties)\n })\n })\n}\n\n/**\n * Split the block nodes at a `range`, to optional `height`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Number} height (optional)\n */\n\nCommands.splitBlockAtRange = (editor, range, height = 1) => {\n range = deleteExpandedAtRange(editor, range)\n\n const { start, end } = range\n let { value } = editor\n let { document } = value\n let node = document.assertDescendant(start.path)\n let parent = document.getClosestBlock(node.key)\n let h = 0\n\n while (parent && parent.object === 'block' && h < height) {\n node = parent\n parent = document.getClosestBlock(parent.key)\n h++\n }\n\n editor.withoutNormalizing(() => {\n editor.splitDescendantsByKey(node.key, start.path, start.offset)\n\n value = editor.value\n document = value.document\n\n if (range.isExpanded) {\n if (range.isBackward) range = range.flip()\n const nextBlock = document.getNextBlock(node.key)\n range = range.moveAnchorToStartOfNode(nextBlock)\n range = range.setFocus(range.focus.setPath(null))\n\n if (start.path.equals(end.path)) {\n range = range.moveFocusTo(range.anchor.key, end.offset - start.offset)\n }\n\n range = document.resolveRange(range)\n editor.deleteAtRange(range)\n }\n })\n}\n\n/**\n * Split the inline nodes at a `range`, to optional `height`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Number} height (optional)\n */\n\nCommands.splitInlineAtRange = (editor, range, height = Infinity) => {\n range = deleteExpandedAtRange(editor, range)\n\n const { start } = range\n const { value } = editor\n const { document } = value\n let node = document.assertDescendant(start.path)\n let parent = document.getClosestInline(node.key)\n let h = 0\n\n while (parent && parent.object === 'inline' && h < height) {\n node = parent\n parent = document.getClosestInline(parent.key)\n h++\n }\n\n editor.splitDescendantsByKey(node.key, start.path, start.offset)\n}\n\n/**\n * Add or remove a `mark` from the characters at `range`, depending on whether\n * it's already there.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Mixed} mark\n */\n\nCommands.toggleMarkAtRange = (editor, range, mark) => {\n if (range.isCollapsed) return\n\n mark = Mark.create(mark)\n\n const { value } = editor\n const { document } = value\n const marks = document.getActiveMarksAtRange(range)\n const exists = marks.some(m => m.equals(mark))\n\n if (exists) {\n editor.removeMarkAtRange(range, mark)\n } else {\n editor.addMarkAtRange(range, mark)\n }\n}\n\n/**\n * Unwrap all of the block nodes in a `range` from a block with `properties`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {String|Object} properties\n */\n\nCommands.unwrapBlockAtRange = (editor, range, properties) => {\n properties = Node.createProperties(properties)\n\n const { value } = editor\n let { document } = value\n const blocks = document.getLeafBlocksAtRange(range)\n const wrappers = blocks\n .map(block => {\n return document.getClosest(block.key, parent => {\n if (parent.object !== 'block') return false\n if (properties.type != null && parent.type !== properties.type)\n return false\n if (properties.data != null && !parent.data.isSuperset(properties.data))\n return false\n return true\n })\n })\n .filter(exists => exists)\n .toOrderedSet()\n .toList()\n\n editor.withoutNormalizing(() => {\n wrappers.forEach(block => {\n const first = block.nodes.first()\n const last = block.nodes.last()\n const parent = editor.value.document.getParent(block.key)\n const index = parent.nodes.indexOf(block)\n\n const children = block.nodes.filter(child => {\n return blocks.some(b => child === b || child.hasDescendant(b.key))\n })\n\n const firstMatch = children.first()\n const lastMatch = children.last()\n\n if (first === firstMatch && last === lastMatch) {\n block.nodes.forEach((child, i) => {\n editor.moveNodeByKey(child.key, parent.key, index + i)\n })\n\n editor.removeNodeByKey(block.key)\n } else if (last === lastMatch) {\n block.nodes.skipUntil(n => n === firstMatch).forEach((child, i) => {\n editor.moveNodeByKey(child.key, parent.key, index + 1 + i)\n })\n } else if (first === firstMatch) {\n block.nodes\n .takeUntil(n => n === lastMatch)\n .push(lastMatch)\n .forEach((child, i) => {\n editor.moveNodeByKey(child.key, parent.key, index + i)\n })\n } else {\n const firstText = firstMatch.getFirstText()\n\n editor.splitDescendantsByKey(block.key, firstText.key, 0)\n\n document = editor.value.document\n\n children.forEach((child, i) => {\n if (i === 0) {\n const extra = child\n child = document.getNextBlock(child.key)\n editor.removeNodeByKey(extra.key)\n }\n\n editor.moveNodeByKey(child.key, parent.key, index + 1 + i)\n })\n }\n })\n })\n}\n\n/**\n * Unwrap the inline nodes in a `range` from an inline with `properties`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {String|Object} properties\n */\n\nCommands.unwrapInlineAtRange = (editor, range, properties) => {\n properties = Node.createProperties(properties)\n\n const { value } = editor\n const { document } = value\n const texts = document.getTextsAtRange(range)\n const inlines = texts\n .map(text => {\n return document.getClosest(text.key, parent => {\n if (parent.object !== 'inline') return false\n if (properties.type != null && parent.type !== properties.type)\n return false\n if (properties.data != null && !parent.data.isSuperset(properties.data))\n return false\n return true\n })\n })\n .filter(exists => exists)\n .toOrderedSet()\n .toList()\n\n editor.withoutNormalizing(() => {\n inlines.forEach(inline => {\n const parent = editor.value.document.getParent(inline.key)\n const index = parent.nodes.indexOf(inline)\n\n inline.nodes.forEach((child, i) => {\n editor.moveNodeByKey(child.key, parent.key, index + i)\n })\n\n editor.removeNodeByKey(inline.key)\n })\n })\n}\n\n/**\n * Wrap all of the blocks in a `range` in a new `block`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Block|Object|String} block\n */\n\nCommands.wrapBlockAtRange = (editor, range, block) => {\n block = Block.create(block)\n block = block.set('nodes', block.nodes.clear())\n\n const { value } = editor\n const { document } = value\n\n const blocks = document.getLeafBlocksAtRange(range)\n const firstblock = blocks.first()\n const lastblock = blocks.last()\n let parent, siblings, index\n\n // If there is only one block in the selection then we know the parent and\n // siblings.\n if (blocks.length === 1) {\n parent = document.getParent(firstblock.key)\n siblings = blocks\n } else {\n // Determine closest shared parent to all blocks in selection.\n parent = document.getClosest(firstblock.key, p1 => {\n return !!document.getClosest(lastblock.key, p2 => p1 === p2)\n })\n }\n\n // If no shared parent could be found then the parent is the document.\n if (parent == null) parent = document\n\n // Create a list of direct children siblings of parent that fall in the\n // selection.\n if (siblings == null) {\n const indexes = parent.nodes.reduce((ind, node, i) => {\n if (node === firstblock || node.hasDescendant(firstblock.key)) ind[0] = i\n if (node === lastblock || node.hasDescendant(lastblock.key)) ind[1] = i\n return ind\n }, [])\n\n index = indexes[0]\n siblings = parent.nodes.slice(indexes[0], indexes[1] + 1)\n }\n\n // Get the index to place the new wrapped node at.\n if (index == null) {\n index = parent.nodes.indexOf(siblings.first())\n }\n\n editor.withoutNormalizing(() => {\n // Inject the new block node into the parent.\n editor.insertNodeByKey(parent.key, index, block)\n\n // Move the sibling nodes into the new block node.\n siblings.forEach((node, i) => {\n editor.moveNodeByKey(node.key, block.key, i)\n })\n })\n}\n\n/**\n * Wrap the text and inlines in a `range` in a new `inline`.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {Inline|Object|String} inline\n */\n\nCommands.wrapInlineAtRange = (editor, range, inline) => {\n const { value } = editor\n let { document } = value\n const { start, end } = range\n\n if (range.isCollapsed) {\n // Wrapping an inline void\n const inlineParent = document.getClosestInline(start.path)\n\n if (!inlineParent) {\n return\n }\n\n if (!editor.isVoid(inlineParent)) {\n return\n }\n\n return editor.wrapInlineByKey(inlineParent.key, inline)\n }\n\n inline = Inline.create(inline)\n inline = inline.set('nodes', inline.nodes.clear())\n\n const blocks = document.getLeafBlocksAtRange(range)\n let startBlock = document.getClosestBlock(start.path)\n let endBlock = document.getClosestBlock(end.path)\n const startInline = document.getClosestInline(start.path)\n const endInline = document.getClosestInline(end.path)\n let startChild = startBlock.getFurthestChild(start.key)\n let endChild = endBlock.getFurthestChild(end.key)\n\n editor.withoutNormalizing(() => {\n if (!startInline || startInline !== endInline) {\n editor.splitDescendantsByKey(endChild.key, end.key, end.offset)\n editor.splitDescendantsByKey(startChild.key, start.key, start.offset)\n }\n\n document = editor.value.document\n startBlock = document.getDescendant(startBlock.key)\n endBlock = document.getDescendant(endBlock.key)\n startChild = startBlock.getFurthestChild(start.key)\n endChild = endBlock.getFurthestChild(end.key)\n const startIndex = startBlock.nodes.indexOf(startChild)\n const endIndex = endBlock.nodes.indexOf(endChild)\n\n if (startInline && startInline === endInline) {\n const texts = startBlock.getTextsAtRange(range).map(text => {\n if (start.key === text.key && end.key === text.key) {\n return text\n .splitText(start.offset)[1]\n .splitText(end.offset - start.offset)[0]\n .regenerateKey()\n } else if (start.key === text.key) {\n return text.splitText(start.offset)[1].regenerateKey()\n } else if (end.key === text.key) {\n return text.splitText(end.offset)[0].regenerateKey()\n } else {\n return text.regenerateKey()\n }\n })\n\n inline = inline.set('nodes', texts)\n editor.insertInlineAtRange(range, inline)\n } else if (startBlock === endBlock) {\n document = editor.value.document\n startBlock = document.getClosestBlock(start.key)\n startChild = startBlock.getFurthestChild(start.key)\n\n const startInner = document.getNextSibling(startChild.key)\n const startInnerIndex = startBlock.nodes.indexOf(startInner)\n const endInner =\n start.key === end.key\n ? startInner\n : startBlock.getFurthestChild(end.key)\n const inlines = startBlock.nodes\n .skipUntil(n => n === startInner)\n .takeUntil(n => n === endInner)\n .push(endInner)\n\n const node = inline.regenerateKey()\n\n editor.insertNodeByKey(startBlock.key, startInnerIndex, node)\n\n inlines.forEach((child, i) => {\n editor.moveNodeByKey(child.key, node.key, i)\n })\n } else {\n const startInlines = startBlock.nodes.slice(startIndex + 1)\n const endInlines = endBlock.nodes.slice(0, endIndex + 1)\n const startNode = inline.regenerateKey()\n const endNode = inline.regenerateKey()\n\n editor.insertNodeByKey(startBlock.key, startIndex + 1, startNode)\n editor.insertNodeByKey(endBlock.key, endIndex, endNode)\n\n startInlines.forEach((child, i) => {\n editor.moveNodeByKey(child.key, startNode.key, i)\n })\n\n endInlines.forEach((child, i) => {\n editor.moveNodeByKey(child.key, endNode.key, i)\n })\n\n blocks.slice(1, -1).forEach(block => {\n const node = inline.regenerateKey()\n editor.insertNodeByKey(block.key, 0, node)\n\n block.nodes.forEach((child, i) => {\n editor.moveNodeByKey(child.key, node.key, i)\n })\n })\n }\n })\n}\n\n/**\n * Wrap the text in a `range` in a prefix/suffix.\n *\n * @param {Editor} editor\n * @param {Range} range\n * @param {String} prefix\n * @param {String} suffix (optional)\n */\n\nCommands.wrapTextAtRange = (editor, range, prefix, suffix = prefix) => {\n const { start, end } = range\n const startRange = range.moveToStart()\n let endRange = range.moveToEnd()\n\n if (start.path.equals(end.path)) {\n endRange = endRange.moveForward(prefix.length)\n }\n\n editor.withoutNormalizing(() => {\n editor.insertTextAtRange(startRange, prefix)\n editor.insertTextAtRange(endRange, suffix)\n })\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default Commands\n","import pick from 'lodash/pick'\nimport Block from '../models/block'\nimport Inline from '../models/inline'\nimport Mark from '../models/mark'\nimport Node from '../models/node'\nimport PathUtils from '../utils/path-utils'\n\n/**\n * Commands.\n *\n * @type {Object}\n */\n\nconst Commands = {}\n\n/**\n * Add mark to text at `offset` and `length` in node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} offset\n * @param {Number} length\n * @param {Mixed} mark\n */\n\nCommands.addMarkByPath = (editor, path, offset, length, mark) => {\n mark = Mark.create(mark)\n editor.addMarksByPath(path, offset, length, [mark])\n}\n\nCommands.addMarksByPath = (editor, path, offset, length, marks) => {\n marks = Mark.createSet(marks)\n\n if (!marks.size) {\n return\n }\n\n const { value } = editor\n const { document } = value\n const node = document.assertNode(path)\n\n editor.withoutNormalizing(() => {\n // If it ends before the end of the node, we'll need to split to create a new\n // text with different marks.\n if (offset + length < node.text.length) {\n editor.splitNodeByPath(path, offset + length)\n }\n\n // Same thing if it starts after the start. But in that case, we need to\n // update our path and offset to point to the new start.\n if (offset > 0) {\n editor.splitNodeByPath(path, offset)\n path = PathUtils.increment(path)\n offset = 0\n }\n\n marks.forEach(mark => {\n editor.applyOperation({\n type: 'add_mark',\n path,\n mark: Mark.create(mark),\n })\n })\n })\n}\n\n/**\n * Sets specific set of marks on the path\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} offset\n * @param {Number} length\n * @param {Array<Object|Mark>} marks\n */\n\nCommands.replaceMarksByPath = (editor, path, offset, length, marks) => {\n const marksSet = Mark.createSet(marks)\n\n const { value } = editor\n const { document } = value\n const node = document.assertNode(path)\n\n if (node.marks.equals(marksSet)) {\n return\n }\n\n editor.withoutNormalizing(() => {\n // If it ends before the end of the node, we'll need to split to create a new\n // text with different marks.\n if (offset + length < node.text.length) {\n editor.splitNodeByPath(path, offset + length)\n }\n\n // Same thing if it starts after the start. But in that case, we need to\n // update our path and offset to point to the new start.\n if (offset > 0) {\n editor.splitNodeByPath(path, offset)\n path = PathUtils.increment(path)\n offset = 0\n }\n\n const marksToApply = marksSet.subtract(node.marks)\n const marksToRemove = node.marks.subtract(marksSet)\n\n marksToRemove.forEach(mark => {\n editor.applyOperation({\n type: 'remove_mark',\n path,\n mark: Mark.create(mark),\n })\n })\n\n marksToApply.forEach(mark => {\n editor.applyOperation({\n type: 'add_mark',\n path,\n mark: Mark.create(mark),\n })\n })\n })\n}\n\n/**\n * Insert a `fragment` at `index` in a node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} index\n * @param {Fragment} fragment\n */\n\nCommands.insertFragmentByPath = (editor, path, index, fragment) => {\n fragment.nodes.forEach((node, i) => {\n editor.insertNodeByPath(path, index + i, node)\n })\n}\n\n/**\n * Insert a `node` at `index` in a node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} index\n * @param {Node} node\n */\n\nCommands.insertNodeByPath = (editor, path, index, node) => {\n editor.applyOperation({\n type: 'insert_node',\n path: path.concat(index),\n node,\n })\n}\n\n/**\n * Insert `text` at `offset` in node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} offset\n * @param {String} text\n * @param {Set<Mark>} marks (optional)\n */\n\nCommands.insertTextByPath = (editor, path, offset, text, marks) => {\n const { value } = editor\n const { annotations, document } = value\n document.assertNode(path)\n\n editor.withoutNormalizing(() => {\n for (const annotation of annotations.values()) {\n const { start, end } = annotation\n const isAtomic = editor.isAtomic(annotation)\n\n if (!isAtomic) {\n continue\n }\n\n if (!start.path.equals(path)) {\n continue\n }\n\n if (\n start.offset < offset &&\n (!end.path.equals(path) || end.offset > offset)\n ) {\n editor.removeAnnotation(annotation)\n }\n }\n\n editor.applyOperation({\n type: 'insert_text',\n path,\n offset,\n text,\n })\n\n if (marks) {\n editor.replaceMarksByPath(path, offset, text.length, marks)\n }\n })\n}\n\n/**\n * Merge a node by `path` with the previous node.\n *\n * @param {Editor} editor\n * @param {Array} path\n */\n\nCommands.mergeNodeByPath = (editor, path) => {\n const { value } = editor\n const { document } = value\n const original = document.getDescendant(path)\n const previous = document.getPreviousSibling(path)\n\n if (!previous) {\n throw new Error(\n `Unable to merge node with path \"${path}\", because it has no previous sibling.`\n )\n }\n\n const position =\n previous.object === 'text' ? previous.text.length : previous.nodes.size\n\n editor.applyOperation({\n type: 'merge_node',\n path,\n position,\n // for undos to succeed we only need the type and data because\n // these are the only properties that get changed in the merge operation\n properties: {\n type: original.type,\n data: original.data,\n },\n target: null,\n })\n}\n\n/**\n * Move a node by `path` to a new parent by `newParentPath` and `newIndex`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {String} newParentPath\n * @param {Number} newIndex\n */\n\nCommands.moveNodeByPath = (editor, path, newParentPath, newIndex) => {\n // If the operation path and newParentPath are the same,\n // this should be considered a NOOP\n if (PathUtils.isEqual(path, newParentPath)) {\n return editor\n }\n\n const newPath = newParentPath.concat(newIndex)\n\n if (PathUtils.isEqual(path, newPath)) {\n return editor\n }\n\n editor.applyOperation({\n type: 'move_node',\n path,\n newPath,\n })\n}\n\n/**\n * Remove mark from text at `offset` and `length` in node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} offset\n * @param {Number} length\n * @param {Mark} mark\n */\n\nCommands.removeMarkByPath = (editor, path, offset, length, mark) => {\n mark = Mark.create(mark)\n editor.removeMarksByPath(path, offset, length, [mark])\n}\n\nCommands.removeMarksByPath = (editor, path, offset, length, marks) => {\n marks = Mark.createSet(marks)\n\n if (!marks.size) {\n return\n }\n\n const { value } = editor\n const { document } = value\n const node = document.assertNode(path)\n\n if (marks.intersect(node.marks).isEmpty()) {\n return\n }\n\n editor.withoutNormalizing(() => {\n // If it ends before the end of the node, we'll need to split to create a new\n // text with different marks.\n if (offset + length < node.text.length) {\n editor.splitNodeByPath(path, offset + length)\n }\n\n // Same thing if it starts after the start. But in that case, we need to\n // update our path and offset to point to the new start.\n if (offset > 0) {\n editor.splitNodeByPath(path, offset)\n path = PathUtils.increment(path)\n offset = 0\n }\n\n marks.forEach(mark => {\n editor.applyOperation({\n type: 'remove_mark',\n path,\n offset,\n length,\n mark,\n })\n })\n })\n}\n\n/**\n * Remove all `marks` from node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n */\n\nCommands.removeAllMarksByPath = (editor, path) => {\n const { state } = editor\n const { document } = state\n const node = document.assertNode(path)\n\n editor.withoutNormalizing(() => {\n if (node.object === 'text') {\n editor.removeMarksByPath(path, 0, node.text.length, node.marks)\n return\n }\n\n for (const [n, p] of node.texts()) {\n const pth = path.concat(p)\n editor.removeMarksByPath(pth, 0, n.text.length, n.marks)\n }\n })\n}\n\n/**\n * Remove a node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n */\n\nCommands.removeNodeByPath = (editor, path) => {\n const { value } = editor\n const { document } = value\n const node = document.assertNode(path)\n\n editor.applyOperation({\n type: 'remove_node',\n path,\n node,\n })\n}\n\n/**\n * Remove text at `offset` and `length` in node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} offset\n * @param {Number} length\n */\n\nCommands.removeTextByPath = (editor, path, offset, length) => {\n const { value } = editor\n const { document, annotations } = value\n const node = document.assertNode(path)\n const text = node.text.slice(offset, offset + length)\n\n editor.withoutNormalizing(() => {\n for (const annotation of annotations.values()) {\n const { start, end } = annotation\n const isAtomic = editor.isAtomic(annotation)\n\n if (!isAtomic) {\n continue\n }\n\n if (!start.path.equals(path)) {\n continue\n }\n\n if (\n start.offset < offset &&\n (!end.path.equals(path) || end.offset > offset)\n ) {\n editor.removeAnnotation(annotation)\n }\n }\n\n editor.applyOperation({\n type: 'remove_text',\n path,\n offset,\n text,\n })\n })\n}\n\n/**\n`* Replace a `node` with another `node`\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Object|Node} node\n */\n\nCommands.replaceNodeByPath = (editor, path, newNode) => {\n newNode = Node.create(newNode)\n const index = path.last()\n const parentPath = PathUtils.lift(path)\n\n editor.withoutNormalizing(() => {\n editor.removeNodeByPath(path)\n editor.insertNodeByPath(parentPath, index, newNode)\n })\n}\n\n/**\n * Replace a `length` of text at `offset` with new `text` and optional `marks`.\n *\n * @param {Editor} editor\n * @param {String} key\n * @param {Number} offset\n * @param {Number} length\n * @param {string} text\n * @param {Set<Mark>} marks (optional)\n */\n\nCommands.replaceTextByPath = (editor, path, offset, length, text, marks) => {\n editor.withoutNormalizing(() => {\n editor.removeTextByPath(path, offset, length)\n editor.insertTextByPath(path, offset, text, marks)\n })\n}\n\n/**\n * Set `newProperties` on mark on text at `offset` and `length` in node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} offset\n * @param {Number} length\n * @param {Object|Mark} properties\n * @param {Object} newProperties\n */\n\nCommands.setMarkByPath = (\n editor,\n path,\n offset,\n length,\n properties,\n newProperties\n) => {\n properties = Mark.create(properties)\n newProperties = Mark.createProperties(newProperties)\n\n const { value } = editor\n const { document } = value\n const node = document.assertNode(path)\n\n editor.withoutNormalizing(() => {\n // If it ends before the end of the node, we'll need to split to create a new\n // text with different marks.\n if (offset + length < node.text.length) {\n editor.splitNodeByPath(path, offset + length)\n }\n\n // Same thing if it starts after the start. But in that case, we need to\n // update our path and offset to point to the new start.\n if (offset > 0) {\n editor.splitNodeByPath(path, offset)\n path = PathUtils.increment(path)\n offset = 0\n }\n\n editor.applyOperation({\n type: 'set_mark',\n path,\n properties,\n newProperties,\n })\n })\n}\n\n/**\n * Set `properties` on a node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Object|String} newProperties\n */\n\nCommands.setNodeByPath = (editor, path, newProperties) => {\n const { value } = editor\n const { document } = value\n const node = document.assertNode(path)\n newProperties = Node.createProperties(newProperties)\n const prevProperties = pick(node, Object.keys(newProperties))\n\n editor.applyOperation({\n type: 'set_node',\n path,\n properties: prevProperties,\n newProperties,\n })\n}\n\n/**\n * Insert `text` at `offset` in node by `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {String} text\n * @param {Set<Mark>} marks (optional)\n */\n\nCommands.setTextByPath = (editor, path, text, marks) => {\n const { value } = editor\n const { document } = value\n const node = document.assertNode(path)\n const end = node.text.length\n editor.replaceTextByPath(path, 0, end, text, marks)\n}\n\n/**\n * Split a node by `path` at `position`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Number} position\n * @param {Object} options\n */\n\nCommands.splitNodeByPath = (editor, path, position, options = {}) => {\n const { target = null } = options\n const { value } = editor\n const { document } = value\n const node = document.getDescendant(path)\n\n editor.applyOperation({\n type: 'split_node',\n path,\n position,\n target,\n properties: {\n type: node.type,\n data: node.data,\n },\n })\n}\n\n/**\n * Split a node deeply down the tree by `path`, `textPath` and `textOffset`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Array} textPath\n * @param {Number} textOffset\n */\n\nCommands.splitDescendantsByPath = (editor, path, textPath, textOffset) => {\n if (path.equals(textPath)) {\n editor.splitNodeByPath(textPath, textOffset)\n return\n }\n\n const { value } = editor\n const { document } = value\n let index = textOffset\n let lastPath = textPath\n\n editor.withoutNormalizing(() => {\n editor.splitNodeByKey(textPath, textOffset)\n\n for (const [, ancestorPath] of document.ancestors(textPath)) {\n const target = index\n index = lastPath.last() + 1\n lastPath = ancestorPath\n editor.splitNodeByPath(ancestorPath, index, { target })\n\n if (ancestorPath.equals(path)) {\n break\n }\n }\n })\n}\n\n/**\n * Unwrap content from an inline parent with `properties`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Object|String} properties\n */\n\nCommands.unwrapInlineByPath = (editor, path, properties) => {\n const { value } = editor\n const { document, selection } = value\n const node = document.assertNode(path)\n const first = node.getFirstText()\n const last = node.getLastText()\n const range = selection.moveToRangeOfNode(first, last)\n editor.unwrapInlineAtRange(range, properties)\n}\n\n/**\n * Unwrap content from a block parent with `properties`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Object|String} properties\n */\n\nCommands.unwrapBlockByPath = (editor, path, properties) => {\n const { value } = editor\n const { document, selection } = value\n const node = document.assertNode(path)\n const first = node.getFirstText()\n const last = node.getLastText()\n const range = selection.moveToRangeOfNode(first, last)\n editor.unwrapBlockAtRange(range, properties)\n}\n\n/**\n * Unwrap a single node from its parent.\n *\n * If the node is surrounded with siblings, its parent will be\n * split. If the node is the only child, the parent is removed, and\n * simply replaced by the node itself. Cannot unwrap a root node.\n *\n * @param {Editor} editor\n * @param {Array} path\n */\n\nCommands.unwrapNodeByPath = (editor, path) => {\n const { value } = editor\n const { document } = value\n document.assertNode(path)\n\n const parentPath = PathUtils.lift(path)\n const parent = document.assertNode(parentPath)\n const index = path.last()\n const parentIndex = parentPath.last()\n const grandPath = PathUtils.lift(parentPath)\n const isFirst = index === 0\n const isLast = index === parent.nodes.size - 1\n\n editor.withoutNormalizing(() => {\n if (parent.nodes.size === 1) {\n editor.moveNodeByPath(path, grandPath, parentIndex + 1)\n editor.removeNodeByPath(parentPath)\n } else if (isFirst) {\n editor.moveNodeByPath(path, grandPath, parentIndex)\n } else if (isLast) {\n editor.moveNodeByPath(path, grandPath, parentIndex + 1)\n } else {\n let updatedPath = PathUtils.increment(path, 1, parentPath.size - 1)\n updatedPath = updatedPath.set(updatedPath.size - 1, 0)\n editor.splitNodeByPath(parentPath, index)\n editor.moveNodeByPath(updatedPath, grandPath, parentIndex + 1)\n }\n })\n}\n\n/**\n * Unwrap all of the children of a node, by removing the node and replacing it\n * with the children in the tree.\n *\n * @param {Editor} editor\n * @param {Array} path\n */\n\nCommands.unwrapChildrenByPath = (editor, path) => {\n path = PathUtils.create(path)\n const { value } = editor\n const { document } = value\n const node = document.assertNode(path)\n const parentPath = PathUtils.lift(path)\n const index = path.last()\n const { nodes } = node\n\n editor.withoutNormalizing(() => {\n nodes.reverse().forEach((child, i) => {\n const childIndex = nodes.size - i - 1\n const childPath = path.push(childIndex)\n editor.moveNodeByPath(childPath, parentPath, index + 1)\n })\n\n editor.removeNodeByPath(path)\n })\n}\n\n/**\n * Wrap a node in a block with `properties`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Block|Object|String} block\n */\n\nCommands.wrapBlockByPath = (editor, path, block) => {\n block = Block.create(block)\n block = block.set('nodes', block.nodes.clear())\n const parentPath = PathUtils.lift(path)\n const index = path.last()\n const newPath = PathUtils.increment(path)\n\n editor.withoutNormalizing(() => {\n editor.insertNodeByPath(parentPath, index, block)\n editor.moveNodeByPath(newPath, path, 0)\n })\n}\n\n/**\n * Wrap a node in an inline with `properties`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Block|Object|String} inline\n */\n\nCommands.wrapInlineByPath = (editor, path, inline) => {\n inline = Inline.create(inline)\n inline = inline.set('nodes', inline.nodes.clear())\n const parentPath = PathUtils.lift(path)\n const index = path.last()\n const newPath = PathUtils.increment(path)\n\n editor.withoutNormalizing(() => {\n editor.insertNodeByPath(parentPath, index, inline)\n editor.moveNodeByPath(newPath, path, 0)\n })\n}\n\n/**\n * Wrap a node by `path` with `node`.\n *\n * @param {Editor} editor\n * @param {Array} path\n * @param {Node|Object} node\n */\n\nCommands.wrapNodeByPath = (editor, path, node) => {\n node = Node.create(node)\n\n if (node.object === 'block') {\n editor.wrapBlockByPath(path, node)\n } else if (node.object === 'inline') {\n editor.wrapInlineByPath(path, node)\n }\n}\n\n/**\n * Mix in `*ByKey` variants.\n */\n\nconst COMMANDS = [\n 'addMark',\n 'insertFragment',\n 'insertNode',\n 'insertText',\n 'mergeNode',\n 'removeAllMarks',\n 'removeMark',\n 'removeNode',\n 'removeText',\n 'replaceMarks',\n 'replaceNode',\n 'replaceText',\n 'setMark',\n 'setNode',\n 'setText',\n 'splitNode',\n 'unwrapBlock',\n 'unwrapChildren',\n 'unwrapInline',\n 'unwrapNode',\n 'wrapBlock',\n 'wrapInline',\n 'wrapNode',\n]\n\nfor (const method of COMMANDS) {\n Commands[`${method}ByKey`] = (editor, key, ...args) => {\n const { value } = editor\n const { document } = value\n const path = document.assertPath(key)\n editor[`${method}ByPath`](path, ...args)\n }\n}\n\n// Moving nodes takes two keys, so it's slightly different.\nCommands.moveNodeByKey = (editor, key, newKey, ...args) => {\n const { value } = editor\n const { document } = value\n const path = document.assertPath(key)\n const newPath = document.assertPath(newKey)\n editor.moveNodeByPath(path, newPath, ...args)\n}\n\n// Splitting descendants takes two keys, so it's slightly different.\nCommands.splitDescendantsByKey = (editor, key, textKey, ...args) => {\n const { value } = editor\n const { document } = value\n const path = document.assertPath(key)\n const textPath = document.assertPath(textKey)\n editor.splitDescendantsByPath(path, textPath, ...args)\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default Commands\n","import omit from 'lodash/omit'\nimport { List } from 'immutable'\n\n/**\n * Commands.\n *\n * @type {Object}\n */\n\nconst Commands = {}\n\n/**\n * Save an `operation` into the history.\n *\n * @param {Editor} editor\n * @param {Object} operation\n */\n\nCommands.save = (editor, operation) => {\n const { operations, value } = editor\n const { data } = value\n let { save, merge } = editor.tmp\n if (save === false || !isValidOperation(operation)) return\n\n let undos = data.get('undos') || List()\n const lastBatch = undos.last()\n const lastOperation = lastBatch && lastBatch.last()\n\n // If `merge` is non-commital, and this is not the first operation in a new\n // editor, then merge, otherwise merge based on the last operation.\n if (merge == null) {\n if (operations.size !== 0) {\n merge = true\n } else {\n merge = shouldMerge(operation, lastOperation)\n }\n }\n\n // If the `merge` flag is true, add the operation to the last batch.\n if (merge && lastBatch) {\n const batch = lastBatch.push(operation)\n undos = undos.pop()\n undos = undos.push(batch)\n } else {\n // Otherwise, create a new batch with the operation.\n const batch = List([operation])\n undos = undos.push(batch)\n }\n\n // Constrain the history to 100 entries for memory's sake.\n if (undos.size > 100) {\n undos = undos.takeLast(100)\n }\n\n // Clear the redos and update the history.\n editor.withoutSaving(() => {\n const redos = List()\n const newData = data.set('undos', undos).set('redos', redos)\n editor.setData(newData)\n })\n}\n\n/**\n * Redo to the next value in the history.\n *\n * @param {Editor} editor\n */\n\nCommands.redo = editor => {\n const { value } = editor\n const { data } = value\n let redos = data.get('redos') || List()\n let undos = data.get('undos') || List()\n const batch = redos.last()\n if (!batch) return\n\n editor.withoutSaving(() => {\n editor.withoutNormalizing(() => {\n // Replay the batch of operations.\n batch.forEach(op => {\n const { type, newProperties } = op\n\n // When the operation mutates the selection, omit its `isFocused` value to\n // prevent the editor focus from changing during redoing.\n if (type === 'set_selection') {\n op = op.set('newProperties', omit(newProperties, 'isFocused'))\n }\n\n editor.applyOperation(op)\n })\n\n // Shift the next value into the undo stack.\n redos = redos.pop()\n undos = undos.push(batch)\n const newData = data.set('undos', undos).set('redos', redos)\n editor.setData(newData)\n })\n })\n}\n\n/**\n * Undo the previous operations in the history.\n *\n * @param {Editor} editor\n */\n\nCommands.undo = editor => {\n const { value } = editor\n const { data } = value\n let redos = data.get('redos') || List()\n let undos = data.get('undos') || List()\n const batch = undos.last()\n if (!batch) return\n\n editor.withoutSaving(() => {\n editor.withoutNormalizing(() => {\n // Replay the inverse of the previous operations.\n batch\n .slice()\n .reverse()\n .map(op => op.invert())\n .forEach(inverse => {\n const { type, newProperties } = inverse\n\n // When the operation mutates the selection, omit its `isFocused` value to\n // prevent the editor focus from changing during undoing.\n if (type === 'set_selection') {\n inverse = inverse.set(\n 'newProperties',\n omit(newProperties, 'isFocused')\n )\n }\n\n editor.applyOperation(inverse)\n })\n\n // Shift the previous operations into the redo stack.\n redos = redos.push(batch)\n undos = undos.pop()\n const newData = data.set('undos', undos).set('redos', redos)\n editor.setData(newData)\n })\n })\n}\n\n/**\n * Apply a series of changes inside a synchronous `fn`, without merging any of\n * the new operations into previous save point in the history.\n *\n * @param {Editor} editor\n * @param {Function} fn\n */\n\nCommands.withoutMerging = (editor, fn) => {\n const value = editor.tmp.merge\n editor.tmp.merge = false\n fn(editor)\n editor.tmp.merge = value\n}\n\n/**\n * Apply a series of changes inside a synchronous `fn`, without saving any of\n * their operations into the history.\n *\n * @param {Editor} editor\n * @param {Function} fn\n */\n\nCommands.withoutSaving = (editor, fn) => {\n const value = editor.tmp.save\n editor.tmp.save = false\n fn(editor)\n editor.tmp.save = value\n}\n\n/**\n * Check whether to merge a new operation `o` into the previous operation `p`.\n *\n * @param {Object} o\n * @param {Object} p\n * @return {Boolean}\n */\n\nfunction shouldMerge(o, p) {\n if (!p) return false\n\n const merge =\n (o.type === 'set_selection' && p.type === 'set_selection') ||\n (o.type === 'insert_text' &&\n p.type === 'insert_text' &&\n o.offset === p.offset + p.text.length &&\n o.path.equals(p.path)) ||\n (o.type === 'remove_text' &&\n p.type === 'remove_text' &&\n o.offset + o.text.length === p.offset &&\n o.path.equals(p.path))\n\n return merge\n}\n\n/**\n * Check weather an operation needs to be saved to the history\n * @param {Object} o - operation\n * @returns {Boolean}\n */\n\nfunction isValidOperation(o) {\n if (o.type === 'set_selection') {\n const { isFocused, anchor, focus } = o.newProperties\n\n // this is blur/focus operation, dont need to store it into the history\n if (isFocused !== undefined && !anchor && !focus) {\n return false\n }\n }\n return true\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default Commands\n","import { is } from 'immutable'\nimport pick from 'lodash/pick'\n\nimport Selection from '../models/selection'\nimport TextUtils from '../utils/text-utils'\n\nconst Commands = {}\n\nCommands.blur = editor => {\n editor.select({ isFocused: false })\n}\n\nCommands.deselect = editor => {\n const range = Selection.create()\n editor.select(range)\n}\n\nCommands.focus = editor => {\n editor.select({ isFocused: true })\n}\n\nCommands.flip = editor => {\n editor.command(proxy, 'flip')\n}\n\nCommands.moveAnchorBackward = (editor, ...args) => {\n editor.command(pointBackward, 'anchor', ...args)\n}\n\nCommands.moveAnchorWordBackward = (editor, ...args) => {\n editor.command(pointWordBackward, 'anchor', ...args)\n}\n\nCommands.moveAnchorForward = (editor, ...args) => {\n editor.command(pointForward, 'anchor', ...args)\n}\n\nCommands.moveAnchorWordForward = (editor, ...args) => {\n editor.command(pointWordForward, 'anchor', ...args)\n}\n\nCommands.moveAnchorTo = (editor, ...args) => {\n editor.command(proxy, 'moveAnchorTo', ...args)\n}\n\nCommands.moveAnchorToEndOfBlock = editor => {\n editor.command(pointEdgeObject, 'anchor', 'end', 'block')\n}\n\nCommands.moveAnchorToEndOfInline = editor => {\n editor.command(pointEdgeObject, 'anchor', 'end', 'inline')\n}\n\nCommands.moveAnchorToEndOfDocument = editor => {\n editor.moveAnchorToEndOfNode(editor.value.document).moveToAnchor()\n}\n\nCommands.moveAnchorToEndOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'end', 'next', 'block')\n}\n\nCommands.moveAnchorToEndOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'end', 'next', 'inline')\n}\n\nCommands.moveAnchorToEndOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'end', 'next', 'text')\n}\n\nCommands.moveAnchorToEndOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveAnchorToEndOfNode', ...args)\n}\n\nCommands.moveAnchorToEndOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'end', 'previous', 'block')\n}\n\nCommands.moveAnchorToEndOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'end', 'previous', 'inline')\n}\n\nCommands.moveAnchorToEndOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'end', 'previous', 'text')\n}\n\nCommands.moveAnchorToEndOfText = editor => {\n editor.command(pointEdgeObject, 'anchor', 'end', 'text')\n}\n\nCommands.moveAnchorToStartOfBlock = editor => {\n editor.command(pointEdgeObject, 'anchor', 'start', 'block')\n}\n\nCommands.moveAnchorToStartOfDocument = editor => {\n editor.moveAnchorToStartOfNode(editor.value.document).moveToAnchor()\n}\n\nCommands.moveAnchorToStartOfInline = editor => {\n editor.command(pointEdgeObject, 'anchor', 'start', 'inline')\n}\n\nCommands.moveAnchorToStartOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'start', 'next', 'block')\n}\n\nCommands.moveAnchorToStartOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'start', 'next', 'inline')\n}\n\nCommands.moveAnchorToStartOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'start', 'next', 'text')\n}\n\nCommands.moveAnchorToStartOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveAnchorToStartOfNode', ...args)\n}\n\nCommands.moveAnchorToStartOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'start', 'previous', 'block')\n}\n\nCommands.moveAnchorToStartOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'start', 'previous', 'inline')\n}\n\nCommands.moveAnchorToStartOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'anchor', 'start', 'previous', 'text')\n}\n\nCommands.moveAnchorToStartOfText = editor => {\n editor.command(pointEdgeObject, 'anchor', 'start', 'text')\n}\n\nCommands.moveBackward = (editor, ...args) => {\n editor.moveAnchorBackward(...args).moveFocusBackward(...args)\n}\n\nCommands.moveWordBackward = (editor, ...args) => {\n editor.moveFocusWordBackward(...args).moveToFocus()\n}\n\nCommands.moveEndBackward = (editor, ...args) => {\n editor.command(pointBackward, 'end', ...args)\n}\n\nCommands.moveEndWordBackward = (editor, ...args) => {\n editor.command(pointWordBackward, 'end', ...args)\n}\n\nCommands.moveEndForward = (editor, ...args) => {\n editor.command(pointForward, 'end', ...args)\n}\n\nCommands.moveEndWordForward = (editor, ...args) => {\n editor.command(pointWordForward, 'end', ...args)\n}\n\nCommands.moveEndTo = (editor, ...args) => {\n editor.command(proxy, 'moveEndTo', ...args)\n}\n\nCommands.moveEndToEndOfBlock = editor => {\n editor.command(pointEdgeObject, 'end', 'end', 'block')\n}\n\nCommands.moveEndToEndOfDocument = editor => {\n editor.moveEndToEndOfNode(editor.value.document).moveToEnd()\n}\n\nCommands.moveEndToEndOfInline = editor => {\n editor.command(pointEdgeObject, 'end', 'end', 'inline')\n}\n\nCommands.moveEndToEndOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'end', 'end', 'next', 'block')\n}\n\nCommands.moveEndToEndOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'end', 'end', 'next', 'inline')\n}\n\nCommands.moveEndToEndOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'end', 'end', 'next', 'text')\n}\n\nCommands.moveEndToEndOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveEndToEndOfNode', ...args)\n}\n\nCommands.moveEndToEndOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'end', 'end', 'previous', 'block')\n}\n\nCommands.moveEndToEndOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'end', 'end', 'previous', 'inline')\n}\n\nCommands.moveEndToEndOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'end', 'end', 'previous', 'text')\n}\n\nCommands.moveEndToEndOfText = editor => {\n editor.command(pointEdgeObject, 'end', 'end', 'text')\n}\n\nCommands.moveEndToStartOfBlock = editor => {\n editor.command(pointEdgeObject, 'end', 'start', 'block')\n}\n\nCommands.moveEndToStartOfDocument = editor => {\n editor.moveEndToStartOfNode(editor.value.document).moveToEnd()\n}\n\nCommands.moveEndToStartOfInline = editor => {\n editor.command(pointEdgeObject, 'end', 'start', 'inline')\n}\n\nCommands.moveEndToStartOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'end', 'start', 'next', 'block')\n}\n\nCommands.moveEndToStartOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'end', 'start', 'next', 'inline')\n}\n\nCommands.moveEndToStartOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'end', 'start', 'next', 'text')\n}\n\nCommands.moveEndToStartOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveEndToStartOfNode', ...args)\n}\n\nCommands.moveEndToStartOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'end', 'start', 'previous', 'block')\n}\n\nCommands.moveEndToStartOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'end', 'start', 'previous', 'inline')\n}\n\nCommands.moveEndToStartOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'end', 'start', 'previous', 'text')\n}\n\nCommands.moveEndToStartOfText = editor => {\n editor.command(pointEdgeObject, 'end', 'start', 'text')\n}\n\nCommands.moveFocusBackward = (editor, ...args) => {\n editor.command(pointBackward, 'focus', ...args)\n}\n\nCommands.moveFocusWordBackward = (editor, ...args) => {\n editor.command(pointWordBackward, 'focus', ...args)\n}\n\nCommands.moveFocusForward = (editor, ...args) => {\n editor.command(pointForward, 'focus', ...args)\n}\n\nCommands.moveFocusWordForward = (editor, ...args) => {\n editor.command(pointWordForward, 'focus', ...args)\n}\n\nCommands.moveFocusTo = (editor, ...args) => {\n editor.command(proxy, 'moveFocusTo', ...args)\n}\n\nCommands.moveFocusToEndOfBlock = editor => {\n editor.command(pointEdgeObject, 'focus', 'end', 'block')\n}\n\nCommands.moveFocusToEndOfDocument = editor => {\n editor.moveFocusToEndOfNode(editor.value.document).moveToFocus()\n}\n\nCommands.moveFocusToEndOfInline = editor => {\n editor.command(pointEdgeObject, 'focus', 'end', 'inline')\n}\n\nCommands.moveFocusToEndOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'end', 'next', 'block')\n}\n\nCommands.moveFocusToEndOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'end', 'next', 'inline')\n}\n\nCommands.moveFocusToEndOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'end', 'next', 'text')\n}\n\nCommands.moveFocusToEndOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveFocusToEndOfNode', ...args)\n}\n\nCommands.moveFocusToEndOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'end', 'previous', 'block')\n}\n\nCommands.moveFocusToEndOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'end', 'previous', 'inline')\n}\n\nCommands.moveFocusToEndOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'end', 'previous', 'text')\n}\n\nCommands.moveFocusToEndOfText = editor => {\n editor.command(pointEdgeObject, 'focus', 'end', 'text')\n}\n\nCommands.moveFocusToStartOfBlock = editor => {\n editor.command(pointEdgeObject, 'focus', 'start', 'block')\n}\n\nCommands.moveFocusToStartOfDocument = editor => {\n editor.moveFocusToStartOfNode(editor.value.document).moveToFocus()\n}\n\nCommands.moveFocusToStartOfInline = editor => {\n editor.command(pointEdgeObject, 'focus', 'start', 'inline')\n}\n\nCommands.moveFocusToStartOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'start', 'next', 'block')\n}\n\nCommands.moveFocusToStartOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'start', 'next', 'inline')\n}\n\nCommands.moveFocusToStartOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'start', 'next', 'text')\n}\n\nCommands.moveFocusToStartOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveFocusToStartOfNode', ...args)\n}\n\nCommands.moveFocusToStartOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'start', 'previous', 'block')\n}\n\nCommands.moveFocusToStartOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'start', 'previous', 'inline')\n}\n\nCommands.moveFocusToStartOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'focus', 'start', 'previous', 'text')\n}\n\nCommands.moveFocusToStartOfText = editor => {\n editor.command(pointEdgeObject, 'focus', 'start', 'text')\n}\n\nCommands.moveForward = (editor, ...args) => {\n editor.moveAnchorForward(...args).moveFocusForward(...args)\n}\n\nCommands.moveWordForward = (editor, ...args) => {\n editor.moveFocusWordForward(...args).moveToFocus(...args)\n}\n\nCommands.moveStartBackward = (editor, ...args) => {\n editor.command(pointBackward, 'start', ...args)\n}\n\nCommands.moveStartWordBackward = (editor, ...args) => {\n editor.command(pointWordBackward, 'start', ...args)\n}\n\nCommands.moveStartForward = (editor, ...args) => {\n editor.command(pointForward, 'start', ...args)\n}\n\nCommands.moveStartWordForward = (editor, ...args) => {\n editor.command(pointWordForward, 'start', ...args)\n}\n\nCommands.moveStartTo = (editor, ...args) => {\n editor.command(proxy, 'moveStartTo', ...args)\n}\n\nCommands.moveStartToEndOfBlock = editor => {\n editor.command(pointEdgeObject, 'start', 'end', 'block')\n}\n\nCommands.moveStartToEndOfDocument = editor => {\n editor.moveStartToEndOfNode(editor.value.document).moveToStart()\n}\n\nCommands.moveStartToEndOfInline = editor => {\n editor.command(pointEdgeObject, 'start', 'end', 'inline')\n}\n\nCommands.moveStartToEndOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'start', 'end', 'next', 'block')\n}\n\nCommands.moveStartToEndOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'start', 'end', 'next', 'inline')\n}\n\nCommands.moveStartToEndOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'start', 'end', 'next', 'text')\n}\n\nCommands.moveStartToEndOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveStartToEndOfNode', ...args)\n}\n\nCommands.moveStartToEndOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'start', 'end', 'previous', 'block')\n}\n\nCommands.moveStartToEndOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'start', 'end', 'previous', 'inline')\n}\n\nCommands.moveStartToEndOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'start', 'end', 'previous', 'text')\n}\n\nCommands.moveStartToEndOfText = editor => {\n editor.command(pointEdgeObject, 'start', 'end', 'text')\n}\n\nCommands.moveStartToStartOfBlock = editor => {\n editor.command(pointEdgeObject, 'start', 'start', 'block')\n}\n\nCommands.moveStartToStartOfDocument = editor => {\n editor.moveStartToStartOfNode(editor.value.document).moveToStart()\n}\n\nCommands.moveStartToStartOfInline = editor => {\n editor.command(pointEdgeObject, 'start', 'start', 'inline')\n}\n\nCommands.moveStartToStartOfNextBlock = editor => {\n editor.command(pointEdgeSideObject, 'start', 'start', 'next', 'block')\n}\n\nCommands.moveStartToStartOfNextInline = editor => {\n editor.command(pointEdgeSideObject, 'start', 'start', 'next', 'inline')\n}\n\nCommands.moveStartToStartOfNextText = editor => {\n editor.command(pointEdgeSideObject, 'start', 'start', 'next', 'text')\n}\n\nCommands.moveStartToStartOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveStartToStartOfNode', ...args)\n}\n\nCommands.moveStartToStartOfPreviousBlock = editor => {\n editor.command(pointEdgeSideObject, 'start', 'start', 'previous', 'block')\n}\n\nCommands.moveStartToStartOfPreviousInline = editor => {\n editor.command(pointEdgeSideObject, 'start', 'start', 'previous', 'inline')\n}\n\nCommands.moveStartToStartOfPreviousText = editor => {\n editor.command(pointEdgeSideObject, 'start', 'start', 'previous', 'text')\n}\n\nCommands.moveStartToStartOfText = editor => {\n editor.command(pointEdgeObject, 'start', 'start', 'text')\n}\n\nCommands.moveTo = (editor, ...args) => {\n editor.command(proxy, 'moveTo', ...args)\n}\n\nCommands.moveToAnchor = editor => {\n editor.command(proxy, 'moveToAnchor')\n}\n\nCommands.moveToEnd = editor => {\n editor.command(proxy, 'moveToEnd')\n}\n\nCommands.moveToEndOfBlock = editor => {\n editor.moveEndToEndOfBlock().moveToEnd()\n}\n\nCommands.moveToEndOfDocument = editor => {\n editor.moveEndToEndOfNode(editor.value.document).moveToEnd()\n}\n\nCommands.moveToEndOfInline = editor => {\n editor.moveEndToEndOfInline().moveToEnd()\n}\n\nCommands.moveToEndOfNextBlock = editor => {\n editor.moveEndToEndOfNextBlock().moveToEnd()\n}\n\nCommands.moveToEndOfNextInline = editor => {\n editor.moveEndToEndOfNextInline().moveToEnd()\n}\n\nCommands.moveToEndOfNextText = editor => {\n editor.moveEndToEndOfNextText().moveToEnd()\n}\n\nCommands.moveToEndOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveToEndOfNode', ...args)\n}\n\nCommands.moveToEndOfPreviousBlock = editor => {\n editor.moveStartToEndOfPreviousBlock().moveToStart()\n}\n\nCommands.moveToEndOfPreviousInline = editor => {\n editor.moveStartToEndOfPreviousInline().moveToStart()\n}\n\nCommands.moveToEndOfPreviousText = editor => {\n editor.moveStartToEndOfPreviousText().moveToStart()\n}\n\nCommands.moveToEndOfText = editor => {\n editor.moveEndToEndOfText().moveToEnd()\n}\n\nCommands.moveToFocus = editor => {\n editor.command(proxy, 'moveToFocus')\n}\n\nCommands.moveToRangeOfDocument = editor => {\n editor.moveToRangeOfNode(editor.value.document)\n}\n\nCommands.moveToRangeOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveToRangeOfNode', ...args)\n}\n\nCommands.moveToStart = editor => {\n editor.command(proxy, 'moveToStart')\n}\n\nCommands.moveToStartOfBlock = editor => {\n editor.moveStartToStartOfBlock().moveToStart()\n}\n\nCommands.moveToStartOfDocument = editor => {\n editor.moveStartToStartOfNode(editor.value.document).moveToStart()\n}\n\nCommands.moveToStartOfInline = editor => {\n editor.moveStartToStartOfInline().moveToStart()\n}\n\nCommands.moveToStartOfNextBlock = editor => {\n editor.moveEndToStartOfNextBlock().moveToEnd()\n}\n\nCommands.moveToStartOfNextInline = editor => {\n editor.moveEndToStartOfNextInline().moveToEnd()\n}\n\nCommands.moveToStartOfNextText = editor => {\n editor.moveEndToStartOfNextText().moveToEnd()\n}\n\nCommands.moveToStartOfNode = (editor, ...args) => {\n editor.command(proxy, 'moveToStartOfNode', ...args)\n}\n\nCommands.moveToStartOfPreviousBlock = editor => {\n editor.moveStartToStartOfPreviousBlock().moveToStart()\n}\n\nCommands.moveToStartOfPreviousInline = editor => {\n editor.moveStartToStartOfPreviousInline().moveToStart()\n}\n\nCommands.moveToStartOfPreviousText = editor => {\n editor.moveStartToStartOfPreviousText().moveToStart()\n}\n\nCommands.moveToStartOfText = editor => {\n editor.moveStartToStartOfText().moveToStart()\n}\n\nCommands.select = (editor, properties, options = {}) => {\n properties = Selection.createProperties(properties)\n const { snapshot = false } = options\n const { value } = editor\n const { document, selection } = value\n const newProperties = {}\n let next = selection.setProperties(properties)\n next = document.resolveSelection(next)\n\n // Re-compute the properties, to ensure that we get their normalized values.\n properties = pick(next, Object.keys(properties))\n\n // Remove any properties that are already equal to the current selection. And\n // create a dictionary of the previous values for all of the properties that\n // are being changed, for the inverse operation.\n for (const k in properties) {\n if (snapshot === true || !is(properties[k], selection[k])) {\n newProperties[k] = properties[k]\n }\n }\n\n // If the selection moves, clear any marks, unless the new selection\n // properties change the marks in some way.\n if (\n selection.marks &&\n !newProperties.marks &&\n (newProperties.anchor || newProperties.focus)\n ) {\n newProperties.marks = null\n }\n\n // If there are no new properties to set, abort to avoid extra operations.\n if (Object.keys(newProperties).length === 0) {\n return\n }\n\n // TODO: for some reason toJSON() is required here (it breaks selections between blocks)? - 2018-10-10\n const prevProperties = pick(selection.toJSON(), Object.keys(newProperties))\n\n editor.applyOperation(\n {\n type: 'set_selection',\n value,\n properties: prevProperties,\n newProperties,\n },\n snapshot ? { skip: false, merge: false } : {}\n )\n}\n\nCommands.setAnchor = (editor, ...args) => {\n editor.command(proxy, 'setAnchor', ...args)\n}\n\nCommands.setEnd = (editor, ...args) => {\n editor.command(proxy, 'setEnd', ...args)\n}\n\nCommands.setFocus = (editor, ...args) => {\n editor.command(proxy, 'setFocus', ...args)\n}\n\nCommands.setStart = (editor, ...args) => {\n editor.command(proxy, 'setStart', ...args)\n}\n\nCommands.snapshotSelection = editor => {\n editor.withoutMerging(() => {\n editor.select(editor.value.selection, { snapshot: true })\n })\n}\n\n/**\n * Helpers.\n */\n\nfunction proxy(editor, method, ...args) {\n const range = editor.value.selection[method](...args)\n editor.select(range)\n}\n\nfunction pointEdgeObject(editor, point, edge, object) {\n const Point = point.slice(0, 1).toUpperCase() + point.slice(1)\n const Edge = edge.slice(0, 1).toUpperCase() + edge.slice(1)\n const Object = object.slice(0, 1).toUpperCase() + object.slice(1)\n const method = `move${Point}To${Edge}OfNode`\n const getNode = object === 'text' ? 'getNode' : `getClosest${Object}`\n const { value } = editor\n const { document, selection } = value\n const p = selection[point]\n const node = document[getNode](p.key)\n if (!node) return\n editor[method](node)\n}\n\nfunction pointEdgeSideObject(editor, point, edge, side, object) {\n const Point = point.slice(0, 1).toUpperCase() + point.slice(1)\n const Edge = edge.slice(0, 1).toUpperCase() + edge.slice(1)\n const Side = side.slice(0, 1).toUpperCase() + side.slice(1)\n const Object = object.slice(0, 1).toUpperCase() + object.slice(1)\n const method = `move${Point}To${Edge}OfNode`\n const getNode = object === 'text' ? 'getNode' : `getClosest${Object}`\n const getDirectionNode = `get${Side}${Object}`\n const { value } = editor\n const { document, selection } = value\n const p = selection[point]\n const node = document[getNode](p.key)\n if (!node) return\n const target = document[getDirectionNode](node.key)\n if (!target) return\n editor[method](target)\n}\n\nfunction pointBackward(editor, point, n = 1) {\n if (n === 0) return\n if (n < 0) return pointForward(editor, point, -n)\n\n const Point = point.slice(0, 1).toUpperCase() + point.slice(1)\n const { value } = editor\n const { document, selection } = value\n const p = selection[point]\n const hasVoidParent = document.hasVoidParent(p.path, editor)\n\n // what is this?\n if (!hasVoidParent && p.offset - n >= 0) {\n const range = selection[`move${Point}Backward`](n)\n editor.select(range)\n return\n }\n\n const previous = document.getPreviousText(p.path)\n if (!previous) return\n\n const block = document.getClosestBlock(p.path)\n const isInBlock = block.hasNode(previous.key)\n const isPreviousInVoid =\n previous && document.hasVoidParent(previous.key, editor)\n editor[`move${Point}ToEndOfNode`](previous)\n\n // when is this called?\n if (!hasVoidParent && !isPreviousInVoid && isInBlock) {\n const range = editor.value.selection[`move${Point}Backward`](n)\n editor.select(range)\n }\n}\n\nfunction pointForward(editor, point, n = 1) {\n if (n === 0) return\n if (n < 0) return pointBackward(editor, point, -n)\n\n const Point = point.slice(0, 1).toUpperCase() + point.slice(1)\n const { value } = editor\n const { document, selection } = value\n const p = selection[point]\n const text = document.getNode(p.path)\n const hasVoidParent = document.hasVoidParent(p.path, editor)\n\n // what is this?\n if (!hasVoidParent && p.offset + n <= text.text.length) {\n const range = selection[`move${Point}Forward`](n)\n editor.select(range)\n return\n }\n\n const next = document.getNextText(p.path)\n if (!next) return\n\n const block = document.getClosestBlock(p.path)\n const isInBlock = block.hasNode(next.key)\n const isNextInVoid = document.hasVoidParent(next.key, editor)\n editor[`move${Point}ToStartOfNode`](next)\n\n // when is this called?\n if (!hasVoidParent && !isNextInVoid && isInBlock) {\n const range = editor.value.selection[`move${Point}Forward`](n)\n editor.select(range)\n }\n}\n\nfunction pointWordBackward(editor, pointName) {\n const { value } = editor\n const { document, selection } = value\n const point = selection[pointName]\n const block = document.getClosestBlock(point.key)\n const offset = block.getOffset(point.key)\n const o = offset + point.offset\n const { text } = block\n const n = TextUtils.getWordOffsetBackward(text, o)\n editor.command(pointBackward, pointName, n > 0 ? n : 1)\n}\n\nfunction pointWordForward(editor, pointName) {\n const { value } = editor\n const { document, selection } = value\n const point = selection[pointName]\n const block = document.getClosestBlock(point.key)\n const offset = block.getOffset(point.key)\n const o = offset + point.offset\n const { text } = block\n const n = TextUtils.getWordOffsetForward(text, o)\n editor.command(pointForward, pointName, n > 0 ? n : 1)\n}\n\nexport default Commands\n","import pick from 'lodash/pick'\nimport Annotation from '../models/annotation'\nimport Value from '../models/value'\n\n/**\n * Commands.\n *\n * @type {Object}\n */\n\nconst Commands = {}\n\n/**\n * Set `properties` on the value.\n *\n * @param {Editor} editor\n * @param {Object|Value} properties\n */\n\nCommands.setData = (editor, data = {}) => {\n const { value } = editor\n const newProperties = Value.createProperties({ data })\n const prevProperties = pick(value, Object.keys(newProperties))\n\n editor.applyOperation({\n type: 'set_value',\n properties: prevProperties,\n newProperties,\n })\n}\n\nCommands.addAnnotation = (editor, annotation) => {\n annotation = Annotation.create(annotation)\n\n editor.applyOperation({\n type: 'add_annotation',\n annotation,\n })\n}\n\nCommands.removeAnnotation = (editor, annotation) => {\n annotation = Annotation.create(annotation)\n\n editor.applyOperation({\n type: 'remove_annotation',\n annotation,\n })\n}\n\nCommands.setAnnotation = (editor, annotation, newProperties) => {\n annotation = Annotation.create(annotation)\n newProperties = Annotation.createProperties(newProperties)\n\n editor.applyOperation({\n type: 'set_annotation',\n properties: annotation,\n newProperties,\n })\n}\n\nCommands.setAnnotations = (editor, annotations = []) => {\n const { value } = editor\n const newProperties = Value.createProperties({ annotations })\n const prevProperties = pick(value, Object.keys(newProperties))\n\n editor.applyOperation({\n type: 'set_value',\n properties: prevProperties,\n newProperties,\n })\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default Commands\n","/**\n * A plugin that adds a set of queries to the editor.\n *\n * @param {Object} queries\n * @return {Object}\n */\n\nfunction QueriesPlugin(queries = {}) {\n /**\n * On construct, register all the queries.\n *\n * @param {Editor} editor\n * @param {Function} next\n */\n\n function onConstruct(editor, next) {\n for (const query in queries) {\n editor.registerQuery(query)\n }\n\n return next()\n }\n\n /**\n * On query, if it exists in our list of queries, call it.\n *\n * @param {Object} query\n * @param {Editor} editor\n * @param {Function} next\n */\n\n function onQuery(query, editor, next) {\n const { type, args } = query\n const fn = queries[type]\n if (!fn) return next()\n const ret = fn(editor, ...args)\n return ret === undefined ? next() : ret\n }\n\n /**\n * Return the plugin.\n *\n * @type {Object}\n */\n\n return {\n onConstruct,\n onQuery,\n }\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default QueriesPlugin\n","/**\n * Define a Slate error.\n *\n * @type {SlateError}\n */\n\nclass SlateError extends Error {\n constructor(code, attrs = {}) {\n super(code)\n this.code = code\n\n for (const key in attrs) {\n this[key] = attrs[key]\n }\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor)\n } else {\n this.stack = new Error().stack\n }\n }\n}\n\n/**\n * Export.\n *\n * @type {SlateError}\n */\n\nexport default SlateError\n","import SlateError from '../utils/slate-error'\nimport Queries from './queries'\n\n/**\n * Create a plugin from a `schema` definition.\n *\n * @param {Object} schema\n * @return {Object}\n */\n\nfunction SchemaPlugin(schema) {\n const {\n rules,\n document,\n blocks,\n inlines,\n marks,\n annotations,\n decorations,\n } = schema\n let schemaRules = []\n\n if (rules) {\n schemaRules = schemaRules.concat(rules)\n }\n\n if (document) {\n schemaRules.push({\n match: [{ object: 'document' }],\n ...document,\n })\n }\n\n if (blocks) {\n for (const key in blocks) {\n schemaRules.push({\n match: [{ object: 'block', type: key }],\n ...blocks[key],\n })\n }\n }\n\n if (inlines) {\n for (const key in inlines) {\n schemaRules.push({\n match: [{ object: 'inline', type: key }],\n ...inlines[key],\n })\n }\n }\n\n if (marks) {\n for (const key in marks) {\n schemaRules.push({\n match: [{ object: 'mark', type: key }],\n ...marks[key],\n })\n }\n }\n\n if (annotations) {\n for (const key in annotations) {\n schemaRules.push({\n match: [{ object: 'annotation', type: key }],\n ...annotations[key],\n })\n }\n }\n\n if (decorations) {\n for (const key in decorations) {\n schemaRules.push({\n match: [{ object: 'decoration', type: key }],\n ...decorations[key],\n })\n }\n }\n\n /**\n * Check if a `format` is atomic based on the schema rules.\n *\n * @param {Editor} editor\n * @param {Format} format\n * @return {Boolean}\n */\n\n function isAtomic(editor, format) {\n const rule = schemaRules.find(\n r => 'isAtomic' in r && testRules(format, r.match)\n )\n\n return rule && rule.isAtomic\n }\n\n /**\n * Check if a `node` is void based on the schema rules.\n *\n * @param {Editor} editor\n * @param {Node} node\n * @return {Boolean}\n */\n\n function isVoid(editor, node) {\n const rule = schemaRules.find(\n r => 'isVoid' in r && testRules(node, r.match)\n )\n\n return rule && rule.isVoid\n }\n\n /**\n * Normalize a `node` with the schema rules, returning a function that will\n * fix the invalid node, or void if the node is valid.\n *\n * @param {Node} node\n * @param {Editor} editor\n * @param {Function} next\n * @return {Function|Void}\n */\n\n function normalizeNode(node, editor, next) {\n const error = validateNode(node, editor, () => {})\n if (!error) return next()\n\n return () => {\n const { rule } = error\n const { size } = editor.operations\n\n // First run the user-provided `normalize` function if one exists...\n if (rule.normalize) {\n rule.normalize(editor, error)\n }\n\n // If the `normalize` function did not add any operations to the editor\n // object, it can't have normalized, so run the default one.\n if (editor.operations.size === size) {\n defaultNormalize(editor, error)\n }\n }\n }\n\n /**\n * Validate a `node` with the schema rules, returning a `SlateError` if it's\n * invalid.\n *\n * @param {Node} node\n * @param {Editor} editor\n * @param {Function} next\n * @return {Error|Void}\n */\n\n function validateNode(node, editor, next) {\n const matches = schemaRules.filter(r => testRules(node, r.match))\n const failure = validateRules(node, matches, schemaRules, { every: true })\n if (!failure) return next()\n const error = new SlateError(failure.code, failure)\n return error\n }\n\n /**\n * On schema-related queries, respond if we can.\n *\n * @param {Object} query\n * @param {Function} next\n */\n\n const queries = Queries({ isAtomic, isVoid })\n\n /**\n * Return the plugins.\n *\n * @type {Object}\n */\n\n return [{ normalizeNode, validateNode }, queries]\n}\n\n/**\n * Normalize an invalid value with `error` with default remedies.\n *\n * @param {Editor} editor\n * @param {SlateError} error\n */\n\nfunction defaultNormalize(editor, error) {\n const { code, node, child, next, previous, key, mark } = error\n\n switch (code) {\n case 'child_max_invalid':\n case 'child_object_invalid':\n case 'child_type_invalid':\n case 'child_unknown':\n case 'first_child_object_invalid':\n case 'first_child_type_invalid':\n case 'last_child_object_invalid':\n case 'last_child_type_invalid': {\n return child.object === 'text' &&\n node.object === 'block' &&\n node.nodes.size === 1\n ? editor.removeNodeByKey(node.key)\n : editor.removeNodeByKey(child.key)\n }\n\n case 'previous_sibling_object_invalid':\n case 'previous_sibling_type_invalid': {\n return previous.object === 'text' &&\n node.object === 'block' &&\n node.nodes.size === 1\n ? editor.removeNodeByKey(node.key)\n : editor.removeNodeByKey(previous.key)\n }\n\n case 'next_sibling_object_invalid':\n case 'next_sibling_type_invalid': {\n return next.object === 'text' &&\n node.object === 'block' &&\n node.nodes.size === 1\n ? editor.removeNodeByKey(node.key)\n : editor.removeNodeByKey(next.key)\n }\n\n case 'child_min_invalid':\n case 'node_text_invalid':\n case 'parent_object_invalid':\n case 'parent_type_invalid': {\n return node.object === 'document'\n ? node.nodes.forEach(n => editor.removeNodeByKey(n.key))\n : editor.removeNodeByKey(node.key)\n }\n\n case 'node_data_invalid': {\n return node.data.get(key) === undefined && node.object !== 'document'\n ? editor.removeNodeByKey(node.key)\n : editor.setNodeByKey(node.key, { data: node.data.delete(key) })\n }\n\n case 'node_mark_invalid': {\n return node\n .getTexts()\n .forEach(t => editor.removeMarkByKey(t.key, 0, t.text.length, mark))\n }\n\n default: {\n return editor.removeNodeByKey(node.key)\n }\n }\n}\n\n/**\n * Check that an `object` matches one of a set of `rules`.\n *\n * @param {Mixed} object\n * @param {Object|Array} rules\n * @return {Boolean}\n */\n\nfunction testRules(object, rules) {\n const error = validateRules(object, rules)\n return !error\n}\n\n/**\n * Validate that a `object` matches a `rule` object or array.\n *\n * @param {Mixed} object\n * @param {Object|Array} rule\n * @param {Array|Void} rules\n * @return {Error|Void}\n */\n\nfunction validateRules(object, rule, rules, options = {}) {\n const { every = false, match = null } = options\n\n if (typeof rule === 'function') {\n const valid = rule(object, match)\n return valid ? null : fail('node_invalid', { rule, node: object })\n }\n\n if (Array.isArray(rule)) {\n const array = rule.length ? rule : [{}]\n let first\n\n for (const r of array) {\n const error = validateRules(object, r, rules)\n first = first || error\n if (every && error) return error\n if (!every && !error) return\n }\n\n return first\n }\n\n const error =\n validateObject(object, rule) ||\n validateType(object, rule) ||\n validateData(object, rule) ||\n validateMarks(object, rule) ||\n validateText(object, rule) ||\n validateFirst(object, rule) ||\n validateLast(object, rule) ||\n validateNodes(object, rule, rules)\n\n return error\n}\n\nfunction validateObject(node, rule) {\n if (rule.object == null) return\n if (rule.object === node.object) return\n if (typeof rule.object === 'function' && rule.object(node.object)) return\n return fail('node_object_invalid', { rule, node })\n}\n\nfunction validateType(node, rule) {\n if (rule.type == null) return\n if (rule.type === node.type) return\n if (typeof rule.type === 'function' && rule.type(node.type)) return\n return fail('node_type_invalid', { rule, node })\n}\n\nfunction validateData(node, rule) {\n if (rule.data == null) return\n if (node.data == null) return\n\n if (typeof rule.data === 'function') {\n if (rule.data(node.data)) return\n return fail('node_data_invalid', { rule, node })\n }\n\n for (const key in rule.data) {\n const fn = rule.data[key]\n const value = node.data && node.data.get(key)\n const valid = typeof fn === 'function' ? fn(value) : fn === value\n if (valid) continue\n return fail('node_data_invalid', { rule, node, key, value })\n }\n}\n\nfunction validateMarks(node, rule) {\n if (rule.marks == null) return\n\n const marks =\n node.object === 'text' ? node.marks.toArray() : node.getMarks().toArray()\n\n for (const mark of marks) {\n const valid = rule.marks.some(\n def =>\n typeof def.type === 'function'\n ? def.type(mark.type)\n : def.type === mark.type\n )\n if (valid) continue\n return fail('node_mark_invalid', { rule, node, mark })\n }\n}\n\nfunction validateText(node, rule) {\n if (rule.text == null) return\n const { text } = node\n const valid =\n typeof rule.text === 'function' ? rule.text(text) : rule.text.test(text)\n if (valid) return\n return fail('node_text_invalid', { rule, node, text })\n}\n\nfunction validateFirst(node, rule) {\n if (rule.first == null) return\n const first = node.nodes.first()\n if (!first) return\n const error = validateRules(first, rule.first)\n if (!error) return\n error.rule = rule\n error.node = node\n error.child = first\n error.code = error.code.replace('node_', 'first_child_')\n return error\n}\n\nfunction validateLast(node, rule) {\n if (rule.last == null) return\n const last = node.nodes.last()\n if (!last) return\n const error = validateRules(last, rule.last)\n if (!error) return\n error.rule = rule\n error.node = node\n error.child = last\n error.code = error.code.replace('node_', 'last_child_')\n return error\n}\n\nfunction validateNodes(node, rule, rules = []) {\n if (node.nodes == null) return\n\n const children = node.nodes\n const defs = rule.nodes != null ? rule.nodes.slice() : []\n let count = 0\n let lastCount = 0\n let min = null\n let index = -1\n let def = null\n let max = null\n let child = null\n let previous = null\n let next = null\n\n function nextDef() {\n if (defs.length === 0) return false\n def = defs.shift()\n lastCount = count\n count = 0\n min = def.min || null\n max = def.max || null\n return true\n }\n\n function nextChild() {\n index += 1\n previous = index ? children.get(index - 1) : null\n child = children.get(index)\n next = children.get(index + 1)\n if (!child) return false\n lastCount = count\n count += 1\n return true\n }\n\n function rewind() {\n if (index > 0) {\n index -= 1\n count = lastCount\n }\n }\n\n if (rule.nodes != null) {\n nextDef()\n }\n\n while (nextChild()) {\n const err =\n validateParent(node, child, rules) ||\n validatePrevious(node, child, previous, index, rules) ||\n validateNext(node, child, next, index, rules)\n\n if (err) return err\n\n if (rule.nodes != null) {\n if (!def) {\n return fail('child_unknown', { rule, node, child, index })\n }\n\n if (def.match) {\n const error = validateRules(child, def.match)\n\n if (error) {\n // Since we want to report overflow on last matching child we don't\n // immediately check for count > max, but instead do so once we find\n // a child that doesn't match.\n if (max != null && count - 1 > max) {\n rewind()\n return fail('child_max_invalid', {\n rule,\n node,\n index,\n child: children.get(index),\n count,\n limit: max,\n })\n }\n\n const lastMin = min\n\n // If there are more groups after this one then child might actually\n // be valid.\n if (nextDef()) {\n // If we've already satisfied the minimum for the current group,\n // then we can rewind and proceed to the next group.\n if (lastCount - 1 >= lastMin) {\n index -= 1\n continue\n }\n\n // Otherwise we know that current value is underflowing. There are\n // three possible causes for this...\n\n // 1. There might just not be enough elements for current group, and\n // current child is in fact the first of the next group. If so, the\n // next def will not report errors, in which case we can rewind and\n // report an minimum error.\n if (validateRules(child, def.match) == null) {\n rewind()\n return fail('child_min_invalid', {\n rule,\n node,\n index,\n count: lastCount - 1,\n limit: lastMin,\n })\n }\n\n // 2. The current group is underflowing, but there is also an\n // invalid child before the next group.\n // 3. Or the current group is not underflowing but it appears so\n // because there's an invalid child between its members.\n // It's either the second or third case. If it's the second then\n // we could report an underflow, but presence of an invalid child\n // is arguably more important, so we report it first. It also lets\n // us avoid checking for which case exactly is it.\n error.rule = rule\n error.node = node\n error.child = child\n error.index = index\n error.code = error.code.replace('node_', 'child_')\n return error\n }\n\n // Otherwise either we exhausted the last group, in which case it's\n // an unknown child, ...\n if (max != null && count > max) {\n return fail('child_unknown', { rule, node, child, index })\n }\n\n // ... or it's an invalid child for the last group.\n error.rule = rule\n error.node = node\n error.child = child\n error.index = index\n error.code = error.code.replace('node_', 'child_')\n return error\n }\n }\n }\n }\n\n // Since we want to report overflow on last matching child we don't\n // immediately check for count > max, but do so after processing all nodes.\n if (max != null && count > max) {\n return fail('child_max_invalid', {\n rule,\n node,\n index: index - 1,\n count,\n child: children.get(index - 1),\n limit: max,\n })\n }\n\n if (rule.nodes != null) {\n do {\n if (count < min) {\n return fail('child_min_invalid', {\n rule,\n node,\n index,\n count,\n limit: min,\n })\n }\n } while (nextDef())\n }\n}\n\nfunction validateParent(node, child, rules) {\n for (const rule of rules) {\n if (rule.parent == null) continue\n if (!testRules(child, rule.match)) continue\n\n const error = validateRules(node, rule.parent)\n if (!error) continue\n\n error.rule = rule\n error.parent = node\n error.node = child\n error.code = error.code.replace('node_', 'parent_')\n return error\n }\n}\n\nfunction validatePrevious(node, child, previous, index, rules) {\n if (!previous) return\n\n for (const rule of rules) {\n if (rule.previous == null) continue\n if (!testRules(child, rule.match)) continue\n\n const error = validateRules(previous, rule.previous)\n if (!error) continue\n\n error.rule = rule\n error.node = node\n error.child = child\n error.index = index\n error.previous = previous\n error.code = error.code.replace('node_', 'previous_sibling_')\n return error\n }\n}\n\nfunction validateNext(node, child, next, index, rules) {\n if (!next) return\n\n for (const rule of rules) {\n if (rule.next == null) continue\n if (!testRules(child, rule.match)) continue\n\n const error = validateRules(next, rule.next, [], { match: child })\n if (!error) continue\n\n error.rule = rule\n error.node = node\n error.child = child\n error.index = index\n error.next = next\n error.code = error.code.replace('node_', 'next_sibling_')\n return error\n }\n}\n\n/**\n * Create an interim failure object with `code` and `attrs`.\n *\n * @param {String} code\n * @param {Object} attrs\n * @return {Object}\n */\n\nfunction fail(code, attrs) {\n return { code, ...attrs }\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default SchemaPlugin\n","import Block from '../models/block'\nimport Inline from '../models/inline'\nimport Mark from '../models/mark'\n\n/**\n * Ensure that an expanded selection is deleted first using the `editor.delete`\n * command. This guarantees that it uses the proper semantic \"intent\" instead of\n * using `deleteAtRange` under the covers and skipping `delete`.\n *\n * @param {Editor}\n */\n\nfunction deleteExpanded(editor) {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n }\n}\n\n/**\n * Commands.\n *\n * @type {Object}\n */\n\nconst Commands = {}\n\n/**\n * Add a `mark` to the characters in the current selection.\n *\n * @param {Editor} editor\n * @param {Mark} mark\n */\n\nCommands.addMark = (editor, mark) => {\n mark = Mark.create(mark)\n const { value } = editor\n const { document, selection } = value\n\n if (selection.isExpanded) {\n editor.addMarkAtRange(selection, mark)\n } else if (selection.marks) {\n const marks = selection.marks.add(mark)\n const sel = selection.set('marks', marks)\n editor.select(sel)\n } else {\n const marks = document.getActiveMarksAtRange(selection).add(mark)\n const sel = selection.set('marks', marks)\n editor.select(sel)\n }\n}\n\n/**\n * Add a list of `marks` to the characters in the current selection.\n *\n * @param {Editor} editor\n * @param {Set<Mark>|Array<Object>} marks\n */\n\nCommands.addMarks = (editor, marks) => {\n marks.forEach(mark => editor.addMark(mark))\n}\n\n/**\n * Delete at the current selection.\n *\n * @param {Editor} editor\n */\n\nCommands.delete = editor => {\n const { value } = editor\n const { selection } = value\n editor.deleteAtRange(selection)\n\n // COMPAT: Ensure that the selection is collapsed, because in certain cases\n // when deleting across inline nodes, when splitting the inline node the end\n // point of the selection will end up after the split point.\n editor.moveToFocus()\n}\n\n/**\n * Delete backward `n` characters.\n *\n * @param {Editor} editor\n * @param {Number} n (optional)\n */\n\nCommands.deleteBackward = (editor, n = 1) => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteBackwardAtRange(selection, n)\n }\n}\n\n/**\n * Delete backward one character.\n *\n * @param {Editor} editor\n */\n\nCommands.deleteCharBackward = editor => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteCharBackwardAtRange(selection)\n }\n}\n\n/**\n * Delete backward one line.\n *\n * @param {Editor} editor\n */\n\nCommands.deleteLineBackward = editor => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteLineBackwardAtRange(selection)\n }\n}\n\n/**\n * Delete backward one word.\n *\n * @param {Editor} editor\n */\n\nCommands.deleteWordBackward = editor => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteWordBackwardAtRange(selection)\n }\n}\n\n/**\n * Delete backward `n` characters.\n *\n * @param {Editor} editor\n * @param {Number} n (optional)\n */\n\nCommands.deleteForward = (editor, n = 1) => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteForwardAtRange(selection, n)\n }\n}\n\n/**\n * Delete backward one character.\n *\n * @param {Editor} editor\n */\n\nCommands.deleteCharForward = editor => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteCharForwardAtRange(selection)\n }\n}\n\n/**\n * Delete backward one line.\n *\n * @param {Editor} editor\n */\n\nCommands.deleteLineForward = editor => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteLineForwardAtRange(selection)\n }\n}\n\n/**\n * Delete backward one word.\n *\n * @param {Editor} editor\n */\n\nCommands.deleteWordForward = editor => {\n const { value } = editor\n const { selection } = value\n\n if (selection.isExpanded) {\n editor.delete()\n } else {\n editor.deleteWordForwardAtRange(selection)\n }\n}\n\n/**\n * Insert a `block` at the current selection.\n *\n * @param {Editor} editor\n * @param {String|Object|Block} block\n */\n\nCommands.insertBlock = (editor, block) => {\n deleteExpanded(editor)\n\n block = Block.create(block)\n const { value } = editor\n const { selection } = value\n editor.insertBlockAtRange(selection, block)\n\n // If the node was successfully inserted, update the selection.\n const node = editor.value.document.getNode(block.key)\n if (node) editor.moveToEndOfNode(node)\n}\n\n/**\n * Insert a `fragment` at the current selection.\n *\n * @param {Editor} editor\n * @param {Document} fragment\n */\n\nCommands.insertFragment = (editor, fragment) => {\n if (!fragment.nodes.size) return\n\n deleteExpanded(editor)\n\n let { value } = editor\n let { document, selection } = value\n const { start } = selection\n const keys = Array.from(document.texts(), ([text]) => text.key)\n\n editor.insertFragmentAtRange(selection, fragment)\n value = editor.value\n document = value.document\n\n const newTexts = document.getTexts().filter(n => !keys.includes(n.key))\n if (newTexts.size === 0) return\n const fragmentLength = fragment.text.length\n\n // Either startText is still here, or we want the first un-previously known text\n const startText = document.getNode(start.key) || newTexts.first()\n // We want the last un-previously known text\n let endText = newTexts.last() || startText\n\n if (startText === endText) {\n editor.moveTo(endText.key, fragmentLength)\n return\n }\n\n // Everything will be calculated relative to the first common ancestor to optimize speed\n const parent = document.getCommonAncestor(startText.key, endText.key)\n\n const startOffset =\n parent.getOffset(startText.key) +\n (start.key === startText.key ? start.offset : 0)\n\n // endText might not be the last un-previously known text node, so we precisely pick it by offset\n endText = parent.getTextAtOffset(startOffset + fragmentLength - 1) || endText\n\n editor.moveTo(\n endText.key,\n startOffset + fragmentLength - parent.getOffset(endText.key)\n )\n}\n\n/**\n * Insert an `inline` at the current selection.\n *\n * @param {Editor} editor\n * @param {String|Object|Inline} inline\n */\n\nCommands.insertInline = (editor, inline) => {\n deleteExpanded(editor)\n\n inline = Inline.create(inline)\n const { value } = editor\n const { selection } = value\n editor.insertInlineAtRange(selection, inline)\n\n // If the node was successfully inserted, update the selection.\n const node = editor.value.document.getNode(inline.key)\n if (node) editor.moveToEndOfNode(node)\n}\n\n/**\n * Insert a string of `text` with optional `marks` at the current selection.\n *\n * @param {Editor} editor\n * @param {String} text\n * @param {Set<Mark>} marks (optional)\n */\n\nCommands.insertText = (editor, text, marks) => {\n deleteExpanded(editor)\n\n const { value } = editor\n const { document, selection } = value\n marks = marks || selection.marks || document.getInsertMarksAtRange(selection)\n\n editor.withoutNormalizing(() => {\n editor.insertTextAtRange(selection, text, marks)\n\n // If the text was successfully inserted, and the selection had marks on it,\n // unset the selection's marks.\n if (selection.marks && document !== editor.value.document) {\n editor.select({ marks: null })\n }\n })\n}\n\n/**\n * Remove a `mark` from the characters in the current selection.\n *\n * @param {Editor} editor\n * @param {Mark} mark\n */\n\nCommands.removeMark = (editor, mark) => {\n mark = Mark.create(mark)\n const { value } = editor\n const { document, selection } = value\n\n if (selection.isExpanded) {\n editor.removeMarkAtRange(selection, mark)\n } else if (selection.marks) {\n const marks = selection.marks.remove(mark)\n const sel = selection.set('marks', marks)\n editor.select(sel)\n } else {\n const marks = document.getActiveMarksAtRange(selection).remove(mark)\n const sel = selection.set('marks', marks)\n editor.select(sel)\n }\n}\n\n/**\n * Replace an `oldMark` with a `newMark` in the characters in the current selection.\n *\n * @param {Editor} editor\n * @param {Mark} oldMark\n * @param {Mark} newMark\n */\n\nCommands.replaceMark = (editor, oldMark, newMark) => {\n editor.removeMark(oldMark)\n editor.addMark(newMark)\n}\n\n/**\n * Set the `properties` of block nodes.\n *\n * @param {Editor} editor\n * @param {Object|String} properties\n */\n\nCommands.setBlocks = (editor, properties) => {\n const { value } = editor\n const { selection } = value\n editor.setBlocksAtRange(selection, properties)\n}\n\n/**\n * Set the `properties` of inline nodes.\n *\n * @param {Editor} editor\n * @param {Object|String} properties\n */\n\nCommands.setInlines = (editor, properties) => {\n const { value } = editor\n const { selection } = value\n editor.setInlinesAtRange(selection, properties)\n}\n\n/**\n * Split the block node at the current selection, to optional `depth`.\n *\n * @param {Editor} editor\n * @param {Number} depth (optional)\n */\n\nCommands.splitBlock = (editor, depth = 1) => {\n deleteExpanded(editor)\n\n const { value } = editor\n const { selection, document } = value\n const marks = selection.marks || document.getInsertMarksAtRange(selection)\n editor.splitBlockAtRange(selection, depth).moveToEnd()\n\n if (marks && marks.size !== 0) {\n editor.select({ marks })\n }\n}\n\n/**\n * Split the inline nodes to optional `height`.\n *\n * @param {Editor} editor\n * @param {Number} height (optional)\n */\n\nCommands.splitInline = (editor, height) => {\n deleteExpanded(editor)\n const { value } = editor\n const { selection } = value\n editor.splitInlineAtRange(selection, height)\n}\n\n/**\n * Add or remove a `mark` from the characters in the current selection,\n * depending on whether it's already there.\n *\n * @param {Editor} editor\n * @param {Mark} mark\n */\n\nCommands.toggleMark = (editor, mark) => {\n mark = Mark.create(mark)\n const { value } = editor\n const exists = value.activeMarks.has(mark)\n\n if (exists) {\n editor.removeMark(mark)\n } else {\n editor.addMark(mark)\n }\n}\n\n/**\n * Unwrap nodes from a block with `properties`.\n *\n * @param {Editor} editor\n * @param {String|Object} properties\n */\n\nCommands.unwrapBlock = (editor, properties) => {\n const { value } = editor\n const { selection } = value\n editor.unwrapBlockAtRange(selection, properties)\n}\n\n/**\n * Unwrap nodes from an inline with `properties`.\n *\n * @param {Editor} editor\n * @param {String|Object} properties\n */\n\nCommands.unwrapInline = (editor, properties) => {\n const { value } = editor\n const { selection } = value\n editor.unwrapInlineAtRange(selection, properties)\n}\n\n/**\n * Wrap nodes in a new `block`.\n *\n * @param {Editor} editor\n * @param {Block|Object|String} block\n */\n\nCommands.wrapBlock = (editor, block) => {\n const { value } = editor\n const { selection } = value\n editor.wrapBlockAtRange(selection, block)\n}\n\n/**\n * Wrap nodes in a new `inline`.\n *\n * @param {Editor} editor\n * @param {Inline|Object|String} inline\n */\n\nCommands.wrapInline = (editor, inline) => {\n const { value } = editor\n const { selection } = value\n editor.wrapInlineAtRange(selection, inline)\n}\n\n/**\n * Wrap the current selection with prefix/suffix.\n *\n * @param {Editor} editor\n * @param {String} prefix\n * @param {String} suffix\n */\n\nCommands.wrapText = (editor, prefix, suffix = prefix) => {\n const { value } = editor\n const { selection } = value\n editor.wrapTextAtRange(selection, prefix, suffix)\n\n // If the selection was collapsed, it will have moved the start offset too.\n if (selection.isCollapsed) {\n editor.moveStartBackward(prefix.length)\n }\n\n // Adding the suffix will have pushed the end of the selection further on, so\n // we need to move it back to account for this.\n editor.moveEndBackward(suffix.length)\n\n // There's a chance that the selection points moved \"through\" each other,\n // resulting in a now-incorrect selection direction.\n if (selection.isForward !== editor.value.selection.isForward) {\n editor.flip()\n }\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default Commands\n","import AtRange from '../commands/at-range'\nimport ByPath from '../commands/by-path'\nimport Commands from './commands'\nimport OnHistory from '../commands/on-history'\nimport OnSelection from '../commands/on-selection'\nimport OnValue from '../commands/on-value'\nimport Queries from './queries'\nimport Schema from './schema'\nimport Text from '../models/text'\nimport WithIntent from '../commands/with-intent'\n\n/**\n * A plugin that defines the core Slate logic.\n *\n * @param {Object} options\n * @return {Object}\n */\n\nfunction CorePlugin(options = {}) {\n const { plugins = [] } = options\n\n /**\n * The core Slate commands.\n *\n * @type {Object}\n */\n\n const commands = Commands({\n ...AtRange,\n ...ByPath,\n ...OnHistory,\n ...OnSelection,\n ...OnValue,\n ...WithIntent,\n })\n\n /**\n * The core Slate queries.\n *\n * @type {Object}\n */\n\n const queries = Queries({\n isAtomic: () => false,\n isVoid: () => false,\n })\n\n /**\n * The core Slate schema.\n *\n * @type {Object}\n */\n\n const schema = Schema({\n rules: [\n // Only allow block nodes in documents.\n {\n match: { object: 'document' },\n nodes: [\n {\n match: { object: 'block' },\n },\n ],\n },\n\n // Only allow block nodes or inline and text nodes in blocks.\n {\n match: {\n object: 'block',\n first: { object: 'block' },\n },\n nodes: [\n {\n match: { object: 'block' },\n },\n ],\n },\n {\n match: {\n object: 'block',\n first: [{ object: 'inline' }, { object: 'text' }],\n },\n nodes: [\n {\n match: [{ object: 'inline' }, { object: 'text' }],\n },\n ],\n },\n\n // Only allow inline and text nodes in inlines.\n {\n match: { object: 'inline' },\n nodes: [{ match: [{ object: 'inline' }, { object: 'text' }] }],\n },\n\n // Ensure that block and inline nodes have at least one text child.\n {\n match: [{ object: 'block' }, { object: 'inline' }],\n nodes: [{ min: 1 }],\n normalize: (editor, error) => {\n const { code, node } = error\n\n if (code === 'child_min_invalid' && node.nodes.isEmpty()) {\n editor.insertNodeByKey(node.key, 0, Text.create())\n }\n },\n },\n\n // Ensure that inline nodes are surrounded by text nodes.\n {\n match: { object: 'block' },\n first: [{ object: 'block' }, { object: 'text' }],\n last: [{ object: 'block' }, { object: 'text' }],\n normalize: (editor, error) => {\n const { code, node } = error\n const text = Text.create()\n let i\n\n if (code === 'first_child_object_invalid') {\n i = 0\n } else if (code === 'last_child_object_invalid') {\n i = node.nodes.size\n } else {\n return\n }\n\n editor.insertNodeByKey(node.key, i, text)\n },\n },\n {\n match: { object: 'inline' },\n first: [{ object: 'block' }, { object: 'text' }],\n last: [{ object: 'block' }, { object: 'text' }],\n previous: [{ object: 'block' }, { object: 'text' }],\n next: [{ object: 'block' }, { object: 'text' }],\n normalize: (editor, error) => {\n const { code, node, index } = error\n const text = Text.create()\n let i\n\n if (code === 'first_child_object_invalid') {\n i = 0\n } else if (code === 'last_child_object_invalid') {\n i = node.nodes.size\n } else if (code === 'previous_sibling_object_invalid') {\n i = index\n } else if (code === 'next_sibling_object_invalid') {\n i = index + 1\n } else {\n return\n }\n\n editor.insertNodeByKey(node.key, i, text)\n },\n },\n\n // Merge adjacent text nodes with the same marks.\n {\n match: { object: 'text' },\n next: (next, match) => {\n return next.object !== 'text' || !match.marks.equals(next.marks)\n },\n normalize: (editor, error) => {\n const { code, next } = error\n\n if (code === 'next_sibling_invalid') {\n editor.mergeNodeByKey(next.key)\n }\n },\n },\n\n // Remove extra adjacent empty text nodes.\n {\n match: { object: 'text' },\n previous: prev => {\n return prev.object !== 'text' || prev.text !== ''\n },\n next: next => {\n return next.object !== 'text' || next.text !== ''\n },\n normalize: (editor, error) => {\n const { code, next, previous } = error\n\n if (code === 'next_sibling_invalid') {\n editor.removeNodeByKey(next.key)\n } else if (code === 'previous_sibling_invalid') {\n editor.removeNodeByKey(previous.key)\n }\n },\n },\n ],\n })\n\n /**\n * Return the plugins.\n *\n * @type {Array}\n */\n\n return [schema, ...plugins, commands, queries]\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default CorePlugin\n","import Debug from 'debug'\nimport invariant from 'tiny-invariant'\nimport isPlainObject from 'is-plain-object'\nimport warning from 'tiny-warning'\nimport { List } from 'immutable'\n\nimport CommandsPlugin from '../plugins/commands'\nimport CorePlugin from '../plugins/core'\nimport Operation from '../models/operation'\nimport PathUtils from '../utils/path-utils'\nimport QueriesPlugin from '../plugins/queries'\nimport SchemaPlugin from '../plugins/schema'\nimport Value from '../models/value'\n\n/**\n * Debug.\n *\n * @type {Function}\n */\n\nconst debug = Debug('slate:editor')\n\n/**\n * Editor.\n *\n * @type {Editor}\n */\n\nclass Editor {\n /**\n * Create a new `Editor` with `attrs`.\n *\n * @param {Object} attrs\n * @param {Object} options\n */\n\n constructor(attrs = {}, options = {}) {\n const { controller = this, construct = true } = options\n const {\n onChange = () => {},\n plugins = [],\n readOnly = false,\n value = Value.create(),\n } = attrs\n\n this.controller = controller\n this.middleware = {}\n this.onChange = onChange\n this.operations = List()\n this.readOnly = null\n this.value = null\n\n this.tmp = {\n dirty: [],\n flushing: false,\n merge: null,\n normalize: true,\n save: true,\n }\n\n const core = CorePlugin({ plugins })\n registerPlugin(this, core)\n\n if (construct) {\n this.run('onConstruct')\n this.setReadOnly(readOnly)\n this.setValue(value, options)\n }\n }\n\n /**\n * Apply an `operation` to the editor, updating its value.\n *\n * @param {Operation|Object} operation\n * @return {Editor}\n */\n\n applyOperation(operation) {\n const { operations, controller } = this\n let value = this.value\n\n // Add in the current `value` in case the operation was serialized.\n if (isPlainObject(operation)) {\n operation = { ...operation, value }\n }\n\n operation = Operation.create(operation)\n\n // Save the operation into the history. Since `save` is a command, we need\n // to do it without normalizing, since it would have side effects.\n this.withoutNormalizing(() => {\n controller.save(operation)\n value = this.value\n })\n\n // Apply the operation to the value.\n debug('apply', { operation })\n this.value = operation.apply(value)\n this.operations = operations.push(operation)\n\n // Get the paths of the affected nodes, and mark them as dirty.\n const newDirtyPaths = getDirtyPaths(operation)\n\n const dirty = this.tmp.dirty.map(path => {\n path = PathUtils.create(path)\n const transformed = PathUtils.transform(path, operation)\n return transformed.toArray()\n })\n\n const pathIndex = {}\n const dirtyPaths = Array.prototype.concat.apply(newDirtyPaths, dirty)\n this.tmp.dirty = []\n\n // PERF: De-dupe the paths so we don't do extra normalization.\n dirtyPaths.forEach(dirtyPath => {\n const key = dirtyPath.join(',')\n\n if (!pathIndex[key]) {\n this.tmp.dirty.push(dirtyPath)\n }\n\n pathIndex[key] = true\n })\n\n // If we're not already, queue the flushing process on the next tick.\n if (!this.tmp.flushing) {\n this.tmp.flushing = true\n Promise.resolve().then(() => this.flush())\n }\n\n return controller\n }\n\n /**\n * Flush the editor's current change.\n *\n * @return {Editor}\n */\n\n flush() {\n this.run('onChange')\n const { value, operations, controller } = this\n const change = { value, operations }\n this.operations = List()\n this.tmp.flushing = false\n this.onChange(change)\n return controller\n }\n\n /**\n * Trigger a command by `type` with `...args`.\n *\n * @param {String|Function} type\n * @param {Any} ...args\n * @return {Editor}\n */\n\n command(type, ...args) {\n const { controller } = this\n\n if (typeof type === 'function') {\n type(controller, ...args)\n normalizeDirtyPaths(this)\n return controller\n }\n\n debug('command', { type, args })\n const obj = { type, args }\n this.run('onCommand', obj)\n normalizeDirtyPaths(this)\n return controller\n }\n\n /**\n * Checks if a command by `type` has been registered.\n *\n * @param {String} type\n * @return {Boolean}\n */\n\n hasCommand(type) {\n const { controller } = this\n const has = type in controller && controller[type].__command\n\n return has\n }\n\n /**\n * Checks if a query by `type` has been registered.\n *\n * @param {String} type\n * @return {Boolean}\n */\n\n hasQuery(type) {\n const { controller } = this\n const has = type in controller && controller[type].__query\n\n return has\n }\n\n /**\n * Normalize all of the nodes in the document from scratch.\n *\n * @return {Editor}\n */\n\n normalize() {\n const { value, controller } = this\n let { document } = value\n const table = document.getKeysToPathsTable()\n const paths = Object.values(table).map(PathUtils.create)\n this.tmp.dirty = this.tmp.dirty.concat(paths)\n normalizeDirtyPaths(this)\n\n const { selection } = value\n document = value.document\n\n if (selection.isUnset && document.nodes.size) {\n controller.moveToStartOfDocument()\n }\n\n return controller\n }\n\n /**\n * Ask a query by `type` with `...args`.\n *\n * @param {String|Function} type\n * @param {Any} ...args\n * @return {Any}\n */\n\n query(type, ...args) {\n const { controller } = this\n\n if (typeof type === 'function') {\n return type(controller, ...args)\n }\n\n debug('query', { type, args })\n const obj = { type, args }\n return this.run('onQuery', obj)\n }\n\n /**\n * Register a command `type` with the editor.\n *\n * @param {String} type\n * @return {Editor}\n */\n\n registerCommand(type) {\n const { controller } = this\n\n if (type in controller && controller[type].__command) {\n return controller\n }\n\n invariant(\n !(type in controller),\n `You cannot register a \\`${type}\\` command because it would overwrite an existing property of the \\`Editor\\`.`\n )\n\n const method = (...args) => this.command(type, ...args)\n controller[type] = method\n method.__command = true\n return controller\n }\n\n /**\n * Register a query `type` with the editor.\n *\n * @param {String} type\n * @return {Editor}\n */\n\n registerQuery(type) {\n const { controller } = this\n\n if (type in controller && controller[type].__query) {\n return controller\n }\n\n invariant(\n !(type in controller),\n `You cannot register a \\`${type}\\` query because it would overwrite an existing property of the \\`Editor\\`.`\n )\n\n const method = (...args) => this.query(type, ...args)\n controller[type] = method\n method.__query = true\n return controller\n }\n\n /**\n * Run through the middleware stack by `key` with `args`.\n *\n * @param {String} key\n * @param {Any} ...args\n * @return {Any}\n */\n\n run(key, ...args) {\n const { controller, middleware } = this\n const fns = middleware[key] || []\n let i = 0\n\n function next(...overrides) {\n const fn = fns[i++]\n if (!fn) return\n\n if (overrides.length) {\n args = overrides\n }\n\n const ret = fn(...args, controller, next)\n return ret\n }\n\n Object.defineProperty(next, 'change', {\n get() {\n invariant(\n false,\n 'As of Slate 0.42, the `editor` is no longer passed as the third argument to event handlers. You can access it via `change.editor` instead.'\n )\n },\n })\n\n Object.defineProperty(next, 'onChange', {\n get() {\n invariant(\n false,\n 'As of Slate 0.42, the `editor` is no longer passed as the third argument to event handlers. You can access it via `change.editor` instead.'\n )\n },\n })\n\n Object.defineProperty(next, 'props', {\n get() {\n invariant(\n false,\n 'As of Slate 0.42, the `editor` is no longer passed as the third argument to event handlers. You can access it via `change.editor` instead.'\n )\n },\n })\n\n Object.defineProperty(next, 'schema', {\n get() {\n invariant(\n false,\n 'As of Slate 0.42, the `editor` is no longer passed as the third argument to event handlers. You can access it via `change.editor` instead.'\n )\n },\n })\n\n Object.defineProperty(next, 'stack', {\n get() {\n invariant(\n false,\n 'As of Slate 0.42, the `editor` is no longer passed as the third argument to event handlers. You can access it via `change.editor` instead.'\n )\n },\n })\n\n return next()\n }\n\n /**\n * Set the `readOnly` flag.\n *\n * @param {Boolean} readOnly\n * @return {Editor}\n */\n\n setReadOnly(readOnly) {\n this.readOnly = readOnly\n return this\n }\n\n /**\n * Set the editor's `value`.\n *\n * @param {Value} value\n * @param {Options} options\n * @return {Editor}\n */\n\n setValue(value, options = {}) {\n const { normalize = value !== this.value } = options\n this.value = value\n\n if (normalize) {\n this.normalize()\n }\n\n return this\n }\n\n /**\n * Apply a series of changes inside a synchronous `fn`, deferring\n * normalization until after the function has finished executing.\n *\n * @param {Function} fn\n * @return {Editor}\n */\n\n withoutNormalizing(fn) {\n const { controller } = this\n const value = this.tmp.normalize\n this.tmp.normalize = false\n fn(controller)\n this.tmp.normalize = value\n normalizeDirtyPaths(this)\n return controller\n }\n\n /**\n * Deprecated.\n */\n\n get editor() {\n warning(\n false,\n \"As of Slate 0.43 the `change` object has been replaced with `editor`, so you don't need to access `change.editor`.\"\n )\n\n return this.controller\n }\n\n change(fn, ...args) {\n warning(\n false,\n 'As of Slate 0.43 the `change` object has been replaced with `editor`, so the `editor.change()` method is deprecated.`'\n )\n\n fn(this.controller, ...args)\n }\n\n call(fn, ...args) {\n warning(\n false,\n 'As of Slate 0.43 the `editor.call(fn)` method has been deprecated, please use `editor.command(fn)` instead.'\n )\n\n fn(this.controller, ...args)\n return this.controller\n }\n\n applyOperations(operations) {\n warning(\n false,\n 'As of Slate 0.43 the `applyOperations` method is deprecated, please apply each operation in a loop instead.'\n )\n\n operations.forEach(op => this.applyOperation(op))\n return this.controller\n }\n\n setOperationFlag(key, value) {\n warning(\n false,\n 'As of slate@0.41 the `change.setOperationFlag` method has been deprecated.'\n )\n\n this.tmp[key] = value\n return this\n }\n\n getFlag(key, options = {}) {\n warning(\n false,\n 'As of slate@0.41 the `change.getFlag` method has been deprecated.'\n )\n\n return options[key] !== undefined ? options[key] : this.tmp[key]\n }\n\n unsetOperationFlag(key) {\n warning(\n false,\n 'As of slate@0.41 the `change.unsetOperationFlag` method has been deprecated.'\n )\n\n delete this.tmp[key]\n return this\n }\n\n withoutNormalization(fn) {\n warning(\n false,\n 'As of slate@0.41 the `change.withoutNormalization` helper has been renamed to `change.withoutNormalizing`.'\n )\n\n return this.withoutNormalizing(fn)\n }\n}\n\n/**\n * Get the \"dirty\" paths for a given `operation`.\n *\n * @param {Operation} operation\n * @return {Array}\n */\n\nfunction getDirtyPaths(operation) {\n const { type, node, path, newPath } = operation\n\n switch (type) {\n case 'add_mark':\n case 'insert_text':\n case 'remove_mark':\n case 'remove_text':\n case 'set_mark':\n case 'set_node': {\n const ancestors = PathUtils.getAncestors(path).toArray()\n return [...ancestors, path]\n }\n\n case 'insert_node': {\n const table = node.getKeysToPathsTable()\n const paths = Object.values(table).map(p => path.concat(p))\n const ancestors = PathUtils.getAncestors(path).toArray()\n return [...ancestors, path, ...paths]\n }\n\n case 'split_node': {\n const ancestors = PathUtils.getAncestors(path).toArray()\n const nextPath = PathUtils.increment(path)\n return [...ancestors, path, nextPath]\n }\n\n case 'merge_node': {\n const ancestors = PathUtils.getAncestors(path).toArray()\n const previousPath = PathUtils.decrement(path)\n return [...ancestors, previousPath]\n }\n\n case 'move_node': {\n if (PathUtils.isEqual(path, newPath)) {\n return []\n }\n\n const oldAncestors = PathUtils.getAncestors(path).reduce((arr, p) => {\n arr.push(...PathUtils.transform(p, operation).toArray())\n return arr\n }, [])\n\n const newAncestors = PathUtils.getAncestors(newPath).reduce((arr, p) => {\n arr.push(...PathUtils.transform(p, operation).toArray())\n return arr\n }, [])\n\n return [...oldAncestors, ...newAncestors]\n }\n\n case 'remove_node': {\n const ancestors = PathUtils.getAncestors(path).toArray()\n return [...ancestors]\n }\n\n default: {\n return []\n }\n }\n}\n\n/**\n * Normalize any new \"dirty\" paths that have been added to the change.\n *\n * @param {Editor}\n */\n\nfunction normalizeDirtyPaths(editor) {\n if (!editor.tmp.normalize) {\n return\n }\n\n if (!editor.tmp.dirty.length) {\n return\n }\n\n editor.withoutNormalizing(() => {\n while (editor.tmp.dirty.length) {\n const path = editor.tmp.dirty.pop()\n normalizeNodeByPath(editor, path)\n }\n })\n}\n\n/**\n * Normalize the node at a specific `path`.\n *\n * @param {Editor} editor\n * @param {Array} path\n */\n\nfunction normalizeNodeByPath(editor, path) {\n const { controller } = editor\n let { value } = editor\n let { document } = value\n let node = document.assertNode(path)\n let iterations = 0\n const max = 100 + (node.object === 'text' ? 1 : node.nodes.size)\n\n while (node) {\n const fn = node.normalize(controller)\n\n if (!fn) {\n break\n }\n\n // Run the normalize `fn` to fix the node.\n fn(controller)\n\n // Attempt to re-find the node by path, or by key if it has changed\n // locations in the tree continue iterating.\n value = editor.value\n document = value.document\n const { key } = node\n let found = document.getDescendant(path)\n\n if (found && found.key === key) {\n node = found\n } else {\n found = document.getDescendant(key)\n\n if (found) {\n node = found\n path = document.getPath(key)\n } else {\n // If it no longer exists by key, it was removed, so we're done.\n break\n }\n }\n\n // Increment the iterations counter, and check to make sure that we haven't\n // exceeded the max. Without this check, it's easy for the `normalize`\n // function of a schema rule to be written incorrectly and for an infinite\n // invalid loop to occur.\n iterations++\n\n if (iterations > max) {\n throw new Error(\n 'A schema rule could not be normalized after sufficient iterations. This is usually due to a `rule.normalize` or `plugin.normalizeNode` function of a schema being incorrectly written, causing an infinite loop.'\n )\n }\n }\n}\n\n/**\n * Register a `plugin` with the editor.\n *\n * @param {Editor} editor\n * @param {Object|Array|Null} plugin\n */\n\nfunction registerPlugin(editor, plugin) {\n if (Array.isArray(plugin)) {\n plugin.forEach(p => registerPlugin(editor, p))\n return\n }\n\n if (plugin == null) {\n return\n }\n\n const { commands, queries, schema, ...rest } = plugin\n\n if (commands) {\n const commandsPlugin = CommandsPlugin(commands)\n registerPlugin(editor, commandsPlugin)\n }\n\n if (queries) {\n const queriesPlugin = QueriesPlugin(queries)\n registerPlugin(editor, queriesPlugin)\n }\n\n if (schema) {\n const schemaPlugin = SchemaPlugin(schema)\n registerPlugin(editor, schemaPlugin)\n }\n\n for (const key in rest) {\n const fn = rest[key]\n const middleware = (editor.middleware[key] = editor.middleware[key] || [])\n middleware.push(fn)\n }\n}\n\n/**\n * Export.\n *\n * @type {Editor}\n */\n\nexport default Editor\n","import isPlainObject from 'is-plain-object'\nimport warning from 'tiny-warning'\nimport { List, Record, Set } from 'immutable'\n\nimport Mark from './mark'\n\n/**\n * Default properties.\n *\n * @type {Object}\n */\n\nconst DEFAULTS = {\n marks: undefined,\n text: undefined,\n}\n\n/**\n * Leaf.\n *\n * @type {Leaf}\n */\n\nclass Leaf extends Record(DEFAULTS) {\n /**\n * Create a new `Leaf` with `attrs`.\n *\n * @param {Object|Leaf} attrs\n * @return {Leaf}\n */\n\n static create(attrs = {}) {\n warning(false, 'As of slate@0.47 the `Leaf` model is deprecated.')\n\n if (Leaf.isLeaf(attrs)) {\n return attrs\n }\n\n if (typeof attrs === 'string') {\n attrs = { text: attrs }\n }\n\n if (isPlainObject(attrs)) {\n return Leaf.fromJSON(attrs)\n }\n\n throw new Error(\n `\\`Leaf.create\\` only accepts objects, strings or leaves, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a valid List of `Leaf` from `leaves`\n *\n * @param {List<Leaf>} leaves\n * @return {List<Leaf>}\n */\n\n static createLeaves(leaves) {\n if (leaves.size <= 1) return leaves\n\n let invalid = false\n\n // TODO: we can make this faster with [List] and then flatten\n const result = List().withMutations(cache => {\n // Search from the leaves left end to find invalid node;\n leaves.findLast((leaf, index) => {\n const firstLeaf = cache.first()\n\n // If the first leaf of cache exist, check whether the first leaf is connectable with the current leaf\n if (firstLeaf) {\n // If marks equals, then the two leaves can be connected\n if (firstLeaf.marks.equals(leaf.marks)) {\n invalid = true\n cache.set(0, firstLeaf.set('text', `${leaf.text}${firstLeaf.text}`))\n return\n }\n\n // If the cached leaf is empty, drop the empty leaf with the upcoming leaf\n if (firstLeaf.text === '') {\n invalid = true\n cache.set(0, leaf)\n return\n }\n\n // If the current leaf is empty, drop the leaf\n if (leaf.text === '') {\n invalid = true\n return\n }\n }\n\n cache.unshift(leaf)\n })\n })\n\n if (!invalid) return leaves\n return result\n }\n\n /**\n * Split a list of leaves to two lists; if the leaves are valid leaves, the returned leaves are also valid\n * Corner Cases:\n * 1. if offset is smaller than 0, then return [List(), leaves]\n * 2. if offset is bigger than the text length, then return [leaves, List()]\n *\n * @param {List<Leaf> leaves\n * @return {Array<List<Leaf>>}\n */\n\n static splitLeaves(leaves, offset) {\n if (offset < 0) return [List(), leaves]\n\n if (leaves.size === 0) {\n return [List(), List()]\n }\n\n let endOffset = 0\n let index = -1\n let left, right\n\n leaves.find(leaf => {\n index++\n const startOffset = endOffset\n const { text } = leaf\n endOffset += text.length\n\n if (endOffset < offset) return false\n if (startOffset > offset) return false\n\n const length = offset - startOffset\n left = leaf.set('text', text.slice(0, length))\n right = leaf.set('text', text.slice(length))\n return true\n })\n\n if (!left) return [leaves, List()]\n\n if (left.text === '') {\n if (index === 0) {\n return [List.of(left), leaves]\n }\n\n return [leaves.take(index), leaves.skip(index)]\n }\n\n if (right.text === '') {\n if (index === leaves.size - 1) {\n return [leaves, List.of(right)]\n }\n\n return [leaves.take(index + 1), leaves.skip(index + 1)]\n }\n\n return [\n leaves.take(index).push(left),\n leaves.skip(index + 1).unshift(right),\n ]\n }\n\n /**\n * Create a `Leaf` list from `attrs`.\n *\n * @param {Array<Leaf|Object>|List<Leaf|Object>} attrs\n * @return {List<Leaf>}\n */\n\n static createList(attrs = []) {\n if (List.isList(attrs) || Array.isArray(attrs)) {\n const list = new List(attrs.map(Leaf.create))\n return list\n }\n\n throw new Error(\n `\\`Leaf.createList\\` only accepts arrays or lists, but you passed it: ${attrs}`\n )\n }\n\n /**\n * Create a `Leaf` from a JSON `object`.\n *\n * @param {Object} object\n * @return {Leaf}\n */\n\n static fromJSON(object) {\n const { text = '', marks = [] } = object\n\n const leaf = new Leaf({\n text,\n marks: Set(marks.map(Mark.fromJSON)),\n })\n\n return leaf\n }\n\n /**\n * Check if `any` is a list of leaves.\n *\n * @param {Any} any\n * @return {Boolean}\n */\n\n static isLeafList(any) {\n return List.isList(any) && any.every(item => Leaf.isLeaf(item))\n }\n\n /**\n * Update a `mark` at leaf, replace with newMark\n *\n * @param {Mark} mark\n * @param {Mark} newMark\n * @returns {Leaf}\n */\n\n updateMark(mark, newMark) {\n const { marks } = this\n if (newMark.equals(mark)) return this\n if (!marks.has(mark)) return this\n const newMarks = marks.withMutations(collection => {\n collection.remove(mark).add(newMark)\n })\n return this.set('marks', newMarks)\n }\n\n /**\n * Add a `mark` to the leaf.\n *\n * @param {Mark} mark\n * @returns {Text}\n */\n\n addMark(mark) {\n const { marks } = this\n return this.set('marks', marks.add(mark))\n }\n\n /**\n * Add a `set` of marks to the leaf.\n *\n * @param {Set<Mark>} set\n * @returns {Text}\n */\n\n addMarks(set) {\n const { marks } = this\n return this.set('marks', marks.union(set))\n }\n\n /**\n * Insert a text `string` into the leaf at `offset`.\n *\n * @param {Number} offset\n * @param {String} string\n * @return {Leaf}\n */\n\n insertText(offset, string) {\n const { text } = this\n const next = text.slice(0, offset) + string + text.slice(offset)\n return this.set('text', next)\n }\n\n /**\n * Remove a `mark` from the leaf.\n *\n * @param {Mark} mark\n * @returns {Text}\n */\n\n removeMark(mark) {\n const { marks } = this\n return this.set('marks', marks.remove(mark))\n }\n\n /**\n * Return a JSON representation of the leaf.\n *\n * @return {Object}\n */\n\n toJSON() {\n const object = {\n object: this.object,\n text: this.text,\n marks: this.marks.toArray().map(m => m.toJSON()),\n }\n\n return object\n }\n}\n\n/**\n * Export.\n *\n * @type {Leaf}\n */\n\nexport default Leaf\n","/**\n * Mix in an `Interface` to a `Class`.\n *\n * @param {Class} Interface\n * @param {Class} Class\n */\n\nexport default function mixin(Interface, Classes) {\n for (const Class of Classes) {\n // Copy static properties from the interface.\n for (const name of Object.getOwnPropertyNames(Interface)) {\n if (Class.hasOwnProperty(name)) continue\n const desc = Object.getOwnPropertyDescriptor(Interface, name)\n Object.defineProperty(Class, name, desc)\n }\n\n // Copy instance properties from the interface.\n for (const name of Object.getOwnPropertyNames(Interface.prototype)) {\n if (Class.prototype.hasOwnProperty(name)) continue\n const desc = Object.getOwnPropertyDescriptor(Interface.prototype, name)\n Object.defineProperty(Class.prototype, name, desc)\n }\n }\n}\n","import Annotation from '../models/annotation'\nimport Block from '../models/block'\nimport Change from '../models/change'\nimport Decoration from '../models/decoration'\nimport Document from '../models/document'\nimport Editor from '../controllers/editor'\nimport Inline from '../models/inline'\nimport Leaf from '../models/leaf'\nimport Mark from '../models/mark'\nimport Node from '../models/node'\nimport Operation from '../models/operation'\nimport Point from '../models/point'\nimport Range from '../models/range'\nimport Selection from '../models/selection'\nimport Text from '../models/text'\nimport Value from '../models/value'\nimport isObject, { TYPES } from '../utils/is-object'\nimport mixin from '../utils/mixin'\n\n/**\n * A factory for the interface that all Slate objects implement.\n *\n * @type {Function}\n */\n\nfunction create(type) {\n const TYPE = TYPES[type]\n const camel = `${type.charAt(0).toUpperCase()}${type.slice(1)}`\n const is = `is${camel}`\n\n class ObjectInterface {\n /**\n * Return the type of the object.\n *\n * @return {String}\n */\n\n get object() {\n return type\n }\n }\n\n ObjectInterface[is] = isObject.bind(null, type)\n ObjectInterface.prototype[TYPE] = true\n return ObjectInterface\n}\n\n/**\n * Mix in the object interfaces.\n */\n\nObject.entries({\n Annotation,\n Block,\n Change,\n Decoration,\n Document,\n Editor,\n Inline,\n Leaf,\n Mark,\n Node,\n Operation,\n Point,\n Range,\n Selection,\n Text,\n Value,\n}).forEach(([camel, obj]) => mixin(create(camel.toLowerCase()), [obj]))\n","import mixin from '../utils/mixin'\nimport Annotation from '../models/annotation'\nimport Block from '../models/block'\nimport Decoration from '../models/decoration'\nimport Document from '../models/document'\nimport Inline from '../models/inline'\nimport Leaf from '../models/leaf'\nimport Mark from '../models/mark'\nimport Node from '../models/node'\nimport Operation from '../models/operation'\nimport Point from '../models/point'\nimport Range from '../models/range'\nimport Selection from '../models/selection'\nimport Text from '../models/text'\nimport Value from '../models/value'\n\n/**\n * The interface that all Slate models implement.\n *\n * @type {Class}\n */\n\nclass ModelInterface {\n /**\n * Alias `fromJS`.\n */\n\n static fromJS(...args) {\n return this.fromJSON(...args)\n }\n\n /**\n * Alias `toJS`.\n */\n\n toJS(...args) {\n return this.toJSON(...args)\n }\n}\n\n/**\n * Mix in the common interface.\n *\n * @param {Record}\n */\n\nmixin(ModelInterface, [\n Annotation,\n Block,\n Decoration,\n Document,\n Inline,\n Leaf,\n Mark,\n Node,\n Operation,\n Point,\n Range,\n Selection,\n Text,\n Value,\n])\n","/* global WeakMap, Map, Symbol */\n\n/**\n * GLOBAL: True if memoization should is enabled.\n *\n * @type {Boolean}\n */\n\nlet ENABLED = true\n\n/**\n * The leaf node of a cache tree. Used to support variable argument length. A\n * unique object, so that native Maps will key it by reference.\n *\n * @type {Symbol}\n */\n\nconst LEAF = Symbol('LEAF')\n\n/**\n * The node of a cache tree for a WeakMap to store cache visited by objects\n *\n * @type {Symbol}\n */\n\nconst STORE_KEY = Symbol('STORE_KEY')\n\n/**\n * Values to represent a memoized undefined and null value. Allows efficient value\n * retrieval using Map.get only.\n *\n * @type {Symbol}\n */\n\nconst UNDEFINED = Symbol('undefined')\nconst NULL = Symbol('null')\n\n/**\n * Default value for unset keys in native Maps\n *\n * @type {Undefined}\n */\n\nconst UNSET = undefined\n\n/**\n * Global Store for all cached values\n *\n * @type {WeakMap}\n */\n\nlet memoizeStore = new WeakMap()\n\n/**\n * Memoize all of the `properties` on a `object`.\n *\n * @param {Object} object\n * @param {Array} properties\n * @return {Record}\n */\n\nfunction memoize(object, properties) {\n for (const property of properties) {\n const original = object[property]\n\n if (!original) {\n throw new Error(`Object does not have a property named \"${property}\".`)\n }\n\n object[property] = function(...args) {\n // If memoization is disabled, call into the original method.\n if (!ENABLED) return original.apply(this, args)\n\n if (!memoizeStore.has(this)) {\n memoizeStore.set(this, {\n noArgs: {},\n hasArgs: {},\n })\n }\n\n const { noArgs, hasArgs } = memoizeStore.get(this)\n\n const takesArguments = args.length !== 0\n\n let cachedValue\n let keys\n\n if (takesArguments) {\n keys = [property, ...args]\n cachedValue = getIn(hasArgs, keys)\n } else {\n cachedValue = noArgs[property]\n }\n\n // If we've got a result already, return it.\n if (cachedValue !== UNSET) {\n return cachedValue === UNDEFINED ? undefined : cachedValue\n }\n\n // Otherwise calculate what it should be once and cache it.\n const value = original.apply(this, args)\n const v = value === undefined ? UNDEFINED : value\n\n if (takesArguments) {\n setIn(hasArgs, keys, v)\n } else {\n noArgs[property] = v\n }\n\n return value\n }\n }\n}\n\n/**\n * Get a value at a key path in a tree of Map.\n *\n * If not set, returns UNSET.\n * If the set value is undefined, returns UNDEFINED.\n *\n * @param {Map} map\n * @param {Array} keys\n * @return {Any|UNSET|UNDEFINED}\n */\n\nfunction getIn(map, keys) {\n for (let key of keys) {\n if (key === undefined) {\n key = UNDEFINED\n } else if (key == null) {\n key = NULL\n }\n\n if (typeof key === 'object') {\n map = map[STORE_KEY] && map[STORE_KEY].get(key)\n } else {\n map = map[key]\n }\n\n if (map === UNSET) return UNSET\n }\n\n return map[LEAF]\n}\n\n/**\n * Set a value at a key path in a tree of Map, creating Maps on the go.\n *\n * @param {Map} map\n * @param {Array} keys\n * @param {Any} value\n * @return {Map}\n */\n\nfunction setIn(map, keys, value) {\n let child = map\n\n for (let key of keys) {\n if (key === undefined) {\n key = UNDEFINED\n } else if (key == null) {\n key = NULL\n }\n\n if (typeof key !== 'object') {\n if (!child[key]) {\n child[key] = {}\n }\n\n child = child[key]\n continue\n }\n\n if (!child[STORE_KEY]) {\n child[STORE_KEY] = new WeakMap()\n }\n\n if (!child[STORE_KEY].has(key)) {\n const newChild = {}\n child[STORE_KEY].set(key, newChild)\n child = newChild\n continue\n }\n\n child = child[STORE_KEY].get(key)\n }\n\n // The whole path has been created, so set the value to the bottom most map.\n child[LEAF] = value\n return map\n}\n\n/**\n * In DEV mode, clears the previously memoized values, globally.\n *\n * @return {Void}\n */\n\nfunction resetMemoization() {\n memoizeStore = new WeakMap()\n}\n\n/**\n * In DEV mode, enable or disable the use of memoize values, globally.\n *\n * @param {Boolean} enabled\n * @return {Void}\n */\n\nfunction useMemoization(enabled) {\n ENABLED = enabled\n}\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport default memoize\nexport { resetMemoization, useMemoization }\n","import warning from 'tiny-warning'\nimport { List } from 'immutable'\n\nimport mixin from '../utils/mixin'\nimport Block from '../models/block'\nimport Document from '../models/document'\nimport Inline from '../models/inline'\nimport Node from '../models/node'\nimport KeyUtils from '../utils/key-utils'\nimport memoize from '../utils/memoize'\nimport PathUtils from '../utils/path-utils'\nimport Text from '../models/text'\n\n/**\n * The interface that `Document`, `Block` and `Inline` all implement, to make\n * working with the recursive node tree easier.\n *\n * @type {Class}\n */\n\nclass NodeInterface {\n /**\n * Get the first text node of a node, or the node itself.\n *\n * @return {Node|Null}\n */\n\n getFirstText() {\n if (this.object === 'text') {\n return this\n }\n\n let descendant = null\n\n const found = this.nodes.find(node => {\n if (node.object === 'text') return true\n descendant = node.getFirstText()\n return !!descendant\n })\n\n return descendant || found\n }\n\n /**\n * Get an object mapping all the keys in the node to their paths.\n *\n * @return {Object}\n */\n\n getKeysToPathsTable() {\n const ret = {\n [this.key]: [],\n }\n\n if (this.nodes) {\n this.nodes.forEach((node, i) => {\n const nested = node.getKeysToPathsTable()\n\n for (const key in nested) {\n const path = nested[key]\n\n warning(\n !(key in ret),\n `A node with a duplicate key of \"${key}\" was found! Duplicate keys are not allowed, you should use \\`node.regenerateKey\\` before inserting if you are reusing an existing node.`\n )\n\n ret[key] = [i, ...path]\n }\n })\n }\n\n return ret\n }\n\n /**\n * Get the last text node of a node, or the node itself.\n *\n * @return {Node|Null}\n */\n\n getLastText() {\n if (this.object === 'text') {\n return this\n }\n\n let descendant = null\n\n const found = this.nodes.findLast(node => {\n if (node.object === 'text') return true\n descendant = node.getLastText()\n return descendant\n })\n\n return descendant || found\n }\n\n /**\n * Get a node in the tree, or the node itself.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getNode(path) {\n path = this.resolvePath(path)\n if (!path) return null\n if (this.object === 'text' && path.size) return null\n const node = path.size ? this.getDescendant(path) : this\n return node\n }\n\n /**\n * Find the path to a node.\n *\n * @param {String|List} key\n * @return {List}\n */\n\n getPath(key) {\n // COMPAT: Handle passing in a path, to match other methods.\n if (List.isList(key)) {\n return key\n }\n\n // COMPAT: Handle a node object by iterating the descendants tree, so that\n // we avoid using keys for the future.\n if (Node.isNode(key) && this.descendants) {\n for (const [node, path] of this.descendants()) {\n if (key === node) return path\n }\n }\n\n const dict = this.getKeysToPathsTable()\n const path = dict[key]\n return path ? List(path) : null\n }\n\n /**\n * Get the concatenated text string of a node.\n *\n * @return {String}\n */\n\n getText() {\n if (this.object === 'text') {\n return this.text\n }\n\n const text = this.nodes.reduce((memo, c) => memo + c.text, '')\n return text\n }\n\n /**\n * Check if a node exists.\n *\n * @param {List|String} path\n * @return {Boolean}\n */\n\n hasNode(path) {\n const node = this.getNode(path)\n return !!node\n }\n\n /**\n * Normalize the text node with an `editor`.\n *\n * @param {Editor} editor\n * @return {Function|Void}\n */\n\n normalize(editor) {\n const normalizer = editor.run('normalizeNode', this)\n return normalizer\n }\n\n /**\n * Regenerate the node's key.\n *\n * @return {Node}\n */\n\n regenerateKey() {\n const key = KeyUtils.create()\n const node = this.set('key', key)\n return node\n }\n\n /**\n * Resolve a path from a path list or key string.\n *\n * An `index` can be provided, in which case paths created from a key string\n * will have the index pushed onto them. This is helpful in cases where you\n * want to accept either a `path` or a `key, index` combination for targeting\n * a location in the tree that doesn't exist yet, like when inserting.\n *\n * @param {List|String} value\n * @param {Number} index\n * @return {List}\n */\n\n resolvePath(path, index) {\n if (typeof path === 'string') {\n path = this.getPath(path)\n\n if (index != null) {\n path = path.concat(index)\n }\n } else {\n path = PathUtils.create(path)\n }\n\n return path\n }\n\n /**\n * Validate the node with an `editor`.\n *\n * @param {Editor} editor\n * @return {Error|Void}\n */\n\n validate(editor) {\n const error = editor.run('validateNode', this)\n return error\n }\n}\n\n/**\n * Memoize read methods.\n */\n\nmemoize(NodeInterface.prototype, [\n 'getFirstText',\n 'getKeysToPathsTable',\n 'getLastText',\n 'getText',\n 'normalize',\n 'validate',\n])\n\n/**\n * Mix in the node interface.\n */\n\nmixin(NodeInterface, [Block, Document, Inline, Text])\n","export default typeof global !== \"undefined\" ? global :\n typeof self !== \"undefined\" ? self :\n typeof window !== \"undefined\" ? window : {}\n","export default function identity() {\n return true\n}\n","import getDirection from 'direction'\nimport invariant from 'tiny-invariant'\nimport warning from 'tiny-warning'\nimport { List, OrderedSet, Set } from 'immutable'\n\nimport Annotation from '../models/annotation'\nimport Block from '../models/block'\nimport Decoration from '../models/decoration'\nimport Document from '../models/document'\nimport Inline from '../models/inline'\nimport Operation from '../models/operation'\nimport PathUtils from '../utils/path-utils'\nimport Point from '../models/point'\nimport Range from '../models/range'\nimport Selection from '../models/selection'\nimport Value from '../models/value'\nimport identity from '../utils/identity'\nimport memoize from '../utils/memoize'\nimport mixin from '../utils/mixin'\n\n/**\n * The interface that `Document`, `Block` and `Inline` all implement, to make\n * working with the recursive node tree easier.\n *\n * @type {Class}\n */\n\nclass ElementInterface {\n /**\n * Get the concatenated text of the node.\n *\n * @return {String}\n */\n\n get text() {\n return this.getText()\n }\n\n /**\n * Add `mark` to text at `path`.\n *\n * @param {List|String} path\n * @param {Mark} mark\n * @return {Node}\n */\n\n addMark(path, mark) {\n path = this.resolvePath(path)\n let node = this.assertDescendant(path)\n node = node.addMark(mark)\n const ret = this.replaceNode(path, node)\n return ret\n }\n\n /**\n * Create an iteratable for all of the ancestors of the node.\n *\n * @return {Iterable}\n */\n\n ancestors(path) {\n const iterable = this.createIterable({\n path,\n direction: null,\n downward: false,\n includeTargetAncestors: true,\n includeRoot: true,\n })\n\n return iterable\n }\n\n /**\n * Create an iteratable for all of the blocks of a node with `options`.\n *\n * @param {Options}\n * @return {Iterable}\n */\n\n blocks(options = {}) {\n const { onlyLeaves, onlyRoots, onlyTypes, match, ...rest } = options\n const iterable = this.descendants({\n includeDocument: false,\n includeInlines: false,\n includeTexts: false,\n ...rest,\n match: (node, path) => {\n if (onlyTypes && !onlyTypes.includes(node.type)) {\n return false\n } else if (onlyRoots && path.size !== 1) {\n return false\n } else if (onlyLeaves && !node.isLeafBlock()) {\n return false\n } else if (match && !match(node, path)) {\n return false\n } else {\n return true\n }\n },\n })\n\n return iterable\n }\n\n /**\n * Create an annotation with `properties` relative to the node.\n *\n * @param {Object|Annotation} properties\n * @return {Annotation}\n */\n\n createAnnotation(properties) {\n properties = Annotation.createProperties(properties)\n const annotation = this.resolveAnnotation(properties)\n return annotation\n }\n\n /**\n * Create a decoration with `properties` relative to the node.\n *\n * @param {Object|Decoration} properties\n * @return {Decoration}\n */\n\n createDecoration(properties) {\n properties = Decoration.createProperties(properties)\n const decoration = this.resolveDecoration(properties)\n return decoration\n }\n\n /**\n * Create an iteratable function starting at `target` path with `options`.\n *\n * @param {Object} options (optional)\n * @return {Function}\n */\n\n createIterable(options = {}) {\n const {\n direction = 'forward',\n downward = true,\n upward = true,\n includeBlocks = true,\n includeDocument = true,\n includeInlines = true,\n includeRoot = false,\n includeTarget = !!options.range,\n includeTargetAncestors = false,\n includeTexts = true,\n match = null,\n } = options\n\n const root = this\n let targetPath = null\n let targetRange = null\n\n // You can iterate over either a range or a path, but not both.\n if (options.range) {\n targetRange = root.resolveRange(options.range)\n targetPath = root.resolvePath(targetRange.start.path)\n } else if (options.path) {\n targetPath = root.resolvePath(options.path)\n }\n\n const targetNode = targetPath && root.assertNode(targetPath)\n const NativeSet = typeof window === 'undefined' ? global.Set : window.Set\n\n // Return an object that implements the iterable interface.\n return {\n [Symbol.iterator]() {\n const visited = new NativeSet()\n const startPath = targetRange && targetRange.start.path\n const endPath = targetRange && targetRange.end.path\n let path = targetPath\n let node = targetNode\n let includedTarget = false\n let includedStart = false\n let includingStart = false\n\n const result = () => {\n // When these are nulled out we've finished iterating.\n if (!path || !node) {\n return { done: true }\n }\n\n // We often don't want to include the root node itself.\n if (!includeRoot && node === root) {\n return next()\n }\n\n if (!includeBlocks && node.object === 'block') {\n return next()\n }\n\n if (!includeDocument && node.object === 'document') {\n return next()\n }\n\n if (!includeInlines && node.object === 'inline') {\n return next()\n }\n\n if (!includeTexts && node.object === 'text') {\n return next()\n }\n\n if (match && !match(node, path)) {\n return next()\n }\n\n return { value: [node, path], done: false }\n }\n\n const next = () => {\n if (!path || !node) {\n return result()\n }\n\n // When iterating over a range, we need to include the specific\n // ancestors in the start path of the range manually.\n if (startPath && !includedStart) {\n if (!includingStart) {\n includingStart = true\n path = PathUtils.create([])\n node = root\n return result()\n }\n\n if (path.size === startPath.size - 1) {\n includedStart = true\n path = targetPath\n node = targetNode\n return next()\n }\n\n path = startPath.slice(0, path.size + 1)\n node = root.assertNode(path)\n return result()\n }\n\n // Sometimes we want to include the target itself.\n if (includeTarget && !includedTarget) {\n includedTarget = true\n return result()\n }\n\n // When iterating over a range, if we get to the end path then exit.\n if (endPath && path.equals(endPath)) {\n node = null\n path = null\n return next()\n }\n\n // If we're allowed to go downward, and we haven't decsended yet, do so.\n if (downward && node.nodes && node.nodes.size && !visited.has(node)) {\n visited.add(node)\n const nextIndex = direction === 'forward' ? 0 : node.nodes.size - 1\n path = path.push(nextIndex)\n node = root.assertNode(path)\n return result()\n }\n\n // If we're going forward...\n if (direction === 'forward') {\n const newPath = PathUtils.increment(path)\n const newNode = root.getNode(newPath)\n\n if (newNode) {\n path = newPath\n node = newNode\n return result()\n }\n }\n\n // If we're going backward...\n if (direction === 'backward' && path.last() !== 0) {\n const newPath = PathUtils.decrement(path)\n const newNode = root.getNode(newPath)\n\n if (newNode) {\n path = newPath\n node = newNode\n return result()\n }\n }\n\n // If we're going upward...\n if (upward && path.size) {\n path = PathUtils.lift(path)\n node = root.assertNode(path)\n\n // Sometimes we'll have already visited the node on the way down\n // so we don't want to double count it.\n if (visited.has(node)) {\n return next()\n }\n\n visited.add(node)\n\n // If ancestors of the target node shouldn't be included, skip them.\n if (!includeTargetAncestors) {\n return next()\n } else {\n return result()\n }\n }\n\n path = null\n node = null\n return next()\n }\n\n return { next }\n },\n }\n }\n\n /**\n * Create a point with `properties` relative to the node.\n *\n * @param {Object|Point} properties\n * @return {Range}\n */\n\n createPoint(properties) {\n properties = Point.createProperties(properties)\n const point = this.resolvePoint(properties)\n return point\n }\n\n /**\n * Create a range with `properties` relative to the node.\n *\n * @param {Object|Range} properties\n * @return {Range}\n */\n\n createRange(properties) {\n properties = Range.createProperties(properties)\n const range = this.resolveRange(properties)\n return range\n }\n\n /**\n * Create a selection with `properties` relative to the node.\n *\n * @param {Object|Selection} properties\n * @return {Selection}\n */\n\n createSelection(properties) {\n properties = Selection.createProperties(properties)\n const selection = this.resolveSelection(properties)\n return selection\n }\n\n /**\n * Create an iteratable for all of the descendants of the node.\n *\n * @param {Object} options\n * @return {Iterable}\n */\n\n descendants(options) {\n const iterable = this.createIterable({ path: [], ...options })\n return iterable\n }\n\n /**\n * Find all of the descendants that match a `predicate`.\n *\n * @param {Function} predicate\n * @return {List<Node>}\n */\n\n filterDescendants(predicate = identity) {\n const matches = []\n\n for (const [node, path] of this.descendants()) {\n if (predicate(node, path)) {\n matches.push(node)\n }\n }\n\n return List(matches)\n }\n\n /**\n * Find the first descendant that matches a `predicate`.\n *\n * @param {Function} predicate\n * @return {Node|Null}\n */\n\n findDescendant(predicate = identity) {\n for (const [node, path] of this.descendants()) {\n if (predicate(node, path)) {\n return node\n }\n }\n\n return null\n }\n\n /**\n * Iterate over all descendants, breaking if `predicate` returns false.\n *\n * @param {Function} predicate\n */\n\n forEachDescendant(predicate = identity) {\n for (const next of this.descendants()) {\n const ret = predicate(...next)\n\n if (ret === false) {\n return\n }\n }\n }\n\n /**\n * Get a set of the active marks in a `range`. Active marks are marks that are\n * on every text node in a given range. This is a common distinction for\n * highlighting toolbar buttons for example.\n *\n * TODO: this method needs to be cleaned up, it's very hard to follow and\n * probably doing unnecessary work.\n *\n * @param {Range} range\n * @return {Set<Mark>}\n */\n\n getActiveMarksAtRange(range) {\n range = this.resolveRange(range)\n\n if (range.isUnset) {\n return Set()\n }\n\n if (range.isCollapsed) {\n const { start } = range\n return this.getInsertMarksAtPoint(start)\n }\n\n const { start, end } = range\n let startPath = start.path\n let startOffset = start.offset\n let endPath = end.path\n let endOffset = end.offset\n let startText = this.getDescendant(startPath)\n let endText = this.getDescendant(endPath)\n\n if (!startPath.equals(endPath)) {\n while (!startPath.equals(endPath) && endOffset === 0) {\n ;[[endText, endPath]] = this.texts({\n path: endPath,\n direction: 'backward',\n })\n\n endOffset = endText.text.length\n }\n\n while (\n !startPath.equals(endPath) &&\n startOffset === startText.text.length\n ) {\n ;[[startText, startPath]] = this.texts({ path: startPath })\n startOffset = 0\n }\n }\n\n if (startPath.equals(endPath)) {\n return startText.marks\n }\n\n const startMarks = startText.marks\n\n // PERF: if start marks is empty we can return early.\n if (startMarks.size === 0) {\n return Set()\n }\n\n const endMarks = endText.marks\n let marks = startMarks.intersect(endMarks)\n\n // If marks is already empty, the active marks is empty\n if (marks.size === 0) {\n return marks\n }\n\n ;[[startText, startPath]] = this.texts({ path: startPath })\n\n while (!startPath.equals(endPath)) {\n if (startText.text.length !== 0) {\n marks = marks.intersect(startText.marks)\n\n if (marks.size === 0) {\n return Set()\n }\n }\n\n ;[[startText, startPath]] = this.texts({ path: startPath })\n }\n\n return marks\n }\n\n /**\n * Get a list of the ancestors of a descendant.\n *\n * @param {List|String} path\n * @return {List<Node>|Null}\n */\n\n getAncestors(path) {\n const iterable = this.ancestors(path)\n const array = Array.from(iterable, ([node]) => node).reverse()\n const list = List(array)\n return list\n }\n\n /**\n * Get the leaf block descendants of the node.\n *\n * @return {List<Node>}\n */\n\n getBlocks() {\n const iterable = this.blocks({ onlyLeaves: true })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get all of the leaf blocks that match a `type`.\n *\n * @param {String} type\n * @return {List<Node>}\n */\n\n getBlocksByType(type) {\n const iterable = this.blocks({ onlyLeaves: true, onlyTypes: [type] })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get a child node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getChild(path) {\n path = this.resolvePath(path)\n\n if (!path || path.size > 1) {\n return null\n }\n\n const child = this.nodes.get(path.first())\n return child\n }\n\n /**\n * Get closest parent of node that matches a `predicate`.\n *\n * @param {List|String} path\n * @param {Function} predicate\n * @return {Node|Null}\n */\n\n getClosest(path, predicate) {\n for (const [n, p] of this.ancestors(path)) {\n if (predicate(n, p)) {\n return n\n }\n }\n\n return null\n }\n\n /**\n * Get the closest block parent of a node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getClosestBlock(path) {\n const closest = this.getClosest(path, n => n.object === 'block')\n return closest\n }\n\n /**\n * Get the closest inline parent of a node by `path`.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getClosestInline(path) {\n const closest = this.getClosest(path, n => n.object === 'inline')\n return closest\n }\n\n /**\n * Get the closest void parent of a node by `path`.\n *\n * @param {List|String} path\n * @param {Editor} editor\n * @return {Node|Null}\n */\n\n getClosestVoid(path, editor) {\n invariant(\n !Value.isValue(editor),\n 'As of Slate 0.42.0, the `node.getClosestVoid` method takes an `editor` instead of a `value`.'\n )\n\n const closest = this.getClosest(path, n => editor.isVoid(n))\n return closest\n }\n\n /**\n * Get the common ancestor of nodes `a` and `b`.\n *\n * @param {List} a\n * @param {List} b\n * @return {Node}\n */\n\n getCommonAncestor(a, b) {\n a = this.resolvePath(a)\n b = this.resolvePath(b)\n\n if (!a || !b) {\n return null\n }\n\n const path = PathUtils.relate(a, b)\n const node = this.getNode(path)\n return node\n }\n\n /**\n * Get the decorations for the node from an `editor`.\n *\n * @param {Editor} editor\n * @return {List}\n */\n\n getDecorations(editor) {\n let decorations = editor.run('decorateNode', this)\n decorations = Decoration.createList(decorations)\n return decorations\n }\n\n /**\n * Get the depth of a descendant, with optional `startAt`.\n *\n * @param {List|String} path\n * @param {Number} startAt\n * @return {Number|Null}\n */\n\n getDepth(path, startAt = 1) {\n path = this.resolvePath(path)\n\n if (!path) {\n return null\n }\n\n const node = this.getNode(path)\n const depth = node ? path.size - 1 + startAt : null\n return depth\n }\n\n /**\n * Get a descendant node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getDescendant(path) {\n path = this.resolvePath(path)\n\n if (!path || !path.size) {\n return null\n }\n\n let node = this\n\n path.forEach(index => {\n node = node.getIn(['nodes', index])\n return !!node\n })\n\n return node\n }\n\n /**\n * Get all of the descendant nodes in a `range`.\n *\n * @param {Range} range\n * @return {List<Node>}\n */\n\n getDescendantsAtRange(range) {\n const iterable = this.descendants({ range })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get a fragment of the node at a `range`.\n *\n * @param {Range} range\n * @return {Document}\n */\n\n getFragmentAtRange(range) {\n range = this.resolveRange(range)\n\n if (range.isUnset) {\n return Document.create()\n }\n\n const { start, end } = range\n let node = this\n let targetPath = end.path\n let targetPosition = end.offset\n let side = 'end'\n\n while (targetPath.size) {\n const index = targetPath.last()\n node = node.splitNode(targetPath, targetPosition)\n targetPosition = index + 1\n targetPath = PathUtils.lift(targetPath)\n\n if (!targetPath.size && side === 'end') {\n targetPath = start.path\n targetPosition = start.offset\n side = 'start'\n }\n }\n\n const startIndex = start.path.first() + 1\n const endIndex = end.path.first() + 2\n const nodes = node.nodes.slice(startIndex, endIndex)\n const fragment = Document.create({ nodes })\n return fragment\n }\n\n /**\n * Get the furthest ancestors of a node that matches a `predicate`.\n *\n * @param {Path} path\n * @param {Function} predicate\n * @return {Node|Null}\n */\n\n getFurthest(path, predicate = identity) {\n const iterable = this.ancestors(path)\n const results = Array.from(iterable).reverse()\n\n for (const [n, p] of results) {\n if (predicate(n, p)) {\n return n\n }\n }\n\n return null\n }\n\n /**\n * Get the furthest block parent of a node.\n *\n * @param {Path} path\n * @return {Node|Null}\n */\n\n getFurthestBlock(path) {\n const furthest = this.getFurthest(path, n => n.object === 'block')\n return furthest\n }\n\n /**\n * Get the furthest child ancestor of a node at `path`.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getFurthestChild(path) {\n path = this.resolvePath(path)\n\n if (!path || !path.size) {\n return null\n }\n\n const furthest = this.nodes.get(path.first())\n return furthest\n }\n\n /**\n * Get the furthest inline parent of a node.\n *\n * @param {Path} path\n * @return {Node|Null}\n */\n\n getFurthestInline(path) {\n const furthest = this.getFurthest(path, n => n.object === 'inline')\n return furthest\n }\n\n /**\n * Get the closest inline nodes for each text node in the node.\n *\n * @return {List<Node>}\n */\n\n getInlines() {\n const iterable = this.inlines({ onlyLeaves: true })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get all of the leaf inline nodes that match a `type`.\n *\n * @param {String} type\n * @return {List<Node>}\n */\n\n getInlinesByType(type) {\n const iterable = this.inlines({ onlyLeaves: true, onlyTypes: [type] })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get a set of marks that would occur on the next insert at a `point` in the\n * node. This mimics expected rich text editing behaviors of mark contiuation.\n *\n * @param {Point} point\n * @return {Set<Mark>}\n */\n\n getInsertMarksAtPoint(point) {\n point = this.resolvePoint(point)\n const { path, offset } = point\n const text = this.getDescendant(path)\n\n // PERF: we can exit early if the offset isn't at the start of the node.\n if (offset !== 0) {\n return text.marks\n }\n\n let blockNode\n let blockPath\n\n for (const entry of this.ancestors(path)) {\n const [n, p] = entry\n\n if (n.object === 'block') {\n blockNode = n\n blockPath = p\n }\n }\n\n const relativePath = PathUtils.drop(path, blockPath.size)\n const [previous] = blockNode.texts({\n path: relativePath,\n direction: 'backward',\n })\n\n // If there's no previous text, we're at the start of the block, so use\n // the current text nodes marks.\n if (!previous) {\n return text.marks\n }\n\n // Otherwise, continue with the previous text node's marks instead.\n const [previousText] = previous\n return previousText.marks\n }\n\n /**\n * Get a set of marks that would occur on the next insert at a `range`.\n * This mimics expected rich text editing behaviors of mark contiuation.\n *\n * @param {Range} range\n * @return {Set<Mark>}\n */\n\n getInsertMarksAtRange(range) {\n range = this.resolveRange(range)\n const { start } = range\n\n if (range.isUnset) {\n return Set()\n }\n\n if (range.isCollapsed) {\n return this.getInsertMarksAtPoint(start)\n }\n\n const text = this.getDescendant(start.path)\n return text.marks\n }\n\n /**\n * Get the bottom-most block descendants in a `range`.\n *\n * @param {Range} range\n * @return {List<Node>}\n */\n\n getLeafBlocksAtRange(range) {\n const iterable = this.blocks({ range, onlyLeaves: true })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get the bottom-most inline nodes for each text node in a `range`.\n *\n * @param {Range} range\n * @return {List<Node>}\n */\n\n getLeafInlinesAtRange(range) {\n const iterable = this.inlines({ range, onlyLeaves: true })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get an object mapping all the keys in the node to their paths.\n *\n * @return {Map}\n */\n\n getNodesToPathsMap() {\n const root = this\n const map =\n typeof window === 'undefined' ? new global.Map() : new window.Map()\n\n map.set(root, PathUtils.create([]))\n\n root.forEachDescendant((node, path) => {\n map.set(node, path)\n })\n\n return map\n }\n\n /**\n * Get all of the marks for all of the characters of every text node.\n *\n * @return {OrderedSet<Mark>}\n */\n\n getMarks() {\n const iterable = this.marks()\n const array = Array.from(iterable, ([mark]) => mark)\n return OrderedSet(array)\n }\n\n /**\n * Get a set of the marks in a `range`.\n *\n * @param {Range} range\n * @return {OrderedSet<Mark>}\n */\n\n getMarksAtRange(range) {\n const iterable = this.marks({ range })\n const array = Array.from(iterable, ([mark]) => mark)\n return OrderedSet(array)\n }\n\n /**\n * Get all of the marks that match a `type`.\n *\n * @param {String} type\n * @return {OrderedSet<Mark>}\n */\n\n getMarksByType(type) {\n const iterable = this.marks({ onlyTypes: [type] })\n const array = Array.from(iterable, ([mark]) => mark)\n return OrderedSet(array)\n }\n\n /**\n * Get the block node after a descendant text node by `path`.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getNextBlock(path) {\n const [entry] = this.blocks({ path, onlyLeaves: true })\n const block = entry ? entry[0] : null\n return block\n }\n\n /**\n * Get the next node in the tree, returning siblings or ancestor siblings.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getNextNode(path) {\n const iterable = this.createIterable({ path, downward: false })\n const [entry] = iterable\n const node = entry ? entry[0] : null\n return node\n }\n\n /**\n * Get the next sibling of a node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getNextSibling(path) {\n const [entry] = this.siblings(path)\n const node = entry ? entry[0] : null\n return node\n }\n\n /**\n * Get the text node after a descendant text node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getNextText(path) {\n const [entry] = this.texts({ path })\n const node = entry ? entry[0] : null\n return node\n }\n\n /**\n * Get the offset for a descendant text node by `path` or `key`.\n *\n * @param {List|string} path\n * @return {Number}\n */\n\n getOffset(path) {\n path = this.resolvePath(path)\n this.assertDescendant(path)\n\n // Calculate the offset of the nodes before the highest child.\n const index = path.first()\n\n const offset = this.nodes\n .slice(0, index)\n .reduce((memo, n) => memo + n.text.length, 0)\n\n // Recurse if need be.\n const ret =\n path.size === 1\n ? offset\n : offset + this.nodes.get(index).getOffset(PathUtils.drop(path))\n\n return ret\n }\n\n /**\n * Get the offset from a `range`.\n *\n * @param {Range} range\n * @return {Number}\n */\n\n getOffsetAtRange(range) {\n range = this.resolveRange(range)\n\n if (range.isUnset) {\n throw new Error('The range cannot be unset to calculcate its offset.')\n }\n\n if (range.isExpanded) {\n throw new Error('The range must be collapsed to calculcate its offset.')\n }\n\n const { start } = range\n const offset = this.getOffset(start.path) + start.offset\n return offset\n }\n\n /**\n * Get the parent of a descendant node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getParent(path) {\n path = this.resolvePath(path)\n if (!path) return null\n if (!path.size) return null\n const parentPath = PathUtils.lift(path)\n const parent = this.getNode(parentPath)\n return parent\n }\n\n /**\n * Get the block node before a descendant text node by `path`.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getPreviousBlock(path) {\n const [entry] = this.blocks({\n path,\n onlyLeaves: true,\n direction: 'backward',\n })\n const block = entry ? entry[0] : null\n return block\n }\n\n /**\n * Get the previous node from a node in the tree.\n *\n * This will not only check for siblings but instead move up the tree\n * returning the previous ancestor if no sibling is found.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getPreviousNode(path) {\n const iterable = this.createIterable({\n path,\n downward: false,\n direction: 'backward',\n })\n\n const [entry] = iterable\n const node = entry ? entry[0] : null\n return node\n }\n\n /**\n * Get the previous sibling of a node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getPreviousSibling(path) {\n const [entry] = this.siblings(path, { direction: 'backward' })\n const node = entry ? entry[0] : null\n return node\n }\n\n /**\n * Get the text node before a descendant text node.\n *\n * @param {List|String} path\n * @return {Node|Null}\n */\n\n getPreviousText(path) {\n const [entry] = this.texts({ path, direction: 'backward' })\n const node = entry ? entry[0] : null\n return node\n }\n\n /**\n * Get only the root block nodes in a `range`.\n *\n * @param {Range} range\n * @return {List}\n */\n\n getRootBlocksAtRange(range) {\n const iterable = this.blocks({ range, onlyRoots: true })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get only the root inline nodes in a `range`.\n *\n * @param {Range} range\n * @return {List}\n */\n\n getRootInlinesAtRange(range) {\n const iterable = this.inlines({ range, onlyRoots: true })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get the descendent text node at an `offset`.\n *\n * @param {String} offset\n * @return {Node|Null}\n */\n\n getTextAtOffset(offset) {\n // PERF: Add a few shortcuts for the obvious cases.\n if (offset === 0) return this.getFirstText()\n if (offset === this.text.length) return this.getLastText()\n if (offset < 0 || offset > this.text.length) return null\n\n let length = 0\n\n for (const [node] of this.texts()) {\n length += node.text.length\n\n if (length > offset) {\n return node\n }\n }\n\n return null\n }\n\n /**\n * Get the direction of the node's text.\n *\n * @return {String}\n */\n\n getTextDirection() {\n const dir = getDirection(this.text)\n return dir === 'neutral' ? null : dir\n }\n\n /**\n * Recursively get all of the child text nodes in order of appearance.\n *\n * @return {List<Node>}\n */\n\n getTexts() {\n const iterable = this.texts()\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Get all of the text nodes in a `range` as a List.\n *\n * @param {Range} range\n * @return {List<Node>}\n */\n\n getTextsAtRange(range) {\n const iterable = this.texts({ range })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n /**\n * Check if the node has block children.\n *\n * @return {Boolean}\n */\n\n hasBlockChildren() {\n return !!(this.nodes && this.nodes.find(n => n.object === 'block'))\n }\n\n /**\n * Check if a child node exists.\n *\n * @param {List|String} path\n * @return {Boolean}\n */\n\n hasChild(path) {\n const child = this.getChild(path)\n return !!child\n }\n\n /**\n * Check if a node has inline children.\n *\n * @return {Boolean}\n */\n\n hasInlineChildren() {\n return !!(\n this.nodes &&\n this.nodes.find(n => n.object === 'inline' || n.object === 'text')\n )\n }\n\n /**\n * Recursively check if a child node exists.\n *\n * @param {List|String} path\n * @return {Boolean}\n */\n\n hasDescendant(path) {\n const descendant = this.getDescendant(path)\n return !!descendant\n }\n\n /**\n * Check if a node has a void parent.\n *\n * @param {List|String} path\n * @param {Editor} editor\n * @return {Boolean}\n */\n\n hasVoidParent(path, editor) {\n invariant(\n !Value.isValue(editor),\n 'As of Slate 0.42.0, the `node.hasVoidParent` method takes an `editor` instead of a `value`.'\n )\n\n const closest = this.getClosestVoid(path, editor)\n return !!closest\n }\n\n /**\n * Create an iteratable for all of the inlines of a node with `options`.\n *\n * @param {Options}\n * @return {Iterable}\n */\n\n inlines(options = {}) {\n const { onlyLeaves, onlyRoots, onlyTypes, match, ...rest } = options\n const iterable = this.descendants({\n includeBlocks: false,\n includeTexts: false,\n includeDocument: false,\n ...rest,\n match: (node, path) => {\n if (onlyTypes && !onlyTypes.includes(node.type)) {\n return false\n } else if (onlyLeaves && !node.isLeafInline()) {\n return false\n } else if (onlyRoots && this.getParent(path).object !== 'block') {\n return false\n } else if (match && !match(node, path)) {\n return false\n } else {\n return true\n }\n },\n })\n\n return iterable\n }\n\n /**\n * Insert a `node`.\n *\n * @param {List|String} path\n * @param {Node} node\n * @return {Node}\n */\n\n insertNode(path, node) {\n path = this.resolvePath(path)\n const index = path.last()\n const parentPath = PathUtils.lift(path)\n let parent = this.assertNode(parentPath)\n const nodes = parent.nodes.splice(index, 0, node)\n parent = parent.set('nodes', nodes)\n const ret = this.replaceNode(parentPath, parent)\n return ret\n }\n\n /**\n * Insert `text` at `offset` in node by `path`.\n *\n * @param {List|String} path\n * @param {Number} offset\n * @param {String} text\n * @return {Node}\n */\n\n insertText(path, offset, text) {\n path = this.resolvePath(path)\n let node = this.assertDescendant(path)\n node = node.insertText(offset, text)\n const ret = this.replaceNode(path, node)\n return ret\n }\n\n /**\n * Check whether the node is a leaf block.\n *\n * @return {Boolean}\n */\n\n isLeafBlock() {\n if (this.object !== 'block') {\n return false\n }\n\n if (this.nodes.some(n => n.object === 'block')) {\n return false\n }\n\n return true\n }\n\n /**\n * Check whether the node is a leaf inline.\n *\n * @return {Boolean}\n */\n\n isLeafInline() {\n if (this.object !== 'inline') {\n return false\n }\n\n if (this.nodes.some(n => n.object === 'inline')) {\n return false\n }\n\n return true\n }\n\n /**\n * Check whether a descendant node is inside a `range` by `path`.\n *\n * @param {List|String} path\n * @param {Range} range\n * @return {Node}\n */\n\n isInRange(path, range) {\n path = this.resolvePath(path)\n range = this.resolveRange(range)\n\n if (range.isUnset) {\n return false\n }\n\n const toStart = PathUtils.compare(path, range.start.path)\n const toEnd = PathUtils.compare(path, range.end.path)\n const isInRange = toStart !== -1 && toEnd !== 1\n return isInRange\n }\n\n /**\n * Map all child nodes, updating them in their parents. This method is\n * optimized to not return a new node if no changes are made.\n *\n * @param {Function} predicate\n * @return {Node}\n */\n\n mapChildren(predicate = identity) {\n let { nodes } = this\n\n nodes.forEach((node, i) => {\n const ret = predicate(node, i, this.nodes)\n if (ret !== node) nodes = nodes.set(ret.key, ret)\n })\n\n const ret = this.set('nodes', nodes)\n return ret\n }\n\n /**\n * Map all descendant nodes, updating them in their parents. This method is\n * optimized to not return a new node if no changes are made.\n *\n * @param {Function} predicate\n * @return {Node}\n */\n\n mapDescendants(predicate = identity) {\n let { nodes } = this\n\n nodes.forEach((node, index) => {\n let ret = node\n if (ret.object !== 'text') ret = ret.mapDescendants(predicate)\n ret = predicate(ret, index, this.nodes)\n if (ret === node) return\n\n nodes = nodes.set(index, ret)\n })\n\n const ret = this.set('nodes', nodes)\n return ret\n }\n\n /**\n * Create an iteratable for all the marks in text nodes with `options`.\n *\n * @param {Options}\n * @return {Iterable}\n */\n\n marks(options = {}) {\n const { onlyTypes = null, match, ...rest } = options\n const texts = this.texts(rest)\n\n return {\n [Symbol.iterator]() {\n const iterator = texts[Symbol.iterator]()\n let node = null\n let path = null\n let remaining = []\n\n const next = () => {\n if (remaining.length) {\n const mark = remaining.shift()\n\n if (onlyTypes && !onlyTypes.includes(mark.type)) {\n return next()\n } else if (match && !match(mark, node, path)) {\n return next()\n }\n\n return { value: [mark, node, path], done: false }\n }\n\n const { value, done } = iterator.next()\n\n if (done) {\n return { done: true }\n }\n\n ;[node, path] = value\n remaining = node.marks.toArray()\n return next()\n }\n\n return { next }\n },\n }\n }\n\n /**\n * Merge a node backwards its previous sibling.\n *\n * @param {List|Key} path\n * @return {Node}\n */\n\n mergeNode(path) {\n const b = this.assertNode(path)\n path = this.resolvePath(path)\n\n if (path.last() === 0) {\n throw new Error(\n `Unable to merge node because it has no previous sibling: ${b}`\n )\n }\n\n const withPath = PathUtils.decrement(path)\n const a = this.assertNode(withPath)\n\n if (a.object !== b.object) {\n throw new Error(\n `Unable to merge two different kinds of nodes: ${a} and ${b}`\n )\n }\n\n const newNode =\n a.object === 'text'\n ? a.mergeText(b)\n : a.set('nodes', a.nodes.concat(b.nodes))\n\n let ret = this\n ret = ret.removeNode(path)\n ret = ret.removeNode(withPath)\n ret = ret.insertNode(withPath, newNode)\n return ret\n }\n\n /**\n * Move a node by `path` to `newPath`.\n *\n * A `newIndex` can be provided when move nodes by `key`, to account for not\n * being able to have a key for a location in the tree that doesn't exist yet.\n *\n * @param {List|Key} path\n * @param {List|Key} newPath\n * @param {Number} newIndex\n * @return {Node}\n */\n\n moveNode(path, newPath, newIndex = 0) {\n const node = this.assertNode(path)\n path = this.resolvePath(path)\n newPath = this.resolvePath(newPath, newIndex)\n\n const newParentPath = PathUtils.lift(newPath)\n this.assertNode(newParentPath)\n\n // TODO: this is a bit hacky, re-creating the operation that led to this method being called\n // Alternative 1: pass the operation through from apply -> value.moveNode\n // Alternative 2: add a third property to the operation called \"transformedNewPath\", pass that through\n const op = Operation.create({\n type: 'move_node',\n path,\n newPath,\n })\n newPath = PathUtils.transform(path, op).first()\n\n let ret = this\n ret = ret.removeNode(path)\n ret = ret.insertNode(newPath, node)\n return ret\n }\n\n /**\n * Remove `mark` from text at `path`.\n *\n * @param {List} path\n * @param {Mark} mark\n * @return {Node}\n */\n\n removeMark(path, mark) {\n path = this.resolvePath(path)\n let node = this.assertDescendant(path)\n node = node.removeMark(mark)\n const ret = this.replaceNode(path, node)\n return ret\n }\n\n /**\n * Remove a node.\n *\n * @param {List|String} path\n * @return {Node}\n */\n\n removeNode(path) {\n this.assertDescendant(path)\n path = this.resolvePath(path)\n const deep = path.flatMap(x => ['nodes', x])\n const ret = this.deleteIn(deep)\n return ret\n }\n\n /**\n * Remove `text` at `offset` in node.\n *\n * @param {List|Key} path\n * @param {Number} offset\n * @param {String} text\n * @return {Node}\n */\n\n removeText(path, offset, text) {\n let node = this.assertDescendant(path)\n node = node.removeText(offset, text.length)\n const ret = this.replaceNode(path, node)\n return ret\n }\n\n /**\n * Replace a `node` in the tree.\n *\n * @param {List|Key} path\n * @param {Node} node\n * @return {Node}\n */\n\n replaceNode(path, node) {\n path = this.resolvePath(path)\n\n if (!path) {\n throw new Error(\n `Unable to replace a node because it could not be found in the first place: ${path}`\n )\n }\n\n if (!path.size) return node\n this.assertNode(path)\n const deep = path.flatMap(x => ['nodes', x])\n const ret = this.setIn(deep, node)\n return ret\n }\n\n /**\n * Resolve a `annotation`, relative to the node, ensuring that the keys and\n * offsets in the annotation exist and that they are synced with the paths.\n *\n * @param {Annotation|Object} annotation\n * @return {Annotation}\n */\n\n resolveAnnotation(annotation) {\n annotation = Annotation.create(annotation)\n annotation = annotation.normalize(this)\n return annotation\n }\n\n /**\n * Resolve a `decoration`, relative to the node, ensuring that the keys and\n * offsets in the decoration exist and that they are synced with the paths.\n *\n * @param {Decoration|Object} decoration\n * @return {Decoration}\n */\n\n resolveDecoration(decoration) {\n decoration = Decoration.create(decoration)\n decoration = decoration.normalize(this)\n return decoration\n }\n\n /**\n * Resolve a `point`, relative to the node, ensuring that the keys and\n * offsets in the point exist and that they are synced with the paths.\n *\n * @param {Point|Object} point\n * @return {Point}\n */\n\n resolvePoint(point) {\n point = Point.create(point)\n point = point.normalize(this)\n return point\n }\n\n /**\n * Resolve a `range`, relative to the node, ensuring that the keys and\n * offsets in the range exist and that they are synced with the paths.\n *\n * @param {Range|Object} range\n * @return {Range}\n */\n\n resolveRange(range) {\n range = Range.create(range)\n range = range.normalize(this)\n return range\n }\n\n /**\n * Resolve a `selection`, relative to the node, ensuring that the keys and\n * offsets in the selection exist and that they are synced with the paths.\n *\n * @param {Selection|Object} selection\n * @return {Selection}\n */\n\n resolveSelection(selection) {\n selection = Selection.create(selection)\n selection = selection.normalize(this)\n return selection\n }\n\n /**\n * Set `properties` on a node.\n *\n * @param {List|String} path\n * @param {Object} properties\n * @return {Node}\n */\n\n setNode(path, properties) {\n let node = this.assertNode(path)\n node = node.merge(properties)\n const ret = this.replaceNode(path, node)\n return ret\n }\n\n /**\n * Set `properties` on `mark` on text at `offset` and `length` in node.\n *\n * @param {List|String} path\n * @param {Number} offset\n * @param {Number} length\n * @param {Mark} mark\n * @param {Object} properties\n * @return {Node}\n */\n\n setMark(path, properties, newProperties) {\n path = this.resolvePath(path)\n let node = this.assertDescendant(path)\n node = node.setMark(properties, newProperties)\n const ret = this.replaceNode(path, node)\n return ret\n }\n\n /**\n * Create an iteratable for the siblings in the tree at `path`.\n *\n * @param {List|Array} path\n * @return {Iterable}\n */\n\n siblings(path, options) {\n const iterable = this.createIterable({\n path,\n upward: false,\n downward: false,\n ...options,\n })\n\n return iterable\n }\n\n /**\n * Split a node by `path` at `position` with optional `properties` to apply\n * to the newly split node.\n *\n * @param {List|String} path\n * @param {Number} position\n * @param {Object} properties\n * @return {Node}\n */\n\n splitNode(path, position, properties) {\n const child = this.assertNode(path)\n path = this.resolvePath(path)\n let a\n let b\n\n if (child.object === 'text') {\n ;[a, b] = child.splitText(position)\n } else {\n const befores = child.nodes.take(position)\n const afters = child.nodes.skip(position)\n a = child.set('nodes', befores)\n b = child.set('nodes', afters).regenerateKey()\n }\n\n if (properties && child.object !== 'text') {\n b = b.merge(properties)\n }\n\n let ret = this\n ret = ret.removeNode(path)\n ret = ret.insertNode(path, b)\n ret = ret.insertNode(path, a)\n return ret\n }\n\n /**\n * Create an iteratable for all the text node descendants.\n *\n * @param {Object} options\n * @return {Iterable}\n */\n\n texts(options) {\n const iterable = this.descendants({\n includeBlocks: false,\n includeInlines: false,\n includeDocument: false,\n ...options,\n })\n\n return iterable\n }\n\n /**\n * Deprecated.\n */\n\n getBlocksAtRange(range) {\n warning(\n false,\n 'As of slate@0.44 the `node.getBlocksAtRange` method has been renamed to `getLeafBlocksAtRange`.'\n )\n\n return this.getLeafBlocksAtRange(range)\n }\n\n getBlocksAtRangeAsArray(range) {\n warning(\n false,\n 'As of slate@0.44 the `node.getBlocksAtRangeAsArray` method has been renamed to `getLeafBlocksAtRangeAsArray`.'\n )\n\n return this.getLeafBlocksAtRangeAsArray(range)\n }\n\n getInlinesAtRange(range) {\n warning(\n false,\n 'As of slate@0.44 the `node.getInlinesAtRange` method has been renamed to `getLeafInlinesAtRange`.'\n )\n\n return this.getLeafInlinesAtRange(range)\n }\n\n getInlinesAtRangeAsArray(range) {\n warning(\n false,\n 'As of slate@0.44 the `node.getInlinesAtRangeAsArray` method has been renamed to `getLeafInlinesAtRangeAsArray`.'\n )\n\n return this.getLeafInlinesAtRangeAsArray(range)\n }\n\n getNextTextAndPath(path) {\n warning(\n false,\n 'As of slate@0.47, the `getNextTextAndPath` method has been renamed to `getNextTextEntry`.'\n )\n\n return this.getNextTextEntry(path)\n }\n\n getNextDeepMatchingNodeAndPath(path, iterator = () => true) {\n warning(\n false,\n 'As of slate@0.47, the `getNextDeepMatchingNodeAndPath` method is deprecated.'\n )\n\n const match = this.getNextMatchingNodeAndPath(path)\n\n if (!match) return null\n\n let [nextNode, nextPath] = match\n\n let childMatch\n\n const assign = () => {\n childMatch =\n nextNode.object !== 'text' &&\n nextNode.findFirstDescendantAndPath(iterator, nextPath)\n return childMatch\n }\n\n while (assign(childMatch)) {\n ;[nextNode, nextPath] = childMatch\n }\n\n if (!nextNode) return null\n\n return iterator(nextNode)\n ? [nextNode, nextPath]\n : this.getNextDeepMatchingNodeAndPath(match[1], iterator)\n }\n\n getPreviousTextAndPath(path) {\n warning(\n false,\n 'As of slate@0.47, the `getPreviousTextAndPath` method has been renamed to `getPreviousTextEntry`.'\n )\n\n return this.getPreviousTextEntry(path)\n }\n\n findFirstDescendantAndPath(iterator, pathToThisNode) {\n warning(\n false,\n 'As of slate@0.47, the `findFirstDescendantAndPath` method is deprecated.'\n )\n\n return this.findDescendantAndPath(iterator, pathToThisNode, false)\n }\n\n getPreviousMatchingNodeAndPath(path, iterator = () => true) {\n warning(\n false,\n 'As of slate@0.47, the `getPreviousMatchingNodeAndPath` method is deprecated.'\n )\n\n if (!path) return null\n\n for (let i = path.size; i > 0; i--) {\n const p = path.slice(0, i)\n if (p.last() === 0) continue\n\n let previousPath = PathUtils.decrement(p)\n let previousNode = this.getNode(previousPath)\n\n while (previousNode && !iterator(previousNode)) {\n previousPath = PathUtils.decrement(previousPath)\n previousNode = this.getNode(previousPath)\n }\n\n if (previousNode) return [previousNode, previousPath]\n }\n\n return null\n }\n\n getPreviousDeepMatchingNodeAndPath(path, iterator = () => true) {\n warning(\n false,\n 'As of slate@0.47, the `getPreviousDeepMatchingNodeAndPath` method is deprecated.'\n )\n\n const match = this.getPreviousMatchingNodeAndPath(path)\n\n if (!match) return null\n\n let [previousNode, previousPath] = match\n\n let childMatch\n\n const assign = () => {\n childMatch =\n previousNode.object !== 'text' &&\n previousNode.findLastDescendantAndPath(iterator, previousPath)\n return childMatch\n }\n\n while (assign(childMatch)) {\n ;[previousNode, previousPath] = childMatch\n }\n\n if (!previousNode) return null\n\n return iterator(previousNode)\n ? [previousNode, previousPath]\n : this.getPreviousDeepMatchingNodeAndPath(match[1], iterator)\n }\n\n findLastDescendantAndPath(iterator, pathToThisNode) {\n warning(\n false,\n 'As of slate@0.47, the `findLastDescendantAndPath` method is deprecated.'\n )\n\n return this.findDescendantAndPath(iterator, pathToThisNode, true)\n }\n\n findDescendantAndPath(\n iterator,\n pathToThisNode = PathUtils.create([]),\n findLast = false\n ) {\n warning(\n false,\n 'As of slate@0.47, the `findDescendantAndPath` method is deprecated.'\n )\n\n let found\n let foundPath\n\n this.forEachDescendantWithPath(\n (node, path, nodes) => {\n if (iterator(node, path, nodes)) {\n found = node\n foundPath = path\n return false\n }\n },\n pathToThisNode,\n findLast\n )\n\n return found ? [found, foundPath] : null\n }\n\n forEachDescendantWithPath(iterator, path = PathUtils.create([]), findLast) {\n warning(\n false,\n 'As of slate@0.47, the `forEachDescendantWithPath` method is deprecated.'\n )\n\n let nodes = this.nodes\n let ret\n\n if (findLast) nodes = nodes.reverse()\n\n nodes.forEach((child, i) => {\n const childPath = path.concat(i)\n\n if (iterator(child, childPath, nodes) === false) {\n ret = false\n return false\n }\n\n if (child.object !== 'text') {\n ret = child.forEachDescendantWithPath(iterator, childPath, findLast)\n return ret\n }\n })\n\n return ret\n }\n\n getNextMatchingNodeAndPath(path, iterator = () => true) {\n warning(\n false,\n 'As of slate@0.47, the `getNextMatchingNodeAndPath` method is deprecated.'\n )\n\n if (!path) return null\n\n for (let i = path.size; i > 0; i--) {\n const p = path.slice(0, i)\n\n let nextPath = PathUtils.increment(p)\n let nextNode = this.getNode(nextPath)\n\n while (nextNode && !iterator(nextNode)) {\n nextPath = PathUtils.increment(nextPath)\n nextNode = this.getNode(nextPath)\n }\n\n if (nextNode) return [nextNode, nextPath]\n }\n\n return null\n }\n\n getSelectionIndexes(range, isSelected = true) {\n warning(\n false,\n 'As of slate@0.47, the `getSelectionIndexes` method is deprecated.'\n )\n\n const { start, end } = range\n\n // PERF: if we're not selected, we can exit early.\n if (!isSelected) {\n return null\n }\n\n // PERF: if we've been given an invalid selection we can exit early.\n if (range.isUnset) {\n return null\n }\n\n // PERF: if the start and end keys are the same, just check for the child\n // that contains that single key.\n if (start.path.equals(end.path)) {\n const child = this.getFurthestAncestor(start.path)\n const index = child ? this.nodes.indexOf(child) : null\n return { start: index, end: index + 1 }\n }\n\n // Otherwise, check all of the children...\n let startIndex = null\n let endIndex = null\n\n this.nodes.forEach((child, i) => {\n if (child.object === 'text') {\n if (startIndex == null && child.key === start.key) startIndex = i\n if (endIndex == null && child.key === end.key) endIndex = i + 1\n } else {\n if (startIndex == null && child.hasDescendant(start.key)) startIndex = i\n if (endIndex == null && child.hasDescendant(end.key)) endIndex = i + 1\n }\n\n // PERF: exit early if both start and end have been found.\n return startIndex == null || endIndex == null\n })\n\n if (isSelected && startIndex == null) {\n startIndex = 0\n }\n\n if (isSelected && endIndex == null) {\n endIndex = this.nodes.size\n }\n\n if (startIndex == null) {\n return null\n }\n\n return { start: startIndex, end: endIndex }\n }\n\n getTextsBetweenPositionsAsArray(startPath, endPath) {\n warning(\n false,\n 'As of slate@0.47, the `getTextsBetweenPositionsAsArray` method is deprecated.'\n )\n\n startPath = this.resolvePath(startPath)\n endPath = this.resolvePath(endPath)\n\n return this.getTextsBetweenPathPositionsAsArray(startPath, endPath)\n }\n\n getOrderedMarksBetweenPositions(startPath, startOffset, endPath, endOffset) {\n warning(\n false,\n 'As of slate@0.47, the `getOrderedMarksBetweenPositions` method is deprecated.'\n )\n\n startPath = this.resolvePath(startPath)\n endPath = this.resolvePath(endPath)\n const startText = this.getDescendant(startPath)\n\n // PERF: if the paths are equal, we can just use the start.\n if (PathUtils.isEqual(startPath, endPath)) {\n return startText.marks\n }\n\n const texts = this.getTextsBetweenPathPositionsAsArray(startPath, endPath)\n\n return OrderedSet().withMutations(result => {\n texts.forEach(text => {\n result.union(text.marks)\n })\n })\n }\n\n getTextsBetweenPathPositionsAsArray(startPath, endPath) {\n warning(\n false,\n 'As of slate@0.47, the `getTextsBetweenPathPositionsAsArray` method is deprecated.'\n )\n\n // PERF: the most common case is when the range is in a single text node,\n // where we can avoid a lot of iterating of the tree.\n if (startPath && endPath && PathUtils.isEqual(startPath, endPath)) {\n return [this.getDescendant(startPath)]\n } else if (!startPath && !endPath) {\n return this.getTextsAsArray()\n }\n\n const startIndex = startPath ? startPath.get(0, 0) : 0\n const endIndex = endPath\n ? endPath.get(0, this.nodes.size - 1)\n : this.nodes.size - 1\n\n let array = []\n\n this.nodes.slice(startIndex, endIndex + 1).forEach((node, i) => {\n if (node.object === 'text') {\n array.push(node)\n } else {\n // For the node at start and end of this list, we want to provide a start and end path\n // For other nodes, we can just get all their text nodes, they are between the paths\n const childStartPath =\n startPath && i === 0 ? PathUtils.drop(startPath) : null\n const childEndPath =\n endPath && i === endIndex - startIndex\n ? PathUtils.drop(endPath)\n : null\n\n array = array.concat(\n node.getTextsBetweenPathPositionsAsArray(childStartPath, childEndPath)\n )\n }\n })\n\n return array\n }\n\n getFurthestAncestor(path) {\n warning(\n false,\n 'As of slate@0.47, the `getFurthestAncestor` method has been renamed to `getFurthestChild`.'\n )\n\n return this.getFurthestChild(path)\n }\n\n getLeafBlocksAtRangeAsArray(range) {\n warning(\n false,\n 'As of slate@0.47, the `getLeafBlocksAtRangeAsArray` method is deprecated.'\n )\n\n range = this.resolveRange(range)\n if (range.isUnset) return []\n\n const { start, end } = range\n\n return this.getLeafBlocksBetweenPathPositionsAsArray(start.path, end.path)\n }\n\n getLeafBlocksBetweenPathPositionsAsArray(startPath, endPath) {\n warning(\n false,\n 'As of slate@0.47, the `getLeafBlocksBetweenPathPositionsAsArray` method is deprecated.'\n )\n\n // PERF: the most common case is when the range is in a single block node,\n // where we can avoid a lot of iterating of the tree.\n if (startPath && endPath && PathUtils.isEqual(startPath, endPath)) {\n return [this.getClosestBlock(startPath)]\n } else if (!startPath && !endPath) {\n return this.getBlocksAsArray()\n }\n\n const startIndex = startPath ? startPath.get(0, 0) : 0\n const endIndex = endPath\n ? endPath.get(0, this.nodes.size - 1)\n : this.nodes.size - 1\n\n let array = []\n\n this.nodes.slice(startIndex, endIndex + 1).forEach((node, i) => {\n if (node.object !== 'block') {\n return\n } else if (node.isLeafBlock()) {\n array.push(node)\n } else {\n const childStartPath =\n startPath && i === 0 ? PathUtils.drop(startPath) : null\n const childEndPath =\n endPath && i === endIndex - startIndex\n ? PathUtils.drop(endPath)\n : null\n\n array = array.concat(\n node.getLeafBlocksBetweenPathPositionsAsArray(\n childStartPath,\n childEndPath\n )\n )\n }\n })\n\n return array\n }\n\n getBlocksAsArray() {\n warning(\n false,\n 'As of slate@0.47, the `getBlocksAsArray` method is deprecated.'\n )\n\n const iterable = this.blocks({ onlyLeaves: true })\n const array = Array.from(iterable, ([node]) => node)\n return array\n }\n\n getBlocksByTypeAsArray(type) {\n warning(\n false,\n 'As of slate@0.47, the `getBlocksByTypeAsArray` method is deprecated.'\n )\n\n const iterable = this.blocks({ onlyLeaves: true, onlyTypes: [type] })\n const array = Array.from(iterable, ([node]) => node)\n return array\n }\n\n getFurthestOnlyChildAncestor(path) {\n warning(\n false,\n 'As of slate@0.47, the `getFurthestOnlyChildAncestor` method is deprecated.'\n )\n\n const ancestors = this.getAncestors(path)\n if (!ancestors) return null\n\n const furthest = ancestors\n .rest()\n .reverse()\n .takeUntil(p => p.nodes.size > 1)\n .last()\n\n return furthest || null\n }\n\n getInlinesAsArray() {\n warning(\n false,\n 'As of slate@0.47, the `getInlinesAsArray` method is deprecated.'\n )\n\n const array = Array.from(\n this.inlines({ onlyLeaves: true }),\n ([node]) => node\n )\n return array\n }\n\n getInlinesByTypeAsArray(type) {\n warning(\n false,\n 'As of slate@0.47, the `getInlinesByTypeAsArray` method is deprecated.'\n )\n\n const array = Array.from(\n this.inlines({ onlyLeaves: true, onlyTypes: [type] }),\n ([node]) => node\n )\n return array\n }\n\n getLeafInlinesAtRangeAsArray(range) {\n warning(\n false,\n 'As of slate@0.47, the `getLeafInlinesAtRangeAsArray` method is deprecated.'\n )\n\n range = this.resolveRange(range)\n if (range.isUnset) return []\n\n const array = this.getTextsAtRangeAsArray(range)\n .map(text => this.getClosestInline(text.key))\n .filter(exists => exists)\n\n return array\n }\n\n getOrderedMarks() {\n warning(\n false,\n 'As of slate@0.47, the `getOrderedMarks` method has been folded into `getMarks`, which will now return an ordered set.'\n )\n return this.getMarks()\n }\n\n getOrderedMarksAtRange(range) {\n warning(\n false,\n 'As of slate@0.47, the `getOrderedMarksAtRange` method has been folded into `getMarksAtRange`, which will now return an ordered set.'\n )\n return this.getMarksAtRange(range)\n }\n\n getOrderedMarksByType(type) {\n warning(\n false,\n 'As of slate@0.47, the `getOrderedMarksByType` method has been folded into `getMarksByType`, which will now return an ordered set.'\n )\n return this.getMarksByType(type)\n }\n\n getMarksByTypeAsArray(type) {\n warning(\n false,\n 'As of slate@0.47, the `getMarksByTypeAsArray` method is deprecated.'\n )\n\n const array = this.nodes.reduce((memo, node) => {\n return node.object === 'text'\n ? memo.concat(node.marks.filter(m => m.type === type))\n : memo.concat(node.getMarksByTypeAsArray(type))\n }, [])\n\n return array\n }\n\n getMarksAsArray() {\n warning(\n false,\n 'As of slate@0.47, the `getMarksAsArray` method is deprecated.'\n )\n\n const result = []\n\n for (const [node] of this.texts()) {\n result.push(node.marks.toArray())\n }\n\n // PERF: use only one concat rather than multiple for speed.\n const array = [].concat(...result)\n return array\n }\n\n getRootInlinesAtRangeAsArray(range) {\n warning(\n false,\n 'As of slate@0.47, the `getRootInlinesAtRangeAsArray` method is deprecated.'\n )\n\n range = this.resolveRange(range)\n if (range.isUnset) return List()\n\n const array = this.getTextsAtRangeAsArray(range)\n .map(text => this.getFurthestInline(text.key))\n .filter(exists => exists)\n\n return array\n }\n\n getTextsAsArray() {\n warning(\n false,\n 'As of slate@0.47, the `getTextsAsArray` method is deprecated.'\n )\n\n const iterable = this.texts()\n const array = Array.from(iterable, ([node]) => node)\n return array\n }\n\n getTextsAtRangeAsArray(range) {\n warning(\n false,\n 'As of slate@0.47, the `getTextsAtRangeAsArray` method is deprecated.'\n )\n\n const iterable = this.texts({ range })\n const array = Array.from(iterable, ([node]) => node)\n return array\n }\n\n getMarksAtPosition(path, offset) {\n warning(\n false,\n 'As of slate@0.47, the `getMarksAtPosition` method is deprecated.'\n )\n\n path = this.resolvePath(path)\n const text = this.getDescendant(path)\n const currentMarks = text.marks\n\n if (offset !== 0) {\n return OrderedSet(currentMarks)\n }\n\n const closestBlock = this.getClosestBlock(path)\n\n // insert mark for empty block; the empty block are often created by split node or add marks in a range including empty blocks\n if (closestBlock.text === '') {\n return OrderedSet(currentMarks)\n }\n\n const [previous] = this.texts({ path, direction: 'backward' })\n\n if (!previous) {\n return OrderedSet()\n }\n\n const [previousText, previousPath] = previous\n\n if (closestBlock.hasDescendant(previousPath)) {\n return OrderedSet(previousText.marks)\n }\n\n return OrderedSet(currentMarks)\n }\n\n getNodesAtRange(range) {\n warning(\n false,\n 'As of slate@0.47, the `getNodesAtRange` method has been renamed to `getDescendantsAtRange`.'\n )\n\n const iterable = this.descendants({ range })\n const array = Array.from(iterable, ([node]) => node)\n const list = List(array)\n return list\n }\n\n isNodeInRange(path, range) {\n warning(\n false,\n 'As of slate@0.47, the `isNodeInRange` method has been renamed to `isInRange`.'\n )\n\n return this.isInRange(path, range)\n }\n}\n\n/**\n * Mix in assertion variants.\n */\n\nconst ASSERTS = ['Child', 'Depth', 'Descendant', 'Node', 'Parent', 'Path']\n\nfor (const method of ASSERTS) {\n ElementInterface.prototype[`assert${method}`] = function(path, ...args) {\n const ret = this[`get${method}`](path, ...args)\n\n if (ret == null) {\n throw new Error(\n `\\`Node.assert${method}\\` could not find node with path or key: ${path}`\n )\n }\n\n return ret\n }\n}\n\n/**\n * Memoize read methods.\n */\n\nmemoize(ElementInterface.prototype, [\n 'getBlocksAsArray',\n 'getBlocksByTypeAsArray',\n 'getDecorations',\n 'getFragmentAtRange',\n 'getInlinesAsArray',\n 'getInlinesByTypeAsArray',\n 'getInsertMarksAtRange',\n 'getLeafBlocksAtRangeAsArray',\n 'getLeafBlocksAtRangeAsArray',\n 'getLeafInlinesAtRangeAsArray',\n 'getMarksAsArray',\n 'getMarksAtPosition',\n 'getMarksByTypeAsArray',\n 'getNextBlock',\n 'getNodesAtRange',\n 'getNodesToPathsMap',\n 'getOffset',\n 'getOffsetAtRange',\n 'getOrderedMarksBetweenPositions',\n 'getPreviousBlock',\n 'getRootBlocksAtRange',\n 'getRootInlinesAtRangeAsArray',\n 'getTextAtOffset',\n 'getTextDirection',\n 'getTextsAsArray',\n 'getTextsBetweenPathPositionsAsArray',\n])\n\n/**\n * Mix in the element interface.\n */\n\nmixin(ElementInterface, [Block, Document, Inline])\n","import mixin from '../utils/mixin'\nimport Annotation from '../models/annotation'\nimport Decoration from '../models/decoration'\nimport PathUtils from '../utils/path-utils'\nimport Point from '../models/point'\nimport Range from '../models/range'\nimport Selection from '../models/selection'\n\n/**\n * The interface that `Decoration`, `Range` and `Selection` all implement, to make\n * working anchor and focus points easier.\n *\n * @type {Class}\n */\n\nclass RangeInterface {\n /**\n * Check whether the range is collapsed.\n *\n * @return {Boolean}\n */\n\n get isCollapsed() {\n return (\n this.anchor === this.focus ||\n (this.anchor.key === this.focus.key &&\n this.anchor.offset === this.focus.offset)\n )\n }\n\n /**\n * Check whether the range is expanded.\n *\n * @return {Boolean}\n */\n\n get isExpanded() {\n return !this.isCollapsed\n }\n\n /**\n * Check whether the range is backward.\n *\n * @return {Boolean}\n */\n\n get isBackward() {\n const { isUnset, anchor, focus } = this\n\n if (isUnset) {\n return null\n }\n\n if (anchor.key === focus.key) {\n return anchor.offset > focus.offset\n }\n\n const isBackward = PathUtils.isBefore(focus.path, anchor.path)\n return isBackward\n }\n\n /**\n * Check whether the range is forward.\n *\n * @return {Boolean}\n */\n\n get isForward() {\n const { isBackward } = this\n const isForward = isBackward == null ? null : !isBackward\n return isForward\n }\n\n /**\n * Check whether the range isn't set.\n *\n * @return {Boolean}\n */\n\n get isUnset() {\n const { anchor, focus } = this\n const isUnset = anchor.isUnset || focus.isUnset\n return isUnset\n }\n\n /**\n * Check whether the range is set.\n *\n * @return {Boolean}\n */\n\n get isSet() {\n return !this.isUnset\n }\n\n /**\n * Get the start point.\n *\n * @return {String}\n */\n\n get start() {\n return this.isBackward ? this.focus : this.anchor\n }\n\n /**\n * Get the end point.\n *\n * @return {String}\n */\n\n get end() {\n return this.isBackward ? this.anchor : this.focus\n }\n\n /**\n * Flip the range.\n *\n * @return {Range}\n */\n\n flip() {\n const range = this.setPoints([this.focus, this.anchor])\n return range\n }\n\n /**\n * Move the anchor and focus offsets forward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveForward(n) {\n return this.updatePoints(point => point.moveForward(n))\n }\n\n /**\n * Move the anchor and focus offsets backward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveBackward(n) {\n return this.updatePoints(point => point.moveBackward(n))\n }\n\n /**\n * Move the anchor offset backward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveAnchorBackward(n) {\n const range = this.setAnchor(this.anchor.moveBackward(n))\n return range\n }\n\n /**\n * Move the anchor offset forward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveAnchorForward(n) {\n const range = this.setAnchor(this.anchor.moveForward(n))\n return range\n }\n\n /**\n * Move the range's anchor point to a new `path` and `offset`.\n *\n * Optionally, the `path` can be a key string, or omitted entirely in which\n * case it would be the offset number.\n *\n * @param {List|String} path\n * @param {Number} offset\n * @return {Range}\n */\n\n moveAnchorTo(path, offset) {\n const range = this.setAnchor(this.anchor.moveTo(path, offset))\n return range\n }\n\n /**\n * Move the range's anchor point to the start of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveAnchorToStartOfNode(node) {\n const range = this.setAnchor(this.anchor.moveToStartOfNode(node))\n return range\n }\n\n /**\n * Move the range's anchor point to the end of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveAnchorToEndOfNode(node) {\n const range = this.setAnchor(this.anchor.moveToEndOfNode(node))\n return range\n }\n\n /**\n * Move the end offset backward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveEndBackward(n) {\n const range = this.setEnd(this.end.moveBackward(n))\n return range\n }\n\n /**\n * Move the end offset forward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveEndForward(n) {\n const range = this.setEnd(this.end.moveForward(n))\n return range\n }\n\n /**\n * Move the range's end point to a new `path` and `offset`.\n *\n * Optionally, the `path` can be a key string, or omitted entirely in which\n * case it would be the offset number.\n *\n * @param {List|String} path\n * @param {Number} offset\n * @return {Range}\n */\n\n moveEndTo(path, offset) {\n const range = this.setEnd(this.end.moveTo(path, offset))\n return range\n }\n\n /**\n * Move the range's end point to the start of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveEndToStartOfNode(node) {\n const range = this.setEnd(this.end.moveToStartOfNode(node))\n return range\n }\n\n /**\n * Move the range's end point to the end of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveEndToEndOfNode(node) {\n const range = this.setEnd(this.end.moveToEndOfNode(node))\n return range\n }\n\n /**\n * Move the focus offset backward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveFocusBackward(n) {\n const range = this.setFocus(this.focus.moveBackward(n))\n return range\n }\n\n /**\n * Move the focus offset forward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveFocusForward(n) {\n const range = this.setFocus(this.focus.moveForward(n))\n return range\n }\n\n /**\n * Move the range's focus point to a new `path` and `offset`.\n *\n * Optionally, the `path` can be a key string, or omitted entirely in which\n * case it would be the offset number.\n *\n * @param {List|String} path\n * @param {Number} offset\n * @return {Range}\n */\n\n moveFocusTo(path, offset) {\n const range = this.setFocus(this.focus.moveTo(path, offset))\n return range\n }\n\n /**\n * Move the range's focus point to the start of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveFocusToStartOfNode(node) {\n const range = this.setFocus(this.focus.moveToStartOfNode(node))\n return range\n }\n\n /**\n * Move the range's focus point to the end of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveFocusToEndOfNode(node) {\n const range = this.setFocus(this.focus.moveToEndOfNode(node))\n return range\n }\n\n /**\n * Move the start offset backward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveStartBackward(n) {\n const range = this.setStart(this.start.moveBackward(n))\n return range\n }\n\n /**\n * Move the start offset forward `n` characters.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveStartForward(n) {\n const range = this.setStart(this.start.moveForward(n))\n return range\n }\n\n /**\n * Move the range's start point to a new `path` and `offset`.\n *\n * Optionally, the `path` can be a key string, or omitted entirely in which\n * case it would be the offset number.\n *\n * @param {List|String} path\n * @param {Number} offset\n * @return {Range}\n */\n\n moveStartTo(path, offset) {\n const range = this.setStart(this.start.moveTo(path, offset))\n return range\n }\n\n /**\n * Move the range's start point to the start of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveStartToStartOfNode(node) {\n const range = this.setStart(this.start.moveToStartOfNode(node))\n return range\n }\n\n /**\n * Move the range's start point to the end of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveStartToEndOfNode(node) {\n const range = this.setStart(this.start.moveToEndOfNode(node))\n return range\n }\n\n /**\n * Move range's points to a new `path` and `offset`.\n *\n * @param {Number} n\n * @return {Range}\n */\n\n moveTo(path, offset) {\n return this.updatePoints(point => point.moveTo(path, offset))\n }\n\n /**\n * Move the focus point to the anchor point.\n *\n * @return {Range}\n */\n\n moveToAnchor() {\n const range = this.setFocus(this.anchor)\n return range\n }\n\n /**\n * Move the start point to the end point.\n *\n * @return {Range}\n */\n\n moveToEnd() {\n const range = this.setStart(this.end)\n return range\n }\n\n /**\n * Move the range's points to the end of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveToEndOfNode(node) {\n return this.updatePoints(point => point.moveToEndOfNode(node))\n }\n\n /**\n * Move the anchor point to the focus point.\n *\n * @return {Range}\n */\n\n moveToFocus() {\n const range = this.setAnchor(this.focus)\n return range\n }\n\n /**\n * Move to the entire range of `start` and `end` nodes.\n *\n * @param {Node} start\n * @param {Node} end (optional)\n * @return {Range}\n */\n\n moveToRangeOfNode(start, end = start) {\n const range = this.setPoints([\n this.anchor.moveToStartOfNode(start),\n this.focus.moveToEndOfNode(end),\n ])\n\n return range\n }\n\n /**\n * Move the end point to the start point.\n *\n * @return {Range}\n */\n\n moveToStart() {\n const range = this.setEnd(this.start)\n return range\n }\n\n /**\n * Move the range's points to the start of a `node`.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n moveToStartOfNode(node) {\n return this.updatePoints(point => point.moveToStartOfNode(node))\n }\n\n /**\n * Normalize the range, relative to a `node`, ensuring that the anchor\n * and focus nodes of the range always refer to leaf text nodes.\n *\n * @param {Node} node\n * @return {Range}\n */\n\n normalize(node) {\n return this.updatePoints(point => point.normalize(node))\n }\n\n /**\n * Set the anchor point to a new `anchor`.\n *\n * @param {Point} anchor\n * @return {Range}\n */\n\n setAnchor(anchor) {\n const range = this.set('anchor', anchor)\n return range\n }\n\n /**\n * Set the end point to a new `point`.\n *\n * @param {Point} point\n * @return {Range}\n */\n\n setEnd(point) {\n const range = this.isBackward ? this.setAnchor(point) : this.setFocus(point)\n return range\n }\n\n /**\n * Set the focus point to a new `focus`.\n *\n * @param {Point} focus\n * @return {Range}\n */\n\n setFocus(focus) {\n const range = this.set('focus', focus)\n return range\n }\n\n /**\n * Set the anchor and focus points to new `values`.\n *\n * @param {Array<Point>} values\n * @return {Range}\n */\n\n setPoints(values) {\n const [anchor, focus] = values\n const range = this.set('anchor', anchor).set('focus', focus)\n return range\n }\n\n /**\n * Set the anchor and focus points with `updater` callback\n *\n * @param {Function} updater\n * @return {Range}\n */\n\n updatePoints(updater) {\n let { anchor, focus } = this\n anchor = updater(anchor)\n focus = updater(focus)\n return this.merge({ anchor, focus })\n }\n\n /**\n * Set the start point to a new `point`.\n *\n * @param {Point} point\n * @return {Range}\n */\n\n setStart(point) {\n const range = this.isBackward ? this.setFocus(point) : this.setAnchor(point)\n return range\n }\n\n /**\n * Set new `properties` on the range.\n *\n * @param {Object|Range} properties\n * @return {Range}\n */\n\n setProperties(properties) {\n properties = Range.createProperties(properties)\n const { anchor, focus, ...props } = properties\n\n if (anchor) {\n props.anchor = Point.create(anchor)\n }\n\n if (focus) {\n props.focus = Point.create(focus)\n }\n\n const range = this.merge(props)\n return range\n }\n\n /**\n * Return a JSON representation of the range.\n *\n * @param {Object} options\n * @return {Object}\n */\n\n toJSON(options = {}) {\n const object = {\n object: this.object,\n anchor: this.anchor.toJSON(options),\n focus: this.focus.toJSON(options),\n }\n\n return object\n }\n\n /**\n * Return a `Range` instance from any range-like instance.\n *\n * @return {Range}\n */\n\n toRange() {\n const properties = Range.createProperties(this)\n const range = Range.create(properties)\n return range\n }\n\n /**\n * Unset the range.\n *\n * @return {Range}\n */\n\n unset() {\n const range = this.updatePoints(p => p.unset())\n return range\n }\n}\n\n/**\n * Mix in the range interface.\n *\n * @param {Record}\n */\n\nmixin(RangeInterface, [Annotation, Decoration, Range, Selection])\n","import './interfaces/object'\nimport './interfaces/model'\nimport './interfaces/node'\nimport './interfaces/element'\nimport './interfaces/range'\n\nimport Annotation from './models/annotation'\nimport Block from './models/block'\nimport Change from './models/change'\nimport Data from './models/data'\nimport Decoration from './models/decoration'\nimport Document from './models/document'\nimport Editor from './controllers/editor'\nimport Inline from './models/inline'\nimport KeyUtils from './utils/key-utils'\nimport Leaf from './models/leaf'\nimport Mark from './models/mark'\nimport Node from './models/node'\nimport Operation from './models/operation'\nimport PathUtils from './utils/path-utils'\nimport Point from './models/point'\nimport Range from './models/range'\nimport Selection from './models/selection'\nimport Text from './models/text'\nimport TextUtils from './utils/text-utils'\nimport Value from './models/value'\nimport { resetMemoization, useMemoization } from './utils/memoize'\n\n/**\n * Export.\n *\n * @type {Object}\n */\n\nexport {\n Annotation,\n Block,\n Change,\n Data,\n Decoration,\n Document,\n Editor,\n Inline,\n KeyUtils,\n Leaf,\n Mark,\n Node,\n Operation,\n PathUtils,\n Point,\n Range,\n resetMemoization,\n Selection,\n Text,\n TextUtils,\n useMemoization,\n Value,\n}\n\nexport default {\n Annotation,\n Block,\n Change,\n Data,\n Decoration,\n Document,\n Editor,\n Inline,\n KeyUtils,\n Leaf,\n Mark,\n Node,\n Operation,\n PathUtils,\n Point,\n Range,\n resetMemoization,\n Selection,\n Text,\n TextUtils,\n useMemoization,\n Value,\n}\n"],"names":["n","generate","create","key","Error","setGenerator","func","resetGenerator","compare","path","target","m","min","i","pv","get","tv","size","attrs","List","isList","Array","isArray","crop","a","b","ca","slice","cb","decrement","index","increment","getAncestors","ancestors","withMutations","push","value","newValue","newPath","set","isAbove","p","t","isAfter","isBefore","isEqual","equals","isOlder","pl","tl","isPath","any","every","isSibling","butLast","isYounger","lift","ancestor","drop","relative","max","Math","relate","array","av","bv","transform","operation","type","position","pIndex","pEqual","pYounger","pAbove","np","concat","paths","DEFAULTS","undefined","Point","point","isUnset","is","offset","PathUtils","range","isAfterPoint","end","start","isBeforePoint","node","last","getLastText","text","length","first","getFirstText","object","hasNode","moveForward","setOffset","moveBackward","merge","moveTo","getNode","getPath","getTextAtOffset","before","getOffset","block","getClosestBlock","next","getNextText","KeyUtils","options","toArray","preserveKeys","isSet","isPoint","isPlainObject","fromJSON","Record","Data","Map","isMap","fromJS","Mark","data","toJSON","isMark","elements","Set","marks","map","props","mark","item","Decoration","properties","createProperties","decoration","anchor","focus","isDecoration","Range","isRange","list","JSON","stringify","Selection","selection","isFocused","isSelection","createSet","TYPES","isObject","Annotation","annotation","isAnnotation","obj","Document","nodes","isDocument","document","Node","createList","Inline","isInline","inline","Leaf","Text","add","union","annotations","decorations","leaves","split","leaf","at","compile","formats","kind","values","format","o","middle","after","string","remove","newProperties","newMark","one","two","regenerateKey","other","isText","isNode","Block","forEach","el","texts","isBlock","Value","updatePoints","normalize","addMark","insertNode","mapRanges","setPath","assertNode","insertText","mapPoints","newDocument","mergeNode","resolvePath","withPath","moveAnchorTo","moveFocusTo","newIndex","moveNode","delete","removeMark","prev","getPreviousText","removeNode","unset","removeText","setNode","setMark","resolveAnnotation","setProperties","resolveSelection","splitNode","iterator","sel","createSelection","anns","createAnnotation","filter","preserveData","preserveAnnotations","toObject","preserveSelection","getClosestInline","getDescendant","getNextBlock","getPreviousBlock","getNextInline","getPreviousInline","getMarksAtRange","getActiveMarksAtRange","getLeafBlocksAtRange","getFragmentAtRange","getLeafInlinesAtRange","getTextsAtRange","isValue","createMap","moveToStartOfNode","debug","Debug","applyOperation","op","Operation","addAnnotation","removeAnnotation","setAnnotation","setSelection","invertOperation","inversePath","inverseNewPath","inverse","replace","OPERATION_ATTRIBUTES","apply","inverted","invert","json","ATTRIBUTES","v","toJS","isOperation","Change","operations","isChange","change","CommandsPlugin","commands","onCommand","command","editor","args","fn","onConstruct","registerCommand","SURROGATE_START","SURROGATE_END","SPACE","CHAMELEON","PUNCTUATION","isSurrogate","code","isWord","char","remaining","test","charAt","getCharLength","rest","charCodeAt","getCharOffset","getCharOffsetBackward","reverse","getCharOffsetForward","getWordOffset","started","l","getWordOffsetBackward","getWordOffsetForward","deleteExpandedAtRange","isExpanded","deleteAtRange","hasDescendant","moveToStart","Commands","addMarkAtRange","isCollapsed","withoutNormalizing","addMarkByKey","addMarksAtRange","snapshotSelection","startKey","startOffset","endKey","endOffset","isStartVoid","hasVoidParent","isEndVoid","startBlock","endBlock","isHanging","prevText","startVoid","getClosestVoid","nextText","removeNodeByKey","endVoid","removeTextByKey","startText","endText","startLength","endLength","getCommonAncestor","startChild","getFurthestChild","endChild","startParent","getParent","startParentIndex","indexOf","endParentIndex","child","parent","afters","startChildIndex","endChildIndex","middles","befores","onlyChildAncestor","moveNodeByKey","mergeNodeByKey","deleteBackwardAtRange","voidParent","isAtStartOfNode","prevBlock","prevVoid","moveFocusBackward","traversed","deleteCharBackwardAtRange","TextUtils","deleteCharForwardAtRange","deleteForwardAtRange","isVoid","nextBlock","isAtEndOfNode","nextVoid","moveFocusForward","deleteLineBackwardAtRange","deleteLineForwardAtRange","deleteWordBackwardAtRange","deleteWordForwardAtRange","wordOffset","insertBlockAtRange","startInline","insertionMode","getInsertionMode","insertNodeByKey","atEnd","siblingText","splitRange","moveToEndOfNode","splitDescendantsByKey","insertFragmentAtRange","fragment","mapDescendants","isAtStart","blocks","getBlocks","firstChild","lastChild","firstBlock","lastBlock","insertionNode","findInsertionNode","hasBlockChildren","lonelyParent","getFurthest","lonelyChild","startIndex","excludingLonelyChild","nextChild","getNextSibling","nextNodes","skipUntil","lastIndex","findDescendant","inlineChild","inlineIndex","hasSingleNode","firstNode","fragmentInner","matches","documentNode","documentInner","insertInlineAtRange","assertDescendant","splitNodeByPath","insertTextAtRange","insertTextByPath","removeMarkAtRange","removeMarkByKey","setBlocksAtRange","sets","setNodeByKey","setInlinesAtRange","inlines","splitBlockAtRange","height","h","isBackward","flip","moveAnchorToStartOfNode","setFocus","resolveRange","splitInlineAtRange","Infinity","toggleMarkAtRange","exists","some","unwrapBlockAtRange","wrappers","getClosest","isSuperset","toOrderedSet","toList","children","firstMatch","lastMatch","takeUntil","firstText","extra","unwrapInlineAtRange","wrapBlockAtRange","clear","firstblock","lastblock","siblings","p1","p2","indexes","reduce","ind","wrapInlineAtRange","inlineParent","wrapInlineByKey","endInline","endIndex","splitText","startInner","startInnerIndex","endInner","startInlines","endInlines","startNode","endNode","wrapTextAtRange","prefix","suffix","startRange","endRange","moveToEnd","addMarkByPath","addMarksByPath","replaceMarksByPath","marksSet","marksToApply","subtract","marksToRemove","insertFragmentByPath","insertNodeByPath","isAtomic","mergeNodeByPath","original","previous","getPreviousSibling","moveNodeByPath","newParentPath","removeMarkByPath","removeMarksByPath","intersect","isEmpty","removeAllMarksByPath","state","pth","removeNodeByPath","removeTextByPath","replaceNodeByPath","newNode","parentPath","replaceTextByPath","setMarkByPath","setNodeByPath","prevProperties","pick","Object","keys","setTextByPath","splitDescendantsByPath","textPath","textOffset","lastPath","splitNodeByKey","ancestorPath","unwrapInlineByPath","moveToRangeOfNode","unwrapBlockByPath","unwrapNodeByPath","parentIndex","grandPath","isFirst","isLast","updatedPath","unwrapChildrenByPath","childIndex","childPath","wrapBlockByPath","wrapInlineByPath","wrapNodeByPath","COMMANDS","method","assertPath","newKey","textKey","save","tmp","isValidOperation","undos","lastBatch","lastOperation","shouldMerge","batch","pop","takeLast","withoutSaving","redos","newData","setData","redo","omit","undo","withoutMerging","blur","select","deselect","proxy","moveAnchorBackward","pointBackward","moveAnchorWordBackward","pointWordBackward","moveAnchorForward","pointForward","moveAnchorWordForward","pointWordForward","moveAnchorToEndOfBlock","pointEdgeObject","moveAnchorToEndOfInline","moveAnchorToEndOfDocument","moveAnchorToEndOfNode","moveToAnchor","moveAnchorToEndOfNextBlock","pointEdgeSideObject","moveAnchorToEndOfNextInline","moveAnchorToEndOfNextText","moveAnchorToEndOfPreviousBlock","moveAnchorToEndOfPreviousInline","moveAnchorToEndOfPreviousText","moveAnchorToEndOfText","moveAnchorToStartOfBlock","moveAnchorToStartOfDocument","moveAnchorToStartOfInline","moveAnchorToStartOfNextBlock","moveAnchorToStartOfNextInline","moveAnchorToStartOfNextText","moveAnchorToStartOfPreviousBlock","moveAnchorToStartOfPreviousInline","moveAnchorToStartOfPreviousText","moveAnchorToStartOfText","moveWordBackward","moveFocusWordBackward","moveToFocus","moveEndBackward","moveEndWordBackward","moveEndForward","moveEndWordForward","moveEndTo","moveEndToEndOfBlock","moveEndToEndOfDocument","moveEndToEndOfNode","moveEndToEndOfInline","moveEndToEndOfNextBlock","moveEndToEndOfNextInline","moveEndToEndOfNextText","moveEndToEndOfPreviousBlock","moveEndToEndOfPreviousInline","moveEndToEndOfPreviousText","moveEndToEndOfText","moveEndToStartOfBlock","moveEndToStartOfDocument","moveEndToStartOfNode","moveEndToStartOfInline","moveEndToStartOfNextBlock","moveEndToStartOfNextInline","moveEndToStartOfNextText","moveEndToStartOfPreviousBlock","moveEndToStartOfPreviousInline","moveEndToStartOfPreviousText","moveEndToStartOfText","moveFocusWordForward","moveFocusToEndOfBlock","moveFocusToEndOfDocument","moveFocusToEndOfNode","moveFocusToEndOfInline","moveFocusToEndOfNextBlock","moveFocusToEndOfNextInline","moveFocusToEndOfNextText","moveFocusToEndOfPreviousBlock","moveFocusToEndOfPreviousInline","moveFocusToEndOfPreviousText","moveFocusToEndOfText","moveFocusToStartOfBlock","moveFocusToStartOfDocument","moveFocusToStartOfNode","moveFocusToStartOfInline","moveFocusToStartOfNextBlock","moveFocusToStartOfNextInline","moveFocusToStartOfNextText","moveFocusToStartOfPreviousBlock","moveFocusToStartOfPreviousInline","moveFocusToStartOfPreviousText","moveFocusToStartOfText","moveWordForward","moveStartBackward","moveStartWordBackward","moveStartForward","moveStartWordForward","moveStartTo","moveStartToEndOfBlock","moveStartToEndOfDocument","moveStartToEndOfNode","moveStartToEndOfInline","moveStartToEndOfNextBlock","moveStartToEndOfNextInline","moveStartToEndOfNextText","moveStartToEndOfPreviousBlock","moveStartToEndOfPreviousInline","moveStartToEndOfPreviousText","moveStartToEndOfText","moveStartToStartOfBlock","moveStartToStartOfDocument","moveStartToStartOfNode","moveStartToStartOfInline","moveStartToStartOfNextBlock","moveStartToStartOfNextInline","moveStartToStartOfNextText","moveStartToStartOfPreviousBlock","moveStartToStartOfPreviousInline","moveStartToStartOfPreviousText","moveStartToStartOfText","moveToEndOfBlock","moveToEndOfDocument","moveToEndOfInline","moveToEndOfNextBlock","moveToEndOfNextInline","moveToEndOfNextText","moveToEndOfPreviousBlock","moveToEndOfPreviousInline","moveToEndOfPreviousText","moveToEndOfText","moveToRangeOfDocument","moveToStartOfBlock","moveToStartOfDocument","moveToStartOfInline","moveToStartOfNextBlock","moveToStartOfNextInline","moveToStartOfNextText","moveToStartOfPreviousBlock","moveToStartOfPreviousInline","moveToStartOfPreviousText","moveToStartOfText","snapshot","k","skip","setAnchor","setEnd","setStart","edge","toUpperCase","Edge","side","Side","getDirectionNode","isInBlock","isPreviousInVoid","isNextInVoid","pointName","setAnnotations","QueriesPlugin","queries","query","registerQuery","onQuery","ret","SlateError","captureStackTrace","constructor","stack","SchemaPlugin","schema","rules","schemaRules","rule","find","r","testRules","match","normalizeNode","error","validateNode","failure","validateRules","Queries","defaultNormalize","getTexts","valid","fail","validateObject","validateType","validateData","validateMarks","validateText","validateFirst","validateLast","validateNodes","getMarks","def","defs","count","lastCount","nextDef","shift","rewind","err","validateParent","validatePrevious","validateNext","lastMin","deleteExpanded","addMarks","deleteBackward","deleteCharBackward","deleteLineBackward","deleteWordBackward","deleteForward","deleteCharForward","deleteLineForward","deleteWordForward","insertBlock","insertFragment","from","newTexts","includes","fragmentLength","insertInline","getInsertMarksAtRange","replaceMark","oldMark","setBlocks","setInlines","splitBlock","depth","splitInline","toggleMark","activeMarks","has","unwrapBlock","unwrapInline","wrapBlock","wrapInline","wrapText","isForward","CorePlugin","plugins","AtRange","ByPath","OnHistory","OnSelection","OnValue","WithIntent","Schema","Editor","controller","construct","onChange","readOnly","middleware","core","run","setReadOnly","setValue","newDirtyPaths","getDirtyPaths","dirty","transformed","pathIndex","dirtyPaths","prototype","dirtyPath","join","flushing","resolve","then","flush","__command","__query","table","getKeysToPathsTable","fns","overrides","defineProperty","nextPath","previousPath","oldAncestors","arr","newAncestors","normalizeDirtyPaths","normalizeNodeByPath","iterations","found","registerPlugin","plugin","commandsPlugin","queriesPlugin","schemaPlugin","newMarks","isLeaf","invalid","result","findLast","firstLeaf","cache","unshift","left","right","of","take","mixin","Interface","Classes","Class","getOwnPropertyNames","name","hasOwnProperty","desc","getOwnPropertyDescriptor","TYPE","camel","ObjectInterface","bind","entries","toLowerCase","ModelInterface","ENABLED","LEAF","Symbol","STORE_KEY","UNDEFINED","NULL","UNSET","memoizeStore","WeakMap","memoize","property","noArgs","hasArgs","takesArguments","cachedValue","getIn","setIn","newChild","resetMemoization","useMemoization","enabled","NodeInterface","descendant","nested","descendants","dict","memo","c","normalizer","identity","ElementInterface","replaceNode","iterable","createIterable","onlyLeaves","onlyRoots","onlyTypes","isLeafBlock","resolveDecoration","direction","downward","upward","includeBlocks","includeDocument","includeInlines","includeRoot","includeTarget","includeTargetAncestors","includeTexts","root","targetPath","targetRange","targetNode","NativeSet","window","global","visited","startPath","endPath","includedTarget","includedStart","includingStart","done","nextIndex","resolvePoint","predicate","getInsertMarksAtPoint","startMarks","endMarks","closest","startAt","targetPosition","results","furthest","blockNode","blockPath","entry","relativePath","previousText","forEachDescendant","OrderedSet","dir","getDirection","getChild","isLeafInline","splice","toStart","toEnd","isInRange","mergeText","deep","flatMap","x","deleteIn","getLeafBlocksAtRangeAsArray","getLeafInlinesAtRangeAsArray","getNextTextEntry","getNextMatchingNodeAndPath","nextNode","childMatch","assign","findFirstDescendantAndPath","getNextDeepMatchingNodeAndPath","getPreviousTextEntry","pathToThisNode","findDescendantAndPath","previousNode","getPreviousMatchingNodeAndPath","findLastDescendantAndPath","getPreviousDeepMatchingNodeAndPath","foundPath","forEachDescendantWithPath","isSelected","getFurthestAncestor","getTextsBetweenPathPositionsAsArray","getTextsAsArray","childStartPath","childEndPath","getLeafBlocksBetweenPathPositionsAsArray","getBlocksAsArray","getTextsAtRangeAsArray","getMarksByType","getMarksByTypeAsArray","getFurthestInline","currentMarks","closestBlock","getText","ASSERTS","RangeInterface","setPoints","updater"],"mappings":"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"}