mirror of
				https://github.com/BookStackApp/BookStack.git
				synced 2025-10-31 03:50:27 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import {$isElementNode, LexicalEditor, LexicalNode, SerializedLexicalNode} from "lexical";
 | |
| 
 | |
| type SerializedLexicalNodeWithChildren = {
 | |
|     node: SerializedLexicalNode,
 | |
|     children: SerializedLexicalNodeWithChildren[],
 | |
| };
 | |
| 
 | |
| function serializeNodeRecursive(node: LexicalNode): SerializedLexicalNodeWithChildren {
 | |
|     const childNodes = $isElementNode(node) ? node.getChildren() : [];
 | |
|     return {
 | |
|         node: node.exportJSON(),
 | |
|         children: childNodes.map(n => serializeNodeRecursive(n)),
 | |
|     };
 | |
| }
 | |
| 
 | |
| function unserializeNodeRecursive(editor: LexicalEditor, {node, children}: SerializedLexicalNodeWithChildren): LexicalNode|null {
 | |
|     const instance = editor._nodes.get(node.type)?.klass.importJSON(node);
 | |
|     if (!instance) {
 | |
|         return null;
 | |
|     }
 | |
| 
 | |
|     const childNodes = children.map(child => unserializeNodeRecursive(editor, child));
 | |
|     for (const child of childNodes) {
 | |
|         if (child && $isElementNode(instance)) {
 | |
|             instance.append(child);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return instance;
 | |
| }
 | |
| 
 | |
| export class NodeClipboard<T extends LexicalNode> {
 | |
|     protected store: SerializedLexicalNodeWithChildren[] = [];
 | |
| 
 | |
|     set(...nodes: LexicalNode[]): void {
 | |
|         this.store.splice(0, this.store.length);
 | |
|         for (const node of nodes) {
 | |
|             this.store.push(serializeNodeRecursive(node));
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     get(editor: LexicalEditor): T[] {
 | |
|         return this.store.map(json => unserializeNodeRecursive(editor, json)).filter((node) => {
 | |
|             return node !== null;
 | |
|         }) as T[];
 | |
|     }
 | |
| 
 | |
|     size(): number {
 | |
|         return this.store.length;
 | |
|     }
 | |
| } |