@vscode/markdown-editor 0.0.2-20 → 0.0.2-22

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.
@@ -0,0 +1,177 @@
1
+ class r {
2
+ constructor(e, t) {
3
+ if (this.start = e, this.endExclusive = t, e > t)
4
+ throw new Error(`Invalid range: [${e}, ${t})`);
5
+ }
6
+ static fromTo(e, t) {
7
+ return new r(e, t);
8
+ }
9
+ static ofLength(e) {
10
+ return new r(0, e);
11
+ }
12
+ static ofStartAndLength(e, t) {
13
+ return new r(e, e + t);
14
+ }
15
+ static emptyAt(e) {
16
+ return new r(e, e);
17
+ }
18
+ get isEmpty() {
19
+ return this.start === this.endExclusive;
20
+ }
21
+ get length() {
22
+ return this.endExclusive - this.start;
23
+ }
24
+ delta(e) {
25
+ return new r(this.start + e, this.endExclusive + e);
26
+ }
27
+ deltaStart(e) {
28
+ return new r(this.start + e, this.endExclusive);
29
+ }
30
+ deltaEnd(e) {
31
+ return new r(this.start, this.endExclusive + e);
32
+ }
33
+ contains(e) {
34
+ return this.start <= e && e < this.endExclusive;
35
+ }
36
+ containsRange(e) {
37
+ return this.start <= e.start && e.endExclusive <= this.endExclusive;
38
+ }
39
+ intersects(e) {
40
+ return Math.max(this.start, e.start) < Math.min(this.endExclusive, e.endExclusive);
41
+ }
42
+ intersectsOrTouches(e) {
43
+ return Math.max(this.start, e.start) <= Math.min(this.endExclusive, e.endExclusive);
44
+ }
45
+ intersect(e) {
46
+ const t = Math.max(this.start, e.start), s = Math.min(this.endExclusive, e.endExclusive);
47
+ if (t <= s)
48
+ return new r(t, s);
49
+ }
50
+ join(e) {
51
+ return new r(
52
+ Math.min(this.start, e.start),
53
+ Math.max(this.endExclusive, e.endExclusive)
54
+ );
55
+ }
56
+ isBefore(e) {
57
+ return this.endExclusive <= e.start;
58
+ }
59
+ isAfter(e) {
60
+ return this.start >= e.endExclusive;
61
+ }
62
+ substring(e) {
63
+ return e.substring(this.start, this.endExclusive);
64
+ }
65
+ slice(e) {
66
+ return e.slice(this.start, this.endExclusive);
67
+ }
68
+ equals(e) {
69
+ return this.start === e.start && this.endExclusive === e.endExclusive;
70
+ }
71
+ toString() {
72
+ return `[${this.start}, ${this.endExclusive})`;
73
+ }
74
+ }
75
+ class i {
76
+ constructor(e, t) {
77
+ this.replaceRange = e, this.newText = t;
78
+ }
79
+ static insert(e, t) {
80
+ return new i(r.emptyAt(e), t);
81
+ }
82
+ static replace(e, t) {
83
+ return new i(e, t);
84
+ }
85
+ static delete(e) {
86
+ return new i(e, "");
87
+ }
88
+ get isEmpty() {
89
+ return this.replaceRange.isEmpty && this.newText.length === 0;
90
+ }
91
+ equals(e) {
92
+ return this.replaceRange.equals(e.replaceRange) && this.newText === e.newText;
93
+ }
94
+ toString() {
95
+ return `${this.replaceRange} -> ${JSON.stringify(this.newText)}`;
96
+ }
97
+ }
98
+ class a {
99
+ static empty = new a([]);
100
+ static single(e) {
101
+ return new a([e]);
102
+ }
103
+ static replace(e, t) {
104
+ return new a([i.replace(e, t)]);
105
+ }
106
+ static insert(e, t) {
107
+ return new a([i.insert(e, t)]);
108
+ }
109
+ static delete(e) {
110
+ return new a([i.delete(e)]);
111
+ }
112
+ replacements;
113
+ constructor(e) {
114
+ let t = -1;
115
+ for (const s of e) {
116
+ if (s.replaceRange.start < t)
117
+ throw new Error(
118
+ `Edits must be disjoint and sorted. Found ${s} after ${t}`
119
+ );
120
+ t = s.replaceRange.endExclusive;
121
+ }
122
+ this.replacements = e;
123
+ }
124
+ get isEmpty() {
125
+ return this.replacements.length === 0;
126
+ }
127
+ apply(e) {
128
+ const t = [];
129
+ let s = 0;
130
+ for (const n of this.replacements)
131
+ t.push(e.substring(s, n.replaceRange.start)), t.push(n.newText), s = n.replaceRange.endExclusive;
132
+ return t.push(e.substring(s)), t.join("");
133
+ }
134
+ inverse(e) {
135
+ const t = [];
136
+ let s = 0;
137
+ for (const n of this.replacements) {
138
+ const l = e.substring(n.replaceRange.start, n.replaceRange.endExclusive);
139
+ t.push(
140
+ i.replace(
141
+ r.ofStartAndLength(n.replaceRange.start + s, n.newText.length),
142
+ l
143
+ )
144
+ ), s += n.newText.length - n.replaceRange.length;
145
+ }
146
+ return new a(t);
147
+ }
148
+ equals(e) {
149
+ if (this.replacements.length !== e.replacements.length)
150
+ return !1;
151
+ for (let t = 0; t < this.replacements.length; t++)
152
+ if (!this.replacements[t].equals(e.replacements[t]))
153
+ return !1;
154
+ return !0;
155
+ }
156
+ mapOffset(e) {
157
+ let t = 0;
158
+ for (const s of this.replacements) {
159
+ if (s.replaceRange.start > e)
160
+ break;
161
+ if (s.replaceRange.endExclusive <= e)
162
+ t += s.newText.length - s.replaceRange.length;
163
+ else
164
+ return s.replaceRange.start + t + s.newText.length;
165
+ }
166
+ return e + t;
167
+ }
168
+ toString() {
169
+ return `[${this.replacements.map((e) => e.toString()).join(", ")}]`;
170
+ }
171
+ }
172
+ export {
173
+ r as O,
174
+ a as S,
175
+ i as a
176
+ };
177
+ //# sourceMappingURL=stringEdit-DzLs4E1d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stringEdit-DzLs4E1d.js","sources":["../src/core/offsetRange.ts","../src/core/stringEdit.ts"],"sourcesContent":["export class OffsetRange {\n\tpublic static fromTo(start: number, endExclusive: number): OffsetRange {\n\t\treturn new OffsetRange(start, endExclusive);\n\t}\n\n\tpublic static ofLength(length: number): OffsetRange {\n\t\treturn new OffsetRange(0, length);\n\t}\n\n\tpublic static ofStartAndLength(start: number, length: number): OffsetRange {\n\t\treturn new OffsetRange(start, start + length);\n\t}\n\n\tpublic static emptyAt(offset: number): OffsetRange {\n\t\treturn new OffsetRange(offset, offset);\n\t}\n\n\tconstructor(\n\t\tpublic readonly start: number,\n\t\tpublic readonly endExclusive: number,\n\t) {\n\t\tif (start > endExclusive) {\n\t\t\tthrow new Error(`Invalid range: [${start}, ${endExclusive})`);\n\t\t}\n\t}\n\n\tget isEmpty(): boolean {\n\t\treturn this.start === this.endExclusive;\n\t}\n\n\tget length(): number {\n\t\treturn this.endExclusive - this.start;\n\t}\n\n\tpublic delta(offset: number): OffsetRange {\n\t\treturn new OffsetRange(this.start + offset, this.endExclusive + offset);\n\t}\n\n\tpublic deltaStart(offset: number): OffsetRange {\n\t\treturn new OffsetRange(this.start + offset, this.endExclusive);\n\t}\n\n\tpublic deltaEnd(offset: number): OffsetRange {\n\t\treturn new OffsetRange(this.start, this.endExclusive + offset);\n\t}\n\n\tpublic contains(offset: number): boolean {\n\t\treturn this.start <= offset && offset < this.endExclusive;\n\t}\n\n\tpublic containsRange(other: OffsetRange): boolean {\n\t\treturn this.start <= other.start && other.endExclusive <= this.endExclusive;\n\t}\n\n\tpublic intersects(other: OffsetRange): boolean {\n\t\treturn Math.max(this.start, other.start) < Math.min(this.endExclusive, other.endExclusive);\n\t}\n\n\tpublic intersectsOrTouches(other: OffsetRange): boolean {\n\t\treturn Math.max(this.start, other.start) <= Math.min(this.endExclusive, other.endExclusive);\n\t}\n\n\tpublic intersect(other: OffsetRange): OffsetRange | undefined {\n\t\tconst start = Math.max(this.start, other.start);\n\t\tconst end = Math.min(this.endExclusive, other.endExclusive);\n\t\tif (start <= end) {\n\t\t\treturn new OffsetRange(start, end);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tpublic join(other: OffsetRange): OffsetRange {\n\t\treturn new OffsetRange(\n\t\t\tMath.min(this.start, other.start),\n\t\t\tMath.max(this.endExclusive, other.endExclusive),\n\t\t);\n\t}\n\n\tpublic isBefore(other: OffsetRange): boolean {\n\t\treturn this.endExclusive <= other.start;\n\t}\n\n\tpublic isAfter(other: OffsetRange): boolean {\n\t\treturn this.start >= other.endExclusive;\n\t}\n\n\tpublic substring(str: string): string {\n\t\treturn str.substring(this.start, this.endExclusive);\n\t}\n\n\tpublic slice<T>(arr: readonly T[]): T[] {\n\t\treturn arr.slice(this.start, this.endExclusive);\n\t}\n\n\tpublic equals(other: OffsetRange): boolean {\n\t\treturn this.start === other.start && this.endExclusive === other.endExclusive;\n\t}\n\n\tpublic toString(): string {\n\t\treturn `[${this.start}, ${this.endExclusive})`;\n\t}\n}\n","import { OffsetRange } from './offsetRange.js';\n\nexport class StringReplacement {\n\tpublic static insert(offset: number, text: string): StringReplacement {\n\t\treturn new StringReplacement(OffsetRange.emptyAt(offset), text);\n\t}\n\n\tpublic static replace(range: OffsetRange, text: string): StringReplacement {\n\t\treturn new StringReplacement(range, text);\n\t}\n\n\tpublic static delete(range: OffsetRange): StringReplacement {\n\t\treturn new StringReplacement(range, '');\n\t}\n\n\tconstructor(\n\t\tpublic readonly replaceRange: OffsetRange,\n\t\tpublic readonly newText: string,\n\t) {}\n\n\tget isEmpty(): boolean {\n\t\treturn this.replaceRange.isEmpty && this.newText.length === 0;\n\t}\n\n\tpublic equals(other: StringReplacement): boolean {\n\t\treturn this.replaceRange.equals(other.replaceRange) && this.newText === other.newText;\n\t}\n\n\tpublic toString(): string {\n\t\treturn `${this.replaceRange} -> ${JSON.stringify(this.newText)}`;\n\t}\n}\n\nexport class StringEdit {\n\tpublic static readonly empty = new StringEdit([]);\n\n\tpublic static single(replacement: StringReplacement): StringEdit {\n\t\treturn new StringEdit([replacement]);\n\t}\n\n\tpublic static replace(range: OffsetRange, text: string): StringEdit {\n\t\treturn new StringEdit([StringReplacement.replace(range, text)]);\n\t}\n\n\tpublic static insert(offset: number, text: string): StringEdit {\n\t\treturn new StringEdit([StringReplacement.insert(offset, text)]);\n\t}\n\n\tpublic static delete(range: OffsetRange): StringEdit {\n\t\treturn new StringEdit([StringReplacement.delete(range)]);\n\t}\n\n\tpublic readonly replacements: readonly StringReplacement[];\n\n\tconstructor(replacements: readonly StringReplacement[]) {\n\t\tlet lastEndEx = -1;\n\t\tfor (const replacement of replacements) {\n\t\t\tif (replacement.replaceRange.start < lastEndEx) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Edits must be disjoint and sorted. Found ${replacement} after ${lastEndEx}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tlastEndEx = replacement.replaceRange.endExclusive;\n\t\t}\n\t\tthis.replacements = replacements;\n\t}\n\n\tget isEmpty(): boolean {\n\t\treturn this.replacements.length === 0;\n\t}\n\n\tpublic apply(base: string): string {\n\t\tconst parts: string[] = [];\n\t\tlet pos = 0;\n\t\tfor (const r of this.replacements) {\n\t\t\tparts.push(base.substring(pos, r.replaceRange.start));\n\t\t\tparts.push(r.newText);\n\t\t\tpos = r.replaceRange.endExclusive;\n\t\t}\n\t\tparts.push(base.substring(pos));\n\t\treturn parts.join('');\n\t}\n\n\tpublic inverse(original: string): StringEdit {\n\t\tconst edits: StringReplacement[] = [];\n\t\tlet offset = 0;\n\t\tfor (const r of this.replacements) {\n\t\t\tconst oldText = original.substring(r.replaceRange.start, r.replaceRange.endExclusive);\n\t\t\tedits.push(\n\t\t\t\tStringReplacement.replace(\n\t\t\t\t\tOffsetRange.ofStartAndLength(r.replaceRange.start + offset, r.newText.length),\n\t\t\t\t\toldText,\n\t\t\t\t),\n\t\t\t);\n\t\t\toffset += r.newText.length - r.replaceRange.length;\n\t\t}\n\t\treturn new StringEdit(edits);\n\t}\n\n\tpublic equals(other: StringEdit): boolean {\n\t\tif (this.replacements.length !== other.replacements.length) {\n\t\t\treturn false;\n\t\t}\n\t\tfor (let i = 0; i < this.replacements.length; i++) {\n\t\t\tif (!this.replacements[i].equals(other.replacements[i])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic mapOffset(offset: number): number {\n\t\tlet delta = 0;\n\t\tfor (const r of this.replacements) {\n\t\t\tif (r.replaceRange.start > offset) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (r.replaceRange.endExclusive <= offset) {\n\t\t\t\tdelta += r.newText.length - r.replaceRange.length;\n\t\t\t} else {\n\t\t\t\t// offset is inside a replaced range — map to end of replacement\n\t\t\t\treturn r.replaceRange.start + delta + r.newText.length;\n\t\t\t}\n\t\t}\n\t\treturn offset + delta;\n\t}\n\n\tpublic toString(): string {\n\t\treturn `[${this.replacements.map(r => r.toString()).join(', ')}]`;\n\t}\n}\n"],"names":["OffsetRange","start","endExclusive","length","offset","other","end","str","arr","StringReplacement","replaceRange","newText","text","range","StringEdit","replacement","replacements","lastEndEx","base","parts","pos","r","original","edits","oldText","i","delta"],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Build an {@link IEmbeddedCodeEditorFactory} that renders matching code blocks
3
+ * with the sample web editor embedded in an iframe.
4
+ */
5
+ export declare function createIframeEmbeddedEditorFactory(options: IframeEmbeddedEditorOptions): IEmbeddedCodeEditorFactory;
6
+
7
+ /**
8
+ * A live editor embedded in place of a fenced code block's *rendered* form.
9
+ *
10
+ * This is the internal seam between the block view and a concrete embedded
11
+ * editor (e.g. an `<iframe>` speaking the web-editor protocol). The block view
12
+ * only speaks string edits: it pushes the block's content down via
13
+ * {@link setContent} and receives the editor's own changes back through
14
+ * {@link onEdit} (set by the block view on each (re)construction, so it always
15
+ * routes to the current AST node). The concrete implementation owns its DOM,
16
+ * transport, and lifecycle.
17
+ *
18
+ * A single instance is adopted across re-renders (like the highlighter session)
19
+ * so the underlying editor keeps its state across edits — see
20
+ * {@link CodeBlockViewNode}.
21
+ */
22
+ declare interface IEmbeddedCodeEditor {
23
+ /** The element mounted as the block's rendered form. */
24
+ readonly element: HTMLElement;
25
+ /**
26
+ * Document → editor. The block's content changed (from any source). Must be
27
+ * idempotent: pushing the content the editor already holds is a no-op, which
28
+ * is how edits the editor itself originated are prevented from echoing back.
29
+ */
30
+ setContent(content: string): void;
31
+ /**
32
+ * Optional synchronous height (px) to reserve for `content` *before* the
33
+ * editor has laid out. Return `undefined` to let the editor size itself
34
+ * (the implementation may report its real height later). Lets a registration
35
+ * avoid a layout jump when it can cheaply estimate the size from content.
36
+ */
37
+ estimateHeight?(content: string): number | undefined;
38
+ /**
39
+ * Editor → document. Set by the block view on every (re)construction to
40
+ * route the editor's own edits, expressed in the block's *content*
41
+ * coordinates, to the current AST node.
42
+ */
43
+ onEdit?: (edit: StringEdit) => void;
44
+ dispose(): void;
45
+ }
46
+
47
+ /** Creates an {@link IEmbeddedCodeEditor} for a fenced block, or opts out. */
48
+ declare interface IEmbeddedCodeEditorFactory {
49
+ /**
50
+ * Return an editor for a fenced block of `language`, or `undefined` to fall
51
+ * back to the default (highlighting / {@link BlockViewOptions.renderCustomCodeBlock}).
52
+ */
53
+ create(language: string, initialContent: string): IEmbeddedCodeEditor | undefined;
54
+ }
55
+
56
+ export declare interface IframeEmbeddedEditorOptions {
57
+ /** The guest bundle source (an IIFE/ESM string), inlined into the iframe. */
58
+ readonly bundleJs: string;
59
+ /** Decide whether this factory handles `language`. */
60
+ readonly handlesLanguage: (language: string) => boolean;
61
+ /** Theme CSS injected into the iframe `<head>` (e.g. `--vscode-*` variables). */
62
+ readonly themeCss?: string;
63
+ /**
64
+ * Optional synchronous height (px) reserved from content before the guest
65
+ * measures itself. Return `undefined` to let the guest size the frame.
66
+ */
67
+ readonly estimateHeight?: (content: string) => number | undefined;
68
+ }
69
+
70
+ declare class OffsetRange {
71
+ readonly start: number;
72
+ readonly endExclusive: number;
73
+ static fromTo(start: number, endExclusive: number): OffsetRange;
74
+ static ofLength(length: number): OffsetRange;
75
+ static ofStartAndLength(start: number, length: number): OffsetRange;
76
+ static emptyAt(offset: number): OffsetRange;
77
+ constructor(start: number, endExclusive: number);
78
+ get isEmpty(): boolean;
79
+ get length(): number;
80
+ delta(offset: number): OffsetRange;
81
+ deltaStart(offset: number): OffsetRange;
82
+ deltaEnd(offset: number): OffsetRange;
83
+ contains(offset: number): boolean;
84
+ containsRange(other: OffsetRange): boolean;
85
+ intersects(other: OffsetRange): boolean;
86
+ intersectsOrTouches(other: OffsetRange): boolean;
87
+ intersect(other: OffsetRange): OffsetRange | undefined;
88
+ join(other: OffsetRange): OffsetRange;
89
+ isBefore(other: OffsetRange): boolean;
90
+ isAfter(other: OffsetRange): boolean;
91
+ substring(str: string): string;
92
+ slice<T>(arr: readonly T[]): T[];
93
+ equals(other: OffsetRange): boolean;
94
+ toString(): string;
95
+ }
96
+
97
+ declare class StringEdit {
98
+ static readonly empty: StringEdit;
99
+ static single(replacement: StringReplacement): StringEdit;
100
+ static replace(range: OffsetRange, text: string): StringEdit;
101
+ static insert(offset: number, text: string): StringEdit;
102
+ static delete(range: OffsetRange): StringEdit;
103
+ readonly replacements: readonly StringReplacement[];
104
+ constructor(replacements: readonly StringReplacement[]);
105
+ get isEmpty(): boolean;
106
+ apply(base: string): string;
107
+ inverse(original: string): StringEdit;
108
+ equals(other: StringEdit): boolean;
109
+ mapOffset(offset: number): number;
110
+ toString(): string;
111
+ }
112
+
113
+ declare class StringReplacement {
114
+ readonly replaceRange: OffsetRange;
115
+ readonly newText: string;
116
+ static insert(offset: number, text: string): StringReplacement;
117
+ static replace(range: OffsetRange, text: string): StringReplacement;
118
+ static delete(range: OffsetRange): StringReplacement;
119
+ constructor(replaceRange: OffsetRange, newText: string);
120
+ get isEmpty(): boolean;
121
+ equals(other: StringReplacement): boolean;
122
+ toString(): string;
123
+ }
124
+
125
+ export { }