@coze-editor/core-plugins 0.1.0-alpha.456f9f → 0.1.0-alpha.4f717a
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 +54 -24
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +6 -2
- package/dist/index.d.ts +6 -2
- package/dist/index.js +49 -21
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
package/dist/esm/index.js
CHANGED
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
} from "@codemirror/state";
|
|
10
10
|
import { undo as cmUndo, redo as cmRedo } from "@codemirror/commands";
|
|
11
11
|
var getValue = ({ view }) => () => view.state.sliceDoc();
|
|
12
|
-
var setValue = ({ view }) => (
|
|
12
|
+
var setValue = ({ view }) => (value2) => {
|
|
13
13
|
const { state } = view;
|
|
14
14
|
if (state.readOnly) {
|
|
15
15
|
return;
|
|
@@ -19,7 +19,7 @@ var setValue = ({ view }) => (value) => {
|
|
|
19
19
|
changes: {
|
|
20
20
|
from: 0,
|
|
21
21
|
to: state.doc.length,
|
|
22
|
-
insert:
|
|
22
|
+
insert: value2 ?? ""
|
|
23
23
|
}
|
|
24
24
|
})
|
|
25
25
|
);
|
|
@@ -143,7 +143,7 @@ var getMainSelectionRects = ({ view }) => () => {
|
|
|
143
143
|
(marker) => pick(marker, ["top", "left", "width", "height"])
|
|
144
144
|
);
|
|
145
145
|
};
|
|
146
|
-
var isNumber = (
|
|
146
|
+
var isNumber = (value2) => typeof value2 === "number";
|
|
147
147
|
var insertText = ({
|
|
148
148
|
view,
|
|
149
149
|
text = "",
|
|
@@ -220,65 +220,93 @@ var transformTextInSelection = ({ view }) => (transformer) => {
|
|
|
220
220
|
};
|
|
221
221
|
|
|
222
222
|
// src/option.ts
|
|
223
|
+
import { FacetCombineStrategy } from "@coze-editor/utils";
|
|
223
224
|
import { placeholder as cmPlaceholder } from "@coze-editor/extension-placeholder";
|
|
224
|
-
import {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
225
|
+
import {
|
|
226
|
+
EditorView,
|
|
227
|
+
ViewPlugin,
|
|
228
|
+
lineNumbers as cmLineNumbers
|
|
229
|
+
} from "@codemirror/view";
|
|
230
|
+
import { EditorState, Facet, Prec as Prec2 } from "@codemirror/state";
|
|
231
|
+
var fontSize = (value2) => {
|
|
232
|
+
if (typeof value2 === "undefined") {
|
|
228
233
|
return [];
|
|
229
234
|
}
|
|
230
235
|
return EditorView.theme({
|
|
231
236
|
"&": {
|
|
232
|
-
fontSize: typeof
|
|
237
|
+
fontSize: typeof value2 === "number" ? `${value2}px` : "inherit"
|
|
233
238
|
}
|
|
234
239
|
});
|
|
235
240
|
};
|
|
236
|
-
var placeholder = (
|
|
237
|
-
var readOnly = (
|
|
238
|
-
var editable = (
|
|
239
|
-
var minHeight = (
|
|
240
|
-
if (typeof
|
|
241
|
+
var placeholder = (value2) => cmPlaceholder(value2 ?? "");
|
|
242
|
+
var readOnly = (value2) => EditorState.readOnly.of(value2 ?? false);
|
|
243
|
+
var editable = (value2) => EditorView.editable.of(value2 ?? true);
|
|
244
|
+
var minHeight = (value2) => {
|
|
245
|
+
if (typeof value2 === "undefined") {
|
|
241
246
|
return [];
|
|
242
247
|
}
|
|
243
248
|
return EditorView.theme({
|
|
244
249
|
".cm-content, .cm-gutter, .cm-right-gutter": {
|
|
245
|
-
minHeight: typeof
|
|
250
|
+
minHeight: typeof value2 === "number" ? `${value2}px` : typeof value2 === "string" ? value2 : "unset"
|
|
246
251
|
}
|
|
247
252
|
});
|
|
248
253
|
};
|
|
249
|
-
var maxHeight = (
|
|
250
|
-
if (typeof
|
|
254
|
+
var maxHeight = (value2) => {
|
|
255
|
+
if (typeof value2 === "undefined") {
|
|
251
256
|
return [];
|
|
252
257
|
}
|
|
253
258
|
return EditorView.theme({
|
|
254
259
|
".cm-scroller": {
|
|
255
|
-
maxHeight: typeof
|
|
260
|
+
maxHeight: typeof value2 === "number" ? `${value2}px` : typeof value2 === "string" ? value2 : "unset"
|
|
256
261
|
}
|
|
257
262
|
});
|
|
258
263
|
};
|
|
259
|
-
var height = (
|
|
264
|
+
var height = (value2) => typeof value2 === "string" || typeof value2 === "number" ? [
|
|
260
265
|
// give it higher prec to override styles from minHeight option
|
|
261
266
|
Prec2.high(
|
|
262
267
|
EditorView.theme({
|
|
263
268
|
".cm-content, .cm-gutter, .cm-right-gutter": {
|
|
264
|
-
minHeight: typeof
|
|
269
|
+
minHeight: typeof value2 === "number" ? `${value2}px` : value2
|
|
265
270
|
}
|
|
266
271
|
})
|
|
267
272
|
),
|
|
268
273
|
EditorView.theme({
|
|
269
274
|
".cm-scroller": {
|
|
270
|
-
height: typeof
|
|
275
|
+
height: typeof value2 === "number" ? `${value2}px` : value2
|
|
271
276
|
}
|
|
272
277
|
})
|
|
273
278
|
] : [];
|
|
274
|
-
var tabSize = (
|
|
279
|
+
var tabSize = (value2) => EditorState.tabSize.of(value2 ?? 2);
|
|
275
280
|
var contentAttributes = (attributes) => EditorView.contentAttributes.of(attributes ?? {});
|
|
276
281
|
var lineNumbers = (enable) => enable === true ? cmLineNumbers() : [];
|
|
277
282
|
var lineWrapping = (enable) => enable ? EditorView.lineWrapping : [];
|
|
283
|
+
var valueFacet = Facet.define({
|
|
284
|
+
combine: FacetCombineStrategy.Last
|
|
285
|
+
});
|
|
286
|
+
var valueExtension = ViewPlugin.fromClass(
|
|
287
|
+
class {
|
|
288
|
+
update(update) {
|
|
289
|
+
const currentValue = update.state.doc.toString();
|
|
290
|
+
const newValue = update.state.facet(valueFacet);
|
|
291
|
+
if (typeof newValue === "string" && newValue && newValue !== currentValue) {
|
|
292
|
+
queueMicrotask(() => {
|
|
293
|
+
update.view.dispatch({
|
|
294
|
+
changes: {
|
|
295
|
+
from: 0,
|
|
296
|
+
to: currentValue.length,
|
|
297
|
+
insert: newValue
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
);
|
|
305
|
+
var value = (v) => valueFacet.of(v);
|
|
278
306
|
|
|
279
307
|
// src/event.ts
|
|
280
308
|
import { EVENT_SILENT } from "@coze-editor/core";
|
|
281
|
-
import { ViewPlugin } from "@codemirror/view";
|
|
309
|
+
import { ViewPlugin as ViewPlugin2 } from "@codemirror/view";
|
|
282
310
|
import { StateEffect as StateEffect2 } from "@codemirror/state";
|
|
283
311
|
var eventChange = (update) => {
|
|
284
312
|
if (update.docChanged) {
|
|
@@ -289,7 +317,7 @@ var eventChange = (update) => {
|
|
|
289
317
|
return EVENT_SILENT;
|
|
290
318
|
};
|
|
291
319
|
var focusStateEffect = StateEffect2.define();
|
|
292
|
-
var focusChangeNotifier =
|
|
320
|
+
var focusChangeNotifier = ViewPlugin2.fromClass(
|
|
293
321
|
class {
|
|
294
322
|
hasFocus;
|
|
295
323
|
constructor(view) {
|
|
@@ -392,6 +420,8 @@ export {
|
|
|
392
420
|
setValue,
|
|
393
421
|
tabSize,
|
|
394
422
|
transformTextInSelection,
|
|
395
|
-
undo
|
|
423
|
+
undo,
|
|
424
|
+
value,
|
|
425
|
+
valueExtension
|
|
396
426
|
};
|
|
397
427
|
//# sourceMappingURL=index.js.map
|
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\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"]}
|
|
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 { FacetCombineStrategy } from '@coze-editor/utils';\nimport { placeholder as cmPlaceholder } from '@coze-editor/extension-placeholder';\nimport {\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n lineNumbers as cmLineNumbers,\n} from '@codemirror/view';\nimport { EditorState, Facet, 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\nconst valueFacet = Facet.define<string, string>({\n combine: FacetCombineStrategy.Last,\n});\nexport const valueExtension = ViewPlugin.fromClass(\n class {\n update(update: ViewUpdate) {\n const currentValue = update.state.doc.toString();\n const newValue = update.state.facet(valueFacet);\n\n if (\n typeof newValue === 'string' &&\n newValue &&\n newValue !== currentValue\n ) {\n queueMicrotask(() => {\n update.view.dispatch({\n changes: {\n from: 0,\n to: currentValue.length,\n insert: newValue,\n },\n });\n });\n }\n }\n },\n);\nexport const value = (v: string) => valueFacet.of(v);\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":["value","Prec","value","ViewPlugin","StateEffect","EditorView","Prec"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EditorView, RectangleMarker,
|
|
1
|
+
import { EditorView, RectangleMarker, ViewPlugin, ViewUpdate } from '@codemirror/view';
|
|
2
2
|
import * as _codemirror_state from '@codemirror/state';
|
|
3
3
|
import { StateField, Line } from '@codemirror/state';
|
|
4
4
|
import { EVENT_SILENT } from '@coze-editor/core';
|
|
@@ -75,6 +75,10 @@ type AttrSource = Attrs | ((view: EditorView) => Attrs | null);
|
|
|
75
75
|
declare const contentAttributes: (attributes: AttrSource) => _codemirror_state.Extension;
|
|
76
76
|
declare const lineNumbers: (enable?: boolean) => _codemirror_state.Extension;
|
|
77
77
|
declare const lineWrapping: (enable: boolean) => _codemirror_state.Extension;
|
|
78
|
+
declare const valueExtension: ViewPlugin<{
|
|
79
|
+
update(update: ViewUpdate): void;
|
|
80
|
+
}, undefined>;
|
|
81
|
+
declare const value: (v: string) => _codemirror_state.Extension;
|
|
78
82
|
|
|
79
83
|
declare const eventChange: (update: ViewUpdate) => typeof EVENT_SILENT | {
|
|
80
84
|
value: string;
|
|
@@ -98,4 +102,4 @@ declare const eventViewUpdate: (update: ViewUpdate) => ViewUpdate;
|
|
|
98
102
|
|
|
99
103
|
declare const basic: () => _codemirror_state.Extension[];
|
|
100
104
|
|
|
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 };
|
|
105
|
+
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, value, valueExtension };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EditorView, RectangleMarker,
|
|
1
|
+
import { EditorView, RectangleMarker, ViewPlugin, ViewUpdate } from '@codemirror/view';
|
|
2
2
|
import * as _codemirror_state from '@codemirror/state';
|
|
3
3
|
import { StateField, Line } from '@codemirror/state';
|
|
4
4
|
import { EVENT_SILENT } from '@coze-editor/core';
|
|
@@ -75,6 +75,10 @@ type AttrSource = Attrs | ((view: EditorView) => Attrs | null);
|
|
|
75
75
|
declare const contentAttributes: (attributes: AttrSource) => _codemirror_state.Extension;
|
|
76
76
|
declare const lineNumbers: (enable?: boolean) => _codemirror_state.Extension;
|
|
77
77
|
declare const lineWrapping: (enable: boolean) => _codemirror_state.Extension;
|
|
78
|
+
declare const valueExtension: ViewPlugin<{
|
|
79
|
+
update(update: ViewUpdate): void;
|
|
80
|
+
}, undefined>;
|
|
81
|
+
declare const value: (v: string) => _codemirror_state.Extension;
|
|
78
82
|
|
|
79
83
|
declare const eventChange: (update: ViewUpdate) => typeof EVENT_SILENT | {
|
|
80
84
|
value: string;
|
|
@@ -98,4 +102,4 @@ declare const eventViewUpdate: (update: ViewUpdate) => ViewUpdate;
|
|
|
98
102
|
|
|
99
103
|
declare const basic: () => _codemirror_state.Extension[];
|
|
100
104
|
|
|
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 };
|
|
105
|
+
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, value, valueExtension };
|
package/dist/index.js
CHANGED
|
@@ -56,7 +56,9 @@ __export(index_exports, {
|
|
|
56
56
|
setValue: () => setValue,
|
|
57
57
|
tabSize: () => tabSize,
|
|
58
58
|
transformTextInSelection: () => transformTextInSelection,
|
|
59
|
-
undo: () => undo
|
|
59
|
+
undo: () => undo,
|
|
60
|
+
value: () => value,
|
|
61
|
+
valueExtension: () => valueExtension
|
|
60
62
|
});
|
|
61
63
|
module.exports = __toCommonJS(index_exports);
|
|
62
64
|
|
|
@@ -66,7 +68,7 @@ var import_view = require("@codemirror/view");
|
|
|
66
68
|
var import_state = require("@codemirror/state");
|
|
67
69
|
var import_commands = require("@codemirror/commands");
|
|
68
70
|
var getValue = ({ view }) => () => view.state.sliceDoc();
|
|
69
|
-
var setValue = ({ view }) => (
|
|
71
|
+
var setValue = ({ view }) => (value2) => {
|
|
70
72
|
const { state } = view;
|
|
71
73
|
if (state.readOnly) {
|
|
72
74
|
return;
|
|
@@ -76,7 +78,7 @@ var setValue = ({ view }) => (value) => {
|
|
|
76
78
|
changes: {
|
|
77
79
|
from: 0,
|
|
78
80
|
to: state.doc.length,
|
|
79
|
-
insert:
|
|
81
|
+
insert: value2 ?? ""
|
|
80
82
|
}
|
|
81
83
|
})
|
|
82
84
|
);
|
|
@@ -200,7 +202,7 @@ var getMainSelectionRects = ({ view }) => () => {
|
|
|
200
202
|
(marker) => (0, import_es_toolkit.pick)(marker, ["top", "left", "width", "height"])
|
|
201
203
|
);
|
|
202
204
|
};
|
|
203
|
-
var isNumber = (
|
|
205
|
+
var isNumber = (value2) => typeof value2 === "number";
|
|
204
206
|
var insertText = ({
|
|
205
207
|
view,
|
|
206
208
|
text = "",
|
|
@@ -277,61 +279,85 @@ var transformTextInSelection = ({ view }) => (transformer) => {
|
|
|
277
279
|
};
|
|
278
280
|
|
|
279
281
|
// src/option.ts
|
|
282
|
+
var import_utils = require("@coze-editor/utils");
|
|
280
283
|
var import_extension_placeholder = require("@coze-editor/extension-placeholder");
|
|
281
284
|
var import_view2 = require("@codemirror/view");
|
|
282
285
|
var import_state2 = require("@codemirror/state");
|
|
283
|
-
var fontSize = (
|
|
284
|
-
if (typeof
|
|
286
|
+
var fontSize = (value2) => {
|
|
287
|
+
if (typeof value2 === "undefined") {
|
|
285
288
|
return [];
|
|
286
289
|
}
|
|
287
290
|
return import_view2.EditorView.theme({
|
|
288
291
|
"&": {
|
|
289
|
-
fontSize: typeof
|
|
292
|
+
fontSize: typeof value2 === "number" ? `${value2}px` : "inherit"
|
|
290
293
|
}
|
|
291
294
|
});
|
|
292
295
|
};
|
|
293
|
-
var placeholder = (
|
|
294
|
-
var readOnly = (
|
|
295
|
-
var editable = (
|
|
296
|
-
var minHeight = (
|
|
297
|
-
if (typeof
|
|
296
|
+
var placeholder = (value2) => (0, import_extension_placeholder.placeholder)(value2 ?? "");
|
|
297
|
+
var readOnly = (value2) => import_state2.EditorState.readOnly.of(value2 ?? false);
|
|
298
|
+
var editable = (value2) => import_view2.EditorView.editable.of(value2 ?? true);
|
|
299
|
+
var minHeight = (value2) => {
|
|
300
|
+
if (typeof value2 === "undefined") {
|
|
298
301
|
return [];
|
|
299
302
|
}
|
|
300
303
|
return import_view2.EditorView.theme({
|
|
301
304
|
".cm-content, .cm-gutter, .cm-right-gutter": {
|
|
302
|
-
minHeight: typeof
|
|
305
|
+
minHeight: typeof value2 === "number" ? `${value2}px` : typeof value2 === "string" ? value2 : "unset"
|
|
303
306
|
}
|
|
304
307
|
});
|
|
305
308
|
};
|
|
306
|
-
var maxHeight = (
|
|
307
|
-
if (typeof
|
|
309
|
+
var maxHeight = (value2) => {
|
|
310
|
+
if (typeof value2 === "undefined") {
|
|
308
311
|
return [];
|
|
309
312
|
}
|
|
310
313
|
return import_view2.EditorView.theme({
|
|
311
314
|
".cm-scroller": {
|
|
312
|
-
maxHeight: typeof
|
|
315
|
+
maxHeight: typeof value2 === "number" ? `${value2}px` : typeof value2 === "string" ? value2 : "unset"
|
|
313
316
|
}
|
|
314
317
|
});
|
|
315
318
|
};
|
|
316
|
-
var height = (
|
|
319
|
+
var height = (value2) => typeof value2 === "string" || typeof value2 === "number" ? [
|
|
317
320
|
// give it higher prec to override styles from minHeight option
|
|
318
321
|
import_state2.Prec.high(
|
|
319
322
|
import_view2.EditorView.theme({
|
|
320
323
|
".cm-content, .cm-gutter, .cm-right-gutter": {
|
|
321
|
-
minHeight: typeof
|
|
324
|
+
minHeight: typeof value2 === "number" ? `${value2}px` : value2
|
|
322
325
|
}
|
|
323
326
|
})
|
|
324
327
|
),
|
|
325
328
|
import_view2.EditorView.theme({
|
|
326
329
|
".cm-scroller": {
|
|
327
|
-
height: typeof
|
|
330
|
+
height: typeof value2 === "number" ? `${value2}px` : value2
|
|
328
331
|
}
|
|
329
332
|
})
|
|
330
333
|
] : [];
|
|
331
|
-
var tabSize = (
|
|
334
|
+
var tabSize = (value2) => import_state2.EditorState.tabSize.of(value2 ?? 2);
|
|
332
335
|
var contentAttributes = (attributes) => import_view2.EditorView.contentAttributes.of(attributes ?? {});
|
|
333
336
|
var lineNumbers = (enable) => enable === true ? (0, import_view2.lineNumbers)() : [];
|
|
334
337
|
var lineWrapping = (enable) => enable ? import_view2.EditorView.lineWrapping : [];
|
|
338
|
+
var valueFacet = import_state2.Facet.define({
|
|
339
|
+
combine: import_utils.FacetCombineStrategy.Last
|
|
340
|
+
});
|
|
341
|
+
var valueExtension = import_view2.ViewPlugin.fromClass(
|
|
342
|
+
class {
|
|
343
|
+
update(update) {
|
|
344
|
+
const currentValue = update.state.doc.toString();
|
|
345
|
+
const newValue = update.state.facet(valueFacet);
|
|
346
|
+
if (typeof newValue === "string" && newValue && newValue !== currentValue) {
|
|
347
|
+
queueMicrotask(() => {
|
|
348
|
+
update.view.dispatch({
|
|
349
|
+
changes: {
|
|
350
|
+
from: 0,
|
|
351
|
+
to: currentValue.length,
|
|
352
|
+
insert: newValue
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
);
|
|
360
|
+
var value = (v) => valueFacet.of(v);
|
|
335
361
|
|
|
336
362
|
// src/event.ts
|
|
337
363
|
var import_core = require("@coze-editor/core");
|
|
@@ -450,6 +476,8 @@ var basic = () => [
|
|
|
450
476
|
setValue,
|
|
451
477
|
tabSize,
|
|
452
478
|
transformTextInSelection,
|
|
453
|
-
undo
|
|
479
|
+
undo,
|
|
480
|
+
value,
|
|
481
|
+
valueExtension
|
|
454
482
|
});
|
|
455
483
|
//# sourceMappingURL=index.js.map
|
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\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"]}
|
|
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 { FacetCombineStrategy } from '@coze-editor/utils';\nimport { placeholder as cmPlaceholder } from '@coze-editor/extension-placeholder';\nimport {\n EditorView,\n ViewPlugin,\n type ViewUpdate,\n lineNumbers as cmLineNumbers,\n} from '@codemirror/view';\nimport { EditorState, Facet, 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\nconst valueFacet = Facet.define<string, string>({\n combine: FacetCombineStrategy.Last,\n});\nexport const valueExtension = ViewPlugin.fromClass(\n class {\n update(update: ViewUpdate) {\n const currentValue = update.state.doc.toString();\n const newValue = update.state.facet(valueFacet);\n\n if (\n typeof newValue === 'string' &&\n newValue &&\n newValue !== currentValue\n ) {\n queueMicrotask(() => {\n update.view.dispatch({\n changes: {\n from: 0,\n to: currentValue.length,\n insert: newValue,\n },\n });\n });\n }\n }\n },\n);\nexport const value = (v: string) => valueFacet.of(v);\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":["value","cmUndo","cmRedo","import_view","import_state","value","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.4f717a",
|
|
4
4
|
"description": "core-plugins",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "fengzilong",
|
|
@@ -22,8 +22,9 @@
|
|
|
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.4f717a",
|
|
26
|
+
"@coze-editor/extension-placeholder": "0.1.0-alpha.4f717a",
|
|
27
|
+
"@coze-editor/utils": "0.1.0-alpha.4f717a",
|
|
27
28
|
"es-toolkit": "^1.25.2"
|
|
28
29
|
},
|
|
29
30
|
"devDependencies": {
|