@coze-editor/preset-chat 0.1.0-alpha.1e5e87 → 0.1.0-alpha.2b6c24

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 CHANGED
@@ -24,14 +24,14 @@ function extractElementData(node, text) {
24
24
  const valueNode = isNode == null ? void 0 : isNode.nextSibling;
25
25
  if ((nameNode == null ? void 0 : nameNode.name) === "AttributeName" && (isNode == null ? void 0 : isNode.name) === "Is" && ((valueNode == null ? void 0 : valueNode.name) === "AttributeValue" || (valueNode == null ? void 0 : valueNode.name) === "UnquotedAttributeValue")) {
26
26
  const name = text.slice(nameNode.from, nameNode.to);
27
- const value = text.slice(valueNode.from, valueNode.to);
27
+ const fullValue = text.slice(valueNode.from, valueNode.to);
28
+ let value = fullValue;
28
29
  if (valueNode.name === "AttributeValue") {
29
- attributes[name] = decodeURIComponent(value.slice(1, -1));
30
- } else {
31
- try {
32
- attributes[name] = JSON.parse(decodeURIComponent(value));
33
- } catch (e) {
34
- }
30
+ value = fullValue.slice(1, -1);
31
+ }
32
+ try {
33
+ attributes[name] = JSON.parse(decodeURIComponent(value));
34
+ } catch (e) {
35
35
  }
36
36
  } else if ((nameNode == null ? void 0 : nameNode.name) === "AttributeName" && !isNode && !valueNode) {
37
37
  const name = text.slice(nameNode.from, nameNode.to);
@@ -63,15 +63,27 @@ var htmlLanguage = LRLanguage.define({
63
63
  });
64
64
 
65
65
  // src/schema.ts
66
+ function isElementRegistered(tagName, validTagNames) {
67
+ if (!Array.isArray(validTagNames)) {
68
+ return false;
69
+ }
70
+ if (validTagNames.includes(tagName)) {
71
+ return true;
72
+ }
73
+ return false;
74
+ }
66
75
  var schemaUtils = {
67
- toJSON(text) {
76
+ toJSON(text, options) {
77
+ if (text === "") {
78
+ return [];
79
+ }
68
80
  const tree = parse(text);
69
81
  const tags = [];
70
82
  tree.iterate({
71
83
  enter(node) {
72
- if (node.name === "Element" && node.matchContext(["Document"])) {
84
+ if (node.name === "Element") {
73
85
  const data = extractElementData(node.node, text);
74
- if (data) {
86
+ if (data && isElementRegistered(data.tagName, options == null ? void 0 : options.validTagNames)) {
75
87
  tags.push({
76
88
  from: node.from,
77
89
  to: node.to,
@@ -141,12 +153,14 @@ function attributesToString(attributes) {
141
153
  const value = attributes[key];
142
154
  if (value === true) {
143
155
  array.push(key);
144
- } else {
145
- array.push(`${key}=${JSON.stringify(encodeURIComponent(value))}`);
156
+ } else if (typeof value !== "undefined") {
157
+ array.push(`${key}="${encodeURIComponent(JSON.stringify(value))}"`);
146
158
  }
147
159
  });
148
160
  if (!hasId) {
149
- array.unshift(`${INTERNAL_ID}="${uniqueId()}"`);
161
+ array.unshift(
162
+ `${INTERNAL_ID}="${encodeURIComponent(JSON.stringify(uniqueId()))}"`
163
+ );
150
164
  }
151
165
  return array.join(" ");
152
166
  }
@@ -173,7 +187,7 @@ import {
173
187
  RangeSetBuilder,
174
188
  StateField
175
189
  } from "@codemirror/state";
176
- import { syntaxTree } from "@codemirror/language";
190
+ import { ensureSyntaxTree, syntaxTree } from "@codemirror/language";
177
191
 
178
192
  // src/context.tsx
179
193
  import React, { createContext, useContext } from "react";
@@ -259,7 +273,7 @@ function build(state) {
259
273
  if (!allElements) {
260
274
  return Decoration.none;
261
275
  }
262
- const tree = syntaxTree(state);
276
+ const tree = ensureSyntaxTree(state, state.doc.length) ?? syntaxTree(state);
263
277
  const builder = new RangeSetBuilder();
264
278
  tree.iterate({
265
279
  enter(node) {
@@ -280,9 +294,6 @@ function build(state) {
280
294
  );
281
295
  }
282
296
  }
283
- if (node.matchContext(["Document"])) {
284
- return false;
285
- }
286
297
  return true;
287
298
  }
288
299
  });
@@ -308,10 +319,13 @@ var copyPasteHandler = EditorView.domEventHandlers({
308
319
  paste(event, view) {
309
320
  var _a, _b;
310
321
  try {
322
+ const definitions = view.state.facet(elementsFacet);
311
323
  const xText = (_a = event.clipboardData) == null ? void 0 : _a.getData(CUSTOM_CLIPBOARD_MIMETYPE);
312
324
  const plainText = (_b = event.clipboardData) == null ? void 0 : _b.getData("text/plain");
313
- const text = xText ?? plainText ?? "";
314
- const nodes = schemaUtils.toJSON(text);
325
+ const text = xText || plainText || "";
326
+ const nodes = schemaUtils.toJSON(text, {
327
+ validTagNames: definitions ? Object.keys(definitions) : void 0
328
+ });
315
329
  const newText = schemaUtils.fromJSON(
316
330
  nodes.map((node) => {
317
331
  if (node.type === "text") {
@@ -352,7 +366,9 @@ var copyPasteHandler = EditorView.domEventHandlers({
352
366
  try {
353
367
  const { from, to } = view.state.selection.main;
354
368
  const slice = view.state.doc.sliceString(from, to);
355
- const nodes = schemaUtils.toJSON(slice);
369
+ const nodes = schemaUtils.toJSON(slice, {
370
+ validTagNames: definitions ? Object.keys(definitions) : void 0
371
+ });
356
372
  const plainText = nodes.map((node) => {
357
373
  if (node.type === "text") {
358
374
  return node.value;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/utils.ts","../../src/language.ts","../../src/schema.ts","../../src/plugins.ts","../../src/extension.ts","../../src/context.tsx","../../src/hooks.tsx"],"sourcesContent":["import universalPreset from '@coze-editor/preset-universal';\nimport { extension, type InferEditorAPIFromPlugins } from '@coze-editor/core';\nimport { EditorView, keymap } from '@codemirror/view';\nimport { defaultKeymap, historyKeymap, history } from '@codemirror/commands';\n\nimport {\n type EditorNode,\n type EditorElement,\n type EditorText,\n schemaUtils,\n} from './schema';\nimport plugins from './plugins';\nimport { htmlLanguage } from './language';\nimport { useCurrentElement } from './hooks';\nimport { CUSTOM_CLIPBOARD_MIMETYPE, type ElementDefinition } from './extension';\n\nconst preset = [\n ...universalPreset,\n extension([\n EditorView.theme({\n '&.cm-focused': {\n outline: 'none',\n },\n }),\n htmlLanguage,\n history(),\n keymap.of([...defaultKeymap, ...historyKeymap]),\n ]),\n ...plugins,\n];\n\ntype EditorAPI = InferEditorAPIFromPlugins<typeof preset>;\n\nexport default preset;\n\nexport { schemaUtils, useCurrentElement, CUSTOM_CLIPBOARD_MIMETYPE };\n\nexport type {\n EditorAPI,\n ElementDefinition,\n EditorNode,\n EditorElement,\n EditorText,\n};\n","/* eslint-disable complexity */\n\nimport { type SyntaxNode } from '@lezer/common';\n\nfunction extractElementData(node: SyntaxNode, text: string) {\n const openTag = node.firstChild;\n\n let tagName: string | null = null;\n const attributes: Record<string, any> = {};\n\n if (openTag && openTag.name === 'OpenTag' && openTag.firstChild) {\n let sibling = openTag.firstChild.nextSibling;\n while (true) {\n if (!sibling) {\n break;\n }\n\n if (sibling.name === 'TagName') {\n const { from, to } = sibling;\n tagName = text.slice(from, to);\n } else if (sibling.name === 'Attribute') {\n const nameNode = sibling.firstChild;\n const isNode = nameNode?.nextSibling;\n const valueNode = isNode?.nextSibling;\n if (\n nameNode?.name === 'AttributeName' &&\n isNode?.name === 'Is' &&\n (valueNode?.name === 'AttributeValue' ||\n valueNode?.name === 'UnquotedAttributeValue')\n ) {\n const name = text.slice(nameNode.from, nameNode.to);\n const value = text.slice(valueNode.from, valueNode.to);\n\n if (valueNode.name === 'AttributeValue') {\n attributes[name] = decodeURIComponent(value.slice(1, -1));\n } else {\n try {\n attributes[name] = JSON.parse(decodeURIComponent(value));\n } catch (e) {\n /* empty */\n }\n }\n } else if (\n nameNode?.name === 'AttributeName' &&\n !isNode &&\n !valueNode\n ) {\n const name = text.slice(nameNode.from, nameNode.to);\n attributes[name] = true;\n }\n }\n\n sibling = sibling.nextSibling;\n }\n }\n\n if (tagName) {\n return {\n tagName,\n attributes,\n };\n }\n}\n\nexport { extractElementData };\n","import { parser } from '@lezer/html';\nimport { LRLanguage } from '@codemirror/language';\n\nconst htmlParser = parser.configure({\n dialect: 'noMatch',\n});\n\nfunction parse(text: string) {\n return htmlParser.parse(text);\n}\n\nconst htmlLanguage = LRLanguage.define({\n parser: htmlParser,\n});\n\nexport { parse, htmlLanguage };\n","import { extractElementData } from './utils';\nimport { parse } from './language';\n\ninterface EditorElement<Attrs = Record<string, any>> {\n type: 'element';\n tagName: string;\n attributes: Attrs;\n raw?: string;\n}\n\ninterface EditorText {\n type: 'text';\n value: string;\n}\n\ntype EditorNode = EditorElement | EditorText;\n\nconst schemaUtils = {\n toJSON(text: string): EditorNode[] {\n const tree = parse(text);\n const tags: {\n from: number;\n to: number;\n tagName: string;\n attributes: Record<string, any>;\n raw: string;\n }[] = [];\n tree.iterate({\n enter(node) {\n if (node.name === 'Element' && node.matchContext(['Document'])) {\n const data = extractElementData(node.node, text);\n if (data) {\n tags.push({\n from: node.from,\n to: node.to,\n raw: text.slice(node.from, node.to),\n ...data,\n });\n }\n }\n },\n });\n\n let pos = 0;\n const elements: EditorNode[] = [];\n for (const tag of tags) {\n const { from, to, tagName, attributes, raw } = tag;\n const { cmid, ...restAttributes } = attributes ?? {};\n\n // overlap, skip this element\n if (from < pos) {\n continue;\n }\n\n if (from > pos) {\n elements.push({\n type: 'text',\n value: text.slice(pos, from),\n });\n }\n\n elements.push({\n type: 'element',\n tagName,\n attributes: restAttributes,\n raw,\n });\n\n pos = to;\n }\n\n if (pos < text.length) {\n elements.push({\n type: 'text',\n value: text.slice(pos),\n });\n }\n\n return elements;\n },\n fromJSON(elements: EditorNode[]): string {\n return elements\n .map(el => {\n if (el.type === 'element') {\n return toElementString(el);\n } else if (el.type === 'text') {\n return el.value;\n }\n return '';\n })\n .join('');\n },\n};\n\nfunction toElementString(element: Omit<EditorElement, 'type'>) {\n const attrsString = attributesToString(element.attributes);\n return `<${element.tagName}${attrsString ? ` ${attrsString}` : ''}></${element.tagName}>`;\n}\n\nconst INTERNAL_ID = 'cmid';\n\nfunction uniqueId() {\n return `e${Math.random()}`;\n}\n\nfunction attributesToString(attributes: EditorElement['attributes']) {\n const array: string[] = [];\n let hasId = false;\n\n Object.keys(attributes).forEach(key => {\n if (key === INTERNAL_ID) {\n hasId = true;\n }\n const value = attributes[key];\n if (value === true) {\n array.push(key);\n } else {\n array.push(`${key}=${JSON.stringify(encodeURIComponent(value))}`);\n }\n });\n\n if (!hasId) {\n array.unshift(`${INTERNAL_ID}=\"${uniqueId()}\"`);\n }\n\n return array.join(' ');\n}\n\nexport { schemaUtils, toElementString, INTERNAL_ID };\nexport type { EditorNode, EditorElement, EditorText };\n","import { api, extension, option } from '@coze-editor/core';\nimport { EditorView } from '@codemirror/view';\nimport { EditorSelection, StateEffect, StateField } from '@codemirror/state';\n\nimport { type EditorElement, toElementString } from './schema';\nimport {\n chatExtension,\n type ElementsDefinition,\n elementsFacet,\n} from './extension';\n\nconst focusedEffect = StateEffect.define();\n\nconst focusedField = StateField.define<boolean>({\n create() {\n return false;\n },\n update(value, tr) {\n for (const effect of tr.effects) {\n if (effect.is(focusedEffect)) {\n return true;\n }\n }\n\n return value;\n },\n});\n\nfunction insertElement({ view }: { view: EditorView }) {\n return (element: Omit<EditorElement, 'type'>) => {\n let selection = view.state.selection.main;\n\n const hasFocused = view.state.field(focusedField, false);\n if (hasFocused === false) {\n selection = EditorSelection.cursor(view.state.doc.length);\n }\n\n const insert = toElementString(element);\n view.dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert,\n },\n selection: EditorSelection.cursor(selection.from + insert.length),\n });\n };\n}\n\nconst plugins = [\n extension([\n focusedField,\n EditorView.domEventObservers({\n click(e, view) {\n view.dispatch({\n effects: focusedEffect.of(null),\n });\n },\n }),\n chatExtension(),\n ]),\n api('insertElement', insertElement),\n option('elements', (elements: ElementsDefinition) =>\n elementsFacet.of(elements),\n ),\n];\n\nexport default plugins;\n","import { createPortal, flushSync } from 'react-dom';\nimport { createElement, type ReactNode } from 'react';\n\nimport { createRoot, type Root } from 'react-dom/client';\nimport { type SyntaxNode } from '@lezer/common';\nimport { FacetCombineStrategy } from '@coze-editor/utils';\nimport { connector } from '@coze-editor/react';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n WidgetType,\n} from '@codemirror/view';\nimport {\n EditorSelection,\n type EditorState,\n Facet,\n RangeSetBuilder,\n StateField,\n} from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nimport { extractElementData } from './utils';\nimport {\n type EditorElement,\n type EditorNode,\n INTERNAL_ID,\n schemaUtils,\n} from './schema';\nimport { ElementProvider } from './context';\n\ninterface ElementDefinition<Attrs = any> {\n render: (props: Attrs) => ReactNode;\n toString?: (element: EditorElement<Attrs>) => string;\n}\n\ninterface ElementsDefinition {\n [key: string]: ElementDefinition;\n}\n\nclass ElementWidget extends WidgetType {\n public $$type = 'element';\n private root: Root;\n private element: HTMLElement;\n private view: EditorView | null = null;\n constructor(\n public definition: ElementDefinition,\n public id: string,\n public props: any,\n ) {\n super();\n\n const element = document.createElement('span');\n this.element = element;\n this.root = createRoot(element);\n }\n\n get elementId() {\n return `element-${this.id}`;\n }\n\n toDOM(view: EditorView) {\n this.view = view;\n\n const c = view.state.facet(connector);\n queueMicrotask(() => {\n flushSync(() => {\n const jsxElement = createElement(ElementProvider, {\n internalId: this.id,\n children: createElement(this.definition.render, this.props),\n });\n c.connect(this.elementId, createPortal(jsxElement, this.element));\n });\n });\n return this.element;\n }\n\n eq(other: ElementWidget) {\n return (\n this.id === other.id &&\n this.props &&\n other.props &&\n JSON.stringify(this.props) === JSON.stringify(other.props)\n );\n }\n\n destroy(): void {\n if (this.view) {\n const c = this.view.state.facet(connector);\n c.disconnect(this.elementId);\n }\n }\n\n ignoreEvent(event: Event): boolean {\n return false;\n }\n}\n\n// function isElementWidget(widget: WidgetType | null) {\n// return (widget as any)?.$$type === 'element';\n// }\n\nconst elementsFacet = Facet.define<\n ElementsDefinition | undefined,\n ElementsDefinition | undefined\n>({\n combine: FacetCombineStrategy.Last,\n});\n\nconst field = StateField.define({\n create(state) {\n return build(state);\n },\n update(value, tr) {\n if (tr.docChanged) {\n return build(tr.state);\n }\n return value;\n },\n provide(f) {\n return [\n EditorView.decorations.of(view => view.state.field(f)),\n EditorView.atomicRanges.of(view => view.state.field(f)),\n ];\n },\n});\n\nfunction build(state: EditorState): DecorationSet {\n const allElements = state.facet(elementsFacet);\n\n if (!allElements) {\n return Decoration.none;\n }\n\n const tree = syntaxTree(state);\n const builder = new RangeSetBuilder<Decoration>();\n tree.iterate({\n enter(node) {\n const data = extract(node.node, state);\n if (data) {\n const definition = allElements[data.tagName];\n if (definition) {\n builder.add(\n node.from,\n node.to,\n Decoration.replace({\n widget: new ElementWidget(\n definition,\n data.internalId,\n data.props,\n ),\n }),\n );\n }\n }\n\n if (node.matchContext(['Document'])) {\n return false;\n }\n\n return true;\n },\n });\n\n const decorations = builder.finish();\n\n return decorations;\n}\n\nfunction extract(node: SyntaxNode, state: EditorState) {\n if (node.name === 'Element') {\n const elementData = extractElementData(node.node, state.doc.toString());\n\n if (elementData) {\n const { tagName, attributes } = elementData;\n const { [INTERNAL_ID]: internalId, ...props } = attributes ?? {};\n\n return {\n tagName,\n internalId,\n props,\n };\n }\n }\n}\n\nconst CUSTOM_CLIPBOARD_MIMETYPE = 'application/x-with-elements';\n\nconst copyPasteHandler = EditorView.domEventHandlers({\n paste(event, view) {\n try {\n const xText = event.clipboardData?.getData(CUSTOM_CLIPBOARD_MIMETYPE);\n const plainText = event.clipboardData?.getData('text/plain');\n\n const text = xText ?? plainText ?? '';\n\n const nodes = schemaUtils.toJSON(text);\n const newText = schemaUtils.fromJSON(\n nodes\n .map(node => {\n if (node.type === 'text') {\n return node;\n }\n\n if (node.type === 'element') {\n return {\n ...node,\n attributes: {\n ...(node.attributes ?? {}),\n cmid: `e${Math.random()}`,\n },\n } satisfies EditorElement;\n }\n })\n .filter(v => isEditorNode(v)),\n );\n\n view.dispatch({\n changes: {\n from: view.state.selection.main.from,\n to: view.state.selection.main.to,\n insert: newText,\n },\n selection: EditorSelection.cursor(\n view.state.selection.main.from + newText.length,\n ),\n });\n return true;\n } catch (e) {\n return false;\n }\n },\n copy(event, view) {\n const definitions = view.state.facet(elementsFacet);\n\n if (!definitions) {\n return false;\n }\n\n try {\n const { from, to } = view.state.selection.main;\n const slice = view.state.doc.sliceString(from, to);\n const nodes = schemaUtils.toJSON(slice);\n\n const plainText = nodes\n .map(node => {\n if (node.type === 'text') {\n return node.value;\n }\n\n if (node.type === 'element') {\n const definition = definitions[node.tagName];\n const toString = definition?.toString;\n\n if (!definition) {\n return node.raw ?? '';\n }\n\n if (\n Object.prototype.hasOwnProperty.call(definition, 'toString') &&\n typeof toString === 'function'\n ) {\n return toString(node);\n }\n\n return `[${node.tagName}]`;\n }\n\n return '';\n })\n .join('');\n\n event.clipboardData?.setData('text/plain', plainText);\n event.clipboardData?.setData(CUSTOM_CLIPBOARD_MIMETYPE, slice);\n\n return true;\n } catch (e) {\n return false;\n }\n },\n});\n\nfunction isEditorNode(v: unknown): v is EditorNode {\n return Boolean(v);\n}\n\nfunction chatExtension() {\n return [\n field,\n copyPasteHandler,\n // selectionEnlarger.of(state => {\n // const decorations = state.field(field);\n // const cursor = decorations.iter();\n // const array = [];\n\n // while (cursor.value) {\n // const widget = cursor.value.spec?.widget;\n // const { from, to } = cursor;\n // if (isElementWidget(widget)) {\n // array.push({\n // source: { from, to },\n // target: { from, to },\n // });\n // }\n\n // cursor.next();\n // }\n\n // return array;\n // }),\n ];\n}\n\nexport { field, chatExtension, elementsFacet, CUSTOM_CLIPBOARD_MIMETYPE };\n\nexport type { ElementsDefinition, ElementDefinition };\n","import React, { createContext, type ReactNode, useContext } from 'react';\n\nconst Context = createContext('');\n\nfunction ElementProvider({\n internalId,\n children,\n}: {\n internalId: string;\n children: ReactNode;\n}) {\n return <Context.Provider value={internalId}>{children}</Context.Provider>;\n}\n\nfunction useElementId() {\n const id = useContext(Context);\n return id;\n}\n\nexport { ElementProvider, useElementId };\n","import { useLayoutEffect, useRef, useState } from 'react';\n\nimport {\n type BuiltinEditorAPI,\n useEditor,\n useInjector,\n} from '@coze-editor/react';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { EditorSelection, type EditorState } from '@codemirror/state';\n\nimport { field } from './extension';\nimport { useElementId } from './context';\n\nfunction useCurrentElement() {\n const editor = useEditor<BuiltinEditorAPI | null>();\n const elementId = useElementId();\n const injector = useInjector();\n const [isSelected, setIsSelected] = useState(false);\n const elementIdRef = useRef(elementId);\n\n elementIdRef.current = elementId;\n\n function select() {\n if (!editor) {\n return;\n }\n\n const view = editor.$view;\n\n const decorations = view.state.field(field);\n\n const cursor = decorations.iter();\n while (cursor.value) {\n const { spec } = cursor.value;\n if (spec?.widget?.id === elementId) {\n view.dispatch({\n selection: EditorSelection.range(cursor.from, cursor.to),\n });\n break;\n }\n cursor.next();\n }\n }\n\n function remove() {\n if (!editor) {\n return;\n }\n\n const view = editor.$view;\n\n if (view.state.readOnly) {\n return;\n }\n\n const range = findElement(view.state, elementId);\n if (range) {\n view.dispatch({\n changes: {\n from: range.from,\n to: range.to,\n insert: '',\n },\n selection: EditorSelection.cursor(range.from),\n });\n }\n }\n\n useLayoutEffect(() => {\n function selectionContainsCurrentElement(state: EditorState) {\n const range = findElement(state, elementId);\n const { ranges } = state.selection;\n if (!range) {\n return false;\n }\n\n for (const r of ranges) {\n if (r.from <= range.from && r.to >= range.to) {\n return true;\n }\n }\n\n return false;\n }\n\n const plugin = ViewPlugin.fromClass(\n class {\n constructor(view: EditorView) {\n const contains = selectionContainsCurrentElement(view.state);\n setIsSelected(contains);\n }\n\n update(update: ViewUpdate) {\n if (update.selectionSet) {\n const contains = selectionContainsCurrentElement(update.state);\n setIsSelected(contains);\n }\n }\n },\n );\n\n return injector.inject([plugin]);\n }, [injector]);\n\n return {\n isSelected,\n select,\n remove,\n };\n}\n\nfunction findElement(state: EditorState, elementId: string) {\n const decorations = state.field(field);\n\n const cursor = decorations.iter();\n while (cursor.value) {\n const { spec } = cursor.value;\n if (spec?.widget?.id === elementId) {\n return {\n from: cursor.from,\n to: cursor.to,\n };\n }\n cursor.next();\n }\n}\n\nexport { useCurrentElement };\n"],"mappings":"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","names":["extension","EditorView","EditorView","EditorSelection","StateField","StateField","EditorSelection","EditorView","EditorSelection","EditorSelection","extension","EditorView"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/utils.ts","../../src/language.ts","../../src/schema.ts","../../src/plugins.ts","../../src/extension.ts","../../src/context.tsx","../../src/hooks.tsx"],"sourcesContent":["import universalPreset from '@coze-editor/preset-universal';\nimport { extension, type InferEditorAPIFromPlugins } from '@coze-editor/core';\nimport { EditorView, keymap } from '@codemirror/view';\nimport { defaultKeymap, historyKeymap, history } from '@codemirror/commands';\n\nimport {\n type EditorNode,\n type EditorElement,\n type EditorText,\n schemaUtils,\n} from './schema';\nimport plugins from './plugins';\nimport { htmlLanguage } from './language';\nimport { useCurrentElement } from './hooks';\nimport { CUSTOM_CLIPBOARD_MIMETYPE, type ElementDefinition } from './extension';\n\nconst preset = [\n ...universalPreset,\n extension([\n EditorView.theme({\n '&.cm-focused': {\n outline: 'none',\n },\n }),\n htmlLanguage,\n history(),\n keymap.of([...defaultKeymap, ...historyKeymap]),\n ]),\n ...plugins,\n];\n\ntype EditorAPI = InferEditorAPIFromPlugins<typeof preset>;\n\nexport default preset;\n\nexport { schemaUtils, useCurrentElement, CUSTOM_CLIPBOARD_MIMETYPE };\n\nexport type {\n EditorAPI,\n ElementDefinition,\n EditorNode,\n EditorElement,\n EditorText,\n};\n","/* eslint-disable complexity */\n\nimport { type SyntaxNode } from '@lezer/common';\n\nfunction extractElementData(node: SyntaxNode, text: string) {\n const openTag = node.firstChild;\n\n let tagName: string | null = null;\n const attributes: Record<string, any> = {};\n\n if (openTag && openTag.name === 'OpenTag' && openTag.firstChild) {\n let sibling = openTag.firstChild.nextSibling;\n while (true) {\n if (!sibling) {\n break;\n }\n\n if (sibling.name === 'TagName') {\n const { from, to } = sibling;\n tagName = text.slice(from, to);\n } else if (sibling.name === 'Attribute') {\n const nameNode = sibling.firstChild;\n const isNode = nameNode?.nextSibling;\n const valueNode = isNode?.nextSibling;\n if (\n nameNode?.name === 'AttributeName' &&\n isNode?.name === 'Is' &&\n (valueNode?.name === 'AttributeValue' ||\n valueNode?.name === 'UnquotedAttributeValue')\n ) {\n const name = text.slice(nameNode.from, nameNode.to);\n const fullValue = text.slice(valueNode.from, valueNode.to);\n\n let value = fullValue;\n if (valueNode.name === 'AttributeValue') {\n value = fullValue.slice(1, -1);\n }\n\n try {\n attributes[name] = JSON.parse(decodeURIComponent(value));\n } catch (e) {\n /* empty */\n }\n } else if (\n nameNode?.name === 'AttributeName' &&\n !isNode &&\n !valueNode\n ) {\n const name = text.slice(nameNode.from, nameNode.to);\n attributes[name] = true;\n }\n }\n\n sibling = sibling.nextSibling;\n }\n }\n\n if (tagName) {\n return {\n tagName,\n attributes,\n };\n }\n}\n\nexport { extractElementData };\n","import { parser } from '@lezer/html';\nimport { LRLanguage } from '@codemirror/language';\n\nconst htmlParser = parser.configure({\n dialect: 'noMatch',\n});\n\nfunction parse(text: string) {\n return htmlParser.parse(text);\n}\n\nconst htmlLanguage = LRLanguage.define({\n parser: htmlParser,\n});\n\nexport { parse, htmlLanguage };\n","import { extractElementData } from './utils';\nimport { parse } from './language';\n\ninterface EditorElement<Attrs = Record<string, any>> {\n type: 'element';\n tagName: string;\n attributes: Attrs;\n raw?: string;\n}\n\ninterface EditorText {\n type: 'text';\n value: string;\n}\n\ntype EditorNode = EditorElement | EditorText;\n\nfunction isElementRegistered(\n tagName: string,\n validTagNames: string[] | undefined,\n) {\n if (!Array.isArray(validTagNames)) {\n return false;\n }\n\n if (validTagNames.includes(tagName)) {\n return true;\n }\n\n return false;\n}\n\nconst schemaUtils = {\n toJSON(text: string, options?: { validTagNames?: string[] }): EditorNode[] {\n if (text === '') {\n return [];\n }\n\n const tree = parse(text);\n const tags: {\n from: number;\n to: number;\n tagName: string;\n attributes: Record<string, any>;\n raw: string;\n }[] = [];\n tree.iterate({\n enter(node) {\n if (node.name === 'Element') {\n const data = extractElementData(node.node, text);\n if (\n data &&\n isElementRegistered(data.tagName, options?.validTagNames)\n ) {\n tags.push({\n from: node.from,\n to: node.to,\n raw: text.slice(node.from, node.to),\n ...data,\n });\n }\n }\n },\n });\n\n let pos = 0;\n const elements: EditorNode[] = [];\n for (const tag of tags) {\n const { from, to, tagName, attributes, raw } = tag;\n const { cmid, ...restAttributes } = attributes ?? {};\n\n // overlap, skip this element\n if (from < pos) {\n continue;\n }\n\n if (from > pos) {\n elements.push({\n type: 'text',\n value: text.slice(pos, from),\n });\n }\n\n elements.push({\n type: 'element',\n tagName,\n attributes: restAttributes,\n raw,\n });\n\n pos = to;\n }\n\n if (pos < text.length) {\n elements.push({\n type: 'text',\n value: text.slice(pos),\n });\n }\n\n return elements;\n },\n fromJSON(elements: EditorNode[]): string {\n return elements\n .map(el => {\n if (el.type === 'element') {\n return toElementString(el);\n } else if (el.type === 'text') {\n return el.value;\n }\n return '';\n })\n .join('');\n },\n};\n\nfunction toElementString(element: Omit<EditorElement, 'type'>) {\n const attrsString = attributesToString(element.attributes);\n return `<${element.tagName}${attrsString ? ` ${attrsString}` : ''}></${element.tagName}>`;\n}\n\nconst INTERNAL_ID = 'cmid';\n\nfunction uniqueId() {\n return `e${Math.random()}`;\n}\n\nfunction attributesToString(attributes: EditorElement['attributes']) {\n const array: string[] = [];\n let hasId = false;\n\n Object.keys(attributes).forEach(key => {\n if (key === INTERNAL_ID) {\n hasId = true;\n }\n const value = attributes[key];\n if (value === true) {\n array.push(key);\n } else if (typeof value !== 'undefined') {\n array.push(`${key}=\"${encodeURIComponent(JSON.stringify(value))}\"`);\n }\n });\n\n if (!hasId) {\n array.unshift(\n `${INTERNAL_ID}=\"${encodeURIComponent(JSON.stringify(uniqueId()))}\"`,\n );\n }\n\n return array.join(' ');\n}\n\nexport { schemaUtils, toElementString, INTERNAL_ID };\nexport type { EditorNode, EditorElement, EditorText };\n","import { api, extension, option } from '@coze-editor/core';\nimport { EditorView } from '@codemirror/view';\nimport { EditorSelection, StateEffect, StateField } from '@codemirror/state';\n\nimport { type EditorElement, toElementString } from './schema';\nimport {\n chatExtension,\n type ElementsDefinition,\n elementsFacet,\n} from './extension';\n\nconst focusedEffect = StateEffect.define();\n\nconst focusedField = StateField.define<boolean>({\n create() {\n return false;\n },\n update(value, tr) {\n for (const effect of tr.effects) {\n if (effect.is(focusedEffect)) {\n return true;\n }\n }\n\n return value;\n },\n});\n\nfunction insertElement({ view }: { view: EditorView }) {\n return (element: Omit<EditorElement, 'type'>) => {\n let selection = view.state.selection.main;\n\n const hasFocused = view.state.field(focusedField, false);\n if (hasFocused === false) {\n selection = EditorSelection.cursor(view.state.doc.length);\n }\n\n const insert = toElementString(element);\n view.dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert,\n },\n selection: EditorSelection.cursor(selection.from + insert.length),\n });\n };\n}\n\nconst plugins = [\n extension([\n focusedField,\n EditorView.domEventObservers({\n click(e, view) {\n view.dispatch({\n effects: focusedEffect.of(null),\n });\n },\n }),\n chatExtension(),\n ]),\n api('insertElement', insertElement),\n option('elements', (elements: ElementsDefinition) =>\n elementsFacet.of(elements),\n ),\n];\n\nexport default plugins;\n","import { createPortal, flushSync } from 'react-dom';\nimport { createElement, type ReactNode } from 'react';\n\nimport { createRoot, type Root } from 'react-dom/client';\nimport { type SyntaxNode } from '@lezer/common';\nimport { FacetCombineStrategy } from '@coze-editor/utils';\nimport { connector } from '@coze-editor/react';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n WidgetType,\n} from '@codemirror/view';\nimport {\n EditorSelection,\n type EditorState,\n Facet,\n RangeSetBuilder,\n StateField,\n} from '@codemirror/state';\nimport { ensureSyntaxTree, syntaxTree } from '@codemirror/language';\n\nimport { extractElementData } from './utils';\nimport {\n type EditorElement,\n type EditorNode,\n INTERNAL_ID,\n schemaUtils,\n} from './schema';\nimport { ElementProvider } from './context';\n\ninterface ElementDefinition<Attrs = any> {\n render: (props: Attrs) => ReactNode;\n toString?: (element: EditorElement<Attrs>) => string;\n}\n\ninterface ElementsDefinition {\n [key: string]: ElementDefinition;\n}\n\nclass ElementWidget extends WidgetType {\n public $$type = 'element';\n private root: Root;\n private element: HTMLElement;\n private view: EditorView | null = null;\n constructor(\n public definition: ElementDefinition,\n public id: string,\n public props: any,\n ) {\n super();\n\n const element = document.createElement('span');\n this.element = element;\n this.root = createRoot(element);\n }\n\n get elementId() {\n return `element-${this.id}`;\n }\n\n toDOM(view: EditorView) {\n this.view = view;\n\n const c = view.state.facet(connector);\n queueMicrotask(() => {\n flushSync(() => {\n const jsxElement = createElement(ElementProvider, {\n internalId: this.id,\n children: createElement(this.definition.render, this.props),\n });\n c.connect(this.elementId, createPortal(jsxElement, this.element));\n });\n });\n return this.element;\n }\n\n eq(other: ElementWidget) {\n return (\n this.id === other.id &&\n this.props &&\n other.props &&\n JSON.stringify(this.props) === JSON.stringify(other.props)\n );\n }\n\n destroy(): void {\n if (this.view) {\n const c = this.view.state.facet(connector);\n c.disconnect(this.elementId);\n }\n }\n\n ignoreEvent(event: Event): boolean {\n return false;\n }\n}\n\n// function isElementWidget(widget: WidgetType | null) {\n// return (widget as any)?.$$type === 'element';\n// }\n\nconst elementsFacet = Facet.define<\n ElementsDefinition | undefined,\n ElementsDefinition | undefined\n>({\n combine: FacetCombineStrategy.Last,\n});\n\nconst field = StateField.define({\n create(state) {\n return build(state);\n },\n update(value, tr) {\n if (tr.docChanged) {\n return build(tr.state);\n }\n return value;\n },\n provide(f) {\n return [\n EditorView.decorations.of(view => view.state.field(f)),\n EditorView.atomicRanges.of(view => view.state.field(f)),\n ];\n },\n});\n\nfunction build(state: EditorState): DecorationSet {\n const allElements = state.facet(elementsFacet);\n\n if (!allElements) {\n return Decoration.none;\n }\n\n const tree = ensureSyntaxTree(state, state.doc.length) ?? syntaxTree(state);\n const builder = new RangeSetBuilder<Decoration>();\n tree.iterate({\n enter(node) {\n const data = extract(node.node, state);\n if (data) {\n const definition = allElements[data.tagName];\n if (definition) {\n builder.add(\n node.from,\n node.to,\n Decoration.replace({\n widget: new ElementWidget(\n definition,\n data.internalId,\n data.props,\n ),\n }),\n );\n }\n }\n\n // if (node.matchContext(['Document'])) {\n // return false;\n // }\n\n return true;\n },\n });\n\n const decorations = builder.finish();\n\n return decorations;\n}\n\nfunction extract(node: SyntaxNode, state: EditorState) {\n if (node.name === 'Element') {\n const elementData = extractElementData(node.node, state.doc.toString());\n\n if (elementData) {\n const { tagName, attributes } = elementData;\n const { [INTERNAL_ID]: internalId, ...props } = attributes ?? {};\n\n return {\n tagName,\n internalId,\n props,\n };\n }\n }\n}\n\nconst CUSTOM_CLIPBOARD_MIMETYPE = 'application/x-with-elements';\n\nconst copyPasteHandler = EditorView.domEventHandlers({\n paste(event, view) {\n try {\n const definitions = view.state.facet(elementsFacet);\n const xText = event.clipboardData?.getData(CUSTOM_CLIPBOARD_MIMETYPE);\n const plainText = event.clipboardData?.getData('text/plain');\n\n const text = xText || plainText || '';\n\n const nodes = schemaUtils.toJSON(text, {\n validTagNames: definitions ? Object.keys(definitions) : undefined,\n });\n const newText = schemaUtils.fromJSON(\n nodes\n .map(node => {\n if (node.type === 'text') {\n return node;\n }\n\n if (node.type === 'element') {\n return {\n ...node,\n attributes: {\n ...(node.attributes ?? {}),\n cmid: `e${Math.random()}`,\n },\n } satisfies EditorElement;\n }\n })\n .filter(v => isEditorNode(v)),\n );\n\n view.dispatch({\n changes: {\n from: view.state.selection.main.from,\n to: view.state.selection.main.to,\n insert: newText,\n },\n selection: EditorSelection.cursor(\n view.state.selection.main.from + newText.length,\n ),\n });\n return true;\n } catch (e) {\n return false;\n }\n },\n copy(event, view) {\n const definitions = view.state.facet(elementsFacet);\n\n if (!definitions) {\n return false;\n }\n\n try {\n const { from, to } = view.state.selection.main;\n const slice = view.state.doc.sliceString(from, to);\n const nodes = schemaUtils.toJSON(slice, {\n validTagNames: definitions ? Object.keys(definitions) : undefined,\n });\n\n const plainText = nodes\n .map(node => {\n if (node.type === 'text') {\n return node.value;\n }\n\n if (node.type === 'element') {\n const definition = definitions[node.tagName];\n const toString = definition?.toString;\n\n if (!definition) {\n return node.raw ?? '';\n }\n\n if (\n Object.prototype.hasOwnProperty.call(definition, 'toString') &&\n typeof toString === 'function'\n ) {\n return toString(node);\n }\n\n return `[${node.tagName}]`;\n }\n\n return '';\n })\n .join('');\n\n event.clipboardData?.setData('text/plain', plainText);\n event.clipboardData?.setData(CUSTOM_CLIPBOARD_MIMETYPE, slice);\n\n return true;\n } catch (e) {\n return false;\n }\n },\n});\n\nfunction isEditorNode(v: unknown): v is EditorNode {\n return Boolean(v);\n}\n\nfunction chatExtension() {\n return [\n field,\n copyPasteHandler,\n // selectionEnlarger.of(state => {\n // const decorations = state.field(field);\n // const cursor = decorations.iter();\n // const array = [];\n\n // while (cursor.value) {\n // const widget = cursor.value.spec?.widget;\n // const { from, to } = cursor;\n // if (isElementWidget(widget)) {\n // array.push({\n // source: { from, to },\n // target: { from, to },\n // });\n // }\n\n // cursor.next();\n // }\n\n // return array;\n // }),\n ];\n}\n\nexport { field, chatExtension, elementsFacet, CUSTOM_CLIPBOARD_MIMETYPE };\n\nexport type { ElementsDefinition, ElementDefinition };\n","import React, { createContext, type ReactNode, useContext } from 'react';\n\nconst Context = createContext('');\n\nfunction ElementProvider({\n internalId,\n children,\n}: {\n internalId: string;\n children: ReactNode;\n}) {\n return <Context.Provider value={internalId}>{children}</Context.Provider>;\n}\n\nfunction useElementId() {\n const id = useContext(Context);\n return id;\n}\n\nexport { ElementProvider, useElementId };\n","import { useLayoutEffect, useRef, useState } from 'react';\n\nimport {\n type BuiltinEditorAPI,\n useEditor,\n useInjector,\n} from '@coze-editor/react';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { EditorSelection, type EditorState } from '@codemirror/state';\n\nimport { field } from './extension';\nimport { useElementId } from './context';\n\nfunction useCurrentElement() {\n const editor = useEditor<BuiltinEditorAPI | null>();\n const elementId = useElementId();\n const injector = useInjector();\n const [isSelected, setIsSelected] = useState(false);\n const elementIdRef = useRef(elementId);\n\n elementIdRef.current = elementId;\n\n function select() {\n if (!editor) {\n return;\n }\n\n const view = editor.$view;\n\n const decorations = view.state.field(field);\n\n const cursor = decorations.iter();\n while (cursor.value) {\n const { spec } = cursor.value;\n if (spec?.widget?.id === elementId) {\n view.dispatch({\n selection: EditorSelection.range(cursor.from, cursor.to),\n });\n break;\n }\n cursor.next();\n }\n }\n\n function remove() {\n if (!editor) {\n return;\n }\n\n const view = editor.$view;\n\n if (view.state.readOnly) {\n return;\n }\n\n const range = findElement(view.state, elementId);\n if (range) {\n view.dispatch({\n changes: {\n from: range.from,\n to: range.to,\n insert: '',\n },\n selection: EditorSelection.cursor(range.from),\n });\n }\n }\n\n useLayoutEffect(() => {\n function selectionContainsCurrentElement(state: EditorState) {\n const range = findElement(state, elementId);\n const { ranges } = state.selection;\n if (!range) {\n return false;\n }\n\n for (const r of ranges) {\n if (r.from <= range.from && r.to >= range.to) {\n return true;\n }\n }\n\n return false;\n }\n\n const plugin = ViewPlugin.fromClass(\n class {\n constructor(view: EditorView) {\n const contains = selectionContainsCurrentElement(view.state);\n setIsSelected(contains);\n }\n\n update(update: ViewUpdate) {\n if (update.selectionSet) {\n const contains = selectionContainsCurrentElement(update.state);\n setIsSelected(contains);\n }\n }\n },\n );\n\n return injector.inject([plugin]);\n }, [injector]);\n\n return {\n isSelected,\n select,\n remove,\n };\n}\n\nfunction findElement(state: EditorState, elementId: string) {\n const decorations = state.field(field);\n\n const cursor = decorations.iter();\n while (cursor.value) {\n const { spec } = cursor.value;\n if (spec?.widget?.id === elementId) {\n return {\n from: cursor.from,\n to: cursor.to,\n };\n }\n cursor.next();\n }\n}\n\nexport { useCurrentElement };\n"],"mappings":"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","names":["extension","EditorView","EditorView","EditorSelection","StateField","StateField","EditorSelection","EditorView","EditorSelection","EditorSelection","extension","EditorView"]}
package/dist/index.d.mts CHANGED
@@ -16,7 +16,9 @@ interface EditorText {
16
16
  }
17
17
  type EditorNode = EditorElement | EditorText;
18
18
  declare const schemaUtils: {
19
- toJSON(text: string): EditorNode[];
19
+ toJSON(text: string, options?: {
20
+ validTagNames?: string[];
21
+ }): EditorNode[];
20
22
  fromJSON(elements: EditorNode[]): string;
21
23
  };
22
24
 
package/dist/index.d.ts CHANGED
@@ -16,7 +16,9 @@ interface EditorText {
16
16
  }
17
17
  type EditorNode = EditorElement | EditorText;
18
18
  declare const schemaUtils: {
19
- toJSON(text: string): EditorNode[];
19
+ toJSON(text: string, options?: {
20
+ validTagNames?: string[];
21
+ }): EditorNode[];
20
22
  fromJSON(elements: EditorNode[]): string;
21
23
  };
22
24
 
package/dist/index.js CHANGED
@@ -60,14 +60,14 @@ function extractElementData(node, text) {
60
60
  const valueNode = isNode == null ? void 0 : isNode.nextSibling;
61
61
  if ((nameNode == null ? void 0 : nameNode.name) === "AttributeName" && (isNode == null ? void 0 : isNode.name) === "Is" && ((valueNode == null ? void 0 : valueNode.name) === "AttributeValue" || (valueNode == null ? void 0 : valueNode.name) === "UnquotedAttributeValue")) {
62
62
  const name = text.slice(nameNode.from, nameNode.to);
63
- const value = text.slice(valueNode.from, valueNode.to);
63
+ const fullValue = text.slice(valueNode.from, valueNode.to);
64
+ let value = fullValue;
64
65
  if (valueNode.name === "AttributeValue") {
65
- attributes[name] = decodeURIComponent(value.slice(1, -1));
66
- } else {
67
- try {
68
- attributes[name] = JSON.parse(decodeURIComponent(value));
69
- } catch (e) {
70
- }
66
+ value = fullValue.slice(1, -1);
67
+ }
68
+ try {
69
+ attributes[name] = JSON.parse(decodeURIComponent(value));
70
+ } catch (e) {
71
71
  }
72
72
  } else if ((nameNode == null ? void 0 : nameNode.name) === "AttributeName" && !isNode && !valueNode) {
73
73
  const name = text.slice(nameNode.from, nameNode.to);
@@ -99,15 +99,27 @@ var htmlLanguage = import_language.LRLanguage.define({
99
99
  });
100
100
 
101
101
  // src/schema.ts
102
+ function isElementRegistered(tagName, validTagNames) {
103
+ if (!Array.isArray(validTagNames)) {
104
+ return false;
105
+ }
106
+ if (validTagNames.includes(tagName)) {
107
+ return true;
108
+ }
109
+ return false;
110
+ }
102
111
  var schemaUtils = {
103
- toJSON(text) {
112
+ toJSON(text, options) {
113
+ if (text === "") {
114
+ return [];
115
+ }
104
116
  const tree = parse(text);
105
117
  const tags = [];
106
118
  tree.iterate({
107
119
  enter(node) {
108
- if (node.name === "Element" && node.matchContext(["Document"])) {
120
+ if (node.name === "Element") {
109
121
  const data = extractElementData(node.node, text);
110
- if (data) {
122
+ if (data && isElementRegistered(data.tagName, options == null ? void 0 : options.validTagNames)) {
111
123
  tags.push({
112
124
  from: node.from,
113
125
  to: node.to,
@@ -177,12 +189,14 @@ function attributesToString(attributes) {
177
189
  const value = attributes[key];
178
190
  if (value === true) {
179
191
  array.push(key);
180
- } else {
181
- array.push(`${key}=${JSON.stringify(encodeURIComponent(value))}`);
192
+ } else if (typeof value !== "undefined") {
193
+ array.push(`${key}="${encodeURIComponent(JSON.stringify(value))}"`);
182
194
  }
183
195
  });
184
196
  if (!hasId) {
185
- array.unshift(`${INTERNAL_ID}="${uniqueId()}"`);
197
+ array.unshift(
198
+ `${INTERNAL_ID}="${encodeURIComponent(JSON.stringify(uniqueId()))}"`
199
+ );
186
200
  }
187
201
  return array.join(" ");
188
202
  }
@@ -286,7 +300,7 @@ function build(state) {
286
300
  if (!allElements) {
287
301
  return import_view.Decoration.none;
288
302
  }
289
- const tree = (0, import_language3.syntaxTree)(state);
303
+ const tree = (0, import_language3.ensureSyntaxTree)(state, state.doc.length) ?? (0, import_language3.syntaxTree)(state);
290
304
  const builder = new import_state.RangeSetBuilder();
291
305
  tree.iterate({
292
306
  enter(node) {
@@ -307,9 +321,6 @@ function build(state) {
307
321
  );
308
322
  }
309
323
  }
310
- if (node.matchContext(["Document"])) {
311
- return false;
312
- }
313
324
  return true;
314
325
  }
315
326
  });
@@ -335,10 +346,13 @@ var copyPasteHandler = import_view.EditorView.domEventHandlers({
335
346
  paste(event, view) {
336
347
  var _a, _b;
337
348
  try {
349
+ const definitions = view.state.facet(elementsFacet);
338
350
  const xText = (_a = event.clipboardData) == null ? void 0 : _a.getData(CUSTOM_CLIPBOARD_MIMETYPE);
339
351
  const plainText = (_b = event.clipboardData) == null ? void 0 : _b.getData("text/plain");
340
- const text = xText ?? plainText ?? "";
341
- const nodes = schemaUtils.toJSON(text);
352
+ const text = xText || plainText || "";
353
+ const nodes = schemaUtils.toJSON(text, {
354
+ validTagNames: definitions ? Object.keys(definitions) : void 0
355
+ });
342
356
  const newText = schemaUtils.fromJSON(
343
357
  nodes.map((node) => {
344
358
  if (node.type === "text") {
@@ -379,7 +393,9 @@ var copyPasteHandler = import_view.EditorView.domEventHandlers({
379
393
  try {
380
394
  const { from, to } = view.state.selection.main;
381
395
  const slice = view.state.doc.sliceString(from, to);
382
- const nodes = schemaUtils.toJSON(slice);
396
+ const nodes = schemaUtils.toJSON(slice, {
397
+ validTagNames: definitions ? Object.keys(definitions) : void 0
398
+ });
383
399
  const plainText = nodes.map((node) => {
384
400
  if (node.type === "text") {
385
401
  return node.value;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/language.ts","../src/schema.ts","../src/plugins.ts","../src/extension.ts","../src/context.tsx","../src/hooks.tsx"],"sourcesContent":["import universalPreset from '@coze-editor/preset-universal';\nimport { extension, type InferEditorAPIFromPlugins } from '@coze-editor/core';\nimport { EditorView, keymap } from '@codemirror/view';\nimport { defaultKeymap, historyKeymap, history } from '@codemirror/commands';\n\nimport {\n type EditorNode,\n type EditorElement,\n type EditorText,\n schemaUtils,\n} from './schema';\nimport plugins from './plugins';\nimport { htmlLanguage } from './language';\nimport { useCurrentElement } from './hooks';\nimport { CUSTOM_CLIPBOARD_MIMETYPE, type ElementDefinition } from './extension';\n\nconst preset = [\n ...universalPreset,\n extension([\n EditorView.theme({\n '&.cm-focused': {\n outline: 'none',\n },\n }),\n htmlLanguage,\n history(),\n keymap.of([...defaultKeymap, ...historyKeymap]),\n ]),\n ...plugins,\n];\n\ntype EditorAPI = InferEditorAPIFromPlugins<typeof preset>;\n\nexport default preset;\n\nexport { schemaUtils, useCurrentElement, CUSTOM_CLIPBOARD_MIMETYPE };\n\nexport type {\n EditorAPI,\n ElementDefinition,\n EditorNode,\n EditorElement,\n EditorText,\n};\n","/* eslint-disable complexity */\n\nimport { type SyntaxNode } from '@lezer/common';\n\nfunction extractElementData(node: SyntaxNode, text: string) {\n const openTag = node.firstChild;\n\n let tagName: string | null = null;\n const attributes: Record<string, any> = {};\n\n if (openTag && openTag.name === 'OpenTag' && openTag.firstChild) {\n let sibling = openTag.firstChild.nextSibling;\n while (true) {\n if (!sibling) {\n break;\n }\n\n if (sibling.name === 'TagName') {\n const { from, to } = sibling;\n tagName = text.slice(from, to);\n } else if (sibling.name === 'Attribute') {\n const nameNode = sibling.firstChild;\n const isNode = nameNode?.nextSibling;\n const valueNode = isNode?.nextSibling;\n if (\n nameNode?.name === 'AttributeName' &&\n isNode?.name === 'Is' &&\n (valueNode?.name === 'AttributeValue' ||\n valueNode?.name === 'UnquotedAttributeValue')\n ) {\n const name = text.slice(nameNode.from, nameNode.to);\n const value = text.slice(valueNode.from, valueNode.to);\n\n if (valueNode.name === 'AttributeValue') {\n attributes[name] = decodeURIComponent(value.slice(1, -1));\n } else {\n try {\n attributes[name] = JSON.parse(decodeURIComponent(value));\n } catch (e) {\n /* empty */\n }\n }\n } else if (\n nameNode?.name === 'AttributeName' &&\n !isNode &&\n !valueNode\n ) {\n const name = text.slice(nameNode.from, nameNode.to);\n attributes[name] = true;\n }\n }\n\n sibling = sibling.nextSibling;\n }\n }\n\n if (tagName) {\n return {\n tagName,\n attributes,\n };\n }\n}\n\nexport { extractElementData };\n","import { parser } from '@lezer/html';\nimport { LRLanguage } from '@codemirror/language';\n\nconst htmlParser = parser.configure({\n dialect: 'noMatch',\n});\n\nfunction parse(text: string) {\n return htmlParser.parse(text);\n}\n\nconst htmlLanguage = LRLanguage.define({\n parser: htmlParser,\n});\n\nexport { parse, htmlLanguage };\n","import { extractElementData } from './utils';\nimport { parse } from './language';\n\ninterface EditorElement<Attrs = Record<string, any>> {\n type: 'element';\n tagName: string;\n attributes: Attrs;\n raw?: string;\n}\n\ninterface EditorText {\n type: 'text';\n value: string;\n}\n\ntype EditorNode = EditorElement | EditorText;\n\nconst schemaUtils = {\n toJSON(text: string): EditorNode[] {\n const tree = parse(text);\n const tags: {\n from: number;\n to: number;\n tagName: string;\n attributes: Record<string, any>;\n raw: string;\n }[] = [];\n tree.iterate({\n enter(node) {\n if (node.name === 'Element' && node.matchContext(['Document'])) {\n const data = extractElementData(node.node, text);\n if (data) {\n tags.push({\n from: node.from,\n to: node.to,\n raw: text.slice(node.from, node.to),\n ...data,\n });\n }\n }\n },\n });\n\n let pos = 0;\n const elements: EditorNode[] = [];\n for (const tag of tags) {\n const { from, to, tagName, attributes, raw } = tag;\n const { cmid, ...restAttributes } = attributes ?? {};\n\n // overlap, skip this element\n if (from < pos) {\n continue;\n }\n\n if (from > pos) {\n elements.push({\n type: 'text',\n value: text.slice(pos, from),\n });\n }\n\n elements.push({\n type: 'element',\n tagName,\n attributes: restAttributes,\n raw,\n });\n\n pos = to;\n }\n\n if (pos < text.length) {\n elements.push({\n type: 'text',\n value: text.slice(pos),\n });\n }\n\n return elements;\n },\n fromJSON(elements: EditorNode[]): string {\n return elements\n .map(el => {\n if (el.type === 'element') {\n return toElementString(el);\n } else if (el.type === 'text') {\n return el.value;\n }\n return '';\n })\n .join('');\n },\n};\n\nfunction toElementString(element: Omit<EditorElement, 'type'>) {\n const attrsString = attributesToString(element.attributes);\n return `<${element.tagName}${attrsString ? ` ${attrsString}` : ''}></${element.tagName}>`;\n}\n\nconst INTERNAL_ID = 'cmid';\n\nfunction uniqueId() {\n return `e${Math.random()}`;\n}\n\nfunction attributesToString(attributes: EditorElement['attributes']) {\n const array: string[] = [];\n let hasId = false;\n\n Object.keys(attributes).forEach(key => {\n if (key === INTERNAL_ID) {\n hasId = true;\n }\n const value = attributes[key];\n if (value === true) {\n array.push(key);\n } else {\n array.push(`${key}=${JSON.stringify(encodeURIComponent(value))}`);\n }\n });\n\n if (!hasId) {\n array.unshift(`${INTERNAL_ID}=\"${uniqueId()}\"`);\n }\n\n return array.join(' ');\n}\n\nexport { schemaUtils, toElementString, INTERNAL_ID };\nexport type { EditorNode, EditorElement, EditorText };\n","import { api, extension, option } from '@coze-editor/core';\nimport { EditorView } from '@codemirror/view';\nimport { EditorSelection, StateEffect, StateField } from '@codemirror/state';\n\nimport { type EditorElement, toElementString } from './schema';\nimport {\n chatExtension,\n type ElementsDefinition,\n elementsFacet,\n} from './extension';\n\nconst focusedEffect = StateEffect.define();\n\nconst focusedField = StateField.define<boolean>({\n create() {\n return false;\n },\n update(value, tr) {\n for (const effect of tr.effects) {\n if (effect.is(focusedEffect)) {\n return true;\n }\n }\n\n return value;\n },\n});\n\nfunction insertElement({ view }: { view: EditorView }) {\n return (element: Omit<EditorElement, 'type'>) => {\n let selection = view.state.selection.main;\n\n const hasFocused = view.state.field(focusedField, false);\n if (hasFocused === false) {\n selection = EditorSelection.cursor(view.state.doc.length);\n }\n\n const insert = toElementString(element);\n view.dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert,\n },\n selection: EditorSelection.cursor(selection.from + insert.length),\n });\n };\n}\n\nconst plugins = [\n extension([\n focusedField,\n EditorView.domEventObservers({\n click(e, view) {\n view.dispatch({\n effects: focusedEffect.of(null),\n });\n },\n }),\n chatExtension(),\n ]),\n api('insertElement', insertElement),\n option('elements', (elements: ElementsDefinition) =>\n elementsFacet.of(elements),\n ),\n];\n\nexport default plugins;\n","import { createPortal, flushSync } from 'react-dom';\nimport { createElement, type ReactNode } from 'react';\n\nimport { createRoot, type Root } from 'react-dom/client';\nimport { type SyntaxNode } from '@lezer/common';\nimport { FacetCombineStrategy } from '@coze-editor/utils';\nimport { connector } from '@coze-editor/react';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n WidgetType,\n} from '@codemirror/view';\nimport {\n EditorSelection,\n type EditorState,\n Facet,\n RangeSetBuilder,\n StateField,\n} from '@codemirror/state';\nimport { syntaxTree } from '@codemirror/language';\n\nimport { extractElementData } from './utils';\nimport {\n type EditorElement,\n type EditorNode,\n INTERNAL_ID,\n schemaUtils,\n} from './schema';\nimport { ElementProvider } from './context';\n\ninterface ElementDefinition<Attrs = any> {\n render: (props: Attrs) => ReactNode;\n toString?: (element: EditorElement<Attrs>) => string;\n}\n\ninterface ElementsDefinition {\n [key: string]: ElementDefinition;\n}\n\nclass ElementWidget extends WidgetType {\n public $$type = 'element';\n private root: Root;\n private element: HTMLElement;\n private view: EditorView | null = null;\n constructor(\n public definition: ElementDefinition,\n public id: string,\n public props: any,\n ) {\n super();\n\n const element = document.createElement('span');\n this.element = element;\n this.root = createRoot(element);\n }\n\n get elementId() {\n return `element-${this.id}`;\n }\n\n toDOM(view: EditorView) {\n this.view = view;\n\n const c = view.state.facet(connector);\n queueMicrotask(() => {\n flushSync(() => {\n const jsxElement = createElement(ElementProvider, {\n internalId: this.id,\n children: createElement(this.definition.render, this.props),\n });\n c.connect(this.elementId, createPortal(jsxElement, this.element));\n });\n });\n return this.element;\n }\n\n eq(other: ElementWidget) {\n return (\n this.id === other.id &&\n this.props &&\n other.props &&\n JSON.stringify(this.props) === JSON.stringify(other.props)\n );\n }\n\n destroy(): void {\n if (this.view) {\n const c = this.view.state.facet(connector);\n c.disconnect(this.elementId);\n }\n }\n\n ignoreEvent(event: Event): boolean {\n return false;\n }\n}\n\n// function isElementWidget(widget: WidgetType | null) {\n// return (widget as any)?.$$type === 'element';\n// }\n\nconst elementsFacet = Facet.define<\n ElementsDefinition | undefined,\n ElementsDefinition | undefined\n>({\n combine: FacetCombineStrategy.Last,\n});\n\nconst field = StateField.define({\n create(state) {\n return build(state);\n },\n update(value, tr) {\n if (tr.docChanged) {\n return build(tr.state);\n }\n return value;\n },\n provide(f) {\n return [\n EditorView.decorations.of(view => view.state.field(f)),\n EditorView.atomicRanges.of(view => view.state.field(f)),\n ];\n },\n});\n\nfunction build(state: EditorState): DecorationSet {\n const allElements = state.facet(elementsFacet);\n\n if (!allElements) {\n return Decoration.none;\n }\n\n const tree = syntaxTree(state);\n const builder = new RangeSetBuilder<Decoration>();\n tree.iterate({\n enter(node) {\n const data = extract(node.node, state);\n if (data) {\n const definition = allElements[data.tagName];\n if (definition) {\n builder.add(\n node.from,\n node.to,\n Decoration.replace({\n widget: new ElementWidget(\n definition,\n data.internalId,\n data.props,\n ),\n }),\n );\n }\n }\n\n if (node.matchContext(['Document'])) {\n return false;\n }\n\n return true;\n },\n });\n\n const decorations = builder.finish();\n\n return decorations;\n}\n\nfunction extract(node: SyntaxNode, state: EditorState) {\n if (node.name === 'Element') {\n const elementData = extractElementData(node.node, state.doc.toString());\n\n if (elementData) {\n const { tagName, attributes } = elementData;\n const { [INTERNAL_ID]: internalId, ...props } = attributes ?? {};\n\n return {\n tagName,\n internalId,\n props,\n };\n }\n }\n}\n\nconst CUSTOM_CLIPBOARD_MIMETYPE = 'application/x-with-elements';\n\nconst copyPasteHandler = EditorView.domEventHandlers({\n paste(event, view) {\n try {\n const xText = event.clipboardData?.getData(CUSTOM_CLIPBOARD_MIMETYPE);\n const plainText = event.clipboardData?.getData('text/plain');\n\n const text = xText ?? plainText ?? '';\n\n const nodes = schemaUtils.toJSON(text);\n const newText = schemaUtils.fromJSON(\n nodes\n .map(node => {\n if (node.type === 'text') {\n return node;\n }\n\n if (node.type === 'element') {\n return {\n ...node,\n attributes: {\n ...(node.attributes ?? {}),\n cmid: `e${Math.random()}`,\n },\n } satisfies EditorElement;\n }\n })\n .filter(v => isEditorNode(v)),\n );\n\n view.dispatch({\n changes: {\n from: view.state.selection.main.from,\n to: view.state.selection.main.to,\n insert: newText,\n },\n selection: EditorSelection.cursor(\n view.state.selection.main.from + newText.length,\n ),\n });\n return true;\n } catch (e) {\n return false;\n }\n },\n copy(event, view) {\n const definitions = view.state.facet(elementsFacet);\n\n if (!definitions) {\n return false;\n }\n\n try {\n const { from, to } = view.state.selection.main;\n const slice = view.state.doc.sliceString(from, to);\n const nodes = schemaUtils.toJSON(slice);\n\n const plainText = nodes\n .map(node => {\n if (node.type === 'text') {\n return node.value;\n }\n\n if (node.type === 'element') {\n const definition = definitions[node.tagName];\n const toString = definition?.toString;\n\n if (!definition) {\n return node.raw ?? '';\n }\n\n if (\n Object.prototype.hasOwnProperty.call(definition, 'toString') &&\n typeof toString === 'function'\n ) {\n return toString(node);\n }\n\n return `[${node.tagName}]`;\n }\n\n return '';\n })\n .join('');\n\n event.clipboardData?.setData('text/plain', plainText);\n event.clipboardData?.setData(CUSTOM_CLIPBOARD_MIMETYPE, slice);\n\n return true;\n } catch (e) {\n return false;\n }\n },\n});\n\nfunction isEditorNode(v: unknown): v is EditorNode {\n return Boolean(v);\n}\n\nfunction chatExtension() {\n return [\n field,\n copyPasteHandler,\n // selectionEnlarger.of(state => {\n // const decorations = state.field(field);\n // const cursor = decorations.iter();\n // const array = [];\n\n // while (cursor.value) {\n // const widget = cursor.value.spec?.widget;\n // const { from, to } = cursor;\n // if (isElementWidget(widget)) {\n // array.push({\n // source: { from, to },\n // target: { from, to },\n // });\n // }\n\n // cursor.next();\n // }\n\n // return array;\n // }),\n ];\n}\n\nexport { field, chatExtension, elementsFacet, CUSTOM_CLIPBOARD_MIMETYPE };\n\nexport type { ElementsDefinition, ElementDefinition };\n","import React, { createContext, type ReactNode, useContext } from 'react';\n\nconst Context = createContext('');\n\nfunction ElementProvider({\n internalId,\n children,\n}: {\n internalId: string;\n children: ReactNode;\n}) {\n return <Context.Provider value={internalId}>{children}</Context.Provider>;\n}\n\nfunction useElementId() {\n const id = useContext(Context);\n return id;\n}\n\nexport { ElementProvider, useElementId };\n","import { useLayoutEffect, useRef, useState } from 'react';\n\nimport {\n type BuiltinEditorAPI,\n useEditor,\n useInjector,\n} from '@coze-editor/react';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { EditorSelection, type EditorState } from '@codemirror/state';\n\nimport { field } from './extension';\nimport { useElementId } from './context';\n\nfunction useCurrentElement() {\n const editor = useEditor<BuiltinEditorAPI | null>();\n const elementId = useElementId();\n const injector = useInjector();\n const [isSelected, setIsSelected] = useState(false);\n const elementIdRef = useRef(elementId);\n\n elementIdRef.current = elementId;\n\n function select() {\n if (!editor) {\n return;\n }\n\n const view = editor.$view;\n\n const decorations = view.state.field(field);\n\n const cursor = decorations.iter();\n while (cursor.value) {\n const { spec } = cursor.value;\n if (spec?.widget?.id === elementId) {\n view.dispatch({\n selection: EditorSelection.range(cursor.from, cursor.to),\n });\n break;\n }\n cursor.next();\n }\n }\n\n function remove() {\n if (!editor) {\n return;\n }\n\n const view = editor.$view;\n\n if (view.state.readOnly) {\n return;\n }\n\n const range = findElement(view.state, elementId);\n if (range) {\n view.dispatch({\n changes: {\n from: range.from,\n to: range.to,\n insert: '',\n },\n selection: EditorSelection.cursor(range.from),\n });\n }\n }\n\n useLayoutEffect(() => {\n function selectionContainsCurrentElement(state: EditorState) {\n const range = findElement(state, elementId);\n const { ranges } = state.selection;\n if (!range) {\n return false;\n }\n\n for (const r of ranges) {\n if (r.from <= range.from && r.to >= range.to) {\n return true;\n }\n }\n\n return false;\n }\n\n const plugin = ViewPlugin.fromClass(\n class {\n constructor(view: EditorView) {\n const contains = selectionContainsCurrentElement(view.state);\n setIsSelected(contains);\n }\n\n update(update: ViewUpdate) {\n if (update.selectionSet) {\n const contains = selectionContainsCurrentElement(update.state);\n setIsSelected(contains);\n }\n }\n },\n );\n\n return injector.inject([plugin]);\n }, [injector]);\n\n return {\n isSelected,\n select,\n remove,\n };\n}\n\nfunction findElement(state: EditorState, elementId: string) {\n const decorations = state.field(field);\n\n const cursor = decorations.iter();\n while (cursor.value) {\n const { spec } = cursor.value;\n if (spec?.widget?.id === elementId) {\n return {\n from: cursor.from,\n to: cursor.to,\n };\n }\n cursor.next();\n }\n}\n\nexport { useCurrentElement };\n"],"mappings":"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","names":["import_core","import_view","import_view","import_state","import_react","import_utils","import_language","React","import_react","import_view","import_state","universalPreset"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/language.ts","../src/schema.ts","../src/plugins.ts","../src/extension.ts","../src/context.tsx","../src/hooks.tsx"],"sourcesContent":["import universalPreset from '@coze-editor/preset-universal';\nimport { extension, type InferEditorAPIFromPlugins } from '@coze-editor/core';\nimport { EditorView, keymap } from '@codemirror/view';\nimport { defaultKeymap, historyKeymap, history } from '@codemirror/commands';\n\nimport {\n type EditorNode,\n type EditorElement,\n type EditorText,\n schemaUtils,\n} from './schema';\nimport plugins from './plugins';\nimport { htmlLanguage } from './language';\nimport { useCurrentElement } from './hooks';\nimport { CUSTOM_CLIPBOARD_MIMETYPE, type ElementDefinition } from './extension';\n\nconst preset = [\n ...universalPreset,\n extension([\n EditorView.theme({\n '&.cm-focused': {\n outline: 'none',\n },\n }),\n htmlLanguage,\n history(),\n keymap.of([...defaultKeymap, ...historyKeymap]),\n ]),\n ...plugins,\n];\n\ntype EditorAPI = InferEditorAPIFromPlugins<typeof preset>;\n\nexport default preset;\n\nexport { schemaUtils, useCurrentElement, CUSTOM_CLIPBOARD_MIMETYPE };\n\nexport type {\n EditorAPI,\n ElementDefinition,\n EditorNode,\n EditorElement,\n EditorText,\n};\n","/* eslint-disable complexity */\n\nimport { type SyntaxNode } from '@lezer/common';\n\nfunction extractElementData(node: SyntaxNode, text: string) {\n const openTag = node.firstChild;\n\n let tagName: string | null = null;\n const attributes: Record<string, any> = {};\n\n if (openTag && openTag.name === 'OpenTag' && openTag.firstChild) {\n let sibling = openTag.firstChild.nextSibling;\n while (true) {\n if (!sibling) {\n break;\n }\n\n if (sibling.name === 'TagName') {\n const { from, to } = sibling;\n tagName = text.slice(from, to);\n } else if (sibling.name === 'Attribute') {\n const nameNode = sibling.firstChild;\n const isNode = nameNode?.nextSibling;\n const valueNode = isNode?.nextSibling;\n if (\n nameNode?.name === 'AttributeName' &&\n isNode?.name === 'Is' &&\n (valueNode?.name === 'AttributeValue' ||\n valueNode?.name === 'UnquotedAttributeValue')\n ) {\n const name = text.slice(nameNode.from, nameNode.to);\n const fullValue = text.slice(valueNode.from, valueNode.to);\n\n let value = fullValue;\n if (valueNode.name === 'AttributeValue') {\n value = fullValue.slice(1, -1);\n }\n\n try {\n attributes[name] = JSON.parse(decodeURIComponent(value));\n } catch (e) {\n /* empty */\n }\n } else if (\n nameNode?.name === 'AttributeName' &&\n !isNode &&\n !valueNode\n ) {\n const name = text.slice(nameNode.from, nameNode.to);\n attributes[name] = true;\n }\n }\n\n sibling = sibling.nextSibling;\n }\n }\n\n if (tagName) {\n return {\n tagName,\n attributes,\n };\n }\n}\n\nexport { extractElementData };\n","import { parser } from '@lezer/html';\nimport { LRLanguage } from '@codemirror/language';\n\nconst htmlParser = parser.configure({\n dialect: 'noMatch',\n});\n\nfunction parse(text: string) {\n return htmlParser.parse(text);\n}\n\nconst htmlLanguage = LRLanguage.define({\n parser: htmlParser,\n});\n\nexport { parse, htmlLanguage };\n","import { extractElementData } from './utils';\nimport { parse } from './language';\n\ninterface EditorElement<Attrs = Record<string, any>> {\n type: 'element';\n tagName: string;\n attributes: Attrs;\n raw?: string;\n}\n\ninterface EditorText {\n type: 'text';\n value: string;\n}\n\ntype EditorNode = EditorElement | EditorText;\n\nfunction isElementRegistered(\n tagName: string,\n validTagNames: string[] | undefined,\n) {\n if (!Array.isArray(validTagNames)) {\n return false;\n }\n\n if (validTagNames.includes(tagName)) {\n return true;\n }\n\n return false;\n}\n\nconst schemaUtils = {\n toJSON(text: string, options?: { validTagNames?: string[] }): EditorNode[] {\n if (text === '') {\n return [];\n }\n\n const tree = parse(text);\n const tags: {\n from: number;\n to: number;\n tagName: string;\n attributes: Record<string, any>;\n raw: string;\n }[] = [];\n tree.iterate({\n enter(node) {\n if (node.name === 'Element') {\n const data = extractElementData(node.node, text);\n if (\n data &&\n isElementRegistered(data.tagName, options?.validTagNames)\n ) {\n tags.push({\n from: node.from,\n to: node.to,\n raw: text.slice(node.from, node.to),\n ...data,\n });\n }\n }\n },\n });\n\n let pos = 0;\n const elements: EditorNode[] = [];\n for (const tag of tags) {\n const { from, to, tagName, attributes, raw } = tag;\n const { cmid, ...restAttributes } = attributes ?? {};\n\n // overlap, skip this element\n if (from < pos) {\n continue;\n }\n\n if (from > pos) {\n elements.push({\n type: 'text',\n value: text.slice(pos, from),\n });\n }\n\n elements.push({\n type: 'element',\n tagName,\n attributes: restAttributes,\n raw,\n });\n\n pos = to;\n }\n\n if (pos < text.length) {\n elements.push({\n type: 'text',\n value: text.slice(pos),\n });\n }\n\n return elements;\n },\n fromJSON(elements: EditorNode[]): string {\n return elements\n .map(el => {\n if (el.type === 'element') {\n return toElementString(el);\n } else if (el.type === 'text') {\n return el.value;\n }\n return '';\n })\n .join('');\n },\n};\n\nfunction toElementString(element: Omit<EditorElement, 'type'>) {\n const attrsString = attributesToString(element.attributes);\n return `<${element.tagName}${attrsString ? ` ${attrsString}` : ''}></${element.tagName}>`;\n}\n\nconst INTERNAL_ID = 'cmid';\n\nfunction uniqueId() {\n return `e${Math.random()}`;\n}\n\nfunction attributesToString(attributes: EditorElement['attributes']) {\n const array: string[] = [];\n let hasId = false;\n\n Object.keys(attributes).forEach(key => {\n if (key === INTERNAL_ID) {\n hasId = true;\n }\n const value = attributes[key];\n if (value === true) {\n array.push(key);\n } else if (typeof value !== 'undefined') {\n array.push(`${key}=\"${encodeURIComponent(JSON.stringify(value))}\"`);\n }\n });\n\n if (!hasId) {\n array.unshift(\n `${INTERNAL_ID}=\"${encodeURIComponent(JSON.stringify(uniqueId()))}\"`,\n );\n }\n\n return array.join(' ');\n}\n\nexport { schemaUtils, toElementString, INTERNAL_ID };\nexport type { EditorNode, EditorElement, EditorText };\n","import { api, extension, option } from '@coze-editor/core';\nimport { EditorView } from '@codemirror/view';\nimport { EditorSelection, StateEffect, StateField } from '@codemirror/state';\n\nimport { type EditorElement, toElementString } from './schema';\nimport {\n chatExtension,\n type ElementsDefinition,\n elementsFacet,\n} from './extension';\n\nconst focusedEffect = StateEffect.define();\n\nconst focusedField = StateField.define<boolean>({\n create() {\n return false;\n },\n update(value, tr) {\n for (const effect of tr.effects) {\n if (effect.is(focusedEffect)) {\n return true;\n }\n }\n\n return value;\n },\n});\n\nfunction insertElement({ view }: { view: EditorView }) {\n return (element: Omit<EditorElement, 'type'>) => {\n let selection = view.state.selection.main;\n\n const hasFocused = view.state.field(focusedField, false);\n if (hasFocused === false) {\n selection = EditorSelection.cursor(view.state.doc.length);\n }\n\n const insert = toElementString(element);\n view.dispatch({\n changes: {\n from: selection.from,\n to: selection.to,\n insert,\n },\n selection: EditorSelection.cursor(selection.from + insert.length),\n });\n };\n}\n\nconst plugins = [\n extension([\n focusedField,\n EditorView.domEventObservers({\n click(e, view) {\n view.dispatch({\n effects: focusedEffect.of(null),\n });\n },\n }),\n chatExtension(),\n ]),\n api('insertElement', insertElement),\n option('elements', (elements: ElementsDefinition) =>\n elementsFacet.of(elements),\n ),\n];\n\nexport default plugins;\n","import { createPortal, flushSync } from 'react-dom';\nimport { createElement, type ReactNode } from 'react';\n\nimport { createRoot, type Root } from 'react-dom/client';\nimport { type SyntaxNode } from '@lezer/common';\nimport { FacetCombineStrategy } from '@coze-editor/utils';\nimport { connector } from '@coze-editor/react';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n WidgetType,\n} from '@codemirror/view';\nimport {\n EditorSelection,\n type EditorState,\n Facet,\n RangeSetBuilder,\n StateField,\n} from '@codemirror/state';\nimport { ensureSyntaxTree, syntaxTree } from '@codemirror/language';\n\nimport { extractElementData } from './utils';\nimport {\n type EditorElement,\n type EditorNode,\n INTERNAL_ID,\n schemaUtils,\n} from './schema';\nimport { ElementProvider } from './context';\n\ninterface ElementDefinition<Attrs = any> {\n render: (props: Attrs) => ReactNode;\n toString?: (element: EditorElement<Attrs>) => string;\n}\n\ninterface ElementsDefinition {\n [key: string]: ElementDefinition;\n}\n\nclass ElementWidget extends WidgetType {\n public $$type = 'element';\n private root: Root;\n private element: HTMLElement;\n private view: EditorView | null = null;\n constructor(\n public definition: ElementDefinition,\n public id: string,\n public props: any,\n ) {\n super();\n\n const element = document.createElement('span');\n this.element = element;\n this.root = createRoot(element);\n }\n\n get elementId() {\n return `element-${this.id}`;\n }\n\n toDOM(view: EditorView) {\n this.view = view;\n\n const c = view.state.facet(connector);\n queueMicrotask(() => {\n flushSync(() => {\n const jsxElement = createElement(ElementProvider, {\n internalId: this.id,\n children: createElement(this.definition.render, this.props),\n });\n c.connect(this.elementId, createPortal(jsxElement, this.element));\n });\n });\n return this.element;\n }\n\n eq(other: ElementWidget) {\n return (\n this.id === other.id &&\n this.props &&\n other.props &&\n JSON.stringify(this.props) === JSON.stringify(other.props)\n );\n }\n\n destroy(): void {\n if (this.view) {\n const c = this.view.state.facet(connector);\n c.disconnect(this.elementId);\n }\n }\n\n ignoreEvent(event: Event): boolean {\n return false;\n }\n}\n\n// function isElementWidget(widget: WidgetType | null) {\n// return (widget as any)?.$$type === 'element';\n// }\n\nconst elementsFacet = Facet.define<\n ElementsDefinition | undefined,\n ElementsDefinition | undefined\n>({\n combine: FacetCombineStrategy.Last,\n});\n\nconst field = StateField.define({\n create(state) {\n return build(state);\n },\n update(value, tr) {\n if (tr.docChanged) {\n return build(tr.state);\n }\n return value;\n },\n provide(f) {\n return [\n EditorView.decorations.of(view => view.state.field(f)),\n EditorView.atomicRanges.of(view => view.state.field(f)),\n ];\n },\n});\n\nfunction build(state: EditorState): DecorationSet {\n const allElements = state.facet(elementsFacet);\n\n if (!allElements) {\n return Decoration.none;\n }\n\n const tree = ensureSyntaxTree(state, state.doc.length) ?? syntaxTree(state);\n const builder = new RangeSetBuilder<Decoration>();\n tree.iterate({\n enter(node) {\n const data = extract(node.node, state);\n if (data) {\n const definition = allElements[data.tagName];\n if (definition) {\n builder.add(\n node.from,\n node.to,\n Decoration.replace({\n widget: new ElementWidget(\n definition,\n data.internalId,\n data.props,\n ),\n }),\n );\n }\n }\n\n // if (node.matchContext(['Document'])) {\n // return false;\n // }\n\n return true;\n },\n });\n\n const decorations = builder.finish();\n\n return decorations;\n}\n\nfunction extract(node: SyntaxNode, state: EditorState) {\n if (node.name === 'Element') {\n const elementData = extractElementData(node.node, state.doc.toString());\n\n if (elementData) {\n const { tagName, attributes } = elementData;\n const { [INTERNAL_ID]: internalId, ...props } = attributes ?? {};\n\n return {\n tagName,\n internalId,\n props,\n };\n }\n }\n}\n\nconst CUSTOM_CLIPBOARD_MIMETYPE = 'application/x-with-elements';\n\nconst copyPasteHandler = EditorView.domEventHandlers({\n paste(event, view) {\n try {\n const definitions = view.state.facet(elementsFacet);\n const xText = event.clipboardData?.getData(CUSTOM_CLIPBOARD_MIMETYPE);\n const plainText = event.clipboardData?.getData('text/plain');\n\n const text = xText || plainText || '';\n\n const nodes = schemaUtils.toJSON(text, {\n validTagNames: definitions ? Object.keys(definitions) : undefined,\n });\n const newText = schemaUtils.fromJSON(\n nodes\n .map(node => {\n if (node.type === 'text') {\n return node;\n }\n\n if (node.type === 'element') {\n return {\n ...node,\n attributes: {\n ...(node.attributes ?? {}),\n cmid: `e${Math.random()}`,\n },\n } satisfies EditorElement;\n }\n })\n .filter(v => isEditorNode(v)),\n );\n\n view.dispatch({\n changes: {\n from: view.state.selection.main.from,\n to: view.state.selection.main.to,\n insert: newText,\n },\n selection: EditorSelection.cursor(\n view.state.selection.main.from + newText.length,\n ),\n });\n return true;\n } catch (e) {\n return false;\n }\n },\n copy(event, view) {\n const definitions = view.state.facet(elementsFacet);\n\n if (!definitions) {\n return false;\n }\n\n try {\n const { from, to } = view.state.selection.main;\n const slice = view.state.doc.sliceString(from, to);\n const nodes = schemaUtils.toJSON(slice, {\n validTagNames: definitions ? Object.keys(definitions) : undefined,\n });\n\n const plainText = nodes\n .map(node => {\n if (node.type === 'text') {\n return node.value;\n }\n\n if (node.type === 'element') {\n const definition = definitions[node.tagName];\n const toString = definition?.toString;\n\n if (!definition) {\n return node.raw ?? '';\n }\n\n if (\n Object.prototype.hasOwnProperty.call(definition, 'toString') &&\n typeof toString === 'function'\n ) {\n return toString(node);\n }\n\n return `[${node.tagName}]`;\n }\n\n return '';\n })\n .join('');\n\n event.clipboardData?.setData('text/plain', plainText);\n event.clipboardData?.setData(CUSTOM_CLIPBOARD_MIMETYPE, slice);\n\n return true;\n } catch (e) {\n return false;\n }\n },\n});\n\nfunction isEditorNode(v: unknown): v is EditorNode {\n return Boolean(v);\n}\n\nfunction chatExtension() {\n return [\n field,\n copyPasteHandler,\n // selectionEnlarger.of(state => {\n // const decorations = state.field(field);\n // const cursor = decorations.iter();\n // const array = [];\n\n // while (cursor.value) {\n // const widget = cursor.value.spec?.widget;\n // const { from, to } = cursor;\n // if (isElementWidget(widget)) {\n // array.push({\n // source: { from, to },\n // target: { from, to },\n // });\n // }\n\n // cursor.next();\n // }\n\n // return array;\n // }),\n ];\n}\n\nexport { field, chatExtension, elementsFacet, CUSTOM_CLIPBOARD_MIMETYPE };\n\nexport type { ElementsDefinition, ElementDefinition };\n","import React, { createContext, type ReactNode, useContext } from 'react';\n\nconst Context = createContext('');\n\nfunction ElementProvider({\n internalId,\n children,\n}: {\n internalId: string;\n children: ReactNode;\n}) {\n return <Context.Provider value={internalId}>{children}</Context.Provider>;\n}\n\nfunction useElementId() {\n const id = useContext(Context);\n return id;\n}\n\nexport { ElementProvider, useElementId };\n","import { useLayoutEffect, useRef, useState } from 'react';\n\nimport {\n type BuiltinEditorAPI,\n useEditor,\n useInjector,\n} from '@coze-editor/react';\nimport { type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';\nimport { EditorSelection, type EditorState } from '@codemirror/state';\n\nimport { field } from './extension';\nimport { useElementId } from './context';\n\nfunction useCurrentElement() {\n const editor = useEditor<BuiltinEditorAPI | null>();\n const elementId = useElementId();\n const injector = useInjector();\n const [isSelected, setIsSelected] = useState(false);\n const elementIdRef = useRef(elementId);\n\n elementIdRef.current = elementId;\n\n function select() {\n if (!editor) {\n return;\n }\n\n const view = editor.$view;\n\n const decorations = view.state.field(field);\n\n const cursor = decorations.iter();\n while (cursor.value) {\n const { spec } = cursor.value;\n if (spec?.widget?.id === elementId) {\n view.dispatch({\n selection: EditorSelection.range(cursor.from, cursor.to),\n });\n break;\n }\n cursor.next();\n }\n }\n\n function remove() {\n if (!editor) {\n return;\n }\n\n const view = editor.$view;\n\n if (view.state.readOnly) {\n return;\n }\n\n const range = findElement(view.state, elementId);\n if (range) {\n view.dispatch({\n changes: {\n from: range.from,\n to: range.to,\n insert: '',\n },\n selection: EditorSelection.cursor(range.from),\n });\n }\n }\n\n useLayoutEffect(() => {\n function selectionContainsCurrentElement(state: EditorState) {\n const range = findElement(state, elementId);\n const { ranges } = state.selection;\n if (!range) {\n return false;\n }\n\n for (const r of ranges) {\n if (r.from <= range.from && r.to >= range.to) {\n return true;\n }\n }\n\n return false;\n }\n\n const plugin = ViewPlugin.fromClass(\n class {\n constructor(view: EditorView) {\n const contains = selectionContainsCurrentElement(view.state);\n setIsSelected(contains);\n }\n\n update(update: ViewUpdate) {\n if (update.selectionSet) {\n const contains = selectionContainsCurrentElement(update.state);\n setIsSelected(contains);\n }\n }\n },\n );\n\n return injector.inject([plugin]);\n }, [injector]);\n\n return {\n isSelected,\n select,\n remove,\n };\n}\n\nfunction findElement(state: EditorState, elementId: string) {\n const decorations = state.field(field);\n\n const cursor = decorations.iter();\n while (cursor.value) {\n const { spec } = cursor.value;\n if (spec?.widget?.id === elementId) {\n return {\n from: cursor.from,\n to: cursor.to,\n };\n }\n cursor.next();\n }\n}\n\nexport { useCurrentElement };\n"],"mappings":"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","names":["import_core","import_view","import_view","import_state","import_react","import_utils","import_language","React","import_react","import_view","import_state","universalPreset"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coze-editor/preset-chat",
3
- "version": "0.1.0-alpha.1e5e87",
3
+ "version": "0.1.0-alpha.2b6c24",
4
4
  "description": "preset-chat",
5
5
  "license": "MIT",
6
6
  "author": "fengzilong",
@@ -23,11 +23,11 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "@codemirror/language": "^6.10.1",
26
- "@coze-editor/core": "0.1.0-alpha.1e5e87",
27
- "@coze-editor/core-plugins": "0.1.0-alpha.1e5e87",
28
- "@coze-editor/extensions": "0.1.0-alpha.1e5e87",
29
- "@coze-editor/preset-universal": "0.1.0-alpha.1e5e87",
30
- "@coze-editor/utils": "0.1.0-alpha.1e5e87",
26
+ "@coze-editor/core": "0.1.0-alpha.2b6c24",
27
+ "@coze-editor/core-plugins": "0.1.0-alpha.2b6c24",
28
+ "@coze-editor/extensions": "0.1.0-alpha.2b6c24",
29
+ "@coze-editor/preset-universal": "0.1.0-alpha.2b6c24",
30
+ "@coze-editor/utils": "0.1.0-alpha.2b6c24",
31
31
  "@lezer/common": "^1.2.2",
32
32
  "@lezer/html": "^1.3.10"
33
33
  },
@@ -49,7 +49,7 @@
49
49
  "@codemirror/commands": "^6.3.3",
50
50
  "@codemirror/state": "^6.4.1",
51
51
  "@codemirror/view": "^6.26.1",
52
- "@coze-editor/react": "0.1.0-alpha.1e5e87",
52
+ "@coze-editor/react": "0.1.0-alpha.2b6c24",
53
53
  "react": ">=18",
54
54
  "react-dom": ">=18"
55
55
  },