1 import {LexicalNode, Spread} from "lexical";
2 import type {SerializedElementNode} from "lexical/nodes/LexicalElementNode";
4 export type CommonBlockAlignment = 'left' | 'right' | 'center' | 'justify' | '';
5 const validAlignments: CommonBlockAlignment[] = ['left', 'right', 'center', 'justify'];
7 export type SerializedCommonBlockNode = Spread<{
9 alignment: CommonBlockAlignment;
10 }, SerializedElementNode>
12 export interface NodeHasAlignment {
13 readonly __alignment: CommonBlockAlignment;
14 setAlignment(alignment: CommonBlockAlignment): void;
15 getAlignment(): CommonBlockAlignment;
18 export interface NodeHasId {
19 readonly __id: string;
20 setId(id: string): void;
24 interface CommonBlockInterface extends NodeHasId, NodeHasAlignment {}
26 export function extractAlignmentFromElement(element: HTMLElement): CommonBlockAlignment {
27 const textAlignStyle: string = element.style.textAlign || '';
28 if (validAlignments.includes(textAlignStyle as CommonBlockAlignment)) {
29 return textAlignStyle as CommonBlockAlignment;
32 if (element.classList.contains('align-left')) {
34 } else if (element.classList.contains('align-right')) {
36 } else if (element.classList.contains('align-center')) {
38 } else if (element.classList.contains('align-justify')) {
45 export function setCommonBlockPropsFromElement(element: HTMLElement, node: CommonBlockInterface): void {
47 node.setId(element.id);
50 node.setAlignment(extractAlignmentFromElement(element));
53 export function commonPropertiesDifferent(nodeA: CommonBlockInterface, nodeB: CommonBlockInterface): boolean {
54 return nodeA.__id !== nodeB.__id ||
55 nodeA.__alignment !== nodeB.__alignment;
58 export function updateElementWithCommonBlockProps(element: HTMLElement, node: CommonBlockInterface): void {
60 element.setAttribute('id', node.__id);
63 if (node.__alignment) {
64 element.classList.add('align-' + node.__alignment);
68 export interface NodeHasSize {
69 setHeight(height: number): void;
70 setWidth(width: number): void;