@mdfn/source 0.1.0 → 0.1.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/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +39 -11
package/dist/index.cjs
CHANGED
|
@@ -203,7 +203,7 @@ function createModeController(initial = "visual") {
|
|
|
203
203
|
}
|
|
204
204
|
};
|
|
205
205
|
}
|
|
206
|
-
var MDFN_SOURCE_VERSION = "0.1.
|
|
206
|
+
var MDFN_SOURCE_VERSION = "0.1.1";
|
|
207
207
|
var sourceInternals = Object.freeze({ smallestSourceChange: import_core.smallestSourceChange });
|
|
208
208
|
// Annotate the CommonJS export names for ESM import in node:
|
|
209
209
|
0 && (module.exports = {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { defaultKeymap, indentWithTab } from \"@codemirror/commands\";\nimport { markdown, markdownLanguage } from \"@codemirror/lang-markdown\";\nimport { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { linter, lintGutter, type Diagnostic as CodeMirrorDiagnostic } from \"@codemirror/lint\";\nimport { searchKeymap } from \"@codemirror/search\";\nimport { Compartment, EditorState as CodeMirrorState } from \"@codemirror/state\";\nimport { drawSelection, dropCursor, EditorView, highlightActiveLine, keymap, lineNumbers } from \"@codemirror/view\";\nimport { applyExtensionTextRules, smallestSourceChange, Transaction, type EditorController } from \"@mdfn/core\";\nimport { renderHtml, type RenderPolicy } from \"@mdfn/render\";\n\nexport type EditorMode = \"visual\" | \"source\" | \"split\" | \"preview\" | \"read-only\";\n\nexport interface SourceEditorOptions {\n readonly target: HTMLElement;\n readonly controller: EditorController;\n readonly readOnly?: boolean;\n readonly lineNumbers?: boolean;\n readonly ariaLabel?: string;\n readonly onFocus?: () => void;\n readonly onBlur?: () => void;\n}\n\nexport interface SourceEditor {\n readonly view: EditorView;\n focus(): void;\n setReadOnly(readOnly: boolean): void;\n destroy(): void;\n}\n\nfunction diagnostics(controller: EditorController): CodeMirrorDiagnostic[] {\n const length = controller.getState().markdown.length;\n return controller.getState().diagnostics.map((entry) => ({\n from: Math.max(0, Math.min(length, entry.source?.from ?? 0)),\n to: Math.max(0, Math.min(length, entry.source?.to ?? entry.source?.from ?? 0)),\n severity: entry.severity === \"error\" ? \"error\" : entry.severity === \"warning\" ? \"warning\" : \"info\",\n message: entry.message,\n source: entry.extension ?? \"mdfn\",\n }));\n}\n\nexport function createSourceEditor(options: SourceEditorOptions): SourceEditor {\n if (typeof document === \"undefined\") throw new Error(\"MDFN_SOURCE_BROWSER_REQUIRED\");\n let syncing = false;\n let readOnly = options.readOnly ?? false;\n const readOnlyConfig = new Compartment();\n const extensionKeys = Object.entries(options.controller.extensions.keymap).map(([key, command]) => ({ key, run: () => !readOnly && options.controller.run(command) }));\n const extensions = [\n options.lineNumbers === false ? [] : lineNumbers(),\n drawSelection(),\n dropCursor(),\n highlightActiveLine(),\n bracketMatching(),\n syntaxHighlighting(defaultHighlightStyle, { fallback: true }),\n markdown({ base: markdownLanguage }),\n lintGutter(),\n linter(() => diagnostics(options.controller), { delay: 100 }),\n keymap.of([\n ...extensionKeys,\n { key: \"Mod-z\", run: () => !readOnly && options.controller.undo() },\n { key: \"Mod-Shift-z\", run: () => !readOnly && options.controller.redo() },\n { key: \"Mod-y\", run: () => !readOnly && options.controller.redo() },\n indentWithTab,\n ...defaultKeymap,\n ...searchKeymap,\n ]),\n readOnlyConfig.of([\n CodeMirrorState.readOnly.of(readOnly),\n EditorView.editable.of(!readOnly),\n ]),\n EditorView.contentAttributes.of({ \"aria-label\": options.ariaLabel ?? \"Markdown source\", \"data-mdfn-editor\": \"source\" }),\n EditorView.domEventHandlers({\n focus: () => { options.onFocus?.(); return false; },\n blur: () => { options.onBlur?.(); return false; },\n }),\n EditorView.updateListener.of((update) => {\n if (syncing || (!update.docChanged && !update.selectionSet)) return;\n let transaction = new Transaction().withSource(\"source\");\n if (update.docChanged) {\n let current = options.controller.getState().markdown;\n let offset = 0;\n const corrections: Array<{ from: number; to: number; insert: string }> = [];\n const pasted = update.transactions.some((entry) => entry.isUserEvent(\"input.paste\"));\n const rules = pasted ? options.controller.extensions.pasteRules : options.controller.extensions.inputRules;\n update.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {\n const from = fromA + offset;\n const to = toA + offset;\n const rawInsert = inserted.toString();\n const insert = applyExtensionTextRules(rawInsert, current, from, to, rules);\n transaction = transaction.replaceSource(from, to, insert);\n current = `${current.slice(0, from)}${insert}${current.slice(to)}`;\n offset += insert.length - (toA - fromA);\n if (insert !== rawInsert) corrections.push({ from: fromB, to: toB, insert });\n });\n if (corrections.length > 0) {\n syncing = true;\n update.view.dispatch({ changes: corrections });\n syncing = false;\n }\n }\n const main = update.view.state.selection.main;\n transaction = transaction.setSelection({ kind: \"text\", anchor: main.anchor, head: main.head });\n try {\n options.controller.dispatch(transaction);\n } catch {\n const canonical = options.controller.getState();\n const current = update.view.state.doc.toString();\n const selection = canonical.selection?.kind === \"text\"\n ? {\n anchor: Math.min(canonical.selection.anchor, canonical.markdown.length),\n head: Math.min(canonical.selection.head, canonical.markdown.length),\n }\n : undefined;\n syncing = true;\n update.view.dispatch({\n changes: { from: 0, to: current.length, insert: canonical.markdown },\n ...(selection ? { selection } : {}),\n });\n syncing = false;\n }\n }),\n ];\n const controllerSelection = options.controller.getState().selection;\n const initialSelection = controllerSelection?.kind === \"text\"\n ? { anchor: Math.min(controllerSelection.anchor, options.controller.getState().markdown.length), head: Math.min(controllerSelection.head, options.controller.getState().markdown.length) }\n : undefined;\n const view = new EditorView({\n parent: options.target,\n state: CodeMirrorState.create({ doc: options.controller.getState().markdown, selection: initialSelection, extensions }),\n });\n const unsubscribe = options.controller.subscribe((change) => {\n if (change.source === \"source\") return;\n const current = view.state.doc.toString();\n const selection = change.current.selection?.kind === \"text\"\n ? { anchor: change.current.selection.anchor, head: change.current.selection.head }\n : undefined;\n const documentChanged = current !== change.current.markdown;\n if (!documentChanged && !change.selectionChanged) return;\n syncing = true;\n view.dispatch({\n ...(documentChanged ? { changes: { from: 0, to: current.length, insert: change.current.markdown } } : {}),\n ...(selection ? { selection } : {}),\n });\n syncing = false;\n });\n return {\n view,\n focus() { view.focus(); },\n setReadOnly(value) {\n readOnly = value;\n view.dispatch({\n effects: readOnlyConfig.reconfigure([\n CodeMirrorState.readOnly.of(readOnly),\n EditorView.editable.of(!readOnly),\n ]),\n });\n },\n destroy() { unsubscribe(); view.destroy(); },\n };\n}\n\nexport interface PreviewResult {\n readonly html: string;\n readonly diagnostics: ReturnType<typeof renderHtml>[\"diagnostics\"];\n}\n\nexport function createPreview(controller: EditorController, policy?: RenderPolicy): PreviewResult {\n const rendered = renderHtml(controller.getState().document, {\n ...policy,\n extensions: policy?.extensions ?? controller.extensions,\n });\n return { html: rendered.html, diagnostics: rendered.diagnostics };\n}\n\nexport interface ModeController {\n getMode(): EditorMode;\n setMode(mode: EditorMode): void;\n subscribe(listener: (mode: EditorMode) => void): () => void;\n destroy(): void;\n}\n\nexport function createModeController(initial: EditorMode = \"visual\"): ModeController {\n let mode = initial;\n let destroyed = false;\n const listeners = new Set<(mode: EditorMode) => void>();\n return {\n getMode() { if (destroyed) throw new Error(\"MDFN_MODE_CONTROLLER_DESTROYED\"); return mode; },\n setMode(next) { if (destroyed) throw new Error(\"MDFN_MODE_CONTROLLER_DESTROYED\"); if (next === mode) return; mode = next; listeners.forEach((listener) => listener(mode)); },\n subscribe(listener) { if (destroyed) throw new Error(\"MDFN_MODE_CONTROLLER_DESTROYED\"); listeners.add(listener); return () => listeners.delete(listener); },\n destroy() { destroyed = true; listeners.clear(); },\n };\n}\n\nexport const MDFN_SOURCE_VERSION = \"0.1.0\" as const;\n\nexport const sourceInternals = Object.freeze({ smallestSourceChange });\n"],"mappings":"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","names":["CodeMirrorState"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { defaultKeymap, indentWithTab } from \"@codemirror/commands\";\nimport { markdown, markdownLanguage } from \"@codemirror/lang-markdown\";\nimport { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { linter, lintGutter, type Diagnostic as CodeMirrorDiagnostic } from \"@codemirror/lint\";\nimport { searchKeymap } from \"@codemirror/search\";\nimport { Compartment, EditorState as CodeMirrorState } from \"@codemirror/state\";\nimport { drawSelection, dropCursor, EditorView, highlightActiveLine, keymap, lineNumbers } from \"@codemirror/view\";\nimport { applyExtensionTextRules, smallestSourceChange, Transaction, type EditorController } from \"@mdfn/core\";\nimport { renderHtml, type RenderPolicy } from \"@mdfn/render\";\n\nexport type EditorMode = \"visual\" | \"source\" | \"split\" | \"preview\" | \"read-only\";\n\nexport interface SourceEditorOptions {\n readonly target: HTMLElement;\n readonly controller: EditorController;\n readonly readOnly?: boolean;\n readonly lineNumbers?: boolean;\n readonly ariaLabel?: string;\n readonly onFocus?: () => void;\n readonly onBlur?: () => void;\n}\n\nexport interface SourceEditor {\n readonly view: EditorView;\n focus(): void;\n setReadOnly(readOnly: boolean): void;\n destroy(): void;\n}\n\nfunction diagnostics(controller: EditorController): CodeMirrorDiagnostic[] {\n const length = controller.getState().markdown.length;\n return controller.getState().diagnostics.map((entry) => ({\n from: Math.max(0, Math.min(length, entry.source?.from ?? 0)),\n to: Math.max(0, Math.min(length, entry.source?.to ?? entry.source?.from ?? 0)),\n severity: entry.severity === \"error\" ? \"error\" : entry.severity === \"warning\" ? \"warning\" : \"info\",\n message: entry.message,\n source: entry.extension ?? \"mdfn\",\n }));\n}\n\nexport function createSourceEditor(options: SourceEditorOptions): SourceEditor {\n if (typeof document === \"undefined\") throw new Error(\"MDFN_SOURCE_BROWSER_REQUIRED\");\n let syncing = false;\n let readOnly = options.readOnly ?? false;\n const readOnlyConfig = new Compartment();\n const extensionKeys = Object.entries(options.controller.extensions.keymap).map(([key, command]) => ({ key, run: () => !readOnly && options.controller.run(command) }));\n const extensions = [\n options.lineNumbers === false ? [] : lineNumbers(),\n drawSelection(),\n dropCursor(),\n highlightActiveLine(),\n bracketMatching(),\n syntaxHighlighting(defaultHighlightStyle, { fallback: true }),\n markdown({ base: markdownLanguage }),\n lintGutter(),\n linter(() => diagnostics(options.controller), { delay: 100 }),\n keymap.of([\n ...extensionKeys,\n { key: \"Mod-z\", run: () => !readOnly && options.controller.undo() },\n { key: \"Mod-Shift-z\", run: () => !readOnly && options.controller.redo() },\n { key: \"Mod-y\", run: () => !readOnly && options.controller.redo() },\n indentWithTab,\n ...defaultKeymap,\n ...searchKeymap,\n ]),\n readOnlyConfig.of([\n CodeMirrorState.readOnly.of(readOnly),\n EditorView.editable.of(!readOnly),\n ]),\n EditorView.contentAttributes.of({ \"aria-label\": options.ariaLabel ?? \"Markdown source\", \"data-mdfn-editor\": \"source\" }),\n EditorView.domEventHandlers({\n focus: () => { options.onFocus?.(); return false; },\n blur: () => { options.onBlur?.(); return false; },\n }),\n EditorView.updateListener.of((update) => {\n if (syncing || (!update.docChanged && !update.selectionSet)) return;\n let transaction = new Transaction().withSource(\"source\");\n if (update.docChanged) {\n let current = options.controller.getState().markdown;\n let offset = 0;\n const corrections: Array<{ from: number; to: number; insert: string }> = [];\n const pasted = update.transactions.some((entry) => entry.isUserEvent(\"input.paste\"));\n const rules = pasted ? options.controller.extensions.pasteRules : options.controller.extensions.inputRules;\n update.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {\n const from = fromA + offset;\n const to = toA + offset;\n const rawInsert = inserted.toString();\n const insert = applyExtensionTextRules(rawInsert, current, from, to, rules);\n transaction = transaction.replaceSource(from, to, insert);\n current = `${current.slice(0, from)}${insert}${current.slice(to)}`;\n offset += insert.length - (toA - fromA);\n if (insert !== rawInsert) corrections.push({ from: fromB, to: toB, insert });\n });\n if (corrections.length > 0) {\n syncing = true;\n update.view.dispatch({ changes: corrections });\n syncing = false;\n }\n }\n const main = update.view.state.selection.main;\n transaction = transaction.setSelection({ kind: \"text\", anchor: main.anchor, head: main.head });\n try {\n options.controller.dispatch(transaction);\n } catch {\n const canonical = options.controller.getState();\n const current = update.view.state.doc.toString();\n const selection = canonical.selection?.kind === \"text\"\n ? {\n anchor: Math.min(canonical.selection.anchor, canonical.markdown.length),\n head: Math.min(canonical.selection.head, canonical.markdown.length),\n }\n : undefined;\n syncing = true;\n update.view.dispatch({\n changes: { from: 0, to: current.length, insert: canonical.markdown },\n ...(selection ? { selection } : {}),\n });\n syncing = false;\n }\n }),\n ];\n const controllerSelection = options.controller.getState().selection;\n const initialSelection = controllerSelection?.kind === \"text\"\n ? { anchor: Math.min(controllerSelection.anchor, options.controller.getState().markdown.length), head: Math.min(controllerSelection.head, options.controller.getState().markdown.length) }\n : undefined;\n const view = new EditorView({\n parent: options.target,\n state: CodeMirrorState.create({ doc: options.controller.getState().markdown, selection: initialSelection, extensions }),\n });\n const unsubscribe = options.controller.subscribe((change) => {\n if (change.source === \"source\") return;\n const current = view.state.doc.toString();\n const selection = change.current.selection?.kind === \"text\"\n ? { anchor: change.current.selection.anchor, head: change.current.selection.head }\n : undefined;\n const documentChanged = current !== change.current.markdown;\n if (!documentChanged && !change.selectionChanged) return;\n syncing = true;\n view.dispatch({\n ...(documentChanged ? { changes: { from: 0, to: current.length, insert: change.current.markdown } } : {}),\n ...(selection ? { selection } : {}),\n });\n syncing = false;\n });\n return {\n view,\n focus() { view.focus(); },\n setReadOnly(value) {\n readOnly = value;\n view.dispatch({\n effects: readOnlyConfig.reconfigure([\n CodeMirrorState.readOnly.of(readOnly),\n EditorView.editable.of(!readOnly),\n ]),\n });\n },\n destroy() { unsubscribe(); view.destroy(); },\n };\n}\n\nexport interface PreviewResult {\n readonly html: string;\n readonly diagnostics: ReturnType<typeof renderHtml>[\"diagnostics\"];\n}\n\nexport function createPreview(controller: EditorController, policy?: RenderPolicy): PreviewResult {\n const rendered = renderHtml(controller.getState().document, {\n ...policy,\n extensions: policy?.extensions ?? controller.extensions,\n });\n return { html: rendered.html, diagnostics: rendered.diagnostics };\n}\n\nexport interface ModeController {\n getMode(): EditorMode;\n setMode(mode: EditorMode): void;\n subscribe(listener: (mode: EditorMode) => void): () => void;\n destroy(): void;\n}\n\nexport function createModeController(initial: EditorMode = \"visual\"): ModeController {\n let mode = initial;\n let destroyed = false;\n const listeners = new Set<(mode: EditorMode) => void>();\n return {\n getMode() { if (destroyed) throw new Error(\"MDFN_MODE_CONTROLLER_DESTROYED\"); return mode; },\n setMode(next) { if (destroyed) throw new Error(\"MDFN_MODE_CONTROLLER_DESTROYED\"); if (next === mode) return; mode = next; listeners.forEach((listener) => listener(mode)); },\n subscribe(listener) { if (destroyed) throw new Error(\"MDFN_MODE_CONTROLLER_DESTROYED\"); listeners.add(listener); return () => listeners.delete(listener); },\n destroy() { destroyed = true; listeners.clear(); },\n };\n}\n\nexport const MDFN_SOURCE_VERSION = \"0.1.1\" as const;\n\nexport const sourceInternals = Object.freeze({ smallestSourceChange });\n"],"mappings":"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","names":["CodeMirrorState"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -31,7 +31,7 @@ interface ModeController {
|
|
|
31
31
|
destroy(): void;
|
|
32
32
|
}
|
|
33
33
|
declare function createModeController(initial?: EditorMode): ModeController;
|
|
34
|
-
declare const MDFN_SOURCE_VERSION: "0.1.
|
|
34
|
+
declare const MDFN_SOURCE_VERSION: "0.1.1";
|
|
35
35
|
declare const sourceInternals: Readonly<{
|
|
36
36
|
smallestSourceChange: typeof smallestSourceChange;
|
|
37
37
|
}>;
|
package/dist/index.d.ts
CHANGED
|
@@ -31,7 +31,7 @@ interface ModeController {
|
|
|
31
31
|
destroy(): void;
|
|
32
32
|
}
|
|
33
33
|
declare function createModeController(initial?: EditorMode): ModeController;
|
|
34
|
-
declare const MDFN_SOURCE_VERSION: "0.1.
|
|
34
|
+
declare const MDFN_SOURCE_VERSION: "0.1.1";
|
|
35
35
|
declare const sourceInternals: Readonly<{
|
|
36
36
|
smallestSourceChange: typeof smallestSourceChange;
|
|
37
37
|
}>;
|
package/dist/index.js
CHANGED
|
@@ -175,7 +175,7 @@ function createModeController(initial = "visual") {
|
|
|
175
175
|
}
|
|
176
176
|
};
|
|
177
177
|
}
|
|
178
|
-
var MDFN_SOURCE_VERSION = "0.1.
|
|
178
|
+
var MDFN_SOURCE_VERSION = "0.1.1";
|
|
179
179
|
var sourceInternals = Object.freeze({ smallestSourceChange });
|
|
180
180
|
export {
|
|
181
181
|
MDFN_SOURCE_VERSION,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { defaultKeymap, indentWithTab } from \"@codemirror/commands\";\nimport { markdown, markdownLanguage } from \"@codemirror/lang-markdown\";\nimport { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { linter, lintGutter, type Diagnostic as CodeMirrorDiagnostic } from \"@codemirror/lint\";\nimport { searchKeymap } from \"@codemirror/search\";\nimport { Compartment, EditorState as CodeMirrorState } from \"@codemirror/state\";\nimport { drawSelection, dropCursor, EditorView, highlightActiveLine, keymap, lineNumbers } from \"@codemirror/view\";\nimport { applyExtensionTextRules, smallestSourceChange, Transaction, type EditorController } from \"@mdfn/core\";\nimport { renderHtml, type RenderPolicy } from \"@mdfn/render\";\n\nexport type EditorMode = \"visual\" | \"source\" | \"split\" | \"preview\" | \"read-only\";\n\nexport interface SourceEditorOptions {\n readonly target: HTMLElement;\n readonly controller: EditorController;\n readonly readOnly?: boolean;\n readonly lineNumbers?: boolean;\n readonly ariaLabel?: string;\n readonly onFocus?: () => void;\n readonly onBlur?: () => void;\n}\n\nexport interface SourceEditor {\n readonly view: EditorView;\n focus(): void;\n setReadOnly(readOnly: boolean): void;\n destroy(): void;\n}\n\nfunction diagnostics(controller: EditorController): CodeMirrorDiagnostic[] {\n const length = controller.getState().markdown.length;\n return controller.getState().diagnostics.map((entry) => ({\n from: Math.max(0, Math.min(length, entry.source?.from ?? 0)),\n to: Math.max(0, Math.min(length, entry.source?.to ?? entry.source?.from ?? 0)),\n severity: entry.severity === \"error\" ? \"error\" : entry.severity === \"warning\" ? \"warning\" : \"info\",\n message: entry.message,\n source: entry.extension ?? \"mdfn\",\n }));\n}\n\nexport function createSourceEditor(options: SourceEditorOptions): SourceEditor {\n if (typeof document === \"undefined\") throw new Error(\"MDFN_SOURCE_BROWSER_REQUIRED\");\n let syncing = false;\n let readOnly = options.readOnly ?? false;\n const readOnlyConfig = new Compartment();\n const extensionKeys = Object.entries(options.controller.extensions.keymap).map(([key, command]) => ({ key, run: () => !readOnly && options.controller.run(command) }));\n const extensions = [\n options.lineNumbers === false ? [] : lineNumbers(),\n drawSelection(),\n dropCursor(),\n highlightActiveLine(),\n bracketMatching(),\n syntaxHighlighting(defaultHighlightStyle, { fallback: true }),\n markdown({ base: markdownLanguage }),\n lintGutter(),\n linter(() => diagnostics(options.controller), { delay: 100 }),\n keymap.of([\n ...extensionKeys,\n { key: \"Mod-z\", run: () => !readOnly && options.controller.undo() },\n { key: \"Mod-Shift-z\", run: () => !readOnly && options.controller.redo() },\n { key: \"Mod-y\", run: () => !readOnly && options.controller.redo() },\n indentWithTab,\n ...defaultKeymap,\n ...searchKeymap,\n ]),\n readOnlyConfig.of([\n CodeMirrorState.readOnly.of(readOnly),\n EditorView.editable.of(!readOnly),\n ]),\n EditorView.contentAttributes.of({ \"aria-label\": options.ariaLabel ?? \"Markdown source\", \"data-mdfn-editor\": \"source\" }),\n EditorView.domEventHandlers({\n focus: () => { options.onFocus?.(); return false; },\n blur: () => { options.onBlur?.(); return false; },\n }),\n EditorView.updateListener.of((update) => {\n if (syncing || (!update.docChanged && !update.selectionSet)) return;\n let transaction = new Transaction().withSource(\"source\");\n if (update.docChanged) {\n let current = options.controller.getState().markdown;\n let offset = 0;\n const corrections: Array<{ from: number; to: number; insert: string }> = [];\n const pasted = update.transactions.some((entry) => entry.isUserEvent(\"input.paste\"));\n const rules = pasted ? options.controller.extensions.pasteRules : options.controller.extensions.inputRules;\n update.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {\n const from = fromA + offset;\n const to = toA + offset;\n const rawInsert = inserted.toString();\n const insert = applyExtensionTextRules(rawInsert, current, from, to, rules);\n transaction = transaction.replaceSource(from, to, insert);\n current = `${current.slice(0, from)}${insert}${current.slice(to)}`;\n offset += insert.length - (toA - fromA);\n if (insert !== rawInsert) corrections.push({ from: fromB, to: toB, insert });\n });\n if (corrections.length > 0) {\n syncing = true;\n update.view.dispatch({ changes: corrections });\n syncing = false;\n }\n }\n const main = update.view.state.selection.main;\n transaction = transaction.setSelection({ kind: \"text\", anchor: main.anchor, head: main.head });\n try {\n options.controller.dispatch(transaction);\n } catch {\n const canonical = options.controller.getState();\n const current = update.view.state.doc.toString();\n const selection = canonical.selection?.kind === \"text\"\n ? {\n anchor: Math.min(canonical.selection.anchor, canonical.markdown.length),\n head: Math.min(canonical.selection.head, canonical.markdown.length),\n }\n : undefined;\n syncing = true;\n update.view.dispatch({\n changes: { from: 0, to: current.length, insert: canonical.markdown },\n ...(selection ? { selection } : {}),\n });\n syncing = false;\n }\n }),\n ];\n const controllerSelection = options.controller.getState().selection;\n const initialSelection = controllerSelection?.kind === \"text\"\n ? { anchor: Math.min(controllerSelection.anchor, options.controller.getState().markdown.length), head: Math.min(controllerSelection.head, options.controller.getState().markdown.length) }\n : undefined;\n const view = new EditorView({\n parent: options.target,\n state: CodeMirrorState.create({ doc: options.controller.getState().markdown, selection: initialSelection, extensions }),\n });\n const unsubscribe = options.controller.subscribe((change) => {\n if (change.source === \"source\") return;\n const current = view.state.doc.toString();\n const selection = change.current.selection?.kind === \"text\"\n ? { anchor: change.current.selection.anchor, head: change.current.selection.head }\n : undefined;\n const documentChanged = current !== change.current.markdown;\n if (!documentChanged && !change.selectionChanged) return;\n syncing = true;\n view.dispatch({\n ...(documentChanged ? { changes: { from: 0, to: current.length, insert: change.current.markdown } } : {}),\n ...(selection ? { selection } : {}),\n });\n syncing = false;\n });\n return {\n view,\n focus() { view.focus(); },\n setReadOnly(value) {\n readOnly = value;\n view.dispatch({\n effects: readOnlyConfig.reconfigure([\n CodeMirrorState.readOnly.of(readOnly),\n EditorView.editable.of(!readOnly),\n ]),\n });\n },\n destroy() { unsubscribe(); view.destroy(); },\n };\n}\n\nexport interface PreviewResult {\n readonly html: string;\n readonly diagnostics: ReturnType<typeof renderHtml>[\"diagnostics\"];\n}\n\nexport function createPreview(controller: EditorController, policy?: RenderPolicy): PreviewResult {\n const rendered = renderHtml(controller.getState().document, {\n ...policy,\n extensions: policy?.extensions ?? controller.extensions,\n });\n return { html: rendered.html, diagnostics: rendered.diagnostics };\n}\n\nexport interface ModeController {\n getMode(): EditorMode;\n setMode(mode: EditorMode): void;\n subscribe(listener: (mode: EditorMode) => void): () => void;\n destroy(): void;\n}\n\nexport function createModeController(initial: EditorMode = \"visual\"): ModeController {\n let mode = initial;\n let destroyed = false;\n const listeners = new Set<(mode: EditorMode) => void>();\n return {\n getMode() { if (destroyed) throw new Error(\"MDFN_MODE_CONTROLLER_DESTROYED\"); return mode; },\n setMode(next) { if (destroyed) throw new Error(\"MDFN_MODE_CONTROLLER_DESTROYED\"); if (next === mode) return; mode = next; listeners.forEach((listener) => listener(mode)); },\n subscribe(listener) { if (destroyed) throw new Error(\"MDFN_MODE_CONTROLLER_DESTROYED\"); listeners.add(listener); return () => listeners.delete(listener); },\n destroy() { destroyed = true; listeners.clear(); },\n };\n}\n\nexport const MDFN_SOURCE_VERSION = \"0.1.0\" as const;\n\nexport const sourceInternals = Object.freeze({ smallestSourceChange });\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { defaultKeymap, indentWithTab } from \"@codemirror/commands\";\nimport { markdown, markdownLanguage } from \"@codemirror/lang-markdown\";\nimport { bracketMatching, defaultHighlightStyle, syntaxHighlighting } from \"@codemirror/language\";\nimport { linter, lintGutter, type Diagnostic as CodeMirrorDiagnostic } from \"@codemirror/lint\";\nimport { searchKeymap } from \"@codemirror/search\";\nimport { Compartment, EditorState as CodeMirrorState } from \"@codemirror/state\";\nimport { drawSelection, dropCursor, EditorView, highlightActiveLine, keymap, lineNumbers } from \"@codemirror/view\";\nimport { applyExtensionTextRules, smallestSourceChange, Transaction, type EditorController } from \"@mdfn/core\";\nimport { renderHtml, type RenderPolicy } from \"@mdfn/render\";\n\nexport type EditorMode = \"visual\" | \"source\" | \"split\" | \"preview\" | \"read-only\";\n\nexport interface SourceEditorOptions {\n readonly target: HTMLElement;\n readonly controller: EditorController;\n readonly readOnly?: boolean;\n readonly lineNumbers?: boolean;\n readonly ariaLabel?: string;\n readonly onFocus?: () => void;\n readonly onBlur?: () => void;\n}\n\nexport interface SourceEditor {\n readonly view: EditorView;\n focus(): void;\n setReadOnly(readOnly: boolean): void;\n destroy(): void;\n}\n\nfunction diagnostics(controller: EditorController): CodeMirrorDiagnostic[] {\n const length = controller.getState().markdown.length;\n return controller.getState().diagnostics.map((entry) => ({\n from: Math.max(0, Math.min(length, entry.source?.from ?? 0)),\n to: Math.max(0, Math.min(length, entry.source?.to ?? entry.source?.from ?? 0)),\n severity: entry.severity === \"error\" ? \"error\" : entry.severity === \"warning\" ? \"warning\" : \"info\",\n message: entry.message,\n source: entry.extension ?? \"mdfn\",\n }));\n}\n\nexport function createSourceEditor(options: SourceEditorOptions): SourceEditor {\n if (typeof document === \"undefined\") throw new Error(\"MDFN_SOURCE_BROWSER_REQUIRED\");\n let syncing = false;\n let readOnly = options.readOnly ?? false;\n const readOnlyConfig = new Compartment();\n const extensionKeys = Object.entries(options.controller.extensions.keymap).map(([key, command]) => ({ key, run: () => !readOnly && options.controller.run(command) }));\n const extensions = [\n options.lineNumbers === false ? [] : lineNumbers(),\n drawSelection(),\n dropCursor(),\n highlightActiveLine(),\n bracketMatching(),\n syntaxHighlighting(defaultHighlightStyle, { fallback: true }),\n markdown({ base: markdownLanguage }),\n lintGutter(),\n linter(() => diagnostics(options.controller), { delay: 100 }),\n keymap.of([\n ...extensionKeys,\n { key: \"Mod-z\", run: () => !readOnly && options.controller.undo() },\n { key: \"Mod-Shift-z\", run: () => !readOnly && options.controller.redo() },\n { key: \"Mod-y\", run: () => !readOnly && options.controller.redo() },\n indentWithTab,\n ...defaultKeymap,\n ...searchKeymap,\n ]),\n readOnlyConfig.of([\n CodeMirrorState.readOnly.of(readOnly),\n EditorView.editable.of(!readOnly),\n ]),\n EditorView.contentAttributes.of({ \"aria-label\": options.ariaLabel ?? \"Markdown source\", \"data-mdfn-editor\": \"source\" }),\n EditorView.domEventHandlers({\n focus: () => { options.onFocus?.(); return false; },\n blur: () => { options.onBlur?.(); return false; },\n }),\n EditorView.updateListener.of((update) => {\n if (syncing || (!update.docChanged && !update.selectionSet)) return;\n let transaction = new Transaction().withSource(\"source\");\n if (update.docChanged) {\n let current = options.controller.getState().markdown;\n let offset = 0;\n const corrections: Array<{ from: number; to: number; insert: string }> = [];\n const pasted = update.transactions.some((entry) => entry.isUserEvent(\"input.paste\"));\n const rules = pasted ? options.controller.extensions.pasteRules : options.controller.extensions.inputRules;\n update.changes.iterChanges((fromA, toA, fromB, toB, inserted) => {\n const from = fromA + offset;\n const to = toA + offset;\n const rawInsert = inserted.toString();\n const insert = applyExtensionTextRules(rawInsert, current, from, to, rules);\n transaction = transaction.replaceSource(from, to, insert);\n current = `${current.slice(0, from)}${insert}${current.slice(to)}`;\n offset += insert.length - (toA - fromA);\n if (insert !== rawInsert) corrections.push({ from: fromB, to: toB, insert });\n });\n if (corrections.length > 0) {\n syncing = true;\n update.view.dispatch({ changes: corrections });\n syncing = false;\n }\n }\n const main = update.view.state.selection.main;\n transaction = transaction.setSelection({ kind: \"text\", anchor: main.anchor, head: main.head });\n try {\n options.controller.dispatch(transaction);\n } catch {\n const canonical = options.controller.getState();\n const current = update.view.state.doc.toString();\n const selection = canonical.selection?.kind === \"text\"\n ? {\n anchor: Math.min(canonical.selection.anchor, canonical.markdown.length),\n head: Math.min(canonical.selection.head, canonical.markdown.length),\n }\n : undefined;\n syncing = true;\n update.view.dispatch({\n changes: { from: 0, to: current.length, insert: canonical.markdown },\n ...(selection ? { selection } : {}),\n });\n syncing = false;\n }\n }),\n ];\n const controllerSelection = options.controller.getState().selection;\n const initialSelection = controllerSelection?.kind === \"text\"\n ? { anchor: Math.min(controllerSelection.anchor, options.controller.getState().markdown.length), head: Math.min(controllerSelection.head, options.controller.getState().markdown.length) }\n : undefined;\n const view = new EditorView({\n parent: options.target,\n state: CodeMirrorState.create({ doc: options.controller.getState().markdown, selection: initialSelection, extensions }),\n });\n const unsubscribe = options.controller.subscribe((change) => {\n if (change.source === \"source\") return;\n const current = view.state.doc.toString();\n const selection = change.current.selection?.kind === \"text\"\n ? { anchor: change.current.selection.anchor, head: change.current.selection.head }\n : undefined;\n const documentChanged = current !== change.current.markdown;\n if (!documentChanged && !change.selectionChanged) return;\n syncing = true;\n view.dispatch({\n ...(documentChanged ? { changes: { from: 0, to: current.length, insert: change.current.markdown } } : {}),\n ...(selection ? { selection } : {}),\n });\n syncing = false;\n });\n return {\n view,\n focus() { view.focus(); },\n setReadOnly(value) {\n readOnly = value;\n view.dispatch({\n effects: readOnlyConfig.reconfigure([\n CodeMirrorState.readOnly.of(readOnly),\n EditorView.editable.of(!readOnly),\n ]),\n });\n },\n destroy() { unsubscribe(); view.destroy(); },\n };\n}\n\nexport interface PreviewResult {\n readonly html: string;\n readonly diagnostics: ReturnType<typeof renderHtml>[\"diagnostics\"];\n}\n\nexport function createPreview(controller: EditorController, policy?: RenderPolicy): PreviewResult {\n const rendered = renderHtml(controller.getState().document, {\n ...policy,\n extensions: policy?.extensions ?? controller.extensions,\n });\n return { html: rendered.html, diagnostics: rendered.diagnostics };\n}\n\nexport interface ModeController {\n getMode(): EditorMode;\n setMode(mode: EditorMode): void;\n subscribe(listener: (mode: EditorMode) => void): () => void;\n destroy(): void;\n}\n\nexport function createModeController(initial: EditorMode = \"visual\"): ModeController {\n let mode = initial;\n let destroyed = false;\n const listeners = new Set<(mode: EditorMode) => void>();\n return {\n getMode() { if (destroyed) throw new Error(\"MDFN_MODE_CONTROLLER_DESTROYED\"); return mode; },\n setMode(next) { if (destroyed) throw new Error(\"MDFN_MODE_CONTROLLER_DESTROYED\"); if (next === mode) return; mode = next; listeners.forEach((listener) => listener(mode)); },\n subscribe(listener) { if (destroyed) throw new Error(\"MDFN_MODE_CONTROLLER_DESTROYED\"); listeners.add(listener); return () => listeners.delete(listener); },\n destroy() { destroyed = true; listeners.clear(); },\n };\n}\n\nexport const MDFN_SOURCE_VERSION = \"0.1.1\" as const;\n\nexport const sourceInternals = Object.freeze({ smallestSourceChange });\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mdfn/source",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Source editor, diagnostics, and source-visual synchronization for mdfn",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
7
7
|
"module": "dist/index.js",
|
|
8
8
|
"types": "dist/index.d.ts",
|
|
9
|
-
"exports": {
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
10
16
|
"scripts": {
|
|
11
17
|
"build": "tsup src/index.ts --format esm,cjs --dts --sourcemap --clean",
|
|
12
18
|
"test": "vitest run",
|
|
@@ -22,16 +28,38 @@
|
|
|
22
28
|
"@codemirror/search": "^6.7.1",
|
|
23
29
|
"@codemirror/state": "^6.7.1",
|
|
24
30
|
"@codemirror/view": "^6.43.8",
|
|
25
|
-
"@mdfn/core": "0.1.
|
|
26
|
-
"@mdfn/markdown": "0.1.
|
|
27
|
-
"@mdfn/render": "0.1.
|
|
31
|
+
"@mdfn/core": "0.1.1",
|
|
32
|
+
"@mdfn/markdown": "0.1.1",
|
|
33
|
+
"@mdfn/render": "0.1.1"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"jsdom": "^26.0.0",
|
|
37
|
+
"tsup": "^8.0.0",
|
|
38
|
+
"typescript": "^5.3.0",
|
|
39
|
+
"vitest": "3.2.4"
|
|
28
40
|
},
|
|
29
|
-
"
|
|
30
|
-
|
|
41
|
+
"files": [
|
|
42
|
+
"dist",
|
|
43
|
+
"README.md"
|
|
44
|
+
],
|
|
31
45
|
"license": "MIT",
|
|
32
|
-
"engines": {
|
|
33
|
-
|
|
34
|
-
|
|
46
|
+
"engines": {
|
|
47
|
+
"node": ">=20 <25"
|
|
48
|
+
},
|
|
49
|
+
"repository": {
|
|
50
|
+
"type": "git",
|
|
51
|
+
"url": "git+https://github.com/21nCo/superfunctions.git",
|
|
52
|
+
"directory": "mdfn/source"
|
|
53
|
+
},
|
|
54
|
+
"publishConfig": {
|
|
55
|
+
"access": "public"
|
|
56
|
+
},
|
|
35
57
|
"sideEffects": false,
|
|
36
|
-
"mdfn": {
|
|
58
|
+
"mdfn": {
|
|
59
|
+
"status": "stable-candidate",
|
|
60
|
+
"layer": "browser",
|
|
61
|
+
"schemaVersion": 1,
|
|
62
|
+
"kernel": "codemirror"
|
|
63
|
+
},
|
|
64
|
+
"gitHead": "699d9d09932199d660333c57fe7bc646492ea3bf"
|
|
37
65
|
}
|