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
TypeScript
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