@mdwrk/markdown-editor-core 1.0.1

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 ADDED
@@ -0,0 +1,34 @@
1
+ # mdwrk/markdown-editor-core
2
+
3
+ Portable source-mode markdown editor primitives for Markdown Workspace.
4
+
5
+ ## Responsibilities
6
+
7
+ - document snapshot and selection types
8
+ - selection transforms
9
+ - formatting commands
10
+ - indent/outdent helpers
11
+ - undo/redo history state
12
+ - host-facing editor controller contracts
13
+
14
+ ## Scope
15
+
16
+ This package does not depend on React or DOM rendering. It is suitable for browser hosts, React bindings, and future non-React adapters.
17
+
18
+ ## Key exports
19
+
20
+ - `createHistoryState`
21
+ - `resetHistoryState`
22
+ - `pushHistoryEntry`
23
+ - `undoHistory`
24
+ - `redoHistory`
25
+ - `applyBuiltinMarkdownCommand`
26
+ - `wrapSelection`
27
+ - `indentSelection`
28
+ - `outdentSelection`
29
+ - `computeCursorPosition`
30
+ - `DEFAULT_MARKDOWN_EDITOR_CLASS_NAMES`
31
+
32
+ ## Status
33
+
34
+ Implemented in the Phase 5 checkpoint. This package is publishable, but repository-wide certification is still pending later phases.
@@ -0,0 +1,9 @@
1
+ export interface MarkdownEditorClassNames {
2
+ readonly root: string;
3
+ readonly layout: string;
4
+ readonly gutter: string;
5
+ readonly lineNumber: string;
6
+ readonly textarea: string;
7
+ }
8
+ export declare const DEFAULT_MARKDOWN_EDITOR_CLASS_NAMES: MarkdownEditorClassNames;
9
+ //# sourceMappingURL=class-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-names.d.ts","sourceRoot":"","sources":["../src/class-names.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,mCAAmC,EAAE,wBAMjD,CAAC"}
@@ -0,0 +1,8 @@
1
+ export const DEFAULT_MARKDOWN_EDITOR_CLASS_NAMES = {
2
+ root: "mw-editor",
3
+ layout: "mw-editor-layout",
4
+ gutter: "mw-editor-gutter",
5
+ lineNumber: "mw-editor-line-number",
6
+ textarea: "mw-editor-textarea",
7
+ };
8
+ //# sourceMappingURL=class-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class-names.js","sourceRoot":"","sources":["../src/class-names.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,mCAAmC,GAA6B;IAC3E,IAAI,EAAE,WAAW;IACjB,MAAM,EAAE,kBAAkB;IAC1B,MAAM,EAAE,kBAAkB;IAC1B,UAAU,EAAE,uBAAuB;IACnC,QAAQ,EAAE,oBAAoB;CAC/B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { MarkdownEditorBuiltinCommandId, MarkdownEditorCommandOptions, MarkdownEditorEditResult, MarkdownEditorSelection } from "./types.js";
2
+ export declare const BUILTIN_MARKDOWN_EDITOR_COMMANDS: readonly MarkdownEditorBuiltinCommandId[];
3
+ export declare function applyBuiltinMarkdownCommand(command: MarkdownEditorBuiltinCommandId, value: string, selection: MarkdownEditorSelection, options?: MarkdownEditorCommandOptions): MarkdownEditorEditResult;
4
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,8BAA8B,EAC9B,4BAA4B,EAC5B,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,gCAAgC,EAAE,SAAS,8BAA8B,EAS5E,CAAC;AAEX,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,8BAA8B,EACvC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,uBAAuB,EAClC,OAAO,GAAE,4BAAiC,GACzC,wBAAwB,CAyB1B"}
@@ -0,0 +1,39 @@
1
+ import { wrapSelection } from "./selection.js";
2
+ import { indentSelection, outdentSelection } from "./transforms.js";
3
+ export const BUILTIN_MARKDOWN_EDITOR_COMMANDS = [
4
+ "bold",
5
+ "italic",
6
+ "strikethrough",
7
+ "indent",
8
+ "outdent",
9
+ "undo",
10
+ "redo",
11
+ "insert-tab",
12
+ ];
13
+ export function applyBuiltinMarkdownCommand(command, value, selection, options = {}) {
14
+ switch (command) {
15
+ case "bold":
16
+ return wrapSelection(value, selection, "**", "**");
17
+ case "italic":
18
+ return wrapSelection(value, selection, "_", "_");
19
+ case "strikethrough":
20
+ return wrapSelection(value, selection, "~~", "~~");
21
+ case "indent":
22
+ case "insert-tab":
23
+ return indentSelection(value, selection, options.indentUnit ?? "\t");
24
+ case "outdent":
25
+ return outdentSelection(value, selection, options.indentUnit ?? "\t");
26
+ case "undo":
27
+ case "redo":
28
+ return {
29
+ value,
30
+ selection,
31
+ changed: false,
32
+ };
33
+ default: {
34
+ const exhaustiveCheck = command;
35
+ throw new Error(`Unsupported markdown editor command: ${String(exhaustiveCheck)}`);
36
+ }
37
+ }
38
+ }
39
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAQpE,MAAM,CAAC,MAAM,gCAAgC,GAA8C;IACzF,MAAM;IACN,QAAQ;IACR,eAAe;IACf,QAAQ;IACR,SAAS;IACT,MAAM;IACN,MAAM;IACN,YAAY;CACJ,CAAC;AAEX,MAAM,UAAU,2BAA2B,CACzC,OAAuC,EACvC,KAAa,EACb,SAAkC,EAClC,UAAwC,EAAE;IAE1C,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACrD,KAAK,QAAQ;YACX,OAAO,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACnD,KAAK,eAAe;YAClB,OAAO,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACrD,KAAK,QAAQ,CAAC;QACd,KAAK,YAAY;YACf,OAAO,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC;QACvE,KAAK,SAAS;YACZ,OAAO,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC;QACxE,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,OAAO;gBACL,KAAK;gBACL,SAAS;gBACT,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,eAAe,GAAU,OAAO,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,wCAAwC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { MarkdownEditorHistoryState, MarkdownEditorSelection, MarkdownEditorSnapshot } from "./types.js";
2
+ export declare function createEditorSnapshot(value?: string, selection?: MarkdownEditorSelection): MarkdownEditorSnapshot;
3
+ export declare function createHistoryState(initialValue?: string, selection?: MarkdownEditorSelection, limit?: number): MarkdownEditorHistoryState;
4
+ export declare function resetHistoryState(value?: string, selection?: MarkdownEditorSelection, limit?: number): MarkdownEditorHistoryState;
5
+ export declare function pushHistoryEntry(history: MarkdownEditorHistoryState, nextValue: string, selection?: MarkdownEditorSelection): MarkdownEditorHistoryState;
6
+ export declare function replaceHistoryPresent(history: MarkdownEditorHistoryState, nextValue: string, selection?: MarkdownEditorSelection): MarkdownEditorHistoryState;
7
+ export declare function canUndoHistory(history: MarkdownEditorHistoryState): boolean;
8
+ export declare function canRedoHistory(history: MarkdownEditorHistoryState): boolean;
9
+ export declare function undoHistory(history: MarkdownEditorHistoryState): MarkdownEditorHistoryState;
10
+ export declare function redoHistory(history: MarkdownEditorHistoryState): MarkdownEditorHistoryState;
11
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAE9G,wBAAgB,oBAAoB,CAAC,KAAK,SAAK,EAAE,SAAS,GAAE,uBAAuD,GAAG,sBAAsB,CAK3I;AAED,wBAAgB,kBAAkB,CAChC,YAAY,SAAK,EACjB,SAAS,GAAE,uBAA8D,EACzE,KAAK,SAAM,GACV,0BAA0B,CAO5B;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,SAAK,EACV,SAAS,GAAE,uBAAuD,EAClE,KAAK,SAAM,GACV,0BAA0B,CAE5B;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,0BAA0B,EACnC,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,uBAA2D,GACrE,0BAA0B,CAiB5B;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,0BAA0B,EACnC,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,uBAA2D,GACrE,0BAA0B,CAK5B;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAE3E;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,0BAA0B,GAAG,OAAO,CAE3E;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,0BAA0B,GAAG,0BAA0B,CAS3F;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,0BAA0B,GAAG,0BAA0B,CAS3F"}
@@ -0,0 +1,68 @@
1
+ import { createSelection, normalizeSelection } from "./selection.js";
2
+ export function createEditorSnapshot(value = "", selection = createSelection(value.length)) {
3
+ return {
4
+ value,
5
+ selection: normalizeSelection(selection, value.length),
6
+ };
7
+ }
8
+ export function createHistoryState(initialValue = "", selection = createSelection(initialValue.length), limit = 100) {
9
+ return {
10
+ past: [],
11
+ present: createEditorSnapshot(initialValue, selection),
12
+ future: [],
13
+ limit,
14
+ };
15
+ }
16
+ export function resetHistoryState(value = "", selection = createSelection(value.length), limit = 100) {
17
+ return createHistoryState(value, selection, limit);
18
+ }
19
+ export function pushHistoryEntry(history, nextValue, selection = createSelection(nextValue.length)) {
20
+ const nextPresent = createEditorSnapshot(nextValue, selection);
21
+ if (history.present.value === nextPresent.value &&
22
+ history.present.selection.start === nextPresent.selection.start &&
23
+ history.present.selection.end === nextPresent.selection.end) {
24
+ return history;
25
+ }
26
+ const nextPast = [...history.past, history.present].slice(-history.limit);
27
+ return {
28
+ past: nextPast,
29
+ present: nextPresent,
30
+ future: [],
31
+ limit: history.limit,
32
+ };
33
+ }
34
+ export function replaceHistoryPresent(history, nextValue, selection = createSelection(nextValue.length)) {
35
+ return {
36
+ ...history,
37
+ present: createEditorSnapshot(nextValue, selection),
38
+ };
39
+ }
40
+ export function canUndoHistory(history) {
41
+ return history.past.length > 0;
42
+ }
43
+ export function canRedoHistory(history) {
44
+ return history.future.length > 0;
45
+ }
46
+ export function undoHistory(history) {
47
+ if (!canUndoHistory(history))
48
+ return history;
49
+ const previous = history.past[history.past.length - 1];
50
+ return {
51
+ past: history.past.slice(0, -1),
52
+ present: previous,
53
+ future: [history.present, ...history.future],
54
+ limit: history.limit,
55
+ };
56
+ }
57
+ export function redoHistory(history) {
58
+ if (!canRedoHistory(history))
59
+ return history;
60
+ const [next, ...future] = history.future;
61
+ return {
62
+ past: [...history.past, history.present].slice(-history.limit),
63
+ present: next,
64
+ future,
65
+ limit: history.limit,
66
+ };
67
+ }
68
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../src/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from "./version.js";
2
+ export * from "./types.js";
3
+ export * from "./class-names.js";
4
+ export * from "./selection.js";
5
+ export * from "./transforms.js";
6
+ export * from "./commands.js";
7
+ export * from "./history.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ export * from "./version.js";
2
+ export * from "./types.js";
3
+ export * from "./class-names.js";
4
+ export * from "./selection.js";
5
+ export * from "./transforms.js";
6
+ export * from "./commands.js";
7
+ export * from "./history.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { MarkdownEditorCursorPosition, MarkdownEditorEditResult, MarkdownEditorSelection } from "./types.js";
2
+ export declare function createSelection(start?: number, end?: number, direction?: MarkdownEditorSelection["direction"]): MarkdownEditorSelection;
3
+ export declare function normalizeSelection(selection: MarkdownEditorSelection, documentLength: number): MarkdownEditorSelection;
4
+ export declare function clampOffset(offset: number, documentLength: number): number;
5
+ export declare function computeCursorPosition(value: string, offset: number): MarkdownEditorCursorPosition;
6
+ export declare function replaceSelection(value: string, selection: MarkdownEditorSelection, replacement: string): MarkdownEditorEditResult;
7
+ export declare function wrapSelection(value: string, selection: MarkdownEditorSelection, prefix: string, suffix?: string): MarkdownEditorEditResult;
8
+ //# sourceMappingURL=selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../src/selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,4BAA4B,EAC5B,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,eAAe,CAAC,KAAK,SAAI,EAAE,GAAG,SAAQ,EAAE,SAAS,GAAE,uBAAuB,CAAC,WAAW,CAAU,GAAG,uBAAuB,CAEzI;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,GAAG,uBAAuB,CAKtH;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAG1E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,4BAA4B,CASjG;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,uBAAuB,EAClC,WAAW,EAAE,MAAM,GAClB,wBAAwB,CAS1B;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,uBAAuB,EAClC,MAAM,EAAE,MAAM,EACd,MAAM,SAAS,GACd,wBAAwB,CAgB1B"}
@@ -0,0 +1,51 @@
1
+ export function createSelection(start = 0, end = start, direction = "none") {
2
+ return { start, end, direction };
3
+ }
4
+ export function normalizeSelection(selection, documentLength) {
5
+ const start = clampOffset(selection.start, documentLength);
6
+ const end = clampOffset(selection.end, documentLength);
7
+ if (start <= end)
8
+ return { start, end, direction: selection.direction ?? "none" };
9
+ return { start: end, end: start, direction: selection.direction ?? "none" };
10
+ }
11
+ export function clampOffset(offset, documentLength) {
12
+ if (Number.isNaN(offset))
13
+ return 0;
14
+ return Math.max(0, Math.min(documentLength, offset));
15
+ }
16
+ export function computeCursorPosition(value, offset) {
17
+ const safeOffset = clampOffset(offset, value.length);
18
+ const textBeforeCursor = value.slice(0, safeOffset);
19
+ const lines = textBeforeCursor.split("\n");
20
+ return {
21
+ offset: safeOffset,
22
+ line: lines.length,
23
+ column: lines[lines.length - 1].length + 1,
24
+ };
25
+ }
26
+ export function replaceSelection(value, selection, replacement) {
27
+ const normalized = normalizeSelection(selection, value.length);
28
+ const nextValue = `${value.slice(0, normalized.start)}${replacement}${value.slice(normalized.end)}`;
29
+ const cursor = normalized.start + replacement.length;
30
+ return {
31
+ value: nextValue,
32
+ selection: createSelection(cursor, cursor),
33
+ changed: nextValue !== value,
34
+ };
35
+ }
36
+ export function wrapSelection(value, selection, prefix, suffix = prefix) {
37
+ const normalized = normalizeSelection(selection, value.length);
38
+ const selectedText = value.slice(normalized.start, normalized.end);
39
+ const replacement = `${prefix}${selectedText}${suffix}`;
40
+ const nextValue = `${value.slice(0, normalized.start)}${replacement}${value.slice(normalized.end)}`;
41
+ const hasSelection = normalized.start !== normalized.end;
42
+ const nextSelection = hasSelection
43
+ ? createSelection(normalized.start + prefix.length, normalized.end + prefix.length)
44
+ : createSelection(normalized.start + prefix.length, normalized.start + prefix.length);
45
+ return {
46
+ value: nextValue,
47
+ selection: nextSelection,
48
+ changed: nextValue !== value,
49
+ };
50
+ }
51
+ //# sourceMappingURL=selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.js","sourceRoot":"","sources":["../src/selection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { MarkdownEditorEditResult, MarkdownEditorSelection } from "./types.js";
2
+ export declare function insertText(value: string, selection: MarkdownEditorSelection, text: string): MarkdownEditorEditResult;
3
+ export declare function indentSelection(value: string, selection: MarkdownEditorSelection, indentUnit?: string): MarkdownEditorEditResult;
4
+ export declare function outdentSelection(value: string, selection: MarkdownEditorSelection, indentUnit?: string): MarkdownEditorEditResult;
5
+ //# sourceMappingURL=transforms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transforms.d.ts","sourceRoot":"","sources":["../src/transforms.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAmBpF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,GAAG,wBAAwB,CAEpH;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,uBAAuB,EAClC,UAAU,SAAO,GAChB,wBAAwB,CAkB1B;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,uBAAuB,EAClC,UAAU,SAAO,GAChB,wBAAwB,CAkD1B"}
@@ -0,0 +1,78 @@
1
+ import { createSelection, normalizeSelection, replaceSelection } from "./selection.js";
2
+ function getSelectedLineRange(value, selection) {
3
+ const normalized = normalizeSelection(selection, value.length);
4
+ const lineStart = value.lastIndexOf("\n", Math.max(0, normalized.start - 1)) + 1;
5
+ const nextBreak = value.indexOf("\n", normalized.end);
6
+ const lineEnd = nextBreak === -1 ? value.length : nextBreak;
7
+ const selectedBlock = value.slice(lineStart, lineEnd);
8
+ const lines = selectedBlock.split("\n");
9
+ const isMultiLine = lines.length > 1 || normalized.start !== normalized.end;
10
+ return { lineStart, lineEnd, selectedBlock, lines, isMultiLine };
11
+ }
12
+ export function insertText(value, selection, text) {
13
+ return replaceSelection(value, selection, text);
14
+ }
15
+ export function indentSelection(value, selection, indentUnit = "\t") {
16
+ const normalized = normalizeSelection(selection, value.length);
17
+ const { lineStart, lineEnd, lines, isMultiLine } = getSelectedLineRange(value, normalized);
18
+ if (!isMultiLine) {
19
+ return insertText(value, normalized, indentUnit);
20
+ }
21
+ const updatedLines = lines.map((line) => `${indentUnit}${line}`);
22
+ const nextValue = `${value.slice(0, lineStart)}${updatedLines.join("\n")}${value.slice(lineEnd)}`;
23
+ const nextStart = normalized.start + indentUnit.length;
24
+ const nextEnd = normalized.end + indentUnit.length * lines.length;
25
+ return {
26
+ value: nextValue,
27
+ selection: createSelection(nextStart, nextEnd),
28
+ changed: nextValue !== value,
29
+ };
30
+ }
31
+ export function outdentSelection(value, selection, indentUnit = "\t") {
32
+ const normalized = normalizeSelection(selection, value.length);
33
+ const { lineStart, lineEnd, lines, isMultiLine } = getSelectedLineRange(value, normalized);
34
+ const removeIndent = (line) => {
35
+ if (line.startsWith(indentUnit)) {
36
+ return { line: line.slice(indentUnit.length), removed: indentUnit.length };
37
+ }
38
+ if (indentUnit === "\t" && line.startsWith(" ")) {
39
+ return { line: line.slice(2), removed: 2 };
40
+ }
41
+ return { line, removed: 0 };
42
+ };
43
+ if (!isMultiLine) {
44
+ if (normalized.start === normalized.end) {
45
+ const currentLineStart = value.lastIndexOf("\n", Math.max(0, normalized.start - 1)) + 1;
46
+ const currentLine = value.slice(currentLineStart, value.indexOf("\n", normalized.start) === -1 ? value.length : value.indexOf("\n", normalized.start));
47
+ const { removed } = removeIndent(currentLine);
48
+ if (removed === 0) {
49
+ return { value, selection: normalized, changed: false };
50
+ }
51
+ const nextValue = `${value.slice(0, currentLineStart)}${currentLine.slice(removed)}${value.slice(currentLineStart + currentLine.length)}`;
52
+ const nextOffset = Math.max(currentLineStart, normalized.start - removed);
53
+ return {
54
+ value: nextValue,
55
+ selection: createSelection(nextOffset, nextOffset),
56
+ changed: nextValue !== value,
57
+ };
58
+ }
59
+ }
60
+ let removedBeforeStart = 0;
61
+ let removedTotal = 0;
62
+ const updatedLines = lines.map((line, index) => {
63
+ const result = removeIndent(line);
64
+ if (index === 0)
65
+ removedBeforeStart = result.removed;
66
+ removedTotal += result.removed;
67
+ return result.line;
68
+ });
69
+ const nextValue = `${value.slice(0, lineStart)}${updatedLines.join("\n")}${value.slice(lineEnd)}`;
70
+ const nextStart = Math.max(lineStart, normalized.start - removedBeforeStart);
71
+ const nextEnd = Math.max(nextStart, normalized.end - removedTotal);
72
+ return {
73
+ value: nextValue,
74
+ selection: createSelection(nextStart, nextEnd),
75
+ changed: nextValue !== value,
76
+ };
77
+ }
78
+ //# sourceMappingURL=transforms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transforms.js","sourceRoot":"","sources":["../src/transforms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ export type MarkdownEditorSelectionDirection = "forward" | "backward" | "none";
2
+ export interface MarkdownEditorSelection {
3
+ readonly start: number;
4
+ readonly end: number;
5
+ readonly direction?: MarkdownEditorSelectionDirection;
6
+ }
7
+ export interface MarkdownEditorCursorPosition {
8
+ readonly offset: number;
9
+ readonly line: number;
10
+ readonly column: number;
11
+ }
12
+ export interface MarkdownEditorSnapshot {
13
+ readonly value: string;
14
+ readonly selection: MarkdownEditorSelection;
15
+ }
16
+ export interface MarkdownEditorHistoryState {
17
+ readonly past: readonly MarkdownEditorSnapshot[];
18
+ readonly present: MarkdownEditorSnapshot;
19
+ readonly future: readonly MarkdownEditorSnapshot[];
20
+ readonly limit: number;
21
+ }
22
+ export type MarkdownEditorBuiltinCommandId = "bold" | "italic" | "strikethrough" | "indent" | "outdent" | "undo" | "redo" | "insert-tab";
23
+ export interface MarkdownEditorCommandOptions {
24
+ readonly indentUnit?: string;
25
+ }
26
+ export interface MarkdownEditorEditResult {
27
+ readonly value: string;
28
+ readonly selection: MarkdownEditorSelection;
29
+ readonly changed: boolean;
30
+ }
31
+ export interface MarkdownEditorHistoryStatus {
32
+ readonly canUndo: boolean;
33
+ readonly canRedo: boolean;
34
+ }
35
+ export interface MarkdownEditorHostEditApi {
36
+ getSnapshot(): MarkdownEditorSnapshot;
37
+ getSelection(): MarkdownEditorSelection;
38
+ setSelection(selection: MarkdownEditorSelection): void;
39
+ applyEdit(result: MarkdownEditorEditResult, options?: {
40
+ historic?: boolean;
41
+ }): void;
42
+ executeCommand(command: MarkdownEditorBuiltinCommandId, options?: MarkdownEditorCommandOptions): MarkdownEditorSnapshot;
43
+ undo(): void;
44
+ redo(): void;
45
+ focus(): void;
46
+ }
47
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gCAAgC,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;AAE/E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,gCAAgC,CAAC;CACvD;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAC;CAC7C;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACjD,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACnD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,8BAA8B,GACtC,MAAM,GACN,QAAQ,GACR,eAAe,GACf,QAAQ,GACR,SAAS,GACT,MAAM,GACN,MAAM,GACN,YAAY,CAAC;AAEjB,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,IAAI,sBAAsB,CAAC;IACtC,YAAY,IAAI,uBAAuB,CAAC;IACxC,YAAY,CAAC,SAAS,EAAE,uBAAuB,GAAG,IAAI,CAAC;IACvD,SAAS,CAAC,MAAM,EAAE,wBAAwB,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACpF,cAAc,CACZ,OAAO,EAAE,8BAA8B,EACvC,OAAO,CAAC,EAAE,4BAA4B,GACrC,sBAAsB,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC;IACb,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,IAAI,IAAI,CAAC;CACf"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare const MARKDOWN_EDITOR_CORE_VERSION = "1.0.1";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,4BAA4B,UAAU,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const MARKDOWN_EDITOR_CORE_VERSION = "1.0.1";
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,4BAA4B,GAAG,OAAO,CAAC"}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "@mdwrk/markdown-editor-core",
3
+ "version": "1.0.1",
4
+ "type": "module",
5
+ "license": "Apache-2.0",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "engines": {
10
+ "node": ">=20 <23"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "README.md"
15
+ ],
16
+ "sideEffects": false,
17
+ "keywords": [
18
+ "markdown-workspace",
19
+ "editor",
20
+ "markdown",
21
+ "portable",
22
+ "core"
23
+ ],
24
+ "description": "Portable source-mode markdown editor state, selection transforms, command model, and undo/redo history for Markdown Workspace.",
25
+ "dependencies": {},
26
+ "devDependencies": {
27
+ "@mdwrk/markdown-renderer-core": "^1.0.0",
28
+ "vitest": "^2.1.8"
29
+ },
30
+ "scripts": {
31
+ "build": "tsc -p tsconfig.json",
32
+ "typecheck": "tsc --noEmit -p tsconfig.json",
33
+ "lint": "npm run typecheck",
34
+ "test": "vitest run",
35
+ "prepack": "npm run build"
36
+ },
37
+ "exports": {
38
+ ".": {
39
+ "types": "./dist/index.d.ts",
40
+ "import": "./dist/index.js"
41
+ },
42
+ "./version": {
43
+ "types": "./dist/version.d.ts",
44
+ "import": "./dist/version.js"
45
+ },
46
+ "./types": {
47
+ "types": "./dist/types.d.ts",
48
+ "import": "./dist/types.js"
49
+ },
50
+ "./class-names": {
51
+ "types": "./dist/class-names.d.ts",
52
+ "import": "./dist/class-names.js"
53
+ },
54
+ "./selection": {
55
+ "types": "./dist/selection.d.ts",
56
+ "import": "./dist/selection.js"
57
+ },
58
+ "./transforms": {
59
+ "types": "./dist/transforms.d.ts",
60
+ "import": "./dist/transforms.js"
61
+ },
62
+ "./commands": {
63
+ "types": "./dist/commands.d.ts",
64
+ "import": "./dist/commands.js"
65
+ },
66
+ "./history": {
67
+ "types": "./dist/history.d.ts",
68
+ "import": "./dist/history.js"
69
+ }
70
+ },
71
+ "main": "./dist/index.js",
72
+ "types": "./dist/index.d.ts",
73
+ "author": "Jacob Stewart <jacob@swarmauri.com>",
74
+ "homepage": "https://mdwrk.com"
75
+ }