@meowdown/core 0.3.1 → 0.5.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/README.md CHANGED
@@ -13,6 +13,23 @@ The editor extension binds inline-format toggles (`Mod` = Cmd on macOS, Ctrl els
13
13
  | `Mod-E` | `editor.commands.toggleCode()` | `` `code` `` |
14
14
  | `Mod-Shift-X` | `editor.commands.toggleDel()` | `~~strikethrough~~` |
15
15
 
16
+ Heading shortcuts toggle the current block to a heading of that level (or back to a paragraph):
17
+
18
+ | Key | Action |
19
+ | --------------------- | --------- |
20
+ | `Mod-1` / `Mod-Alt-1` | Heading 1 |
21
+ | `Mod-2` / `Mod-Alt-2` | Heading 2 |
22
+ | `Mod-3` / `Mod-Alt-3` | Heading 3 |
23
+ | `Mod-4` / `Mod-Alt-4` | Heading 4 |
24
+ | `Mod-5` / `Mod-Alt-5` | Heading 5 |
25
+ | `Mod-6` / `Mod-Alt-6` | Heading 6 |
26
+
27
+ `EDITOR_KEY_BINDINGS` is a literal (`as const`) object mapping every key above to its description, for host settings UIs and keybinding-collision checks.
28
+
29
+ ## Round-trip fidelity
30
+
31
+ `checkRoundTrip(markdown)` reports how faithfully markdown survives a parse-then-serialize round trip: `'exact'` (byte-identical modulo the trailing newline), `'normalizing'` (same non-blank lines, only blank-line layout differs), or `'lossy'` (a non-blank line changed, e.g. setext headings or raw HTML blocks). Hosts that keep markdown on disk can gate saves on it, opening lossy files read-only so a save never rewrites content.
32
+
16
33
  ## Styling
17
34
 
18
35
  `@meowdown/core/style.css` ships a default editor theme. Colors use `light-dark()`, so they follow the page's `color-scheme` (set `color-scheme: light dark` on `:root` for automatic dark mode). Customize by overriding these variables on `:root` or any ancestor:
@@ -25,6 +42,9 @@ The editor extension binds inline-format toggles (`Mod` = Cmd on macOS, Ctrl els
25
42
  - `--meowdown-border`: horizontal rules and table borders.
26
43
  - `--meowdown-code-bg`: code block background.
27
44
  - `--meowdown-table-header-bg`: table header row background.
45
+ - `--meowdown-image-max-height`: max height of rendered inline images.
46
+ - `--meowdown-image-radius`: corner radius of rendered inline images.
47
+ - `--meowdown-placeholder`: placeholder text color (defaults to `--meowdown-muted`).
28
48
  - `--meowdown-font-mono`: monospace font stack.
29
49
  - `--meowdown-gutter`: horizontal editor padding. Floating UI such as the block handle (in `@meowdown/react`) lives inside it; keep it at least `3.5rem`.
30
50
  - `--meowdown-selection`: text `::selection` background.
@@ -35,7 +55,9 @@ Selection colors are standalone variables, not derived from `--meowdown-accent`,
35
55
 
36
56
  Tags (`#tag`) render as pills via the `.md-tag` class, tinted from `--meowdown-accent`.
37
57
 
38
- Wikilinks (`[[target]]`) render with a dashed underline via the `.md-wikilink` class, colored by `--meowdown-accent`. Their `[[` `]]` brackets behave like other syntax characters: dimmed in show mode, hidden in hide and focus modes.
58
+ Wikilinks (`[[target]]`) render with a dashed underline via the `.md-wikilink` class, colored by `--meowdown-accent`, with a pointer cursor. Their `[[` `]]` brackets behave like other syntax characters: dimmed in show mode, hidden in hide and focus modes. Wire click navigation with `defineWikilinkClickHandler(({ target, event }) => ...)` (or `@meowdown/react`'s `onWikilinkClick` prop).
59
+
60
+ Inline images (`![alt](src)`) stay literal text and render beneath their line as a widget decoration when a host resolves the `src` to a URL. Add it with `defineImages({ resolveImageUrl, onImagePaste })` (or `@meowdown/react`'s image props).
39
61
 
40
62
  ## License
41
63
 
package/dist/index.d.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  import { Editor, PlainExtension } from "@prosekit/core";
2
+ import { CodeBlockAttrs } from "@prosekit/extensions/code-block";
2
3
  import { ProseMirrorNode } from "@prosekit/pm/model";
4
+ import { PlaceholderOptions, definePlaceholder } from "@prosekit/extensions/placeholder";
5
+ import { defineReadonly } from "@prosekit/extensions/readonly";
3
6
 
4
7
  //#region src/extensions/extension.d.ts
5
8
  declare function defineEditorExtensionImpl(): import("@prosekit/core").Union<readonly [import("@prosekit/extensions/paragraph").ParagraphExtension, import("@prosekit/extensions/doc").DocExtension, import("@prosekit/extensions/text").TextExtension, import("@prosekit/extensions/blockquote").BlockquoteExtension, import("@prosekit/extensions/list").ListExtension, import("@prosekit/extensions/heading").HeadingExtension, import("@prosekit/core").Union<readonly [import("@prosekit/extensions/table").TableSpecExtension, import("@prosekit/extensions/table").TableRowSpecExtension, import("@prosekit/extensions/table").TableCellSpecExtension, import("@prosekit/extensions/table").TableHeaderCellSpecExtension, import("@prosekit/core").PlainExtension, import("@prosekit/extensions/table").TableCommandsExtension, import("@prosekit/core").PlainExtension]>, import("@prosekit/extensions/code-block").CodeBlockExtension, import("@prosekit/extensions/horizontal-rule").HorizontalRuleExtension, import("@prosekit/core").Union<readonly [import("@prosekit/core").Extension<{
@@ -40,14 +43,14 @@ declare function defineEditorExtensionImpl(): import("@prosekit/core").Union<rea
40
43
  Marks: {
41
44
  mdWikilink: import("@prosekit/pm/model").Attrs;
42
45
  };
43
- }>]>, import("@prosekit/core").PlainExtension, import("@prosekit/core").Union<readonly [import("@prosekit/core").Extension<{
46
+ }>]>, import("@prosekit/core").Extension<import("@prosekit/core").ExtensionTyping<any, any, any>>, import("@prosekit/core").PlainExtension, import("@prosekit/core").Union<readonly [import("@prosekit/core").Extension<{
44
47
  Commands: {
45
48
  toggleEm: [];
46
49
  toggleStrong: [];
47
50
  toggleCode: [];
48
51
  toggleDel: [];
49
52
  };
50
- }>, import("@prosekit/core").PlainExtension]>, import("@prosekit/core").PlainExtension, import("@prosekit/core").BaseCommandsExtension, import("@prosekit/core").HistoryExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension]>;
53
+ }>, import("@prosekit/core").PlainExtension]>, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").BaseCommandsExtension, import("@prosekit/core").HistoryExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension, import("@prosekit/core").PlainExtension]>;
51
54
  type EditorExtension = ReturnType<typeof defineEditorExtensionImpl>;
52
55
  declare function defineEditorExtension(): EditorExtension;
53
56
  type TypedEditor = Editor<EditorExtension>;
@@ -64,6 +67,56 @@ type TypedEditor = Editor<EditorExtension>;
64
67
  type MarkMode = 'hide' | 'focus' | 'show';
65
68
  declare function defineMarkMode(mode: MarkMode): PlainExtension;
66
69
  //#endregion
70
+ //#region src/extensions/wikilink-click.d.ts
71
+ interface WikilinkClickPayload {
72
+ target: string;
73
+ event: MouseEvent;
74
+ }
75
+ type WikilinkClickHandler = (payload: WikilinkClickPayload) => void;
76
+ declare function defineWikilinkClickHandler(onClick: WikilinkClickHandler): PlainExtension;
77
+ //#endregion
78
+ //#region src/extensions/images.d.ts
79
+ interface ImageOptions {
80
+ /** Map a markdown `src` to a displayable URL, or `undefined` to skip rendering. */
81
+ resolveImageUrl: (src: string) => string | undefined;
82
+ /** Persist a pasted/dropped image file and return its markdown `src`, or `undefined` to decline. */
83
+ onImagePaste?: (file: File) => Promise<string | undefined>;
84
+ /** Called when persisting a pasted/dropped image throws. Defaults to `console.error`. */
85
+ onImageSaveError?: (error: Error, file: File) => void;
86
+ }
87
+ /** Inline image rendering (widget decorations) plus paste/drop persistence. */
88
+ declare function defineImages(options: ImageOptions): PlainExtension;
89
+ //#endregion
90
+ //#region src/extensions/key-bindings.d.ts
91
+ /** Human-readable descriptions of the editor's formatting and heading shortcuts. */
92
+ declare const EDITOR_KEY_BINDINGS: {
93
+ readonly 'Mod-b': "Bold";
94
+ readonly 'Mod-i': "Italic";
95
+ readonly 'Mod-e': "Inline code";
96
+ readonly 'Mod-Shift-x': "Strikethrough";
97
+ readonly 'Mod-1': "Heading 1";
98
+ readonly 'Mod-Alt-1': "Heading 1";
99
+ readonly 'Mod-2': "Heading 2";
100
+ readonly 'Mod-Alt-2': "Heading 2";
101
+ readonly 'Mod-3': "Heading 3";
102
+ readonly 'Mod-Alt-3': "Heading 3";
103
+ readonly 'Mod-4': "Heading 4";
104
+ readonly 'Mod-Alt-4': "Heading 4";
105
+ readonly 'Mod-5': "Heading 5";
106
+ readonly 'Mod-Alt-5': "Heading 5";
107
+ readonly 'Mod-6': "Heading 6";
108
+ readonly 'Mod-Alt-6': "Heading 6";
109
+ };
110
+ //#endregion
111
+ //#region src/extensions/code-block-languages.d.ts
112
+ /**
113
+ * A list of languages for code block syntax-highlight.
114
+ */
115
+ declare const codeBlockLanguages: ReadonlyArray<{
116
+ label: string;
117
+ value: string;
118
+ }>;
119
+ //#endregion
67
120
  //#region src/converters/pm-to-md.d.ts
68
121
  /**
69
122
  * Convert a ProseMirror document into a Markdown string.
@@ -95,4 +148,15 @@ declare function docToMarkdown(node: ProseMirrorNode): string;
95
148
  */
96
149
  declare function markdownToDoc(editor: TypedEditor, markdown: string): ProseMirrorNode;
97
150
  //#endregion
98
- export { type EditorExtension, type MarkMode, type TypedEditor, defineEditorExtension, defineMarkMode, docToMarkdown, markdownToDoc };
151
+ //#region src/converters/check-roundtrip.d.ts
152
+ /**
153
+ * How faithfully markdown survives a parse-then-serialize round trip:
154
+ * - `exact`: byte-identical (modulo the trailing newline).
155
+ * - `normalizing`: same non-blank lines, only blank-line layout differs.
156
+ * - `lossy`: a non-blank line changed, so content would be lost or altered.
157
+ */
158
+ type RoundTripFidelity = 'exact' | 'normalizing' | 'lossy';
159
+ /** Classify how `markdown` survives the editor's parse-then-serialize round trip. */
160
+ declare function checkRoundTrip(markdown: string): RoundTripFidelity;
161
+ //#endregion
162
+ export { type CodeBlockAttrs, EDITOR_KEY_BINDINGS, type EditorExtension, type ImageOptions, type MarkMode, type PlaceholderOptions, type RoundTripFidelity, type TypedEditor, type WikilinkClickHandler, type WikilinkClickPayload, checkRoundTrip, codeBlockLanguages, defineEditorExtension, defineImages, defineMarkMode, definePlaceholder, defineReadonly, defineWikilinkClickHandler, docToMarkdown, markdownToDoc };
package/dist/index.js CHANGED
@@ -1,14 +1,15 @@
1
- import{defineBaseCommands as e,defineBaseKeymap as t,defineCommands as n,defineHistory as r,defineKeymap as i,defineMarkSpec as a,definePlugin as o,union as s}from"@prosekit/core";import{defineBlockquote as c}from"@prosekit/extensions/blockquote";import{defineCodeBlock as l}from"@prosekit/extensions/code-block";import{defineDoc as u}from"@prosekit/extensions/doc";import{defineGapCursor as d}from"@prosekit/extensions/gap-cursor";import{defineHeading as ee}from"@prosekit/extensions/heading";import{defineHorizontalRule as te}from"@prosekit/extensions/horizontal-rule";import{defineList as ne}from"@prosekit/extensions/list";import{defineModClickPrevention as re}from"@prosekit/extensions/mod-click-prevention";import{defineParagraph as f}from"@prosekit/extensions/paragraph";import{defineText as ie}from"@prosekit/extensions/text";import{defineVirtualSelection as ae}from"@prosekit/extensions/virtual-selection";import{Plugin as p,PluginKey as m,TextSelection as h}from"@prosekit/pm/state";import{ReplaceStep as oe,Step as g,StepResult as _,Transform as v}from"@prosekit/pm/transform";import{Mark as se}from"@prosekit/pm/model";import{GFM as ce,parser as le}from"@lezer/markdown";import{defineTableCellSpec as ue,defineTableCommands as de,defineTableDropIndicator as fe,defineTableHeaderCellSpec as pe,defineTableRowSpec as me,defineTableSpec as he}from"@prosekit/extensions/table";import{tableEditing as ge}from"prosemirror-tables";import{Decoration as _e,DecorationSet as y}from"@prosekit/pm/view";function ve(e){let[t,n,r]=e;return[t,n,r.map(e=>e.toJSON())]}function ye(e,t){let[n,r,i]=t;return[n,r,i.map(t=>se.fromJSON(e,t))]}var b=class e extends g{constructor(e){super(),this.chunks=e}apply(e){if(this.chunks.length===0)return _.ok(e);let t=e.content.size,n;for(let[r,i,a]of this.chunks){if(r>=i)continue;let o=Math.max(0,Math.min(r,t)),s=Math.max(o,Math.min(i,t));o>=s||e.nodesBetween(o,s,(t,r)=>{if(!t.isText)return!0;let i=Math.max(o,r),c=Math.min(s,r+t.nodeSize);if(i>=c)return!1;let l=t.marks;for(let t of l)t.isInSet(a)||(n??=new v(e),n.removeMark(i,c,t));for(let t of a)t.isInSet(l)||(n??=new v(e),n.addMark(i,c,t));return!1})}return _.ok(n?n.doc:e)}invert(e){if(this.chunks.length===0)return be;let t=this.chunks[0][0],n=this.chunks[0][1];for(let[,e]of this.chunks)e>n&&(n=e);let r=e.content.size,i=Math.max(0,Math.min(t,r)),a=Math.max(i,Math.min(n,r));return new oe(i,a,e.slice(i,a),!1)}map(e){return null}toJSON(){return{stepType:`batchSetMark`,chunks:this.chunks.map(ve)}}static fromJSON(t,n){let r=n.chunks;return new e(r.map(e=>ye(t,e)))}};g.jsonID(`batchSetMark`,b);const be=new b([]);function xe(e){return e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||e===45||e===95||e>127&&/[\p{L}\p{N}]/u.test(String.fromCharCode(e))}function Se(e){return e>=65&&e<=90||e>=97&&e<=122||e>127&&/\p{L}/u.test(String.fromCharCode(e))}const Ce={defineNodes:[{name:`Hashtag`}],parseInline:[{name:`Hashtag`,parse(e,t,n){if(t!==35||!/\s|^$/.test(e.slice(n-1,n)))return-1;let r=n+1,i=!1;for(;r<e.end;){let t=e.char(r);if(!xe(t))break;i||=Se(t),r++}return i?e.addElement(e.elt(`Hashtag`,n,r)):-1}}]},we={defineNodes:[{name:`Wikilink`},{name:`WikilinkMark`}],parseInline:[{name:`Wikilink`,before:`Link`,parse(e,t,n){if(t!==91||e.char(n+1)!==91)return-1;let r=!1;for(let t=n+2;t<e.end-1;t++){let i=e.char(t);if(i===93){if(e.char(t+1)!==93||!r)return-1;let i=t+2;return e.addElement(e.elt(`Wikilink`,n,i,[e.elt(`WikilinkMark`,n,n+2),e.elt(`WikilinkMark`,t,i)]))}if(i===91||i===10)return-1;i!==32&&i!==9&&(r=!0)}return-1}}]};function Te(e){return e.end}const x=le.configure([ce,Ce,we]),Ee=x.configure({parseInline:[{name:`SkipInline`,before:`Escape`,parse:Te}]});function S(e){return x.parseInline(e,0)}function C(e,t,n=[]){for(let r of e)t(r)&&n.push(r),C(r.children,t,n);return n}function De(e){let t={};for(let n of e.nodeSet.types)t[n.name]=n.id;return t}const w=De(x);function Oe(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!e[n].eq(t[n]))return!1;return!0}const T=new Map([[w.Emphasis,`mdEm`],[w.StrongEmphasis,`mdStrong`],[w.InlineCode,`mdCode`],[w.Strikethrough,`mdDel`],[w.EmphasisMark,`mdMark`],[w.CodeMark,`mdMark`],[w.LinkMark,`mdMark`],[w.StrikethroughMark,`mdMark`],[w.URL,`mdLinkUri`],[w.Hashtag,`mdTag`],[w.Wikilink,`mdWikilink`],[w.WikilinkMark,`mdMark`]]);function ke(e,t){let n=S(t),r=[];return E(n,[],0,t.length,t,e,r),r}function E(e,t,n,r,i,a,o){let s=n;for(let n of e){if(n.from>s&&D(o,s,n.from,t),n.type===w.Link||n.type===w.Image)Ae(n,t,i,a,o);else{let e=T.get(n.type),r=e?[...t,a.marks[e].create()]:t;n.children.length===0?D(o,n.from,n.to,r):E(n.children,r,n.from,n.to,i,a,o)}s=n.to}s<r&&D(o,s,r,t)}function Ae(e,t,n,r,i){let a=-1,o=null,s=0;for(let t of e.children)t.type===w.LinkMark?(s++,s===2&&(a=t.from)):t.type===w.URL&&o===null&&(o=t);let c=o?n.slice(o.from,o.to):``,l=c&&r.marks.mdLinkText?r.marks.mdLinkText.create({href:c}):null,u=e=>a>=0&&e<a&&l!==null,d=e.from;for(let a of e.children){if(a.from>d){let e=u(d)?[...t,l]:t;D(i,d,a.from,e)}let e=u(a.from)?[...t,l]:t,o=T.get(a.type),s=o?[...e,r.marks[o].create()]:e;a.children.length===0?D(i,a.from,a.to,s):E(a.children,s,a.from,a.to,n,r,i),d=a.to}d<e.to&&D(i,d,e.to,t)}function D(e,t,n,r){if(t>=n)return;let i=e.at(-1);if(i&&i[1]===t&&Oe(i[2],r)){e[e.length-1]=[i[0],n,i[2]];return}e.push([t,n,r])}const O=`inline-marks-applied`,k=new WeakMap;let je=0,Me=0;function Ne(e,t,n){let r=k.get(e);if(r?Me++:(je++,r=ke(n,e.textContent),k.set(e,r)),t===0)return r;let i=[];for(let[e,n,a]of r)i.push([e+t,n+t,a]);return i}function Pe(e,t){let n=1/0,r=-1/0;for(let t of e)for(let e of t.mapping.maps)e.forEach((e,t,i,a)=>{i<n&&(n=i),a>r&&(r=a)});let i=t.doc.content.size;return n>r?{from:0,to:i}:{from:Math.max(0,n),to:Math.min(i,r)}}function Fe(e,t){let n=[];return e.doc.nodesBetween(t.from,t.to,(t,r)=>{if(t.type.spec.code)return!1;if(!t.isTextblock)return!0;if(t.childCount===0)return!1;let i=Ne(t,r+1,e.schema);return i.length>0&&n.push(...i),!1}),n}function Ie(){return new p({key:new m(`inline-mark`),appendTransaction(e,t,n){for(let t of e)if(t.getMeta(O))return null;let r=Fe(n,Pe(e,n));if(r.length===0)return null;let i=n.tr.step(new b(r));return i.setMeta(O,!0),i.setMeta(`addToHistory`,!1),i},view(e){return e.dispatch(Le(e.state)),{}}})}function Le(e){return e.tr.setMeta(`inline-marks-trigger`,!0)}function Re(){return o(Ie())}function ze(){return a({name:`mdMark`,inclusive:!1,toDOM:()=>[`span`,{class:`md-mark`},0],parseDOM:[{tag:`span.md-mark`}]})}function Be(){return a({name:`mdEm`,toDOM:()=>[`em`,0],parseDOM:[{tag:`em`}]})}function Ve(){return a({name:`mdStrong`,toDOM:()=>[`strong`,0],parseDOM:[{tag:`strong`}]})}function He(){return a({name:`mdCode`,toDOM:()=>[`code`,0],parseDOM:[{tag:`code`}]})}function Ue(){return a({name:`mdLinkText`,inclusive:!1,attrs:{href:{default:``}},toDOM:e=>[`a`,{href:e.attrs.href},0],parseDOM:[{tag:`a`,getAttrs:e=>({href:e.getAttribute(`href`)??``})}]})}function We(){return a({name:`mdLinkUri`,inclusive:!1,toDOM:()=>[`span`,{class:`md-link-uri`},0],parseDOM:[{tag:`span.md-link-uri`}]})}function Ge(){return a({name:`mdDel`,toDOM:()=>[`del`,0],parseDOM:[{tag:`del`}]})}function Ke(){return a({name:`mdTag`,toDOM:()=>[`span`,{class:`md-tag`},0],parseDOM:[{tag:`span.md-tag`}]})}function qe(){return a({name:`mdWikilink`,inclusive:!1,toDOM:()=>[`span`,{class:`md-wikilink`},0],parseDOM:[{tag:`span.md-wikilink`}]})}function Je(){return s(ze(),Be(),Ve(),He(),Ue(),We(),Ge(),Ke(),qe())}function A(e,t=0){let n=t,r=0;for(let t=0;t<e.length;t++)e.charCodeAt(t)===96?(r++,r>n&&(n=r)):r=0;return n}const j={em:{node:w.Emphasis,delim:`*`},strong:{node:w.StrongEmphasis,delim:`**`},code:{node:w.InlineCode,delim:"`"},del:{node:w.Strikethrough,delim:`~~`}},Ye=new Set([w.EmphasisMark,w.CodeMark,w.LinkMark,w.StrikethroughMark]);function M(e){return[e.children[0],e.children.at(-1)]}function N(e){let{type:t,children:n}=e;if(t===w.Emphasis||t===w.StrongEmphasis||t===w.Strikethrough)return[n[0].to,n.at(-1).from];if(t===w.Link||t===w.Image){let e=n.find((e,t)=>t>0&&e.type===w.LinkMark);return e?[n[0].to,e.from]:null}return null}function P(e,t,n){for(let r of e){if(r.to<=t||r.from>=n||t<=r.from&&r.to<=n)continue;let i=N(r);return i&&i[0]<=t&&n<=i[1]?P(r.children,t,n):P(e,Math.min(t,r.from),Math.max(n,r.to))}return[t,n]}function F(e,t,n){for(let r of e)if(!(r.to<=t||r.from>=n)&&(t>r.from||r.to>n))return F(e,Math.min(t,r.from),Math.max(n,r.to));return[t,n]}const I=e=>e===` `||e===` `;function Xe(e,t,n){for(;t<n&&I(e[t]);)t++;for(;n>t&&I(e[n-1]);)n--;return[t,n]}function Ze(e,t,n,r){let i=C(S(e),e=>e.type===r.node||Ye.has(e.type));for(let r=t;r<n;r++)if(!I(e[r])&&!i.some(e=>e.from<=r&&r<e.to))return!1;return!0}function Qe(e,t,n,r,i){let a=S(e),o=C(a,e=>e.type===r.node);return i?tt(e,o,t,n):$e(e,a,o,t,n,r)}function $e(e,t,n,r,i,a){for(let e=0;e!==i-r;){e=i-r,[r,i]=P(t,r,i);for(let e of n)e.to===r&&(r=e.from),e.from===i&&(i=e.to)}let o=[];for(let e of n)if(r<=e.from&&e.to<=i){let[t,n]=M(e);o.push({from:t.from,to:t.to,insert:``}),o.push({from:n.from,to:n.to,insert:``})}let[s,c]=et(e,r,i,o,a);return o.push({from:r,to:r,insert:s},{from:i,to:i,insert:c}),o}function et(e,t,n,r,i){if(i.node!==w.InlineCode)return[i.delim,i.delim];let a=e.slice(t,n);for(let e of[...r].sort((e,t)=>t.from-e.from))a=a.slice(0,e.from-t)+a.slice(e.to-t);let o="`".repeat(A(a)+1),s=a.startsWith("`")||a.endsWith("`")?` `:``;return[o+s,s+o]}function tt(e,t,n,r){let i=[];for(let a of t){if(a.to<=n||a.from>=r)continue;let[t,o]=M(a),s=Math.max(n,t.to),c=Math.min(r,o.from);for(s>=c&&([s,c]=[t.to,o.from]),[s,c]=F(a.children.slice(1,-1),s,c);s>t.to&&I(e[s-1]);)s--;for(;c<o.from&&I(e[c]);)c++;s>t.to?i.push({from:s,to:s,insert:e.slice(o.from,o.to)}):i.push({from:t.from,to:t.to,insert:``}),c<o.from?i.push({from:c,to:c,insert:e.slice(t.from,t.to)}):i.push({from:o.from,to:o.to,insert:``})}return i}function nt(e,t,n){let{delim:r}=n,i=r.length;if(e.slice(t-i,t)===r&&e.startsWith(r,t)&&e[t-i-1]!==r[0]&&e[t+i]!==r[0])return{kind:`unwrap`,from:t-i,to:t+i};let a=S(e),o=C(a,e=>e.type===n.node).findLast(e=>e.from<=t&&t<=e.to);if(o){let[e,n]=M(o);return{kind:`move`,pos:t===o.from?e.to:t===o.to?n.from:o.to}}return L(a,t)||e[t-1]===r[0]||e[t]===r[0]?null:{kind:`insert`,pos:t}}function L(e,t){for(let n of e)if(n.from<t&&t<n.to){let e=N(n);return!e||t<e[0]||t>e[1]?!0:L(n.children,t)}return!1}function R(e){return(t,n)=>{if(t.selection.empty)return rt(e,t,n);let{from:r,to:i,anchor:a,head:o}=t.selection,s=[];t.doc.nodesBetween(r,i,(t,n)=>{if(t.type.spec.code)return!1;if(!t.isTextblock)return!0;let a=t.textContent,o=n+1,[c,l]=Xe(a,Math.max(r-o,0),Math.min(i-o,a.length));return c<l&&s.push({text:a,base:o,from:c,to:l,active:Ze(a,c,l,e)}),!1});let c=s.length>0&&s.every(e=>e.active),l=s.filter(e=>c||!e.active).flatMap(t=>Qe(t.text,t.from,t.to,e,c).map(e=>({from:e.from+t.base,to:e.to+t.base,insert:e.insert})));if(l.length===0)return!1;if(n){let e=t.tr;l.sort((e,t)=>t.from-e.from||t.to-e.to);for(let t of l)t.insert?e.insertText(t.insert,t.from,t.to):e.delete(t.from,t.to);e.setSelection(h.create(e.doc,e.mapping.map(a,a<=o?1:-1),e.mapping.map(o,o<a?1:-1))),n(e.scrollIntoView())}return!0}}function rt(e,t,n){let{$from:r}=t.selection,i=r.parent;if(!i.isTextblock||i.type.spec.code)return!1;let a=nt(i.textContent,r.parentOffset,e);if(!a)return!1;if(n){let i=r.start(),o=t.tr;a.kind===`unwrap`&&o.delete(i+a.from,i+a.to),a.kind===`move`&&o.setSelection(h.create(o.doc,i+a.pos)),a.kind===`insert`&&(o.insertText(e.delim+e.delim,i+a.pos),o.setSelection(h.create(o.doc,i+a.pos+e.delim.length))),n(o.scrollIntoView())}return!0}function it(){return s(n({toggleEm:()=>R(j.em),toggleStrong:()=>R(j.strong),toggleCode:()=>R(j.code),toggleDel:()=>R(j.del)}),i({"Mod-b":R(j.strong),"Mod-i":R(j.em),"Mod-e":R(j.code),"Mod-Shift-x":R(j.del)}))}function at(){return s(he(),me(),ue(),pe(),o(ge()),de(),fe())}function ot(){return s(f(),u(),ie(),c(),ne(),ee(),at(),l(),te(),Je(),Re(),it(),t(),e(),r(),d(),ae(),re())}function st(){return ot()}const ct=new Set([`mdStrong`,`mdEm`,`mdCode`,`mdDel`,`mdLinkText`,`mdLinkUri`,`mdWikilink`]),lt=new Set([`mdMark`,`mdLinkUri`]),ut=new Set([`mdMark`,`mdLinkUri`]),z=new Set([`mdLinkText`,`mdLinkUri`]),dt=new Set([`mdStrong`,`mdEm`,`mdCode`,`mdDel`,`mdWikilink`]);function ft(e){return new p({key:new m(`mark-mode`),props:{attributes:{"data-mark-mode":e},decorations:e===`focus`?e=>ht(e):void 0,clipboardTextSerializer:e===`show`?void 0:mt}})}function pt(e){return o(ft(e))}function mt(e){let t=[];return e.content.forEach(e=>{let n=[];e.descendants(e=>!e.isText||!e.text?!0:(e.marks.some(e=>ut.has(e.type.name))||n.push(e.text),!1)),t.push(n.join(``))}),t.join(`
2
- `)}function ht(e){let{$anchor:t,empty:n}=e.selection;if(!n)return y.empty;let r=t.parent;if(!r.isTextblock)return null;let i=t.start(),a=t.parentOffset,o=gt(r,a);if(o.size===0)return y.empty;let s=[],c=new Set,l=!1;for(let e of o)if(z.has(e)){if(l)continue;l=!0,vt(r,i,a,s,c)}else _t(r,i,e,a,s,c);let u=s.map(([e,t])=>_e.inline(e,t,{class:`show`}));return y.create(e.doc,u)}function gt(e,t){let n=new Set,r=0;return e.forEach(e=>{let i=r+e.nodeSize;if(t>=r&&t<=i)for(let t of e.marks){let e=t.type.name;ct.has(e)&&n.add(e)}r=i}),n}function _t(e,t,n,r,i,a){let o=t,s=0,c=-1,l=-1;e.forEach(u=>{let d=u.marks.some(e=>e.type.name===n);d&&c===-1&&(c=o,l=s),!d&&c!==-1&&(r>=l&&r<=s&&V(e,t,c,o,i,a),c=-1,l=-1),o+=u.nodeSize,s+=u.nodeSize}),c!==-1&&r>=l&&r<=s&&V(e,t,c,o,i,a)}function vt(e,t,n,r,i){let a=e.childCount;if(a===0)return;let o=-1,s=0;for(let t=0;t<a;t++){let r=e.child(t),i=s+r.nodeSize;if(n>=s&&n<=i&&r.marks.some(e=>z.has(e.type.name))){o=t;break}s=i}if(o===-1)return;let c=o;for(;c>0&&B(e.child(c-1));)c--;let l=o;for(;l<a-1&&B(e.child(l+1));)l++;let u=t;for(let t=0;t<c;t++)u+=e.child(t).nodeSize;let d=u;for(let t=c;t<=l;t++)d+=e.child(t).nodeSize;V(e,t,u,d,r,i)}function B(e){let t=!1,n=!1,r=!1;for(let i of e.marks){let e=i.type.name;e===`mdMark`?t=!0:z.has(e)?n=!0:dt.has(e)&&(r=!0)}return!!(n||t&&!r)}function V(e,t,n,r,i,a){let o=t;e.forEach(e=>{let t=o,s=o+e.nodeSize;if(t>=n&&s<=r)for(let n of e.marks){let e=n.type.name;if(lt.has(e)){let e=`${t}_${s}`;a.has(e)||(a.add(e),i.push([t,s]));break}}o=s})}function yt(e){let t=new xt;return H(e,t),t.finish()}const bt=[``,`# `,`## `,`### `,`#### `,`##### `,`###### `];var xt=class{constructor(){this.parts=[],this.linePrefix=``,this.pendingFirst=null,this.atLineStart=!0,this.deferredBlankPrefix=null}write(e){if(e===``)return;if(this.emitDeferredBlankLine(),this.atLineStart&&=(this.parts.push(this.pendingFirst??this.linePrefix),this.pendingFirst=null,!1),!e.includes(`
1
+ import{createEditor as e,defineBaseCommands as t,defineBaseKeymap as n,defineCommands as r,defineHistory as i,defineKeymap as a,defineMarkSpec as o,definePlugin as s,getMarkType as c,isApple as l,toggleNode as u,union as d,withSkipCodeBlock as ee}from"@prosekit/core";import{defineBlockquote as te}from"@prosekit/extensions/blockquote";import{defineCodeBlock as ne,defineCodeBlockHighlight as re}from"@prosekit/extensions/code-block";import{defineDoc as ie}from"@prosekit/extensions/doc";import{defineGapCursor as ae}from"@prosekit/extensions/gap-cursor";import{defineHeading as oe}from"@prosekit/extensions/heading";import{defineHorizontalRule as se}from"@prosekit/extensions/horizontal-rule";import{defineList as ce}from"@prosekit/extensions/list";import{defineModClickPrevention as le}from"@prosekit/extensions/mod-click-prevention";import{defineParagraph as ue}from"@prosekit/extensions/paragraph";import{defineText as de}from"@prosekit/extensions/text";import{defineVirtualSelection as fe}from"@prosekit/extensions/virtual-selection";import{LanguageDescription as pe}from"@codemirror/language";import{languages as me}from"@codemirror/language-data";import{classHighlighter as he}from"@lezer/highlight";import{createParser as ge}from"prosemirror-highlight/lezer";import{Plugin as f,PluginKey as p,TextSelection as m}from"@prosekit/pm/state";import{ReplaceStep as _e,Step as h,StepResult as ve,Transform as g}from"@prosekit/pm/transform";import{Mark as ye}from"@prosekit/pm/model";import{GFM as be,parser as xe}from"@lezer/markdown";import{defineTableCellSpec as Se,defineTableCommands as Ce,defineTableDropIndicator as we,defineTableHeaderCellSpec as Te,defineTableRowSpec as Ee,defineTableSpec as De}from"@prosekit/extensions/table";import{tableEditing as Oe}from"prosemirror-tables";import{Decoration as _,DecorationSet as v}from"@prosekit/pm/view";import{definePlaceholder as ke}from"@prosekit/extensions/placeholder";import{defineReadonly as Ae}from"@prosekit/extensions/readonly";const y=new Map;async function je(e){let t=pe.matchLanguageName(me,e,!0);if(!t){y.set(e,null);return}let n=t.support;if(!n)try{n=await t.load()}catch(t){console.error(`[meowdown] Failed to load language "${e}":`,t),y.set(e,null)}if(y.has(e))return;if(!n){y.set(e,null);return}let r=ge({parse:e=>n.language.parser.parse(e.content),highlighter:he});y.set(e,r)}const Me=e=>{let t=e.language?.trim();if(!t)return[];let n=y.get(t);return n?n(e):n===null?[]:je(t)};function Ne(){return re({parser:Me,nodeTypes:[`codeBlock`]})}const Pe=[1,2,3,4,5,6];function Fe(){return a(Object.fromEntries(Pe.map(e=>[`Mod-${e}`,ee(u({type:`heading`,attrs:{level:e}}))])))}function Ie(e){let[t,n,r]=e;return[t,n,r.map(e=>e.toJSON())]}function Le(e,t){let[n,r,i]=t;return[n,r,i.map(t=>ye.fromJSON(e,t))]}var b=class e extends h{constructor(e){super(),this.chunks=e}apply(e){if(this.chunks.length===0)return ve.ok(e);let t=e.content.size,n;for(let[r,i,a]of this.chunks){if(r>=i)continue;let o=Math.max(0,Math.min(r,t)),s=Math.max(o,Math.min(i,t));o>=s||e.nodesBetween(o,s,(t,r)=>{if(!t.isText)return!0;let i=Math.max(o,r),c=Math.min(s,r+t.nodeSize);if(i>=c)return!1;let l=t.marks;for(let t of l)t.isInSet(a)||(n??=new g(e),n.removeMark(i,c,t));for(let t of a)t.isInSet(l)||(n??=new g(e),n.addMark(i,c,t));return!1})}return ve.ok(n?n.doc:e)}invert(e){if(this.chunks.length===0)return Re;let t=this.chunks[0][0],n=this.chunks[0][1];for(let[,e]of this.chunks)e>n&&(n=e);let r=e.content.size,i=Math.max(0,Math.min(t,r)),a=Math.max(i,Math.min(n,r));return new _e(i,a,e.slice(i,a),!1)}map(e){return null}toJSON(){return{stepType:`batchSetMark`,chunks:this.chunks.map(Ie)}}static fromJSON(t,n){let r=n.chunks;return new e(r.map(e=>Le(t,e)))}};h.jsonID(`batchSetMark`,b);const Re=new b([]);function ze(e){return e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||e===45||e===95||e>127&&/[\p{L}\p{N}]/u.test(String.fromCharCode(e))}function Be(e){return e>=65&&e<=90||e>=97&&e<=122||e>127&&/\p{L}/u.test(String.fromCharCode(e))}const Ve={defineNodes:[{name:`Hashtag`}],parseInline:[{name:`Hashtag`,parse(e,t,n){if(t!==35||!/\s|^$/.test(e.slice(n-1,n)))return-1;let r=n+1,i=!1;for(;r<e.end;){let t=e.char(r);if(!ze(t))break;i||=Be(t),r++}return i?e.addElement(e.elt(`Hashtag`,n,r)):-1}}]},He={defineNodes:[{name:`Wikilink`},{name:`WikilinkMark`}],parseInline:[{name:`Wikilink`,before:`Link`,parse(e,t,n){if(t!==91||e.char(n+1)!==91)return-1;let r=!1;for(let t=n+2;t<e.end-1;t++){let i=e.char(t);if(i===93){if(e.char(t+1)!==93||!r)return-1;let i=t+2;return e.addElement(e.elt(`Wikilink`,n,i,[e.elt(`WikilinkMark`,n,n+2),e.elt(`WikilinkMark`,t,i)]))}if(i===91||i===10)return-1;i!==32&&i!==9&&(r=!0)}return-1}}]};function Ue(e){return e.end}const x=xe.configure([be,Ve,He]),We=x.configure({parseInline:[{name:`SkipInline`,before:`Escape`,parse:Ue}]});function S(e){return x.parseInline(e,0)}function C(e,t,n=[]){for(let r of e)t(r)&&n.push(r),C(r.children,t,n);return n}function Ge(e){let t={};for(let n of e.nodeSet.types)t[n.name]=n.id;return t}const w=Ge(x);function Ke(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!e[n].eq(t[n]))return!1;return!0}const T=new Map([[w.Emphasis,`mdEm`],[w.StrongEmphasis,`mdStrong`],[w.InlineCode,`mdCode`],[w.Strikethrough,`mdDel`],[w.EmphasisMark,`mdMark`],[w.CodeMark,`mdMark`],[w.LinkMark,`mdMark`],[w.StrikethroughMark,`mdMark`],[w.URL,`mdLinkUri`],[w.Hashtag,`mdTag`],[w.Wikilink,`mdWikilink`],[w.WikilinkMark,`mdMark`]]);function qe(e,t){let n=S(t),r=[];return E(n,[],0,t.length,t,e,r),r}function E(e,t,n,r,i,a,o){let s=n;for(let n of e){if(n.from>s&&D(o,s,n.from,t),n.type===w.Link||n.type===w.Image)Je(n,t,i,a,o);else{let e=T.get(n.type),r=e?[...t,a.marks[e].create()]:t;n.children.length===0?D(o,n.from,n.to,r):E(n.children,r,n.from,n.to,i,a,o)}s=n.to}s<r&&D(o,s,r,t)}function Je(e,t,n,r,i){let a=-1,o=null,s=0;for(let t of e.children)t.type===w.LinkMark?(s++,s===2&&(a=t.from)):t.type===w.URL&&o===null&&(o=t);let c=o?n.slice(o.from,o.to):``,l=c&&r.marks.mdLinkText?r.marks.mdLinkText.create({href:c}):null,u=e=>a>=0&&e<a&&l!==null,d=e.from;for(let a of e.children){if(a.from>d){let e=u(d)?[...t,l]:t;D(i,d,a.from,e)}let e=u(a.from)?[...t,l]:t,o=T.get(a.type),s=o?[...e,r.marks[o].create()]:e;a.children.length===0?D(i,a.from,a.to,s):E(a.children,s,a.from,a.to,n,r,i),d=a.to}d<e.to&&D(i,d,e.to,t)}function D(e,t,n,r){if(t>=n)return;let i=e.at(-1);if(i&&i[1]===t&&Ke(i[2],r)){e[e.length-1]=[i[0],n,i[2]];return}e.push([t,n,r])}const O=`inline-marks-applied`,Ye=new WeakMap;let Xe=0,Ze=0;function Qe(e,t,n){let r=Ye.get(e);if(r?Ze++:(Xe++,r=qe(n,e.textContent),Ye.set(e,r)),t===0)return r;let i=[];for(let[e,n,a]of r)i.push([e+t,n+t,a]);return i}function $e(e,t){let n=1/0,r=-1/0;for(let t of e)for(let e of t.mapping.maps)e.forEach((e,t,i,a)=>{i<n&&(n=i),a>r&&(r=a)});let i=t.doc.content.size;return n>r?{from:0,to:i}:{from:Math.max(0,n),to:Math.min(i,r)}}function et(e,t){let n=[];return e.doc.nodesBetween(t.from,t.to,(t,r)=>{if(t.type.spec.code)return!1;if(!t.isTextblock)return!0;if(t.childCount===0)return!1;let i=Qe(t,r+1,e.schema);return i.length>0&&n.push(...i),!1}),n}function tt(){return new f({key:new p(`inline-mark`),appendTransaction(e,t,n){for(let t of e)if(t.getMeta(O))return null;let r=et(n,$e(e,n));if(r.length===0)return null;let i=n.tr.step(new b(r));return i.setMeta(O,!0),i.setMeta(`addToHistory`,!1),i},view(e){return e.dispatch(nt(e.state)),{}}})}function nt(e){return e.tr.setMeta(`inline-marks-trigger`,!0)}function rt(){return s(tt())}function it(){return o({name:`mdMark`,inclusive:!1,toDOM:()=>[`span`,{class:`md-mark`},0],parseDOM:[{tag:`span.md-mark`}]})}function at(){return o({name:`mdEm`,toDOM:()=>[`em`,0],parseDOM:[{tag:`em`}]})}function ot(){return o({name:`mdStrong`,toDOM:()=>[`strong`,0],parseDOM:[{tag:`strong`}]})}function st(){return o({name:`mdCode`,toDOM:()=>[`code`,0],parseDOM:[{tag:`code`}]})}function ct(){return o({name:`mdLinkText`,inclusive:!1,attrs:{href:{default:``}},toDOM:e=>[`a`,{href:e.attrs.href},0],parseDOM:[{tag:`a`,getAttrs:e=>({href:e.getAttribute(`href`)??``})}]})}function lt(){return o({name:`mdLinkUri`,inclusive:!1,toDOM:()=>[`span`,{class:`md-link-uri`},0],parseDOM:[{tag:`span.md-link-uri`}]})}function ut(){return o({name:`mdDel`,toDOM:()=>[`del`,0],parseDOM:[{tag:`del`}]})}function dt(){return o({name:`mdTag`,toDOM:()=>[`span`,{class:`md-tag`},0],parseDOM:[{tag:`span.md-tag`}]})}function ft(){return o({name:`mdWikilink`,inclusive:!1,toDOM:()=>[`span`,{class:`md-wikilink`},0],parseDOM:[{tag:`span.md-wikilink`}]})}function pt(){return d(it(),at(),ot(),st(),ct(),lt(),ut(),dt(),ft())}function k(e,t=0){let n=t,r=0;for(let t=0;t<e.length;t++)e.charCodeAt(t)===96?(r++,r>n&&(n=r)):r=0;return n}const A={em:{node:w.Emphasis,delim:`*`},strong:{node:w.StrongEmphasis,delim:`**`},code:{node:w.InlineCode,delim:"`"},del:{node:w.Strikethrough,delim:`~~`}},mt=new Set([w.EmphasisMark,w.CodeMark,w.LinkMark,w.StrikethroughMark]);function j(e){return[e.children[0],e.children.at(-1)]}function M(e){let{type:t,children:n}=e;if(t===w.Emphasis||t===w.StrongEmphasis||t===w.Strikethrough)return[n[0].to,n.at(-1).from];if(t===w.Link||t===w.Image){let e=n.find((e,t)=>t>0&&e.type===w.LinkMark);return e?[n[0].to,e.from]:null}return null}function N(e,t,n){for(let r of e){if(r.to<=t||r.from>=n||t<=r.from&&r.to<=n)continue;let i=M(r);return i&&i[0]<=t&&n<=i[1]?N(r.children,t,n):N(e,Math.min(t,r.from),Math.max(n,r.to))}return[t,n]}function P(e,t,n){for(let r of e)if(!(r.to<=t||r.from>=n)&&(t>r.from||r.to>n))return P(e,Math.min(t,r.from),Math.max(n,r.to));return[t,n]}const F=e=>e===` `||e===` `;function ht(e,t,n){for(;t<n&&F(e[t]);)t++;for(;n>t&&F(e[n-1]);)n--;return[t,n]}function gt(e,t,n,r){let i=C(S(e),e=>e.type===r.node||mt.has(e.type));for(let r=t;r<n;r++)if(!F(e[r])&&i.every(e=>!(e.from<=r&&r<e.to)))return!1;return!0}function _t(e,t,n,r,i){let a=S(e),o=C(a,e=>e.type===r.node);return i?bt(e,o,t,n):vt(e,a,o,t,n,r)}function vt(e,t,n,r,i,a){for(let e=0;e!==i-r;){e=i-r,[r,i]=N(t,r,i);for(let e of n)e.to===r&&(r=e.from),e.from===i&&(i=e.to)}let o=[];for(let e of n)if(r<=e.from&&e.to<=i){let[t,n]=j(e);o.push({from:t.from,to:t.to,insert:``}),o.push({from:n.from,to:n.to,insert:``})}let[s,c]=yt(e,r,i,o,a);return o.push({from:r,to:r,insert:s},{from:i,to:i,insert:c}),o}function yt(e,t,n,r,i){if(i.node!==w.InlineCode)return[i.delim,i.delim];let a=e.slice(t,n);for(let e of[...r].sort((e,t)=>t.from-e.from))a=a.slice(0,e.from-t)+a.slice(e.to-t);let o="`".repeat(k(a)+1),s=a.startsWith("`")||a.endsWith("`")?` `:``;return[o+s,s+o]}function bt(e,t,n,r){let i=[];for(let a of t){if(a.to<=n||a.from>=r)continue;let[t,o]=j(a),s=Math.max(n,t.to),c=Math.min(r,o.from);for(s>=c&&([s,c]=[t.to,o.from]),[s,c]=P(a.children.slice(1,-1),s,c);s>t.to&&F(e[s-1]);)s--;for(;c<o.from&&F(e[c]);)c++;s>t.to?i.push({from:s,to:s,insert:e.slice(o.from,o.to)}):i.push({from:t.from,to:t.to,insert:``}),c<o.from?i.push({from:c,to:c,insert:e.slice(t.from,t.to)}):i.push({from:o.from,to:o.to,insert:``})}return i}function xt(e,t,n){let{delim:r}=n,i=r.length;if(e.slice(t-i,t)===r&&e.startsWith(r,t)&&e[t-i-1]!==r[0]&&e[t+i]!==r[0])return{kind:`unwrap`,from:t-i,to:t+i};let a=S(e),o=C(a,e=>e.type===n.node).findLast(e=>e.from<=t&&t<=e.to);if(o){let[e,n]=j(o);return{kind:`move`,pos:t===o.from?e.to:t===o.to?n.from:o.to}}return I(a,t)||e[t-1]===r[0]||e[t]===r[0]?null:{kind:`insert`,pos:t}}function I(e,t){for(let n of e)if(n.from<t&&t<n.to){let e=M(n);return!e||t<e[0]||t>e[1]?!0:I(n.children,t)}return!1}function L(e){return(t,n)=>{if(t.selection.empty)return St(e,t,n);let{from:r,to:i,anchor:a,head:o}=t.selection,s=[];t.doc.nodesBetween(r,i,(t,n)=>{if(t.type.spec.code)return!1;if(!t.isTextblock)return!0;let a=t.textContent,o=n+1,[c,l]=ht(a,Math.max(r-o,0),Math.min(i-o,a.length));return c<l&&s.push({text:a,base:o,from:c,to:l,active:gt(a,c,l,e)}),!1});let c=s.length>0&&s.every(e=>e.active),l=s.filter(e=>c||!e.active).flatMap(t=>_t(t.text,t.from,t.to,e,c).map(e=>({from:e.from+t.base,to:e.to+t.base,insert:e.insert})));if(l.length===0)return!1;if(n){let e=t.tr;l.sort((e,t)=>t.from-e.from||t.to-e.to);for(let t of l)t.insert?e.insertText(t.insert,t.from,t.to):e.delete(t.from,t.to);e.setSelection(m.create(e.doc,e.mapping.map(a,a<=o?1:-1),e.mapping.map(o,o<a?1:-1))),n(e.scrollIntoView())}return!0}}function St(e,t,n){let{$from:r}=t.selection,i=r.parent;if(!i.isTextblock||i.type.spec.code)return!1;let a=xt(i.textContent,r.parentOffset,e);if(!a)return!1;if(n){let i=r.start(),o=t.tr;a.kind===`unwrap`&&o.delete(i+a.from,i+a.to),a.kind===`move`&&o.setSelection(m.create(o.doc,i+a.pos)),a.kind===`insert`&&(o.insertText(e.delim+e.delim,i+a.pos),o.setSelection(m.create(o.doc,i+a.pos+e.delim.length))),n(o.scrollIntoView())}return!0}function Ct(){return d(r({toggleEm:()=>L(A.em),toggleStrong:()=>L(A.strong),toggleCode:()=>L(A.code),toggleDel:()=>L(A.del)}),a({"Mod-b":L(A.strong),"Mod-i":L(A.em),"Mod-e":L(A.code),"Mod-Shift-x":L(A.del)}))}function wt(){return d(De(),Ee(),Se(),Te(),s(Oe()),Ce(),we())}function Tt(){return d(ue(),ie(),de(),te(),ce(),oe(),wt(),ne(),se(),pt(),Ne(),rt(),Ct(),Fe(),n(),t(),i(),ae(),fe(),le())}function R(){return Tt()}const Et=new Set([`mdStrong`,`mdEm`,`mdCode`,`mdDel`,`mdLinkText`,`mdLinkUri`,`mdWikilink`]),Dt=new Set([`mdMark`,`mdLinkUri`]),Ot=new Set([`mdMark`,`mdLinkUri`]),z=new Set([`mdLinkText`,`mdLinkUri`]),kt=new Set([`mdStrong`,`mdEm`,`mdCode`,`mdDel`,`mdWikilink`]);function At(e){return new f({key:new p(`mark-mode`),props:{attributes:{"data-mark-mode":e},decorations:e===`focus`?e=>Nt(e):void 0,clipboardTextSerializer:e===`show`?void 0:Mt}})}function jt(e){return s(At(e))}function Mt(e){let t=[];return e.content.forEach(e=>{let n=[];e.descendants(e=>!e.isText||!e.text?!0:(e.marks.some(e=>Ot.has(e.type.name))||n.push(e.text),!1)),t.push(n.join(``))}),t.join(`
2
+ `)}function Nt(e){let{$anchor:t,empty:n}=e.selection;if(!n)return v.empty;let r=t.parent;if(!r.isTextblock)return null;let i=t.start(),a=t.parentOffset,o=Pt(r,a);if(o.size===0)return v.empty;let s=[],c=new Set,l=!1;for(let e of o)if(z.has(e)){if(l)continue;l=!0,It(r,i,a,s,c)}else Ft(r,i,e,a,s,c);let u=s.map(([e,t])=>_.inline(e,t,{class:`show`}));return v.create(e.doc,u)}function Pt(e,t){let n=new Set,r=0;return e.forEach(e=>{let i=r+e.nodeSize;if(t>=r&&t<=i)for(let t of e.marks){let e=t.type.name;Et.has(e)&&n.add(e)}r=i}),n}function Ft(e,t,n,r,i,a){let o=t,s=0,c=-1,l=-1;e.forEach(u=>{let d=u.marks.some(e=>e.type.name===n);d&&c===-1&&(c=o,l=s),!d&&c!==-1&&(r>=l&&r<=s&&V(e,t,c,o,i,a),c=-1,l=-1),o+=u.nodeSize,s+=u.nodeSize}),c!==-1&&r>=l&&r<=s&&V(e,t,c,o,i,a)}function It(e,t,n,r,i){let a=e.childCount;if(a===0)return;let o=-1,s=0;for(let t=0;t<a;t++){let r=e.child(t),i=s+r.nodeSize;if(n>=s&&n<=i&&r.marks.some(e=>z.has(e.type.name))){o=t;break}s=i}if(o===-1)return;let c=o;for(;c>0&&B(e.child(c-1));)c--;let l=o;for(;l<a-1&&B(e.child(l+1));)l++;let u=t;for(let t=0;t<c;t++)u+=e.child(t).nodeSize;let d=u;for(let t=c;t<=l;t++)d+=e.child(t).nodeSize;V(e,t,u,d,r,i)}function B(e){let t=!1,n=!1,r=!1;for(let i of e.marks){let e=i.type.name;e===`mdMark`?t=!0:z.has(e)?n=!0:kt.has(e)&&(r=!0)}return!!(n||t&&!r)}function V(e,t,n,r,i,a){let o=t;e.forEach(e=>{let t=o,s=o+e.nodeSize;if(t>=n&&s<=r)for(let n of e.marks){let e=n.type.name;if(Dt.has(e)){let e=`${t}_${s}`;a.has(e)||(a.add(e),i.push([t,s]));break}}o=s})}const Lt=new p(`meowdown-wikilink-click`);function Rt(e,t){let n=c(e.schema,`mdWikilink`),r=e.doc.resolve(t),i=r.parent;if(!i.isTextblock||i.type.spec.code)return;let a=r.start(),o=-1,s=-1,l,u=0;if(i.forEach(e=>{let r=a+u;u+=e.nodeSize;let i=a+u;n.isInSet(e.marks)?(o<0&&(o=r),s=i):(o>=0&&o<=t&&t<=s&&(l={from:o,to:s}),o=-1)}),o>=0&&o<=t&&t<=s&&(l={from:o,to:s}),l)return{from:l.from,to:l.to,target:zt(e.doc.textBetween(l.from,l.to))}}function zt(e){let t=e.replace(/^\[\[/u,``).replace(/\]\]$/u,``),n=t.indexOf(`|`);return(n>=0?t.slice(0,n):t).trim()}function Bt(e){let t;return s(new f({key:Lt,props:{handleDOMEvents:{mousedown:e=>{let{from:n,to:r,empty:i}=e.state.selection;return t={from:n,to:r,empty:i},!1}},handleClick:(n,r,i)=>{if(!i.target?.closest?.(`.md-wikilink`))return!1;let a=Rt(n.state,r);return!a||!(l?i.metaKey:i.ctrlKey)&&t?.empty&&t.from>=a.from&&t.to<=a.to?!1:(e({target:a.target,event:i}),!0)}}}))}function Vt(e){let t=[],n=C(S(e),e=>e.type===w.Image);for(let r of n){let n=r.children.find(e=>e.type===w.URL),i=r.children.filter(e=>e.type===w.LinkMark);!n||i.length<2||t.push({from:r.from,to:r.to,alt:e.slice(i[0].to,i[1].from),src:e.slice(n.from,n.to)})}return t}const H=new p(`meowdown-images`);function Ht(e){let t=[];return e.doc.descendants((e,n)=>{if(e.type.spec.code)return!1;if(!e.isTextblock)return!0;if(e.childCount===0)return!1;let r=!0;if(e.forEach(e=>{e.isText||(r=!1)}),!r)return!1;for(let r of Vt(e.textContent))t.push({widgetAt:n+e.nodeSize-1,alt:r.alt,src:r.src});return!1}),t}function U(e,t){let n=[];for(let r of Ht(e)){let e=t.resolveImageUrl(r.src);e&&n.push(_.widget(r.widgetAt,()=>{let t=document.createElement(`div`);t.className=`md-image`,t.contentEditable=`false`;let n=document.createElement(`img`);return n.src=e,n.alt=r.alt,n.draggable=!1,t.appendChild(n),t},{key:`md-image:${e}`,side:1}))}return v.create(e.doc,n)}function Ut(e){return new f({key:H,state:{init:(t,n)=>U(n,e),apply:(t,n,r,i)=>t.docChanged?U(i,e):n},props:{decorations:e=>H.getState(e)}})}function W(e){return e?Array.from(e.files).filter(e=>e.type.startsWith(`image/`)):[]}function Wt(e,t,n){e.onImageSaveError?e.onImageSaveError(t,n):console.error(`[meowdown] failed to save pasted image:`,t)}async function G(e,t,n,r){let i=r;for(let r of t){let t;try{t=await n.onImagePaste(r)}catch(e){Wt(n,e,r);continue}if(!t||e.isDestroyed)continue;let a=`![](${t})`,o=i==null?e.state.tr.insertText(a):e.state.tr.insertText(a,i);e.dispatch(o),i!=null&&(i+=a.length)}}function Gt(e){return new f({props:{handlePaste:(t,n)=>{let r=W(n.clipboardData),i=e.onImagePaste;return r.length===0||!i?!1:(G(t,r,{...e,onImagePaste:i}),!0)},handleDrop:(t,n)=>{let r=W(n.dataTransfer),i=e.onImagePaste;if(r.length===0||!i)return!1;let a=t.posAtCoords({left:n.clientX,top:n.clientY});return G(t,r,{...e,onImagePaste:i},a?.pos),!0}}})}function Kt(e){return d(s(Ut(e)),s(Gt(e)))}const qt={"Mod-b":`Bold`,"Mod-i":`Italic`,"Mod-e":`Inline code`,"Mod-Shift-x":`Strikethrough`,"Mod-1":`Heading 1`,"Mod-Alt-1":`Heading 1`,"Mod-2":`Heading 2`,"Mod-Alt-2":`Heading 2`,"Mod-3":`Heading 3`,"Mod-Alt-3":`Heading 3`,"Mod-4":`Heading 4`,"Mod-Alt-4":`Heading 4`,"Mod-5":`Heading 5`,"Mod-Alt-5":`Heading 5`,"Mod-6":`Heading 6`,"Mod-Alt-6":`Heading 6`},Jt=new Set([`MscGen`,`Xù`,`MsGenny`,`Angular Template`]),Yt=me.map(e=>e.name).filter(e=>!Jt.has(e)).map(e=>({label:e,value:e.toLowerCase()})).concat({label:`Plain text`,value:``}).sort((e,t)=>e.label.localeCompare(t.label));function K(e){let t=new Zt;return q(e,t),t.finish()}const Xt=[``,`# `,`## `,`### `,`#### `,`##### `,`###### `];var Zt=class{constructor(){this.parts=[],this.linePrefix=``,this.pendingFirst=null,this.atLineStart=!0,this.deferredBlankPrefix=null}write(e){if(e===``)return;if(this.emitDeferredBlankLine(),this.atLineStart&&=(this.parts.push(this.pendingFirst??this.linePrefix),this.pendingFirst=null,!1),!e.includes(`
3
3
  `)){this.parts.push(e);return}let t=e.split(`
4
4
  `);for(let e=0;e<t.length;e++)e>0&&this.parts.push(`
5
5
  `,this.linePrefix),t[e]!==``&&this.parts.push(t[e])}closeBlock(){this.atLineStart||this.parts.push(`
6
6
  `),this.atLineStart=!0,this.deferredBlankPrefix=this.linePrefix}suppressBlank(){this.deferredBlankPrefix=null}withPrefix(e,t,n){let r=this.linePrefix,i=this.pendingFirst;if(this.linePrefix=r+e,t!==null){let e=i??r;this.pendingFirst=e+t}n(),this.linePrefix=r,this.pendingFirst=i}finish(){return this.parts.join(``).replace(/\s+$/,``)+`
7
7
  `}emitDeferredBlankLine(){let e=this.deferredBlankPrefix;e!==null&&(this.parts.push(e.trimEnd(),`
8
- `),this.deferredBlankPrefix=null)}};function H(e,t){switch(e.type.name){case`doc`:U(e,t);return;case`paragraph`:G(e,t),t.closeBlock();return;case`heading`:{let n=e.attrs.level;t.write(bt[n]??`# `),G(e,t),t.closeBlock();return}case`blockquote`:t.withPrefix(`> `,`> `,()=>U(e,t)),t.closeBlock();return;case`list`:K(e,t,W(e));return;case`codeBlock`:Ct(e,t);return;case`horizontalRule`:t.write(`---`),t.closeBlock();return;case`table`:wt(e,t);return;case`text`:e.text&&t.write(e.text);return}}function U(e,t,n=!1){let r=e.childCount,i=0;for(;i<r;){let a=e.child(i);if(a.type.name!==`list`){n&&i>0&&t.suppressBlank(),H(a,t),i++;continue}let o=i+1;for(;o<r&&e.child(o).type.name===`list`;)o++;let s=St(e,i,o);for(let r=i;r<o;r++)(r===i?n&&i>0:s)&&t.suppressBlank(),K(e.child(r),t,s);i=o}}function St(e,t,n){for(let r=t;r<n;r++)if(!W(e.child(r)))return!1;return!0}function W(e){let t=e.childCount;for(let n=0;n<t;n++){let t=e.child(n);if(t.type.name!==`list`&&!(t.type.name===`paragraph`&&n===0))return!1}return!0}function G(e,t){let n=e.childCount;for(let r=0;r<n;r++){let n=e.child(r);n.isText&&n.text&&t.write(n.text)}}function K(e,t,n){let r=e.attrs,i=r.kind===`ordered`?`${r.order??1}. `:r.kind===`task`?r.checked?`- [x] `:`- [ ] `:`- `,a=` `.repeat(r.kind===`task`?2:i.length);t.withPrefix(a,i,()=>U(e,t,n)),t.closeBlock()}function Ct(e,t){let n=e.attrs.language??``,r=e.textContent,i="`".repeat(A(r,2)+1);t.write(i),n&&t.write(n),t.write(`
8
+ `),this.deferredBlankPrefix=null)}};function q(e,t){switch(e.type.name){case`doc`:J(e,t);return;case`paragraph`:X(e,t),t.closeBlock();return;case`heading`:{let n=e.attrs.level;t.write(Xt[n]??`# `),X(e,t),t.closeBlock();return}case`blockquote`:t.withPrefix(`> `,`> `,()=>J(e,t)),t.closeBlock();return;case`list`:Z(e,t,Y(e));return;case`codeBlock`:$t(e,t);return;case`horizontalRule`:t.write(`---`),t.closeBlock();return;case`table`:en(e,t);return;case`text`:e.text&&t.write(e.text);return}}function J(e,t,n=!1){let r=e.childCount,i=0;for(;i<r;){let a=e.child(i);if(a.type.name!==`list`){n&&i>0&&t.suppressBlank(),q(a,t),i++;continue}let o=i+1;for(;o<r&&e.child(o).type.name===`list`;)o++;let s=Qt(e,i,o);for(let r=i;r<o;r++)(r===i?n&&i>0:s)&&t.suppressBlank(),Z(e.child(r),t,s);i=o}}function Qt(e,t,n){for(let r=t;r<n;r++)if(!Y(e.child(r)))return!1;return!0}function Y(e){let t=e.childCount;for(let n=0;n<t;n++){let t=e.child(n);if(t.type.name!==`list`&&!(t.type.name===`paragraph`&&n===0))return!1}return!0}function X(e,t){let n=e.childCount;for(let r=0;r<n;r++){let n=e.child(r);n.isText&&n.text&&t.write(n.text)}}function Z(e,t,n){let r=e.attrs,i=r.kind===`ordered`?`${r.order??1}. `:r.kind===`task`?r.checked?`- [x] `:`- [ ] `:`- `,a=` `.repeat(r.kind===`task`?2:i.length);t.withPrefix(a,i,()=>J(e,t,n)),t.closeBlock()}function $t(e,t){let n=e.attrs.language??``,r=e.textContent,i="`".repeat(k(r,2)+1);t.write(i),n&&t.write(n),t.write(`
9
9
  `),t.write(r),t.write(`
10
- `),t.write(i),t.closeBlock()}function wt(e,t){let n=e.childCount;if(n===0)return;let r=[],i=0,a=-1;for(let t=0;t<n;t++){let n=e.child(t),o=[],s=!1;for(let e=0;e<n.childCount;e++){let t=n.child(e);t.type.name===`tableHeaderCell`&&(s=!0),o.push(Tt(t))}s&&a<0&&(a=t),o.length>i&&(i=o.length),r.push(o)}if(i===0)return;let o=`| `+Array(i).fill(`---`).join(` | `)+` |`,s=a>=0?r[a]:Array(i).fill(``);t.write(q(s,i)),t.write(`
10
+ `),t.write(i),t.closeBlock()}function en(e,t){let n=e.childCount;if(n===0)return;let r=[],i=0,a=-1;for(let t=0;t<n;t++){let n=e.child(t),o=[],s=!1;for(let e=0;e<n.childCount;e++){let t=n.child(e);t.type.name===`tableHeaderCell`&&(s=!0),o.push(nn(t))}s&&a<0&&(a=t),o.length>i&&(i=o.length),r.push(o)}if(i===0)return;let o=`| `+Array(i).fill(`---`).join(` | `)+` |`,s=a>=0?r[a]:Array(i).fill(``);t.write(tn(s,i)),t.write(`
11
11
  `),t.write(o);for(let e=0;e<n;e++)e!==a&&(t.write(`
12
- `),t.write(q(r[e],i)));t.closeBlock()}function q(e,t){let n=`|`;for(let r=0;r<t;r++)n+=` `+(e[r]??``)+` |`;return n}function Tt(e){let t=e.textContent.trim();return!t.includes(`|`)&&!t.includes(`
12
+ `),t.write(tn(r[e],i)));t.closeBlock()}function tn(e,t){let n=`|`;for(let r=0;r<t;r++)n+=` `+(e[r]??``)+` |`;return n}function nn(e){let t=e.textContent.trim();return!t.includes(`|`)&&!t.includes(`
13
13
  `)?t:t.replaceAll(`|`,String.raw`\|`).replaceAll(`
14
- `,` `)}function Et(e,t){let n=Dt(e,Ee.parse(t).cursor(),t);return e.nodes.doc(n)}function Dt(e,t,n){let r=[];if(!t.firstChild())return r;do r.push(...J(e,t,n));while(t.nextSibling());return t.parent(),r}function J(e,t,n){switch(t.type.id){case w.ATXHeading1:return[Y(e,t,n,1)];case w.ATXHeading2:return[Y(e,t,n,2)];case w.ATXHeading3:return[Y(e,t,n,3)];case w.ATXHeading4:return[Y(e,t,n,4)];case w.ATXHeading5:return[Y(e,t,n,5)];case w.ATXHeading6:return[Y(e,t,n,6)];case w.SetextHeading1:return[Y(e,t,n,1)];case w.SetextHeading2:return[Y(e,t,n,2)];case w.Paragraph:return[X(e,t,n)];case w.Blockquote:return[Z(e,t,n)];case w.BulletList:return Q(e,t,n,`bullet`,1);case w.OrderedList:return Ot(e,t,n);case w.FencedCode:case w.CodeBlock:return[jt(e,t,n)];case w.HorizontalRule:return[e.nodes.horizontalRule()];case w.Table:return[Mt(e,t,n)];case w.Task:return[X(e,t,n)];default:return[]}}function Y(e,t,n,r){let i=t.from,a=t.to;if(t.firstChild()){t.type.id===w.HeaderMark&&(i=t.to);let e=-1,n=-1;do e=t.type.id,n=t.from;while(t.nextSibling());e===w.HeaderMark&&n>i&&(a=n),t.parent()}let o=n.slice(i,a).trim();return e.nodes.heading({level:r},o)}function X(e,t,n){let r=n.slice(t.from,t.to);return e.nodes.paragraph(r)}function Z(e,t,n){let r=[];if(t.firstChild()){do{if(t.type.id===w.QuoteMark)continue;r.push(...J(e,t,n))}while(t.nextSibling());t.parent()}return e.nodes.blockquote(r)}function Q(e,t,n,r,i){let a=[];if(t.firstChild()){do t.type.id===w.ListItem&&a.push(kt(e,t,n,r,i));while(t.nextSibling());t.parent()}return a}function Ot(e,t,n){let r=1;if(t.firstChild()){if(t.type.id===w.ListItem&&t.firstChild()){if(t.type.id===w.ListMark){let e=n.slice(t.from,t.to),i=Number.parseInt(e,10);Number.isFinite(i)&&(r=i)}t.parent()}t.parent()}return Q(e,t,n,`ordered`,r)}function kt(e,t,n,r,i){let a=[],o=null;if(t.firstChild()){do{if(t.type.id===w.ListMark)continue;if(r===`bullet`&&t.type.id===w.Task){let r=At(e,t,n);o=r.checked,a.push(r.paragraph);continue}a.push(...J(e,t,n))}while(t.nextSibling());t.parent()}return e.nodes.list({kind:o===null?r:`task`,order:r===`ordered`?i:null,checked:o??!1,collapsed:!1},a)}function At(e,t,n){let r=!1,i=t.from,a=t.to;t.firstChild()&&(t.type.id===w.TaskMarker&&(r=n.slice(t.from,t.to).toLowerCase().includes(`x`),i=t.to),t.parent());let o=n.slice(i,a);return o.startsWith(` `)&&(o=o.slice(1)),{checked:r,paragraph:o===``?e.nodes.paragraph():e.nodes.paragraph(o)}}function jt(e,t,n){let r=``,i=``;if(t.firstChild()){do switch(t.type.id){case w.CodeInfo:r=n.slice(t.from,t.to);break;case w.CodeText:i=n.slice(t.from,t.to);break}while(t.nextSibling());t.parent()}return e.nodes.codeBlock({language:r},i)}function Mt(e,t,n){let r=[];if(t.firstChild()){do{let i=t.type.id;i===w.TableHeader?r.push($(e,t,n,!0)):i===w.TableRow&&r.push($(e,t,n,!1))}while(t.nextSibling());t.parent()}return e.nodes.table(r)}function $(e,t,n,r){let i=[];if(t.firstChild()){do if(t.type.id===w.TableCell){let a=n.slice(t.from,t.to).trim(),o=e.nodes.paragraph(a);i.push(r?e.nodes.tableHeaderCell(o):e.nodes.tableCell(o))}while(t.nextSibling());t.parent()}return e.nodes.tableRow(i)}export{st as defineEditorExtension,pt as defineMarkMode,yt as docToMarkdown,Et as markdownToDoc};
14
+ `,` `)}function rn(e,t){let n=an(e,We.parse(t).cursor(),t);return e.nodes.doc(n)}function an(e,t,n){let r=[];if(!t.firstChild())return r;do r.push(...Q(e,t,n));while(t.nextSibling());return t.parent(),r}function Q(e,t,n){switch(t.type.id){case w.ATXHeading1:return[$(e,t,n,1)];case w.ATXHeading2:return[$(e,t,n,2)];case w.ATXHeading3:return[$(e,t,n,3)];case w.ATXHeading4:return[$(e,t,n,4)];case w.ATXHeading5:return[$(e,t,n,5)];case w.ATXHeading6:return[$(e,t,n,6)];case w.SetextHeading1:return[$(e,t,n,1)];case w.SetextHeading2:return[$(e,t,n,2)];case w.Paragraph:return[on(e,t,n)];case w.Blockquote:return[sn(e,t,n)];case w.BulletList:return cn(e,t,n,`bullet`,1);case w.OrderedList:return ln(e,t,n);case w.FencedCode:case w.CodeBlock:return[fn(e,t,n)];case w.HorizontalRule:return[e.nodes.horizontalRule()];case w.Table:return[pn(e,t,n)];case w.Task:return[on(e,t,n)];default:return[]}}function $(e,t,n,r){let i=t.from,a=t.to;if(t.firstChild()){t.type.id===w.HeaderMark&&(i=t.to);let e=-1,n=-1;do e=t.type.id,n=t.from;while(t.nextSibling());e===w.HeaderMark&&n>i&&(a=n),t.parent()}let o=n.slice(i,a).trim();return e.nodes.heading({level:r},o)}function on(e,t,n){let r=n.slice(t.from,t.to);return e.nodes.paragraph(r)}function sn(e,t,n){let r=[];if(t.firstChild()){do{if(t.type.id===w.QuoteMark)continue;r.push(...Q(e,t,n))}while(t.nextSibling());t.parent()}return e.nodes.blockquote(r)}function cn(e,t,n,r,i){let a=[];if(t.firstChild()){do t.type.id===w.ListItem&&a.push(un(e,t,n,r,i));while(t.nextSibling());t.parent()}return a}function ln(e,t,n){let r=1;if(t.firstChild()){if(t.type.id===w.ListItem&&t.firstChild()){if(t.type.id===w.ListMark){let e=n.slice(t.from,t.to),i=Number.parseInt(e,10);Number.isFinite(i)&&(r=i)}t.parent()}t.parent()}return cn(e,t,n,`ordered`,r)}function un(e,t,n,r,i){let a=[],o=null;if(t.firstChild()){do{if(t.type.id===w.ListMark)continue;if(r===`bullet`&&t.type.id===w.Task){let r=dn(e,t,n);o=r.checked,a.push(r.paragraph);continue}a.push(...Q(e,t,n))}while(t.nextSibling());t.parent()}return e.nodes.list({kind:o===null?r:`task`,order:r===`ordered`?i:null,checked:o??!1,collapsed:!1},a)}function dn(e,t,n){let r=!1,i=t.from,a=t.to;t.firstChild()&&(t.type.id===w.TaskMarker&&(r=n.slice(t.from,t.to).toLowerCase().includes(`x`),i=t.to),t.parent());let o=n.slice(i,a);return o.startsWith(` `)&&(o=o.slice(1)),{checked:r,paragraph:o===``?e.nodes.paragraph():e.nodes.paragraph(o)}}function fn(e,t,n){let r=``,i=``;if(t.firstChild()){do switch(t.type.id){case w.CodeInfo:r=n.slice(t.from,t.to);break;case w.CodeText:i=n.slice(t.from,t.to);break}while(t.nextSibling());t.parent()}return e.nodes.codeBlock({language:r},i)}function pn(e,t,n){let r=[];if(t.firstChild()){do{let i=t.type.id;i===w.TableHeader?r.push(mn(e,t,n,!0)):i===w.TableRow&&r.push(mn(e,t,n,!1))}while(t.nextSibling());t.parent()}return e.nodes.table(r)}function mn(e,t,n,r){let i=[];if(t.firstChild()){do if(t.type.id===w.TableCell){let a=n.slice(t.from,t.to).trim(),o=e.nodes.paragraph(a);i.push(r?e.nodes.tableHeaderCell(o):e.nodes.tableCell(o))}while(t.nextSibling());t.parent()}return e.nodes.tableRow(i)}let hn;function gn(){return hn??=e({extension:R()}),hn}function _n(e){return e.replace(/\n+$/u,``)}function vn(e){return e.split(`
15
+ `).filter(e=>e.trim()!==``)}function yn(e){let t=K(rn(gn(),e));if(_n(t)===_n(e))return`exact`;let n=vn(e),r=vn(t);return n.length===r.length&&n.every((e,t)=>e===r[t])?`normalizing`:`lossy`}export{qt as EDITOR_KEY_BINDINGS,yn as checkRoundTrip,Yt as codeBlockLanguages,R as defineEditorExtension,Kt as defineImages,jt as defineMarkMode,ke as definePlaceholder,Ae as defineReadonly,Bt as defineWikilinkClickHandler,K as docToMarkdown,rn as markdownToDoc};
package/dist/style.css CHANGED
@@ -264,6 +264,56 @@ img.ProseMirror-separator {
264
264
  padding: 0;
265
265
  }
266
266
 
267
+ .ProseMirror pre code .tok-keyword {
268
+ color: light-dark(#cf222e, #ff7b72);
269
+ }
270
+
271
+ .ProseMirror pre code .tok-comment {
272
+ color: light-dark(#6e7781, #8b949e);
273
+ font-style: italic;
274
+ }
275
+
276
+ .ProseMirror pre code .tok-string, .ProseMirror pre code .tok-url {
277
+ color: light-dark(#0a3069, #a5d6ff);
278
+ }
279
+
280
+ .ProseMirror pre code .tok-number, .ProseMirror pre code .tok-bool, .ProseMirror pre code .tok-atom, .ProseMirror pre code .tok-literal {
281
+ color: light-dark(#0550ae, #79c0ff);
282
+ }
283
+
284
+ .ProseMirror pre code .tok-className, .ProseMirror pre code .tok-typeName, .ProseMirror pre code .tok-namespace {
285
+ color: light-dark(#953800, #ffa657);
286
+ }
287
+
288
+ .ProseMirror pre code .tok-definition {
289
+ color: light-dark(#8250df, #d2a8ff);
290
+ }
291
+
292
+ .ProseMirror pre code .tok-macroName, .ProseMirror pre code .tok-meta, .ProseMirror pre code .tok-inserted {
293
+ color: light-dark(#116329, #7ee787);
294
+ }
295
+
296
+ .ProseMirror pre code .tok-invalid, .ProseMirror pre code .tok-deleted {
297
+ color: light-dark(#82071e, #ffa198);
298
+ }
299
+
300
+ .ProseMirror pre code .tok-heading {
301
+ color: light-dark(#0550ae, #79c0ff);
302
+ font-weight: 600;
303
+ }
304
+
305
+ .ProseMirror pre code .tok-strong {
306
+ font-weight: 600;
307
+ }
308
+
309
+ .ProseMirror pre code .tok-emphasis {
310
+ font-style: italic;
311
+ }
312
+
313
+ .ProseMirror pre code .tok-link {
314
+ text-decoration: underline;
315
+ }
316
+
267
317
  .ProseMirror hr {
268
318
  border: none;
269
319
  border-top: 1px solid var(--meowdown-border);
@@ -331,9 +381,28 @@ img.ProseMirror-separator {
331
381
  .ProseMirror .md-wikilink {
332
382
  color: var(--meowdown-accent);
333
383
  text-underline-offset: 2px;
384
+ cursor: pointer;
334
385
  text-decoration: underline 1px dashed;
335
386
  }
336
387
 
388
+ .ProseMirror .md-image {
389
+ display: block;
390
+ }
391
+
392
+ .ProseMirror .md-image img {
393
+ max-height: var(--meowdown-image-max-height, 24rem);
394
+ border-radius: var(--meowdown-image-radius, .5rem);
395
+ max-width: 100%;
396
+ }
397
+
398
+ .ProseMirror .prosekit-placeholder:before {
399
+ content: attr(data-placeholder);
400
+ float: left;
401
+ pointer-events: none;
402
+ height: 0;
403
+ color: var(--meowdown-placeholder, var(--meowdown-muted));
404
+ }
405
+
337
406
  .ProseMirror .md-mark, .ProseMirror .md-link-uri {
338
407
  color: var(--meowdown-mark);
339
408
  opacity: .7;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@meowdown/core",
3
3
  "type": "module",
4
- "version": "0.3.1",
4
+ "version": "0.5.0",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -17,17 +17,22 @@
17
17
  "./dist/**/*.css"
18
18
  ],
19
19
  "dependencies": {
20
+ "@codemirror/language": "^6.12.3",
21
+ "@codemirror/language-data": "^6.5.2",
20
22
  "@lezer/common": "^1.5.2",
23
+ "@lezer/highlight": "^1.2.3",
21
24
  "@lezer/markdown": "^1.6.4",
22
25
  "@prosekit/core": "^0.12.3",
23
- "@prosekit/extensions": "^0.17.4",
26
+ "@prosekit/extensions": "^0.17.5-beta.0",
24
27
  "@prosekit/pm": "^0.1.18",
28
+ "prosemirror-highlight": "^0.15.2",
25
29
  "prosemirror-tables": "^1.8.5"
26
30
  },
27
31
  "devDependencies": {
28
32
  "@ocavue/tsconfig": "^0.7.1",
29
33
  "@tsdown/css": "^0.22.2",
30
34
  "@vitest/browser-playwright": "^4.1.8",
35
+ "diffable-html-snapshot": "^0.2.0",
31
36
  "tsdown": "^0.22.2",
32
37
  "vitest": "^4.1.8"
33
38
  },