Skip to content

Commit cb65cc6

Browse files
committed
...
1 parent 56b3608 commit cb65cc6

File tree

3 files changed

+93
-6
lines changed

3 files changed

+93
-6
lines changed

.github/workflows/buildbug.yml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,3 @@ jobs:
212212
- run: |
213213
sed -i 's@"type": "module",@@' package.json
214214
cat lexical.json | npx ts-node lexical-cli-render-tsx.ts
215-
#
216-
#- uses: actions/upload-artifact@v4
217-
# with:
218-
# name: lexicalplaygroundonlyassets
219-
# path: dist/

EmojiNode.tsx

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
*/
8+
9+
import type {
10+
EditorConfig,
11+
LexicalNode,
12+
NodeKey,
13+
SerializedTextNode,
14+
Spread,
15+
} from 'lexical';
16+
17+
import {$applyNodeReplacement, TextNode} from 'lexical';
18+
19+
export type SerializedEmojiNode = Spread<
20+
{
21+
className: string;
22+
},
23+
SerializedTextNode
24+
>;
25+
26+
export class EmojiNode extends TextNode {
27+
__className: string;
28+
29+
static getType(): string {
30+
return 'emoji';
31+
}
32+
33+
static clone(node: EmojiNode): EmojiNode {
34+
return new EmojiNode(node.__className, node.__text, node.__key);
35+
}
36+
37+
constructor(className: string, text: string, key?: NodeKey) {
38+
super(text, key);
39+
this.__className = className;
40+
}
41+
42+
createDOM(config: EditorConfig): HTMLElement {
43+
const dom = document.createElement('span');
44+
const inner = super.createDOM(config);
45+
dom.className = this.__className;
46+
inner.className = 'emoji-inner';
47+
dom.appendChild(inner);
48+
return dom;
49+
}
50+
51+
updateDOM(prevNode: this, dom: HTMLElement, config: EditorConfig): boolean {
52+
const inner = dom.firstChild;
53+
if (inner === null) {
54+
return true;
55+
}
56+
super.updateDOM(prevNode, inner as HTMLElement, config);
57+
return false;
58+
}
59+
60+
static importJSON(serializedNode: SerializedEmojiNode): EmojiNode {
61+
return $createEmojiNode(
62+
serializedNode.className,
63+
serializedNode.text,
64+
).updateFromJSON(serializedNode);
65+
}
66+
67+
exportJSON(): SerializedEmojiNode {
68+
return {
69+
...super.exportJSON(),
70+
className: this.getClassName(),
71+
};
72+
}
73+
74+
getClassName(): string {
75+
const self = this.getLatest();
76+
return self.__className;
77+
}
78+
}
79+
80+
export function $isEmojiNode(
81+
node: LexicalNode | null | undefined,
82+
): node is EmojiNode {
83+
return node instanceof EmojiNode;
84+
}
85+
86+
export function $createEmojiNode(
87+
className: string,
88+
emojiText: string,
89+
): EmojiNode {
90+
const node = new EmojiNode(className, emojiText).setMode('token');
91+
return $applyNodeReplacement(node);
92+
}

lexical-cli-render-tsx.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { EmojiNode } from "./src/nodes/EmojiNode";
1+
import { EmojiNode } from "./EmojiNode";
22
import { TextNode, $getRoot, $selectAll } from "lexical";
33
import { createHeadlessEditor } from "@lexical/headless";
44
import { $generateHtmlFromNodes } from "@lexical/html";

0 commit comments

Comments
 (0)