UNPKG

md-editor-v3

Version:

Markdown editor for vue3, developed in jsx and typescript, dark theme、beautify content by prettier、render articles directly、paste or clip the picture and upload it...

2,194 lines (2,183 loc) 87.6 kB
import * as vue from 'vue'; import { PropType, VNode, CSSProperties, Component, SetupContext, ExtractPropTypes, App } from 'vue'; import * as vue_jsx_runtime from 'vue/jsx-runtime'; import * as _codemirror_autocomplete from '@codemirror/autocomplete'; import { CompletionSource } from '@codemirror/autocomplete'; import { Extension, Compartment } from '@codemirror/state'; import { KeyBinding, EditorView } from '@codemirror/view'; import { LooseRequired } from '@vue/shared'; import markdownit, { Token } from 'markdown-it'; import * as xss from 'xss'; type IconName = 'bold' | 'underline' | 'italic' | 'strike-through' | 'title' | 'sub' | 'sup' | 'quote' | 'unordered-list' | 'ordered-list' | 'task' | 'code-row' | 'code' | 'link' | 'image' | 'table' | 'revoke' | 'next' | 'save' | 'prettier' | 'minimize' | 'maximize' | 'fullscreen-exit' | 'fullscreen' | 'preview-only' | 'preview' | 'preview-html' | 'catalog' | 'github' | 'mermaid' | 'formula' | 'close' | 'delete' | 'upload'; declare const mdPreviewProps: { /** * markdown content. * * @default '' */ modelValue: { type: PropType<string>; default: string; }; /** * input回调事件 */ onChange: { type: PropType<ChangeEvent>; default: undefined; }; /** * 主题,支持light和dark * * @default 'light' */ theme: { type: PropType<Themes>; default: string; }; /** * 外层类名 * * @default '' */ class: { type: StringConstructor; default: string; }; /** * 预设语言名称 * * @default 'zh-CN' */ language: { type: PropType<string>; default: string; }; /** * html变化事件 */ onHtmlChanged: { type: PropType<HtmlChangedEvent>; default: undefined; }; /** * 获取目录结构 */ onGetCatalog: { type: PropType<GetCatalogEvent>; default: undefined; }; /** * 编辑器唯一标识 * * @default 'md-editor-v3' * @deprecated 5.x版本开始使用 id 替换 */ editorId: { type: PropType<string>; default: undefined; }; /** * 5.x版本开始 editorId 的替换 * * @default 'md-editor-v3' */ id: { type: PropType<string>; default: undefined; }; /** * 预览中代码是否显示行号 * * @default true */ showCodeRowNumber: { type: PropType<boolean>; default: boolean; }; /** * 预览内容样式 * * @default 'default' */ previewTheme: { type: PropType<PreviewThemes>; default: string; }; /** * 编辑器样式 */ style: { type: PropType<CSSProperties | string>; default: () => {}; }; /** * 标题的id生成方式 * * @default (text: string) => text */ mdHeadingId: { type: PropType<MdHeadingId>; default: MdHeadingId; }; /** * * 不能保证文本正确的情况,在marked编译md文本后通过该方法处理 * 推荐DOMPurify、sanitize-html * * @default (text: string) => text */ sanitize: { type: PropType<(html: string) => string>; default: (html: string) => string; }; /** * 不使用该mermaid * * @default false */ noMermaid: { type: PropType<boolean>; default: boolean; }; /** * 不使用katex * * @default false */ noKatex: { type: PropType<boolean>; default: boolean; }; /** * 代码主题 * * @default 'atom' */ codeTheme: { type: PropType<string>; default: string; }; /** * 复制代码格式化方法 * * @default (text) => text */ formatCopiedText: { type: PropType<(text: string) => string>; default: (text: string) => string; }; /** * 某些预览主题的代码模块背景是暗色系 * 将这个属性设置为true,会自动在该主题下的light模式下使用暗色系的代码风格 * * @default true */ codeStyleReverse: { type: PropType<boolean>; default: boolean; }; /** * 需要自动调整的预览主题 * * @default ['default', 'mk-cute'] */ codeStyleReverseList: { type: PropType<Array<string>>; default: string[]; }; noHighlight: { type: PropType<boolean>; default: boolean; }; /** * 是否关闭编辑器默认的放大缩小功能 */ noImgZoomIn: { type: PropType<boolean>; default: boolean; }; /** * 自定义的图标 */ customIcon: { type: PropType<CustomIcon>; default: {}; }; sanitizeMermaid: { type: PropType<(h: string) => Promise<string>>; default: (h: string) => Promise<string>; }; /** * 是否开启折叠代码功能 * 不开启会使用div标签替代details标签 * * @default true */ codeFoldable: { type: PropType<boolean>; default: boolean; }; /** * 触发自动折叠代码的行数阈值 * * @default 30 */ autoFoldThreshold: { type: PropType<number>; default: number; }; /** * 内容重新挂载事件 * * 相比起onHtmlChanged,onRemount会在重新挂载后触发 */ onRemount: { type: PropType<() => void>; default: undefined; }; /** * 不使用 echarts */ noEcharts: { type: PropType<boolean>; default: boolean; }; previewComponent: { type: PropType<Component>; default: undefined; }; }; declare const editorProps: { /** * input回调事件 */ onSave: { type: PropType<SaveEvent>; default: undefined; }; /** * 上传图片事件 */ onUploadImg: { type: PropType<UploadImgEvent>; default: undefined; }; /** * 是否页面内全屏 * * @default false */ pageFullscreen: { type: PropType<boolean>; default: boolean; }; /** * 是否展开预览 * * @default true */ preview: { type: PropType<boolean>; default: boolean; }; /** * 是否展开html预览 * * @default false */ htmlPreview: { type: PropType<boolean>; default: boolean; }; /** * 仅预览模式,不显示toolbar和编辑框 * * @4.0.0开始移除该设置,使用组件MdPreview替换 * * @default false */ /** * 工具栏选择显示 * * @default allToolbar */ toolbars: { type: PropType<Array<ToolbarNames>>; default: string[]; }; /** * 浮动工具栏 * * @version 6.0.0 * @default [] */ floatingToolbars: { type: PropType<Array<ToolbarNames>>; default: never[]; }; /** * 工具栏选择不显示 * * @default [] */ toolbarsExclude: { type: PropType<Array<ToolbarNames>>; default: never[]; }; /** * 格式化md * * @default true */ noPrettier: { type: PropType<boolean>; default: boolean; }; /** * 一个tab等于空格数 * * @default 2 */ tabWidth: { type: PropType<number>; default: number; }; /** * 表格预设格子数 * * 也可以是[6, 4, 10, 8] * * @default [6, 4] */ tableShape: { type: PropType<Array<number>>; default: number[]; }; /** * 空提示 * * @default '' */ placeholder: { type: PropType<string>; default: string; }; /** * 自定义的工具栏列表 */ defToolbars: { type: PropType<string | VNode>; default: undefined; }; /** * 内部错误捕获 */ onError: { type: PropType<ErrorEvent>; default: undefined; }; /** * 页脚列表显示顺序 */ footers: { type: PropType<Array<Footers>>; default: Footers[]; }; /** * 是否默认激活输入框和预览框同步滚动 * * @default true */ scrollAuto: { type: PropType<boolean>; default: boolean; }; /** * 自定义的也叫工具组件列表 */ defFooters: { type: PropType<string | VNode>; default: undefined; }; /** * 是否禁用上传图片 * * @default false */ noUploadImg: { type: PropType<boolean>; default: boolean; }; /** * 文本区域自动获得焦点 * * @default false */ autoFocus: { type: PropType<boolean>; default: boolean; }; /** * 禁用文本区域 * * @default false */ disabled: { type: PropType<boolean>; default: boolean; }; /** * 文本区域为只读 * * @default false */ readOnly: { type: PropType<boolean>; default: boolean; }; /** * 文本区域允许的最大字符数 */ maxLength: { type: PropType<number>; default: undefined; }; /** * 是否启用自动识别粘贴代码类别 * 目前支持 vscode 复制的代码识别 * * @default false */ autoDetectCode: { type: PropType<boolean>; default: boolean; }; /** * 输入框失去焦点时触发事件 */ onBlur: { type: PropType<(event: FocusEvent) => void>; default: undefined; }; /** * 输入框获得焦点时触发事件 */ onFocus: { type: PropType<(event: FocusEvent) => void>; default: undefined; }; /** * @codemirror/autocomplete匹配关键词的方法列表 * * 它会被像下面这样嵌入编辑器 * * import { autocompletion } from '@codemirror/autocomplete'; * autocompletion({ * override: [...completions] * }) */ completions: { type: PropType<Array<CompletionSource>>; default: undefined; }; /** * 是否在工具栏下面显示对应的文字名称 * * @default false */ showToolbarName: { type: PropType<boolean>; default: boolean; }; /** * 字符输入事件 */ onInput: { type: PropType<(event: Event) => void>; default: undefined; }; onDrop: { type: PropType<(event: DragEvent) => void>; default: undefined; }; /** * 输入框的默认宽度 * * @example '100px'/'50%' * @default '50% */ inputBoxWidth: { type: PropType<string>; default: string; }; /** * 输入框宽度变化事件 */ oninputBoxWidthChange: { type: PropType<(width: string) => void>; default: undefined; }; /** * 替换粘贴的图片链接 * * @param t 图片链接 * @returns */ transformImgUrl: { type: PropType<(t: string) => string | Promise<string>>; default: (t: string) => string; }; /** * 内置的目录显示的状态 * * 'fixed': 悬浮在内容上方 * 'flat': 展示在右侧 * * \>=5.3.0 * * @default 'fixed' */ catalogLayout: { type: PropType<"fixed" | "flat">; default: string; }; /** * 控制最大显示的目录层级 */ catalogMaxDepth: { type: PropType<number>; default: undefined; }; /** * markdown content. * * @default '' */ modelValue: { type: PropType<string>; default: string; }; /** * input回调事件 */ onChange: { type: PropType<ChangeEvent>; default: undefined; }; /** * 主题,支持light和dark * * @default 'light' */ theme: { type: PropType<Themes>; default: string; }; /** * 外层类名 * * @default '' */ class: { type: StringConstructor; default: string; }; /** * 预设语言名称 * * @default 'zh-CN' */ language: { type: PropType<string>; default: string; }; /** * html变化事件 */ onHtmlChanged: { type: PropType<HtmlChangedEvent>; default: undefined; }; /** * 获取目录结构 */ onGetCatalog: { type: PropType<GetCatalogEvent>; default: undefined; }; /** * 编辑器唯一标识 * * @default 'md-editor-v3' * @deprecated 5.x版本开始使用 id 替换 */ editorId: { type: PropType<string>; default: undefined; }; /** * 5.x版本开始 editorId 的替换 * * @default 'md-editor-v3' */ id: { type: PropType<string>; default: undefined; }; /** * 预览中代码是否显示行号 * * @default true */ showCodeRowNumber: { type: PropType<boolean>; default: boolean; }; /** * 预览内容样式 * * @default 'default' */ previewTheme: { type: PropType<PreviewThemes>; default: string; }; /** * 编辑器样式 */ style: { type: PropType<CSSProperties | string>; default: () => {}; }; /** * 标题的id生成方式 * * @default (text: string) => text */ mdHeadingId: { type: PropType<MdHeadingId>; default: MdHeadingId; }; /** * * 不能保证文本正确的情况,在marked编译md文本后通过该方法处理 * 推荐DOMPurify、sanitize-html * * @default (text: string) => text */ sanitize: { type: PropType<(html: string) => string>; default: (html: string) => string; }; /** * 不使用该mermaid * * @default false */ noMermaid: { type: PropType<boolean>; default: boolean; }; /** * 不使用katex * * @default false */ noKatex: { type: PropType<boolean>; default: boolean; }; /** * 代码主题 * * @default 'atom' */ codeTheme: { type: PropType<string>; default: string; }; /** * 复制代码格式化方法 * * @default (text) => text */ formatCopiedText: { type: PropType<(text: string) => string>; default: (text: string) => string; }; /** * 某些预览主题的代码模块背景是暗色系 * 将这个属性设置为true,会自动在该主题下的light模式下使用暗色系的代码风格 * * @default true */ codeStyleReverse: { type: PropType<boolean>; default: boolean; }; /** * 需要自动调整的预览主题 * * @default ['default', 'mk-cute'] */ codeStyleReverseList: { type: PropType<Array<string>>; default: string[]; }; noHighlight: { type: PropType<boolean>; default: boolean; }; /** * 是否关闭编辑器默认的放大缩小功能 */ noImgZoomIn: { type: PropType<boolean>; default: boolean; }; /** * 自定义的图标 */ customIcon: { type: PropType<CustomIcon>; default: {}; }; sanitizeMermaid: { type: PropType<(h: string) => Promise<string>>; default: (h: string) => Promise<string>; }; /** * 是否开启折叠代码功能 * 不开启会使用div标签替代details标签 * * @default true */ codeFoldable: { type: PropType<boolean>; default: boolean; }; /** * 触发自动折叠代码的行数阈值 * * @default 30 */ autoFoldThreshold: { type: PropType<number>; default: number; }; /** * 内容重新挂载事件 * * 相比起onHtmlChanged,onRemount会在重新挂载后触发 */ onRemount: { type: PropType<() => void>; default: undefined; }; /** * 不使用 echarts */ noEcharts: { type: PropType<boolean>; default: boolean; }; previewComponent: { type: PropType<Component>; default: undefined; }; }; type ToolDirective = 'bold' | 'underline' | 'italic' | 'strikeThrough' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'quote' | 'unorderedList' | 'orderedList' | 'task' | 'codeRow' | 'code' | 'link' | 'image' | 'table' | 'sub' | 'sup' | 'prettier' | 'flow' | 'sequence' | 'gantt' | 'class' | 'state' | 'pie' | 'relationship' | 'journey' | 'katexInline' | 'katexBlock' | 'universal'; declare global { interface Window { hljs: any; prettier: any; prettierPlugins: any; Cropper: any; screenfull: any; mermaid: any; katex: any; echarts: any; } } interface ToolbarTips { bold?: string; underline?: string; italic?: string; strikeThrough?: string; title?: string; sub?: string; sup?: string; quote?: string; unorderedList?: string; orderedList?: string; task?: string; codeRow?: string; code?: string; link?: string; image?: string; table?: string; mermaid?: string; katex?: string; revoke?: string; next?: string; save?: string; prettier?: string; pageFullscreen?: string; fullscreen?: string; preview?: string; previewOnly?: string; htmlPreview?: string; catalog?: string; github?: string; '-'?: string; '='?: string; } interface StaticTextDefaultValue { toolbarTips?: ToolbarTips; titleItem?: { h1?: string; h2?: string; h3?: string; h4?: string; h5?: string; h6?: string; }; imgTitleItem?: { link: string; upload: string; clip2upload: string; }; linkModalTips?: { linkTitle?: string; imageTitle?: string; descLabel?: string; descLabelPlaceHolder?: string; urlLabel?: string; urlLabelPlaceHolder?: string; buttonOK?: string; }; clipModalTips?: { title?: string; buttonUpload?: string; }; copyCode?: { text?: string; successTips?: string; failTips?: string; }; mermaid?: { flow?: string; sequence?: string; gantt?: string; class?: string; state?: string; pie?: string; relationship?: string; journey?: string; }; katex?: { inline: string; block: string; }; footer?: { markdownTotal: string; scrollAuto: string; }; } interface StaticTextDefault { 'zh-CN': StaticTextDefaultValue; 'en-US': StaticTextDefaultValue; } type StaticTextDefaultKey = keyof StaticTextDefault; type ToolbarNames = keyof ToolbarTips | number; type Footers = '=' | 'markdownTotal' | 'scrollSwitch' | number; interface SettingType { pageFullscreen: boolean; fullscreen: boolean; preview: boolean; htmlPreview: boolean; previewOnly: boolean; } type Themes = 'light' | 'dark'; /** * 预览主题 * * @list ['default', 'github', 'vuepress', 'mk-cute', 'smart-blue', 'cyanosis'] */ type PreviewThemes = string; interface HeadList { text: string; level: 1 | 2 | 3 | 4 | 5 | 6; active?: boolean; line: number; currentToken?: Token; nextToken?: Token; } type MdHeadingId = (options: { text: string; level: number; index: number; currentToken?: Token; nextToken?: Token; }) => string; interface MermaidTemplate { /** * 流程图 */ flow?: string; /** * 时序图 */ sequence?: string; /** * 甘特图 */ gantt?: string; /** * 类图 */ class?: string; /** * 状态图 */ state?: string; /** * 饼图 */ pie?: string; /** * 关系图 */ relationship?: string; /** * 旅程图 */ journey?: string; } interface MarkdownItConfigPlugin { type: string; plugin: markdownit.PluginWithParams; options: any; } /** * CodeMirror扩展类型 * * ^6.0.0 */ interface CodeMirrorExtension { /** * 仅用来提供开发者分别不同扩展的依据 */ type: string; /** * CodeMirror的扩展 */ extension: Extension | ((options: any) => Extension); /** * 包裹扩展的Compartment,只有部分扩展有,提供扩展更新的能力 */ compartment?: Compartment; options?: any; } interface GlobalConfig { /** * 编辑器内部依赖库 */ editorExtensions: { highlight?: { instance?: any; js?: string; css?: CodeCss; }; prettier?: { prettierInstance?: any; parserMarkdownInstance?: any; standaloneJs?: string; parserMarkdownJs?: string; }; cropper?: { instance?: any; js?: string; css?: string; }; screenfull?: { instance?: any; js?: string; }; mermaid?: { instance?: any; js?: string; /** * 是否启用缩放功能 * * @default true */ enableZoom?: boolean; }; katex?: { instance?: any; js?: string; css?: string; }; echarts?: { instance?: any; js?: string; /** * 解析echarts代码块内容。 * * 默认实现会使用new Function以兼容官方配置中的函数写法;当内容来源不可信时, * 业务侧应通过该方法替换为更严格的解析策略。 */ parseOption?: (code: string, options: { editorId: string; element: HTMLElement; }) => any; }; }; /** * 对应editorExtensions中的cdn链接标签属性 * * 不要尝试在editorExtensionsAttrs定义script的src\onload\id,link的rel\href\id * 它们会被默认值覆盖 */ editorExtensionsAttrs: { highlight?: { js?: Partial<HTMLElementTagNameMap['script']>; css?: CodeCssAttrs; }; prettier?: { standaloneJs?: Partial<HTMLElementTagNameMap['script']>; parserMarkdownJs?: Partial<HTMLElementTagNameMap['script']>; }; cropper?: { js?: Partial<HTMLElementTagNameMap['script']>; css?: Partial<HTMLElementTagNameMap['link']>; }; screenfull?: { js?: Partial<HTMLElementTagNameMap['script']>; }; mermaid?: { js?: Partial<HTMLElementTagNameMap['script']>; }; katex?: { js?: Partial<HTMLElementTagNameMap['script']>; css?: Partial<HTMLElementTagNameMap['link']>; }; echarts?: { js?: Partial<HTMLElementTagNameMap['script']>; }; }; editorConfig: { /** * 自定义提示语言 */ languageUserDefined?: { [key: string]: StaticTextDefaultValue; }; /** * 自定义内部mermaid模块 */ mermaidTemplate?: MermaidTemplate; /** * 输入渲染延迟(ms) */ renderDelay?: number; /** * 内部的弹窗、下拉框等内联zIndex * @default 20000 */ zIndex?: number; }; /** * 根据主题和内部默认的codeMirror扩展自定义新的扩展 * * @params theme 当前主题 * @params innerExtensions 当前主题下的扩展列表 * [keymap, minimalSetup, markdown, EditorView.lineWrapping, EditorView.updateListener, EditorView.domEventHandlers, oneDark??oneLight] * [快捷键, 最低配置, markdown识别, 横向自动换行, 更新事件, dom监听事件, oneDark主题(暗夜模式下), oneLight(默认模式下)] * * @params keyBindings md-editor-v3内置的快捷键 */ codeMirrorExtensions: (extensions: Array<CodeMirrorExtension>, options: { editorId: string; theme: Themes; keyBindings: Array<KeyBinding>; }) => Array<CodeMirrorExtension>; /** * 自定义markdown-it核心库扩展、属性等 */ markdownItConfig: (md: markdownit, options: { editorId: string; }) => void; /** * 挑选编辑器已预设的markdownIt的扩展 * * @param plugins markdownIt的扩展,带编辑器已设定的属性 * @returns plugins */ markdownItPlugins: (plugins: Array<MarkdownItConfigPlugin>, options: { editorId: string; }) => Array<MarkdownItConfigPlugin>; /** * mermaid配置项 * * @param base * @returns */ mermaidConfig: (base: any) => any; /** * katex配置 * * @param baseConfig * @returns */ katexConfig: (baseConfig: any) => any; /** * echarts配置 * * @returns */ echartsConfig: (base: any) => any; } /** * 扩展编辑器内部功能,包括marked和一些内部依赖实例,如highlight、cropper等 */ type Config = (options: Partial<GlobalConfig>) => void; /** * 编辑器操作潜在的错误 */ interface InnerError { name: 'Cropper' | 'fullscreen' | 'prettier' | 'overlength' | 'mermaid'; message: string; data?: any; error?: Error; } interface CodeCss { [key: string]: { light: string; dark: string; }; } interface CodeCssAttrs { [key: string]: { light: Partial<HTMLElementTagNameMap['link']>; dark: Partial<HTMLElementTagNameMap['link']>; }; } type UpdateSetting = (k: keyof SettingType, v?: boolean) => void; type ChangeEvent = (v: string) => void; type SaveEvent = (v: string, h: Promise<string>) => void; type UploadImgCallBackParam = string[] | Array<{ url: string; alt: string; title: string; }>; type UploadImgCallBack = (urls: UploadImgCallBackParam) => void; type UploadImgEvent = (files: Array<File>, callBack: UploadImgCallBack) => void; type HtmlChangedEvent = (h: string) => void; type GetCatalogEvent = (list: HeadList[]) => void; type ErrorEvent = (err: InnerError) => void; interface ExposeEvent { pageFullscreen(status: boolean): void; fullscreen(status: boolean): void; preview(status: boolean): void; previewOnly(status: boolean): void; htmlPreview(status: boolean): void; catalog(status: boolean): void; } type DOMEventHandlers = { [e in keyof HTMLElementEventMap]?: (event: HTMLElementEventMap[e], view: EditorView) => boolean | void; }; interface InsertParam { targetValue: string; select?: boolean; deviationStart?: number; deviationEnd?: number; } /** * 插入的内容的构造函数 */ type InsertContentGenerator = (selectedText: string) => InsertParam; /** * 插入内容的通用函数类型 */ type Insert = (generate: InsertContentGenerator) => void; type FocusOption = 'start' | 'end' | { rangeAnchor?: number; rangeHead?: number; cursorPos: number; }; interface ExposeParam { /** * 添加事件监听 * * @param eventName 事件名称 * @param callBack 事件回调函数 */ on<E extends keyof ExposeEvent, C extends ExposeEvent[E]>(eventName: E, callBack: C): void; /** * 切换页面内全屏 * * @param status 是否页面全屏 */ togglePageFullscreen(status?: boolean): void; /** * 切换屏幕全屏 * * @param status 是否屏幕全屏 */ toggleFullscreen(status?: boolean): void; /** * 切换是否显示预览 * * @param status 是否显示预览 */ togglePreview(status?: boolean): void; togglePreviewOnly(status?: boolean): void; /** * 切换是否显示html预览 * * @param status html预览状态 */ toggleHtmlPreview(status?: boolean): void; /** * 切换是否显示目录 * * @param status 是否显示目录,不设置默认相反 */ toggleCatalog(status?: boolean): void; /** * 触发保存 */ triggerSave(): void; /** * 手动向文本框插入内容 * * @param {Function} generate 构造插入内容方法 * 构造方法提供「当前选中」的内容为入参 * 返回「待插入内容」和插入的属性 * 入参 selectedText 当前选中的内容 * * targetValue 待插入内容 * select 插入后是否自动选中内容 * deviationStart 插入后选中位置的开始偏移量 * deviationEnd 插入后选中位置的结束偏移量 * */ insert: Insert; /** * 手动聚焦 * * @param options 聚焦时光标的位置,不提供默认上次失焦时的位置 */ focus(options?: FocusOption): void; /** * 手动重新渲染 */ rerender(): void; /** * 获取当前选中的文本 */ getSelectedText(): string | undefined; /** * 重置已经存在的历史记录 */ resetHistory(): void; /** * codemirror事件 * * @param handlers */ domEventHandlers(handlers: DOMEventHandlers): void; /** * 执行内部插入命令 * * @param direct */ execCommand(direct: ToolDirective): void; /** * 获取编辑器实例 */ getEditorView(): EditorView | undefined; } type ExposePreviewParam = Pick<ExposeParam, 'rerender'>; type EditorProps = Readonly<LooseRequired<Readonly<ExtractPropTypes<typeof editorProps>>>>; type MdPreviewProps = Readonly<LooseRequired<Readonly<ExtractPropTypes<typeof mdPreviewProps>>>>; type EditorEmits = Array<'onChange' | 'onSave' | 'onUploadImg' | 'onHtmlChanged' | 'onGetCatalog' | 'onError' | 'update:modelValue' | 'onBlur' | 'onFocus' | 'onInput' | 'onDrop' | 'oninputBoxWidthChange' | 'onRemount'>; type EditorContext = SetupContext<EditorEmits>; type CustomStrIcon = { copy?: string; 'collapse-tips'?: string; pin?: string; 'pin-off'?: string; check?: string; }; /** * 自定义图标的数据类型 */ type CustomIcon = { [key in IconName]?: { component: Component | VNode | string; props?: { [key: string | number | symbol]: any; }; }; } & CustomStrIcon; declare const Editor: vue.DefineComponent<vue.ExtractPropTypes<{ onSave: { type: vue.PropType<SaveEvent>; default: undefined; }; onUploadImg: { type: vue.PropType<UploadImgEvent>; default: undefined; }; pageFullscreen: { type: vue.PropType<boolean>; default: boolean; }; preview: { type: vue.PropType<boolean>; default: boolean; }; htmlPreview: { type: vue.PropType<boolean>; default: boolean; }; toolbars: { type: vue.PropType<Array<ToolbarNames>>; default: string[]; }; floatingToolbars: { type: vue.PropType<Array<ToolbarNames>>; default: never[]; }; toolbarsExclude: { type: vue.PropType<Array<ToolbarNames>>; default: never[]; }; noPrettier: { type: vue.PropType<boolean>; default: boolean; }; tabWidth: { type: vue.PropType<number>; default: number; }; tableShape: { type: vue.PropType<Array<number>>; default: number[]; }; placeholder: { type: vue.PropType<string>; default: string; }; defToolbars: { type: vue.PropType<string | vue.VNode>; default: undefined; }; onError: { type: vue.PropType<ErrorEvent>; default: undefined; }; footers: { type: vue.PropType<Array<Footers>>; default: Footers[]; }; scrollAuto: { type: vue.PropType<boolean>; default: boolean; }; defFooters: { type: vue.PropType<string | vue.VNode>; default: undefined; }; noUploadImg: { type: vue.PropType<boolean>; default: boolean; }; autoFocus: { type: vue.PropType<boolean>; default: boolean; }; disabled: { type: vue.PropType<boolean>; default: boolean; }; readOnly: { type: vue.PropType<boolean>; default: boolean; }; maxLength: { type: vue.PropType<number>; default: undefined; }; autoDetectCode: { type: vue.PropType<boolean>; default: boolean; }; onBlur: { type: vue.PropType<(event: FocusEvent) => void>; default: undefined; }; onFocus: { type: vue.PropType<(event: FocusEvent) => void>; default: undefined; }; completions: { type: vue.PropType<Array<_codemirror_autocomplete.CompletionSource>>; default: undefined; }; showToolbarName: { type: vue.PropType<boolean>; default: boolean; }; onInput: { type: vue.PropType<(event: Event) => void>; default: undefined; }; onDrop: { type: vue.PropType<(event: DragEvent) => void>; default: undefined; }; inputBoxWidth: { type: vue.PropType<string>; default: string; }; oninputBoxWidthChange: { type: vue.PropType<(width: string) => void>; default: undefined; }; transformImgUrl: { type: vue.PropType<(t: string) => string | Promise<string>>; default: (t: string) => string; }; catalogLayout: { type: vue.PropType<"fixed" | "flat">; default: string; }; catalogMaxDepth: { type: vue.PropType<number>; default: undefined; }; modelValue: { type: vue.PropType<string>; default: string; }; onChange: { type: vue.PropType<ChangeEvent>; default: undefined; }; theme: { type: vue.PropType<Themes>; default: string; }; class: { type: StringConstructor; default: string; }; language: { type: vue.PropType<string>; default: string; }; onHtmlChanged: { type: vue.PropType<HtmlChangedEvent>; default: undefined; }; onGetCatalog: { type: vue.PropType<GetCatalogEvent>; default: undefined; }; editorId: { type: vue.PropType<string>; default: undefined; }; id: { type: vue.PropType<string>; default: undefined; }; showCodeRowNumber: { type: vue.PropType<boolean>; default: boolean; }; previewTheme: { type: vue.PropType<PreviewThemes>; default: string; }; style: { type: vue.PropType<vue.CSSProperties | string>; default: () => {}; }; mdHeadingId: { type: vue.PropType<MdHeadingId>; default: MdHeadingId; }; sanitize: { type: vue.PropType<(html: string) => string>; default: (html: string) => string; }; noMermaid: { type: vue.PropType<boolean>; default: boolean; }; noKatex: { type: vue.PropType<boolean>; default: boolean; }; codeTheme: { type: vue.PropType<string>; default: string; }; formatCopiedText: { type: vue.PropType<(text: string) => string>; default: (text: string) => string; }; codeStyleReverse: { type: vue.PropType<boolean>; default: boolean; }; codeStyleReverseList: { type: vue.PropType<Array<string>>; default: string[]; }; noHighlight: { type: vue.PropType<boolean>; default: boolean; }; noImgZoomIn: { type: vue.PropType<boolean>; default: boolean; }; customIcon: { type: vue.PropType<CustomIcon>; default: {}; }; sanitizeMermaid: { type: vue.PropType<(h: string) => Promise<string>>; default: (h: string) => Promise<string>; }; codeFoldable: { type: vue.PropType<boolean>; default: boolean; }; autoFoldThreshold: { type: vue.PropType<number>; default: number; }; onRemount: { type: vue.PropType<() => void>; default: undefined; }; noEcharts: { type: vue.PropType<boolean>; default: boolean; }; previewComponent: { type: vue.PropType<vue.Component>; default: undefined; }; }>, () => vue_jsx_runtime.JSX.Element, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, EditorEmits, "onChange" | "onSave" | "onUploadImg" | "onHtmlChanged" | "onGetCatalog" | "onError" | "update:modelValue" | "onBlur" | "onFocus" | "onInput" | "onDrop" | "oninputBoxWidthChange" | "onRemount", vue.PublicProps, Readonly<vue.ExtractPropTypes<{ onSave: { type: vue.PropType<SaveEvent>; default: undefined; }; onUploadImg: { type: vue.PropType<UploadImgEvent>; default: undefined; }; pageFullscreen: { type: vue.PropType<boolean>; default: boolean; }; preview: { type: vue.PropType<boolean>; default: boolean; }; htmlPreview: { type: vue.PropType<boolean>; default: boolean; }; toolbars: { type: vue.PropType<Array<ToolbarNames>>; default: string[]; }; floatingToolbars: { type: vue.PropType<Array<ToolbarNames>>; default: never[]; }; toolbarsExclude: { type: vue.PropType<Array<ToolbarNames>>; default: never[]; }; noPrettier: { type: vue.PropType<boolean>; default: boolean; }; tabWidth: { type: vue.PropType<number>; default: number; }; tableShape: { type: vue.PropType<Array<number>>; default: number[]; }; placeholder: { type: vue.PropType<string>; default: string; }; defToolbars: { type: vue.PropType<string | vue.VNode>; default: undefined; }; onError: { type: vue.PropType<ErrorEvent>; default: undefined; }; footers: { type: vue.PropType<Array<Footers>>; default: Footers[]; }; scrollAuto: { type: vue.PropType<boolean>; default: boolean; }; defFooters: { type: vue.PropType<string | vue.VNode>; default: undefined; }; noUploadImg: { type: vue.PropType<boolean>; default: boolean; }; autoFocus: { type: vue.PropType<boolean>; default: boolean; }; disabled: { type: vue.PropType<boolean>; default: boolean; }; readOnly: { type: vue.PropType<boolean>; default: boolean; }; maxLength: { type: vue.PropType<number>; default: undefined; }; autoDetectCode: { type: vue.PropType<boolean>; default: boolean; }; onBlur: { type: vue.PropType<(event: FocusEvent) => void>; default: undefined; }; onFocus: { type: vue.PropType<(event: FocusEvent) => void>; default: undefined; }; completions: { type: vue.PropType<Array<_codemirror_autocomplete.CompletionSource>>; default: undefined; }; showToolbarName: { type: vue.PropType<boolean>; default: boolean; }; onInput: { type: vue.PropType<(event: Event) => void>; default: undefined; }; onDrop: { type: vue.PropType<(event: DragEvent) => void>; default: undefined; }; inputBoxWidth: { type: vue.PropType<string>; default: string; }; oninputBoxWidthChange: { type: vue.PropType<(width: string) => void>; default: undefined; }; transformImgUrl: { type: vue.PropType<(t: string) => string | Promise<string>>; default: (t: string) => string; }; catalogLayout: { type: vue.PropType<"fixed" | "flat">; default: string; }; catalogMaxDepth: { type: vue.PropType<number>; default: undefined; }; modelValue: { type: vue.PropType<string>; default: string; }; onChange: { type: vue.PropType<ChangeEvent>; default: undefined; }; theme: { type: vue.PropType<Themes>; default: string; }; class: { type: StringConstructor; default: string; }; language: { type: vue.PropType<string>; default: string; }; onHtmlChanged: { type: vue.PropType<HtmlChangedEvent>; default: undefined; }; onGetCatalog: { type: vue.PropType<GetCatalogEvent>; default: undefined; }; editorId: { type: vue.PropType<string>; default: undefined; }; id: { type: vue.PropType<string>; default: undefined; }; showCodeRowNumber: { type: vue.PropType<boolean>; default: boolean; }; previewTheme: { type: vue.PropType<PreviewThemes>; default: string; }; style: { type: vue.PropType<vue.CSSProperties | string>; default: () => {}; }; mdHeadingId: { type: vue.PropType<MdHeadingId>; default: MdHeadingId; }; sanitize: { type: vue.PropType<(html: string) => string>; default: (html: string) => string; }; noMermaid: { type: vue.PropType<boolean>; default: boolean; }; noKatex: { type: vue.PropType<boolean>; default: boolean; }; codeTheme: { type: vue.PropType<string>; default: string; }; formatCopiedText: { type: vue.PropType<(text: string) => string>; default: (text: string) => string; }; codeStyleReverse: { type: vue.PropType<boolean>; default: boolean; }; codeStyleReverseList: { type: vue.PropType<Array<string>>; default: string[]; }; noHighlight: { type: vue.PropType<boolean>; default: boolean; }; noImgZoomIn: { type: vue.PropType<boolean>; default: boolean; }; customIcon: { type: vue.PropType<CustomIcon>; default: {}; }; sanitizeMermaid: { type: vue.PropType<(h: string) => Promise<string>>; default: (h: string) => Promise<string>; }; codeFoldable: { type: vue.PropType<boolean>; default: boolean; }; autoFoldThreshold: { type: vue.PropType<number>; default: number; }; onRemount: { type: vue.PropType<() => void>; default: undefined; }; noEcharts: { type: vue.PropType<boolean>; default: boolean; }; previewComponent: { type: vue.PropType<vue.Component>; default: undefined; }; }>> & Readonly<{ onOnChange?: ((...args: any[]) => any) | undefined; onOnSave?: ((...args: any[]) => any) | undefined; onOnUploadImg?: ((...args: any[]) => any) | undefined; onOnHtmlChanged?: ((...args: any[]) => any) | undefined; onOnGetCatalog?: ((...args: any[]) => any) | undefined; onOnError?: ((...args: any[]) => any) | undefined; "onUpdate:modelValue"?: ((...args: any[]) => any) | undefined; onOnBlur?: ((...args: any[]) => any) | undefined; onOnFocus?: ((...args: any[]) => any) | undefined; onOnInput?: ((...args: any[]) => any) | undefined; onOnDrop?: ((...args: any[]) => any) | undefined; onOninputBoxWidthChange?: ((...args: any[]) => any) | undefined; onOnRemount?: ((...args: any[]) => any) | undefined; }>, { preview: boolean; pageFullscreen: boolean; htmlPreview: boolean; onChange: ChangeEvent; onSave: SaveEvent; onUploadImg: UploadImgEvent; onHtmlChanged: HtmlChangedEvent; onGetCatalog: GetCatalogEvent; onError: ErrorEvent; onBlur: (event: FocusEvent) => void; onFocus: (event: FocusEvent) => void; onInput: (event: Event) => void; onDrop: (event: DragEvent) => void; oninputBoxWidthChange: (width: string) => void; onRemount: () => void; toolbars: ToolbarNames[]; floatingToolbars: ToolbarNames[]; toolbarsExclude: ToolbarNames[]; noPrettier: boolean; tabWidth: number; tableShape: number[]; placeholder: string; defToolbars: string | vue.VNode<vue.RendererNode, vue.RendererElement, { [key: string]: any; }>; footers: Footers[]; scrollAuto: boolean; defFooters: string | vue.VNode<vue.RendererNode, vue.RendererElement, { [key: string]: any; }>; noUploadImg: boolean; autoFocus: boolean; disabled: boolean; readOnly: boolean; maxLength: number; autoDetectCode: boolean; completions: _codemirror_autocomplete.CompletionSource[]; showToolbarName: boolean; inputBoxWidth: string; transformImgUrl: (t: string) => string | Promise<string>; catalogLayout: "fixed" | "flat"; catalogMaxDepth: number; modelValue: string; theme: Themes; class: string; language: string; editorId: string; id: string; showCodeRowNumber: boolean; previewTheme: string; style: string | vue.CSSProperties; mdHeadingId: MdHeadingId; sanitize: (html: string) => string; noMermaid: boolean; noKatex: boolean; codeTheme: string; formatCopiedText: (text: string) => string; codeStyleReverse: boolean; codeStyleReverseList: string[]; noHighlight: boolean; noImgZoomIn: boolean; customIcon: CustomIcon; sanitizeMermaid: (h: string) => Promise<string>; codeFoldable: boolean; autoFoldThreshold: number; noEcharts: boolean; previewComponent: vue.Component; }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>; declare const _default$c: typeof Editor & { install: (app: App) => App; }; declare const _default$b: vue.DefineComponent<vue.ExtractPropTypes<{ title: { type: PropType<string>; default: string; }; /** * 展示在工具栏的内容,通常是个图标 * * @deprecated 使用默认插槽代替 */ trigger: { type: PropType<string | VNode>; default: undefined; }; onClick: { type: PropType<(e: MouseEvent) => void>; default: undefined; }; /** * ==没有意义,仅用于规避克隆组件自动嵌入insert方法时,传入的是该组件而产生的waring */ insert: { type: PropType<() => void>; default: undefined; }; language: { type: PropType<string>; default: undefined; }; theme: { type: PropType<Themes>; default: undefined; }; previewTheme: { type: PropType<PreviewThemes>; default: undefined; }; codeTheme: { type: PropType<string>; default: undefined; }; disabled: { type: PropType<boolean>; default: undefined; }; showToolbarName: { type: PropType<boolean>; default: undefined; }; }>, () => vue_jsx_runtime.JSX.Element, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, "onClick"[], "onClick", vue.PublicProps, Readonly<vue.ExtractPropTypes<{ title: { type: PropType<string>; default: string; }; /** * 展示在工具栏的内容,通常是个图标 * * @deprecated 使用默认插槽代替 */ trigger: { type: PropType<string | VNode>; default: undefined; }; onClick: { type: PropType<(e: MouseEvent) => void>; default: undefined; }; /** * ==没有意义,仅用于规避克隆组件自动嵌入insert方法时,传入的是该组件而产生的waring */ insert: { type: PropType<() => void>; default: undefined; }; language: { type: PropType<string>; default: undefined; }; theme: { type: PropType<Themes>; default: undefined; }; previewTheme: { type: PropType<PreviewThemes>; default: undefined; }; codeTheme: { type: PropType<string>; default: undefined; }; disabled: { type: PropType<boolean>; default: undefined; }; showToolbarName: { type: PropType<boolean>; default: undefined; }; }>> & Readonly<{ onOnClick?: ((...args: any[]) => any) | undefined; }>, { title: string; disabled: boolean; showToolbarName: boolean; theme: Themes; language: string; previewTheme: string; codeTheme: string; trigger: string | VNode<vue.RendererNode, vue.RendererElement, { [key: string]: any; }>; insert: () => void; onClick: (e: MouseEvent) => void; }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>; declare const _default$a: typeof _default$b & { install: (app: App) => App; }; declare const _default$9: vue.DefineComponent<vue.ExtractPropTypes<{ title: { type: PropType<string>; default: string; }; visible: { type: PropType<boolean>; default: undefined; }; /** * 展示在工具栏的内容,通常是个图标 * * @deprecated 使用默认插槽代替 */ trigger: { type: PropType<string | VNode>; default: undefined; }; onChange: { type: PropType<(visible: boolean) => void>; default: undefined; }; overlay: { type: PropType<string | VNode>; default: undefined; }; /** * ==没有意义,仅用于规避克隆组件自动嵌入insert方法时,传入的是该组件而产生的waring */ insert: { type: PropType<() => void>; default: undefined; }; language: { type: PropType<string>; default: undefined; }; theme: { type: PropType<Themes>; default: undefined; }; previewTheme: { type: PropType<PreviewThemes>; default: undefined; }; codeTheme: { type: PropType<string>; default: undefined; }; disabled: { type: PropType<boolean>; default: undefined; }; showToolbarName: { type: PropType<boolean>; default: undefined; }; }>, () => vue_jsx_runtime.JSX.Element, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, "onChange"[], "onChange", vue.PublicProps, Readonly<vue.ExtractPropTypes<{ title: { type: PropType<string>; default: string; }; visible: { type: PropType<boolean>; default: undefined; }; /** * 展示在工具栏的内容,通常是个图标 * * @deprecated 使用默认插槽代替 */ trigger: { type: PropType<string | VNode>; default: undefined; }; onChange: { type: PropType<(visible: boolean) => void>; default: undefined; }; overlay: { type: PropType<string | VNode>; default: undefined; }; /** * ==没有意义,仅用于规避克隆组件自动嵌入insert方法时,传入的是该组件而产生的waring */ insert: { type: PropType<() => void>; default: undefined; }; language: { type: PropType<string>; default: undefined; }; theme: { type: PropType<Themes>; default: undefined; }; previewTheme: { type: PropType<PreviewThemes>; default: undefined; }; codeTheme: { type: PropType<string>; default: undefined; }; disabled: { type: PropType<boolean>; default: undefined; }; showToolbarName: { type: PropType<boolean>; default: undefined; }; }>> & Readonly<{ onOnChange?: ((...args: any[]) => any) | undefined; }>, { title: string; onChange: (visible: boolean) => void; disabled: boolean; showToolbarName: boolean; theme: Themes; language: string; previewTheme: string; codeTheme: string; visible: boolean; trigger: string | VNode<vue.RendererNode, vue.RendererElement, { [key: string]: any; }>; overlay: string | VNode<vue.RendererNode, vue.RendererElement, { [key: string]: any; }>; insert: () => void; }, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>; declare const _default$8: typeof _default$9 & { install: (app: App) => App; }; declare const _default$7: vue.DefineComponent<vue.ExtractPropTypes<{ title: { type: PropType<string>; default: string; }; modalTitle: { type: PropType<string | VNode>; default: string; }; visible: { type: PropTyp