新建 libs/codemirror-editor(pnpm/Vite IIFE/@catppuccin/codemirror Catppuccin Latte+Mocha 主题/@codemirror/lang-sql schema 补全/@replit/codemirror-vim), 输出 public/codemirror/。Rust 桥接 codemirror_bridge.rs 镜像 tiptap_bridge.rs (Reflect::get 取对象字面量 + EditorHandle 持有闭包 + Drop→destroy)。 接入 Makefile/Dioxus.toml/.gitignore。 注意:thememirror 不含 catppuccin 主题,改用官方 @catppuccin/codemirror@1.0.3 (导出 catppuccinLatte/catppuccinMocha)。
32 lines
990 B
TypeScript
32 lines
990 B
TypeScript
import { CodeMirrorInstance, EditorOptions } from './editor';
|
||
|
||
/**
|
||
* 模块入口:暴露对象字面量 { create } 作为默认导出。
|
||
* IIFE 产物挂在 window.CodeMirrorEditor 上,由 Rust 侧用 Reflect::get 取
|
||
* (对象字面量,不能用 wasm-bindgen 的 extern fn——那会被编成函数调用而失败)。
|
||
*/
|
||
const CodeMirrorEditor = {
|
||
_instances: new Map<string, CodeMirrorInstance>(),
|
||
|
||
create(
|
||
containerId: string,
|
||
options: EditorOptions = new EditorOptions(),
|
||
): CodeMirrorInstance | null {
|
||
const container = document.getElementById(containerId);
|
||
if (!container) return null;
|
||
|
||
// 销毁同 id 的旧实例
|
||
const existing = this._instances.get(containerId);
|
||
if (existing) {
|
||
existing.destroy();
|
||
this._instances.delete(containerId);
|
||
}
|
||
|
||
const instance = new CodeMirrorInstance(container, options);
|
||
this._instances.set(containerId, instance);
|
||
return instance;
|
||
},
|
||
};
|
||
|
||
export default CodeMirrorEditor;
|