@meowdown/core 0.78.4 → 0.79.0

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/dist/index.d.ts CHANGED
@@ -10,6 +10,7 @@ import { ListAttrs } from "@prosekit/extensions/list";
10
10
  import { HorizontalRuleExtension } from "@prosekit/extensions/horizontal-rule";
11
11
  import { Resolver, XPostMediaClickEvent } from "@meowdown/embed/x";
12
12
  import { YouTubeVideoClickEvent } from "@meowdown/embed/youtube";
13
+ import "prosemirror-flat-list";
13
14
  import { render } from "katex";
14
15
  import { XPost, YouTubeVideo } from "@post-embed/types";
15
16
  import { VirtualElement } from "@floating-ui/dom";
@@ -1098,6 +1099,7 @@ interface EditorConfig extends InlineMarkOptions, FollowLinkHandlers, FilePasteO
1098
1099
  embedPaste?: boolean;
1099
1100
  linkPaste?: boolean;
1100
1101
  bulletAfterHeading?: boolean;
1102
+ backspaceDeletesEmptyFirstBlock?: boolean;
1101
1103
  substitution?: boolean;
1102
1104
  wikilinkEnabled?: boolean;
1103
1105
  placeholder?: PlaceholderOptions$1['placeholder'];
@@ -1121,7 +1123,7 @@ declare function defineEditorExtensionImpl(options: EditorExtensionOptions): imp
1121
1123
  frontmatter?: Frontmatter;
1122
1124
  };
1123
1125
  };
