Files
MetonaEditor/dist/metona-editor.d.ts
T
thzxx b48468f599
CI / test (20.x) (push) Canceled after 0s
CI / test (22.x) (push) Canceled after 0s
CI / test (24.x) (push) Canceled after 0s
CI / test (18.x) (push) Canceled after 1s
fix: 移除 setInterval 轮询,改用纯事件驱动 selectionChange — 修复 CI 卡死问题
2026-07-25 15:30:43 +08:00

678 lines
25 KiB
TypeScript

/**
* MetonaEditor Plugins — plugin system v2
* @module plugins
* @version 0.2.0
*/
interface Plugin {
name: string;
version?: string;
description?: string;
depends?: string[];
priority?: number;
install?: (editor: any) => void | Promise<void>;
destroy?: (editor: any) => void;
[key: string]: any;
}
interface PluginSchema {
[key: string]: {
type?: string;
required?: boolean;
default?: any;
enum?: any[];
validator?: (val: any) => boolean | string;
};
}
declare class PluginManager {
plugins: Map<string, Plugin & {
enabled: boolean;
}>;
register(name: string, plugin: Plugin): this;
unregister(name: string): this;
get(name: string): Plugin | null;
has(name: string): boolean;
getAll(): Plugin[];
getNames(): string[];
enable(name: string): this;
disable(name: string): this;
isEnabled(name: string): boolean;
destroy(): void;
}
declare const topologicalSort: (plugins: Plugin[]) => Plugin[];
declare const validateConfig: (schema?: PluginSchema, config?: Record<string, any>) => {
valid: boolean;
errors: string[];
patched: Record<string, any>;
};
declare const presetPlugins: Record<string, Plugin>;
declare const pluginUtils: {
createManager: () => PluginManager;
manager: PluginManager;
register: (name: string, plugin: Plugin) => PluginManager;
unregister: (name: string) => PluginManager;
get: (name: string) => Plugin | null;
has: (name: string) => boolean;
getAll: () => Plugin[];
getNames: () => string[];
enable: (name: string) => PluginManager;
disable: (name: string) => PluginManager;
isEnabled: (name: string) => boolean;
getPreset: (name: string) => Plugin | null;
getAllPresets: () => Record<string, Plugin>;
createPlugin: (config?: Partial<Plugin>) => Plugin;
validatePlugin: (plugin: any) => {
valid: boolean;
errors: string[];
};
topologicalSort: (plugins: Plugin[]) => Plugin[];
validateConfig: (schema?: PluginSchema, config?: Record<string, any>) => {
valid: boolean;
errors: string[];
patched: Record<string, any>;
};
};
declare const loadRemote: (url: string, locale: string) => Promise<boolean>;
interface InstanceI18n {
set: (locale: string) => string;
get: () => string;
getDirection: () => 'ltr' | 'rtl';
t: (key: string, params?: Record<string, any>) => string;
formatNumber: (n: number, opts?: Intl.NumberFormatOptions) => string;
formatDate: (d: Date | string, opts?: Intl.DateTimeFormatOptions) => string;
}
declare const createInstanceI18n: (editor: any) => InstanceI18n;
declare const i18nUtils: {
t: (key: string, params?: Record<string, any>, locale?: string) => string;
getCurrentLocale: () => string;
setCurrentLocale: (locale: string) => void;
switchLocale: (locale: string) => void;
getFallbackLocale: () => string;
setFallbackLocale: (locale: string) => void;
hasTranslation: (key: string) => boolean;
getTranslations: (locale: string) => Record<string, any>;
addTranslations: (locale: string, translations: Record<string, any>) => void;
loadRemote: (url: string, locale: string) => Promise<boolean>;
getSupportedLocales: () => string[];
isLocaleSupported: (locale: string) => boolean;
getLocaleName: (locale: string) => string;
getLocaleDirection: (locale: string) => "ltr" | "rtl";
formatNumber: (number: number, options?: Intl.NumberFormatOptions) => string;
formatCurrency: (amount: number, currency?: string, options?: Intl.NumberFormatOptions) => string;
formatDate: (date: Date | string, options?: Intl.DateTimeFormatOptions) => string;
addLocaleListener: (fn: (locale: string) => void) => () => void;
removeLocaleListener: (fn: (locale: string) => void) => void;
clearLocaleListeners: () => void;
initI18n: () => void;
saveLocale: (locale: string) => void;
loadLocale: () => string;
getDefaultLocale: () => string;
createInstanceI18n: (editor: any) => InstanceI18n;
};
/**
* MetonaEditor Icons — SVG toolbar icons
* @module icons
* @version 0.2.0
*/
declare const ICONS: Record<string, string>;
/**
* MetonaEditor Constants — default configs, themes, animations
* @module constants
* @version 0.2.0
*/
type EditMode = 'edit' | 'split' | 'preview';
type ThemeName = 'light' | 'dark' | 'auto' | 'warm' | string;
type ToolbarItem = string | '|';
interface RenderEnv {
highlight?: (code: string, lang: string) => string;
locale?: string;
refs?: Record<string, string>;
}
interface EditorStyle {
color?: string;
backgroundColor?: string;
[key: string]: string | undefined;
}
interface EditorOptions {
value?: string;
placeholder?: string;
mode?: EditMode;
height?: number | string;
toolbar?: ToolbarItem[] | false;
wordCount?: boolean;
autofocus?: boolean;
spellcheck?: boolean;
historyLimit?: number;
historyDebounce?: number;
syncScroll?: boolean;
tabSize?: number;
readOnly?: boolean;
lineNumbers?: boolean;
outline?: boolean;
autoBrackets?: boolean;
zenMode?: boolean;
wordWrap?: boolean;
maxLength?: number;
theme?: ThemeName;
locale?: string;
render?: ((markdown: string, env: RenderEnv) => string) | null;
highlight?: ((code: string, lang: string) => string) | null;
sanitize?: ((html: string) => string) | null;
className?: string;
style?: EditorStyle;
plugins?: any[];
id?: string;
onChange?: ((value: string, editor: any) => void) | null;
onInput?: ((value: string, editor: any) => void) | null;
onFocus?: ((editor: any) => void) | null;
onBlur?: ((editor: any) => void) | null;
onSave?: ((value: string, editor: any) => void) | null;
onModeChange?: ((mode: string, editor: any) => void) | null;
onFullscreen?: ((fullscreen: boolean, editor: any) => void) | null;
onCreate?: ((editor: any) => void) | null;
onDestroy?: ((editor: any) => void) | null;
onLinkClick?: ((href: string, text: string, editor: any) => void) | null;
floatingToolbar?: boolean;
}
interface ThemeConfig {
bg: string;
text: string;
border: string;
shadow: string;
hoverShadow?: string;
toolbarBg?: string;
textareaBg?: string;
previewBg?: string;
codeBg?: string;
codeText?: string;
accent?: string;
muted?: string;
progressBg?: string;
closeHoverBg?: string;
}
interface AnimationConfig {
name?: string;
enter: Record<string, string>;
leave: Record<string, string>;
duration: number;
easing: string;
}
/** Default toolbar button sequence */
declare const DEFAULT_TOOLBAR: ToolbarItem[];
/** Default options */
declare const DEFAULTS: Readonly<EditorOptions>;
declare const THEMES: Record<string, ThemeConfig | string>;
declare const EDIT_MODES: EditMode[];
declare const TOOLBAR_ACTIONS: string[];
/**
* MetonaEditor Parser — lightweight Markdown parser (TypeScript)
* @module parser
* @version 0.2.0
*/
interface Token {
type: string;
[key: string]: any;
}
interface ParseResult {
tokens: Token[];
footnotes: Record<string, string>;
refs: Record<string, string>;
}
interface BlockHandler {
name: string;
priority: number;
test: (line: string, lines: string[], i: number) => any;
parse: (lines: string[], i: number, match: any, tokens: Token[], footnotes: Record<string, string>, refs?: Record<string, string>) => {
token: Token | null;
newIndex: number;
};
}
declare const clearRenderCache: () => void;
declare const safeUrl: (url: string | null | undefined) => string;
declare const slugify: (text: string) => string;
declare const registerBlockHandler: (handler: BlockHandler) => void;
declare const parseTokens: (md: string | null | undefined) => ParseResult;
declare const renderTokens: (tokens: Token[], env?: RenderEnv, footnotes?: Record<string, string>) => string;
declare const parseMarkdown: (md: string | null | undefined, env?: RenderEnv) => string;
/**
* MetonaEditor Core — MarkdownEditor class (TypeScript)
* @module core
* @version 0.2.0
*/
declare class MarkdownEditor {
static _hooks: Map<string, ((editor: MarkdownEditor) => void)[]>;
static on(name: string, fn: (editor: MarkdownEditor) => void): () => void;
static off(name: string, fn: (editor: MarkdownEditor) => void): void;
static trigger(name: string, instance: MarkdownEditor): void;
id: string;
container: HTMLElement;
config: EditorOptions;
el: HTMLElement;
toolbarEl: HTMLElement;
bodyEl: HTMLElement;
editorPane: HTMLElement;
editorInner: HTMLElement;
previewPane: HTMLElement;
dividerEl: HTMLElement;
textarea: HTMLTextAreaElement;
previewEl: HTMLElement;
gutter: HTMLElement;
statusEl: HTMLElement | null;
_value: string;
_mode: EditMode;
_history: string[];
_historyIndex: number;
_cleanups: Array<() => void>;
_plugins: any[];
_listeners: Record<string, Array<(...args: any[]) => void>>;
_renderRaf: number | null;
_historyTimer: ReturnType<typeof setTimeout> | null;
_fullscreen: boolean;
_destroyed: boolean;
_lastRenderedValue: string | null;
_shortcuts: any[];
_contextMenuItems: any[];
_customActions: Record<string, (...args: any[]) => void>;
_outlineTimer: ReturnType<typeof setTimeout> | null;
_zenMode: boolean;
_wordWrap: boolean;
_syncing: boolean;
_zenMouseHandler: ((e: MouseEvent) => void) | null;
_ariaLive: HTMLElement;
_renderFn: (md: string, env: RenderEnv) => string;
_highlightFn: ((code: string, lang: string) => string) | null;
_themeCtx: any;
_i18nCtx: InstanceI18n;
_floatingToolbar: HTMLElement | null;
_floatingEnabled: boolean;
constructor(container: string | HTMLElement, options?: EditorOptions);
_buildDOM(): void;
_buildToolbar(): void;
_createBtn(item: string): HTMLButtonElement;
_bindEvents(): void;
_handleKeydown(e: KeyboardEvent): void;
_handleTab(shift: boolean): void;
_bindDividerDrag(e: PointerEvent): void;
_saveDividerPosition(): void;
_restoreDividerPosition(): void;
_scheduleRender(): void;
_render(): void;
_renderGutter(): void;
_updateCurrentLine(): void;
_handleSmartEnter(e: KeyboardEvent): void;
_handleBracketAutoClose(e: KeyboardEvent): void;
_bindDragDrop(): void;
_buildOutline(): void;
_updateOutline(): void;
_trackOutlineScroll(): void;
_scheduleHistory(): void;
_pushHistory(): void;
undo(): this;
redo(): this;
canUndo(): boolean;
canRedo(): boolean;
_applyHistory(): void;
exec(action: string, ...args: any[]): this;
_wrapSelection(before: string, after: string): void;
_toggleLinePrefix(prefix: string): void;
_insertBlock(text: string): void;
_insertLink(): void;
_insertImage(): void;
_insertTable(rows?: number, cols?: number): void;
_formatTable(): void;
setMode(mode: EditMode): this;
getMode(): EditMode;
_updateModeButtons(): void;
toggleFullscreen(): this;
isFullscreen(): boolean;
exitFullscreen(): this;
toggleZen(): this;
isZen(): boolean;
toggleWordWrap(): this;
setWordWrap(on: boolean): this;
isWordWrap(): boolean;
_initFloatingToolbar(): void;
toggleFloatingToolbar(): this;
isFloatingToolbar(): boolean;
_buildFloatingToolbar(): void;
_hideFloatingToolbar(): void;
_bindToolbarKeyboard(): void;
_initAriaLive(): void;
_announce(msg: string): void;
_syncScroll(): void;
_updateWordCount(): void;
getStats(): {
characters: number;
words: number;
chineseChars: number;
englishWords: number;
lines: number;
readingTime: number;
};
getSelectedText(): string;
getCursorPosition(): {
line: number;
column: number;
};
setCursorPosition(line: number, column?: number): this;
scrollToLine(line: number): this;
selectLine(line: number): this;
selectAll(): this;
replaceAll(search: string, replace: string, caseSensitive?: boolean): number;
replaceAllRegex(pattern: RegExp, replace: string): number;
lineCount(): number;
getLine(line: number): string;
getValue(): string;
setValue(md: string, opts?: {
silent?: boolean;
}): this;
getHTML(): string;
refresh(): this;
copyAsMarkdown(): this;
copyAsHTML(): this;
insert(text: string, opts?: {
replace?: boolean;
}): this;
wrap(before: string, after: string): this;
focus(): this;
blur(): this;
enable(): this;
disable(): this;
isDisabled(): boolean;
setReadOnly(readOnly: boolean): this;
isReadOnly(): boolean;
on(name: string, fn: (...args: any[]) => void): () => void;
off(name: string, fn: (...args: any[]) => void): this;
_emit(name: string, ...args: any[]): void;
use(plugin: string | any, options?: any): this;
unuse(name: string): this;
getPlugins(): any[];
addToolbarButton(config: any): this;
registerShortcut(combo: string, handler: Function | string, description?: string): this;
unregisterShortcut(combo: string): this;
getShortcuts(): any[];
configureToolbar(tools: ToolbarItem[]): this;
removeToolbarButton(action: string): this;
registerContextMenu(items?: any[]): this;
_bindContextMenu(): void;
_showContextMenu(e: MouseEvent): void;
_hideContextMenu(): void;
_execContextAction(action: string): void;
toast(message: string, opts?: {
type?: string;
duration?: number;
animation?: string;
}): this;
setLocale(locale: string): this;
getLocale(): string;
t(key: string, params?: Record<string, any>): string;
setTheme(theme: ThemeName): this;
getTheme(): string;
getThemeContext(): any;
getStatus(): {
id: string;
mode: EditMode;
theme: string;
locale: string;
fullscreen: boolean;
readOnly: boolean;
disabled: boolean;
destroyed: boolean;
plugins: any[];
};
destroy(): void;
isDestroyed(): boolean;
}
/**
* MetonaEditor Themes — theme system
* @module themes
* @version 0.2.0
*/
declare const exportCSSVars: (el?: HTMLElement) => Record<string, string>;
declare const getCSSVariable: (name: string, el?: HTMLElement) => string;
declare const followExternalTheme: (options: {
element?: HTMLElement;
attr?: string;
classMap?: Record<string, string>;
callback?: (el: HTMLElement) => string | null;
}, onThemeChange: (theme: string) => void) => () => void;
declare const adoptFromParent: (container: HTMLElement, onThemeDetected: (theme: string) => void) => () => void;
declare const createInstanceTheme: (editor: any) => any;
declare const themeUtils: {
getSystemTheme: () => "light" | "dark";
resolveTheme: (theme: string) => string;
getThemeConfig: (theme: string) => ThemeConfig;
watchSystemTheme: () => void;
unwatchSystemTheme: () => void;
applyTheme: (theme: string) => void;
getCurrentTheme: () => string;
getResolvedTheme: () => string;
switchTheme: (theme: string) => void;
toggleTheme: () => void;
resetToAuto: () => void;
initTheme: () => void;
saveTheme: (theme: string) => void;
loadTheme: () => string;
addThemeListener: (fn: (theme: string, resolved: string) => void) => () => void;
removeThemeListener: (fn: (theme: string, resolved: string) => void) => void;
clearThemeListeners: () => void;
registerTheme: (name: string, config?: Partial<ThemeConfig> & {
extends?: string;
}) => void;
unregisterTheme: (name: string) => void;
getAllThemes: () => Record<string, ThemeConfig | string>;
getThemeNames: () => string[];
hasTheme: (name: string) => boolean;
setThemeVariables: (config: ThemeConfig, target?: HTMLElement) => void;
exportCSSVars: (el?: HTMLElement) => Record<string, string>;
getCSSVariable: (name: string, el?: HTMLElement) => string;
applyThemeToElement: (theme: string, target: HTMLElement) => void;
followExternalTheme: (options: {
element?: HTMLElement;
attr?: string;
classMap?: Record<string, string>;
callback?: (el: HTMLElement) => string | null;
}, onThemeChange: (theme: string) => void) => () => void;
adoptFromParent: (container: HTMLElement, onThemeDetected: (theme: string) => void) => () => void;
watch: (source: Function | string, onChange: (theme: string) => void) => () => void;
createInstanceTheme: (editor: any) => any;
};
/**
* MetonaEditor Animations — animation metadata
* @module animations
* @version 0.2.0
*/
declare const animationUtils: {
register(name: string, config: Partial<AnimationConfig> & {
enter?: Record<string, string>;
leave?: Record<string, string>;
}): void;
unregister(name: string): void;
get(name: string): AnimationConfig | null;
getAnimationNames(): string[];
getActiveCount(): number;
cancelAll(): void;
reset(): void;
destroy(): void;
};
declare const VERSION = "0.2.3";
declare function create(container: string | HTMLElement, options?: EditorOptions): MarkdownEditor;
declare function use(plugin: string | any, options?: any): typeof api;
declare function on(name: string, fn: (editor: MarkdownEditor) => void): () => void;
declare function off(name: string, fn: (editor: MarkdownEditor) => void): typeof api;
declare function setTheme(theme: ThemeName, _options?: any): typeof api;
declare function setLocale(locale: string): typeof api;
declare function destroy(): void;
declare function getStatus(): {
version: string;
theme: string;
locale: string;
globalPlugins: any[];
presetPlugins: string[];
};
declare const api: {
VERSION: string;
version: string;
MarkdownEditor: typeof MarkdownEditor;
Editor: typeof MarkdownEditor;
create: typeof create;
use: typeof use;
on: typeof on;
off: typeof off;
setTheme: typeof setTheme;
setLocale: typeof setLocale;
destroy: typeof destroy;
getStatus: typeof getStatus;
parseMarkdown: (md: string | null | undefined, env?: RenderEnv) => string;
parseTokens: (md: string | null | undefined) => ParseResult;
renderTokens: (tokens: Token[], env?: RenderEnv, footnotes?: Record<string, string>) => string;
safeUrl: (url: string | null | undefined) => string;
slugify: (text: string) => string;
clearRenderCache: () => void;
registerBlockHandler: (handler: BlockHandler) => void;
themes: {
getSystemTheme: () => "light" | "dark";
resolveTheme: (theme: string) => string;
getThemeConfig: (theme: string) => ThemeConfig;
watchSystemTheme: () => void;
unwatchSystemTheme: () => void;
applyTheme: (theme: string) => void;
getCurrentTheme: () => string;
getResolvedTheme: () => string;
switchTheme: (theme: string) => void;
toggleTheme: () => void;
resetToAuto: () => void;
initTheme: () => void;
saveTheme: (theme: string) => void;
loadTheme: () => string;
addThemeListener: (fn: (theme: string, resolved: string) => void) => () => void;
removeThemeListener: (fn: (theme: string, resolved: string) => void) => void;
clearThemeListeners: () => void;
registerTheme: (name: string, config?: Partial<ThemeConfig> & {
extends?: string;
}) => void;
unregisterTheme: (name: string) => void;
getAllThemes: () => Record<string, ThemeConfig | string>;
getThemeNames: () => string[];
hasTheme: (name: string) => boolean;
setThemeVariables: (config: ThemeConfig, target?: HTMLElement) => void;
exportCSSVars: (el?: HTMLElement) => Record<string, string>;
getCSSVariable: (name: string, el?: HTMLElement) => string;
applyThemeToElement: (theme: string, target: HTMLElement) => void;
followExternalTheme: (options: {
element?: HTMLElement;
attr?: string;
classMap?: Record<string, string>;
callback?: (el: HTMLElement) => string | null;
}, onThemeChange: (theme: string) => void) => () => void;
adoptFromParent: (container: HTMLElement, onThemeDetected: (theme: string) => void) => () => void;
watch: (source: Function | string, onChange: (theme: string) => void) => () => void;
createInstanceTheme: (editor: any) => any;
};
i18n: {
t: (key: string, params?: Record<string, any>, locale?: string) => string;
getCurrentLocale: () => string;
setCurrentLocale: (locale: string) => void;
switchLocale: (locale: string) => void;
getFallbackLocale: () => string;
setFallbackLocale: (locale: string) => void;
hasTranslation: (key: string) => boolean;
getTranslations: (locale: string) => Record<string, any>;
addTranslations: (locale: string, translations: Record<string, any>) => void;
loadRemote: (url: string, locale: string) => Promise<boolean>;
getSupportedLocales: () => string[];
isLocaleSupported: (locale: string) => boolean;
getLocaleName: (locale: string) => string;
getLocaleDirection: (locale: string) => "ltr" | "rtl";
formatNumber: (number: number, options?: Intl.NumberFormatOptions) => string;
formatCurrency: (amount: number, currency?: string, options?: Intl.NumberFormatOptions) => string;
formatDate: (date: Date | string, options?: Intl.DateTimeFormatOptions) => string;
addLocaleListener: (fn: (locale: string) => void) => () => void;
removeLocaleListener: (fn: (locale: string) => void) => void;
clearLocaleListeners: () => void;
initI18n: () => void;
saveLocale: (locale: string) => void;
loadLocale: () => string;
getDefaultLocale: () => string;
createInstanceI18n: (editor: any) => InstanceI18n;
};
animations: {
register(name: string, config: Partial<AnimationConfig> & {
enter?: Record<string, string>;
leave?: Record<string, string>;
}): void;
unregister(name: string): void;
get(name: string): AnimationConfig | null;
getAnimationNames(): string[];
getActiveCount(): number;
cancelAll(): void;
reset(): void;
destroy(): void;
};
plugins: {
createManager: () => PluginManager;
manager: PluginManager;
register: (name: string, plugin: Plugin) => PluginManager;
unregister: (name: string) => PluginManager;
get: (name: string) => Plugin | null;
has: (name: string) => boolean;
getAll: () => Plugin[];
getNames: () => string[];
enable: (name: string) => PluginManager;
disable: (name: string) => PluginManager;
isEnabled: (name: string) => boolean;
getPreset: (name: string) => Plugin | null;
getAllPresets: () => Record<string, Plugin>;
createPlugin: (config?: Partial<Plugin>) => Plugin;
validatePlugin: (plugin: any) => {
valid: boolean;
errors: string[];
};
topologicalSort: (plugins: Plugin[]) => Plugin[];
validateConfig: (schema?: PluginSchema, config?: Record<string, any>) => {
valid: boolean;
errors: string[];
patched: Record<string, any>;
};
};
presetPlugins: Record<string, Plugin>;
topologicalSort: (plugins: Plugin[]) => Plugin[];
validateConfig: (schema?: PluginSchema, config?: Record<string, any>) => {
valid: boolean;
errors: string[];
patched: Record<string, any>;
};
createInstanceI18n: (editor: any) => InstanceI18n;
loadRemote: (url: string, locale: string) => Promise<boolean>;
exportCSSVars: (el?: HTMLElement) => Record<string, string>;
getCSSVariable: (name: string, el?: HTMLElement) => string;
followExternalTheme: (options: {
element?: HTMLElement;
attr?: string;
classMap?: Record<string, string>;
callback?: (el: HTMLElement) => string | null;
}, onThemeChange: (theme: string) => void) => () => void;
adoptFromParent: (container: HTMLElement, onThemeDetected: (theme: string) => void) => () => void;
createInstanceTheme: (editor: any) => any;
DEFAULTS: Readonly<EditorOptions>;
ICONS: Record<string, string>;
THEMES: Record<string, string | ThemeConfig>;
EDIT_MODES: EditMode[];
DEFAULT_TOOLBAR: string[];
TOOLBAR_ACTIONS: string[];
};
export { DEFAULTS, DEFAULT_TOOLBAR, EDIT_MODES, MarkdownEditor as Editor, ICONS, MarkdownEditor, api as MeEditor, THEMES, TOOLBAR_ACTIONS, VERSION, adoptFromParent, animationUtils, api, clearRenderCache, create, createInstanceI18n, createInstanceTheme, api as default, destroy, exportCSSVars, followExternalTheme, getCSSVariable, getStatus, i18nUtils, loadRemote, api as meEditor, off, on, parseMarkdown, parseTokens, pluginUtils, presetPlugins, registerBlockHandler, renderTokens, safeUrl, setLocale, setTheme, slugify, themeUtils, topologicalSort, use, validateConfig };