npm package: @hicooper/doc-engine
Description: doc engine
Latest version: 0.1.5

# 增加的功能：
1. 开放编辑区
    
2. 已修复特定情况下回车不可比编辑bug


# 编辑器引擎
FORK FROM itellyou-engine
编辑器核心库，纯js编写，不依赖 React，提供编辑能力，插件接口


### 基础功能
+ bold (加粗 ctrl + b)
+ italic (斜体 ctrl + i)
+ underline (下划线 ctrl + u)
+ alignment (对齐方式 ，左 ctrl + shift + l , 居中 ctrl + shift + c , 右 ctrl + shift + r , 两端 ctrl + shift + j)
+ backcolor (背景色)
+ fontcolor (字体颜色)
+ fontsize (字体大小)
+ heading (标题 h1 ctrl+alt+1,h2 ctrl+alt+2,h3 ctrl+alt+3,h4 ctrl+alt+4,h5 ctrl+alt+5,h6 ctrl+alt+6)
+ tasklist (orderedlist (有序列表 ctrl+shift+7) , unorderedlist (无序列表 ctrl+shift+8) , tasklist (任务列表 ctrl+shift+9))
+ code (行内代码 ctrl + e)
+ link (链接 ctrl + k)
+ hr (分割线 ctrl + shift + e)
+ strikethrough (删除线 ctrl+shift+x)
+ quote (引用 ctrl+shift+u)
+ sub (下标 ctrl+,)
+ sup (上标 ctrl+.)
+ indent (增加缩进 ctrl+])
+ outdent (减少缩进 ctrl+[)
+ undo (撤销 ctrl + z)
+ redo (重做 ctrl + y)
+ removeformat (清除格式 ctrl+\)
+ markdown （支持 markdown 语法）

### 本地编译
```
clone https://github.com/hicooper/doc-engine.git
```
编译之前需要确认以下命令是否有全局安装,或在package.json/scripts/compile 中 修改命令

```
// rimraf 删除 lib 目录
yarn global install rimraf
// cpr 复制资源文件
yarn global install cpr
```

在 doc-engine
```
// 安装模块
yarn

// 编译后链接到全局
yarn link 
// 或只编译
yarn run compile
```
编译后的文件在 doc-engine/lib 文件夹中


### 简单示例

```
import React from 'react'
import Engine from '@hicooper/doc-engine'

class Editor extends React.Component{

    state = {}

    constructor(props){
        super(props)
        // 编辑区域
        this.container = React.createRef()
    }

    componentDidMount(){
        // 实例化编辑器
        this.engine = this.renderEditor()
    }

    componentWillUnmount(){
        // 在组件注销时，注销编辑器
        this.engine && this.engine.destroy()
    }
    
    // 创建编辑器
    renderEditor() {
        // 创建编辑器，可以传入插件的配置项，比如自定义 bold 的 hotkey （快捷键） { bold : { hotkey : "mod+b" } } ， 这里 mod 在windows下是 ctrl ，在 mac 下是command ，具体使用方式，参考 https://github.com/ianstormtaylor/is-hotkey 库
        const options = {}
        const engine = Engine.create(this.container.current, options)
        // 监听编辑器内容更改事件
        engine.on("change", value => {
            console.log(value)
        })
        // 监听在光标选中编辑器事件
        engine.on("select", () => {
        })
        // 返回引擎实例
        return engine
    }
    
    render() {
        return <div ref={this.container}></div>
    }
}
export default Editor

```
### 可选择项 options

```
{
    // 编辑器父节点，默认body
    parentNode:element | document.body,
    // 语言，默认中文
    lang:'zh-cn' | 'en'
    // tab 索引
    tabindex:number,
    // class 样式
    className:string,
    ...
    其它插件选项
    bold : { ... }
    fontsize : { ... }
    italic : { ... }
}
```

### 已有插件可选项 options

```
// 警告提示
alert:{}

// 对齐方式
alignment:{
    //快捷键
    left:{
        hotkey:'mod+shift+l'
    },
    center:{
        hotkey:'mod+shift+c'
    },
    right:{
        hotkey:'mod+shift+r'
    },
    justify:{
        hotkey:'mod+shift+j'
    }
}

// 背景颜色
backcolor:{}

// 加粗
bold:{ hotkey:'mod+b' } 

// 行内代码
code:{ hotkey:'mod+e' }

// 字体颜色
fontcolor:{}

// 字体大小
fontsize:{ defaultSize : "11" }
字号->像素
{
    9: 12,
    10: 13,
    "11": 14,
    "1515":15,
    12: 16,
    14: 19,
    16: 22,
    18: 24,
    22: 29,
    24: 32,
    30: 40,
    36: 48
}

// 标题
heading: {
    items:{
        h1:{
            hotkey:'mod+opt+1'
        },
        h2:{
            hotkey:'mod+opt+2'
        },
        h3:{
            hotkey:'mod+opt+3'
        },
        h4:{
            hotkey:'mod+opt+4'
        },
        h5:{
            hotkey:'mod+opt+5'
        },
        h6:{
            hotkey:'mod+opt+6'
        },
    },
    // 显示标题锚点
    showAnchor: true
}

// 分割线
hr: {
    hotkey:'mod+shift+e'
}

// 增加缩进
indent:{
    hotkey:'mod+]'
}

// 减少缩进
outdent:{
    hotkey:'mod+['
}

// 斜体
italic:{
    hotkey:'mod+i'
}
    
// 有序列表
orderedlist:{
    hotkey:'mod+shift+7'
}

// 无序列表
unorderedlist:{
    hotkey:'mod+shift+8'
}

// 任务列表
tasklist:{
    hotkey:'mod+shift+9'
}

// Markdown 支持项
markdown:{
    items : [
        "code",
        "mark",
        "bold",
        "strikethrough",
        "italic",
        "sup",
        "sub",
        "orderedlist",
        "unorderedlist",
        "tasklist",
        "checkedtasklist",
        "h1",
        "h2",
        "h3",
        "h4",
        "h5",
        "h6",
        "quote",
        "link"
    ]
}

// 格式刷
paintformat:{}

// 引用
quote:{
    hotkey:'mod+shift+u'
}

// 清除格式
removeformat:{
    hotkey:'mod+\\'
}

// 删除线
strikethrough:{
    hotkey:'mod+shift+x'
}

// 小标
sub:{
    hotkey:'mod+,'
}

// 上标
sup:{
    hotkey:'mod+.'
}

// 下划线
underline:{
    hotkey:'mod+u'
}

// 撤销
undo:{
    hotkey:'mod+z'
}

// 重做
redo:{
    hotkey:['mod+y','shift+mod+z']
}
```

### 插件扩展

插件通过 Engine.plugin 扩展

```
// 插件
const PLUGIN_NAME = 'bold'
const TAG_NAME = 'strong'

export default {
    // 实例化
    initialize: function() {
        // 添加被允许的标签
        this.schema.add(TAG_NAME)
        // 创建命令
        this.command.add(PLUGIN_NAME, {
            // 查询插件状态
            queryState:() => {
                return this.change.marks.some(node => {
                    return node.name === TAG_NAME
                })
            },
            // 执行插件
            execute:() => {
                const mark = "<".concat(TAG_NAME, " />")
        
                if (!this.command.queryState(PLUGIN_NAME)) {
                    this.change.addMark(mark)
                } else {
                    this.change.removeMark(mark)
                }
            }
        })
        // 获取从引擎传过来的 options 
        const options = this.options[PLUGIN_NAME] || {
            hotkey:'mod+b'
        }
        // 设置快捷键
        if(!!options.hotkey){
            this.hotkey.set(options.hotkey, PLUGIN_NAME)
        }
    }
}
// 添加插件到引擎中
Engine.plugin.add('插件名称', 插件)
```

### 区块扩展
插件通过 Engine.section 扩展

### 实例方法

```
// 注销编辑器
destroy()

// 判断是否是嵌套子级编辑器，返回 ture | false
isSub()

// 设置只读，boolean:true | false
readonly(boolean)

// 监听事件，eventType 事件类型，listener 监听方法，rewrite 是否覆盖之前的监听
on(eventType, listener, rewrite)

// 取消监听事件
off(eventType, listener)

// 设置编辑器内容
setValue(value)

// 设置默认内容
setDefaultValue(value)

// 清空编辑器
clearValue()

// 获取编辑器内容
getValue()

// 获取去掉光标标记后的纯内容
getPureValue()

// 聚焦编辑器
focus()

// 将光标移到最前
focusToStart()

// 将光标移到最后
focusToEnd()

// 将光标离开编辑器
blur()
```