1124
- }>, import("@prosekit/extensions/text").TextExtension, import("@prosekit/extensions/blockquote").BlockquoteExtension, import("@prosekit/core").Union<readonly [import("@prosekit/extensions/list").ListSpecExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/extensions/list").ListCommandsExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").Extension<{
1126
+ }>, import("@prosekit/extensions/text").TextExtension, import("@prosekit/extensions/blockquote").BlockquoteExtension, import("@prosekit/core").Union<readonly [import("@prosekit/extensions/list").ListSpecExtension, import("@prosekit/core").PlainExtension, import("@prosekit/extensions/list").ListCommandsExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").Extension<{
1125
1127
  Nodes: {
1126
1128
  list: {
1127
1129
  marker?: ListMarker;
@@ -1146,6 +1148,9 @@ declare function defineEditorExtensionImpl(options: EditorExtensionOptions): imp
1146
1148
  wrapInCircleTask: [];
1147
1149
  wrapInSquareTask: [];
1148
1150
  toggleListCollapsed: [];
1151
+ indentList: [options?: import("prosemirror-flat-list").IndentListOptions | undefined];
1152
+ dedentList: [options?: import("prosemirror-flat-list").DedentListOptions | undefined];
1153
+ splitList: [options?: import("prosemirror-flat-list").SplitListOptions | undefined];
1149
1154
  };
1150
1155
  }>]>, import("@prosekit/core").Union<readonly [import("@prosekit/extensions/heading").HeadingSpecExtension, import("@prosekit/core").Extension<{
1151
1156
  Nodes: {
@@ -1247,7 +1252,7 @@ declare function defineEditorExtensionImpl(options: EditorExtensionOptions): imp
1247
1252
  Marks: {
1248
1253
  mdPack: MdPackAttrs;
1249
1254
  };
1250
- }>]>, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").Extension<import("@prosekit/core").ExtensionTyping<any, any, any>>, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").Union<readonly [import("@prosekit/core").Extension<{
1255
+ }>]>, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").Extension<import("@prosekit/core").ExtensionTyping<any, any, any>>, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").Union<readonly [import("@prosekit/core").Extension<{
1251
1256
  Commands: {
1252
1257
  insertSoftBreak: [];
1253
1258
  };
@@ -1343,6 +1348,15 @@ interface DocToMarkdownOptions {
1343
1348
  */
1344
1349
  export declare function docToMarkdown(node: ProseMirrorNode, options?: DocToMarkdownOptions): string;
1345
1350
  //#endregion
1351
+ //#region src/extensions/backspace-empty-first-block.d.ts
1352
+ /**
1353
+ * Nothing sits before the document's first block, so Backspace in an empty
1354
+ * first paragraph has nothing to join and does nothing. When this extension is
1355
+ * applied, that Backspace deletes the empty paragraph instead, and the rest of
1356
+ * the document moves up one line.
1357
+ */
1358
+ export declare function defineBackspaceEmptyFirstBlock(enabled?: (state: EditorState) => boolean): PlainExtension;
1359
+ //#endregion
1346
1360
  //#region src/extensions/bullet-after-heading.d.ts
1347
1361
  /**
1348
1362
  * "Type a title, press Return, start bullets." When this extension is applied,
package/dist/index.js CHANGED
@@ -30,8 +30,8 @@ import { createParser } from "prosemirror-highlight/lezer";
30
30
  import { defineEnterRule, defineTextBlockEnterRule } from "@prosekit/extensions/enter-rule";
31
31
  import { defineInputRule, defineTextBlockInputRule } from "@prosekit/extensions/input-rule";
32
32
  import { triggerAutocomplete } from "@prosekit/extensions/autocomplete";
33
- import { defineListCommands, defineListDropIndicator, defineListKeymap, defineListSpec, moveList, toggleList, unwrapList, wrapInList } from "@prosekit/extensions/list";
34
- import { chainCommands, lift, newlineInCode, splitBlock } from "@prosekit/pm/commands";
33
+ import { defineListCommands, defineListDropIndicator, defineListSpec, moveList, toggleList, unwrapList, wrapInList } from "@prosekit/extensions/list";
34
+ import { chainCommands, deleteSelection, lift, newlineInCode, splitBlock } from "@prosekit/pm/commands";
35
35
  import { closeHistory } from "@prosekit/pm/history";
36
36
  import { defineHorizontalRule } from "@prosekit/extensions/horizontal-rule";
37
37
  import { X_POST_MEDIA_CLICK, registerXPost } from "@meowdown/embed/x";
@@ -44,7 +44,7 @@ import * as v from "valibot";
44
44
  import { AttrStep, ReplaceStep, Step, StepResult, Transform } from "@prosekit/pm/transform";
45
45
  import { decodeString } from "micromark-util-decode-string";
46
46
  import { normalizeIdentifier } from "micromark-util-normalize-identifier";
47
- import { createListRenderingPlugin, createSafariInputMethodWorkaroundPlugin, createToggleCollapsedCommand, defaultAttributesGetter, enterCommand, findCheckboxInListItem, handleListMarkerMouseDown, joinListElements, listToDOM, unwrapListSlice, wrappingListInputRule } from "prosemirror-flat-list";
47
+ import { createDedentListCommand, createIndentListCommand, createListRenderingPlugin, createSafariInputMethodWorkaroundPlugin, createSplitListCommand, createToggleCollapsedCommand, defaultAttributesGetter, deleteCommand, enterCommand, findCheckboxInListItem, handleListMarkerMouseDown, joinCollapsedListBackward, joinListElements, joinListUp, listToDOM, protectCollapsed, unwrapListSlice, wrappingListInputRule } from "prosemirror-flat-list";
48
48
  import { defineTableCellSpec, defineTableCommands, defineTableDropIndicator, defineTableEditingPlugin, defineTableHeaderCellSpec, defineTableRowSpec, defineTableSpec, deleteTable, isCellSelection } from "@prosekit/extensions/table";
49
49
  import { InputRule } from "@prosekit/pm/inputrules";
50
50
 
@@ -629,6 +629,38 @@ function isNodeOfType(node, name) {
629
629
  return node.type.name === name;
630
630
  }
631
631
 
632
+ //#endregion
633
+ //#region src/extensions/backspace-empty-first-block.ts
634
+ /**
635
+ * Claim Backspace only when the selection is an empty caret in an empty
636
+ * paragraph that is the document's first block and has a block after it.
637
+ * Delete that paragraph and leave the following block as it is.
638
+ */
639
+ const deleteEmptyFirstBlock = (state, dispatch) => {
640
+ const { $from, empty } = state.selection;
641
+ if (!empty || $from.depth !== 1 || $from.index(0) !== 0) return false;
642
+ const block = $from.parent;
643
+ if (!isNodeOfType(block, "paragraph") || block.content.size > 0) return false;
644
+ if (state.doc.childCount < 2) return false;
645
+ if (dispatch) {
646
+ const tr = state.tr.delete(0, block.nodeSize);
647
+ tr.setSelection(Selection.atStart(tr.doc));
648
+ dispatch(tr.scrollIntoView());
649
+ }
650
+ return true;
651
+ };
652
+ /**
653
+ * Nothing sits before the document's first block, so Backspace in an empty
654
+ * first paragraph has nothing to join and does nothing. When this extension is
655
+ * applied, that Backspace deletes the empty paragraph instead, and the rest of
656
+ * the document moves up one line.
657
+ */
658
+ function defineBackspaceEmptyFirstBlock(enabled) {
659
+ return withPriority$1(defineKeymap({ Backspace: (state, dispatch) => {
660
+ return (!enabled || enabled(state)) && deleteEmptyFirstBlock(state, dispatch);
661
+ } }), Priority$1.lowest);
662
+ }
663
+
632
664
  //#endregion
633
665
  //#region src/extensions/bullet-after-heading.ts
634
666
  /**
@@ -5896,13 +5928,34 @@ function cycleBulletOrderedList() {
5896
5928
  function toggleListCollapsed() {
5897
5929
  return createToggleCollapsedCommand({ isToggleable: isCollapsibleBullet });
5898
5930
  }
5931
+ function indentList(options) {
5932
+ return createIndentListCommand({
5933
+ strict: true,
5934
+ ...options
5935
+ });
5936
+ }
5937
+ function dedentList(options) {
5938
+ return createDedentListCommand({
5939
+ strict: true,
5940
+ ...options
5941
+ });
5942
+ }
5943
+ function splitList(options) {
5944
+ return createSplitListCommand({
5945
+ strict: true,
5946
+ ...options
5947
+ });
5948
+ }
5899
5949
  function defineMeowdownListCommands() {
5900
5950
  return defineCommands({
5901
5951
  cycleCheckableList,
5902
5952
  cycleBulletOrderedList,
5903
5953
  wrapInCircleTask,
5904
5954
  wrapInSquareTask,
5905
- toggleListCollapsed
5955
+ toggleListCollapsed,
5956
+ indentList,
5957
+ dedentList,
5958
+ splitList
5906
5959
  });
5907
5960
  }
5908
5961
  /**
@@ -6002,6 +6055,13 @@ function defineMeowdownListPlugins() {
6002
6055
  }
6003
6056
  function defineMeowdownListKeymap() {
6004
6057
  return defineKeymap({
6058
+ Enter: chainCommands(protectCollapsed, splitList()),
6059
+ Backspace: chainCommands(protectCollapsed, deleteSelection, joinListUp, joinCollapsedListBackward),
6060
+ Delete: deleteCommand,
6061
+ Tab: indentList(),
6062
+ "Shift-Tab": dedentList(),
6063
+ "Mod-]": indentList(),
6064
+ "Mod-[": dedentList(),
6005
6065
  "Mod-Enter": rotateSquareTask(),
6006
6066
  "Mod-Shift-Enter": rotateCircleTask(),
6007
6067
  "Mod-.": createToggleCollapsedCommand({ isToggleable: isCollapsibleBullet }),
@@ -6021,7 +6081,7 @@ function defineMeowdownListKeymap() {
6021
6081
  });
6022
6082
  }
6023
6083
  function defineMeowdownList() {
6024
- return union(defineListSpec(), defineMeowdownListPlugins(), defineListKeymap(), defineListCommands(), defineMeowdownListSerializer(), defineListDropIndicator(), defineMeowdownListInputRules(), defineMeowdownListKeymap(), defineListMarkerAttr(), defineListTaskMarkerAttr(), defineListMarkerGapAttr(), defineMeowdownListCommands());
6084
+ return union(defineListSpec(), defineMeowdownListPlugins(), defineListCommands(), defineMeowdownListSerializer(), defineListDropIndicator(), defineMeowdownListInputRules(), defineMeowdownListKeymap(), defineListMarkerAttr(), defineListTaskMarkerAttr(), defineListMarkerGapAttr(), defineMeowdownListCommands());
6025
6085
  }
6026
6086
 
6027
6087
  //#endregion
@@ -7283,7 +7343,7 @@ function defineYouTubeVideoClickHandler(getOnClick) {
7283
7343
  //#endregion
7284
7344
  //#region src/extensions/extension.ts
7285
7345
  function defineEditorExtensionImpl(options) {
7286
- return union(defineMeowdownParagraph(), defineDoc(), defineDocFrontmatterAttr(), defineText(), defineBlockquote(), defineMeowdownList(), defineHeading(), defineTable(), defineCodeBlock$1(), defineMeowdownHorizontalRule(), defineHTMLComment(), defineInlineMarks(), defineEditorConfig(options), defineImage(getEditorConfig), defineFileView(getEditorConfig), defineModClickPrevention(), defineFileClickHandler((state) => getEditorConfig(state).onFileClick), defineImageClickHandler((state) => getEditorConfig(state).onImageClick), defineXPostMediaClickHandler((state) => getEditorConfig(state).onXPostMediaClick), defineYouTubeVideoClickHandler((state) => getEditorConfig(state).onYouTubeVideoClick), defineWikilinkClickHandler((state) => getEditorConfig(state).onWikilinkClick), defineTagClickHandler((state) => getEditorConfig(state).onTagClick), defineLinkClickHandler((state) => getEditorConfig(state).onLinkClick), defineFollowLinkHandler(getEditorConfig), defineExitBoundaryHandler((state) => getEditorConfig(state).onExitBoundary), defineFilePaste(getEditorConfig), defineEmbedPaste((state) => !!getEditorConfig(state).embedPaste), defineLinkPaste((state) => !!getEditorConfig(state).linkPaste), defineBulletAfterHeading((state) => !!getEditorConfig(state).bulletAfterHeading), defineSubstitution((state) => !!getEditorConfig(state).substitution), defineWikilinkTrigger((state) => !!getEditorConfig(state).wikilinkEnabled), definePlaceholder$1({
7346
+ return union(defineMeowdownParagraph(), defineDoc(), defineDocFrontmatterAttr(), defineText(), defineBlockquote(), defineMeowdownList(), defineHeading(), defineTable(), defineCodeBlock$1(), defineMeowdownHorizontalRule(), defineHTMLComment(), defineInlineMarks(), defineEditorConfig(options), defineImage(getEditorConfig), defineFileView(getEditorConfig), defineModClickPrevention(), defineFileClickHandler((state) => getEditorConfig(state).onFileClick), defineImageClickHandler((state) => getEditorConfig(state).onImageClick), defineXPostMediaClickHandler((state) => getEditorConfig(state).onXPostMediaClick), defineYouTubeVideoClickHandler((state) => getEditorConfig(state).onYouTubeVideoClick), defineWikilinkClickHandler((state) => getEditorConfig(state).onWikilinkClick), defineTagClickHandler((state) => getEditorConfig(state).onTagClick), defineLinkClickHandler((state) => getEditorConfig(state).onLinkClick), defineFollowLinkHandler(getEditorConfig), defineExitBoundaryHandler((state) => getEditorConfig(state).onExitBoundary), defineFilePaste(getEditorConfig), defineEmbedPaste((state) => !!getEditorConfig(state).embedPaste), defineLinkPaste((state) => !!getEditorConfig(state).linkPaste), defineBulletAfterHeading((state) => !!getEditorConfig(state).bulletAfterHeading), defineBackspaceEmptyFirstBlock((state) => !!getEditorConfig(state).backspaceDeletesEmptyFirstBlock), defineSubstitution((state) => !!getEditorConfig(state).substitution), defineWikilinkTrigger((state) => !!getEditorConfig(state).wikilinkEnabled), definePlaceholder$1({
7287
7347
  placeholder: (state) => {
7288
7348
  const placeholder = getEditorConfig(state).placeholder;
7289
7349
  return typeof placeholder === "function" ? placeholder(state) : placeholder ?? "";
@@ -8074,4 +8134,4 @@ function getVirtualElementFromRange(view, range) {
8074
8134
  }
8075
8135
 
8076
8136
  //#endregion
8077
- export { EDITOR_KEY_BINDINGS, Priority, buildFileMarkdown, checkRoundTrip, codeBlockLanguages, collectReferenceDefinitions, defaultResolveImageUrl, defaultResolveXPost, defaultResolveYouTubeVideo, defineBulletAfterHeading, defineCodeBlockPreviewPlugin, defineCodeBlockSyntaxHighlight, defineEditorExtension, defineEmbedPaste, defineExitBoundaryHandler, defineFileClickHandler, defineFilePaste, defineFileView, defineFollowLinkHandler, defineHTMLComment, defineImage, defineImageClickHandler, defineLinkClickHandler, defineLinkCommands, defineLinkEditKeymap, defineLinkHoverHandler, defineLinkPaste, defineMath, definePendingReplacementHandler, definePlaceholder, defineReadonly, defineSearchStatusHandler, defineSingleParagraph, defineSubstitution, defineTagClickHandler, defineViewAttributes, defineVirtualCaret, defineWikilinkClickHandler, defineWikilinkHoverHandler, defineWikilinkTrigger, defineXPostMediaClickHandler, defineYouTubeVideoClickHandler, dismissLinkHover, docToMarkdown, docToParagraphMarkdown, formatFileSize, formatSizedWikiEmbed, getCodeTokens, getEditorConfig, getFileKind, getIsComposing, getLinkText, getLinkUnitAt, getMarkBuilders, getPendingReplacement, getSearchStatus, getSelectedText, getTableColumnAlign, getTextblockDisplayText, getVirtualElementFromRange, inlineTextToMarkChunks, inlineTextToMarkChunksWithContext, insertLink, isCodeBlockPreviewHiddenDecoration, isLinkTextForHref, isMarkOfType, isModEvent, isNodeOfType, isReferenceDefinitionNode, isSelectionInTableCell, loadKaTeX, markdownToDoc, normalizeHref, paragraphMarkdownToDoc, parsePostEmbedSnapshot, parseWikiEmbed, removeLink, renderMathInto, updateEditorConfig, updateLink, wikiEmbedBasename, withPriority };
8137
+ export { EDITOR_KEY_BINDINGS, Priority, buildFileMarkdown, checkRoundTrip, codeBlockLanguages, collectReferenceDefinitions, defaultResolveImageUrl, defaultResolveXPost, defaultResolveYouTubeVideo, defineBackspaceEmptyFirstBlock, defineBulletAfterHeading, defineCodeBlockPreviewPlugin, defineCodeBlockSyntaxHighlight, defineEditorExtension, defineEmbedPaste, defineExitBoundaryHandler, defineFileClickHandler, defineFilePaste, defineFileView, defineFollowLinkHandler, defineHTMLComment, defineImage, defineImageClickHandler, defineLinkClickHandler, defineLinkCommands, defineLinkEditKeymap, defineLinkHoverHandler, defineLinkPaste, defineMath, definePendingReplacementHandler, definePlaceholder, defineReadonly, defineSearchStatusHandler, defineSingleParagraph, defineSubstitution, defineTagClickHandler, defineViewAttributes, defineVirtualCaret, defineWikilinkClickHandler, defineWikilinkHoverHandler, defineWikilinkTrigger, defineXPostMediaClickHandler, defineYouTubeVideoClickHandler, dismissLinkHover, docToMarkdown, docToParagraphMarkdown, formatFileSize, formatSizedWikiEmbed, getCodeTokens, getEditorConfig, getFileKind, getIsComposing, getLinkText, getLinkUnitAt, getMarkBuilders, getPendingReplacement, getSearchStatus, getSelectedText, getTableColumnAlign, getTextblockDisplayText, getVirtualElementFromRange, inlineTextToMarkChunks, inlineTextToMarkChunksWithContext, insertLink, isCodeBlockPreviewHiddenDecoration, isLinkTextForHref, isMarkOfType, isModEvent, isNodeOfType, isReferenceDefinitionNode, isSelectionInTableCell, loadKaTeX, markdownToDoc, normalizeHref, paragraphMarkdownToDoc, parsePostEmbedSnapshot, parseWikiEmbed, removeLink, renderMathInto, updateEditorConfig, updateLink, wikiEmbedBasename, withPriority };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@meowdown/core",
3
3
  "type": "module",
4
- "version": "0.78.4",
4
+ "version": "0.79.0",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -21,10 +21,10 @@
21
21
  "./dist/**/*.css"
22
22
  ],
23
23
  "dependencies": {
24
- "@codemirror/language": "^6.12.4",
24
+ "@codemirror/language": "^6.13.1",
25
25
  "@codemirror/language-data": "^6.5.2",
26
26
  "@floating-ui/dom": "^1.8.0",
27
- "@lezer/highlight": "^1.2.3",
27
+ "@lezer/highlight": "^1.2.5",
28
28
  "@meowdown/embed": "0.3.1",
29
29
  "@meowdown/markdown": "0.76.0",
30
30
  "@ocavue/utils": "^1.8.0",
@@ -41,9 +41,9 @@
41
41
  "mdast-util-to-markdown": "^2.2.0",
42
42
  "micromark-util-decode-string": "^2.0.1",
43
43
  "micromark-util-normalize-identifier": "^2.0.1",
44
- "prosemirror-flat-list": "^0.7.1",
44
+ "prosemirror-flat-list": "^0.7.2",
45
45
  "prosemirror-highlight": "^0.16.0",
46
- "rehype-parse": "^9.0.1",
46
+ "rehype-parse": "^9.0.0",
47
47
  "rehype-remark": "^10.0.1",
48
48
  "remark-gfm": "^4.0.1",
49
49
  "remark-stringify": "^11.0.0",