@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.
Files changed (145) hide show
  1. package/esm/ExtensionBaseKeymap.js +1 -0
  2. package/esm/ExtensionBaseKeymap.js.map +1 -0
  3. package/esm/ExtensionBasicCodeEditor.js +1 -0
  4. package/esm/ExtensionBasicCodeEditor.js.map +1 -0
  5. package/esm/ExtensionBasicEditor.js +1 -0
  6. package/esm/ExtensionBasicEditor.js.map +1 -0
  7. package/esm/ExtensionDropcursor.js +1 -0
  8. package/esm/ExtensionDropcursor.js.map +1 -0
  9. package/esm/ExtensionGapcursor.js +1 -0
  10. package/esm/ExtensionGapcursor.js.map +1 -0
  11. package/esm/ExtensionHistory.js +1 -0
  12. package/esm/ExtensionHistory.js.map +1 -0
  13. package/esm/ExtensionHtml.js +1 -0
  14. package/esm/ExtensionHtml.js.map +1 -0
  15. package/esm/ExtensionMediaUpload.js +1 -0
  16. package/esm/ExtensionMediaUpload.js.map +1 -0
  17. package/esm/ExtensionSelection.js +1 -0
  18. package/esm/ExtensionSelection.js.map +1 -0
  19. package/esm/ExtensionTextAlign.js +1 -0
  20. package/esm/ExtensionTextAlign.js.map +1 -0
  21. package/esm/MarkBookmark.js +1 -0
  22. package/esm/MarkBookmark.js.map +1 -0
  23. package/esm/MarkChange.js +1 -0
  24. package/esm/MarkChange.js.map +1 -0
  25. package/esm/MarkCode.js +1 -0
  26. package/esm/MarkCode.js.map +1 -0
  27. package/esm/MarkHighlight.js +1 -0
  28. package/esm/MarkHighlight.js.map +1 -0
  29. package/esm/MarkItalic.js +1 -0
  30. package/esm/MarkItalic.js.map +1 -0
  31. package/esm/MarkLink.js +1 -0
  32. package/esm/MarkLink.js.map +1 -0
  33. package/esm/MarkStrike.js +1 -0
  34. package/esm/MarkStrike.js.map +1 -0
  35. package/esm/MarkStrong.js +1 -0
  36. package/esm/MarkStrong.js.map +1 -0
  37. package/esm/MarkSubscript.js +1 -0
  38. package/esm/MarkSubscript.js.map +1 -0
  39. package/esm/MarkSuperscript.js +1 -0
  40. package/esm/MarkSuperscript.js.map +1 -0
  41. package/esm/MarkTextColor.js +1 -0
  42. package/esm/MarkTextColor.js.map +1 -0
  43. package/esm/MarkUnderline.js +1 -0
  44. package/esm/MarkUnderline.js.map +1 -0
  45. package/esm/NodeAside.js +1 -0
  46. package/esm/NodeAside.js.map +1 -0
  47. package/esm/NodeBlockquote.js +1 -0
  48. package/esm/NodeBlockquote.js.map +1 -0
  49. package/esm/NodeBookmark.js +1 -0
  50. package/esm/NodeBookmark.js.map +1 -0
  51. package/esm/NodeBulletList.js +1 -0
  52. package/esm/NodeBulletList.js.map +1 -0
  53. package/esm/NodeCodeBlock.js +1 -0
  54. package/esm/NodeCodeBlock.js.map +1 -0
  55. package/esm/NodeDefinitionDesc.js +1 -0
  56. package/esm/NodeDefinitionDesc.js.map +1 -0
  57. package/esm/NodeDefinitionList.js +1 -0
  58. package/esm/NodeDefinitionList.js.map +1 -0
  59. package/esm/NodeDefinitionTerm.js +1 -0
  60. package/esm/NodeDefinitionTerm.js.map +1 -0
  61. package/esm/NodeDocument.js +1 -0
  62. package/esm/NodeDocument.js.map +1 -0
  63. package/esm/NodeDocumentCode.js +1 -0
  64. package/esm/NodeDocumentCode.js.map +1 -0
  65. package/esm/NodeFrontmatter.js +1 -0
  66. package/esm/NodeFrontmatter.js.map +1 -0
  67. package/esm/NodeHardBreak.js +1 -0
  68. package/esm/NodeHardBreak.js.map +1 -0
  69. package/esm/NodeHeading.js +1 -0
  70. package/esm/NodeHeading.js.map +1 -0
  71. package/esm/NodeHorizontalRule.js +1 -0
  72. package/esm/NodeHorizontalRule.js.map +1 -0
  73. package/esm/NodeImage.js +1 -0
  74. package/esm/NodeImage.js.map +1 -0
  75. package/esm/NodeInlineShortCode.js +1 -0
  76. package/esm/NodeInlineShortCode.js.map +1 -0
  77. package/esm/NodeListItem.js +1 -0
  78. package/esm/NodeListItem.js.map +1 -0
  79. package/esm/NodeMath.js +1 -0
  80. package/esm/NodeMath.js.map +1 -0
  81. package/esm/NodeOrderedList.js +1 -0
  82. package/esm/NodeOrderedList.js.map +1 -0
  83. package/esm/NodeParagraph.js +1 -0
  84. package/esm/NodeParagraph.js.map +1 -0
  85. package/esm/NodeTaskItem.js +1 -0
  86. package/esm/NodeTaskItem.js.map +1 -0
  87. package/esm/NodeTaskList.js +1 -0
  88. package/esm/NodeTaskList.js.map +1 -0
  89. package/esm/NodeText.js +1 -0
  90. package/esm/NodeText.js.map +1 -0
  91. package/esm/NodeVideo.js +1 -0
  92. package/esm/NodeVideo.js.map +1 -0
  93. package/esm/remote-selection/ExtensionRemoteSelection.js +1 -0
  94. package/esm/remote-selection/ExtensionRemoteSelection.js.map +1 -0
  95. package/esm/remote-selection/remoteSelectionPlugin.js +1 -0
  96. package/esm/remote-selection/remoteSelectionPlugin.js.map +1 -0
  97. package/package.json +6 -2
  98. package/src/ExtensionBaseKeymap.ts +64 -0
  99. package/src/ExtensionBasicCodeEditor.ts +82 -0
  100. package/src/ExtensionBasicEditor.ts +97 -0
  101. package/src/ExtensionDropcursor.ts +221 -0
  102. package/src/ExtensionGapcursor.ts +278 -0
  103. package/src/ExtensionHistory.ts +48 -0
  104. package/src/ExtensionHtml.ts +158 -0
  105. package/src/ExtensionMediaUpload.ts +258 -0
  106. package/src/ExtensionSelection.ts +379 -0
  107. package/src/ExtensionTextAlign.ts +50 -0
  108. package/src/MarkBookmark.ts +20 -0
  109. package/src/MarkChange.ts +17 -0
  110. package/src/MarkCode.ts +35 -0
  111. package/src/MarkHighlight.ts +38 -0
  112. package/src/MarkItalic.ts +41 -0
  113. package/src/MarkLink.ts +32 -0
  114. package/src/MarkStrike.ts +38 -0
  115. package/src/MarkStrong.ts +52 -0
  116. package/src/MarkSubscript.ts +42 -0
  117. package/src/MarkSuperscript.ts +42 -0
  118. package/src/MarkTextColor.ts +29 -0
  119. package/src/MarkUnderline.ts +47 -0
  120. package/src/NodeAside.ts +19 -0
  121. package/src/NodeBlockquote.ts +51 -0
  122. package/src/NodeBookmark.ts +23 -0
  123. package/src/NodeBulletList.ts +51 -0
  124. package/src/NodeCodeBlock.ts +60 -0
  125. package/src/NodeDefinitionDesc.ts +19 -0
  126. package/src/NodeDefinitionList.ts +46 -0
  127. package/src/NodeDefinitionTerm.ts +19 -0
  128. package/src/NodeDocument.ts +22 -0
  129. package/src/NodeDocumentCode.ts +33 -0
  130. package/src/NodeFrontmatter.ts +19 -0
  131. package/src/NodeHardBreak.ts +92 -0
  132. package/src/NodeHeading.ts +76 -0
  133. package/src/NodeHorizontalRule.ts +43 -0
  134. package/src/NodeImage.ts +36 -0
  135. package/src/NodeInlineShortCode.ts +55 -0
  136. package/src/NodeListItem.ts +320 -0
  137. package/src/NodeMath.ts +109 -0
  138. package/src/NodeOrderedList.ts +79 -0
  139. package/src/NodeParagraph.ts +60 -0
  140. package/src/NodeTaskItem.ts +190 -0
  141. package/src/NodeTaskList.ts +38 -0
  142. package/src/NodeText.ts +12 -0
  143. package/src/NodeVideo.ts +44 -0
  144. package/src/remote-selection/ExtensionRemoteSelection.ts +45 -0
  145. 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
+ }
@@ -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
+ }