Skip to content

Commit

Permalink
extracted list-merging transform to kg-default-transforms
Browse files Browse the repository at this point in the history
  • Loading branch information
kevinansfield committed Oct 18, 2023
1 parent 58b8c51 commit 41f82a8
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 22 deletions.
7 changes: 6 additions & 1 deletion packages/kg-default-transforms/src/default-transforms.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ import {$createParagraphNode, ParagraphNode} from 'lexical';
import {$createHeadingNode, $createQuoteNode, HeadingNode, QuoteNode} from '@lexical/rich-text';
import {ExtendedHeadingNode} from '@tryghost/kg-default-nodes';
import {ListItemNode, $createListItemNode, ListNode, $createListNode} from '@lexical/list';
import {registerMergeListNodesTransform} from './transforms/merge-list-nodes.js';

export * from './transforms/denest.js';
export * from './transforms/merge-list-nodes.js';
export * from './transforms/remove-alignment.js';

export function registerDefaultTransforms(editor: LexicalEditor) {
Expand All @@ -24,6 +26,9 @@ export function registerDefaultTransforms(editor: LexicalEditor) {
registerDenestTransform(editor, ExtendedHeadingNode, node => ($createHeadingNode(node.getTag()))),
registerDenestTransform(editor, QuoteNode, () => ($createQuoteNode())),
registerDenestTransform(editor, ListNode, node => ($createListNode(node.getListType(), node.getStart()))),
registerDenestTransform(editor, ListItemNode, () => ($createListItemNode()))
registerDenestTransform(editor, ListItemNode, () => ($createListItemNode())),

// merge adjacent lists of the same type
registerMergeListNodesTransform(editor)
);
}
19 changes: 19 additions & 0 deletions packages/kg-default-transforms/src/transforms/merge-list-nodes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import {$isListNode, ListNode} from '@lexical/list';
import {LexicalEditor, LexicalNode} from 'lexical';

export function mergeListNodesTransform(node: LexicalNode) {
const nextSibling = node.getNextSibling();

if ($isListNode(nextSibling) && nextSibling.getListType() === node.getListType()) {
node.append(...nextSibling.getChildren());
nextSibling.remove();
}
}

export function registerMergeListNodesTransform(editor: LexicalEditor) {
if (editor.hasNodes([ListNode])) {
return editor.registerNodeTransform(ListNode, mergeListNodesTransform);
}

return () => {};
}
24 changes: 3 additions & 21 deletions packages/koenig-lexical/src/plugins/KoenigBehaviourPlugin.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -1324,27 +1324,9 @@ function useKoenigBehaviour({editor, containerElem, cursorDidExitAtTop, isNested
);
});

// merge list nodes of the same type when next to each other
React.useEffect(() => {
// not all editors have lists (e.g. caption inputs) and registering a transform
// for a node that isn't loaded in the editor will throw an error
if (!editor.hasNodes([ListNode])) {
return;
}

return mergeRegister(
editor.registerNodeTransform(ListNode, (node) => {
const nextSibling = node.getNextSibling();

if ($isListNode(nextSibling) && nextSibling.getListType() === node.getListType()) {
node.append(...nextSibling.getChildren());
nextSibling.remove();
}
})
);
}, [editor]);

// remove alignment formats and denest invalid node nesting
// remove alignment formats,
// denest invalid node nesting,
// merge list nodes of same type
React.useEffect(() => {
return registerDefaultTransforms(editor);
}, [editor]);
Expand Down

0 comments on commit 41f82a8

Please sign in to comment.