slate-edit-list
Version:
A Slate plugin to handle keyboard events in lists.
69 lines (56 loc) • 1.88 kB
JavaScript
;
var Slate = require('slate');
var _require = require('immutable'),
List = _require.List;
var isList = require('../isList');
/**
* Wrap the blocks in the current selection in a new list. Selected
* lists are merged together.
*
* @param {PluginOptions} opts
* @param {Slate.Transform} transform
* @param {Boolean} [ordered=false]
* @param {Object|Data} [data]
* @return {Transform} transform
*/
function wrapInList(opts, transform, ordered, data) {
var selectedBlocks = getHighestSelectedBlocks(transform.state);
// Wrap in container
transform.wrapBlock({
type: ordered ? opts.typeOL : opts.typeUL,
data: Slate.Data.create(data)
});
// Wrap in list items
selectedBlocks.forEach(function (node) {
if (isList(opts, node)) {
// Merge its items with the created list
node.nodes.forEach(function (_ref) {
var key = _ref.key;
return transform.unwrapNodeByKey(key);
});
} else {
transform.wrapBlockByKey(node.key, opts.typeItem);
}
});
return transform;
}
/**
* @param {Slate.State} state
* @return {List<Block>} The highest list of blocks that cover the
* current selection
*/
function getHighestSelectedBlocks(state) {
var range = state.selection;
var document = state.document;
var startBlock = document.getClosestBlock(range.startKey);
var endBlock = document.getClosestBlock(range.endKey);
if (startBlock === endBlock) {
return List([startBlock]);
} else {
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);
}
}
module.exports = wrapInList;