@kerebron/extension-basic-editor 0.4.27 → 0.4.29

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 (242) hide show
  1. package/esm/ExtensionBaseKeymap.d.ts +7 -0
  2. package/esm/ExtensionBaseKeymap.d.ts.map +1 -0
  3. package/esm/ExtensionBaseKeymap.js +56 -0
  4. package/esm/ExtensionBaseKeymap.js.map +1 -0
  5. package/esm/ExtensionBasicCodeEditor.d.ts +11 -0
  6. package/esm/ExtensionBasicCodeEditor.d.ts.map +1 -0
  7. package/esm/ExtensionBasicCodeEditor.js +62 -0
  8. package/esm/ExtensionBasicCodeEditor.js.map +1 -0
  9. package/esm/ExtensionBasicEditor.d.ts +49 -0
  10. package/esm/ExtensionBasicEditor.d.ts.map +1 -0
  11. package/esm/ExtensionBasicEditor.js +95 -0
  12. package/esm/ExtensionBasicEditor.js.map +1 -0
  13. package/esm/ExtensionDropcursor.d.ts +19 -0
  14. package/esm/ExtensionDropcursor.d.ts.map +1 -0
  15. package/esm/ExtensionDropcursor.js +187 -0
  16. package/esm/ExtensionDropcursor.js.map +1 -0
  17. package/esm/ExtensionGapcursor.d.ts +32 -0
  18. package/esm/ExtensionGapcursor.d.ts.map +1 -0
  19. package/esm/ExtensionGapcursor.js +250 -0
  20. package/esm/ExtensionGapcursor.js.map +1 -0
  21. package/esm/ExtensionHistory.d.ts +14 -0
  22. package/esm/ExtensionHistory.d.ts.map +1 -0
  23. package/esm/ExtensionHistory.js +35 -0
  24. package/esm/ExtensionHistory.js.map +1 -0
  25. package/esm/ExtensionHtml.d.ts +15 -0
  26. package/esm/ExtensionHtml.d.ts.map +1 -0
  27. package/esm/ExtensionHtml.js +100 -0
  28. package/esm/ExtensionHtml.js.map +1 -0
  29. package/esm/ExtensionMediaUpload.d.ts +24 -0
  30. package/esm/ExtensionMediaUpload.d.ts.map +1 -0
  31. package/esm/ExtensionMediaUpload.js +168 -0
  32. package/esm/ExtensionMediaUpload.js.map +1 -0
  33. package/esm/ExtensionSelection.d.ts +11 -0
  34. package/esm/ExtensionSelection.d.ts.map +1 -0
  35. package/esm/ExtensionSelection.js +230 -0
  36. package/esm/ExtensionSelection.js.map +1 -0
  37. package/esm/ExtensionTextAlign.d.ts +11 -0
  38. package/esm/ExtensionTextAlign.d.ts.map +1 -0
  39. package/esm/ExtensionTextAlign.js +40 -0
  40. package/esm/ExtensionTextAlign.js.map +1 -0
  41. package/esm/MarkBookmark.d.ts +8 -0
  42. package/esm/MarkBookmark.d.ts.map +1 -0
  43. package/esm/MarkBookmark.js +17 -0
  44. package/esm/MarkBookmark.js.map +1 -0
  45. package/esm/MarkChange.d.ts +8 -0
  46. package/esm/MarkChange.d.ts.map +1 -0
  47. package/esm/MarkChange.js +14 -0
  48. package/esm/MarkChange.js.map +1 -0
  49. package/esm/MarkCode.d.ts +11 -0
  50. package/esm/MarkCode.d.ts.map +1 -0
  51. package/esm/MarkCode.js +24 -0
  52. package/esm/MarkCode.js.map +1 -0
  53. package/esm/MarkHighlight.d.ts +8 -0
  54. package/esm/MarkHighlight.d.ts.map +1 -0
  55. package/esm/MarkHighlight.js +36 -0
  56. package/esm/MarkHighlight.js.map +1 -0
  57. package/esm/MarkItalic.d.ts +11 -0
  58. package/esm/MarkItalic.d.ts.map +1 -0
  59. package/esm/MarkItalic.js +30 -0
  60. package/esm/MarkItalic.js.map +1 -0
  61. package/esm/MarkLink.d.ts +8 -0
  62. package/esm/MarkLink.d.ts.map +1 -0
  63. package/esm/MarkLink.js +30 -0
  64. package/esm/MarkLink.js.map +1 -0
  65. package/esm/MarkStrike.d.ts +11 -0
  66. package/esm/MarkStrike.d.ts.map +1 -0
  67. package/esm/MarkStrike.js +27 -0
  68. package/esm/MarkStrike.js.map +1 -0
  69. package/esm/MarkStrong.d.ts +11 -0
  70. package/esm/MarkStrong.d.ts.map +1 -0
  71. package/esm/MarkStrong.js +39 -0
  72. package/esm/MarkStrong.js.map +1 -0
  73. package/esm/MarkSubscript.d.ts +11 -0
  74. package/esm/MarkSubscript.d.ts.map +1 -0
  75. package/esm/MarkSubscript.js +31 -0
  76. package/esm/MarkSubscript.js.map +1 -0
  77. package/esm/MarkSuperscript.d.ts +11 -0
  78. package/esm/MarkSuperscript.d.ts.map +1 -0
  79. package/esm/MarkSuperscript.js +31 -0
  80. package/esm/MarkSuperscript.js.map +1 -0
  81. package/esm/MarkTextColor.d.ts +8 -0
  82. package/esm/MarkTextColor.d.ts.map +1 -0
  83. package/esm/MarkTextColor.js +28 -0
  84. package/esm/MarkTextColor.js.map +1 -0
  85. package/esm/MarkUnderline.d.ts +11 -0
  86. package/esm/MarkUnderline.d.ts.map +1 -0
  87. package/esm/MarkUnderline.js +34 -0
  88. package/esm/MarkUnderline.js.map +1 -0
  89. package/esm/NodeAside.d.ts +8 -0
  90. package/esm/NodeAside.d.ts.map +1 -0
  91. package/esm/NodeAside.js +17 -0
  92. package/esm/NodeAside.js.map +1 -0
  93. package/esm/NodeBlockquote.d.ts +13 -0
  94. package/esm/NodeBlockquote.d.ts.map +1 -0
  95. package/esm/NodeBlockquote.js +35 -0
  96. package/esm/NodeBlockquote.js.map +1 -0
  97. package/esm/NodeBookmark.d.ts +8 -0
  98. package/esm/NodeBookmark.d.ts.map +1 -0
  99. package/esm/NodeBookmark.js +20 -0
  100. package/esm/NodeBookmark.js.map +1 -0
  101. package/esm/NodeBulletList.d.ts +13 -0
  102. package/esm/NodeBulletList.d.ts.map +1 -0
  103. package/esm/NodeBulletList.js +35 -0
  104. package/esm/NodeBulletList.js.map +1 -0
  105. package/esm/NodeCodeBlock.d.ts +9 -0
  106. package/esm/NodeCodeBlock.d.ts.map +1 -0
  107. package/esm/NodeCodeBlock.js +51 -0
  108. package/esm/NodeCodeBlock.js.map +1 -0
  109. package/esm/NodeDefinitionDesc.d.ts +8 -0
  110. package/esm/NodeDefinitionDesc.d.ts.map +1 -0
  111. package/esm/NodeDefinitionDesc.js +17 -0
  112. package/esm/NodeDefinitionDesc.js.map +1 -0
  113. package/esm/NodeDefinitionList.d.ts +13 -0
  114. package/esm/NodeDefinitionList.d.ts.map +1 -0
  115. package/esm/NodeDefinitionList.js +29 -0
  116. package/esm/NodeDefinitionList.js.map +1 -0
  117. package/esm/NodeDefinitionTerm.d.ts +8 -0
  118. package/esm/NodeDefinitionTerm.d.ts.map +1 -0
  119. package/esm/NodeDefinitionTerm.js +17 -0
  120. package/esm/NodeDefinitionTerm.js.map +1 -0
  121. package/esm/NodeDocument.d.ts +7 -0
  122. package/esm/NodeDocument.d.ts.map +1 -0
  123. package/esm/NodeDocument.js +20 -0
  124. package/esm/NodeDocument.js.map +1 -0
  125. package/esm/NodeDocumentCode.d.ts +7 -0
  126. package/esm/NodeDocumentCode.d.ts.map +1 -0
  127. package/esm/NodeDocumentCode.js +30 -0
  128. package/esm/NodeDocumentCode.js.map +1 -0
  129. package/esm/NodeFrontmatter.d.ts +8 -0
  130. package/esm/NodeFrontmatter.d.ts.map +1 -0
  131. package/esm/NodeFrontmatter.js +17 -0
  132. package/esm/NodeFrontmatter.js.map +1 -0
  133. package/esm/NodeHardBreak.d.ts +14 -0
  134. package/esm/NodeHardBreak.d.ts.map +1 -0
  135. package/esm/NodeHardBreak.js +68 -0
  136. package/esm/NodeHardBreak.js.map +1 -0
  137. package/esm/NodeHeading.d.ts +13 -0
  138. package/esm/NodeHeading.d.ts.map +1 -0
  139. package/esm/NodeHeading.js +50 -0
  140. package/esm/NodeHeading.js.map +1 -0
  141. package/esm/NodeHorizontalRule.d.ts +11 -0
  142. package/esm/NodeHorizontalRule.d.ts.map +1 -0
  143. package/esm/NodeHorizontalRule.js +30 -0
  144. package/esm/NodeHorizontalRule.js.map +1 -0
  145. package/esm/NodeImage.d.ts +8 -0
  146. package/esm/NodeImage.d.ts.map +1 -0
  147. package/esm/NodeImage.js +34 -0
  148. package/esm/NodeImage.js.map +1 -0
  149. package/esm/NodeInlineShortCode.d.ts +11 -0
  150. package/esm/NodeInlineShortCode.d.ts.map +1 -0
  151. package/esm/NodeInlineShortCode.js +40 -0
  152. package/esm/NodeInlineShortCode.js.map +1 -0
  153. package/esm/NodeListItem.d.ts +14 -0
  154. package/esm/NodeListItem.d.ts.map +1 -0
  155. package/esm/NodeListItem.js +202 -0
  156. package/esm/NodeListItem.js.map +1 -0
  157. package/esm/NodeMath.d.ts +8 -0
  158. package/esm/NodeMath.d.ts.map +1 -0
  159. package/esm/NodeMath.js +100 -0
  160. package/esm/NodeMath.js.map +1 -0
  161. package/esm/NodeOrderedList.d.ts +23 -0
  162. package/esm/NodeOrderedList.d.ts.map +1 -0
  163. package/esm/NodeOrderedList.js +53 -0
  164. package/esm/NodeOrderedList.js.map +1 -0
  165. package/esm/NodeParagraph.d.ts +11 -0
  166. package/esm/NodeParagraph.d.ts.map +1 -0
  167. package/esm/NodeParagraph.js +45 -0
  168. package/esm/NodeParagraph.js.map +1 -0
  169. package/esm/NodeTaskItem.d.ts +24 -0
  170. package/esm/NodeTaskItem.d.ts.map +1 -0
  171. package/esm/NodeTaskItem.js +147 -0
  172. package/esm/NodeTaskItem.js.map +1 -0
  173. package/esm/NodeTaskList.d.ts +11 -0
  174. package/esm/NodeTaskList.d.ts.map +1 -0
  175. package/esm/NodeTaskList.js +26 -0
  176. package/esm/NodeTaskList.js.map +1 -0
  177. package/esm/NodeText.d.ts +7 -0
  178. package/esm/NodeText.d.ts.map +1 -0
  179. package/esm/NodeText.js +10 -0
  180. package/esm/NodeText.js.map +1 -0
  181. package/esm/NodeVideo.d.ts +8 -0
  182. package/esm/NodeVideo.d.ts.map +1 -0
  183. package/esm/NodeVideo.js +46 -0
  184. package/esm/NodeVideo.js.map +1 -0
  185. package/esm/package.json +3 -0
  186. package/esm/remote-selection/ExtensionRemoteSelection.d.ts +24 -0
  187. package/esm/remote-selection/ExtensionRemoteSelection.d.ts.map +1 -0
  188. package/esm/remote-selection/ExtensionRemoteSelection.js +23 -0
  189. package/esm/remote-selection/ExtensionRemoteSelection.js.map +1 -0
  190. package/esm/remote-selection/remoteSelectionPlugin.d.ts +25 -0
  191. package/esm/remote-selection/remoteSelectionPlugin.d.ts.map +1 -0
  192. package/esm/remote-selection/remoteSelectionPlugin.js +97 -0
  193. package/esm/remote-selection/remoteSelectionPlugin.js.map +1 -0
  194. package/package.json +6 -3
  195. package/src/ExtensionBaseKeymap.ts +64 -0
  196. package/src/ExtensionBasicCodeEditor.ts +82 -0
  197. package/src/ExtensionBasicEditor.ts +97 -0
  198. package/src/ExtensionDropcursor.ts +221 -0
  199. package/src/ExtensionGapcursor.ts +278 -0
  200. package/src/ExtensionHistory.ts +48 -0
  201. package/src/ExtensionHtml.ts +158 -0
  202. package/src/ExtensionMediaUpload.ts +258 -0
  203. package/src/ExtensionSelection.ts +379 -0
  204. package/src/ExtensionTextAlign.ts +50 -0
  205. package/src/MarkBookmark.ts +20 -0
  206. package/src/MarkChange.ts +17 -0
  207. package/src/MarkCode.ts +35 -0
  208. package/src/MarkHighlight.ts +38 -0
  209. package/src/MarkItalic.ts +41 -0
  210. package/src/MarkLink.ts +32 -0
  211. package/src/MarkStrike.ts +38 -0
  212. package/src/MarkStrong.ts +52 -0
  213. package/src/MarkSubscript.ts +42 -0
  214. package/src/MarkSuperscript.ts +42 -0
  215. package/src/MarkTextColor.ts +29 -0
  216. package/src/MarkUnderline.ts +47 -0
  217. package/src/NodeAside.ts +19 -0
  218. package/src/NodeBlockquote.ts +51 -0
  219. package/src/NodeBookmark.ts +23 -0
  220. package/src/NodeBulletList.ts +51 -0
  221. package/src/NodeCodeBlock.ts +60 -0
  222. package/src/NodeDefinitionDesc.ts +19 -0
  223. package/src/NodeDefinitionList.ts +46 -0
  224. package/src/NodeDefinitionTerm.ts +19 -0
  225. package/src/NodeDocument.ts +22 -0
  226. package/src/NodeDocumentCode.ts +33 -0
  227. package/src/NodeFrontmatter.ts +19 -0
  228. package/src/NodeHardBreak.ts +92 -0
  229. package/src/NodeHeading.ts +76 -0
  230. package/src/NodeHorizontalRule.ts +43 -0
  231. package/src/NodeImage.ts +36 -0
  232. package/src/NodeInlineShortCode.ts +55 -0
  233. package/src/NodeListItem.ts +320 -0
  234. package/src/NodeMath.ts +109 -0
  235. package/src/NodeOrderedList.ts +79 -0
  236. package/src/NodeParagraph.ts +60 -0
  237. package/src/NodeTaskItem.ts +190 -0
  238. package/src/NodeTaskList.ts +38 -0
  239. package/src/NodeText.ts +12 -0
  240. package/src/NodeVideo.ts +44 -0
  241. package/src/remote-selection/ExtensionRemoteSelection.ts +45 -0
  242. package/src/remote-selection/remoteSelectionPlugin.ts +157 -0
@@ -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
+ }
@@ -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
+ }