# canvas-editor-mixin
**Repository Path**: fweb/canvas-editor-mixin
## Basic Information
- **Project Name**: canvas-editor-mixin
- **Description**: a rich text editor by canvas/svg
fork By canvas-editor
- **Primary Language**: TypeScript
- **License**: MIT
- **Default Branch**: mixin
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2024-03-21
- **Last Updated**: 2024-03-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# canvas-editor-mixin
介绍:
基于canvas/svg的富文本编辑器,所见即所得的富文本编辑器。fork by @Hufe921/[canvas-editor](https://github.com/Hufe921/canvas-editor)

## 说明:
1、基于[canvas-editor](https://github.com/Hufe921/canvas-editor)定制化程度高为个人试炼项目,增加表格分页功能,复选框,文本框、图像框等组件和功能,部分功能与原作者一致但是实现方式不一致。
2、光标及文字排版的完全自行实现。无需依赖其他三方插件,有手就行。绘制底层也由 SVG 渲染,借助 PDFJS 完成 pdf 的绘制
3、轻量的数据结构,选型使用canvas进行开发,方便排版分页处理。
4、工具项目自身无界面,需demo引用使用。可打包成NPM包供其他项目引入使用。
## 引入指南:
1、准备一个容器:
```html
```
2、初始化编辑器:
```typescript
const container = document.querySelector('.editor')!
const instance = new Editor(container)
```
3、加载模板内容:
```typescript
const payload= {
header: [
{
value: 'Header'
}
],
main: [
{
value: 'Hello World'
}
],
footer: [
{
value: 'canvas-editor',
size: 12
}
]
}
instance.command.executeSetValue(payload);
```
## 完整配置
```typescript
interface IEditorOption {
mode?: EditorMode // 编辑器模式:编辑、清洁(不显示视觉辅助元素。如:分页符)、只读、表单(仅控件内可编辑)、打印(不显示辅助元素、未书写控件及前后括号)。默认:编辑
defaultType?: string // 默认元素类型。默认:TEXT
defaultColor?: string // 默认字体颜色。默认:#000000
defaultFont?: string // 默认字体。默认:Microsoft YaHei
defaultSize?: number // 默认字号。默认:16
minSize?: number // 最小字号。默认:5
maxSize?: number // 最大字号。默认:72
defaultBasicRowMarginHeight?: number // 默认行高。默认:8
defaultRowMargin?: number // 默认行间距。默认:1
defaultTabWidth?: number // 默认tab宽度。默认:32
width?: number // 纸张宽度。默认:794
height?: number // 纸张高度。默认:1123
scale?: number // 缩放比例。默认:1
pageGap?: number // 纸张间隔。默认:20
underlineColor?: string // 下划线颜色。默认:#000000
strikeoutColor?: string // 删除线颜色。默认:#FF0000
rangeColor?: string // 选区颜色。默认:#AECBFA
rangeAlpha?: number // 选区透明度。默认:0.6
rangeMinWidth?: number // 选区最小宽度。默认:5
searchMatchColor?: string // 搜索高亮颜色。默认:#FFFF00
searchNavigateMatchColor?: string // 搜索导航高亮颜色。默认:#AAD280
searchMatchAlpha?: number // 搜索高亮透明度。默认:0.6
highlightAlpha?: number // 高亮元素透明度。默认:0.6
resizerColor?: string // 图片尺寸器颜色。默认:#4182D9
resizerSize?: number // 图片尺寸器大小。默认:5
marginIndicatorSize?: number // 页边距指示器长度。默认:35
marginIndicatorColor?: string // 页边距指示器颜色。默认:#BABABA
margins?: IMargin // 页面边距。默认:[100, 120, 100, 120]
pageMode?: PageMode // 纸张模式:连页、分页。默认:分页
tdPadding?: IPadding // 单元格内边距。默认:[0, 5, 5, 5]
defaultTrMinHeight?: number // 默认表格行最小高度。默认:42
defaultColMinWidth?: number // 默认表格列最小宽度(整体宽度足够时应用,否则会按比例缩小)。默认:40
defaultHyperlinkColor?: string // 默认超链接颜色。默认:#0000FF
header?: IHeader // 页眉信息。{top?:number; maxHeightRadio?:MaxHeightRatio;}
footer?: IFooter // 页脚信息。{bottom?:number; maxHeightRadio?:MaxHeightRatio;}
pageNumber?: IPageNumber // 页码信息。{bottom:number; size:number; font:string; color:string; rowFlex:RowFlex; format:string; numberType:NumberType;}
paperDirection?: PaperDirection // 纸张方向:纵向、横向
inactiveAlpha?: number // 正文内容失焦时透明度。默认值:0.6
historyMaxRecordCount?: number // 历史(撤销重做)最大记录次数。默认:100次
printPixelRatio?: number // 打印像素比率(值越大越清晰,但尺寸越大)。默认:3
maskMargin?: IMargin // 编辑器上的遮盖边距(如悬浮到编辑器上的菜单栏、底部工具栏)。默认:[0, 0, 0, 0]
letterClass?: string[] // 排版支持的字母类。默认:a-zA-Z。内置可选择的字母表类:LETTER_CLASS
contextMenuDisableKeys?: string[] // 禁用的右键菜单。默认:[]
scrollContainerSelector?: string // 滚动区域选择器。默认:document
wordBreak?: WordBreak // 单词与标点断行:BREAK_WORD首行不出现标点&单词不拆分、BREAK_ALL按字符宽度撑满后折行。默认:BREAK_WORD
watermark?: IWatermark // 水印信息。{data:string; color?:string; opacity?:number; size?:number; font?:string;}
control?: IControlOption // 控件信息。 {placeholderColor?:string; bracketColor?:string; prefix?:string; postfix?:string;}
checkbox?: ICheckboxOption // 复选框信息。{width?:number; height?:number; gap?:number; lineWidth?:number; fillStyle?:string; fontStyle?: string;}
cursor?: ICursorOption // 光标样式。{width?: number; color?: string; dragWidth?: number; dragColor?: string;}
title?: ITitleOption // 标题配置。{ defaultFirstSize?: number; defaultSecondSize?: number; defaultThirdSize?: number defaultFourthSize?: number; defaultFifthSize?: number; defaultSixthSize?: number;}
placeholder?: IPlaceholder // 编辑器空白占位文本
group?: IGroup // 成组配置。{opacity?:number; backgroundColor?:string; activeOpacity?:number; activeBackgroundColor?:string; disabled?:boolean}
pageBreak?: IPageBreak // 分页符配置。{font?:string; fontSize?:number; lineDash?:number[];}
zone?: IZoneOption // 编辑器区域配置。{tipDisabled?:boolean;}
background?: IBackgroundOption // 背景配置。{color?:string; image?:string; size?:BackgroundSize; repeat?:BackgroundRepeat;}。默认:{color: '#FFFFFF'}
queryData?: IQueryData // 默认模版数据配置。{template:IEditorData; imageList:IElement[]; commentList:IComment[]; queryData:Record}
}
```
## 页眉配置
```typescript
interface IHeader {
top?: number // 距离页面顶部大小。默认:30
maxHeightRadio?: MaxHeightRatio // 占页面最大高度比。默认:HALF
disabled?: boolean // 是否禁用
}
```
## 页脚配置
```typescript
interface IFooter {
bottom?: number // 距离页面底部大小。默认:30
maxHeightRadio?: MaxHeightRatio // 占页面最大高度比。默认:HALF
disabled?: boolean // 是否禁用
}
```
##页码设置
```typescript
interface IPageNumber {
bottom?: number // 距离页面底部大小。默认:60
size?: number // 字体大小。默认:12
font?: string // 字体。默认:Microsoft YaHei
color?: string // 字体颜色。默认:#000000
rowFlex?: RowFlex // 行对齐方式。默认:CENTER
format?: string // 页码格式。默认:{pageNo}。示例:第{pageNo}页/共{pageCount}页
numberType?: NumberType // 数字类型。默认:ARABIC
disabled?: boolean // 是否禁用
startPageNo?: number // 起始页码。默认:1
fromPageNo?: number // 从第几页开始出现页码。默认:0
}
```
##水印设置
```typescript
interface IWatermark {
data: string // 文本。
color?: string // 颜色。默认:#AEB5C0
opacity?: number // 透明度。默认:0.3
size?: number // 字体大小。默认:200
font?: string // 字体。默认:Microsoft YaHei
}
```
##占位文本配置
```typescript
interface IPlaceholder {
data: string // 文本。
color?: string // 颜色。默认:#DCDFE6
opacity?: number // 透明度。默认:1
size?: number // 字体大小。默认:16
font?: string // 字体。默认:Microsoft YaHei
}
```
#编排
## 编排是什么
所谓编排,即将设计器中的所有物料,进行布局设置、组件设置、交互设置(JS 编写/逻辑编排)后,形成符合业务诉求的 schema 描述。在真实场景,节点数可能有成百上千,每个节点都具有新增、删除、修改、移动、插入子节点等操作,同时还有若干约束,仿 DOM 设计使用JSON 结构操作 节点模型 & 属性模型 方式来编排。每次编排动作后,都需要实时的渲染出视图。
至此,我们已经完成了**编排模块最基础的功能**,接下来,就是完善细节,逐步丰满功能。比如:
1. 编排面板的整体功能区划分设计;
2. 节点属性设计;节点删除、移动等操作设计;容器节点设计;
3. 节点拖拽功能、拖拽定位设计和实现;
4. 节点在画布上的辅助功能,比如 hover、选中、选中时的操作项、resize、拖拽占位符等;
5. 设计态和渲染态的坐标系转换,滚动监听等;
6. 快捷键机制;
7. 历史功能,撤销和重做;
8. 结构化的插件扩展机制;
9. 原地编辑功能;
##节点结构:用于定义界面显示,枚举所有组件的集合为**节点**,光标下允许插入任意**节点**。
```typescript
type IElement = // 元素
IElementBasic & // 基础
IElementStyle & // 样式
IElementGroup & // 组信息
ITable & // 表格
IHyperlinkElement & // 超链接
ISuperscriptSubscript & // 上下标
ISeparator & // 分割线
IImgBox & // 图像
IControlElement & // 控件
ICheckboxElement & // 复选框
ILaTexElement & // 公式块
IDateElement & // 日期
IImageElement & // 图片
IBlockElement & // 内容块
ITitleElement & // 标题
IListElement & // 列表
IPageNumberElement // 页号页码
```
```typescript
interface IElementBasic { //基础
id?: string
type?: ElementType
value: string
}
interface IElementStyle { // 样式
font?: string
size?: number
width?: number
height?: number
bold?: boolean
color?: string
highlight?: string
italic?: boolean
underline?: boolean
strikeout?: boolean
rowFlex?: RowFlex
rowMargin?: number
letterSpacing?: number
textDecoration?: ITextDecoration
tdPadding?: IPadding
}
interface IElementGroup {
groupIds?: string[]
}
type ITable = ITableAttr & ITableElement
interface ITableAttr {
colgroup?: IColgroup[]
trList?: ITr[]
borderType?: TableBorder
pTid?: string // 父表格
isTextBox?: boolean // 是否文本框
textParam?: string // 填充参数
borderFixed?: TableFixed
isImgBox?: boolean // 是否图像框
}
interface ITableElement {
tdId?: string
pDId?: string
trId?: string
pRId?: string
tableId?: string
conceptId?: string
isTextBox?: boolean
textParams?: string
hasSplitTr?: boolean //表格被分页
}
interface IHyperlinkElement {
valueList?: IElement[]
url?: string
hyperlinkId?: string
}
interface ISuperscriptSubscript {
actualSize?: number
}
interface ISeparator {
dashArray?: number[]
}
interface IImgBox {
ratio?: number[] //长宽比
studyUid?: string
}
interface IControlElement {
control?: IControl
controlId?: string
controlComponent?: ControlComponent
}
interface ICheckboxElement {
checkbox?: ICheckbox
}
interface ILaTexElement {
laTexSVG?: string
}
interface IDateElement {
dateFormat?: string
dateId?: string
}
interface IImageElement {
imgDisplay?: ImageDisplay
imgFloatPosition?: {
x: number
y: number
}
}
interface IBlockElement {
block?: IBlock
}
interface ITitleElement {
valueList?: IElement[]
level?: TitleLevel
titleId?: string
}
interface IListElement {
valueList?: IElement[]
listType?: ListType
listStyle?: ListStyle
listId?: string
listWrap?: boolean
}
interface IPageNumberElement {
numberType?: NumberType
}
```
##兼容性:
兼容主流的 PC 浏览器,如 Chrome Firefox Safari Edge 等
暂不支持移动端编辑(支持移动端查看)
不再支持 IE 浏览器
##开发环境要求:
Nodejs : 9+
## install
`yarn`
## dev
`npm run dev`
## build
#### app
`npm run build`
#### lib
`npm run lib`