@coze-editor/core-plugins 0.1.0-alpha.0fd19e → 0.1.0-alpha.270604
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/esm/index.js.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/api.ts","../../src/option.ts","../../src/event.ts","../../src/extension.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { pick } from 'es-toolkit';\nimport { RectangleMarker, keymap, type EditorView } from '@codemirror/view';\nimport {\n EditorSelection,\n type Line,\n Prec,\n StateEffect,\n StateField,\n} from '@codemirror/state';\nimport { undo as cmUndo, redo as cmRedo } from '@codemirror/commands';\n\ninterface Context {\n view: EditorView;\n}\n\nexport const getValue =\n ({ view }: Context) =>\n () =>\n view.state.sliceDoc();\n\nexport const setValue =\n ({ view }: Context) =>\n (value: string) => {\n const { state } = view;\n if (state.readOnly) {\n return;\n }\n view.dispatch(\n state.update({\n changes: {\n from: 0,\n to: state.doc.length,\n insert: value ?? '',\n },\n }),\n );\n };\n\nexport const focus =\n ({ view }: Context) =>\n () => {\n view.focus();\n };\n\nexport const blur =\n ({ view }: Context) =>\n () => {\n view.contentDOM.blur();\n };\n\nexport const setCursorPosition =\n ({ view }: Context) =>\n (pos: number): void => {\n view.dispatch({\n selection: {\n head: pos,\n anchor: pos,\n },\n });\n };\n\nexport const getCursorPosition =\n ({ view }: Context) =>\n (): number =>\n view.state.selection.main.head;\n\n// Make sure the given regexp has a $ at its end and, if `start` is\n// true, a ^ at its start.\nfunction ensureAnchor(expr: RegExp, start: boolean) {\n const { source } = expr;\n const addStart = start && source[0] !== '^',\n addEnd = source[source.length - 1] !== '$';\n if (!addStart && !addEnd) {\n return expr;\n }\n return new RegExp(\n `${addStart ? '^' : ''}(?:${source})${addEnd ? '$' : ''}`,\n expr.flags ?? (expr.ignoreCase ? 'i' : ''),\n );\n}\n\nexport const matchBefore =\n ({ view }: Context) =>\n (match: RegExp): { from: number; to: number; text: string } | null => {\n const pos = view.state.selection.main.head;\n const line = view.state.doc.lineAt(pos);\n const start = Math.max(line.from, pos - 250);\n const str = line.text.slice(start - line.from, pos - line.from);\n\n if (match instanceof RegExp) {\n const found = str.search(ensureAnchor(match, false));\n return found < 0\n ? null\n : { from: start + found, to: pos, text: str.slice(found) };\n }\n\n return null;\n };\n\nexport const getView =\n ({ view }: Context) =>\n () =>\n view;\n\nexport interface ReplaceTextByRangeOptions {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n userEvent?: string;\n}\n\nexport const replaceTextByRange =\n ({ view }: Context) =>\n ({\n from,\n to,\n text,\n cursorOffset = 0,\n userEvent,\n }: ReplaceTextByRangeOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const { main } = state.selection;\n const fromOff = from - main.from;\n const toOff = to - main.from;\n\n view.dispatch({\n ...view.state.changeByRange(range => {\n if (\n range !== main &&\n from !== to &&\n state.sliceDoc(range.from + fromOff, range.from + toOff) !==\n state.sliceDoc(from, to)\n ) {\n return { range };\n }\n return {\n changes: {\n from: range.from + fromOff,\n to: to === main.from ? range.to : range.from + toOff,\n insert: text,\n },\n range: EditorSelection.cursor(\n range.from + fromOff + text.length + cursorOffset,\n ),\n };\n }),\n scrollIntoView: true,\n userEvent,\n });\n };\n\nconst updateDisabledKeybindings = StateEffect.define<string[]>();\n\nconst stub = () => true;\n\nexport const disableKeybindingsField = StateField.define<string[]>({\n create() {\n return [];\n },\n update(keys, tr) {\n for (const effect of tr.effects) {\n if (effect.is(updateDisabledKeybindings)) {\n return effect.value;\n }\n }\n return keys;\n },\n provide(f) {\n return Prec.highest(\n keymap.compute([f], state => {\n const keys = state.field(f);\n return keys.map(key => ({\n key,\n run: stub,\n }));\n }),\n );\n },\n});\n\nexport const disableKeybindings =\n ({ view }: Context) =>\n (keys: string[]) => {\n view.dispatch({\n effects: updateDisabledKeybindings.of(keys),\n });\n };\n\nexport const getSelection =\n ({ view }: Context) =>\n () => {\n const { from, to, anchor, head } = view.state.selection.main;\n return { from, to, anchor, head };\n };\n\nexport const getLineInfoAtPosition =\n ({ view }: Context) =>\n (pos: number): Line =>\n view.state.doc.lineAt(pos);\n\nexport const isFocused =\n ({ view }: Context) =>\n () =>\n view.hasFocus;\n\nexport const getMainSelectionRects =\n ({ view }: Context) =>\n () => {\n const markers = RectangleMarker.forRange(\n view,\n '',\n view.state.selection.main,\n );\n return markers.map(marker =>\n pick(marker, ['top', 'left', 'width', 'height']),\n );\n };\n\n// export const getInterpolationText = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const isInInterpolation = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const getInterpolationRange = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\ninterface InsertTextContext extends Context {\n text?: string;\n range?: {\n from: number;\n to?: number;\n };\n scrollIntoView?: boolean;\n}\n\nconst isNumber = (value: unknown): value is number => typeof value === 'number';\n\nexport const insertText = ({\n view,\n text = '',\n range = { from: 0 },\n scrollIntoView = true,\n}: InsertTextContext) => {\n try {\n view.dispatch({\n changes: {\n from: range.from,\n insert: text,\n ...(isNumber(range.to)\n ? {\n to: range.to,\n }\n : {}),\n },\n selection: { anchor: range.from, head: range.from + text.length },\n scrollIntoView,\n });\n } catch (e) {\n console.error('insertText failed', e);\n }\n};\n\nexport interface ReplaceTextOptions {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n scrollIntoView?: boolean;\n userEvent?: string;\n}\nexport const replaceText =\n ({ view }: Context) =>\n (options: ReplaceTextOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const {\n from,\n to,\n text,\n cursorOffset = 0,\n scrollIntoView = true,\n userEvent,\n } = options;\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: text,\n },\n selection: EditorSelection.cursor(from + text.length + cursorOffset),\n scrollIntoView,\n userEvent,\n });\n };\n\nexport const undo =\n ({ view }: Context) =>\n () => {\n cmUndo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\nexport const redo =\n ({ view }: Context) =>\n () => {\n cmRedo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\ntype TextTransformer = (text: string) => string | undefined;\nexport const transformTextInSelection =\n ({ view }: Context) =>\n (transformer: TextTransformer) => {\n const { from, to } = view.state.selection.main;\n const text = view.state.sliceDoc(from, to);\n\n const newText = transformer(text);\n\n if (typeof newText !== 'string') {\n return;\n }\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: newText,\n },\n selection: EditorSelection.cursor(from + newText.length),\n });\n };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { placeholder as cmPlaceholder } from '@coze-editor/extension-placeholder';\nimport { EditorView, lineNumbers as cmLineNumbers } from '@codemirror/view';\nimport { EditorState, Prec } from '@codemirror/state';\n\nexport const fontSize = (value?: number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '&': {\n fontSize: typeof value === 'number' ? `${value}px` : 'inherit',\n },\n });\n};\n\nexport const placeholder = (value?: HTMLElement | string) =>\n cmPlaceholder(value ?? '');\n\nexport const readOnly = (value?: boolean) =>\n EditorState.readOnly.of(value ?? false);\n\nexport const editable = (value?: boolean) =>\n EditorView.editable.of(value ?? true);\n\nexport const minHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const maxHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-scroller': {\n maxHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const height = (value?: string | number) =>\n typeof value === 'string' || typeof value === 'number'\n ? [\n // give it higher prec to override styles from minHeight option\n Prec.high(\n EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ),\n EditorView.theme({\n '.cm-scroller': {\n height: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ]\n : [];\n\nexport const tabSize = (value?: number) => EditorState.tabSize.of(value ?? 2);\n\nexport interface Attrs {\n [name: string]: string;\n}\ntype AttrSource = Attrs | ((view: EditorView) => Attrs | null);\n\nexport const contentAttributes = (attributes: AttrSource) =>\n EditorView.contentAttributes.of(attributes ?? {});\n\n// type CursorColorParams = string | ((state: EditorState) => string);\n// const cursorColorFacet = Facet.define<CursorColorParams | undefined, CursorColorParams | undefined>({\n// combine(values) {\n// return values[values.length - 1];\n// },\n// });\n\n// export const cursorColor = (color?: CursorColorParams) => {\n// return [\n// cursorColorFacet.of(color),\n// ];\n// };\n\n// export const cursorColorExtension = () => {\n// const compartment = new Compartment()\n// return [\n// drawSelection(),\n// compartment.of([]),\n// EditorState.transactionExtender.of(tr => {\n// const color = tr.state.facet(cursorColorFacet);\n\n// let finalColor: string | null = null\n\n// if (typeof color === 'string') {\n// finalColor = color\n// } else if (typeof color === 'function') {\n// finalColor = color(tr.state)\n// }\n\n// if (typeof finalColor === 'string') {\n// return {\n// effects: compartment.reconfigure([\n// EditorView.theme({\n// '& .cm-cursor, & .cm-dropCursor': {\n// borderLeft: `1.2px solid ${finalColor}`,\n// },\n// })\n// ])\n// }\n// }\n\n// return null\n// })\n// ]\n// }\n\nexport const lineNumbers = (enable?: boolean) =>\n enable === true ? cmLineNumbers() : [];\n\nexport const lineWrapping = (enable: boolean) =>\n enable ? EditorView.lineWrapping : [];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EVENT_SILENT } from '@coze-editor/core';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { StateEffect } from '@codemirror/state';\n\nexport const eventChange = (update: ViewUpdate) => {\n if (update.docChanged) {\n return {\n value: update.state.sliceDoc(),\n };\n }\n\n return EVENT_SILENT;\n};\n\nconst focusStateEffect = StateEffect.define<boolean>();\nexport const focusChangeNotifier = ViewPlugin.fromClass(\n class {\n public hasFocus: boolean;\n\n constructor(view: EditorView) {\n this.hasFocus = view.hasFocus;\n }\n update(update: ViewUpdate) {\n if (update.view.hasFocus !== this.hasFocus) {\n this.hasFocus = update.view.hasFocus;\n\n queueMicrotask(() => {\n update.view.dispatch({\n effects: focusStateEffect.of(this.hasFocus),\n });\n });\n }\n }\n },\n);\n\nexport const eventFocus = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === true) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventBlur = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === false) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventSelectionChange = (update: ViewUpdate) => {\n if (!update.startState.selection.eq(update.state.selection)) {\n const { from, to, anchor, head } = update.state.selection.main;\n return {\n selection: { from, to, head, anchor },\n update,\n };\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventViewUpdate = (update: ViewUpdate) => update;\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EditorView } from '@codemirror/view';\nimport { Prec } from '@codemirror/state';\n\nexport const basic = () => [\n Prec.low(\n EditorView.theme({\n '&.cm-focused': { outline: 'none' },\n '& .cm-content': { cursor: 'text' },\n '& .cm-placeholder': {\n // position: 'absolute',\n wordBreak: 'break-all',\n },\n }),\n ),\n];\n"],"mappings":"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","names":["Prec","StateEffect","EditorView","Prec"]}
|
|
1
|
+
{"version":3,"sources":["../../src/api.ts","../../src/option.ts","../../src/event.ts","../../src/extension.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { pick } from 'es-toolkit';\nimport { RectangleMarker, keymap, type EditorView } from '@codemirror/view';\nimport {\n EditorSelection,\n type Line,\n Prec,\n StateEffect,\n StateField,\n} from '@codemirror/state';\nimport { undo as cmUndo, redo as cmRedo } from '@codemirror/commands';\n\ninterface Context {\n view: EditorView;\n}\n\nexport const getValue =\n ({ view }: Context) =>\n () =>\n view.state.sliceDoc();\n\nexport const setValue =\n ({ view }: Context) =>\n (value: string) => {\n const { state } = view;\n if (state.readOnly) {\n return;\n }\n view.dispatch(\n state.update({\n changes: {\n from: 0,\n to: state.doc.length,\n insert: value ?? '',\n },\n }),\n );\n };\n\nexport const focus =\n ({ view }: Context) =>\n () => {\n view.focus();\n };\n\nexport const blur =\n ({ view }: Context) =>\n () => {\n view.contentDOM.blur();\n };\n\nexport const setCursorPosition =\n ({ view }: Context) =>\n (pos: number): void => {\n view.dispatch({\n selection: {\n head: pos,\n anchor: pos,\n },\n });\n };\n\nexport const getCursorPosition =\n ({ view }: Context) =>\n (): number =>\n view.state.selection.main.head;\n\n// Make sure the given regexp has a $ at its end and, if `start` is\n// true, a ^ at its start.\nfunction ensureAnchor(expr: RegExp, start: boolean) {\n const { source } = expr;\n const addStart = start && source[0] !== '^',\n addEnd = source[source.length - 1] !== '$';\n if (!addStart && !addEnd) {\n return expr;\n }\n return new RegExp(\n `${addStart ? '^' : ''}(?:${source})${addEnd ? '$' : ''}`,\n expr.flags ?? (expr.ignoreCase ? 'i' : ''),\n );\n}\n\nexport const matchBefore =\n ({ view }: Context) =>\n (match: RegExp): { from: number; to: number; text: string } | null => {\n const pos = view.state.selection.main.head;\n const line = view.state.doc.lineAt(pos);\n const start = Math.max(line.from, pos - 250);\n const str = line.text.slice(start - line.from, pos - line.from);\n\n if (match instanceof RegExp) {\n const found = str.search(ensureAnchor(match, false));\n return found < 0\n ? null\n : { from: start + found, to: pos, text: str.slice(found) };\n }\n\n return null;\n };\n\nexport const getView =\n ({ view }: Context) =>\n () =>\n view;\n\nexport interface ReplaceTextByRangeOptions {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n userEvent?: string;\n}\n\nexport const replaceTextByRange =\n ({ view }: Context) =>\n ({\n from,\n to,\n text,\n cursorOffset = 0,\n userEvent,\n }: ReplaceTextByRangeOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const { main } = state.selection;\n const fromOff = from - main.from;\n const toOff = to - main.from;\n\n view.dispatch({\n ...view.state.changeByRange(range => {\n if (\n range !== main &&\n from !== to &&\n state.sliceDoc(range.from + fromOff, range.from + toOff) !==\n state.sliceDoc(from, to)\n ) {\n return { range };\n }\n return {\n changes: {\n from: range.from + fromOff,\n to: to === main.from ? range.to : range.from + toOff,\n insert: text,\n },\n range: EditorSelection.cursor(\n range.from + fromOff + text.length + cursorOffset,\n ),\n };\n }),\n scrollIntoView: true,\n userEvent,\n });\n };\n\nconst updateDisabledKeybindings = StateEffect.define<string[]>();\n\nconst stub = () => true;\n\nexport const disableKeybindingsField = StateField.define<string[]>({\n create() {\n return [];\n },\n update(keys, tr) {\n for (const effect of tr.effects) {\n if (effect.is(updateDisabledKeybindings)) {\n return effect.value;\n }\n }\n return keys;\n },\n provide(f) {\n return Prec.highest(\n keymap.compute([f], state => {\n const keys = state.field(f);\n return keys.map(key => ({\n key,\n run: stub,\n }));\n }),\n );\n },\n});\n\nexport const disableKeybindings =\n ({ view }: Context) =>\n (keys: string[]) => {\n view.dispatch({\n effects: updateDisabledKeybindings.of(keys),\n });\n };\n\nexport const getSelection =\n ({ view }: Context) =>\n () => {\n const { from, to, anchor, head } = view.state.selection.main;\n return { from, to, anchor, head };\n };\n\nexport const getLineInfoAtPosition =\n ({ view }: Context) =>\n (pos: number): Line =>\n view.state.doc.lineAt(pos);\n\nexport const isFocused =\n ({ view }: Context) =>\n () =>\n view.hasFocus;\n\nexport const getMainSelectionRects =\n ({ view }: Context) =>\n () => {\n const markers = RectangleMarker.forRange(\n view,\n '',\n view.state.selection.main,\n );\n return markers.map(marker =>\n pick(marker, ['top', 'left', 'width', 'height']),\n );\n };\n\n// export const getInterpolationText = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const isInInterpolation = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const getInterpolationRange = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\ninterface InsertTextContext extends Context {\n text?: string;\n range?: {\n from: number;\n to?: number;\n };\n scrollIntoView?: boolean;\n}\n\nconst isNumber = (value: unknown): value is number => typeof value === 'number';\n\nexport const insertText = ({\n view,\n text = '',\n range = { from: 0 },\n scrollIntoView = true,\n}: InsertTextContext) => {\n try {\n view.dispatch({\n changes: {\n from: range.from,\n insert: text,\n ...(isNumber(range.to)\n ? {\n to: range.to,\n }\n : {}),\n },\n selection: { anchor: range.from, head: range.from + text.length },\n scrollIntoView,\n });\n } catch (e) {\n console.error('insertText failed', e);\n }\n};\n\ntype ReplaceTextOptions = {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n scrollIntoView?: boolean;\n userEvent?: string;\n};\nexport const replaceText =\n ({ view }: Context) =>\n (options: ReplaceTextOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const {\n from,\n to,\n text,\n cursorOffset = 0,\n scrollIntoView = true,\n userEvent,\n } = options;\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: text,\n },\n selection: EditorSelection.cursor(from + text.length + cursorOffset),\n scrollIntoView,\n userEvent,\n });\n };\n\nexport const undo =\n ({ view }: Context) =>\n () => {\n cmUndo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\nexport const redo =\n ({ view }: Context) =>\n () => {\n cmRedo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\ntype TextTransformer = (text: string) => string | undefined;\nexport const transformTextInSelection =\n ({ view }: Context) =>\n (transformer: TextTransformer) => {\n const { from, to } = view.state.selection.main;\n const text = view.state.sliceDoc(from, to);\n\n const newText = transformer(text);\n\n if (typeof newText !== 'string') {\n return;\n }\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: newText,\n },\n selection: EditorSelection.cursor(from + newText.length),\n });\n };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { placeholder as cmPlaceholder } from '@coze-editor/extension-placeholder';\nimport { EditorView, lineNumbers as cmLineNumbers } from '@codemirror/view';\nimport { EditorState, Prec } from '@codemirror/state';\n\nexport const fontSize = (value?: number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '&': {\n fontSize: typeof value === 'number' ? `${value}px` : 'inherit',\n },\n });\n};\n\nexport const placeholder = (value?: HTMLElement | string) =>\n cmPlaceholder(value ?? '');\n\nexport const readOnly = (value?: boolean) =>\n EditorState.readOnly.of(value ?? false);\n\nexport const editable = (value?: boolean) =>\n EditorView.editable.of(value ?? true);\n\nexport const minHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const maxHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-scroller': {\n maxHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const height = (value?: string | number) =>\n typeof value === 'string' || typeof value === 'number'\n ? [\n // give it higher prec to override styles from minHeight option\n Prec.high(\n EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ),\n EditorView.theme({\n '.cm-scroller': {\n height: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ]\n : [];\n\nexport const tabSize = (value?: number) => EditorState.tabSize.of(value ?? 2);\n\nexport interface Attrs {\n [name: string]: string;\n}\ntype AttrSource = Attrs | ((view: EditorView) => Attrs | null);\n\nexport const contentAttributes = (attributes: AttrSource) =>\n EditorView.contentAttributes.of(attributes ?? {});\n\n// type CursorColorParams = string | ((state: EditorState) => string);\n// const cursorColorFacet = Facet.define<CursorColorParams | undefined, CursorColorParams | undefined>({\n// combine(values) {\n// return values[values.length - 1];\n// },\n// });\n\n// export const cursorColor = (color?: CursorColorParams) => {\n// return [\n// cursorColorFacet.of(color),\n// ];\n// };\n\n// export const cursorColorExtension = () => {\n// const compartment = new Compartment()\n// return [\n// drawSelection(),\n// compartment.of([]),\n// EditorState.transactionExtender.of(tr => {\n// const color = tr.state.facet(cursorColorFacet);\n\n// let finalColor: string | null = null\n\n// if (typeof color === 'string') {\n// finalColor = color\n// } else if (typeof color === 'function') {\n// finalColor = color(tr.state)\n// }\n\n// if (typeof finalColor === 'string') {\n// return {\n// effects: compartment.reconfigure([\n// EditorView.theme({\n// '& .cm-cursor, & .cm-dropCursor': {\n// borderLeft: `1.2px solid ${finalColor}`,\n// },\n// })\n// ])\n// }\n// }\n\n// return null\n// })\n// ]\n// }\n\nexport const lineNumbers = (enable?: boolean) =>\n enable === true ? cmLineNumbers() : [];\n\nexport const lineWrapping = (enable: boolean) =>\n enable ? EditorView.lineWrapping : [];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EVENT_SILENT } from '@coze-editor/core';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { StateEffect } from '@codemirror/state';\n\nexport const eventChange = (update: ViewUpdate) => {\n if (update.docChanged) {\n return {\n value: update.state.sliceDoc(),\n };\n }\n\n return EVENT_SILENT;\n};\n\nconst focusStateEffect = StateEffect.define<boolean>();\nexport const focusChangeNotifier = ViewPlugin.fromClass(\n class {\n public hasFocus: boolean;\n\n constructor(view: EditorView) {\n this.hasFocus = view.hasFocus;\n }\n update(update: ViewUpdate) {\n if (update.view.hasFocus !== this.hasFocus) {\n this.hasFocus = update.view.hasFocus;\n\n queueMicrotask(() => {\n update.view.dispatch({\n effects: focusStateEffect.of(this.hasFocus),\n });\n });\n }\n }\n },\n);\n\nexport const eventFocus = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === true) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventBlur = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === false) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventSelectionChange = (update: ViewUpdate) => {\n if (!update.startState.selection.eq(update.state.selection)) {\n const { from, to, anchor, head } = update.state.selection.main;\n return {\n selection: { from, to, head, anchor },\n update,\n };\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventViewUpdate = (update: ViewUpdate) => update;\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EditorView } from '@codemirror/view';\nimport { Prec } from '@codemirror/state';\n\nexport const basic = () => [\n Prec.low(\n EditorView.theme({\n '&.cm-focused': { outline: 'none' },\n '& .cm-content': { cursor: 'text' },\n '& .cm-placeholder': {\n // position: 'absolute',\n wordBreak: 'break-all',\n },\n }),\n ),\n];\n"],"mappings":"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","names":["Prec","StateEffect","EditorView","Prec"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -46,14 +46,14 @@ interface InsertTextContext extends Context {
|
|
|
46
46
|
scrollIntoView?: boolean;
|
|
47
47
|
}
|
|
48
48
|
declare const insertText: ({ view, text, range, scrollIntoView, }: InsertTextContext) => void;
|
|
49
|
-
|
|
49
|
+
type ReplaceTextOptions = {
|
|
50
50
|
from: number;
|
|
51
51
|
to: number;
|
|
52
52
|
text: string;
|
|
53
53
|
cursorOffset?: number;
|
|
54
54
|
scrollIntoView?: boolean;
|
|
55
55
|
userEvent?: string;
|
|
56
|
-
}
|
|
56
|
+
};
|
|
57
57
|
declare const replaceText: ({ view }: Context) => (options: ReplaceTextOptions) => void;
|
|
58
58
|
declare const undo: ({ view }: Context) => () => void;
|
|
59
59
|
declare const redo: ({ view }: Context) => () => void;
|
|
@@ -98,4 +98,4 @@ declare const eventViewUpdate: (update: ViewUpdate) => ViewUpdate;
|
|
|
98
98
|
|
|
99
99
|
declare const basic: () => _codemirror_state.Extension[];
|
|
100
100
|
|
|
101
|
-
export { type Attrs, type ReplaceTextByRangeOptions,
|
|
101
|
+
export { type Attrs, type ReplaceTextByRangeOptions, basic, blur, contentAttributes, disableKeybindings, disableKeybindingsField, editable, eventBlur, eventChange, eventFocus, eventSelectionChange, eventViewUpdate, focus, focusChangeNotifier, fontSize, getCursorPosition, getLineInfoAtPosition, getMainSelectionRects, getSelection, getValue, getView, height, insertText, isFocused, lineNumbers, lineWrapping, matchBefore, maxHeight, minHeight, placeholder, readOnly, redo, replaceText, replaceTextByRange, setCursorPosition, setValue, tabSize, transformTextInSelection, undo };
|
package/dist/index.d.ts
CHANGED
|
@@ -46,14 +46,14 @@ interface InsertTextContext extends Context {
|
|
|
46
46
|
scrollIntoView?: boolean;
|
|
47
47
|
}
|
|
48
48
|
declare const insertText: ({ view, text, range, scrollIntoView, }: InsertTextContext) => void;
|
|
49
|
-
|
|
49
|
+
type ReplaceTextOptions = {
|
|
50
50
|
from: number;
|
|
51
51
|
to: number;
|
|
52
52
|
text: string;
|
|
53
53
|
cursorOffset?: number;
|
|
54
54
|
scrollIntoView?: boolean;
|
|
55
55
|
userEvent?: string;
|
|
56
|
-
}
|
|
56
|
+
};
|
|
57
57
|
declare const replaceText: ({ view }: Context) => (options: ReplaceTextOptions) => void;
|
|
58
58
|
declare const undo: ({ view }: Context) => () => void;
|
|
59
59
|
declare const redo: ({ view }: Context) => () => void;
|
|
@@ -98,4 +98,4 @@ declare const eventViewUpdate: (update: ViewUpdate) => ViewUpdate;
|
|
|
98
98
|
|
|
99
99
|
declare const basic: () => _codemirror_state.Extension[];
|
|
100
100
|
|
|
101
|
-
export { type Attrs, type ReplaceTextByRangeOptions,
|
|
101
|
+
export { type Attrs, type ReplaceTextByRangeOptions, basic, blur, contentAttributes, disableKeybindings, disableKeybindingsField, editable, eventBlur, eventChange, eventFocus, eventSelectionChange, eventViewUpdate, focus, focusChangeNotifier, fontSize, getCursorPosition, getLineInfoAtPosition, getMainSelectionRects, getSelection, getValue, getView, height, insertText, isFocused, lineNumbers, lineWrapping, matchBefore, maxHeight, minHeight, placeholder, readOnly, redo, replaceText, replaceTextByRange, setCursorPosition, setValue, tabSize, transformTextInSelection, undo };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/api.ts","../src/option.ts","../src/event.ts","../src/extension.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nexport * from './api';\nexport * from './option';\nexport * from './event';\nexport * from './extension';\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { pick } from 'es-toolkit';\nimport { RectangleMarker, keymap, type EditorView } from '@codemirror/view';\nimport {\n EditorSelection,\n type Line,\n Prec,\n StateEffect,\n StateField,\n} from '@codemirror/state';\nimport { undo as cmUndo, redo as cmRedo } from '@codemirror/commands';\n\ninterface Context {\n view: EditorView;\n}\n\nexport const getValue =\n ({ view }: Context) =>\n () =>\n view.state.sliceDoc();\n\nexport const setValue =\n ({ view }: Context) =>\n (value: string) => {\n const { state } = view;\n if (state.readOnly) {\n return;\n }\n view.dispatch(\n state.update({\n changes: {\n from: 0,\n to: state.doc.length,\n insert: value ?? '',\n },\n }),\n );\n };\n\nexport const focus =\n ({ view }: Context) =>\n () => {\n view.focus();\n };\n\nexport const blur =\n ({ view }: Context) =>\n () => {\n view.contentDOM.blur();\n };\n\nexport const setCursorPosition =\n ({ view }: Context) =>\n (pos: number): void => {\n view.dispatch({\n selection: {\n head: pos,\n anchor: pos,\n },\n });\n };\n\nexport const getCursorPosition =\n ({ view }: Context) =>\n (): number =>\n view.state.selection.main.head;\n\n// Make sure the given regexp has a $ at its end and, if `start` is\n// true, a ^ at its start.\nfunction ensureAnchor(expr: RegExp, start: boolean) {\n const { source } = expr;\n const addStart = start && source[0] !== '^',\n addEnd = source[source.length - 1] !== '$';\n if (!addStart && !addEnd) {\n return expr;\n }\n return new RegExp(\n `${addStart ? '^' : ''}(?:${source})${addEnd ? '$' : ''}`,\n expr.flags ?? (expr.ignoreCase ? 'i' : ''),\n );\n}\n\nexport const matchBefore =\n ({ view }: Context) =>\n (match: RegExp): { from: number; to: number; text: string } | null => {\n const pos = view.state.selection.main.head;\n const line = view.state.doc.lineAt(pos);\n const start = Math.max(line.from, pos - 250);\n const str = line.text.slice(start - line.from, pos - line.from);\n\n if (match instanceof RegExp) {\n const found = str.search(ensureAnchor(match, false));\n return found < 0\n ? null\n : { from: start + found, to: pos, text: str.slice(found) };\n }\n\n return null;\n };\n\nexport const getView =\n ({ view }: Context) =>\n () =>\n view;\n\nexport interface ReplaceTextByRangeOptions {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n userEvent?: string;\n}\n\nexport const replaceTextByRange =\n ({ view }: Context) =>\n ({\n from,\n to,\n text,\n cursorOffset = 0,\n userEvent,\n }: ReplaceTextByRangeOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const { main } = state.selection;\n const fromOff = from - main.from;\n const toOff = to - main.from;\n\n view.dispatch({\n ...view.state.changeByRange(range => {\n if (\n range !== main &&\n from !== to &&\n state.sliceDoc(range.from + fromOff, range.from + toOff) !==\n state.sliceDoc(from, to)\n ) {\n return { range };\n }\n return {\n changes: {\n from: range.from + fromOff,\n to: to === main.from ? range.to : range.from + toOff,\n insert: text,\n },\n range: EditorSelection.cursor(\n range.from + fromOff + text.length + cursorOffset,\n ),\n };\n }),\n scrollIntoView: true,\n userEvent,\n });\n };\n\nconst updateDisabledKeybindings = StateEffect.define<string[]>();\n\nconst stub = () => true;\n\nexport const disableKeybindingsField = StateField.define<string[]>({\n create() {\n return [];\n },\n update(keys, tr) {\n for (const effect of tr.effects) {\n if (effect.is(updateDisabledKeybindings)) {\n return effect.value;\n }\n }\n return keys;\n },\n provide(f) {\n return Prec.highest(\n keymap.compute([f], state => {\n const keys = state.field(f);\n return keys.map(key => ({\n key,\n run: stub,\n }));\n }),\n );\n },\n});\n\nexport const disableKeybindings =\n ({ view }: Context) =>\n (keys: string[]) => {\n view.dispatch({\n effects: updateDisabledKeybindings.of(keys),\n });\n };\n\nexport const getSelection =\n ({ view }: Context) =>\n () => {\n const { from, to, anchor, head } = view.state.selection.main;\n return { from, to, anchor, head };\n };\n\nexport const getLineInfoAtPosition =\n ({ view }: Context) =>\n (pos: number): Line =>\n view.state.doc.lineAt(pos);\n\nexport const isFocused =\n ({ view }: Context) =>\n () =>\n view.hasFocus;\n\nexport const getMainSelectionRects =\n ({ view }: Context) =>\n () => {\n const markers = RectangleMarker.forRange(\n view,\n '',\n view.state.selection.main,\n );\n return markers.map(marker =>\n pick(marker, ['top', 'left', 'width', 'height']),\n );\n };\n\n// export const getInterpolationText = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const isInInterpolation = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const getInterpolationRange = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\ninterface InsertTextContext extends Context {\n text?: string;\n range?: {\n from: number;\n to?: number;\n };\n scrollIntoView?: boolean;\n}\n\nconst isNumber = (value: unknown): value is number => typeof value === 'number';\n\nexport const insertText = ({\n view,\n text = '',\n range = { from: 0 },\n scrollIntoView = true,\n}: InsertTextContext) => {\n try {\n view.dispatch({\n changes: {\n from: range.from,\n insert: text,\n ...(isNumber(range.to)\n ? {\n to: range.to,\n }\n : {}),\n },\n selection: { anchor: range.from, head: range.from + text.length },\n scrollIntoView,\n });\n } catch (e) {\n console.error('insertText failed', e);\n }\n};\n\nexport interface ReplaceTextOptions {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n scrollIntoView?: boolean;\n userEvent?: string;\n}\nexport const replaceText =\n ({ view }: Context) =>\n (options: ReplaceTextOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const {\n from,\n to,\n text,\n cursorOffset = 0,\n scrollIntoView = true,\n userEvent,\n } = options;\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: text,\n },\n selection: EditorSelection.cursor(from + text.length + cursorOffset),\n scrollIntoView,\n userEvent,\n });\n };\n\nexport const undo =\n ({ view }: Context) =>\n () => {\n cmUndo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\nexport const redo =\n ({ view }: Context) =>\n () => {\n cmRedo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\ntype TextTransformer = (text: string) => string | undefined;\nexport const transformTextInSelection =\n ({ view }: Context) =>\n (transformer: TextTransformer) => {\n const { from, to } = view.state.selection.main;\n const text = view.state.sliceDoc(from, to);\n\n const newText = transformer(text);\n\n if (typeof newText !== 'string') {\n return;\n }\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: newText,\n },\n selection: EditorSelection.cursor(from + newText.length),\n });\n };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { placeholder as cmPlaceholder } from '@coze-editor/extension-placeholder';\nimport { EditorView, lineNumbers as cmLineNumbers } from '@codemirror/view';\nimport { EditorState, Prec } from '@codemirror/state';\n\nexport const fontSize = (value?: number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '&': {\n fontSize: typeof value === 'number' ? `${value}px` : 'inherit',\n },\n });\n};\n\nexport const placeholder = (value?: HTMLElement | string) =>\n cmPlaceholder(value ?? '');\n\nexport const readOnly = (value?: boolean) =>\n EditorState.readOnly.of(value ?? false);\n\nexport const editable = (value?: boolean) =>\n EditorView.editable.of(value ?? true);\n\nexport const minHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const maxHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-scroller': {\n maxHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const height = (value?: string | number) =>\n typeof value === 'string' || typeof value === 'number'\n ? [\n // give it higher prec to override styles from minHeight option\n Prec.high(\n EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ),\n EditorView.theme({\n '.cm-scroller': {\n height: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ]\n : [];\n\nexport const tabSize = (value?: number) => EditorState.tabSize.of(value ?? 2);\n\nexport interface Attrs {\n [name: string]: string;\n}\ntype AttrSource = Attrs | ((view: EditorView) => Attrs | null);\n\nexport const contentAttributes = (attributes: AttrSource) =>\n EditorView.contentAttributes.of(attributes ?? {});\n\n// type CursorColorParams = string | ((state: EditorState) => string);\n// const cursorColorFacet = Facet.define<CursorColorParams | undefined, CursorColorParams | undefined>({\n// combine(values) {\n// return values[values.length - 1];\n// },\n// });\n\n// export const cursorColor = (color?: CursorColorParams) => {\n// return [\n// cursorColorFacet.of(color),\n// ];\n// };\n\n// export const cursorColorExtension = () => {\n// const compartment = new Compartment()\n// return [\n// drawSelection(),\n// compartment.of([]),\n// EditorState.transactionExtender.of(tr => {\n// const color = tr.state.facet(cursorColorFacet);\n\n// let finalColor: string | null = null\n\n// if (typeof color === 'string') {\n// finalColor = color\n// } else if (typeof color === 'function') {\n// finalColor = color(tr.state)\n// }\n\n// if (typeof finalColor === 'string') {\n// return {\n// effects: compartment.reconfigure([\n// EditorView.theme({\n// '& .cm-cursor, & .cm-dropCursor': {\n// borderLeft: `1.2px solid ${finalColor}`,\n// },\n// })\n// ])\n// }\n// }\n\n// return null\n// })\n// ]\n// }\n\nexport const lineNumbers = (enable?: boolean) =>\n enable === true ? cmLineNumbers() : [];\n\nexport const lineWrapping = (enable: boolean) =>\n enable ? EditorView.lineWrapping : [];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EVENT_SILENT } from '@coze-editor/core';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { StateEffect } from '@codemirror/state';\n\nexport const eventChange = (update: ViewUpdate) => {\n if (update.docChanged) {\n return {\n value: update.state.sliceDoc(),\n };\n }\n\n return EVENT_SILENT;\n};\n\nconst focusStateEffect = StateEffect.define<boolean>();\nexport const focusChangeNotifier = ViewPlugin.fromClass(\n class {\n public hasFocus: boolean;\n\n constructor(view: EditorView) {\n this.hasFocus = view.hasFocus;\n }\n update(update: ViewUpdate) {\n if (update.view.hasFocus !== this.hasFocus) {\n this.hasFocus = update.view.hasFocus;\n\n queueMicrotask(() => {\n update.view.dispatch({\n effects: focusStateEffect.of(this.hasFocus),\n });\n });\n }\n }\n },\n);\n\nexport const eventFocus = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === true) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventBlur = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === false) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventSelectionChange = (update: ViewUpdate) => {\n if (!update.startState.selection.eq(update.state.selection)) {\n const { from, to, anchor, head } = update.state.selection.main;\n return {\n selection: { from, to, head, anchor },\n update,\n };\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventViewUpdate = (update: ViewUpdate) => update;\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EditorView } from '@codemirror/view';\nimport { Prec } from '@codemirror/state';\n\nexport const basic = () => [\n Prec.low(\n EditorView.theme({\n '&.cm-focused': { outline: 'none' },\n '& .cm-content': { cursor: 'text' },\n '& .cm-placeholder': {\n // position: 'absolute',\n wordBreak: 'break-all',\n },\n }),\n ),\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGA,wBAAqB;AACrB,kBAAyD;AACzD,mBAMO;AACP,sBAA+C;AAMxC,IAAM,WACX,CAAC,EAAE,KAAK,MACR,MACE,KAAK,MAAM,SAAS;AAEjB,IAAM,WACX,CAAC,EAAE,KAAK,MACR,CAAC,UAAkB;AACjB,QAAM,EAAE,MAAM,IAAI;AAClB,MAAI,MAAM,UAAU;AAClB;AAAA,EACF;AACA,OAAK;AAAA,IACH,MAAM,OAAO;AAAA,MACX,SAAS;AAAA,QACP,MAAM;AAAA,QACN,IAAI,MAAM,IAAI;AAAA,QACd,QAAQ,SAAS;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEK,IAAM,QACX,CAAC,EAAE,KAAK,MACR,MAAM;AACJ,OAAK,MAAM;AACb;AAEK,IAAM,OACX,CAAC,EAAE,KAAK,MACR,MAAM;AACJ,OAAK,WAAW,KAAK;AACvB;AAEK,IAAM,oBACX,CAAC,EAAE,KAAK,MACR,CAAC,QAAsB;AACrB,OAAK,SAAS;AAAA,IACZ,WAAW;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF,CAAC;AACH;AAEK,IAAM,oBACX,CAAC,EAAE,KAAK,MACR,MACE,KAAK,MAAM,UAAU,KAAK;AAI9B,SAAS,aAAa,MAAc,OAAgB;AAClD,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,WAAW,SAAS,OAAO,CAAC,MAAM,KACtC,SAAS,OAAO,OAAO,SAAS,CAAC,MAAM;AACzC,MAAI,CAAC,YAAY,CAAC,QAAQ;AACxB,WAAO;AAAA,EACT;AACA,SAAO,IAAI;AAAA,IACT,GAAG,WAAW,MAAM,EAAE,MAAM,MAAM,IAAI,SAAS,MAAM,EAAE;AAAA,IACvD,KAAK,UAAU,KAAK,aAAa,MAAM;AAAA,EACzC;AACF;AAEO,IAAM,cACX,CAAC,EAAE,KAAK,MACR,CAAC,UAAqE;AACpE,QAAM,MAAM,KAAK,MAAM,UAAU,KAAK;AACtC,QAAM,OAAO,KAAK,MAAM,IAAI,OAAO,GAAG;AACtC,QAAM,QAAQ,KAAK,IAAI,KAAK,MAAM,MAAM,GAAG;AAC3C,QAAM,MAAM,KAAK,KAAK,MAAM,QAAQ,KAAK,MAAM,MAAM,KAAK,IAAI;AAE9D,MAAI,iBAAiB,QAAQ;AAC3B,UAAM,QAAQ,IAAI,OAAO,aAAa,OAAO,KAAK,CAAC;AACnD,WAAO,QAAQ,IACX,OACA,EAAE,MAAM,QAAQ,OAAO,IAAI,KAAK,MAAM,IAAI,MAAM,KAAK,EAAE;AAAA,EAC7D;AAEA,SAAO;AACT;AAEK,IAAM,UACX,CAAC,EAAE,KAAK,MACR,MACE;AAUG,IAAM,qBACX,CAAC,EAAE,KAAK,MACR,CAAC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AACF,MAAiC;AAC/B,QAAM,EAAE,MAAM,IAAI;AAElB,MAAI,MAAM,UAAU;AAClB;AAAA,EACF;AAEA,QAAM,EAAE,KAAK,IAAI,MAAM;AACvB,QAAM,UAAU,OAAO,KAAK;AAC5B,QAAM,QAAQ,KAAK,KAAK;AAExB,OAAK,SAAS;AAAA,IACZ,GAAG,KAAK,MAAM,cAAc,WAAS;AACnC,UACE,UAAU,QACV,SAAS,MACT,MAAM,SAAS,MAAM,OAAO,SAAS,MAAM,OAAO,KAAK,MACrD,MAAM,SAAS,MAAM,EAAE,GACzB;AACA,eAAO,EAAE,MAAM;AAAA,MACjB;AACA,aAAO;AAAA,QACL,SAAS;AAAA,UACP,MAAM,MAAM,OAAO;AAAA,UACnB,IAAI,OAAO,KAAK,OAAO,MAAM,KAAK,MAAM,OAAO;AAAA,UAC/C,QAAQ;AAAA,QACV;AAAA,QACA,OAAO,6BAAgB;AAAA,UACrB,MAAM,OAAO,UAAU,KAAK,SAAS;AAAA,QACvC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,gBAAgB;AAAA,IAChB;AAAA,EACF,CAAC;AACH;AAEF,IAAM,4BAA4B,yBAAY,OAAiB;AAE/D,IAAM,OAAO,MAAM;AAEZ,IAAM,0BAA0B,wBAAW,OAAiB;AAAA,EACjE,SAAS;AACP,WAAO,CAAC;AAAA,EACV;AAAA,EACA,OAAO,MAAM,IAAI;AACf,eAAW,UAAU,GAAG,SAAS;AAC/B,UAAI,OAAO,GAAG,yBAAyB,GAAG;AACxC,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EACA,QAAQ,GAAG;AACT,WAAO,kBAAK;AAAA,MACV,mBAAO,QAAQ,CAAC,CAAC,GAAG,WAAS;AAC3B,cAAM,OAAO,MAAM,MAAM,CAAC;AAC1B,eAAO,KAAK,IAAI,UAAQ;AAAA,UACtB;AAAA,UACA,KAAK;AAAA,QACP,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF;AACF,CAAC;AAEM,IAAM,qBACX,CAAC,EAAE,KAAK,MACR,CAAC,SAAmB;AAClB,OAAK,SAAS;AAAA,IACZ,SAAS,0BAA0B,GAAG,IAAI;AAAA,EAC5C,CAAC;AACH;AAEK,IAAM,eACX,CAAC,EAAE,KAAK,MACR,MAAM;AACJ,QAAM,EAAE,MAAM,IAAI,QAAQ,KAAK,IAAI,KAAK,MAAM,UAAU;AACxD,SAAO,EAAE,MAAM,IAAI,QAAQ,KAAK;AAClC;AAEK,IAAM,wBACX,CAAC,EAAE,KAAK,MACR,CAAC,QACC,KAAK,MAAM,IAAI,OAAO,GAAG;AAEtB,IAAM,YACX,CAAC,EAAE,KAAK,MACR,MACE,KAAK;AAEF,IAAM,wBACX,CAAC,EAAE,KAAK,MACR,MAAM;AACJ,QAAM,UAAU,4BAAgB;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,KAAK,MAAM,UAAU;AAAA,EACvB;AACA,SAAO,QAAQ;AAAA,IAAI,gBACjB,wBAAK,QAAQ,CAAC,OAAO,QAAQ,SAAS,QAAQ,CAAC;AAAA,EACjD;AACF;AA6BF,IAAM,WAAW,CAAC,UAAoC,OAAO,UAAU;AAEhE,IAAM,aAAa,CAAC;AAAA,EACzB;AAAA,EACA,OAAO;AAAA,EACP,QAAQ,EAAE,MAAM,EAAE;AAAA,EAClB,iBAAiB;AACnB,MAAyB;AACvB,MAAI;AACF,SAAK,SAAS;AAAA,MACZ,SAAS;AAAA,QACP,MAAM,MAAM;AAAA,QACZ,QAAQ;AAAA,QACR,GAAI,SAAS,MAAM,EAAE,IACjB;AAAA,UACE,IAAI,MAAM;AAAA,QACZ,IACA,CAAC;AAAA,MACP;AAAA,MACA,WAAW,EAAE,QAAQ,MAAM,MAAM,MAAM,MAAM,OAAO,KAAK,OAAO;AAAA,MAChE;AAAA,IACF,CAAC;AAAA,EACH,SAAS,GAAG;AACV,YAAQ,MAAM,qBAAqB,CAAC;AAAA,EACtC;AACF;AAUO,IAAM,cACX,CAAC,EAAE,KAAK,MACR,CAAC,YAAgC;AAC/B,QAAM,EAAE,MAAM,IAAI;AAElB,MAAI,MAAM,UAAU;AAClB;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB;AAAA,EACF,IAAI;AAEJ,OAAK,SAAS;AAAA,IACZ,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,IACA,WAAW,6BAAgB,OAAO,OAAO,KAAK,SAAS,YAAY;AAAA,IACnE;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEK,IAAM,OACX,CAAC,EAAE,KAAK,MACR,MAAM;AACJ,sBAAAA,MAAO;AAAA,IACL,OAAO,KAAK;AAAA,IACZ,UAAU,KAAK;AAAA,EACjB,CAAC;AACH;AAEK,IAAM,OACX,CAAC,EAAE,KAAK,MACR,MAAM;AACJ,sBAAAC,MAAO;AAAA,IACL,OAAO,KAAK;AAAA,IACZ,UAAU,KAAK;AAAA,EACjB,CAAC;AACH;AAGK,IAAM,2BACX,CAAC,EAAE,KAAK,MACR,CAAC,gBAAiC;AAChC,QAAM,EAAE,MAAM,GAAG,IAAI,KAAK,MAAM,UAAU;AAC1C,QAAM,OAAO,KAAK,MAAM,SAAS,MAAM,EAAE;AAEzC,QAAM,UAAU,YAAY,IAAI;AAEhC,MAAI,OAAO,YAAY,UAAU;AAC/B;AAAA,EACF;AAEA,OAAK,SAAS;AAAA,IACZ,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,IACA,WAAW,6BAAgB,OAAO,OAAO,QAAQ,MAAM;AAAA,EACzD,CAAC;AACH;;;ACnWF,mCAA6C;AAC7C,IAAAC,eAAyD;AACzD,IAAAC,gBAAkC;AAE3B,IAAM,WAAW,CAAC,UAAmB;AAC1C,MAAI,OAAO,UAAU,aAAa;AAChC,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,wBAAW,MAAM;AAAA,IACtB,KAAK;AAAA,MACH,UAAU,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAAA,IACvD;AAAA,EACF,CAAC;AACH;AAEO,IAAM,cAAc,CAAC,cAC1B,6BAAAC,aAAc,SAAS,EAAE;AAEpB,IAAM,WAAW,CAAC,UACvB,0BAAY,SAAS,GAAG,SAAS,KAAK;AAEjC,IAAM,WAAW,CAAC,UACvB,wBAAW,SAAS,GAAG,SAAS,IAAI;AAE/B,IAAM,YAAY,CAAC,UAA4B;AACpD,MAAI,OAAO,UAAU,aAAa;AAChC,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,wBAAW,MAAM;AAAA,IACtB,6CAA6C;AAAA,MAC3C,WACE,OAAO,UAAU,WACb,GAAG,KAAK,OACR,OAAO,UAAU,WACf,QACA;AAAA,IACV;AAAA,EACF,CAAC;AACH;AAEO,IAAM,YAAY,CAAC,UAA4B;AACpD,MAAI,OAAO,UAAU,aAAa;AAChC,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,wBAAW,MAAM;AAAA,IACtB,gBAAgB;AAAA,MACd,WACE,OAAO,UAAU,WACb,GAAG,KAAK,OACR,OAAO,UAAU,WACf,QACA;AAAA,IACV;AAAA,EACF,CAAC;AACH;AAEO,IAAM,SAAS,CAAC,UACrB,OAAO,UAAU,YAAY,OAAO,UAAU,WAC1C;AAAA;AAAA,EAEE,mBAAK;AAAA,IACH,wBAAW,MAAM;AAAA,MACf,6CAA6C;AAAA,QAC3C,WAAW,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAAA,MACxD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EACA,wBAAW,MAAM;AAAA,IACf,gBAAgB;AAAA,MACd,QAAQ,OAAO,UAAU,WAAW,GAAG,KAAK,OAAO;AAAA,IACrD;AAAA,EACF,CAAC;AACH,IACA,CAAC;AAEA,IAAM,UAAU,CAAC,UAAmB,0BAAY,QAAQ,GAAG,SAAS,CAAC;AAOrE,IAAM,oBAAoB,CAAC,eAChC,wBAAW,kBAAkB,GAAG,cAAc,CAAC,CAAC;AAgD3C,IAAM,cAAc,CAAC,WAC1B,WAAW,WAAO,aAAAC,aAAc,IAAI,CAAC;AAEhC,IAAM,eAAe,CAAC,WAC3B,SAAS,wBAAW,eAAe,CAAC;;;AC1ItC,kBAA6B;AAC7B,IAAAC,eAA6D;AAC7D,IAAAC,gBAA4B;AAErB,IAAM,cAAc,CAAC,WAAuB;AACjD,MAAI,OAAO,YAAY;AACrB,WAAO;AAAA,MACL,OAAO,OAAO,MAAM,SAAS;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,mBAAmB,0BAAY,OAAgB;AAC9C,IAAM,sBAAsB,wBAAW;AAAA,EAC5C,MAAM;AAAA,IACG;AAAA,IAEP,YAAY,MAAkB;AAC5B,WAAK,WAAW,KAAK;AAAA,IACvB;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,KAAK,aAAa,KAAK,UAAU;AAC1C,aAAK,WAAW,OAAO,KAAK;AAE5B,uBAAe,MAAM;AACnB,iBAAO,KAAK,SAAS;AAAA,YACnB,SAAS,iBAAiB,GAAG,KAAK,QAAQ;AAAA,UAC5C,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,aAAa,CAAC,WAAuB;AAChD,aAAW,MAAM,OAAO,cAAc;AACpC,eAAW,UAAU,GAAG,SAAS;AAC/B,UAAI,OAAO,GAAG,gBAAgB,KAAK,OAAO,UAAU,MAAM;AACxD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,YAAY,CAAC,WAAuB;AAC/C,aAAW,MAAM,OAAO,cAAc;AACpC,eAAW,UAAU,GAAG,SAAS;AAC/B,UAAI,OAAO,GAAG,gBAAgB,KAAK,OAAO,UAAU,OAAO;AACzD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,uBAAuB,CAAC,WAAuB;AAC1D,MAAI,CAAC,OAAO,WAAW,UAAU,GAAG,OAAO,MAAM,SAAS,GAAG;AAC3D,UAAM,EAAE,MAAM,IAAI,QAAQ,KAAK,IAAI,OAAO,MAAM,UAAU;AAC1D,WAAO;AAAA,MACL,WAAW,EAAE,MAAM,IAAI,MAAM,OAAO;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,kBAAkB,CAAC,WAAuB;;;ACxEvD,IAAAC,eAA2B;AAC3B,IAAAC,gBAAqB;AAEd,IAAM,QAAQ,MAAM;AAAA,EACzB,mBAAK;AAAA,IACH,wBAAW,MAAM;AAAA,MACf,gBAAgB,EAAE,SAAS,OAAO;AAAA,MAClC,iBAAiB,EAAE,QAAQ,OAAO;AAAA,MAClC,qBAAqB;AAAA;AAAA,QAEnB,WAAW;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":["cmUndo","cmRedo","import_view","import_state","cmPlaceholder","cmLineNumbers","import_view","import_state","import_view","import_state"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/api.ts","../src/option.ts","../src/event.ts","../src/extension.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nexport * from './api';\nexport * from './option';\nexport * from './event';\nexport * from './extension';\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { pick } from 'es-toolkit';\nimport { RectangleMarker, keymap, type EditorView } from '@codemirror/view';\nimport {\n EditorSelection,\n type Line,\n Prec,\n StateEffect,\n StateField,\n} from '@codemirror/state';\nimport { undo as cmUndo, redo as cmRedo } from '@codemirror/commands';\n\ninterface Context {\n view: EditorView;\n}\n\nexport const getValue =\n ({ view }: Context) =>\n () =>\n view.state.sliceDoc();\n\nexport const setValue =\n ({ view }: Context) =>\n (value: string) => {\n const { state } = view;\n if (state.readOnly) {\n return;\n }\n view.dispatch(\n state.update({\n changes: {\n from: 0,\n to: state.doc.length,\n insert: value ?? '',\n },\n }),\n );\n };\n\nexport const focus =\n ({ view }: Context) =>\n () => {\n view.focus();\n };\n\nexport const blur =\n ({ view }: Context) =>\n () => {\n view.contentDOM.blur();\n };\n\nexport const setCursorPosition =\n ({ view }: Context) =>\n (pos: number): void => {\n view.dispatch({\n selection: {\n head: pos,\n anchor: pos,\n },\n });\n };\n\nexport const getCursorPosition =\n ({ view }: Context) =>\n (): number =>\n view.state.selection.main.head;\n\n// Make sure the given regexp has a $ at its end and, if `start` is\n// true, a ^ at its start.\nfunction ensureAnchor(expr: RegExp, start: boolean) {\n const { source } = expr;\n const addStart = start && source[0] !== '^',\n addEnd = source[source.length - 1] !== '$';\n if (!addStart && !addEnd) {\n return expr;\n }\n return new RegExp(\n `${addStart ? '^' : ''}(?:${source})${addEnd ? '$' : ''}`,\n expr.flags ?? (expr.ignoreCase ? 'i' : ''),\n );\n}\n\nexport const matchBefore =\n ({ view }: Context) =>\n (match: RegExp): { from: number; to: number; text: string } | null => {\n const pos = view.state.selection.main.head;\n const line = view.state.doc.lineAt(pos);\n const start = Math.max(line.from, pos - 250);\n const str = line.text.slice(start - line.from, pos - line.from);\n\n if (match instanceof RegExp) {\n const found = str.search(ensureAnchor(match, false));\n return found < 0\n ? null\n : { from: start + found, to: pos, text: str.slice(found) };\n }\n\n return null;\n };\n\nexport const getView =\n ({ view }: Context) =>\n () =>\n view;\n\nexport interface ReplaceTextByRangeOptions {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n userEvent?: string;\n}\n\nexport const replaceTextByRange =\n ({ view }: Context) =>\n ({\n from,\n to,\n text,\n cursorOffset = 0,\n userEvent,\n }: ReplaceTextByRangeOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const { main } = state.selection;\n const fromOff = from - main.from;\n const toOff = to - main.from;\n\n view.dispatch({\n ...view.state.changeByRange(range => {\n if (\n range !== main &&\n from !== to &&\n state.sliceDoc(range.from + fromOff, range.from + toOff) !==\n state.sliceDoc(from, to)\n ) {\n return { range };\n }\n return {\n changes: {\n from: range.from + fromOff,\n to: to === main.from ? range.to : range.from + toOff,\n insert: text,\n },\n range: EditorSelection.cursor(\n range.from + fromOff + text.length + cursorOffset,\n ),\n };\n }),\n scrollIntoView: true,\n userEvent,\n });\n };\n\nconst updateDisabledKeybindings = StateEffect.define<string[]>();\n\nconst stub = () => true;\n\nexport const disableKeybindingsField = StateField.define<string[]>({\n create() {\n return [];\n },\n update(keys, tr) {\n for (const effect of tr.effects) {\n if (effect.is(updateDisabledKeybindings)) {\n return effect.value;\n }\n }\n return keys;\n },\n provide(f) {\n return Prec.highest(\n keymap.compute([f], state => {\n const keys = state.field(f);\n return keys.map(key => ({\n key,\n run: stub,\n }));\n }),\n );\n },\n});\n\nexport const disableKeybindings =\n ({ view }: Context) =>\n (keys: string[]) => {\n view.dispatch({\n effects: updateDisabledKeybindings.of(keys),\n });\n };\n\nexport const getSelection =\n ({ view }: Context) =>\n () => {\n const { from, to, anchor, head } = view.state.selection.main;\n return { from, to, anchor, head };\n };\n\nexport const getLineInfoAtPosition =\n ({ view }: Context) =>\n (pos: number): Line =>\n view.state.doc.lineAt(pos);\n\nexport const isFocused =\n ({ view }: Context) =>\n () =>\n view.hasFocus;\n\nexport const getMainSelectionRects =\n ({ view }: Context) =>\n () => {\n const markers = RectangleMarker.forRange(\n view,\n '',\n view.state.selection.main,\n );\n return markers.map(marker =>\n pick(marker, ['top', 'left', 'width', 'height']),\n );\n };\n\n// export const getInterpolationText = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const isInInterpolation = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\n// export const getInterpolationRange = ({ view }: Context) => {\n// return (pos: number) => {\n\n// }\n// }\n\ninterface InsertTextContext extends Context {\n text?: string;\n range?: {\n from: number;\n to?: number;\n };\n scrollIntoView?: boolean;\n}\n\nconst isNumber = (value: unknown): value is number => typeof value === 'number';\n\nexport const insertText = ({\n view,\n text = '',\n range = { from: 0 },\n scrollIntoView = true,\n}: InsertTextContext) => {\n try {\n view.dispatch({\n changes: {\n from: range.from,\n insert: text,\n ...(isNumber(range.to)\n ? {\n to: range.to,\n }\n : {}),\n },\n selection: { anchor: range.from, head: range.from + text.length },\n scrollIntoView,\n });\n } catch (e) {\n console.error('insertText failed', e);\n }\n};\n\ntype ReplaceTextOptions = {\n from: number;\n to: number;\n text: string;\n cursorOffset?: number;\n scrollIntoView?: boolean;\n userEvent?: string;\n};\nexport const replaceText =\n ({ view }: Context) =>\n (options: ReplaceTextOptions) => {\n const { state } = view;\n\n if (state.readOnly) {\n return;\n }\n\n const {\n from,\n to,\n text,\n cursorOffset = 0,\n scrollIntoView = true,\n userEvent,\n } = options;\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: text,\n },\n selection: EditorSelection.cursor(from + text.length + cursorOffset),\n scrollIntoView,\n userEvent,\n });\n };\n\nexport const undo =\n ({ view }: Context) =>\n () => {\n cmUndo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\nexport const redo =\n ({ view }: Context) =>\n () => {\n cmRedo({\n state: view.state,\n dispatch: view.dispatch,\n });\n };\n\ntype TextTransformer = (text: string) => string | undefined;\nexport const transformTextInSelection =\n ({ view }: Context) =>\n (transformer: TextTransformer) => {\n const { from, to } = view.state.selection.main;\n const text = view.state.sliceDoc(from, to);\n\n const newText = transformer(text);\n\n if (typeof newText !== 'string') {\n return;\n }\n\n view.dispatch({\n changes: {\n from,\n to,\n insert: newText,\n },\n selection: EditorSelection.cursor(from + newText.length),\n });\n };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { placeholder as cmPlaceholder } from '@coze-editor/extension-placeholder';\nimport { EditorView, lineNumbers as cmLineNumbers } from '@codemirror/view';\nimport { EditorState, Prec } from '@codemirror/state';\n\nexport const fontSize = (value?: number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '&': {\n fontSize: typeof value === 'number' ? `${value}px` : 'inherit',\n },\n });\n};\n\nexport const placeholder = (value?: HTMLElement | string) =>\n cmPlaceholder(value ?? '');\n\nexport const readOnly = (value?: boolean) =>\n EditorState.readOnly.of(value ?? false);\n\nexport const editable = (value?: boolean) =>\n EditorView.editable.of(value ?? true);\n\nexport const minHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const maxHeight = (value?: string | number) => {\n if (typeof value === 'undefined') {\n return [];\n }\n\n return EditorView.theme({\n '.cm-scroller': {\n maxHeight:\n typeof value === 'number'\n ? `${value}px`\n : typeof value === 'string'\n ? value\n : 'unset',\n },\n });\n};\n\nexport const height = (value?: string | number) =>\n typeof value === 'string' || typeof value === 'number'\n ? [\n // give it higher prec to override styles from minHeight option\n Prec.high(\n EditorView.theme({\n '.cm-content, .cm-gutter, .cm-right-gutter': {\n minHeight: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ),\n EditorView.theme({\n '.cm-scroller': {\n height: typeof value === 'number' ? `${value}px` : value,\n },\n }),\n ]\n : [];\n\nexport const tabSize = (value?: number) => EditorState.tabSize.of(value ?? 2);\n\nexport interface Attrs {\n [name: string]: string;\n}\ntype AttrSource = Attrs | ((view: EditorView) => Attrs | null);\n\nexport const contentAttributes = (attributes: AttrSource) =>\n EditorView.contentAttributes.of(attributes ?? {});\n\n// type CursorColorParams = string | ((state: EditorState) => string);\n// const cursorColorFacet = Facet.define<CursorColorParams | undefined, CursorColorParams | undefined>({\n// combine(values) {\n// return values[values.length - 1];\n// },\n// });\n\n// export const cursorColor = (color?: CursorColorParams) => {\n// return [\n// cursorColorFacet.of(color),\n// ];\n// };\n\n// export const cursorColorExtension = () => {\n// const compartment = new Compartment()\n// return [\n// drawSelection(),\n// compartment.of([]),\n// EditorState.transactionExtender.of(tr => {\n// const color = tr.state.facet(cursorColorFacet);\n\n// let finalColor: string | null = null\n\n// if (typeof color === 'string') {\n// finalColor = color\n// } else if (typeof color === 'function') {\n// finalColor = color(tr.state)\n// }\n\n// if (typeof finalColor === 'string') {\n// return {\n// effects: compartment.reconfigure([\n// EditorView.theme({\n// '& .cm-cursor, & .cm-dropCursor': {\n// borderLeft: `1.2px solid ${finalColor}`,\n// },\n// })\n// ])\n// }\n// }\n\n// return null\n// })\n// ]\n// }\n\nexport const lineNumbers = (enable?: boolean) =>\n enable === true ? cmLineNumbers() : [];\n\nexport const lineWrapping = (enable: boolean) =>\n enable ? EditorView.lineWrapping : [];\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EVENT_SILENT } from '@coze-editor/core';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { StateEffect } from '@codemirror/state';\n\nexport const eventChange = (update: ViewUpdate) => {\n if (update.docChanged) {\n return {\n value: update.state.sliceDoc(),\n };\n }\n\n return EVENT_SILENT;\n};\n\nconst focusStateEffect = StateEffect.define<boolean>();\nexport const focusChangeNotifier = ViewPlugin.fromClass(\n class {\n public hasFocus: boolean;\n\n constructor(view: EditorView) {\n this.hasFocus = view.hasFocus;\n }\n update(update: ViewUpdate) {\n if (update.view.hasFocus !== this.hasFocus) {\n this.hasFocus = update.view.hasFocus;\n\n queueMicrotask(() => {\n update.view.dispatch({\n effects: focusStateEffect.of(this.hasFocus),\n });\n });\n }\n }\n },\n);\n\nexport const eventFocus = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === true) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventBlur = (update: ViewUpdate) => {\n for (const tr of update.transactions) {\n for (const effect of tr.effects) {\n if (effect.is(focusStateEffect) && effect.value === false) {\n return;\n }\n }\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventSelectionChange = (update: ViewUpdate) => {\n if (!update.startState.selection.eq(update.state.selection)) {\n const { from, to, anchor, head } = update.state.selection.main;\n return {\n selection: { from, to, head, anchor },\n update,\n };\n }\n\n return EVENT_SILENT;\n};\n\nexport const eventViewUpdate = (update: ViewUpdate) => update;\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { EditorView } from '@codemirror/view';\nimport { Prec } from '@codemirror/state';\n\nexport const basic = () => [\n Prec.low(\n EditorView.theme({\n '&.cm-focused': { outline: 'none' },\n '& .cm-content': { cursor: 'text' },\n '& .cm-placeholder': {\n // position: 'absolute',\n wordBreak: 'break-all',\n },\n }),\n ),\n];\n"],"mappings":"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","names":["cmUndo","cmRedo","import_view","import_state","cmPlaceholder","cmLineNumbers","import_view","import_state","import_view","import_state"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coze-editor/core-plugins",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.270604",
|
|
4
4
|
"description": "core-plugins",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "fengzilong",
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
"lint": "eslint && tsc --noEmit"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@coze-editor/core": "0.1.0-alpha.
|
|
26
|
-
"@coze-editor/extension-placeholder": "0.1.0-alpha.
|
|
25
|
+
"@coze-editor/core": "0.1.0-alpha.270604",
|
|
26
|
+
"@coze-editor/extension-placeholder": "0.1.0-alpha.270604",
|
|
27
27
|
"es-toolkit": "^1.25.2"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|