@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,17 @@
1
+ import { MarkSpec } from 'prosemirror-model';
2
+
3
+ import { Mark } from '@kerebron/editor';
4
+
5
+ export class MarkChange extends Mark {
6
+ override name = 'change';
7
+ requires = ['doc'];
8
+
9
+ override getMarkSpec(): MarkSpec {
10
+ return {
11
+ parseDOM: [],
12
+ toDOM() {
13
+ return ['change', 0];
14
+ },
15
+ };
16
+ }
17
+ }
@@ -0,0 +1,35 @@
1
+ import type { MarkSpec, MarkType } from 'prosemirror-model';
2
+ import { type CoreEditor, Mark } from '@kerebron/editor';
3
+ import {
4
+ type CommandFactories,
5
+ type CommandShortcuts,
6
+ } from '@kerebron/editor/commands';
7
+
8
+ export class MarkCode extends Mark {
9
+ override name = 'code';
10
+ requires = ['doc'];
11
+
12
+ override getMarkSpec(): MarkSpec {
13
+ return {
14
+ parseDOM: [{ tag: 'code' }],
15
+ toDOM() {
16
+ return ['code', 0];
17
+ },
18
+ };
19
+ }
20
+
21
+ override getCommandFactories(
22
+ editor: CoreEditor,
23
+ type: MarkType,
24
+ ): Partial<CommandFactories> {
25
+ return {
26
+ 'toggleCode': () => editor.commandFactories.toggleMark(type),
27
+ };
28
+ }
29
+
30
+ override getKeyboardShortcuts(): Partial<CommandShortcuts> {
31
+ return {
32
+ 'Mod-`': 'toggleCode',
33
+ };
34
+ }
35
+ }
@@ -0,0 +1,38 @@
1
+ import { type MarkSpec } from 'prosemirror-model';
2
+ import { Mark } from '@kerebron/editor';
3
+
4
+ /** Mark for text highlight (background color) */
5
+ export class MarkHighlight extends Mark {
6
+ override name = 'highlight';
7
+
8
+ override getMarkSpec(): MarkSpec {
9
+ return {
10
+ attrs: {
11
+ color: { default: null },
12
+ },
13
+ parseDOM: [
14
+ {
15
+ tag: 'mark',
16
+ getAttrs(dom: HTMLElement) {
17
+ const color = dom.style.backgroundColor;
18
+ return color ? { color } : { color: 'yellow' };
19
+ },
20
+ },
21
+ {
22
+ tag: 'span[style*="background-color"]',
23
+ getAttrs(dom: HTMLElement) {
24
+ const color = dom.style.backgroundColor;
25
+ return color ? { color } : false;
26
+ },
27
+ },
28
+ ],
29
+ toDOM(mark) {
30
+ const { color } = mark.attrs;
31
+ const bgColor = color || 'yellow';
32
+ return ['mark', {
33
+ style: `background-color: ${bgColor}; color: inherit;`,
34
+ }, 0];
35
+ },
36
+ };
37
+ }
38
+ }
@@ -0,0 +1,41 @@
1
+ import { type CoreEditor, Mark } from '@kerebron/editor';
2
+ import {
3
+ type CommandFactories,
4
+ type CommandShortcuts,
5
+ } from '@kerebron/editor/commands';
6
+ import type { MarkSpec, MarkType } from 'prosemirror-model';
7
+
8
+ export class MarkItalic extends Mark {
9
+ override name = 'em';
10
+ requires = ['doc'];
11
+
12
+ override getMarkSpec(): MarkSpec {
13
+ return {
14
+ parseDOM: [
15
+ { tag: 'i' },
16
+ { tag: 'em' },
17
+ { style: 'font-assets=italic' },
18
+ { style: 'font-assets=normal', clearMark: (m) => m.type.name == 'em' },
19
+ ],
20
+ toDOM() {
21
+ return ['em', 0];
22
+ },
23
+ };
24
+ }
25
+
26
+ override getCommandFactories(
27
+ editor: CoreEditor,
28
+ type: MarkType,
29
+ ): Partial<CommandFactories> {
30
+ return {
31
+ 'toggleItalic': () => editor.commandFactories.toggleMark(type),
32
+ };
33
+ }
34
+
35
+ override getKeyboardShortcuts(): Partial<CommandShortcuts> {
36
+ return {
37
+ 'Mod-i': 'toggleItalic',
38
+ 'Mod-I': 'toggleItalic',
39
+ };
40
+ }
41
+ }
@@ -0,0 +1,32 @@
1
+ import { Mark as PmMark, MarkSpec } from 'prosemirror-model';
2
+ import { Mark } from '@kerebron/editor';
3
+
4
+ export class MarkLink extends Mark {
5
+ override name = 'link';
6
+ requires = ['doc'];
7
+
8
+ override getMarkSpec(): MarkSpec {
9
+ return {
10
+ attrs: {
11
+ href: {},
12
+ title: { default: null },
13
+ },
14
+ inclusive: false,
15
+ parseDOM: [
16
+ {
17
+ tag: 'a[href]',
18
+ getAttrs(dom: HTMLElement) {
19
+ return {
20
+ href: dom.getAttribute('href'),
21
+ title: dom.getAttribute('title'),
22
+ };
23
+ },
24
+ },
25
+ ],
26
+ toDOM(node) {
27
+ const { href, title } = node.attrs;
28
+ return ['a', { href, title }, 0];
29
+ },
30
+ };
31
+ }
32
+ }
@@ -0,0 +1,38 @@
1
+ import { type CoreEditor, Mark } from '@kerebron/editor';
2
+ import type { MarkSpec, MarkType } from 'prosemirror-model';
3
+ import {
4
+ type CommandFactories,
5
+ type CommandShortcuts,
6
+ } from '@kerebron/editor/commands';
7
+
8
+ export class MarkStrike extends Mark {
9
+ override name = 'strike';
10
+ requires = ['doc'];
11
+
12
+ override getMarkSpec(): MarkSpec {
13
+ return {
14
+ parseDOM: [
15
+ { tag: 'strike' },
16
+ ],
17
+ toDOM() {
18
+ return ['strike', 0];
19
+ },
20
+ };
21
+ }
22
+
23
+ override getCommandFactories(
24
+ editor: CoreEditor,
25
+ type: MarkType,
26
+ ): Partial<CommandFactories> {
27
+ return {
28
+ 'toggleStrike': () => editor.commandFactories.toggleMark(type),
29
+ };
30
+ }
31
+
32
+ override getKeyboardShortcuts(): Partial<CommandShortcuts> {
33
+ return {
34
+ 'Mod-s': 'toggleStrike',
35
+ 'Mod-S': 'toggleStrike',
36
+ };
37
+ }
38
+ }
@@ -0,0 +1,52 @@
1
+ import { type CoreEditor, Mark } from '@kerebron/editor';
2
+ import {
3
+ type CommandFactories,
4
+ type CommandShortcuts,
5
+ } from '@kerebron/editor/commands';
6
+ import { MarkSpec, type MarkType } from 'prosemirror-model';
7
+
8
+ export class MarkStrong extends Mark {
9
+ override name = 'strong';
10
+ requires = ['doc'];
11
+
12
+ override getMarkSpec(): MarkSpec {
13
+ return {
14
+ parseDOM: [
15
+ { tag: 'strong' },
16
+ // This works around a Google Docs misbehavior where
17
+ // pasted content will be inexplicably wrapped in `<b>`
18
+ // tags with a font-weight normal.
19
+ {
20
+ tag: 'b',
21
+ getAttrs: (node: HTMLElement) =>
22
+ node.style.fontWeight != 'normal' && null,
23
+ },
24
+ { style: 'font-weight=400', clearMark: (m) => m.type.name == 'strong' },
25
+ {
26
+ style: 'font-weight',
27
+ getAttrs: (value: string) =>
28
+ /^(bold(er)?|[5-9]\d{2,})$/.test(value) && null,
29
+ },
30
+ ],
31
+ toDOM() {
32
+ return ['strong', 0];
33
+ },
34
+ };
35
+ }
36
+
37
+ override getCommandFactories(
38
+ editor: CoreEditor,
39
+ type: MarkType,
40
+ ): Partial<CommandFactories> {
41
+ return {
42
+ 'toggleStrong': () => editor.commandFactories.toggleMark(type),
43
+ };
44
+ }
45
+
46
+ override getKeyboardShortcuts(): Partial<CommandShortcuts> {
47
+ return {
48
+ 'Mod-b': 'toggleStrong',
49
+ 'Mod-B': 'toggleStrong',
50
+ };
51
+ }
52
+ }
@@ -0,0 +1,42 @@
1
+ import { type CoreEditor, Mark } from '@kerebron/editor';
2
+ import type { MarkSpec, MarkType } from 'prosemirror-model';
3
+ import {
4
+ type CommandFactories,
5
+ type CommandShortcuts,
6
+ } from '@kerebron/editor/commands';
7
+
8
+ export class MarkSubscript extends Mark {
9
+ override name = 'subscript';
10
+ requires = ['doc'];
11
+
12
+ override getMarkSpec(): MarkSpec {
13
+ return {
14
+ excludes: 'superscript',
15
+ parseDOM: [
16
+ { tag: 'sub' },
17
+ {
18
+ style: 'vertical-align',
19
+ getAttrs: (value) => value === 'sub' && null,
20
+ },
21
+ ],
22
+ toDOM() {
23
+ return ['sub', 0];
24
+ },
25
+ };
26
+ }
27
+
28
+ override getCommandFactories(
29
+ editor: CoreEditor,
30
+ type: MarkType,
31
+ ): Partial<CommandFactories> {
32
+ return {
33
+ 'toggleSubscript': () => editor.commandFactories.toggleMark(type),
34
+ };
35
+ }
36
+
37
+ override getKeyboardShortcuts(): Partial<CommandShortcuts> {
38
+ return {
39
+ 'Mod-Shift-,': 'toggleSubscript',
40
+ };
41
+ }
42
+ }
@@ -0,0 +1,42 @@
1
+ import { type CoreEditor, Mark } from '@kerebron/editor';
2
+ import type { MarkSpec, MarkType } from 'prosemirror-model';
3
+ import {
4
+ type CommandFactories,
5
+ type CommandShortcuts,
6
+ } from '@kerebron/editor/commands';
7
+
8
+ export class MarkSuperscript extends Mark {
9
+ override name = 'superscript';
10
+ requires = ['doc'];
11
+
12
+ override getMarkSpec(): MarkSpec {
13
+ return {
14
+ excludes: 'subscript',
15
+ parseDOM: [
16
+ { tag: 'sup' },
17
+ {
18
+ style: 'vertical-align',
19
+ getAttrs: (value) => value === 'super' && null,
20
+ },
21
+ ],
22
+ toDOM() {
23
+ return ['sup', 0];
24
+ },
25
+ };
26
+ }
27
+
28
+ override getCommandFactories(
29
+ editor: CoreEditor,
30
+ type: MarkType,
31
+ ): Partial<CommandFactories> {
32
+ return {
33
+ 'toggleSuperscript': () => editor.commandFactories.toggleMark(type),
34
+ };
35
+ }
36
+
37
+ override getKeyboardShortcuts(): Partial<CommandShortcuts> {
38
+ return {
39
+ 'Mod-Shift-.': 'toggleSuperscript',
40
+ };
41
+ }
42
+ }
@@ -0,0 +1,29 @@
1
+ import { type MarkSpec } from 'prosemirror-model';
2
+ import { Mark } from '@kerebron/editor';
3
+
4
+ /** Mark for text color (foreground color) */
5
+ export class MarkTextColor extends Mark {
6
+ override name = 'textColor';
7
+
8
+ override getMarkSpec(): MarkSpec {
9
+ return {
10
+ attrs: {
11
+ color: { default: null },
12
+ },
13
+ parseDOM: [
14
+ {
15
+ tag: 'span[style*="color"]',
16
+ getAttrs(dom: HTMLElement) {
17
+ const color = dom.style.color;
18
+ return color ? { color } : false;
19
+ },
20
+ },
21
+ ],
22
+ toDOM(mark) {
23
+ const { color } = mark.attrs;
24
+ if (!color) return ['span', 0];
25
+ return ['span', { style: `color: ${color}` }, 0];
26
+ },
27
+ };
28
+ }
29
+ }
@@ -0,0 +1,47 @@
1
+ import { CoreEditor, Mark } from '@kerebron/editor';
2
+ import {
3
+ type CommandFactories,
4
+ type CommandShortcuts,
5
+ } from '@kerebron/editor/commands';
6
+ import type { MarkSpec, MarkType } from 'prosemirror-model';
7
+
8
+ export class MarkUnderline extends Mark {
9
+ override name = 'underline';
10
+ requires = ['doc'];
11
+
12
+ override getMarkSpec(): MarkSpec {
13
+ return {
14
+ parseDOM: [
15
+ {
16
+ tag: 'u',
17
+ },
18
+ {
19
+ style: 'text-decoration',
20
+ consuming: false,
21
+ getAttrs: (
22
+ style,
23
+ ) => ((style as string).includes('underline') ? {} : false),
24
+ },
25
+ ],
26
+ toDOM() {
27
+ return ['u', 0];
28
+ },
29
+ };
30
+ }
31
+
32
+ override getCommandFactories(
33
+ editor: CoreEditor,
34
+ type: MarkType,
35
+ ): Partial<CommandFactories> {
36
+ return {
37
+ 'toggleUnderline': () => editor.commandFactories.toggleMark(type),
38
+ };
39
+ }
40
+
41
+ override getKeyboardShortcuts(): Partial<CommandShortcuts> {
42
+ return {
43
+ 'Mod-u': 'toggleUnderline',
44
+ 'Mod-U': 'toggleUnderline',
45
+ };
46
+ }
47
+ }
@@ -0,0 +1,19 @@
1
+ import { NodeSpec } from 'prosemirror-model';
2
+ import { Node } from '@kerebron/editor';
3
+
4
+ export class NodeAside extends Node {
5
+ override name = 'aside';
6
+ requires = ['doc'];
7
+
8
+ override getNodeSpec(): NodeSpec {
9
+ return {
10
+ content: 'block+',
11
+ group: 'block',
12
+ defining: true,
13
+ parseDOM: [{ tag: 'aside' }],
14
+ toDOM() {
15
+ return ['aside', 0];
16
+ },
17
+ };
18
+ }
19
+ }
@@ -0,0 +1,51 @@
1
+ import { 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
+ InputRule,
10
+ wrappingInputRule,
11
+ } from '@kerebron/editor/plugins/input-rules';
12
+
13
+ export class NodeBlockquote extends Node {
14
+ override name = 'blockquote';
15
+ requires = ['doc'];
16
+
17
+ override getNodeSpec(): NodeSpec {
18
+ return {
19
+ content: 'block+',
20
+ group: 'block',
21
+ defining: true,
22
+ parseDOM: [{ tag: 'blockquote' }],
23
+ toDOM() {
24
+ return ['blockquote', 0];
25
+ },
26
+ };
27
+ }
28
+
29
+ override getInputRules(type: NodeType): InputRule[] {
30
+ return [
31
+ /// Given a blockquote node type, returns an input rule that turns `"> "`
32
+ /// at the start of a textblock into a blockquote.
33
+ wrappingInputRule(/^\s*>\s$/, type),
34
+ ];
35
+ }
36
+
37
+ override getCommandFactories(
38
+ editor: CoreEditor,
39
+ type: NodeType,
40
+ ): Partial<CommandFactories> {
41
+ return {
42
+ 'toggleBlockquote': () => editor.commandFactories.wrapInList(type),
43
+ };
44
+ }
45
+
46
+ override getKeyboardShortcuts(): Partial<CommandShortcuts> {
47
+ return {
48
+ 'Ctrl->': 'toggleBlockquote',
49
+ };
50
+ }
51
+ }
@@ -0,0 +1,23 @@
1
+ import { NodeSpec } from 'prosemirror-model';
2
+
3
+ import { Node } from '@kerebron/editor';
4
+
5
+ export class NodeBookmark extends Node {
6
+ override name = 'bookmark-node';
7
+ requires = ['doc'];
8
+
9
+ override getNodeSpec(): NodeSpec {
10
+ return {
11
+ inline: true,
12
+ group: 'inline',
13
+ selectable: false,
14
+ attrs: {
15
+ id: {},
16
+ },
17
+ parseDOM: [],
18
+ toDOM(mark) {
19
+ return ['a', { id: mark.attrs.id }, 0];
20
+ },
21
+ };
22
+ }
23
+ }
@@ -0,0 +1,51 @@
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
+ wrappingInputRule,
11
+ } from '@kerebron/editor/plugins/input-rules';
12
+
13
+ export class NodeBulletList extends Node {
14
+ override name = 'bullet_list';
15
+ requires = ['doc'];
16
+
17
+ override getNodeSpec(): NodeSpec {
18
+ return {
19
+ content: 'list_item+',
20
+ group: 'block',
21
+ parseDOM: [{ tag: 'ul' }],
22
+ toDOM() {
23
+ return ['ul', 0];
24
+ },
25
+ };
26
+ }
27
+
28
+ override getInputRules(type: NodeType): InputRule[] {
29
+ /// Given a list node type, returns an input rule that turns a bullet
30
+ /// (dash, plush, or asterisk) at the start of a textblock into a
31
+ /// bullet list.
32
+ return [
33
+ wrappingInputRule(/^\s*([-+*])\s$/, type),
34
+ ];
35
+ }
36
+
37
+ override getCommandFactories(
38
+ editor: CoreEditor,
39
+ type: NodeType,
40
+ ): Partial<CommandFactories> {
41
+ return {
42
+ 'toggleBulletList': () => editor.commandFactories.wrapInList(type),
43
+ };
44
+ }
45
+
46
+ override getKeyboardShortcuts(): Partial<CommandShortcuts> {
47
+ return {
48
+ 'Shift-Ctrl-8': 'toggleBulletList',
49
+ };
50
+ }
51
+ }
@@ -0,0 +1,60 @@
1
+ import type { NodeSpec, NodeType } from 'prosemirror-model';
2
+ import { Node } from '@kerebron/editor';
3
+ import {
4
+ type InputRule,
5
+ textblockTypeInputRule,
6
+ } from '@kerebron/editor/plugins/input-rules';
7
+
8
+ export class NodeCodeBlock extends Node {
9
+ override name = 'code_block';
10
+
11
+ override getNodeSpec(): NodeSpec {
12
+ // const langs = this.config.languageWhitelist || LANGS;
13
+
14
+ return {
15
+ content: 'text*',
16
+ marks: '',
17
+ group: 'block',
18
+ code: true,
19
+ defining: true,
20
+ parseDOM: [
21
+ {
22
+ tag: 'pre',
23
+ preserveWhitespace: 'full',
24
+ getAttrs(dom: HTMLElement) {
25
+ let lang = dom.getAttribute('lang');
26
+
27
+ // if (!lang) {
28
+ // for (const className of dom.classList) {
29
+ // if (
30
+ // className.startsWith('lang-') &&
31
+ // langs.indexOf(className.substring('lang-'.length)) > -1
32
+ // ) {
33
+ // lang = className.substring('lang-'.length);
34
+ // break;
35
+ // }
36
+ // }
37
+ // }
38
+
39
+ return {
40
+ lang,
41
+ };
42
+ },
43
+ },
44
+ ],
45
+ attrs: { lang: { default: null } },
46
+ toDOM(node) {
47
+ const { lang } = node.attrs;
48
+ return ['pre', { lang }, ['code', 0]];
49
+ },
50
+ };
51
+ }
52
+
53
+ override getInputRules(type: NodeType): InputRule[] {
54
+ /// Given a code block node type, returns an input rule that turns a
55
+ /// textblock starting with three backticks into a code block.
56
+ return [
57
+ textblockTypeInputRule(/^```$/, type),
58
+ ];
59
+ }
60
+ }
@@ -0,0 +1,19 @@
1
+ import { NodeSpec } from 'prosemirror-model';
2
+ import { Node } from '@kerebron/editor';
3
+
4
+ export class NodeDefinitionDesc extends Node {
5
+ override name = 'dd';
6
+ requires = ['dl'];
7
+
8
+ override getNodeSpec(): NodeSpec {
9
+ return {
10
+ content: 'inline*',
11
+ group: 'block',
12
+ parseDOM: [{ tag: 'dd' }],
13
+ defining: true,
14
+ toDOM() {
15
+ return ['dd', 0];
16
+ },
17
+ };
18
+ }
19
+ }
@@ -0,0 +1,46 @@
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
+ wrappingInputRule,
11
+ } from '@kerebron/editor/plugins/input-rules';
12
+
13
+ export class NodeDefinitionList extends Node {
14
+ override name = 'dl';
15
+ requires = ['doc'];
16
+
17
+ override getNodeSpec(): NodeSpec {
18
+ return {
19
+ content: 'dt+|dd+',
20
+ group: 'block',
21
+ parseDOM: [{ tag: 'dl' }],
22
+ toDOM() {
23
+ return ['dl', 0];
24
+ },
25
+ };
26
+ }
27
+
28
+ override getInputRules(type: NodeType): InputRule[] {
29
+ return [
30
+ // wrappingInputRule(/^\s*([-+*])\s$/, type),
31
+ ];
32
+ }
33
+
34
+ override getCommandFactories(
35
+ editor: CoreEditor,
36
+ type: NodeType,
37
+ ): Partial<CommandFactories> {
38
+ return {
39
+ 'toggleDefinitionList': () => editor.commandFactories.wrapInList(type),
40
+ };
41
+ }
42
+
43
+ override getKeyboardShortcuts(): Partial<CommandShortcuts> {
44
+ return {};
45
+ }
46
+ }