@atlaskit/editor-plugin-list
Version:
List plugin for @atlaskit/editor-core
61 lines • 1.81 kB
JavaScript
import { isListItemNode, isListNode } from '@atlaskit/editor-common/utils';
import { findParentNodeClosestToPos } from '@atlaskit/editor-prosemirror/utils';
export function findFirstParentListNode($pos) {
const currentNode = $pos.doc.nodeAt($pos.pos);
let listNodePosition = null;
if (isListNode(currentNode)) {
listNodePosition = $pos.pos;
} else {
const result = findParentNodeClosestToPos($pos, isListNode);
listNodePosition = result && result.pos;
}
if (listNodePosition == null) {
return null;
}
const node = $pos.doc.nodeAt(listNodePosition);
if (!node) {
return null;
}
return {
node,
pos: listNodePosition
};
}
export function findFirstParentListItemNode($pos) {
const currentNode = $pos.doc.nodeAt($pos.pos);
const listItemNodePosition = isListItemNode(currentNode) ? $pos : findParentNodeClosestToPos($pos, isListItemNode);
if (!listItemNodePosition || listItemNodePosition.pos === null) {
return null;
}
const node = $pos.doc.nodeAt(listItemNodePosition.pos);
if (!node) {
return null;
}
return {
node: node,
pos: listItemNodePosition.pos
};
}
export const findRootParentListNode = $pos => {
const {
doc
} = $pos;
if ($pos.pos + 1 > doc.content.size) {
return null;
}
if ($pos.depth === 0) {
return doc.resolve($pos.pos + 1);
}
const currentNode = doc.nodeAt($pos.pos);
const beforePosition = $pos.before();
const nodeBefore = doc.nodeAt(beforePosition);
if (isListNode(currentNode) && !isListItemNode(nodeBefore)) {
return doc.resolve($pos.pos + 1);
}
const parentList = findParentNodeClosestToPos($pos, isListNode);
if (!parentList) {
return null;
}
const listNodePosition = doc.resolve(parentList.pos);
return findRootParentListNode(listNodePosition);
};