]> BookStack Code Mirror - bookstack/blob - resources/js/wysiwyg/nodes/details.ts
a18c4d858d50bad053733e1819e8d04b35746743
[bookstack] / resources / js / wysiwyg / nodes / details.ts
1 import {
2     DOMConversion,
3     DOMConversionMap, DOMConversionOutput,
4     ElementNode,
5     LexicalEditor,
6     LexicalNode,
7     SerializedElementNode,
8 } from 'lexical';
9 import type {EditorConfig} from "lexical/LexicalEditor";
10 import {el} from "../helpers";
11
12 export class DetailsNode extends ElementNode {
13
14     static getType() {
15         return 'details';
16     }
17
18     static clone(node: DetailsNode) {
19         return new DetailsNode(node.__key);
20     }
21
22     createDOM(_config: EditorConfig, _editor: LexicalEditor) {
23         return el('details');
24     }
25
26     updateDOM(prevNode: DetailsNode, dom: HTMLElement) {
27         return false;
28     }
29
30     static importDOM(): DOMConversionMap|null {
31         return {
32             details(node: HTMLElement): DOMConversion|null {
33                 return {
34                     conversion: (element: HTMLElement): DOMConversionOutput|null => {
35                         return {
36                             node: new DetailsNode(),
37                         };
38                     },
39                     priority: 3,
40                 };
41             },
42         };
43     }
44
45     exportJSON(): SerializedElementNode {
46         return {
47             ...super.exportJSON(),
48             type: 'details',
49             version: 1,
50         };
51     }
52
53     static importJSON(serializedNode: SerializedElementNode): DetailsNode {
54         return $createDetailsNode();
55     }
56
57 }
58
59 export function $createDetailsNode() {
60     return new DetailsNode();
61 }
62
63 export function $isDetailsNode(node: LexicalNode | null | undefined) {
64     return node instanceof DetailsNode;
65 }
66
67 export class SummaryNode extends ElementNode {
68
69     static getType() {
70         return 'summary';
71     }
72
73     static clone(node: SummaryNode) {
74         return new SummaryNode(node.__key);
75     }
76
77     createDOM(_config: EditorConfig, _editor: LexicalEditor) {
78         return el('summary');
79     }
80
81     updateDOM(prevNode: DetailsNode, dom: HTMLElement) {
82         return false;
83     }
84
85     static importDOM(): DOMConversionMap|null {
86         return {
87             summary(node: HTMLElement): DOMConversion|null {
88                 return {
89                     conversion: (element: HTMLElement): DOMConversionOutput|null => {
90                         return {
91                             node: new SummaryNode(),
92                         };
93                     },
94                     priority: 3,
95                 };
96             },
97         };
98     }
99
100     exportJSON(): SerializedElementNode {
101         return {
102             ...super.exportJSON(),
103             type: 'summary',
104             version: 1,
105         };
106     }
107
108     static importJSON(serializedNode: SerializedElementNode): DetailsNode {
109         return $createSummaryNode();
110     }
111
112 }
113
114 export function $createSummaryNode() {
115     return new SummaryNode();
116 }
117
118 export function $isSummaryNode(node: LexicalNode | null | undefined) {
119     return node instanceof SummaryNode;
120 }