You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

192 lines
5.2 KiB

import './assets/css/index.css'
import { IEditorData, IEditorOption, IEditorResult } from './interface/Editor'
import { IElement } from './interface/Element'
import { Draw } from './core/draw/Draw'
import { Command } from './core/command/Command'
import { CommandAdapt } from './core/command/CommandAdapt'
import { Listener } from './core/listener/Listener'
import { RowFlex } from './dataset/enum/Row'
import { ImageDisplay } from './dataset/enum/Common'
import { ElementType } from './dataset/enum/Element'
import { formatElementList } from './utils/element'
import { Register } from './core/register/Register'
import { ContextMenu } from './core/contextmenu/ContextMenu'
import {
IContextMenuContext,
IRegisterContextMenu
} from './interface/contextmenu/ContextMenu'
import {
EditorComponent,
EditorZone,
EditorMode,
PageMode,
PaperDirection,
WordBreak,
RenderMode
} from './dataset/enum/Editor'
import { EDITOR_COMPONENT } from './dataset/constant/Editor'
import { IWatermark } from './interface/Watermark'
import { ControlIndentation, ControlType } from './dataset/enum/Control'
import { INavigateInfo } from './core/draw/interactive/Search'
import { Shortcut } from './core/shortcut/Shortcut'
import { KeyMap } from './dataset/enum/KeyMap'
import { BlockType } from './dataset/enum/Block'
import { IBlock } from './interface/Block'
import { ILang } from './interface/i18n/I18n'
import { VerticalAlign } from './dataset/enum/VerticalAlign'
import { TableBorder, TdBorder, TdSlash } from './dataset/enum/table/Table'
import { MaxHeightRatio, NumberType } from './dataset/enum/Common'
import { TitleLevel } from './dataset/enum/Title'
import { ListStyle, ListType } from './dataset/enum/List'
import { ICatalog, ICatalogItem } from './interface/Catalog'
import { Plugin } from './core/plugin/Plugin'
import { UsePlugin } from './interface/Plugin'
import { EventBus } from './core/event/eventbus/EventBus'
import { EventBusMap } from './interface/EventBus'
import { IRangeStyle } from './interface/Listener'
import { Override } from './core/override/Override'
import { LETTER_CLASS } from './dataset/constant/Common'
import { INTERNAL_CONTEXT_MENU_KEY } from './dataset/constant/ContextMenu'
import { IRange } from './interface/Range'
import { deepClone, splitText } from './utils'
import { BackgroundRepeat, BackgroundSize } from './dataset/enum/Background'
import { TextDecorationStyle } from './dataset/enum/Text'
import { mergeOption } from './utils/option'
export default class Editor {
public command: Command
public listener: Listener
public eventBus: EventBus<EventBusMap>
public override: Override
public register: Register
public destroy: () => void
public use: UsePlugin
constructor(
container: HTMLDivElement,
data: IEditorData | IElement[],
options: IEditorOption = {}
) {
// 合并配置
const editorOptions = mergeOption(options)
// 数据处理
data = deepClone(data)
let headerElementList: IElement[] = []
let mainElementList: IElement[] = []
let footerElementList: IElement[] = []
if (Array.isArray(data)) {
mainElementList = data
} else {
headerElementList = data.header || []
mainElementList = data.main
footerElementList = data.footer || []
}
const pageComponentData = [
headerElementList,
mainElementList,
footerElementList
]
pageComponentData.forEach(elementList => {
formatElementList(elementList, {
editorOptions
})
})
// 监听
this.listener = new Listener()
// 事件
this.eventBus = new EventBus<EventBusMap>()
// 重写
this.override = new Override()
// 启动
const draw = new Draw(
container,
editorOptions,
{
header: headerElementList,
main: mainElementList,
footer: footerElementList
},
this.listener,
this.eventBus,
this.override
)
// 命令
this.command = new Command(new CommandAdapt(draw))
// 菜单
const contextMenu = new ContextMenu(draw, this.command)
// 快捷键
const shortcut = new Shortcut(draw, this.command)
// 注册
this.register = new Register({
contextMenu,
shortcut,
i18n: draw.getI18n()
})
// 注册销毁方法
this.destroy = () => {
draw.destroy()
shortcut.removeEvent()
contextMenu.removeEvent()
}
// 插件
const plugin = new Plugin(this)
this.use = plugin.use.bind(plugin)
}
}
// 对外方法
export { splitText }
// 对外常量
export { EDITOR_COMPONENT, LETTER_CLASS, INTERNAL_CONTEXT_MENU_KEY }
// 对外枚举
export {
Editor,
RowFlex,
VerticalAlign,
EditorZone,
EditorMode,
ElementType,
ControlType,
EditorComponent,
PageMode,
RenderMode,
ImageDisplay,
Command,
KeyMap,
BlockType,
PaperDirection,
TableBorder,
TdBorder,
TdSlash,
MaxHeightRatio,
NumberType,
TitleLevel,
ListType,
ListStyle,
WordBreak,
ControlIndentation,
BackgroundRepeat,
BackgroundSize,
TextDecorationStyle
}
// 对外类型
export type {
IElement,
IEditorData,
IEditorOption,
IEditorResult,
IContextMenuContext,
IRegisterContextMenu,
IWatermark,
INavigateInfo,
IBlock,
ILang,
ICatalog,
ICatalogItem,
IRange,
IRangeStyle
}