+import {LexicalNode, Spread} from "lexical";
+import type {SerializedElementNode} from "lexical/nodes/LexicalElementNode";
+
+export type CommonBlockAlignment = 'left' | 'right' | 'center' | 'justify' | '';
+const validAlignments: CommonBlockAlignment[] = ['left', 'right', 'center', 'justify'];
+
+export type SerializedCommonBlockNode = Spread<{
+ id: string;
+ alignment: CommonBlockAlignment;
+}, SerializedElementNode>
+
+export interface NodeHasAlignment {
+ readonly __alignment: CommonBlockAlignment;
+ setAlignment(alignment: CommonBlockAlignment): void;
+ getAlignment(): CommonBlockAlignment;
+}
+
+export interface NodeHasId {
+ readonly __id: string;
+ setId(id: string): void;
+ getId(): string;
+}
+
+interface CommonBlockInterface extends NodeHasId, NodeHasAlignment {}
+
+export function extractAlignmentFromElement(element: HTMLElement): CommonBlockAlignment {
+ const textAlignStyle: string = element.style.textAlign || '';
+ if (validAlignments.includes(textAlignStyle as CommonBlockAlignment)) {
+ return textAlignStyle as CommonBlockAlignment;
+ }
+
+ if (element.classList.contains('align-left')) {
+ return 'left';
+ } else if (element.classList.contains('align-right')) {
+ return 'right'
+ } else if (element.classList.contains('align-center')) {
+ return 'center'
+ } else if (element.classList.contains('align-justify')) {
+ return 'justify'
+ }
+
+ return '';
+}
+
+export function setCommonBlockPropsFromElement(element: HTMLElement, node: CommonBlockInterface): void {
+ if (element.id) {
+ node.setId(element.id);
+ }
+
+ node.setAlignment(extractAlignmentFromElement(element));
+}
+
+export function commonPropertiesDifferent(nodeA: CommonBlockInterface, nodeB: CommonBlockInterface): boolean {
+ return nodeA.__id !== nodeB.__id ||
+ nodeA.__alignment !== nodeB.__alignment;
+}
+
+export function updateElementWithCommonBlockProps(element: HTMLElement, node: CommonBlockInterface): void {
+ if (node.__id) {
+ element.setAttribute('id', node.__id);
+ }
+
+ if (node.__alignment) {
+ element.classList.add('align-' + node.__alignment);
+ }
+}
\ No newline at end of file