1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
import { Node, mergeAttributes } from '@tiptap/core';
export default Node.create({
name: 'descriptionItem',
content: 'block+',
defining: true,
addOptions() {
return {
HTMLAttributes: {
dir: 'auto',
},
};
},
addAttributes() {
return {
isTerm: {
default: true,
parseHTML: (element) => element.tagName.toLowerCase() === 'dt',
},
};
},
parseHTML() {
return [{ tag: 'dt' }, { tag: 'dd' }];
},
renderHTML({ HTMLAttributes: { isTerm, ...HTMLAttributes } }) {
return [
'li',
mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
class: isTerm ? 'dl-term' : 'dl-description',
}),
0,
];
},
addKeyboardShortcuts() {
return {
Enter: () => {
if (!this.editor.isActive('descriptionItem')) return false;
return this.editor.commands.splitListItem('descriptionItem');
},
Tab: () => {
if (!this.editor.isActive('descriptionItem')) return false;
const { isTerm } = this.editor.getAttributes('descriptionItem');
if (isTerm)
return this.editor.commands.updateAttributes('descriptionItem', { isTerm: !isTerm });
return false;
},
'Shift-Tab': () => {
if (!this.editor.isActive('descriptionItem')) return false;
const { isTerm } = this.editor.getAttributes('descriptionItem');
if (isTerm) return this.editor.commands.liftListItem('descriptionItem');
return this.editor.commands.updateAttributes('descriptionItem', { isTerm: true });
},
};
},
});
|