@kerebron/extension-basic-editor 0.4.28 → 0.4.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/ExtensionBaseKeymap.js +1 -0
- package/esm/ExtensionBaseKeymap.js.map +1 -0
- package/esm/ExtensionBasicCodeEditor.js +1 -0
- package/esm/ExtensionBasicCodeEditor.js.map +1 -0
- package/esm/ExtensionBasicEditor.js +1 -0
- package/esm/ExtensionBasicEditor.js.map +1 -0
- package/esm/ExtensionDropcursor.js +1 -0
- package/esm/ExtensionDropcursor.js.map +1 -0
- package/esm/ExtensionGapcursor.js +1 -0
- package/esm/ExtensionGapcursor.js.map +1 -0
- package/esm/ExtensionHistory.js +1 -0
- package/esm/ExtensionHistory.js.map +1 -0
- package/esm/ExtensionHtml.js +1 -0
- package/esm/ExtensionHtml.js.map +1 -0
- package/esm/ExtensionMediaUpload.js +1 -0
- package/esm/ExtensionMediaUpload.js.map +1 -0
- package/esm/ExtensionSelection.js +1 -0
- package/esm/ExtensionSelection.js.map +1 -0
- package/esm/ExtensionTextAlign.js +1 -0
- package/esm/ExtensionTextAlign.js.map +1 -0
- package/esm/MarkBookmark.js +1 -0
- package/esm/MarkBookmark.js.map +1 -0
- package/esm/MarkChange.js +1 -0
- package/esm/MarkChange.js.map +1 -0
- package/esm/MarkCode.js +1 -0
- package/esm/MarkCode.js.map +1 -0
- package/esm/MarkHighlight.js +1 -0
- package/esm/MarkHighlight.js.map +1 -0
- package/esm/MarkItalic.js +1 -0
- package/esm/MarkItalic.js.map +1 -0
- package/esm/MarkLink.js +1 -0
- package/esm/MarkLink.js.map +1 -0
- package/esm/MarkStrike.js +1 -0
- package/esm/MarkStrike.js.map +1 -0
- package/esm/MarkStrong.js +1 -0
- package/esm/MarkStrong.js.map +1 -0
- package/esm/MarkSubscript.js +1 -0
- package/esm/MarkSubscript.js.map +1 -0
- package/esm/MarkSuperscript.js +1 -0
- package/esm/MarkSuperscript.js.map +1 -0
- package/esm/MarkTextColor.js +1 -0
- package/esm/MarkTextColor.js.map +1 -0
- package/esm/MarkUnderline.js +1 -0
- package/esm/MarkUnderline.js.map +1 -0
- package/esm/NodeAside.js +1 -0
- package/esm/NodeAside.js.map +1 -0
- package/esm/NodeBlockquote.js +1 -0
- package/esm/NodeBlockquote.js.map +1 -0
- package/esm/NodeBookmark.js +1 -0
- package/esm/NodeBookmark.js.map +1 -0
- package/esm/NodeBulletList.js +1 -0
- package/esm/NodeBulletList.js.map +1 -0
- package/esm/NodeCodeBlock.js +1 -0
- package/esm/NodeCodeBlock.js.map +1 -0
- package/esm/NodeDefinitionDesc.js +1 -0
- package/esm/NodeDefinitionDesc.js.map +1 -0
- package/esm/NodeDefinitionList.js +1 -0
- package/esm/NodeDefinitionList.js.map +1 -0
- package/esm/NodeDefinitionTerm.js +1 -0
- package/esm/NodeDefinitionTerm.js.map +1 -0
- package/esm/NodeDocument.js +1 -0
- package/esm/NodeDocument.js.map +1 -0
- package/esm/NodeDocumentCode.js +1 -0
- package/esm/NodeDocumentCode.js.map +1 -0
- package/esm/NodeFrontmatter.js +1 -0
- package/esm/NodeFrontmatter.js.map +1 -0
- package/esm/NodeHardBreak.js +1 -0
- package/esm/NodeHardBreak.js.map +1 -0
- package/esm/NodeHeading.js +1 -0
- package/esm/NodeHeading.js.map +1 -0
- package/esm/NodeHorizontalRule.js +1 -0
- package/esm/NodeHorizontalRule.js.map +1 -0
- package/esm/NodeImage.js +1 -0
- package/esm/NodeImage.js.map +1 -0
- package/esm/NodeInlineShortCode.js +1 -0
- package/esm/NodeInlineShortCode.js.map +1 -0
- package/esm/NodeListItem.js +1 -0
- package/esm/NodeListItem.js.map +1 -0
- package/esm/NodeMath.js +1 -0
- package/esm/NodeMath.js.map +1 -0
- package/esm/NodeOrderedList.js +1 -0
- package/esm/NodeOrderedList.js.map +1 -0
- package/esm/NodeParagraph.js +1 -0
- package/esm/NodeParagraph.js.map +1 -0
- package/esm/NodeTaskItem.js +1 -0
- package/esm/NodeTaskItem.js.map +1 -0
- package/esm/NodeTaskList.js +1 -0
- package/esm/NodeTaskList.js.map +1 -0
- package/esm/NodeText.js +1 -0
- package/esm/NodeText.js.map +1 -0
- package/esm/NodeVideo.js +1 -0
- package/esm/NodeVideo.js.map +1 -0
- package/esm/remote-selection/ExtensionRemoteSelection.js +1 -0
- package/esm/remote-selection/ExtensionRemoteSelection.js.map +1 -0
- package/esm/remote-selection/remoteSelectionPlugin.js +1 -0
- package/esm/remote-selection/remoteSelectionPlugin.js.map +1 -0
- package/package.json +6 -2
- package/src/ExtensionBaseKeymap.ts +64 -0
- package/src/ExtensionBasicCodeEditor.ts +82 -0
- package/src/ExtensionBasicEditor.ts +97 -0
- package/src/ExtensionDropcursor.ts +221 -0
- package/src/ExtensionGapcursor.ts +278 -0
- package/src/ExtensionHistory.ts +48 -0
- package/src/ExtensionHtml.ts +158 -0
- package/src/ExtensionMediaUpload.ts +258 -0
- package/src/ExtensionSelection.ts +379 -0
- package/src/ExtensionTextAlign.ts +50 -0
- package/src/MarkBookmark.ts +20 -0
- package/src/MarkChange.ts +17 -0
- package/src/MarkCode.ts +35 -0
- package/src/MarkHighlight.ts +38 -0
- package/src/MarkItalic.ts +41 -0
- package/src/MarkLink.ts +32 -0
- package/src/MarkStrike.ts +38 -0
- package/src/MarkStrong.ts +52 -0
- package/src/MarkSubscript.ts +42 -0
- package/src/MarkSuperscript.ts +42 -0
- package/src/MarkTextColor.ts +29 -0
- package/src/MarkUnderline.ts +47 -0
- package/src/NodeAside.ts +19 -0
- package/src/NodeBlockquote.ts +51 -0
- package/src/NodeBookmark.ts +23 -0
- package/src/NodeBulletList.ts +51 -0
- package/src/NodeCodeBlock.ts +60 -0
- package/src/NodeDefinitionDesc.ts +19 -0
- package/src/NodeDefinitionList.ts +46 -0
- package/src/NodeDefinitionTerm.ts +19 -0
- package/src/NodeDocument.ts +22 -0
- package/src/NodeDocumentCode.ts +33 -0
- package/src/NodeFrontmatter.ts +19 -0
- package/src/NodeHardBreak.ts +92 -0
- package/src/NodeHeading.ts +76 -0
- package/src/NodeHorizontalRule.ts +43 -0
- package/src/NodeImage.ts +36 -0
- package/src/NodeInlineShortCode.ts +55 -0
- package/src/NodeListItem.ts +320 -0
- package/src/NodeMath.ts +109 -0
- package/src/NodeOrderedList.ts +79 -0
- package/src/NodeParagraph.ts +60 -0
- package/src/NodeTaskItem.ts +190 -0
- package/src/NodeTaskList.ts +38 -0
- package/src/NodeText.ts +12 -0
- package/src/NodeVideo.ts +44 -0
- package/src/remote-selection/ExtensionRemoteSelection.ts +45 -0
- package/src/remote-selection/remoteSelectionPlugin.ts +157 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { NodeSpec } from 'prosemirror-model';
|
|
2
|
+
import { Node } from '@kerebron/editor';
|
|
3
|
+
|
|
4
|
+
export class NodeDefinitionTerm extends Node {
|
|
5
|
+
override name = 'dt';
|
|
6
|
+
requires = ['dl'];
|
|
7
|
+
|
|
8
|
+
override getNodeSpec(): NodeSpec {
|
|
9
|
+
return {
|
|
10
|
+
content: 'inline*',
|
|
11
|
+
group: 'block',
|
|
12
|
+
parseDOM: [{ tag: 'dt' }],
|
|
13
|
+
defining: true,
|
|
14
|
+
toDOM() {
|
|
15
|
+
return ['dt', 0];
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { NodeSpec, SchemaSpec } from 'prosemirror-model';
|
|
2
|
+
import { Node } from '@kerebron/editor';
|
|
3
|
+
|
|
4
|
+
export class NodeDocument extends Node {
|
|
5
|
+
override name = 'doc';
|
|
6
|
+
|
|
7
|
+
override getNodeSpec(): NodeSpec {
|
|
8
|
+
return {
|
|
9
|
+
content: 'block+',
|
|
10
|
+
marks: 'code em strong link bookmark', // TODO: why is it necessary for convertCodeParagraphsToCodeBlocks?
|
|
11
|
+
EMPTY_DOC: {
|
|
12
|
+
'type': this.name,
|
|
13
|
+
'content': [
|
|
14
|
+
{
|
|
15
|
+
'type': 'paragraph',
|
|
16
|
+
'content': [],
|
|
17
|
+
},
|
|
18
|
+
],
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { NodeSpec } from 'prosemirror-model';
|
|
2
|
+
|
|
3
|
+
import { Node } from '@kerebron/editor';
|
|
4
|
+
|
|
5
|
+
export class NodeDocumentCode extends Node {
|
|
6
|
+
override name = 'doc_code';
|
|
7
|
+
|
|
8
|
+
override getNodeSpec(): NodeSpec {
|
|
9
|
+
return {
|
|
10
|
+
content: 'code_block',
|
|
11
|
+
defaultAttrs: {
|
|
12
|
+
'lang': this.config.lang || null,
|
|
13
|
+
},
|
|
14
|
+
EMPTY_DOC: {
|
|
15
|
+
'type': this.name,
|
|
16
|
+
'content': [
|
|
17
|
+
{
|
|
18
|
+
'type': 'code_block',
|
|
19
|
+
'attrs': {
|
|
20
|
+
'lang': this.config.lang || null,
|
|
21
|
+
},
|
|
22
|
+
'content': [
|
|
23
|
+
// {
|
|
24
|
+
// "type": "text",
|
|
25
|
+
// "text": ""
|
|
26
|
+
// }
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { NodeSpec, NodeType } from 'prosemirror-model';
|
|
2
|
+
import { Node } from '@kerebron/editor';
|
|
3
|
+
|
|
4
|
+
export class NodeFrontmatter extends Node {
|
|
5
|
+
override name = 'frontmatter';
|
|
6
|
+
requires = ['doc'];
|
|
7
|
+
|
|
8
|
+
override getNodeSpec(): NodeSpec {
|
|
9
|
+
return {
|
|
10
|
+
content: 'inline*',
|
|
11
|
+
group: 'block',
|
|
12
|
+
defining: true,
|
|
13
|
+
parseDOM: [{ tag: 'pre' }],
|
|
14
|
+
toDOM() {
|
|
15
|
+
return ['pre', 0];
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { NodeSpec, NodeType } from 'prosemirror-model';
|
|
2
|
+
import { type CoreEditor, Node } from '@kerebron/editor';
|
|
3
|
+
import {
|
|
4
|
+
type CommandFactories,
|
|
5
|
+
type CommandShortcuts,
|
|
6
|
+
} from '@kerebron/editor/commands';
|
|
7
|
+
import { firstCommand } from '@kerebron/editor/commands';
|
|
8
|
+
|
|
9
|
+
export class NodeHardBreak extends Node {
|
|
10
|
+
override name = 'br';
|
|
11
|
+
requires = ['doc'];
|
|
12
|
+
|
|
13
|
+
options = {
|
|
14
|
+
keepMarks: true,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
override getNodeSpec(): NodeSpec {
|
|
18
|
+
return {
|
|
19
|
+
inline: true,
|
|
20
|
+
group: 'inline',
|
|
21
|
+
selectable: false,
|
|
22
|
+
linebreakReplacement: true,
|
|
23
|
+
parseDOM: [{ tag: 'br' }],
|
|
24
|
+
toDOM() {
|
|
25
|
+
return ['br'];
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
override getCommandFactories(
|
|
31
|
+
editor: CoreEditor,
|
|
32
|
+
type: NodeType,
|
|
33
|
+
): Partial<CommandFactories> {
|
|
34
|
+
// TODO: refactor commands
|
|
35
|
+
// const comm2: Command = (state: EditorState, dispatch?: (tr: Transaction) => void) => {
|
|
36
|
+
// const { selection, storedMarks } = state
|
|
37
|
+
|
|
38
|
+
// if (selection.$from.parent.type.spec.isolating) {
|
|
39
|
+
// return false
|
|
40
|
+
// }
|
|
41
|
+
|
|
42
|
+
// const { keepMarks } = this.options
|
|
43
|
+
// // const { splittableMarks } = editor.extensionManager
|
|
44
|
+
// const splittableMarks = [];
|
|
45
|
+
// const marks = storedMarks
|
|
46
|
+
// || (selection.$to.parentOffset && selection.$from.marks())
|
|
47
|
+
|
|
48
|
+
// return editor.chain()
|
|
49
|
+
// .insertContent({ type: this.name })
|
|
50
|
+
// .command(({ tr, dispatch }) => {
|
|
51
|
+
// if (dispatch && marks && keepMarks) {
|
|
52
|
+
// for (const mark of marks) {
|
|
53
|
+
// console.log('mteset', mark.type);
|
|
54
|
+
// }
|
|
55
|
+
// const filteredMarks = marks
|
|
56
|
+
// .filter(mark => splittableMarks.includes(mark.type.name))
|
|
57
|
+
|
|
58
|
+
// tr.ensureMarks(filteredMarks)
|
|
59
|
+
// }
|
|
60
|
+
|
|
61
|
+
// return true
|
|
62
|
+
// })
|
|
63
|
+
// .run();
|
|
64
|
+
// }
|
|
65
|
+
|
|
66
|
+
const setHardBreak = firstCommand(
|
|
67
|
+
editor.run.exitCode,
|
|
68
|
+
// comm2
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
'setHardBreak': () => setHardBreak,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
override getKeyboardShortcuts(): Partial<CommandShortcuts> {
|
|
77
|
+
// https://stackoverflow.com/a/73619128
|
|
78
|
+
const mac = typeof navigator != 'undefined'
|
|
79
|
+
? /Mac|iP(hone|[oa]d)/.test(navigator?.platform)
|
|
80
|
+
: false;
|
|
81
|
+
|
|
82
|
+
const shortcuts: Partial<CommandShortcuts> = {
|
|
83
|
+
'Ctrl-Enter': 'setHardBreak',
|
|
84
|
+
};
|
|
85
|
+
if (mac) {
|
|
86
|
+
shortcuts['Mod-Enter'] = 'setHardBreak';
|
|
87
|
+
shortcuts['Shift-Enter'] = 'setHardBreak';
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return shortcuts;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { NodeSpec, NodeType } from 'prosemirror-model';
|
|
2
|
+
|
|
3
|
+
import { type CoreEditor, Node } from '@kerebron/editor';
|
|
4
|
+
import {
|
|
5
|
+
type CommandFactories,
|
|
6
|
+
type CommandShortcuts,
|
|
7
|
+
} from '@kerebron/editor/commands';
|
|
8
|
+
import {
|
|
9
|
+
type InputRule,
|
|
10
|
+
textblockTypeInputRule,
|
|
11
|
+
} from '@kerebron/editor/plugins/input-rules';
|
|
12
|
+
|
|
13
|
+
const maxLevel = 6;
|
|
14
|
+
|
|
15
|
+
export class NodeHeading extends Node {
|
|
16
|
+
override name = 'heading';
|
|
17
|
+
requires = ['doc'];
|
|
18
|
+
|
|
19
|
+
override getNodeSpec(): NodeSpec {
|
|
20
|
+
return {
|
|
21
|
+
attrs: { level: { default: 1 } },
|
|
22
|
+
content: 'inline*',
|
|
23
|
+
group: 'block',
|
|
24
|
+
defining: true,
|
|
25
|
+
parseDOM: [
|
|
26
|
+
{ tag: 'h1', attrs: { level: 1 } },
|
|
27
|
+
{ tag: 'h2', attrs: { level: 2 } },
|
|
28
|
+
{ tag: 'h3', attrs: { level: 3 } },
|
|
29
|
+
{ tag: 'h4', attrs: { level: 4 } },
|
|
30
|
+
{ tag: 'h5', attrs: { level: 5 } },
|
|
31
|
+
{ tag: 'h6', attrs: { level: 6 } },
|
|
32
|
+
],
|
|
33
|
+
toDOM(node) {
|
|
34
|
+
return ['h' + node.attrs.level, 0];
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
override getInputRules(type: NodeType): InputRule[] {
|
|
40
|
+
/// Given a node type and a maximum level, creates an input rule that
|
|
41
|
+
/// turns up to that number of `#` characters followed by a space at
|
|
42
|
+
/// the start of a textblock into a heading whose level corresponds to
|
|
43
|
+
/// the number of `#` signs.
|
|
44
|
+
return [
|
|
45
|
+
textblockTypeInputRule(
|
|
46
|
+
new RegExp('^(#{1,' + maxLevel + '})\\s$'),
|
|
47
|
+
type,
|
|
48
|
+
(match) => ({ level: match[1].length }),
|
|
49
|
+
),
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
override getCommandFactories(
|
|
54
|
+
editor: CoreEditor,
|
|
55
|
+
type: NodeType,
|
|
56
|
+
): Partial<CommandFactories> {
|
|
57
|
+
const commands: Partial<CommandFactories> = {};
|
|
58
|
+
|
|
59
|
+
for (let i = 1; i <= maxLevel; i++) {
|
|
60
|
+
commands['setHeading' + i] = () =>
|
|
61
|
+
editor.commandFactories.setBlockType(type, { level: i });
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return commands;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
override getKeyboardShortcuts(): Partial<CommandShortcuts> {
|
|
68
|
+
const keys: Partial<CommandShortcuts> = {};
|
|
69
|
+
|
|
70
|
+
for (let i = 1; i <= maxLevel; i++) {
|
|
71
|
+
keys['Shift-Ctrl-' + i] = 'setHeading' + i;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return keys;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { NodeSpec, NodeType } from 'prosemirror-model';
|
|
2
|
+
import { type CoreEditor, Node } from '@kerebron/editor';
|
|
3
|
+
import type {
|
|
4
|
+
CommandFactories,
|
|
5
|
+
CommandShortcuts,
|
|
6
|
+
} from '@kerebron/editor/commands';
|
|
7
|
+
|
|
8
|
+
export class NodeHorizontalRule extends Node {
|
|
9
|
+
override name = 'hr';
|
|
10
|
+
requires = ['doc'];
|
|
11
|
+
|
|
12
|
+
override getNodeSpec(): NodeSpec {
|
|
13
|
+
return {
|
|
14
|
+
group: 'block',
|
|
15
|
+
parseDOM: [{ tag: 'hr' }],
|
|
16
|
+
toDOM() {
|
|
17
|
+
return ['hr'];
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
override getCommandFactories(
|
|
23
|
+
editor: CoreEditor,
|
|
24
|
+
type: NodeType,
|
|
25
|
+
): Partial<CommandFactories> {
|
|
26
|
+
return {
|
|
27
|
+
'setHorizontalRule': () => (state, dispatch) => {
|
|
28
|
+
if (dispatch) {
|
|
29
|
+
dispatch(
|
|
30
|
+
state.tr.replaceSelectionWith(type.create()).scrollIntoView(),
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
return true;
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
override getKeyboardShortcuts(): Partial<CommandShortcuts> {
|
|
39
|
+
return {
|
|
40
|
+
'Mod-_': 'setHorizontalRule',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
package/src/NodeImage.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type NodeSpec } from 'prosemirror-model';
|
|
2
|
+
import { Node } from '@kerebron/editor';
|
|
3
|
+
|
|
4
|
+
export class NodeImage extends Node {
|
|
5
|
+
override name = 'image';
|
|
6
|
+
requires = ['doc'];
|
|
7
|
+
|
|
8
|
+
override getNodeSpec(): NodeSpec {
|
|
9
|
+
return {
|
|
10
|
+
inline: true,
|
|
11
|
+
attrs: {
|
|
12
|
+
src: {},
|
|
13
|
+
alt: { default: null },
|
|
14
|
+
title: { default: null },
|
|
15
|
+
},
|
|
16
|
+
group: 'inline',
|
|
17
|
+
draggable: true,
|
|
18
|
+
parseDOM: [
|
|
19
|
+
{
|
|
20
|
+
tag: 'img[src]',
|
|
21
|
+
getAttrs(dom: HTMLElement) {
|
|
22
|
+
return {
|
|
23
|
+
src: dom.getAttribute('src'),
|
|
24
|
+
title: dom.getAttribute('title'),
|
|
25
|
+
alt: dom.getAttribute('alt'),
|
|
26
|
+
};
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
toDOM(node) {
|
|
31
|
+
const { src, alt, title } = node.attrs;
|
|
32
|
+
return ['img', { src, alt, title }];
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Node as PmNode, NodeSpec, NodeType } from 'prosemirror-model';
|
|
2
|
+
import { Node } from '@kerebron/editor';
|
|
3
|
+
import {
|
|
4
|
+
type InputRule,
|
|
5
|
+
replaceInlineNode,
|
|
6
|
+
textblockTypeInputRule,
|
|
7
|
+
wrappingInputRule,
|
|
8
|
+
} from '@kerebron/editor/plugins/input-rules';
|
|
9
|
+
|
|
10
|
+
export function fixCharacters(text: string) {
|
|
11
|
+
return text
|
|
12
|
+
.replace(/’/g, "'")
|
|
13
|
+
.replace(/“/g, '"')
|
|
14
|
+
.replace(/”/g, '"')
|
|
15
|
+
// deno-lint-ignore no-control-regex
|
|
16
|
+
.replace(/\x0b/g, ' ')
|
|
17
|
+
.replace(/\u201d/g, '"')
|
|
18
|
+
.replace(/\u201c/g, '"');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export class NodeInlineShortCode extends Node {
|
|
22
|
+
override name = 'shortcode-inline';
|
|
23
|
+
requires = ['doc'];
|
|
24
|
+
|
|
25
|
+
override getNodeSpec(): NodeSpec {
|
|
26
|
+
return {
|
|
27
|
+
inline: true,
|
|
28
|
+
group: 'inline',
|
|
29
|
+
selectable: true,
|
|
30
|
+
attrs: {
|
|
31
|
+
content: {},
|
|
32
|
+
},
|
|
33
|
+
atom: true,
|
|
34
|
+
parseDOM: [{ tag: 'span.kb-shortcode-inline' }],
|
|
35
|
+
toDOM(node) {
|
|
36
|
+
return ['span', { class: 'kb-shortcode-inline' }, node.attrs.content];
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
override getInputRules(type: NodeType): InputRule[] {
|
|
42
|
+
return [
|
|
43
|
+
replaceInlineNode(
|
|
44
|
+
/\{\{[^}]+\}\}/,
|
|
45
|
+
type,
|
|
46
|
+
(match: RegExpMatchArray) => {
|
|
47
|
+
const content = fixCharacters(
|
|
48
|
+
match[0].substring(2, match[0].length - 2),
|
|
49
|
+
);
|
|
50
|
+
return { content };
|
|
51
|
+
},
|
|
52
|
+
),
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
}
|