slate-edit-list
Version:
A Slate plugin to handle keyboard events in lists.
1,647 lines (1,266 loc) • 1.8 MB
JavaScript
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
'use strict';
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
/* global document */
/* eslint-disable import/no-extraneous-dependencies */
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _reactDom = require('react-dom');
var _reactDom2 = _interopRequireDefault(_reactDom);
var _slateReact = require('slate-react');
var _lib = require('../lib/');
var _lib2 = _interopRequireDefault(_lib);
var _value = require('./value');
var _value2 = _interopRequireDefault(_value);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var plugin = (0, _lib2.default)();
var plugins = [plugin];
function renderNode(props) {
var node = props.node,
attributes = props.attributes,
children = props.children,
editor = props.editor;
var isCurrentItem = plugin.utils.getItemsAtRange(editor.value).contains(node);
switch (node.type) {
case 'ul_list':
return _react2.default.createElement(
'ul',
attributes,
children
);
case 'ol_list':
return _react2.default.createElement(
'ol',
attributes,
children
);
case 'list_item':
return _react2.default.createElement(
'li',
_extends({
className: isCurrentItem ? 'current-item' : '',
title: isCurrentItem ? 'Current Item' : ''
}, props.attributes),
props.children
);
case 'paragraph':
return _react2.default.createElement(
'p',
attributes,
children
);
case 'heading':
return _react2.default.createElement(
'h1',
attributes,
children
);
default:
return _react2.default.createElement(
'p',
attributes,
children
);
}
}
var Example = function (_React$Component) {
_inherits(Example, _React$Component);
function Example() {
var _ref;
var _temp, _this, _ret;
_classCallCheck(this, Example);
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Example.__proto__ || Object.getPrototypeOf(Example)).call.apply(_ref, [this].concat(args))), _this), _this.state = {
value: _value2.default
}, _this.onChange = function (_ref2) {
var value = _ref2.value;
_this.setState({
value: value
});
}, _temp), _possibleConstructorReturn(_this, _ret);
}
_createClass(Example, [{
key: 'renderToolbar',
value: function renderToolbar() {
var _this2 = this;
var _plugin$changes = plugin.changes,
wrapInList = _plugin$changes.wrapInList,
unwrapList = _plugin$changes.unwrapList,
increaseItemDepth = _plugin$changes.increaseItemDepth,
decreaseItemDepth = _plugin$changes.decreaseItemDepth;
var inList = plugin.utils.isSelectionInList(this.state.value);
return _react2.default.createElement(
'div',
null,
_react2.default.createElement(
'button',
{
className: inList ? 'active' : '',
onClick: function onClick() {
return _this2.call(inList ? unwrapList : wrapInList);
}
},
_react2.default.createElement('i', { className: 'fa fa-list-ul fa-lg' })
),
_react2.default.createElement(
'button',
{
className: inList ? '' : 'disabled',
onClick: function onClick() {
return _this2.call(decreaseItemDepth);
}
},
_react2.default.createElement('i', { className: 'fa fa-outdent fa-lg' })
),
_react2.default.createElement(
'button',
{
className: inList ? '' : 'disabled',
onClick: function onClick() {
return _this2.call(increaseItemDepth);
}
},
_react2.default.createElement('i', { className: 'fa fa-indent fa-lg' })
),
_react2.default.createElement(
'span',
{ className: 'sep' },
'\xB7'
),
_react2.default.createElement(
'button',
{ onClick: function onClick() {
return _this2.call(wrapInList);
} },
'Wrap in list'
),
_react2.default.createElement(
'button',
{ onClick: function onClick() {
return _this2.call(unwrapList);
} },
'Unwrap from list'
)
);
}
}, {
key: 'call',
value: function call(change) {
this.setState({
value: this.state.value.change().call(change).value
});
}
}, {
key: 'render',
value: function render() {
return _react2.default.createElement(
'div',
null,
this.renderToolbar(),
_react2.default.createElement(_slateReact.Editor, {
placeholder: 'Enter some text...',
plugins: plugins,
value: this.state.value,
onChange: this.onChange,
renderNode: renderNode,
shouldNodeComponentUpdate: function shouldNodeComponentUpdate(props) {
return (
// To update the highlighting of nodes inside the selection
props.node.type === 'list_item'
);
}
})
);
}
}]);
return Example;
}(_react2.default.Component);
// $FlowFixMe
_reactDom2.default.render(_react2.default.createElement(Example, null), document.getElementById('example'));
},{"../lib/":14,"./value":2,"react":251,"react-dom":237,"slate-react":270}],2:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slateHyperscript = require('slate-hyperscript');
var h = (0, _slateHyperscript.createHyperscript)({
blocks: {
heading: 'heading',
paragraph: 'paragraph',
ul_list: 'ul_list',
ol_list: 'ol_list',
list_item: 'list_item'
}
}); /** @jsx h */
// eslint-disable-next-line import/no-extraneous-dependencies
exports.default = h(
'value',
null,
h(
'document',
null,
h(
'heading',
null,
'Slate + List Edition'
),
h(
'paragraph',
null,
'This page is a basic example of Slate + slate-edit-list plugin. Press Enter in a list to create a new list item. Press Enter again to exit and Shift+Enter to create a paragraph in a list. The items at range are detected and highlighted, for demonstration purpose.'
),
h(
'ul_list',
{ style: { listStyleType: 'disc' } },
h(
'list_item',
null,
h(
'paragraph',
null,
'First item in the list'
)
),
h(
'list_item',
null,
h(
'paragraph',
null,
'List item can contain blocks'
),
h(
'heading',
null,
'Here is a heading'
),
h(
'paragraph',
null,
'And another paragraph'
)
),
h(
'list_item',
null,
h(
'paragraph',
null,
'Third item in the list, with a nested list'
),
h(
'ol_list',
{ style: { listStyleType: 'decimal' } },
h(
'list_item',
null,
h(
'paragraph',
null,
'First item in the nested list'
)
),
h(
'list_item',
null,
h(
'paragraph',
null,
'Second item in the nested list'
)
)
)
)
),
h(
'paragraph',
null,
'End paragraph'
)
)
);
},{"slate-hyperscript":256}],3:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slate = require('slate');
var _utils = require('../utils');
/**
* Decreases the depth of the current item. The following items will
* be moved as sublist of the decreased item.
*
* No-op for root items.
*/
function decreaseItemDepth(opts, change) {
var value = change.value;
var document = value.document;
// Cannot decrease item depth of root items
var depth = (0, _utils.getItemDepth)(opts, value);
if (depth == 1) {
return change;
}
var currentItem = (0, _utils.getCurrentItem)(opts, value);
if (!currentItem) {
return change;
}
var currentList = document.getParent(currentItem.key);
var parentItem = document.getParent(currentList.key);
var parentList = document.getParent(parentItem.key);
// The items following the item will be moved to a sublist of currentItem
var followingItems = currentList.nodes.skipUntil(function (i) {
return i === currentItem;
}).rest();
// True if the currentItem and the followingItems make the whole
// currentList, and hence the currentList will be emptied
var willEmptyCurrentList = currentList.nodes.size === followingItems.size + 1;
if (!followingItems.isEmpty()) {
// Add them as sublist of currentItem
var sublist = _slate.Block.create({
object: 'block',
type: currentList.type,
data: currentList.data
});
// Add the sublist
change.insertNodeByKey(currentItem.key, currentItem.nodes.size, sublist, { normalize: false });
change.moveNodeByKey(currentItem.key, parentList.key, parentList.nodes.indexOf(parentItem) + 1, { normalize: false });
// Move the followingItems to the sublist
followingItems.forEach(function (item, index) {
return change.moveNodeByKey(item.key, sublist.key, sublist.nodes.size + index, { normalize: false });
});
} else {
change.moveNodeByKey(currentItem.key, parentList.key, parentList.nodes.indexOf(parentItem) + 1);
}
// Remove the currentList completely if needed
if (willEmptyCurrentList) {
change.removeNodeByKey(currentList.key);
}
return change;
}
exports.default = decreaseItemDepth;
},{"../utils":22,"slate":308}],4:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slate = require('slate');
var _utils = require('../utils');
/**
* Increase the depth of the current item by putting it in a sub-list
* of previous item.
* For first items in a list, does nothing.
*/
function increaseItemDepth(opts, change) {
var previousItem = (0, _utils.getPreviousItem)(opts, change.value);
var currentItem = (0, _utils.getCurrentItem)(opts, change.value);
if (!previousItem) {
return change;
}
if (!currentItem) {
return change;
}
// Move the item in the sublist of previous item
return moveAsSubItem(opts, change, currentItem, previousItem.key);
}
/**
* Move the given item to the sublist at the end of destination item,
* creating a sublist if needed.
*/
function moveAsSubItem(opts, change,
// The list item to add
item,
// The key of the destination node
destKey) {
var destination = change.value.document.getDescendant(destKey);
var lastIndex = destination.nodes.size;
var lastChild = destination.nodes.last();
// The potential existing last child list
var existingList = (0, _utils.isList)(opts, lastChild) ? lastChild : null;
if (existingList) {
return change.moveNodeByKey(item.key, existingList.key, existingList.nodes.size // as last item
);
}
var currentList = (0, _utils.getListForItem)(opts, change.value, destination);
if (!currentList) {
throw new Error('Destination is not in a list');
}
var newSublist = _slate.Block.create({
object: 'block',
type: currentList.type,
data: currentList.data
});
change.insertNodeByKey(destKey, lastIndex, newSublist, {
normalize: false
});
return change.moveNodeByKey(item.key, newSublist.key, 0);
}
exports.default = increaseItemDepth;
},{"../utils":22,"slate":308}],5:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.decreaseItemDepth = exports.increaseItemDepth = exports.splitListItem = exports.unwrapList = exports.wrapInList = undefined;
var _wrapInList = require('./wrapInList');
var _wrapInList2 = _interopRequireDefault(_wrapInList);
var _unwrapList = require('./unwrapList');
var _unwrapList2 = _interopRequireDefault(_unwrapList);
var _splitListItem = require('./splitListItem');
var _splitListItem2 = _interopRequireDefault(_splitListItem);
var _increaseItemDepth = require('./increaseItemDepth');
var _increaseItemDepth2 = _interopRequireDefault(_increaseItemDepth);
var _decreaseItemDepth = require('./decreaseItemDepth');
var _decreaseItemDepth2 = _interopRequireDefault(_decreaseItemDepth);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.wrapInList = _wrapInList2.default;
exports.unwrapList = _unwrapList2.default;
exports.splitListItem = _splitListItem2.default;
exports.increaseItemDepth = _increaseItemDepth2.default;
exports.decreaseItemDepth = _decreaseItemDepth2.default;
},{"./decreaseItemDepth":3,"./increaseItemDepth":4,"./splitListItem":6,"./unwrapList":7,"./wrapInList":8}],6:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
require('slate');
var _utils = require('../utils');
/**
* Split a list item at the start of the current range.
*/
function splitListItem(opts, change) {
var value = change.value;
var currentItem = (0, _utils.getCurrentItem)(opts, value);
if (!currentItem) {
return change;
}
var splitOffset = value.startOffset;
return change.splitDescendantsByKey(currentItem.key, value.startKey, splitOffset);
}
exports.default = splitListItem;
},{"../utils":22,"slate":308}],7:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
require('slate');
var _utils = require('../utils');
/**
* Unwrap items at range from their list.
*/
function unwrapList(opts, change) {
var items = (0, _utils.getItemsAtRange)(opts, change.value);
if (items.isEmpty()) {
return change;
}
// Unwrap the items from their list
items.forEach(function (item) {
return change.unwrapNodeByKey(item.key, { normalize: false });
});
// Parent of the list of the items
var firstItem = items.first();
var parent = change.value.document.getParent(firstItem.key);
var index = parent.nodes.findIndex(function (node) {
return node.key === firstItem.key;
});
// Unwrap the items' children
items.forEach(function (item) {
item.nodes.forEach(function (node) {
change.moveNodeByKey(node.key, parent.key, index, {
normalize: false
});
index += 1;
});
});
// Finally, remove the now empty items
items.forEach(function (item) {
return change.removeNodeByKey(item.key, { normalize: false });
});
return change;
}
exports.default = unwrapList;
},{"../utils":22,"slate":308}],8:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slate = require('slate');
var _immutable = require('immutable');
var _utils = require('../utils');
/**
* Wrap the blocks in the current selection in a new list. Selected
* lists are merged together.
*/
function wrapInList(opts, change, type, data) {
var selectedBlocks = getHighestSelectedBlocks(change.value);
type = type || opts.types[0];
// Wrap in container
change.wrapBlock({
type: type,
data: _slate.Data.create(data)
}, { normalize: false });
// Wrap in list items
selectedBlocks.forEach(function (node) {
if ((0, _utils.isList)(opts, node)) {
// Merge its items with the created list
node.nodes.forEach(function (_ref) {
var key = _ref.key;
return change.unwrapNodeByKey(key, { normalize: false });
});
} else {
change.wrapBlockByKey(node.key, opts.typeItem, {
normalize: false
});
}
});
return change.normalize();
}
/**
* Returns the highest list of blocks that cover the current selection
*/
function getHighestSelectedBlocks(value) {
var range = value.selection;
var document = value.document;
var startBlock = document.getClosestBlock(range.startKey);
var endBlock = document.getClosestBlock(range.endKey);
if (startBlock === endBlock) {
return (0, _immutable.List)([startBlock]);
}
var ancestor = document.getCommonAncestor(startBlock.key, endBlock.key);
var startPath = ancestor.getPath(startBlock.key);
var endPath = ancestor.getPath(endBlock.key);
return ancestor.nodes.slice(startPath[0], endPath[0] + 1);
}
exports.default = wrapInList;
},{"../utils":22,"immutable":51,"slate":308}],9:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _options = require('./options');
var _options2 = _interopRequireDefault(_options);
var _validation = require('./validation');
var _changes = require('./changes');
var _utils = require('./utils');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
/**
* Returns the core of the plugin, limited to the validation and normalization
* part of `slate-edit-list`, and utils.
*
* Import this directly: `import EditListCore from 'slate-edit-table/lib/core'`
* if you don't care about behavior/rendering and you
* are only manipulating `Slate.Values` without rendering them.
* That way you do not depend on importing `slate-react`.
*/
function core() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
opts = new _options2.default(opts);
return {
schema: (0, _validation.schema)(opts),
validateNode: (0, _validation.validateNode)(opts),
utils: {
getCurrentItem: _utils.getCurrentItem.bind(null, opts),
getCurrentList: _utils.getCurrentList.bind(null, opts),
getItemDepth: _utils.getItemDepth.bind(null, opts),
getItemsAtRange: _utils.getItemsAtRange.bind(null, opts),
getPreviousItem: _utils.getPreviousItem.bind(null, opts),
isList: _utils.isList.bind(null, opts),
isSelectionInList: _utils.isSelectionInList.bind(null, opts)
},
changes: {
decreaseItemDepth: bindAndScopeChange(opts, _changes.decreaseItemDepth),
increaseItemDepth: bindAndScopeChange(opts, _changes.increaseItemDepth),
splitListItem: bindAndScopeChange(opts, _changes.splitListItem),
unwrapList: bindAndScopeChange(opts, _changes.unwrapList),
wrapInList: _changes.wrapInList.bind(null, opts)
}
};
}
/**
* Bind a change to given options, and scope it to act only inside a list
*/
function bindAndScopeChange(opts, fn) {
return function (change) {
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
var value = change.value;
if (!(0, _utils.isSelectionInList)(opts, value)) {
return change;
}
// $FlowFixMe
return fn.apply(undefined, _toConsumableArray([opts, change].concat(args)));
};
}
exports.default = core;
},{"./changes":5,"./options":15,"./utils":22,"./validation":25}],10:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.onBackspace = exports.onTab = exports.onEnter = undefined;
var _onEnter = require('./onEnter');
var _onEnter2 = _interopRequireDefault(_onEnter);
var _onTab = require('./onTab');
var _onTab2 = _interopRequireDefault(_onTab);
var _onBackspace = require('./onBackspace');
var _onBackspace2 = _interopRequireDefault(_onBackspace);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.onEnter = _onEnter2.default;
exports.onTab = _onTab2.default;
exports.onBackspace = _onBackspace2.default;
},{"./onBackspace":11,"./onEnter":12,"./onTab":13}],11:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
require('slate');
var _changes = require('../changes');
var _utils = require('../utils');
/**
* User pressed Delete in an editor
*/
function onBackspace(event, change, editor, opts) {
var value = change.value;
var startOffset = value.startOffset,
selection = value.selection;
// Only unwrap...
// ... with a collapsed selection
if (selection.isExpanded) {
return undefined;
}
// ... when at the beginning of nodes
if (startOffset > 0) {
return undefined;
}
// ... in a list
var currentItem = (0, _utils.getCurrentItem)(opts, value);
if (!currentItem) {
return undefined;
}
// ... more precisely at the beginning of the current item
if (!selection.isAtStartOf(currentItem)) {
return undefined;
}
event.preventDefault();
return (0, _changes.unwrapList)(opts, change);
}
exports.default = onBackspace;
},{"../changes":5,"../utils":22,"slate":308}],12:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
require('slate');
var _changes = require('../changes');
var _utils = require('../utils');
/**
* User pressed Enter in an editor
*
* Enter in a list item should split the list item
* Enter in an empty list item should remove it
* Shift+Enter in a list item should make a new line
*/
function onEnter(event, change, editor, opts) {
// Pressing Shift+Enter
// should split block normally
if (event.shiftKey) {
return undefined;
}
var value = change.value;
var currentItem = (0, _utils.getCurrentItem)(opts, value);
// Not in a list
if (!currentItem) {
return undefined;
}
event.preventDefault();
// If expanded, delete first.
if (value.isExpanded) {
change.delete();
}
if (currentItem.isEmpty) {
// Block is empty, we exit the list
if ((0, _utils.getItemDepth)(opts, value) > 1) {
return (0, _changes.decreaseItemDepth)(opts, change);
}
// Exit list
return (0, _changes.unwrapList)(opts, change);
}
// Split list item
return (0, _changes.splitListItem)(opts, change);
}
exports.default = onEnter;
},{"../changes":5,"../utils":22,"slate":308}],13:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
require('slate');
var _changes = require('../changes');
var _utils = require('../utils');
/**
* User pressed Tab in an editor.
* Tab -> Increase item depth if inside a list item
* Shift+Tab -> Decrease item depth if inside a list item
*/
function onTab(event, change, editor, opts) {
var value = change.value;
var isCollapsed = value.isCollapsed;
if (!isCollapsed || !(0, _utils.getCurrentItem)(opts, value)) {
return undefined;
}
// Shift+tab reduce depth
if (event.shiftKey) {
event.preventDefault();
return (0, _changes.decreaseItemDepth)(opts, change);
}
// Tab increases depth
event.preventDefault();
return (0, _changes.increaseItemDepth)(opts, change);
}
exports.default = onTab;
},{"../changes":5,"../utils":22,"slate":308}],14:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _options = require('./options');
var _options2 = _interopRequireDefault(_options);
var _handlers = require('./handlers');
var _core = require('./core');
var _core2 = _interopRequireDefault(_core);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var KEY_ENTER = 'Enter';
var KEY_TAB = 'Tab';
var KEY_BACKSPACE = 'Backspace';
/**
* A Slate plugin to handle keyboard events in lists.
*/
function EditList() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
opts = new _options2.default(opts);
var corePlugin = (0, _core2.default)(opts);
return _extends({}, corePlugin, {
onKeyDown: onKeyDown.bind(null, opts)
});
}
/**
* User is pressing a key in the editor
*/
function onKeyDown(opts, event, change, editor) {
var args = [event, change, editor, opts];
switch (event.key) {
case KEY_ENTER:
return _handlers.onEnter.apply(undefined, args);
case KEY_TAB:
return _handlers.onTab.apply(undefined, args);
case KEY_BACKSPACE:
return _handlers.onBackspace.apply(undefined, args);
default:
return undefined;
}
}
exports.default = EditList;
},{"./core":9,"./handlers":10,"./options":15}],15:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _immutable = require('immutable');
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
/**
* The plugin options
*/
var Options = function (_Record) {
_inherits(Options, _Record);
function Options() {
_classCallCheck(this, Options);
return _possibleConstructorReturn(this, (Options.__proto__ || Object.getPrototypeOf(Options)).apply(this, arguments));
}
return Options;
}((0, _immutable.Record)({
types: ['ul_list', 'ol_list'],
typeItem: 'list_item',
typeDefault: 'paragraph'
}));
exports.default = Options;
},{"immutable":51}],16:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
require('slate');
/**
* Return the current list item, from current selection or from a node.
*/
function getCurrentItem(opts, value, block) {
var document = value.document;
if (!block) {
if (!value.selection.startKey) return null;
block = value.startBlock;
}
var parent = document.getParent(block.key);
return parent && parent.type === opts.typeItem ? parent : null;
}
exports.default = getCurrentItem;
},{"slate":308}],17:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
require('slate');
var _getCurrentItem = require('./getCurrentItem');
var _getCurrentItem2 = _interopRequireDefault(_getCurrentItem);
var _getListForItem = require('./getListForItem');
var _getListForItem2 = _interopRequireDefault(_getListForItem);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Return the parent list block, from current selection or from a node (paragraph in a list item).
*/
function getCurrentList(opts, value, block) {
var item = (0, _getCurrentItem2.default)(opts, value, block);
if (!item) {
return null;
}
return (0, _getListForItem2.default)(opts, value, item);
}
exports.default = getCurrentList;
},{"./getCurrentItem":16,"./getListForItem":20,"slate":308}],18:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
require('slate');
var _getCurrentItem = require('./getCurrentItem');
var _getCurrentItem2 = _interopRequireDefault(_getCurrentItem);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Get depth of current block in a document list
*/
function getItemDepth(opts, value, block) {
var document = value.document,
startBlock = value.startBlock;
block = block || startBlock;
var currentItem = (0, _getCurrentItem2.default)(opts, value, block);
if (!currentItem) {
return 0;
}
var list = document.getParent(currentItem.key);
return 1 + getItemDepth(opts, value, list);
}
exports.default = getItemDepth;
},{"./getCurrentItem":16,"slate":308}],19:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
require('slate');
var _immutable = require('immutable');
var _isList = require('./isList');
var _isList2 = _interopRequireDefault(_isList);
var _getCurrentItem = require('./getCurrentItem');
var _getCurrentItem2 = _interopRequireDefault(_getCurrentItem);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Return the list of items at the given range. The returned items are
* the highest list item blocks that cover the range.
*
* Returns an empty list if no list of items can cover the range
*/
function getItemsAtRange(opts, value, range) {
range = range || value.selection;
if (!range.startKey) {
return (0, _immutable.List)();
}
var document = value.document;
var startBlock = document.getClosestBlock(range.startKey);
var endBlock = document.getClosestBlock(range.endKey);
if (startBlock === endBlock) {
var item = (0, _getCurrentItem2.default)(opts, value, startBlock);
return item ? (0, _immutable.List)([item]) : (0, _immutable.List)();
}
var ancestor = document.getCommonAncestor(startBlock.key, endBlock.key);
if ((0, _isList2.default)(opts, ancestor)) {
var startPath = ancestor.getPath(startBlock.key);
var endPath = ancestor.getPath(endBlock.key);
return ancestor.nodes.slice(startPath[0], endPath[0] + 1);
} else if (ancestor.type === opts.typeItem) {
// The ancestor is the highest list item that covers the range
return (0, _immutable.List)([ancestor]);
}
// No list of items can cover the range
return (0, _immutable.List)();
}
exports.default = getItemsAtRange;
},{"./getCurrentItem":16,"./isList":23,"immutable":51,"slate":308}],20:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
require('slate');
var _isList = require('./isList');
var _isList2 = _interopRequireDefault(_isList);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Return the parent list block for an item block.
*/
function getListForItem(opts, value, item) {
var document = value.document;
var parent = document.getParent(item.key);
return parent && (0, _isList2.default)(opts, parent) ? parent : null;
}
exports.default = getListForItem;
},{"./isList":23,"slate":308}],21:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
require('slate');
var _getCurrentItem = require('./getCurrentItem');
var _getCurrentItem2 = _interopRequireDefault(_getCurrentItem);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Return the previous item, from current selection or from a node.
*/
function getPreviousItem(opts, value, block) {
var document = value.document,
startBlock = value.startBlock;
block = block || startBlock;
var currentItem = (0, _getCurrentItem2.default)(opts, value, block);
if (!currentItem) {
return null;
}
var previousSibling = document.getPreviousSibling(currentItem.key);
if (!previousSibling) {
return null;
} else if (previousSibling.type === opts.typeItem) {
return previousSibling;
}
return null;
}
exports.default = getPreviousItem;
},{"./getCurrentItem":16,"slate":308}],22:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isSelectionInList = exports.isList = exports.getPreviousItem = exports.getListForItem = exports.getItemsAtRange = exports.getItemDepth = exports.getCurrentList = exports.getCurrentItem = undefined;
var _getCurrentItem = require('./getCurrentItem');
var _getCurrentItem2 = _interopRequireDefault(_getCurrentItem);
var _getCurrentList = require('./getCurrentList');
var _getCurrentList2 = _interopRequireDefault(_getCurrentList);
var _getItemDepth = require('./getItemDepth');
var _getItemDepth2 = _interopRequireDefault(_getItemDepth);
var _getItemsAtRange = require('./getItemsAtRange');
var _getItemsAtRange2 = _interopRequireDefault(_getItemsAtRange);
var _getListForItem = require('./getListForItem');
var _getListForItem2 = _interopRequireDefault(_getListForItem);
var _getPreviousItem = require('./getPreviousItem');
var _getPreviousItem2 = _interopRequireDefault(_getPreviousItem);
var _isList = require('./isList');
var _isList2 = _interopRequireDefault(_isList);
var _isSelectionInList = require('./isSelectionInList');
var _isSelectionInList2 = _interopRequireDefault(_isSelectionInList);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.getCurrentItem = _getCurrentItem2.default;
exports.getCurrentList = _getCurrentList2.default;
exports.getItemDepth = _getItemDepth2.default;
exports.getItemsAtRange = _getItemsAtRange2.default;
exports.getListForItem = _getListForItem2.default;
exports.getPreviousItem = _getPreviousItem2.default;
exports.isList = _isList2.default;
exports.isSelectionInList = _isSelectionInList2.default;
},{"./getCurrentItem":16,"./getCurrentList":17,"./getItemDepth":18,"./getItemsAtRange":19,"./getListForItem":20,"./getPreviousItem":21,"./isList":23,"./isSelectionInList":24}],23:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
require('slate');
/**
* True if the node is a list container
*/
function isList(opts, node) {
return opts.types.includes(node.type);
}
exports.default = isList;
},{"slate":308}],24:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
require('slate');
var _getItemsAtRange = require('./getItemsAtRange');
var _getItemsAtRange2 = _interopRequireDefault(_getItemsAtRange);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* True if selection is inside a list (and can be unwrapped)
*/
function isSelectionInList(opts, value) {
return !(0, _getItemsAtRange2.default)(opts, value).isEmpty();
}
exports.default = isSelectionInList;
},{"./getItemsAtRange":19,"slate":308}],25:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.validateNode = exports.schema = undefined;
var _schema = require('./schema');
var _schema2 = _interopRequireDefault(_schema);
var _validateNode = require('./validateNode');
var _validateNode2 = _interopRequireDefault(_validateNode);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
exports.schema = _schema2.default;
exports.validateNode = _validateNode2.default;
},{"./schema":26,"./validateNode":27}],26:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
require('slate');
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
/**
* Create a schema definition with rules to normalize lists
*/
function schema(opts) {
var constructedSchema = {
blocks: _defineProperty({}, opts.typeItem, {
parent: { types: opts.types },
nodes: [{ objects: ['block'] }],
normalize: normalize({
parent_type_invalid: function parent_type_invalid(change, context) {
return change.unwrapBlockByKey(context.node.key, {
normalize: false
});
},
child_object_invalid: function child_object_invalid(change, context) {
return wrapChildrenInDefaultBlock(opts, change, context.node);
}
})
})
};
// validate all list types, ensure they only have list item children
opts.types.forEach(function (type) {
constructedSchema.blocks[type] = {
nodes: [{ types: [opts.typeItem] }],
normalize: normalize({
child_type_invalid: function child_type_invalid(change, context) {
return change.wrapBlockByKey(context.child.key, opts.typeItem, {
normalize: false
});
}
})
};
});
return constructedSchema;
}
/*
* Allows to define a normalize function through a keyed collection of functions
*/
function normalize(reasons) {
return function (change, reason, context) {
var reasonFn = reasons[reason];
if (reasonFn) {
reasonFn(change, context);
}
};
}
/**
* Wraps all child of a node in the default block type.
* Returns a change, for chaining purposes
*/
function wrapChildrenInDefaultBlock(opts, change, node) {
change.wrapBlockByKey(node.nodes.first().key, opts.typeDefault, {
normalize: false
});
var wrapper = change.value.document.getDescendant(node.key).nodes.first();
// Add in the remaining items
node.nodes.rest().forEach(function (child, index) {
return change.moveNodeByKey(child.key, wrapper.key, index + 1, {
normalize: false
});
});
return change;
}
exports.default = schema;
},{"slate":308}],27:[function(require,module,exports){
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
require('slate');
var _utils = require('../utils');
/**
* Create a schema definition with rules to normalize lists
*/
function validateNode(opts) {
return function (node) {
return joinAdjacentLists(opts, node);
};
}
/**
* A rule that joins adjacent lists of the same type
*/
function joinAdjacentLists(opts, node) {
if (node.object !== 'document' && node.object !== 'block') {
return undefined;
}
var invalids = node.nodes.map(function (child, i) {
if (!(0, _utils.isList)(opts, child)) return null;
var next = node.nodes.get(i + 1);
if (!next || next.type !== child.type) return null;
return [child, next];
}).filter(Boolean);
if (invalids.isEmpty()) {
return undefined;
}
/**
* Join the list pairs
*/
// We join in reverse order, so that multiple lists folds onto the first one
return function (change) {
invalids.reverse().forEach(function (pair) {
var _pair = _slicedToArray(pair, 2),
first = _pair[0],
second = _pair[1];
var updatedSecond = change.value.document.getDescendant(second.key);
updatedSecond.nodes.forEach(function (secondNode, index) {
change.moveNodeByKey(secondNode.key, first.key, first.nodes.size + index, { normalize: false });
});
change.removeNodeByKey(second.key, { normalize: false });
});
};
}
exports.default = validateNode;
},{"../utils":22,"slate":308}],28:[function(require,module,exports){
'use strict';
var GROUP_LEFT_TO_RIGHT,
GROUP_RIGHT_TO_LEFT,
EXPRESSION_LEFT_TO_RIGHT,
EXPRESSION_RIGHT_TO_LEFT;
/*
* Character ranges of left-to-right characters.
*/
GROUP_LEFT_TO_RIGHT = 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6' +
'\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF\u200E\u2C00-\uFB1C' +
'\uFE00-\uFE6F\uFEFD-\uFFFF';
/*
* Character ranges of right-to-left characters.
*/
GROUP_RIGHT_TO_LEFT = '\u0591-\u07FF\uFB1D-\uFDFD\uFE70-\uFEFC';
/*
* Expression to match a left-to-right string.
*
* Matches the start of a string, followed by zero or
* more non-right-to-left characters, followed by a
* left-to-right character.
*/
EXPRESSION_LEFT_TO_RIGHT = new RegExp(
'^[^' + GROUP_RIGHT_TO_LEFT + ']*[' + GROUP_LEFT_TO_RIGHT + ']'
);
/*
* Expression to match a right-to-left string.
*
* Matches the start of a string, followed by zero or
* more non-left-to-right characters, followed by a
* right-to-left character.
*/
EXPRESSION_RIGHT_TO_LEFT = new RegExp(
'^[^' + GROUP_LEFT_TO_RIGHT + ']*[' + GROUP_RIGHT_TO_LEFT + ']'
);
/**
* Detect the direction of text.
*
* @param {string} value - value to stringify and check.
* @return {string} - One of `"rtl"`, `"ltr"`, or
* `"neutral"`.
*/
function direction(value) {
value = value.toString();
if (EXPRESSION_RIGHT_TO_LEFT.test(value)) {
return 'rtl';
}
if (EXPRESSION_LEFT_TO_RIGHT.test(value)) {
return 'ltr';
}
return 'neutral';
}
/*
* Expose `direction`.
*/
module.exports = direction;
},{}],29:[function(require,module,exports){
(function (global){
/*! https://mths.be/esrever v0.2.0 by @mathias */
;(function(root) {
// Detect free variables `exports`
var freeExports = typeof exports == 'object' && exports;
// Detect free variable `module`
var freeModule = typeof module == 'object' && module &&
module.exports == freeExports && module;
// Detect free variable `global`, from Node.js or Browserified code,
// and use it as `root`
var freeGlobal = typeof global == 'object' && global;
if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
root = freeGlobal;
}
/*--------------------------------------------------------------------------*/
var regexSymbolWithCombiningMarks = /([\0-\u02FF\u0370-\u1AAF\u1B00-\u1DBF\u1E00-\u20CF\u2100-\uD7FF\uE000-\uFE1F\uFE30-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])([\u0300-\u036F\u1AB0-\u1AFF\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]+)/g;
var regexSurrogatePair = /([\uD800-\uDBFF])([\uDC00-\uDFFF])/g;
var reverse = function(string) {
// Step 1: deal with combining marks and astral symbols (surrogate pairs)
string = string
// Swap symbols with their combining marks so the combining marks go first
.replace(regexSymbolWithCombiningMarks, function($0, $1, $2) {
// Reverse the combining marks so they will end up in the same order
// later on (after another round of reversing)
return reverse($2) + $1;
})
// Swap high and low surrogates so the low surrogates go first
.replace(regexSurrogatePair, '$2$1');
// Step 2: reverse the code units in the string
var result = '';
var index = string.length;
while (index--) {
result += string.charAt(index);
}
return result;
};
/*--------------------------------------------------------------------------*/
var esrever = {
'version': '0.2.0',
'reverse': reverse
};
// Some AMD build optimizers, like r.js, check for specific condition patterns
// like the following:
if (
typeof define == 'function' &&
typeof define.amd == 'object' &&
define.amd
) {
define(function() {
return esrever;
});
} else if (freeExports && !freeExports.nodeType) {
if (freeModule) { // in Node.js, io.js, or RingoJS v0.8.0+
freeModule.exports = esrever;
} else { // in Narwhal or RingoJS v0.7.0-
for (var key in esrever) {
esrever.hasOwnProperty(key) && (freeExports[key] = esrever[key]);
}
}
} else { // in Rhino or a web browser
root.esrever = esrever;
}
}(this));
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !