From 2b58e4e85e5f48f6a2693ce8aea02d5990c308a8 Mon Sep 17 00:00:00 2001
From: xiongxiaoyang <773861846@qq.com>
Date: Wed, 20 Nov 2019 14:20:03 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0wangEditor=EF=BC=8C=E6=96=87?=
 =?UTF-8?q?=E6=A1=A3=E6=9B=B4=E6=96=B0=EF=BC=8C=E5=A2=9E=E5=8A=A0sql?=
 =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=AF=B4=E6=98=8E?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 README.md                                     |   16 +-
 assets/chapter_manager.png                    |  Bin 0 -> 94844 bytes
 assets/chapter_pub.png                        |  Bin 0 -> 93257 bytes
 assets/novel_list.png                         |  Bin 0 -> 80553 bytes
 assets/novel_pub.png                          |  Bin 0 -> 70254 bytes
 .../src/main/resources/application.yml        |    6 +-
 .../resources/static/wangEditor/.eslintignore |    2 +
 .../static/wangEditor/.eslintrc.json          |   38 +
 .../static/wangEditor/.gitattributes          |   22 +
 .../resources/static/wangEditor/.gitignore    |   51 +
 .../resources/static/wangEditor/.npmignore    |    5 +
 .../main/resources/static/wangEditor/ISSUE.md |  157 +
 .../main/resources/static/wangEditor/LICENSE  |   22 +
 .../resources/static/wangEditor/README.md     |   70 +
 .../resources/static/wangEditor/bower.json    |   20 +
 .../static/wangEditor/docs/dev/README.md      |   25 +
 .../docs/usage/01-getstart/01-demo.md         |   41 +
 .../docs/usage/01-getstart/02-use-module.md   |   49 +
 .../docs/usage/01-getstart/03-sperate.md      |   48 +
 .../docs/usage/01-getstart/04-multi.md        |   50 +
 .../docs/usage/02-content/01-set-content.md   |   46 +
 .../docs/usage/02-content/02-get-content.md   |   80 +
 .../docs/usage/02-content/03-use-textarea.md  |   25 +
 .../docs/usage/02-content/04-get-json.md      |   82 +
 .../docs/usage/03-config/01-menu.md           |   52 +
 .../docs/usage/03-config/02-debug.md          |   21 +
 .../docs/usage/03-config/03-onchange.md       |   40 +
 .../docs/usage/03-config/04-z-index.md        |   19 +
 .../docs/usage/03-config/05-lang.md           |   30 +
 .../docs/usage/03-config/06-paste.md          |   33 +
 .../usage/03-config/07-linkImgCallback.md     |   12 +
 .../docs/usage/03-config/08-linkCheck.md      |   16 +
 .../docs/usage/03-config/09-onfocus.md        |   19 +
 .../docs/usage/03-config/10-onblur.md         |   20 +
 .../docs/usage/03-config/11-linkImgCheck.md   |   15 +
 .../docs/usage/03-config/12-colors.md         |   29 +
 .../docs/usage/03-config/13-emot.md           |   48 +
 .../docs/usage/04-uploadimg/01-show-tab.md    |   52 +
 .../docs/usage/04-uploadimg/02-base64.md      |   23 +
 .../usage/04-uploadimg/03-upload-config.md    |  188 +
 .../docs/usage/04-uploadimg/04-qiniu.md       |  115 +
 .../usage/05-other/01-全屏-预览-查看源码.md   |   10 +
 .../docs/usage/05-other/02-上传附件.md        |   24 +
 .../docs/usage/05-other/03-markdown.md        |   12 +
 .../wangEditor/docs/usage/05-other/04-xss.md  |   23 +
 .../docs/usage/05-other/05-react.md           |    7 +
 .../wangEditor/docs/usage/05-other/06-vue.md  |    7 +
 .../wangEditor/docs/usage/05-other/07-ng.md   |    3 +
 .../wangEditor/docs/usage/05-other/08-api.md  |   27 +
 .../static/wangEditor/docs/usage/README.md    |    3 +
 .../static/wangEditor/example/README.md       |    1 +
 .../example/demo/in-react/package.json        |   19 +
 .../example/demo/in-react/public/favicon.ico  |  Bin 0 -> 24838 bytes
 .../example/demo/in-react/public/index.html   |   40 +
 .../demo/in-react/public/manifest.json        |   15 +
 .../example/demo/in-react/src/App.css         |   24 +
 .../example/demo/in-react/src/App.js          |   48 +
 .../example/demo/in-react/src/App.test.js     |    8 +
 .../example/demo/in-react/src/index.css       |    5 +
 .../example/demo/in-react/src/index.js        |    8 +
 .../example/demo/in-react/src/logo.svg        |    7 +
 .../in-react/src/registerServiceWorker.js     |   51 +
 .../wangEditor/example/demo/in-vue/.babelrc   |   14 +
 .../example/demo/in-vue/.editorconfig         |    9 +
 .../example/demo/in-vue/.postcssrc.js         |    8 +
 .../example/demo/in-vue/build/build.js        |   35 +
 .../demo/in-vue/build/check-versions.js       |   48 +
 .../example/demo/in-vue/build/dev-client.js   |    9 +
 .../example/demo/in-vue/build/dev-server.js   |   89 +
 .../example/demo/in-vue/build/utils.js        |   71 +
 .../demo/in-vue/build/vue-loader.conf.js      |   12 +
 .../demo/in-vue/build/webpack.base.conf.js    |   58 +
 .../demo/in-vue/build/webpack.dev.conf.js     |   35 +
 .../demo/in-vue/build/webpack.prod.conf.js    |  120 +
 .../example/demo/in-vue/config/dev.env.js     |    6 +
 .../example/demo/in-vue/config/index.js       |   38 +
 .../example/demo/in-vue/config/prod.env.js    |    3 +
 .../wangEditor/example/demo/in-vue/index.html |   11 +
 .../example/demo/in-vue/package.json          |   60 +
 .../example/demo/in-vue/src/App.vue           |   31 +
 .../example/demo/in-vue/src/assets/logo.png   |  Bin 0 -> 6849 bytes
 .../demo/in-vue/src/components/Editor.vue     |   34 +
 .../demo/in-vue/src/components/Hello.vue      |   53 +
 .../example/demo/in-vue/src/main.js           |   13 +
 .../example/demo/in-vue/static/.gitkeep       |    0
 .../wangEditor/example/demo/test-amd-main.js  |    4 +
 .../wangEditor/example/demo/test-amd.html     |   15 +
 .../example/demo/test-css-reset.html          |   66 +
 .../wangEditor/example/demo/test-emot.html    |   84 +
 .../example/demo/test-fullscreen.html         |  114 +
 .../example/demo/test-get-content.html        |   34 +
 .../wangEditor/example/demo/test-getJSON.html |   30 +
 .../wangEditor/example/demo/test-lang.html    |   31 +
 .../wangEditor/example/demo/test-menus.html   |   26 +
 .../wangEditor/example/demo/test-mult.html    |   44 +
 .../wangEditor/example/demo/test-onblur.html  |   23 +
 .../example/demo/test-onchange.html           |   24 +
 .../wangEditor/example/demo/test-onfocus.html |   22 +
 .../wangEditor/example/demo/test-paste.html   |   25 +
 .../example/demo/test-set-content.html        |   35 +
 .../wangEditor/example/demo/test-sperate.html |   35 +
 .../example/demo/test-textarea.html           |   33 +
 .../example/demo/test-uploadimg.html          |   58 +
 .../static/wangEditor/example/favicon.ico     |  Bin 0 -> 4286 bytes
 .../wangEditor/example/icomoon/Read Me.txt    |    7 +
 .../example/icomoon/demo-files/demo.css       |  155 +
 .../example/icomoon/demo-files/demo.js        |   30 +
 .../wangEditor/example/icomoon/demo.html      |  505 ++
 .../example/icomoon/fonts/icomoon.eot         |  Bin 0 -> 5656 bytes
 .../example/icomoon/fonts/icomoon.svg         |   37 +
 .../example/icomoon/fonts/icomoon.ttf         |  Bin 0 -> 5492 bytes
 .../example/icomoon/fonts/icomoon.woff        |  Bin 0 -> 5568 bytes
 .../wangEditor/example/icomoon/selection.json |  775 +++
 .../wangEditor/example/icomoon/style.css      |  113 +
 .../static/wangEditor/example/index.html      |   62 +
 .../static/wangEditor/example/pay.png         |  Bin 0 -> 95517 bytes
 .../static/wangEditor/example/server/index.js |   88 +
 .../static/wangEditor/example/server/util.js  |   14 +
 .../resources/static/wangEditor/gulpfile.js   |  122 +
 .../resources/static/wangEditor/package.json  |   60 +
 .../wangEditor/release/fonts/w-e-icon.woff    |  Bin 0 -> 5568 bytes
 .../static/wangEditor/release/wangEditor.css  |  405 ++
 .../static/wangEditor/release/wangEditor.js   | 4679 +++++++++++++++++
 .../wangEditor/release/wangEditor.min.css     |    1 +
 .../wangEditor/release/wangEditor.min.js      |    4 +
 .../wangEditor/release/wangEditor.min.js.map  |    1 +
 .../static/wangEditor/src/fonts/w-e-icon.woff |  Bin 0 -> 5568 bytes
 .../static/wangEditor/src/js/.babelrc         |   10 +
 .../static/wangEditor/src/js/command/index.js |  106 +
 .../static/wangEditor/src/js/config.js        |  387 ++
 .../static/wangEditor/src/js/editor/index.js  |  339 ++
 .../src/js/editor/upload/progress.js          |   65 +
 .../src/js/editor/upload/upload-img.js        |  316 ++
 .../static/wangEditor/src/js/index.js         |   24 +
 .../src/js/menus/backColor/index.js           |   46 +
 .../wangEditor/src/js/menus/bold/index.js     |   60 +
 .../wangEditor/src/js/menus/code/index.js     |  150 +
 .../wangEditor/src/js/menus/droplist.js       |  130 +
 .../wangEditor/src/js/menus/emoticon/index.js |  115 +
 .../src/js/menus/foreColor/index.js           |   46 +
 .../wangEditor/src/js/menus/head/index.js     |   70 +
 .../wangEditor/src/js/menus/img/index.js      |  252 +
 .../static/wangEditor/src/js/menus/index.js   |  125 +
 .../wangEditor/src/js/menus/italic/index.js   |   60 +
 .../wangEditor/src/js/menus/justify/index.js  |   44 +
 .../wangEditor/src/js/menus/link/index.js     |  168 +
 .../wangEditor/src/js/menus/list/index.js     |   82 +
 .../wangEditor/src/js/menus/menu-list.js      |   63 +
 .../static/wangEditor/src/js/menus/panel.js   |  195 +
 .../wangEditor/src/js/menus/quote/index.js    |   75 +
 .../wangEditor/src/js/menus/redo/index.js     |   35 +
 .../src/js/menus/strikethrough/index.js       |   60 +
 .../wangEditor/src/js/menus/table/index.js    |  376 ++
 .../src/js/menus/underline/index.js           |   60 +
 .../wangEditor/src/js/menus/undo/index.js     |   35 +
 .../wangEditor/src/js/menus/video/index.js    |   86 +
 .../wangEditor/src/js/selection/index.js      |  186 +
 .../static/wangEditor/src/js/text/index.js    |  551 ++
 .../static/wangEditor/src/js/util/dom-core.js |  488 ++
 .../wangEditor/src/js/util/paste-handle.js    |   86 +
 .../wangEditor/src/js/util/poly-fill.js       |   48 +
 .../wangEditor/src/js/util/replace-lang.js    |   21 +
 .../static/wangEditor/src/js/util/util.js     |   71 +
 .../static/wangEditor/src/less/common.less    |   19 +
 .../static/wangEditor/src/less/droplist.less  |   48 +
 .../static/wangEditor/src/less/icon.less      |  102 +
 .../static/wangEditor/src/less/menus.less     |   33 +
 .../static/wangEditor/src/less/panel.less     |  159 +
 .../static/wangEditor/src/less/text.less      |   77 +
 .../src/main/resources/application.yml        |    6 +-
 sql/2019-11-20.sql                            |   60 +
 sql/books.sql                                 |   62 +
 sql/sql文件说明.txt                           |    3 +
 173 files changed, 16040 insertions(+), 7 deletions(-)
 create mode 100644 assets/chapter_manager.png
 create mode 100644 assets/chapter_pub.png
 create mode 100644 assets/novel_list.png
 create mode 100644 assets/novel_pub.png
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/.eslintignore
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/.eslintrc.json
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/.gitattributes
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/.gitignore
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/.npmignore
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/ISSUE.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/LICENSE
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/README.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/bower.json
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/dev/README.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/01-demo.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/02-use-module.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/03-sperate.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/04-multi.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/01-set-content.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/02-get-content.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/03-use-textarea.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/04-get-json.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/01-menu.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/02-debug.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/03-onchange.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/04-z-index.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/05-lang.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/06-paste.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/07-linkImgCallback.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/08-linkCheck.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/09-onfocus.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/10-onblur.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/11-linkImgCheck.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/12-colors.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/13-emot.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/01-show-tab.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/02-base64.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/03-upload-config.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/04-qiniu.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/01-全屏-预览-查看源码.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/02-上传附件.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/03-markdown.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/04-xss.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/05-react.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/06-vue.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/07-ng.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/08-api.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/docs/usage/README.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/README.md
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/package.json
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/public/favicon.ico
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/public/index.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/public/manifest.json
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/App.css
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/App.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/App.test.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/index.css
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/logo.svg
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/registerServiceWorker.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/.babelrc
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/.editorconfig
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/.postcssrc.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/build.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/check-versions.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/dev-client.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/dev-server.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/utils.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/vue-loader.conf.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/webpack.base.conf.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/webpack.dev.conf.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/webpack.prod.conf.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/config/dev.env.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/config/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/config/prod.env.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/index.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/package.json
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/App.vue
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/assets/logo.png
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/components/Editor.vue
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/components/Hello.vue
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/main.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/static/.gitkeep
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-amd-main.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-amd.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-css-reset.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-emot.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-fullscreen.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-get-content.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-getJSON.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-lang.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-menus.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-mult.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-onblur.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-onchange.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-onfocus.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-paste.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-set-content.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-sperate.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-textarea.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/demo/test-uploadimg.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/favicon.ico
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/icomoon/Read Me.txt
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/icomoon/demo-files/demo.css
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/icomoon/demo-files/demo.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/icomoon/demo.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/icomoon/fonts/icomoon.eot
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/icomoon/fonts/icomoon.svg
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/icomoon/fonts/icomoon.ttf
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/icomoon/fonts/icomoon.woff
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/icomoon/selection.json
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/icomoon/style.css
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/index.html
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/pay.png
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/server/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/example/server/util.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/gulpfile.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/package.json
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/release/fonts/w-e-icon.woff
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/release/wangEditor.css
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/release/wangEditor.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/release/wangEditor.min.css
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/release/wangEditor.min.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/release/wangEditor.min.js.map
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/fonts/w-e-icon.woff
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/.babelrc
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/command/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/config.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/editor/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/editor/upload/progress.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/editor/upload/upload-img.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/backColor/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/bold/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/code/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/droplist.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/emoticon/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/foreColor/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/head/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/img/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/italic/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/justify/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/link/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/list/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/menu-list.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/panel.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/quote/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/redo/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/strikethrough/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/table/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/underline/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/undo/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/menus/video/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/selection/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/text/index.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/util/dom-core.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/util/paste-handle.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/util/poly-fill.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/util/replace-lang.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/js/util/util.js
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/less/common.less
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/less/droplist.less
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/less/icon.less
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/less/menus.less
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/less/panel.less
 create mode 100644 novel-admin/src/main/resources/static/wangEditor/src/less/text.less
 create mode 100644 sql/sql文件说明.txt

diff --git a/README.md b/README.md
index 1478977..a865287 100644
--- a/README.md
+++ b/README.md
@@ -66,9 +66,23 @@ novel-admin :平台后台管理系统源码(独立项目,按需安装)
 
    ![](./assets/crawl_config.png)
 
-   4.其他功能开发中。。。
+   3.小说管理页面。
 
+   ![](./assets/novel_list.png)
    
+   4.小说发布页面。
+   
+   ![](./assets/novel_pub.png)
+   
+   5.小说章节发布页面
+   
+   ![](./assets/chapter_pub.png)
+   
+   6.小说章节管理页面。
+   
+   ![](./assets/chapter_manager.png)
+
+
 
 #### 微信小程序截图
 
diff --git a/assets/chapter_manager.png b/assets/chapter_manager.png
new file mode 100644
index 0000000000000000000000000000000000000000..80913cef773f64d924978cfdd7f3ac0ddb98998f
GIT binary patch
literal 94844
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
XsHSC65EOF=_^B#uDm_!Y9`Jtv{PLmc

literal 0
HcmV?d00001

diff --git a/assets/chapter_pub.png b/assets/chapter_pub.png
new file mode 100644
index 0000000000000000000000000000000000000000..8b037c9525bc6536b7560902a64964c04253982d
GIT binary patch
literal 93257
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
z%0DuN>`@>x<5UytEk)I3HB_V`d*?xik>9^<rL&E2W^W~_yO|%3-Bd2+dJr_tDpPJI
zx>t6ifpYwZi%k*{3;A0wxR?91*PVNJ9*`4ma?v-vR1ghS&En0YVymyBcj)K~;4xTl
z<&5G`UBt}opcqsuaqj5ziO|$QmUaMp{J3ys$ptf<Hx;7Sl;KfNWi>0U_p%P9NAtDo
zoSFa6C0xirZpeGDsU5G~AyzTAzus)l>)z038mZ4!HrL<QTLY+WSZ{{LY_8m;|L}G(
zrjJb{RW9~ipbBvN8|@lK>osg?W$y?jJi36%yG8-z#}YqpJnn`%obI~#Q$D)Bn3Pxt
zK9dwY`=ipvKb$Z5$YMPBaCWZ!<_L$2e5Vab*t~YGtp((uKo)~k=V3z*rHO`-v6Y6X
z-ba&-&D2g`s3oEHE6c5+^iI01B<(sA@wKefVvF@Juu-(9sC$|!IO?&R5qRL|pE@}{
zO?J<AA_%{3$=yF7A|(Hcz@bn~jNr~-vRZD76N`8+Lk?q0t8i8kX^(s~Y_S}y$>DZT
zRGolqY_j<RGL|D(X0`F2&C4B@Cg{-sdVv5MX=8cPL9L$uqSoMmbNS6Qj3CN#_Ci`O
z>L(fm*jx>TgrzG$Y_y+dJ877kP}CfGobtm8grjP>vucrjDojavNG2CkmyRL~;Hx$I
z(q^^>dctraceoJgspL6sRaWYYqWZ^4?s@IXE3~&H?o^+;9_=1(Zt(f7$}m4T+GK<<
zbE{^a=93VEd3rt6gLdM0d(Cd&jK_w*&%AFgxmPH6H|GNde>#(kr-6`X<ZHx)$<Ksk
z_#jDE6!n(QbJyOXlACtsT=%8bl_}~gC=JaJvn^SDda(k{=mL*~wuMo9Y54)}_V>Qo
z9v|=d-Tl@f>zCIqMXDXk@zQ;8FE-scI6s*?&vl?EfCq=Tk}0{~tUaT@`}Uzx?x6VS
zvly`1$-!>AiF{(|tL^zJHsc@)4bAXJ1S~P}?lF}AtQq`|g-3#;nBUCY2%}2jA%$8B
zR!*lM(C6}^Xe|tdv>;8o4mql3=FV_WOOLnJ#q>!9vDm=JrlKGd$oG*nT=+CYORdAp
zxfc7w4yWrajlgz>^}Qhum*OU1mx80af=WtFGGVqm8g`;tK^ld@jq~1o<=*`J<l*b}
zsXV%l?O*+Q>J3<@Er!XV=+~Pckst2P3`!4m#@Tin+yv>n2Qw2_yFs=}mK%M7d@P8E
zHQzT2vh&->!cR(&Z;bG~R8>x8K}WrTwjmg=fRFx$xB-l6ayBZN?sRo~XNi1!2N6xE
z9v{t(q&3-HOtn}JOynvyY8g9=HQ0!jp(r-lswHDIks(*)E#tJ<UQF#=k&orF7}(5R
zFbSmK%&VZMqk)iZ$0IS8e{re*d*U?h3W`-pVy|M&6<`DDki}$U<w=DQDwA^6FdH~)
zTPkJ9Yvq`jX*k2{t5X%G)iSbLubGGZAc2MP*0Kh<XH@uA1#srZX+cG<TR;Jrz7(t2
zG=K2T9`V|{0Y!lc^=fMs5NKRS3M|^bG5Hy%vV->&`5rff2hXc@*|qm6W(@2r2UB}G
z^#qt}D3fWTTw{wxfYEvSTP;J?qc1q_A<RTJhMpJ8VO4fWw&)SsXP`r!S;Fd627N1!
z)lK2#+nHVjusgKgH8k&Q0M*EeOVycMHE{pGZ?+T6^odcB1xfkL#nS3?08u(8Q%tRH
z$2awb_!SvT4FQv`nV=6xd5K^<t>z&`ybswAbXYB>$`pgXm`g)!v6b|_*oG)$ZS;(I
zivRCOz1xLl5TtB8lEsC-fqZAH@*`7<GH6^;R{fC}x=?C;flaD*=GvUYDX`iC-S;|h
z6Z}5(OQ*8`go2o=YFOdOVsn&<IMi5T)W7v2EM(DE(VUQli-n$HfX}k1^Q(}D2UrxC
zi3peN9j%g(t+JNVx>{Q`6&(l-Lhi^v!yruDVxw%$rtaY2>!RV>{M=zWx@Q_a?n9~h
z-Xz~j4z5(7F&S=SYqmc!XLgTq!I$nqQq%@l%_lbzk+!pzlqHV025jJ!sI#RO*DO&N
z?~{*roPh<1Ot8iDSNyu7DXMz5_6CX_-YsdvcCA)gtRC%wEOvC5n$NAqI$RbsxSq|_
zcy0&qJb`tSm%A_LFnmFE*ePK{Kj*H8B5OZ}L5ZF&naM7h{Wph+bis_>Cn*)jZ^mmz
zTh9G1js4Diun`&VrToN$>iZOSV_hfk<<*~eQ-HG0ZX;RsssuEFT&)IGw*+u!@Mjjh
zfF}`2<@G>^@tTI0QH-VO(t}R|lp0IsZ_a<I6?WHhpE`G`IixvrKENRz>zystF)lmb
zoAXb%MeEJSh}Xj91`XQDRJ_cbU=wW2eBPK()snBV#LGW!Co8g<<WG|y0jb37RMRA=
zc?p@B@mK%ANJVRe7TozQHhc*T9<_rTtbQN(T#DgNyL@Kcd>?YxDdgM!!v{C*G53fF
zSD%vJU)|Xv$6Hm7#2?g(WOXn-&1#OQEKDfX@A-IpP@FlI!+d&P>b#O^w!vj>#AtA|
zC$Y$U<fGXWivjGkaQ!duRg8Lx;N`md)0@T62;YUN^~-3#2EKbKnk*B!x?D?|4-IlT
zIXF};B%OVtrEPl{aAeyv;1I0?uJbTEk7D&H)UNum;9&4^V=~bt!SZnf+L>B3MZutU
zM5)QMD)EK21yvu+$dc?^R-nIjq#}FJed1F5%Ee$NB?6i|E3IeI)OSWR-XrL4j~I!U
z8H$e@iDTp=Uks~J=b_A*rA!%QNtI|53eDBT)?am}f#z(Dh;2;8%<XKHj2vau#c!Re
zC8Dr<;E3#kwm@d!OXMo&sCQ_0T&tXGj`!`i7S;w@JM#-G-GB+e4}k)Yl5{XZWm8DU
zuFe1<OFFx*WPpimf{9|JM69`PY)3lf=Tg{~0E6APBgI&WWiImA*;+T5nd<eJr`<@A
z!4gjP7A7W)IKcNgUVn=u-C=Oi?nK_ek4BT}J_MR8QF8XFUhr5exUUu5Hu~gMk(=n(
z$Iy?e=9aoP8urps>s^nald4@)rPiOT#gwDE$tztyH<4MaP&k_oCk08vdWhK^RF(#a
z(p7ts#?%xQ5|UY+l=dfXFTlEpOI|@bYyE?M$H4hAKG3fwVUVD|x%(Gd1#1MkUh(s!
z<52aO`4RJAwdk`_>&!x&wH!ItHF!I}Cp0ee76%srS3Pfp7XA*bO>^tEY@oU+6i)fi
zHX7b1W+UKOxtkB7e6F*llkiXtD1}M5+yzWV!Z!0c0~zailDkdoHUlt@JSqoMvGwQ0
zz&uYM8Vf+q%uM!NT2*KQxg1k(KtcNlD|(rn9w;J9!m#<Y^_I&mXRL3I8<#?vLD@EF
z;|<0TPobm>M&<9c(GoHY_uwql=HlwQb^|H33ZrSJA+`vUTyq74tAaz`<oC4D5e6DM
z)j*zN+s(PyVa+(~sK}EY5}Z;KnfVT6+o{j>!M*Rscqc)!6zqjVFU9MR=WSm*w0(Lm
z7~+>AR4x|w6spKW^j2A%wkt7|^|jW~ShaVDrGvE8*;IeI+h`BC2nZKEwvlH^C02(C
zbtF-bqI-!1%Rt##>@KI9Hkzu;32Zh^F{#6h1Tqt~?h|n?Pw-`}W4Vgo{=y)-v!S!l
z?Mscn%Wr+=FCm9oegJa_>-G#yo;lI+3Hd}7b^Dqg@D=xMFte7_jzskgaDPL<=r0l`
zUA4Eao(3anQKWzhp(%yG{Iz02AF?C-hDB+bIBstIJrxI@etnb@7hY>A44Tx14fR=0
z*IobCfjb|%mr;GgK}uXy2qLLyt_H*j+*1otGyq~1WZ)L)V(g0`ySchH(%M;m$+*5e
z_Iy;&oc@7IV)@QfbCsu7!LcxMwdk*5%d>^_=DK<r5{@|*dKng86IKq;gVZX_>`^&^
za`X9JF_GiIPE8o;$70SD2bIkV<HLc0ubE4fA0S@%2(%zc5_Z~YJ0tij!#5JEy2l?0
zlV$Dpj`Q<%8rYBfme1JS#JAz94W>%gvIVY^W)tC3vc45e0u=_s!NYc(&*Cc_n!Bt}
z%hnqF1|4n4j@px!fIz%`x^1ln_l1(G&J~%NTHEc4VYbnygypYnJEzbO|BMY_<H6<q
zhhGZ6U)&h?`YBQ^fHf5(wkUJ6O`vXFUA6h8xF|5H{fj1zfe@CXJ(f`Sk;X|y(cMP>
z)mz>aRvJT7Z5a<^XLY4lVvtv|FlV@R;Bv^d7OrU8`wY@)CfUS_VVt#EC)_2h@b59a
z!uHNSuihVaB*dge_PxvaS`ye6M+!AEws$dBk<xHBFVo4Xj4zaU4V*jhp<?|UV*aAn
z-h~?(C9CLSdLK0B2{^=i=^rrry^=cIQGK`_MKmU8^eVYF6s?uI%8Dq?)xF(s&>}kl
z&Ud;P{>axDmRA_0p|x7)=6n*ic1p5tu#9*1EcY&4ftdA)psr=s&HyrWNU~R<K`1O$
zyR^l`8m?I3F4wY*FmmG>Elf~VQ$~V%6)>O5>u}hO6_cUlw$&Tlx)aLnTCBCWUB1jq
zSuBSngX@b^`SUYr-Il&f)o?P;7F(~4AnsKZYJT+S4m`Zq${aVq@1{ler=kJab$qD~
z`6a#mEhC#is=@Wqt`UclkpMGqNR4N}<olWUA5U(nM>Mj$IePln9P|Za_(PmsG*&wa
z6jvvlPz#shIny&^h)ZJ(l>^lLl@a8Xm9Z#X&R!(7TI%H98*~u}j&BqlW_mu7)rvZz
z0z|1A7V-q7<QtvMj!zqz<x4>A8<{1cV$`Z)D2^}@M;M7_p}v1{pLX|AMjjtJ?kp_y
zhiG9PkUpH>VlAe&71sL}Zaf^m9Ak6aYw#w8%<+!SL*B>Dl`pGbH>CCb*uQt<NWPG_
zN`G_QLAkde-qv+^EPbEEDX2>;QqbAX<D0)2$9bz!elEI>0x5STyQPNENsN6%u8V*X
zx|hhso%bi07?^ty$vs)Az3!fGj7;|fgAe>a96asyBU4VSv-uGN?4D1aX~=cB_<p$G
zVhv|?IS*JP!IzI^%gxN?wUZ>Xf-*W<sTEswr)_NzY^kwXOuy^DN6Xcn_+}saHVL@k
zc<tJO%x~fFAL^V}Z7`$N69F^ZfdaQQ)paZAJ6<_;8bzFDL&l;bYY9}zlYfc?b=;aV
z8mG0s+WyR48mYHp=x@L5Lrcw-TcTQqjouF%zvo;OA6;o-$IsCWnD>pM#$uEu1tfcE
zR7T!0nd}|`9nAN1@+Hlf<#M`$nPt!!rO+9B13|JOk10CYs0N^3A|CMX-lD^!zN<5%
zv*|i9mC`v*KW%QOMtpcjz|q1)LCi%pDLCBl(owge>(dXZ84tD_=c6dCN~~V)YSYzR
z=t6H^qOI|C<RD`!g(koL&%C%{yhnC+V0mVwV5RNJTXgjgA8uw7+>+^iAh6q)uq11<
z<S+35F!tV2O{d)!uw|4{6h;wIX`>DzT}41@Y>0w@0s-j`MU>tHBoGl51p$>NQUW3Z
z3B5xgQITFECG;fpo&*w-5YoQi%scnJ@4ess*82WpEnu-&dCqg5efHVs?9;nruJiW4
z*bzN=O7B8v$Jrkp*|1YHpz{|8%P-mMS7Q7ptL}J+ct>q-)SaD7r`oAQNiX+7NBiut
zVXGwvOcThZo(pA%d+JMV8(evxe6FKTX~SK3&$=Fia|?mS@?Q$Rf3&^-1*0m!PlQvN
z4-SkC=Y0B{xsr@+ECU@oe_VBCkE+z($B6&b_FbsD;=A&;xuBJHE4|1h`B|LUp4bIL
z^U~WV9FGyQqz#%cL<B!^v5anNyiKq;3bebT9yI<$zKk#Rya}Foh1`0V`mD9*g@GX`
zvE<kvnRtn!zd`Hu*DtyNLhT4pJ}3-eP7}*8GQ8S2p<PWkIier#{icJ`gZY|n&E5*}
zse(K+C#_HK222pdBC~{JWF4IHbS_l$w`l`DO6_$jl2FfuAIYe5GWG_(qi>pO6YdOE
zHHVsaYGePLeG%eXmvlGh!(6?qx08Kx1imP%<~;5pJn5d`+Mm}e14WtACoYYt0LoXL
zuS#+gSXFu7k+<JRLWX1ws>s|;eV@`bQT>{&&N_FFR=+d)arah0LP+Y0O0BKZlKE8Q
zwJZDmd%E}Oj;Kvx9@UK@PaQXVGW&1U&tJ2pKh>}OBP0J8&-ZP{F7=VSnC@O3)a~wM
zi-F);R)d>LYOo`iV|;#`xid^a)+kaAPdNRjUJa-h)MVbHy~FrLvtxswr{DkhIukx%
zsU&73(RQdSUdr;g?w89^x9`J(?mL(SOuZchNPr)|r)nCDA#YiI5m7SnRWN(3YIedp
z?eeEf?rz}jqSfKF_dmKzmY;ooIFS23rD8Uv;`6W6hkg>k=5!?2(JI<^?qKVpwGpoL
z^+y{Cdnt0-d6}K`<w^OrazB%-QObZ}>{5M}gTdnb;QiP~T0Syq=!!E@*Q0uy4>GEn
z=8I1n2pd1c`F_}19(f{vd|0jQ)wotEt+(QNu{iRxfBA3lq|T?&_pil#-!s+9{Uv{|
zP}_@ej}9SCi61JbEMZ~vDSAh!eqbP}c&~jT#V*K&wR*!|qTKOHIBj|7W8CoKL<#Wd
z`Z{A_lON?It$QaizB7p$)uU=sEe~B<&j1c7uKu5`8R_NJ+l`#VXySe@S(5E44D(s(
z5Lk!3DaW!UIVsm<ch>yI3rC*mHQ;4$^p8^YA!ghJ@?Z~E+}W5Ssf8#9HH6=3SfXnY
zId;w0JFq$XP1X%(L0QExo<yip?7SbuAe_F47xs9bZZqHe0tFax%qO<-$tOrt?rP~r
zlxgR3>0QE9O-<hG-$_-J`eP>8IzU46_tZp{?4bjIAmN#7tzsW(_venSCuthln3A>i
z6_c`q(RU^a-_$EQ0y6cwdc{qVkpCrux42NJ{AB#qvxQdSTj}RgfM#!8si&Rc?D83~
ziP=q8YyY4qD<7wnpGd%h?ZEd>igjU%Ay(jtB2O2^fUxkup!?Tdqa$wL`LqG91Sgy~
zFYZfFF+Hqgc0lEhu!`9Mh1&<s;x-O412!4UYf68qz&0d@)h0+_@#Ra(@?lOsTT`d-
zpT0bQb|F0?)!seDqz*2KNad_Qn=U;YD1!6Rt_@u8k~=HfSLTy#vH5fCnVjiLkI`{*
z=4cJXWwS(zTD{h;kAd=EFy<g{Zi6ltFLO&~k;7kq{Ji!JQw9Wu%QO8mG5cS}6O5&2
z!C5n)$h$MMU2Ujy>C&XiZP+Bn$V^%f8phddS({*%>Q+UrOtdA-C;66?-j%dKw7@9O
zeZ11Wof;n!s>Vf2v$3vyC5PkNRkNll!i?4bjRh_if(hYk8FaVnrHppyM`tWHlJ#<a
zCuk`LihGY;Z{Zxuo~;jB9aQ&=a)~F&!vzyy8ac~dbTahTHl+*`l^Kb@-VDi}Vicrf
zA0jSc!fcmSM@g;-yN~6d2y%vz+{(;=hZE=3ei_u617Jj);Hfi~)yp<f8+eSr6D6>$
zv^wChjlgw@J7YezT>l3AmCyC7zx)+ldUREE>fEL-&GL7cutXU#jNNBnPizcX>r3}@
zX!+eCgum*Ab+r%4(e-mG0J*g54}~)Nbk`p}qPKZzMJcY!?}5cvTfZ6FAg5EY++Ojn
zxon-Fg`FO1WET;SiDI?)IS<BL?=Fq|d)Su)NqGwNXs=kITmp=%zTB~k56+QlaV<5*
zzSkYCLpEKUbvz=@+V7+GpD-v{(bDFPqJzdKe}`}jL*v^|EPhrr7bz?p$d7mN9DGK%
z%Gq~-pKANAuWj{o!GRk+&#g5+oe6g{>^}deBY0x@V`yyZfktHG1>f6uzQ5}J<FpO<
z%X=@y>U^&t7tgBvo}pIS(LL|awA^@ZZFnPfdODgH(<1YR2|1Y|ak*SG;=b$pV4i~M
zft>t7ArB#z`Nm4-wC=-40rO2?Qevvt%t}u|TmpJ3wZR<u)XQ?)LJ>`d?1t2vJ0)c{
z<;A~(Fh%T%Xt0Eq={QJ}KHp1gsrGV-nR30Mx2M^$l}BjZOSr*vXyp>DPRHERM9LVn
z%nTUGHg0#0OQUYpknN&ohVzWfWDTHhORq-`%d>oRs)E=%a+Y5beM(Tql6Ht{Z|1fN
z>Ug=crXS-|hG=O9)|HUeXCkkfF;W%wmt~Q{huX5$$#N=;y{Hk;6uDB6RDcrY(-_&f
zs0c%DHy#n?I}>sMu;zg$;ki+ew!yyJvIy=?Zf!HUmo8i3r5sPT$B$AC&K}RNtE-+h
z>2{fF^dQ!HmJNy{JH?YQ+}DO9QjzqL<ia1+nDyr_oejJlJhSN=`-fLH32M+#++fcm
z)@=9ZL-xI`AojSR1W_!S91ZCN<L`Ap)kObBmuQ2V3NIkloEw8z#CZqq(|D)G2XFq6
ztyBW>=KIwU*xd1;{-1C)pBw{0uRYcy)Ba64DC#xF=ICV~$|2~Ur7{e&D;wgMrRz>;
zc>T{DB%kvy2FJ${A7H8uSg+*$R*Rrz6`U^xEbTQ-6cX2m8q18EgD~JOS>e)dk^dnw
zG!E(Rezy;GOX7{1Y0=#SswRgXcO`y!@aYuzgk#RJ_s1yj3Yq2oi6bwOGvas7Dp}qF
ze|b}8EG`Dt2{{CCF}E}yD<pa;#`&mPiz=C%xSw<B^Od~QYIPUQ@eW00U2*4)MefFJ
zh|ohM^(wIC+l9LTKWcu=j?p$#_Ptm`k*a5uPw!yf$+_yi9gp^>-3mKq$T13Ux?J!}
zxz{VdY`f4$eLw2lTN71_CJmG$!*5vM8J_<0$$gXVVclCE2)hT>aAOL-#YC2HiM(Ew
z)?;62>eHP>g9x*N=&Zm4TY-mZp~AEPVLGt<R;nh1-q|6e4_`QV@`vmbf*$z?MI6{K
z8??SY;3#jWRZpIba9ctiHYw~oL3-evtyyB=vAK0oG971M9kv*^Z>X*;2kXU~D(yL^
zl6}#wYwPsC3()owYq_t$HqgiC5!ky?0btGae!%%=y?zKANjvIe<be>}<2Hq`CxviB
z&JKW+)B$w&_pv7M0Cjoz#S(lxM|P}y4fv(6cEWewJV*LrDz7@Qck)Ml4Ip!iUb2%9
zU!0if_xoXZONVD#Xv14xnpE>6eD3);k@Jo$3rEvul*|X$U7}NN<bu3_AZ3#%1U6x*
z%J3HOGd7hn#hF}E11a(!KX9qPXqC%n&d_HmK`Vvd_aFBLpXzsvTxivO|7eFSYXD;(
z*gTEXZxsQiA-BZOIy48YLEcC5{YWr=|6!j?XMt5MNB^P>*Ab?B{u-kDx@4W6b`JUF
z%!+o3`9$e4PvI2b#(a?%y6<?VSIriJVn)(<%l}?T^GrcQ0c9jnCIh~b=ir!q$|~o?
z&n)SS1!taIx4mv?{MhA#hf@~ZvCLR+M=juH_+V$8+Xxal)c)$V=iSoju~XM*3gZuN
z2ROL?>3t&_S$v`Hg@fuVALV-o7TZz^UKHGnh-EizA3l0CwcZHir#18Nsvw$|&vo<~
z;z{6*a44{fkFo94+oqa}?g6HQ-@Bi`a7Wf2?y@&>ThF!*ebhQ!y>>3k;o|Jql-byq
zZr-xs1}JQ0pz*M1d8YrLJ-snvL*?r^g0V!lO=zzk<e|?a@2j5?&{s+JPt(0}>+PS`
z+rKJ@e!!x2h9mi0T8~ZtyKkJqg6c`@M4d{H)P}Ov<?*xVL@EImNJ?wfwJvqmiERI|
zxZ^nk1Jer=AE3jSap6Phec4qZj48*pC2z-zPgdUK-SnmX`O<rK@6$-v7uJk|?Mwv2
z9^V3$B^`sudP8X{Ylywene~WcvM6%gzT>mY?IWdeMEVd{WMgwp%U6#z2(^BqeCs-p
z)rbv>n!k2@|9SE0i0yAi4ZM-$V5&r-1)Bc|3gX#0EZn>jvN)A0?;JteBX~R8uSUt3
z-At8;8stBob!jyL@$@INb6}Huir*>SBf(Ve+=LLD6+^Ss)qahhm@QqMGR-D%)<m6t
z%ba#S&Y2Nx?3;0>PKlLAmZ2zw@Hym$Kd_gr?(dZw9FOF`AI68MXZO<oQ&oPq+{6}C
z_UcN(rMz?cpU=qoyG8Z(uBM#CD}<ap0!T*o9oU@^ezDb9>}9$fu%z}dxW+sIh5vX>
z8sH&oE>{-cCfxgN=xzC#k;R*%i#JD>ZrOY>`rNVo5*Q3yL+(J)3`TIs7ZcR?NXNLN
zLOA5>97{2MwC2im)oa}j339eolb<J>sNl}|l0waS3x8<c*J{6*GkIxkCPBTwBs&;3
zQz2$@E6YxMXMN(egk~SiZK$SNSP{t8J7buFbkTB0&6fMpmo5ZXKy%Xpi0H5|cXW2{
z`05hC+~2o9Lho#~FLTfd+3cN&J)U4t>CyM1E@sJGS|=o|qf%eeyvA3jA(FjQFyvwC
zTZX#hgY5dC8$PybsGi=RQx!JyLj|=&nYgf&C!U;+lWGbcx$sY9c>mzYFZCldAp9=Y
z_)<gzuvK9E5jE$C0b%RABeT(Wxzr5XW1w*e`pVYhjh?vfw|BrB=Vx#_Dr)s*NMcuV
zAV(vjroUL8R5g4Je9)VKT&@iCKs36y6@V@oeD>Mo;zzfhBZCT+YebgSoTIk;OIZfB
z16s^3Ng%!oJG4rwf2EGju70wV@NLf5u0CQ|ZMXE-!MjvSGy1)fYHJ<EAg}<x&)KhN
zGr}I1b;(+Oj$)o>OU}Wz(Pu~la^u&EAqFt=qB)W4(ENS2G|t};N>Nn!KJ>eD&CgBj
z7Wp}MdBv{C5dK@u|H?l=0gnF9vE*aDPs~VHYGJ(RpNeZ=AGXcYDE@XM=<K7BKX66H
zzP)em#&0PY|LWbFbn<@M<tjZ}Z}6SjPe`jui-9Yt+8EWKXUm@>?guuWiwt(BRSZ5~
z{66-w`NPC|(P}R+IP;3ORq^HoY2#a2lna6eOcJb&#5!!qj)8hd<+P{rFAl-O%pO|$
zj?JW6GR+i8pi)}r)JxZRdl8)9ls;yovw2Z?@;Im}a)8}e-S3kV?mP4*NYW#Rbcr)N
z(wHu5x4k@~om3(f^@Khw9dt_GO77M^k+_W@QCcWn><0L0eWw43+$88*;8{f2Uw<?D
z(Xh=2T1d9lcj@8Y?|_u*zynF_y1hO^G5~7gRqC&ac-vM*t!#~3+IylbB~h0a?@HBq
zetTo6F0Y)W5!Hj#Mr-zu*9FFnA^i{K@>*w8j?_=3*qm3YL4t@=KlF=y>svOALWR+v
zs!LZZGr8Bysm;tc{(BxN)ggmMozEuG2F13P3+seIb%Phfj~ckgO4_YifzQ+dySJCN
zWH*N!l}7!hU<-ZrRM>VSgTIv#);aS+!r-CN+m(ahUxc$1?Snp?7`OE0TKuXEA;Mpq
z-?oFhMDKHZX_xw43*-(!_VwjaVROM&AH;xbQB}0TTywF|hcF7Xd?U~6SCv@8{PSB*
zNAWgw>mSRzz<8UbkTLP^&}VYrD{HP+Qg4rTRTu~e>1j^@<5zz4y7YQWlHc04Lavfh
zL3Y14<rOI<INVMb0uoF+t|T`yHf6_bN`PIkfA0?X6OtP9f5|J2Aa|i#gYSezsl=+9
zC<oK;Z>KKIrUWu-;+`+A7xg}-&VJ7QvIpN8H-A61>+FkU@H^q}O+cd&m<71&ma6C#
z7&D#H-m7pp0}#K-;|tA;Ol2M4T`u{fOu-qPal|P{#_8kHtRr)hGfS)G`ul&jAV^>N
z{1}--v{S!HFQ=8B`cO#ge6vZs(Bdu_j^kM>CH48~Rl?@qu}#tK$7Sp<Yz>wzBvG80
z8#`S~Bj(!m0V8acAXQ&`|8UOtjyjcdva*CLJQ~F?8TsDw?DKo#t82%n7Z#UP>J(+`
zuYU6HR%AVNX1&@433+bg7%;qbdY}FAH`<sWe5<@24lxEqSlW%rQK|99rV#q45R*b&
zhGtEjPC=z&B=h-cr6to$kk8cjjJdj!kJZq*tXS(;rJm>PQd_UOCc7O;F572KMWkIm
z+ZuPRyM{b|qr%$#AznPvm{0>=X^Sh3yFm)Le0)A;Y322lTC-d9&)js;oU@{NMSpHp
zBB~#r<;?dngK6_}U5MZF9h$!I6z>Q6+sd;UbdQ?CZ=ba996_qKeDb<uV)RZqIZylR
zPt58oxX|0?_v`&P%^cYZYgg*w#^%wVXTA%|F55K>-6x&}h2glf#1>ryoF+t2pihEe
zG<G&%fOpz^jE$Ud%Ee$9Z<y<gRYQi6yiN168b>(pQfc>1%B%Q18D8-|vvza%AiU3j
zeElEdAx;+s?34X}51WQDckmv7JzaaknmLF!b~b5!yt(O#MS*8TLBu1|*@~&<lE)-~
zdrJF0HgFwbEaRAc33<u3!J%ygY+BNj<$%y`JRRie%Cw?YDtOt6HD+C`z35n>;97OB
z#KI_D{<3&c_fTux`{&l;;?u{c*||Wg0hlz!TrWB`t@ZdR^{dbgn9Lgy*o8sCHE_jR
zC+%~L`kLrnRgh-=%n#aM9FyMVGfSPHX3`<$5ir4ou;iCo73t7W-j=XvAG#qjZwz_d
zalCSSlMt^;ak{Lmrr1qV>FiPQ-uU{vpB7xUewSZUS-1XAqsQQD7)o9g<=yVRz@YJ$
z`eT0fm-yTLcu`qDeMmE7jA$xUSE^Iv${;2PkE&%G_)Szatqy-dz8M#Lsf<t$Ck_t?
ze@Pl|_GFeZfcAirN74grzyBIlx4ssXm3^Rl^lnC7SzMhW23|XQK0*oDFyDL{?bNJH
z46649I|dxeZ74H-5U?>3<oyJ%ZK53dGoDH9wxt4jX+7mZ5@tBccmpV>?v#ig*FOCA
zrLL@rwa@KHdaB2Rrlznt)6j*EG@V3BvMge#>`o(Z0&jvNd=h@9EQS09<JPq}+?eSi
zvb_kAy^S@^z;c`E<t2GRD5Z7orHsk%+WGSp`j)SZ1N#Zw+s&qh+Z*ia*(M~mh1FYJ
zr=Dccl{QUab8q~KXk^dldrX+=(}|=XtY1vHd3$}LKgox9#^$K5`qh&n?3#(~rE!?%
z<MEl+VX^C1{^@GH(6<!%ujOw4iJ9~`>$M(;7S%<?Z-od<p#Nm&O6n$k_5CgJn@c~o
zQ{`VAQnE-unPuEd)+^I_;ti%Pch3)ii|0HC<%bL6ft=)Nxmfe1cf~YA{Z-$OL$r4=
zofd^`ha6(c#oE&$!G_lz&D@?C-}};SF1~zZd0`e*BzOpn7R2nZp$5y;l`}V$%K6_g
zs+gR}7#K%Fen;Br^6K>Gxcq8KGgTRkpG8~ZeYTOrA#{z;<{WfX595c=aCgO(of5qI
ziClCZuUn=u4Q)czptI8xVrzw>eXkGFL(YmG`6ESPCS`TD5l?6{C*0ufFMifM*9x=v
zwBN?<ChnwDozM7ZS6!QI{idZES7_q8EvYG_EjreE-3|mN&nnQr96Hip>XdpB%6(f<
zEsx983#1HR%uK^gwfOck!Iq<{Qdl3J#XkT_>PQ)Q;FO$p*1Zwr`Huw;=8d~7)FPM4
z25Yxb@%}%o<=AAapi>H7e1)rht`9U%tjyOf9&-3@TZw4?#NNv^Z+?Qmb#6{g_Lb02
z$I7oyV%=c0!52Ylyfmk@EM-o;+7rG*cER=3P7<b(mzh)=rk5`zi71cbEqCRjG61*T
zomLmk+1Eusq}n^q9(GYa4!^hjq*O;p=^ob0S+;QDyO>tau#?xEH3Oag;<E2+vA{^0
z>x}!cG-QazKf%%FXu1FY2#yrJx}_b!(8(G8>^N!-rx)c<-OkVmh(Bf7ky=C_juJ2a
zmftg+yf*kn^NShMMAA9?QkkN=L&)m$iLE<~3`<G%LJfCQzy3e^y}Pmq@8v#fLvN2L
zpJ}YpPImZRwovnP!ubSLPh#(VK!UM<f4JzcTdT6m<4Gshc@J|NdKH5!P}E!uaW7|o
z80dqP=Hu2ki>;PkiM=Jd7vam_p5P~A7i2zKg!>Xw)KOogvMeG4qk39V?V#p>ownFT
zXJXxSrF6V33C&&23xO_bCMv#)+mJl5JSQ_xmRX;ZS?&|zi6!yruMTc?n~BJ3d=7pP
z>167}{d7@7H_c3^%BL-(72Pj09_i2dsGpfeo^0~&m}vAmZknUs*oaXqC{_$<Z&;M8
zK8MS=;=-IiBAISB+4yL&PCQvlIjbUsaP*(>DEU>%AR_hHnUSPJsM7m1>k!rppV|Fn
z;r#hh<0fz8x@nVY2b1t7r5eTRp94q=A>yNxNA%gGt*`xuhrj4Y^&z?B{@8N8alXWw
zxnmeDRdoD7j&eWM86Cj~*d@QNxo0QNDf4lxww`n#cf94?0-hfgX{2{zf<R<i%dZl2
zXIw<rB&A|k++6qC@mGnnaaiH&p4`P4$?xOK^I6!<-Q%%QO5EHB8`NEKLft2S)Ro3*
zdJ*I^R?pAcXMoM4Jb=pU@7*{5A7OIL+xgyB=eK~QY{%_h{0*EzB;|F_WLjS@&>64t
zyvZC!3J@)zgoL@fbVD3F7>#sLO?Ry8$!zYiAFuKrf3MtAb=-?27iV|=^@N=2r`vJI
z?gWUl<TBje_ePQ=-dCYkr*8FSUE3=Waxo!ZyS{L7dTT0P{YuO?pIpx6Q>^Kz462x4
zv-w-U<}SCvKjq?2vIR4{-<?VBa?{y1Fy~4iVRt1aIqNsh5$c*E_d1H3)<Xz-4BLgg
z1PRgehPL>GxlBLA7;Nbe6f)U91!>S0M{+v9fT~Y~+lB-FU48~*%*~!P=g3C{x_K#-
z?_u1+%tVwzDaGjs=xRM+qS+*o6T#0wv}~{AoFe%ivdueNU1Tb5I6I@c39`BvT|8;j
zuDZUiw>_R8gGiDhtzsdXn)f8u8^vJ3>Vr07vJL4{W#(_Dk`kuY%BP|pP1>(HLz!T}
zuyP-mJB$rc)1$YW;G)oTL6h_TXJiiSYZ0|auJ%*OUJc%BEz}IDt%;W<kt#Q`59bpY
zyi#y!hz(LPNtTG-{1L52anQRDrw@|j-64wR5DlV~CtClf)wnG*k4!OqvVGy+<?XAx
zi(e<f7{TJ8qs9gwU*}EV5jfK1Lu^y|up0~m6Dga52hE*LEZO6MHF5}|oyC+b9wdnT
zhU>R)u)>Rt8#xvWnB{_!^IHMe1o1l<*tcGUfQ}t-|I8<Y1lsvg6m#I)ujOAPnhNvY
zscLV*xsz~q4~ciNEz0WjGbDTmA^31;UouvJI2d_aJy9@fXLp(}$)ALC^Z6TJUIaZ9
z&;>90<K(Vs7)I<F9#UkB=kr+tDtsGqQD+u6mmj3PV$2q_ighJ~?MW3VK15}JH=Q@`
zs9av<98wPdwhew+VtnRs;Qlzj%rkD_wmr7u-G3OucTmE%U`;o0u#!m|F+qYA<q$sI
z`tD_RfApNA#-yhRe9FGjb$*1uI_JDj+(ts0R#_lDK2J7Ez#-u}=0*~su}Y%w(3R<>
zbWxwC&=hG+a7dsDqf14@-5H;vAX|@=wZ$tUv|Cao;!$R>a9-z<2L!%FE-c4j6Wzh(
z2CVAQ97_ZKb@q05ka^42I?fr!^mBqSJ=8#~_z*SjEFm2+vBRgg)SD$ZkGr<i0sq2V
z@?!L6JgKQn)>yA8v!?D=tmO5U`j{l&SSa<TkmuYDMrEE3TtFtq^?B4`G5lH&C+N({
z(8uEC67X6|J+66^7PLl+D25j)Wmsf}UOJih%SU8?DBkJ;bd?~+qrAopP}-woA+eKG
zra=QfqMpVq$d6@t>qUkIF$$7HM%AVo{8yO^L!y#pEMUvwu>Z=ReT{YK1}E_S?IRsv
zmF-Gf@yI)kEhh}`AFxe*>!HH`DF<p?Jkg8fv*0{YfmxsbBLUZZ@K0^Q*3uiDS2zKQ
z&ptr?;$@pUS@?!-tm5$SBau?Ni%*6}^uljOtAPu4lHjx0Q42=lGpT2reu5Qq;SPWH
zaVK;0ZF9j&7bZu*T{@;;=SLw42vq#%Rz#Kn%V&4B*kn&51P1v$i;IlwV}dQvqxsRG
zyp+Qq;G^ahQ}Bk8h)V)FLA_w3qhW{CGZ)Xh1NAa&6KvuHo91?Jk8$SU+oa_o^If7|
z*E6sjqo~{wILAgMma_!sqVL`|sml2!=c-Eju0X*K$yy1uBahh)`nER96NAHBf5HVx
z-zTq>8MuLuK6$HtZykh^sY1F$mmG9|{|UsyzbH|ZtWs=BU0BUiJB3>>(PrcGRH#zh
zvkB_XEw+#?NE(ti#E_Rwfwyp~ZT99Yg18$zSu3odm37*@Bf-+yN@gN>VdKkMhbF;b
z)19Gk+=`$gK$gKWY47kErI4PK9VD|?GwngDPpNiaVp&souw@(395cDqP9?&83Bp(_
z^S#_QFKqZ~?NaKbc?)-44Tw8{<OM<!A!z$6pV8~hBbg)WXp93D=6_l}6i(FI8Pi>i
z^bhBb*)WAUEn4OgYf26p9(pX?b6G;7$Vi(Ir9IZu#Zq)fsXo=unbnnvYvIqTmtz|~
zfLk^PtNk#vsc&NF8}FV@d`W$oZE=ddeARx9te)17F57e(-OiushwAr1_D^_5P)Lu9
zTf)|6-^D;RQ)CGikt^E-uO*<%9KfNiFn7H4`?Q)Uj^2$y`)$GR!Uln`n{w_!R#AFq
z<<mnA6?4F)fMVOp>r&;V6!7L;z;TskQy!MDk1M`xt~q1d3Bd7fQ8*v2pXcZ%9Toh6
znA}i8yJXF_x<tbXwwFlqF?xlxzw(i~`w{cE{(~RYv;|ZFH|a&o`(tpdrnu;(<r81!
z#OFA>__Y;MZ+HhW{)@379)Tnv3HVh0){S!|zB<Ym@}az70aK8YC~1FdCeX7*fFsFS
z0%=PBF4b8eD^O*2z|a4fV4VFO_5OBDR`jRCmQPEN4}M2o&-lD-4i72yKX7lPxU#ac
zU+UJaTPgSiO4FrI<VcBo6b~abI^_uYVy}p!kiuXbqmXow5aN}~fgV^g@m*b9IV*~J
zi(aZi@;JxexIq(zZ}UY#y-nWW(Zs0Gg^hNUkpViu+Y<k}uh#QkTeV_o-AMMh@c{nh
zg2|+3cbyf22;*!^qzY-uOwpJx>vQ09Y-bGryQOmFPM;bvY^Hb=0bgBMis~mG+-P$y
z1D-@b1Htg5ngN5NWDalShr@?ngd0(tp%(@qlOd6Ud^M6Re^rdN!i&~jc-QY0UFP+U
zXkW=+4WssruZ+Aw6_Tgg^%0mFHc!F{zOtg_w1Z#6^6-*s`t%(?MEG365;2_of@vgr
zwCfk@&`PlJ6Qb|ZeCujZS|Yl?Ql{ep>uW38k>v+uB#L+QghS-!&WjjMC>+LIPW#v+
zPjLcQBbD486GnyX{20V??^5m2fb#373=SPTY;f<Y`Few5j+P2WGB-4DYaJSBlC`%e
zDxMqlY$7Qccih3`kc`c~3Ks!W6n?j##{mfn1+;Qh$gf>+w(PhD7PblEbzlRJJv0!I
z5rR>yfECpBJN7~vsEC`+;|LgcWUn1S?Xyk2d20Sp%1&%v%>O#$6OxkE50r(4v)o)<
zTpmAu_1~w=ZX9O^D_<Cfp#rH}^IyHsX=`Q1MJT(1g=A9v2rPC}{v^>8-Q->casF;8
z7CPnKTu1KCJ8UBw8NuuHs85W%9}?I@s49PO1<VKY#(fwbSkEggaO-#}LwEq6QSLc@
z(RzLAD>B*HNteqW@LAKs(7E<%dOT*lIkqh4KoJZ!_re*olj+<{TUR5(W{S0(VV=?^
z<x%{_cylU;wzq?P_Vu?W|E0dl>PaXI=B>?4Wi2X<mbyl#^~_*AL+|0QhBRXpweK;;
z@Y+i&Ps+DfH@?_tV(9DWa^6l~I-JpNVvc1DmJ=h`<Mqyw{8q-=qbyD0XIr#cLFyuz
zrHiII)&)<6ya|~w(%qTx)Rpuz@WkMq-~}uFZ72^GmBia*&pG3*a@=h3<F55eJvx%*
ztlFt{--aoR$TFU46>_$EOXG8u@+0t|cBIR>0<;tUXjGuJp~9qHXT@8<wKwJ5KUrEY
z_ULJp;_*)8y>kjXL(Yy$4tsQTbyM*P<u2nX`^xh3Z`fj&iAoRCN<2TU{(Of#u+!09
zGH?IPQDWI(Wa6xli2G<;+3%e9lz?-dB2vi8LD06ADnDo;jm^N<3pl5jYY!j3jKg_s
z7e^(@dhAU25vK$Ll`7@g1ooo^K4Sq*YzSE838ib{5ghKwrg^#4gg<bOT1kFL9fmt0
zLxtf{ubIO!M)@4}s7D5fo0njk?CT5_LXV(^?0sc8vp=+Cz3l|E_G<h<UJo{c-uBno
zArxduVeewCl~EDY)WTHBa_sgnr(8d1<?C@H!t42akrk}|?Npv6zHl%(yE;l3{Q%s-
z82d`N4L5bkJx7G<yA~rLHTt2U22GeHbb^`>Z@Nv51f6LajbijGVIw#T&Ml1YYJlAR
z{zZ+%V(XWv6sk9amHKpl3kG>M=!`hI%C3Ak=}Yx0UU}Rw9wfMBPgnp<PE!{+A{6%4
z_e~#sy7`EcKAf>WpquJ0x>nAb!V&|hvpjqEQjMk0Gp$z#ruXj4!xGt5atlT#GB$GR
zAHfTXZh(ZVV&tFHIjf!Wt1Y<ls`ZOYcLosrRlAv^KSxHslt8-oq{jyex!=!+mVb>)
z&v~t=k#1|M<a|8FQ9{&V+38!g>-doNjz(G!a%}I2qO&W@x%2a~l3j${Pnoy^D=yz;
zBni4Zy$|^z_}t0F2mtxX^0zxc+?gc!J>P9^on$Pi1XPKkwil+M?d?<}FW;+e8wwd4
z3WCiOb0(_P%A_a4*2cbk9C98>_4Caw@tow*OHwA4Q7#O;erP9tq)FX=EDv0WZ3^MW
zC+iwa)$rR!ow@9tba*X)0T8M5;Yd5=a$?lx%4ih5dK4dnB!;gP6C|C{;eX!fSTIc_
z?p!rztXtXqm{_4;ban9;WoryX%pRSa%+DU3yTO{>tC6=jRQyf1+EOKnTuLwN-yG>7
zMKUKwlANaan@X}RjCJT*6pw<!Vd$rHcl&oh?4Ql-^85MM2~JWWp?Jqro{jqY!<zcr
z)A#A*SXNmm-q{OyoT-a1y49gc6kf^fJag4V-m^RhZ5OrG4<N&}@(``666EGc#-i@R
z;KrZ1k2j+6wEQI0Cv#;vBWpuakIBwzl5Uyj;cI{b^4`a{;5(nM^<UkTGX7D8%$sN>
zIl&s-tTl-KFjn!)*ABM$;Gl87KGZf6@}=#XEq)^*Qi!QoE114co`gf)UYB$Sa;Ecm
zLZT?J`+z%`-%sb#V_BmQ6jHjQnW||oN)EoTQ!3zZme+}^?(XaB>pruLGi|)FyGk*w
zjXPGfP-wqdb^hGFo<Zr&n!yrd2;w2DQBL%|g^caNo+=Ri>_Q(hYMV!ug@bT@f|;cC
z8xflL5Z9%!zEL96F}iGTvgssD-^fE=$)m8WA;Qd{p@zKr?XXr-q;=40&yKqNsUG0k
z@>cncKBme=F1F%HsFWrfOhKZ!?%@jN*2rWBRu2oAi}sPF5SRhu(JDgN@roI;1j(7T
z4qR0Fj3mz2PVhY^$=Qd*NkwzMhH*ynf-;{aCw*cL+#S=Fr1kIk(4${dTP;^M)3*F?
zlyDw>o{K{>A8yaEw;mI+S{Rk|nP#*SdHIPRgV4^vvbRf};T!Gh)E534#F@j;1x$G<
zYd9*XPU-03O+n@#Zs0`bYBjG<>&t$-a~ujp)5)s^THHbj48p%?l3Y^iVakv=<85Nf
zC}d+GvpXZdUM<@?3DuPM2)tlg{|<bu`0D>U*vqZYkdC@({mAw;b6CAP#2OEGCFN8J
zsRK_hCq|uvMQhXy2Y}CNv1Ik=KU?Kz_9++X_!l)3I+BWLAr21%Qcqan->6L)OrFej
z@KmUQR4TiH&kx%v7$;eeCUqmXcNdsgP;!-hf~n%2f*^L~bqUoRdrM$}+1U@l1#J(6
zh3+h<syN!6LAfZT!US@As<O=2jS%}AddqQ%`7SfVRNG>O)SXQhonAfH=ke0lr*_1z
zUW+P&9QXDE9jmuGS2FrV*PN(Z-$?t~Q4a`;v}<2`fK8X`G!O#2Vh->%r=SFhf%UY|
zRJx^CQ(S}|MDmK5HPHEMKSsndPu|vfnIf6?B|bqMYNtxhXm<83*I&n0$VUWVUEQGe
zZ5@#w*k31h&N3^lzUI8%SrU6k9UAE9y5}~1Eu!J{U;rNKVY9)1{bQP}?KRij5<+Be
zRHD}^;hkDj7-~ENf#GC|5@C;ck~mB?#Wn{lty8OYO1MD1sib?U8dRdAzA@dt^?MIe
z=R6AO-4ujjda@U)sAgnA^XzsVGQI<)gmcmknm1cmVeZ!v`ps56<=9^twg9N%{sJz?
zaCtXLFf@H*z}4gtc#a_t$+?nBZ$PdrT0(J`agUdFP1u`Jbth-vRwHM0g;+V@WJLv3
z)zmm7*VB7b>g(pDkSJ+jwzygdRXgR$udIy_u*=-PD^8#v9IsM5=2?2IzzF44`Uq_I
zp!NMnjR*&E^zX-dQg51MRelJ`dDuUP9MfO;ymA|y4!fC33$nGYef#I;QpMJcRW~l;
zy>048vjhB2u2Ub<%xMhjzl2(1Hrv8OTM4uz4iZxf$%Zhkwnn5I!eKWSFrt3aye-NT
zZIq`@W;WOdV}ohruWRBSSCb|v(w>`1HEg5FXLHg6D+VSe1qGYjyORkSO|EB`>Tf2I
zLx>Z;E1W9IS17^Vd0SrAFx#~&*Gp3-EGw?J@NANLC3}2$uCdo)N|xLxLvBnvRhlX3
z_n{gTw!ZuU0_o$#UYb!@>YeUtMZmZtexR^5HiQ($B#Z*9kJ^P}&B;maXPPgfvOju&
z)kRS_ks9Jh8SiR_M#wO|WYu^mn~qO)PdB6L03Q^jrUbd;8SXKckn<%|I;0bsTk|_G
zL~-7<6ZyyB?;g2fB67%+A1gs656+-go0@}c+|z?arssKLq*MaJq8iCxgEF0{&dpA#
zEepNTYd3aEJm;B2-qOSrjBo03DJRxLG_@XTYh936WZa9~dSD$=5s~$*SnemWt?Df}
z@19q|-!%%p#JKuVHBt`ofp$mXg59idPxju1Uzoot`wfaT4pu4h4av!<AP4cJ!sl6W
z_kD4FIB7KycN~o!ubgQU(<SQEFOk2P*x$-bwEt*c>qNK@a4<a_A~s|z`J)(OG~LHn
zj{_cR^bu~WLefePFW9e+kHa&m+2a;)iqh!4eE51^e)%{2=!uHpUpmm-eDZyJ+}%+^
zPIpUw$dbbiQ%kMHTcWZju-JwB^bQ7;<fG55gwE#$Rp8Y}P6i|vKJyI?2J7sEsWN!1
z>LgiQpWL&}JZSL%nl6?=FU#rhEr^iiyj;97M?YYrGb3}-cdU6OL6j85&#!mpE|*G(
zN)e<JUrMN!l-;ZIPx7cD_h;m#WvZuu9eqmOZSg!^52}Ms_~tJ?NL4ApYG_;KYBx=3
z!HD9dJBbfQ6|x^e32iSkJt!o_<d>p*4P!*V0#x3?UAdP}|Enkjkj*Q{a?jT#Ncv!z
zetJ_nfM0`$GV}|_4?K0T4ryvT?FKHZqs2g}Z+>p0e=v|IRFKFCc*Unyb9Tzth^62A
zce??{b=P7G02yz=?)F_l_N%#yj&VN}5M6Nv*6+awIy_4CP<E+v$n&{_nVAS(htTc0
zdIV|f8(mim6Xs7xX?SRg43niBAh{Tqo`M#tjm-A+$iU%Rc>t-7PlW+oR<Hx!#kwsK
zg#_gfr|)GfJxg}%C+_!f&JW5R*Bv}wr%yXn`?A#0Qd&blJ(TIBKQHq*RP?g8U&>)f
z)L;m!l{qK*vYgC#6M98xGP_lD?+CGI=>5jTr9WA)OWZI`4G@SE78R;G|Djp~6bkw%
z`leT?eUX>Hek;sVb>^c<_)q|PR6Qz?w3tNVlRK!*HBf5W!z)Fhj~Dhr)sLlt8|Cf&
za!$D|?W&vD`8Yv!^eO&xX%`U-jzZ7gY}?E(WJX#CtfTD3JCKS!<vH4R5S~;I5-6?1
zST3yzRkz&0_b&a9Qo&QCpxVtEZ`-&u*<H3!UYY|!1=glk#sFs922U~l)k30()MVs~
z9+Vp7Uh1=dgOGnX$2u;~r^_RCt+)zj(xKB;`<r9s`fEe8msQA;STJgrt+;MU-2EU$
zX8CyIxSuEmCSWWXz~)9XM?h%TR$-eY*v|kjqtQ}F4R?eMjODZtO(N(tZBmL&S^XQV
z-Ji8~Takp`s+JQUU<&fGS_~ihSM`9HKgUOxPdyGjT;CLHcfC$V@EH1YLW2lvS(>Gk
zb+=I7X?i%f21CeJ)LJ4^np}w4U=ZnVYIS4n9nXqJrj<P{1zpxS7L-^BQ?EWkn!8Km
z09me=HHK$Jj_q8Tfn{yznKh&)(GLh<iWd+feR4OtI&YtuZE?V`=q%^)D)w3DuRWPH
z5eZ$#yhvtiF_Q8^_7AKz8b5#?eVaoTAGK8qcVM+^snzrjOp{~4r&U@;_a#OHlB3lm
zSzeE~nnF8`gss(FhMhQn3bt!R)7=@EoiP>**>mp>K%LC8Qy%|)Me5P2kVUBM*Jj&P
z6l01=i=|j$O1ejFqc%49tDD*c&Ms98-0qSGi=F@R^zc^7%K&Joudg2y6XQ*`?_OSh
zY-AK$r8v-HliN_O_)=OX<l*L}rFF#MHL!LCbn!}==ZuLS%0jlf?vbgqO~EJDZih~!
zMaHm)y+ODKA;_<s!-(}Ws9tC#rBK5Q`QI1Y<H~)d2=^+NB6Gm_tesh>lkQ;Q0N~Pu
zB({h@^don@BEN$!N9SX^G=8q1d=hlHet(JMHLrSjiE9JXfm)#ND8ZVDIF-HEbSP={
zOB1qC2i2ab8qr~=pD#*|QK7sOAw4LBluY`O<L`<Zl3foZ`Dh;bfcs++me#?qq~;GL
z&GmQO!OaD`87v@7*h`i(?7LyA(q=DrJmx4?SEd6KiOm7ummq~hcM9$l4!<nj^5YEO
z9;$VX5%ujoRBN`SY0wNU-dtQ+w0DP;%V47@KVRfKBY<7b(l#M85AX}>={+KZMp)GX
zrJxR-P9dq5H^Q2ks{#LNFzhPv83Xn|pWi3IDnAg&{q;Vb&pqnq0hUgOz|mew7P_eu
zyle|}C>+xK=k;zR&9S_D+%Br3q_54$InhN?oP2dhXE?X}dtzC4Dp+4cSz!J2zcJv>
z+~38zo(!-g%_c}hT3T8p*7Zfahz-|P{Ld#xK+j%#++r{EB9F(&?*o~wUWdF*MA^YS
zzG7Dcz(6f03jdIe2zlX15&$HtV4DNtZ;E0Ce5lP=Iv=`5bYiX5J4G&%N26+I2uq>x
z&4_V~xti1tmz$H+PmRFRz8YyIMcIYS#y3@|Fjl`=HlOORf*Ch{Q!9z0_NJ@vWkh+!
zdR2@Y{G31Kx%ogxFW-k>nYg@l^>MRTQ4=gTklJd(d70^_YlkAYFpNz@tW85~&_c2e
zMt0f2$<D+&rGZ0s+R;F-^83(@i}f1f!Mz<ZNrV_W1w$o7CbgWc&dFmxWdwBU$Yx}i
zhb>xS8XI)QGCF^dpWuSe&6u=16o>tuZTvVET=0H#`?0gvP-^~OPiyzc;W4{NzVE_2
zbgB?Fi{u<0fqRiZshH@E35HE3(2anHD{^J{o8*$H)|56ByXwG87^+uHv~tu@J}kRG
zZoll)+QS^c8l&Lp9>v`w@Yk0+Po6(m^ow?xO&d|jpFM}9wTMn{B=Cg%5-S?h-y_#c
zx+m{PZQKiwO%ehhG%jo(ZyS~%0a!Ej;9m`yf=5OupBE-is~#!{XW^DC)3Dy%=_$HD
z9c|i`ZN-IiM5J^ADbGGWPzi9etjn^+@9D-qH>w`-98Wel!a+&dENr0ttg<t+O*i5F
zeK<$2lBgxd5-Ez2q2&~AS1byMxRP1Ugr=3&y^{v2lbie(1Z7lHfZGjxmno#DZo?ly
zIVnhw+J$eaj_+0saQ@Z6+XY-k8PCl(Av?;BiFs)oy;uD|dDKuGoEM1gLC{#qGShlu
z#%gKCDq434GCBakY5$y;iI_eGn?C6aNveak>olkNl5U#+)ch^TZZJBdv4{f|jIlfo
zQa45VIk#k##4CDZ&n>nN(JziVOl2naf1XROCa&C7%(~OAz7nQ*(xf0IY18e}@r3;V
zK=5h~uA%a4i}{P2l$|srJz>;b!wF;!4w#;OoxLE0)q^a@$ISr`9Vl>Vwm7~}gjlSH
zw}4jihy{zf9==Xjtb$Ggxc=Ze;KY`)2RNyJZX$pbFXey@&+xREWChp4-R&++ArB@T
z;&onTv`VosqEa#R0l4h1D*J05joFrKd~IczyPX{a)Yv~W_w3hE0^YoXKsA>9H-=vT
zPH_3>vlK)2QNok9IDM4el`P|QK*5~Jy7y(FT2X~-$IWJYEMLU`jC1;pDWw_=Q9#(<
zzg1_^!`%UK`J6DFfFkZj9gZY<iUQ+?@j0@K`cb1E2>A90>aX@y`A7@5N6RTHg4g7s
zRU#nQCHTpX(TFR4L~ZO^OE(XT4wxT8iUDRknj|F>fK^p~fY-mTdeqxZl<k*qa*XNg
z=RX?VC7Ls_XGErBI;NsjO%D&Uvmru41TiK;9g==`L-2PQr0mu5ob|@JW$e<QLSPLg
zR&Y|$HT;7@uh04qS47O1hElF8xpM)-jL0x9r*q4pbLWZ<@5-fCgIi?!{ZZI=UBtou
zg0mUH!J5*UrgD$eUk5AZ+>sx=v!InIH#^{_ck}?~RGCaUIxM%oa&QDr8U&BpMdq#a
zj{}?uK3&B53TADKuVzLegz=ZtG9?lTk8JUL^l10QT6wURb)8izNw1#jD_5m>Ui@FF
z_1L`w6?~I_h?K3lDr6T&9;1W?8QOyXxI}QMgX5g6N!d>Vew^$^zVss#;9egL!7kPd
z;bF{s;b^VouCPh9bzT3*f@=la`-W`~q}$lcDJnYHXR|?(P4r(5x<C80^*DrAoA$J}
zc}tl!Rbxp`Ltjq)_+V34Sq7*TJmt4z;**rmS;mJ&Y2hQy;){+ytCnKSea8R|i*}Bd
zd8+jGJi*2wii6LGYU;M@oK^L*q1PsXVC?J=Tr<C0ZM0=;cuh^eg^zdki4w3|GM)7K
z_{>6VIA^M#k<N+?p4%v_2iQ<;#)4z$saywEf5joCE5sSe$YtQlNrx}XQfc-&E&1ec
zuZ<`J%#Gozz1lifmLqW9JwGt}E;O~2McMk=vJ#E9YykuQl%%ji*Ny1Njp%p}a5pP4
zWT!(XMy%yxx|~>G!S%$(jo!HiRzNrFig;MoL6BMO(oiM)E=)D~L#An8-?^nr#l7Bv
zn#sMN#WJk)^7n&RZvJsnRDSN=P383uQl6O55-fXX_-b_l8dJ)&Fk!qH`AEm7Cplfg
zEX@<u5~=L1sew{0RVg$WU`<AQCM6$O;~hd4cgCrw%4Gk$7Kjwz_0;0(?$ljt*#D}-
zl~Glb(n#RsQ%TsZ0PsOZAeb8gzNmq;yCU@Vem>H@+@_5rbnk|Cs*IdP<G}x@*G{9l
zA3by5EPSvyDsbVU5G_1fhaaCA6QV|$*m_sMj(FJ6xI}q@gR^EiR6X9J7Z%1VaK`Yu
zhX6%FM2`?oc87*fo+Msr;gN&TBhC|?nc5qYzS6vs)%m|^&dPk0W;JZJcd_Zx0%BcV
zw45qz&I*sU<K|1B_A(ECbY=B~$oP(H;t_0Z2Wa#BO2#rasEXQt!~@b2R5Wfdc0t3c
z92P91+3@lsH<>`G43*dQsffwezCt9|1}lhvfE^2X<94R3gI-Ks8tm@q2+CkL_RckK
zHQRX_w|QzNXD!GM9Vi&ne%kd|@yMOFvv;hO%i=oDq+!1B7bS;cROSeWOKT<UkxCPu
zN}h^I)>5RPSu}7Q#IIFIdIyjsZ3A3L1jz+5Bh@h>wGU$EtVD_wj2!r1IOcy`w&(xZ
z(E&c;mnCt&?rbhOT@%9|Gy?jce7r;*e23ycXDE1h!-J7=SQf<M?-T;iVtBILfVY{6
zo!A&rpEQ8+e@ZB$6eszi?D{peDAoWzMiPLHVVvzRK$B)9i)dkA*I2i1Qb5Uh1h%Pb
zn}|}sGCo%y{IW2jwGQ*y<I+s_-G<UTxSPQdKh#H#guD^KXRkGeUcNB3SQi>rBAqw@
z#5~%sgrGh48RqvGY2GM_{=DM`|2aaf59PF@xpRbz9m@_=f-nO*4|a=PbPR`-!ByMc
zE_q;FAalRK9egndEH{@Iru^Z}%j8XeKvB7T(ziTE#=A0jw0@%mxp>`l;T<p_EX|?N
zUD29Z`ZRn(kddF$mGI4ZAbFYB6Vb!>;Vb+;F`MpC67~ga_j8Nr|0BdZk#YN~6jScR
z@waRws*v8D$Ytxaq!E1qAB8K0GuT>i&eRgMWiWtTME<tW6h|dOIV%i5eFlHhJaT(+
zD04&*F|^}>;S=ak5R|>K7-Cf496(#E$H6#GZ4g<o%=Y|h-eIjoSSWq@i+zU{L66Dq
zb43s=R*Pr>mR~2x^}#pSTW40HJGUNodzi2b#c~c5%&NwFHOS4LsI8e=M}rrEw3D$;
zdoamM&dw`#0zTNF+;1RahRBs?b^Pi1{ORF)Q~KY0CnL@d?LENy!S(h&UG%BM)1Yrw
zkrx0CTF*uPfp!v)N6oJMfxZjABy;!2o~|O$Nr00VtL)r*+|m1RGE7w325)D1-!XiP
zTbXUdf<*<7cDM^^I_pB8yMxywz=ignYBeJ{EfB^sUL7rKm42r+Hu}>yp@%-Ln1j2n
zD&#&je#&tETl%te@Bfs(^z5V~>{;CMuolLo2PCqRPm5NAMDdxDY9JnQ4a=P-7aBxx
zBoHmEVGk-Va0rU?7Hqd=OF9$jY?KfNM(?bHB>BOy-b=B7xWxgpHWvgP-bswq6A<Jj
zn7$2>t7{)zZx=uB=&nXS_i)ji@BT%)J0X|+uBBXI^+atbLAnu2RNwijPMoQ(i}h}q
zDJFisnGV2Z{jJ|uGCw9noK39EEd|YF#x*G)>3H0$k(PJ`i!g_S5bP+`(qYjg^(1xx
zc>R^)L1dV<VXE=@0;h7tcC%e?_9b70>&+(!>21E1KYn;yDlOxiwF#?52rMp&RIRbL
z0bpz(Wi0WAt`>#8$~%kJ0;k=#216OaL)o;Kner%AndVRmdSrtBuLj2M2a^@$dv@JB
z2-GbPdFg-k>;HGt>AH35VOw!RH?7|U$7N<XH*fb^VtEWT=LpJ*4MKpI#6~g~mQp3L
zF#5t@cfXq9$A?g{rNboH_6Sa^6dt-3tL7`1$2%fg8sYSv7<-cL4ujKC5BK-x2mxQh
zxS2^Ql1BBFxU3!K91$=}T6#R?b0@;5G9$0Z^~y}uqw9&|6-uio4x4TDZfV?Fk4e@~
zxDg^DeO9GxpsvB|j}=55S~;(a`1JuA@>xTV0Fn@W^ojT@w5aPd{M=&QIqndBWtm0K
z2u}kS$l!`?O6_`)%MHl!yNb!yF^UVJc0EXo0EX1nPzOK{ov<&f@~P6PO`#U%O0<xx
zV~8lSUyIb33v0FvXyA5gaq9fG9}S_Q^>Bc9!aHb#;XEt+!rswtmQ@<nw@fAd-+b5q
z-vm$(=kyBW^cdXooQRnWXUul*P)QW8hL#}#=MDD&VwQy^IDgd-UPnpAhLaZr6tWF`
zb7c}sq<xEbj@+VYNsf>wwik0u{m2|z>E6sy*{SOx(>)L-oZTO-Ml#?t0N60{-0P2p
zOk=k9kq-awu3$y+4;cv&E~+M-BU%JYi8|3n703P=p|XLrjbP_<s~Pd^N3Q$^sNSN~
zf$^QabB-%-gH(@vOxU)-tOWo3CUbgG@c*#)T~SeBS+pp&7@-jnK|%{kD3X8#fdUl-
zB?}Z$M9G3A$yr4~vIs?{$e{u`Qv@XnNY0@^Kr$4$$i=(%boWf#PS4EGTW_r=Kl(wj
zZryuN+Gp=`$5**pP}8b%tBK}T5kJ8&CcT_6B*1vcRK&{tN6A!LP!pgI6-WE~R*okQ
z3w7`hxs=QiKpHp`vm96HG2RhfJGMyNO|b;Q8drQ)9E}nw%b9LQmRmGhA@;J@dV=LM
zsw$lpQvbk4zLVhJ)_`&SD-0;5ai=7|VryQ2cYl7S+GW=i{2R$j+?~@zxS8Niw^!{j
zi}9`W&Lns)z0T107)NS8+~48kB`(HmB1TvGa=>lHw@^GB+3l3q_gb4LoXx>+Z}j34
zs*5cqEwI86rv9bfjUsE|3RKUBtOcoVQrj(O|1|mTMW245OO977spj5FA#**<^3gIo
zvkCLDbXJ8Sqaj#syVaYlj4BeWqyot2PzL+s4cN)-)yCELPwQe&iV8e775(BW9=ZP*
zVGIi~1<lZ&up><E>4TDkvdyUJnJ)1(aACXh6d(}_xppL=J+)T1-<CPnWcA9Un3(>d
z80FUAOlKYUq||eMchJMww`%lY(^ps0?Et%!@PJd&b#lMSpK1@C6K9T+P;=XSG=*fK
zQC`XfFJb+IDnep$i2#}+az}nrKZ-g0mD=?!Y2YI&|1vsRR~yWq7}P}U)vqfb?w7Pn
zY&NgAR~*crW~$z7_9@Zd!Npb|;9_|__aju>5Am%to?Fv7fPFDiOyPx{oYZu*d{82b
zZ0}pbZ8TKzj*e_i#Wpuq#*Xge*M-A})^|kHnhEab>;hTE!;pyr)VT#LsC~79$C0W}
z4((ZI14U&r_ULMYDG!a7zub(sC^Q!O5+&~w-uw!8Z_G&angGofn|oMjbdvqY=#%B$
zo_kO0pb5dm6=#C)&S2yE+_GuddI3nHl3@F#kcfwAGyIG6@9V>kn5r#ikqG!H@Hb~?
zA>Ld`c_Gd9Glkpa5z|0p*r?WZk-@Q%es^^Gnlug`=Aap@2VKWS*A5ewiJylp7s&C%
zFS})i!fi}wkyX9TqV8@(J%JR<Eh~CtmUy4@Uf}<HeV-CPmyK1f7Hst&w7TUGCk`B{
zM_1Z_q@>VlxY62rZ@YCVp(4+)b^$9?mA6+QT(!5~dZ1tBVzeN}R`t;9*&ddyxZ3U6
zp6iqldTE){!F||Gwj@ikd=tl_I|i+oTEbHAowJg!5x8;5ghowy=jq8DOQG4Ake^Ig
zvh8hH=jk_fvCP5u6N*~;^l73Nn_kg>4eF2hKfl4Usa7EsKHj*r#Yypw{8OrToBjLj
z{q?<_jmg0;6n0I^GgM>k_0^`gVDqaFRH2!2J0Gn+q3hd;hLM<wudd-*gpyB~pAG+n
zvNY-HFOu2Kl&4)LI#)j3bsO^@F49yU#k!*K^Q)YuRh(iQy`y@7EHw?UbrXId>9n}J
zV@RX4Sn0UB@<l7su%aYyUV0cOAHw+He|NYb5Eae@05$m9Jf64Da%_9ISh?S$V6`<q
zc64-o3cDwiBbmE{tJUpiI^3-c8y@2wUiI8*+iG$0(5hPS&bNkpRXMpfx@A;p=eXbF
zn38BL&XU}vK8*^$MB1u3$s;d%E$rlwsdw<;b0}35;%wRUBymUj8kK#+$m9`u*&e?6
zi!Prpnx9eJOegJbj$}kP!qVK;?xh{=27W^HiwfhFEb+T_Hxm4a@0GR!pl#CA0^?=&
zHWCc(aVOD-ft>mtaek6*S7rqKT&5<Un)8II`^S@hEP#Oc#ZF0awPsYhu030w+D1lP
zt@F7U<>@lkT}EiBo|?<VXm7WJrm{L>&~EL0-_r2t;C?;lo}*Q%BVl%Py|ImH*llVg
zDLX>f5PG&1W?CMT9q8C2_dn-es|-vL%Lg0#FBDC;JZxRtXEF%xj;>p##%>Z~1v3Tt
zxJxa7d0R5m?O%C`lK^27elW1US_WlGz-?mJ^qArYcODOtUwE{N@n_K4+;o#IuCjA(
z5zBCNpQSSoE^8PN%+PuuC~&FJRBPZ%bdbwT*oU$xVLW0Z#L36>c$}1?r@ZW=3ITJb
zn1CHdw%P(dFVWdY+HlinLKBDpSAom2tY74Q%BX6WuJZa+fa-7;6^UGHzv^Mv^!@?l
zS}b{MTCI3?G6uq83|qD5kC8hTmUol+OOR~E{c4tZyH_}><{)XVFL`I7=H*~4_co3*
z!<;ijPoi?Bt}07cxVm7qTXV~OeXdtPHU|N9#LqfuHgENhiQ^u+t>WvY&I&7U3hBfD
z=Om#;wge}#vy_z&6;@g<w>9t2>c(0{E@2Fc<PS<G+nSaDt>0mCcG|+Xy43#BWc>ly
zS*wZ_T*eH+UA1b#X-dpXlaQs#6hE{&4ygYkRR;%vW``EZ<uF?CbK`pAr~((5N@zZ2
zVp5x37Ud){oe)4~k}~?rv`b)UI$_Z^L}Ei%)IG&A$q%pokuTv42i(t<|FY@3_~Wyx
z%gcy>JyS#cvT2GqI!2jnMvXZ5N|M1Y!>~=^Q@o!WzwOvlh)67Xdpe6<^ng3-Ep3=6
zU#x$7x&cyJgn{A;OO<m+mU_?f8|NiT3XnH+CXPvr;+zj0>qBGY8$rri>HMsJwKBHE
zbCuw8HfM2Xx|`EjHX8wbMwrF7WNc}~?Gt*4in5MY;^lkmc8$e<Tv^@0s%HHMy`x@<
z!vVx8>pkl|;_bta1e)cgd1CcJ&PEQ?cr_8Z2e?(QiI?}t5>}$Lx6~1;TVp()FQK*b
zIuCiKqVqGP56=g9%w=>iYPirZ3GPHzdlc5y=I6*&$E<O3Z4OQE@B6bKR(gKotw%^6
zV8jm<k0hGizj^hh#?{c{H%RO4*eSoql1@Xpx8qLl%|i(Nnv2y=j}zANR=bX%{3|zS
z9QzT2faEybYN(sdKuliiNSEJ}R4YIQ%@Cflj~z5c>oG+x?c<OPOlzWf@%6Bh7Dt&y
z(v$7ZT^5Ek=r!enZW0#6PLvZ5W0dkS(^|yJr#D3l+3j6Ob+cr)L`EI>$s02U5>w>s
z_cWT96nawJ;{x26+8a#Ns&)oHQmjWWn;M36H#6)<mkLumT&Wd6uGm8s@5<26MY##l
zeoVbxfLwV15seIPN17hq*Py0IORh2+pgLVXc|@~LjB1r#u&Ds`yru8Hrpx+Bk{C_M
zsHj)wL|yizTZw1hT<h5c6%ClS<LqK5G_r+&xKUv_Grc)1>E_g!zE!=usQ3pa!8xLN
zUn*g7_LVWSfzXvl`Z_1PBeK&3LZ|E^yuc~!BXvt_CAVKSQu5O%xeV>kaX1-{C6C-9
zCK+VbS<Se)o_?jT5|}V6yWdj1&wV;~gSYM6k%+arXBE%qE!q-DTe4oU6>Ht7#az9e
z_mfV3@!Ko@?MJk!pKJdYXGfeM?#h$R^D;awEvz1&sM?DpzplxsD$%F8m<7eIw;^+K
zm~anVX4mESgddKyD;)=>c-&FC7a!uH;^5lo%T~3svQ60P-Tl1X&qRN)Te+th+(2Io
zK)R^}xt|7&J58ms2XjpywkDYvRw)cnI|Zk~d0*>284FiULcaKDq%8U+CZJs4vMDPN
z@{ZU&)?`g}w{K@7U620wv}Q|$Vdq8Vf&Nno>NrJbwfmY717)A|31X9T$A!~MSEU5z
zqQt^Z<dR}k#})YF?$z(qqfFFR)y1O%ovCg)jV$}`&{J+1^+2g@wNpIZnCZ@JFIpDS
z<iMA!LE0WvKnCK3i~Cq#tA16{c$g*uq{#EM2-s4UBmVPis^Mx}zUOemroOeib@%ea
z(BC~>@tOxUVlVfp86Rh;h2M!e-qE<ECe;howzTDq`vC!_JX{^26qCE5+P(S@0`y@i
znebGhE?#!xiB%4cgm%xYh!aU#`>9@`G@cv;bsF!ideR(?pHHhIw=&qcs;ru44yUX=
z7E1s@>yZXPvHr=u`!0%wlqe`jch_7hgKkpq(eW^vRk*9{IB$(0hBK<lJQvZ;-ue$k
zbNyu1XSQ-hu?v%HdexJ@YH*Le&N&7q#xdfDyqrO#S7S+a&WMVHV?V4e&hTW3;8f97
zkK(~xH;MW902fd{?MUA&3nd3$lOg&|fZhiPz9m=fDBC$DdC^5xE7RM-g(2}mA8(`I
z+6he~<aejli1wcZ+w)OhwxZvxMGw9bqjtDjBe443=#%h;^`OS1ebP4kj4?`gaM9}Q
zVW%>vKG^eLiw(}(I-*do+WCn8i{H-D>T|K_*vHy%3;u~>8Fzwn4-;Wf*8-9aj?RVn
z85|u%X;HMyYauvCVqmRam(0n!+;RHjR5w{m$YQxCQDrJxkId1%VlrT>*xJ>4!N=hb
zlpqj~&UKd-l{R~UPefn>efr;#QRP{m524lxG>k}<JR`@x%AUj&2AiAp3@}#NNC_pD
z-Q02^N^K5?F)wWOO8P#~h9g$I!^d3x`lInTwW%wm7dv<Ls_NBP;mw<4G$j6%p!)bX
zl;z*653BeA4Ts&>7y+?m1WwHfkBwQw!HmVM<3~IXw)^{ot;(Klx3rK6>5VkD@9k~W
zI9+l!bFganDZmPc7mUnLc8?M9Uxb+uL#y`(OTN0$Qup@b7N&|L#(rg(lkG<S#<1)g
z5vo6F*B=y6DtDQl*1}F3AX2>`(}hMgz#hex)M}BLY*e<Uw+VxwBL1RUbv<&!WP-<0
z50&X5!Qd$#8Kqp{jq2hv<zKveEMvmcqDKrB9;2mg_`%O;pp6-2BtpHFHi1{*4_CTs
zqUNXG!$cusNQ~C%U|7$`K$1;h_p70dtG)-p#q*~%+ZW5+pUq5BVZWZ5mwn^hL9Fr;
z4v_zYEv6cI;zezyKW4|$kdI}H*x*<Cq{Jiu-!-Iac(>~JnxmL{5pCwX^zr`b1F2j0
zer7XfFUybRdZv;_3?HtNJP07FaJ<;RF2a|n&5S;mAN5*?Km2}`akOc+gzk>*vvAjK
zRSk{a1NP-2G`mvQ!-ogUv2a)?F9HtB%Yd-j8)$6OEWOnCT3w@&bE^+eD6$c!A&L50
zME-|kM72~QxyM|#7PDj4^qiEIN*$i<ErkukL*#HGRZF{_+<*(B?P8`j^`f1V!d=7V
zQHp9L#Z#k<WB5IV)?5i}YEM-=FVleiP6rL#x2n|EJ-{%NV><tec-YBy>1NZGS9(DH
zk*zM6aH`dZ;a<CuO)?u*9Dp>W!aVr)%(}#)PY!ewqqQB6CWd*OxzYUr{I}EIiC?_F
zZ8IPjGrw21O^;QD$Lb*=*TYT>fJ6Kw+%N$dbN(buNuf|DRjfWD5P2$tIoqfwG<c66
zsl`gIEF;cW%|aLD=PNFbJ|)K1V}Tw{3B7sc^E{?f%V}<9vm4vaL`3bsk60rGZ@T7J
zuGO_Qce~{zKs9Wi9Y#xGvlAq>0HE7i;MTlleWQGR{j_h@yFXlKmj|`SQDz^p7E{sP
zKvp)v-Okr6@=#37!@Lb&)9Zj>182~LAGkkz=lS6<X0m3b9Ls$mmA38Y8Cq}M;}yBK
zQ!j>gVLt4A#Z<VWnoDCh-eyl00Xs>i+NoJ&ecuyM6-m^R0H*qzobcaZs`9u&28S8P
ze8?C~w>U)xDKMrUX_>>bH%&n1026dv_|g~KSTZ6`n94GYwPqLtVw($7lUat%jaenZ
z)@2?BE%9o@=1LxVy2X|FPr=x!vFjR(tGd{U>{Wm?;pyb}GE8gngSmD>_*ms*{P&f+
z1P~{OCK(r=K8i7h6~BlwygnZN>D2?S>{EjRn7HV-EYxw)^1J-Dnh+y--=(=I@5+O*
zr|QtmX1KrTxg?~~BM4(u;9kR|#Oc#n6%o>p#2I50?!*@$@A5y@git$VgpCiXUuU$h
zCk@tmk2v9)Jc`V<V4jFMf$T^7-+3AO9Gx?#BfGQ{af$6xHhq>v$#PfT($t=C!eI4g
z&1yW{*tebO0N+Ej&WTvAbel3;N~@)oEzuX*-K<2*ru~E9pIdw|i}Am6MI6^5cd&mO
za;2rJT4y4@_sX4wz})3#IDG$(o7(LN++B(mi}4R>82_s(Rn<mJp;zuFw5w`&z1!xj
zWmMbYnR-lvVB8y;Si<z*@^HU!k((G(L#0;Bzlu0D)wYZA=SO1B1V~i>EY7!q<(wt2
z2_fcqJ$vHRU3KTMjwEsWKPNO(qh;0$?MoQRYF&;gN8F(GC7#76m~A|<9;BmA$b`ZB
zn%O<VayT(;3NcO<8*cqXq#B)PpxK=UZH*)ps^hIIpCvBMzwqrRx5wR}&4>D98w}e*
zOD(vliZi@}%W@a??Cp7`V*%!v-8uM{g*FOdsHwVjXQ}pnW9C{rAP1im<-hEBsQ!o*
zPun8RP;gQoGOytCwCS_D=zN^KFOz9<fvq*9W|YWF8E4Q4+rii-T&2v-XF<7Bovaq5
zEM#RNl&Oo*+Fq3+sMkd+9TR9W6Q2#-qtAOTKxr=vReRj;Jn$qae-cHXXLIeGjgBbV
zSJ#?+q`FVd37IneU?Hn}6LhC<>{tTcT%<A+yJX?QEFz0qwmPfKc@{s#qN%)8rDvO1
zKz#SRa}^?Ogi#{exaydC53;LgtCaGq?}r$(%R`^xGtDlOOwa~J^qAcWIp6W62{j<l
zuP+tv;gH66R=G%vn|Nx7^4`34=Rt{AlHEmz9PhV0e$|UL9zB=5T0BD~^GMUT+0xh|
z7G6_J@K&7<m?b~`Bz(=NP}6YL?=t%6wM&5H@J~AIcQMeOgyCMB$C`%q_y&LI7BBuu
z`3BCr*&|DnqF7IC<e9Pl`c!3WWR=Bz)HCY^xQAswIs4|y(1+klzM|HQ_;QETnYK<@
zSfiVT5}`M49?h{(tt&L-&LIxH=oEM-V^{Uao_kLMxx#t?EKMpn+)Gpl`gTo`Q+PTB
zQI;v3jo^;jXio(v@raeWknNz`cFXLOK)7G|%(*K29>gidD=!ySkY)B!m6solg!vEj
zwkxw8Eq>+2k1uH;?Yk&O+wpEicjAaV^L4@4GwI3rRM)jfkZDD>l)OZi`B*=2h$ECC
z+>3M}<*YS~7Scd*fy(LZ)0G_678`Lz9};_IHzP&y56!S1=~=t`wL|h-*@$vygZ^kz
zU0#O0>0Km_Cd8`RZv3WZt??hl2JoWQE1X)ZukJvP-fb2fU|{!poa$x%r0reZqRc1z
z3mhTEZ?o77_j0YzOSa$DrZyHHg1U5Fk*r#aHG#IB8^HA}_g3<My8S$@#n0ZU`|#oE
z%i)d*UMrp5YD_QiT)wW_l1`!fs<ZkwyE1Yq;l6tA#)ZnKgh}3C0j-yRqxbo}_0k27
zvb+APr4>Jf4tO5e>}^U>^qN=OmQFTY77P;|a#*;#wUhz{2Zq*W?FB9E#O$ZD4|i;8
z%Q_p@QxvH&F}ymA>N+}*jB@;|46>Tyswg`yD%%Y2wpXU^64Y(S80IoL#}VpP;cE){
zcBCu_&~L#Prw?F>gWWHlO!=tV_GdPBg`ZI{GRPh*6>C-6xTJiXt($L4yaiQLaMBtw
zfA>y0)h)*g81pq+3I$g0V&_N9)0dQwHBjA>XBG+db5r9}erXI7Xv!3ef0Ii^azJo?
z!=PEugTa5%?!6+G4LNs$>;d5enc9J(n#UF!lb{xMUWQ3yOHkjd$0jXjr@=;dQ>7&y
zzsuQLqNJ%WZZp+WGDB`v>HK9OMxN|novmEi<<x5c6QefI-Fx#S;I=~e?jgb2Zi<Vm
zx9g6${43UG(`|2bg8oP2SI>Qd6DEYWZI!t+&n0;8-dnYS)aLWE99Seny>Pe<z{NU{
zI+?==HN}<8;y*nUo<f)F$9Xx7|D=C6XZBJrTd|F$!<1F?S>pXlDiA`${&NUz@oui<
z)+ChZiS^j7Ybp2MODo6IFPD2%?6s{jrlFK_4b#n)S8dEwSNFBl>MsVQ@#yO2C=}|&
zKE+B5dU{7@P4=mq!tD|-i$j0Tb-d~><ai!F{BA?(Q@!`e5(lBh;4(I5HByd4byhRe
zWr~ZAS1ZEi-rEngLqO}twK1M$^98a^-C2~%$uv1TJO-BbQjInO_If*(WDNtMElfMg
zg_b+crUr!d<B-GK8iI)6vMyUDa5~~)C&aq_Y(80s>@cjp6=SrQ9emxZtwFsykbFc_
zoc_&m@!(Kj0dMYZZ;Es>-GLzDv>#%()3>+Q(n)5>!gtt0X2@JdXL&;y=d9&Md^nY7
zk>NN#G_N9h2GC3={6g05P08<GG`?)qnZ_MQ5CNrNGV|t<sXc-7N|Z#qIkx-`Uq)XK
zPd@ZSNP&&Fb}1?L@^QZMM$O4ACaUfeIe{^%969$64YCVYq#Sr3;W2W~imx=44+PWt
z^-Bfz%H~109YVZEU<qf-UAam;(JZ`{spMqopn+=^$Vgx}fi+tadaoi@RC{QyEeuZI
zR+iabK27ra7T~A+Qz!D>=6&!bSurcdg>r|AjCmt#MeQ-%T9v2<sl(KPgK2n()aHy2
zU0cZYhq>4F^NZD$3iaZjR$DEU-oQCnl%vhl(XQ#(p;0}-ZZ*qgr0qtZi%+a~@#tqG
z<!0gWgxLU5pRN~kWu=lPOmbulAhmTi5t&L*A~OjODYzxuED1lQz*Z^b$eQR>BiJVn
zRbg<TNM#9D7|C*1IF4z0uLZddy|k5UfzEhYa8g-x-bhwH57QiRB3Iy8*m$(_z=idK
za0q37o%iJ8+I-W`EvVZ9ez{Qii3V?SLC|43$^-c24J<sIEvWrA=Q^g-E_#OXZJ|Pq
zHnCDWB5O7#sSZ9<8m+}u>3*_7lejIJA+)R*s!`P3XBb5myDV;AO8D$p_It1_rpBW)
z?~w&O(u(-7M&sd}<mqET9wDK!@k=WAt2D^@^jRu)!GexE0`noCdzaREs>%@0ls#i5
zgI>4urrwr6cu;Q;%rc?|kB9l`xB5yl5sfaqV<jw@`KqldqpB0N20KGmCaw)xf6za>
z!@)i3GH&Wuog%XxxF#~BX22U0C4-z@M=jE*d3HYQz!!h<ddamxpPwK^B5wPi!GbxY
zX#K){MOyiEx;6?yjlk=A>Jkt^_iBU1561GR#md@;99#Q5?aJ2)3YzdrY;&jD<b37A
zq8h3#P2H=~B5@R|vdm<8cF2`kK#Fgx)U;4w{$lg1xB@=wr>?)u#Rp;=sIpf<3>`<@
z-Lag%=Or|?ZXQIIQQnBn#x~MXRplx4MEjMgjn5gqe|IJ@t+u=1<d{4EwaArq41_u_
z<7Km^CFryYO(k$;8<g~7AlDFQluflXrtbQfOk8$@Fsc+l+?WA6un6b`{mwm5%1s62
z49Tv+<pj5imK%NJ7w2pO9Yna}mE<EmFtu&B(Z$i@#dAr0O)pF=mJjl>v9(Ju76!ox
z{Be2B%0CX2$@T#}ratq2+dDpK4MNh#Q)UqoMt)?_meCoe?fbV+_gHsIp5+^Fc0K0k
zwG^hh$ZT?5vSuPgS2VoS)5&$HJfWs4(hE_I(3z|Gg>fs>No%`eTZ{)z-;`q%j5XGE
zR}4Q4o)<PBrv#qW?knNr?~9WbmB}<>`Fds16zNvmS#U~1`l{yOfIOvwGQq2D*^0&b
z1r8%I_;SN#q@y^>akCGQnUOC<w{BLN=5~tNkBN<ZVR&*%YiQsW%v0CKwZmdAP+_a}
z4zz&M+BsSH>4I`;*2!g~X46SZ_!{3h;te(n^nQEzM0azat=)&&pjfC2(~`*@SJWTz
z(_S>Rh23pMsonyHly2B|9b_mF>KF|PlNteJu4{I}v%|N7lyo6`+<tGl87M&E&mVT8
zHPry&JitI9a*k5JPME<q5S;FWu{KP6F~H{_d(~=23u{=2OL8x?hXBn`XK-{Vfp)4v
ztMQZBUXRLxwDqJ`KQ5FI(@CCY{zo{3Hv{;)u6v=b&KE|wtdx7VrCMVfazGk?qAYn^
zIbdGnLgtb8%3o=C|LW#Wy?5MEsU7PXn$<50>JxJBrcU*8KlI2&8#gUaI7$63M*clH
z;a~eaq|!b0!RIuKB8`h&eMmB$b)|tNR&;eGChMT#ygbsX-5w_9YOYtwmHce0-|cv~
zxy{+@&OXa~vats#6fYwp64L~qE}c-^x_ZzpAs^Y^MVY^uYmq7I@p$-VT_4leelXR^
z5*YNYIrI2q4)`;cdHQ_&2YL3RQH+@Z<-1`?bN0YOM8iDgYlLIYXsJEkdkT1}Mz^Tj
zQL3S|jOuAM-E+CnuShn*s3YQx;+5NzC#zrU1w--j^&{c1J5aw&VMd#)%%hpsGL^Zz
zB73v3CNm@`ZFqN=C6mYOMVDE67z)R?`<6jnutyX+(kww<q;R%afiRZf++()%IOABb
zL*JQ_(LV}ypYKvXj!<%qkdQnDBZ6<Kdx}QzF_?eUr}4R9$I;uI4;h}4;#Ryxulbr^
z{;SgakIfyif0F9QAZhGkV_Y#6quSTEKxHY+I&7`zIAYMK>Y&kTpC>?!3o*xeI3PZ_
zj;W-mjwZ=aa0+JT7arr{{;=AYSi~(pNLjcEBz>Opk&RuHakGfC*qKQpD5piC=Z&=i
zaflUu$y~86t~RU^ma+t&#FgM8(o?OkQ018>x7qiEu7q55XK8va$WUxLff#(H{1LUd
zn7?o<c8!l3aqmuiQ?4E~+gzM7pLIV%`hASQbC)eINDB!@b@73_hDT(X7lU0gn0YM1
zd+Q7|sMoOEdcmPWVtP5K*6dLPo%^E&i{edT#f?$0neR~<A5iMn-kbMpot3?R_ccP_
zWqxcP3+j{eRm&sA@F;gkia0WH)HcKBrSeGR&zAj#6Y|v^P$ZR`SYr8hRFJV@6xM^H
zR>Pvp>}iZj^}LGpFCoh}E4{X>yix~+yS^}3ZIBD^$i$Kwa)-mThi~^4=Vo<_^^F(U
z?_@y{oxYy(Gf(RT6HZ)-o6MUFEd`n`Ex_j}b&Gom>7V`d=)h+9j{H`9)9CzXb<-|u
z#n%j6=u?V7MiqWaDV2r%f_lA+#*~sQ!;{VAIgT{o6W&O9nBH__zMh64HB;Pfq`C$0
z+mBa(m?6!*H#+e6pe^h&f%Q4%)J`eu01REBw&+2^LcIHNCf|Ngb{J%D`E+J^n}W)O
zJW?d9Yp<)lSANcu<dUXl@~rZ93Bu@q=#YD&K6ePKHiTpI?a&oq=8Tc<AG0EU2VS|j
zH3#mib0wD}N21KIPZmmz7b<GWQRb$Nfb#<@LYK7RoZ1Bj0NHeWuPRAqs@N&FQ^0*p
z0Qgj^Q(8K=`+P&2+H!;9cTJhh2q8{84Pr<8vIpOo@=Pn2vT5;8F@|7w#?|{uhtD~Y
zi^<0N>hJ_@jnFP5^C|jd^bU|6=L3?H+tfcckfYXuSf#=i!vR-|S}YSn<&<}YQ#|ZU
zem9BQc(i>T@}VUz^bCk@$FrK=JHOO>h(jp7dPfP+SOpn+q}DacwK^#)0>P_|5A-|L
zJeb~tTz2)&Z3#!{W~b1e3fdzVwj+|#bF)R=Yu#ws!%+psD^_R@b~C^FNpeopklWZ$
z0Opk3iT{=^1NN<#1!bi(+@p5Ln4jnmYqZpr?Nv|?O4-UrA2MP^f$_=2gs+hcx{_V;
z@Lr_9nc-^ba5&(dTLd*<2v(F_(-F;ZyA<!;ich-Ges}okfFO-68^AduuTEd|6B~T;
zd>-k=g3mK?oY(JPS{;pPs?urKG8_?jcS_N;M{WPy5#SP|HbT;v)fP`6OJhyHQeTJ-
zUVhKHsf*VGbkmsIq|Nwg3t3+R#B}s$8_}>c>4tctfzT6TU3rhhzXZRIdmIU<p@!B+
zGsCS#>Fn!k0Q*RXsjNXXj%8_I;XUm*KTM63;%ReZQXeu&X!y~Bkynef^}4flx3hJ@
ze=uO9FJk3#BFS=<Yp#fS#xybB+kc5IL+*oXpZ(LO=AB!LntX*V8A>wBQ9YRXHU+03
zHID+xb`q=%*u$eKt>WmlGuO+>=;97GgNd%ockOH{xXl;*6(#*!H+CDvOc(`+_VC!_
zjHP6{sxRgM(Pg@@PA`RTMyo63p(;*rBCk*pJTtS5jG@m=SVYIuVNNR+u^mh<cB$Vt
zWi?RVmYp0;N*#OWuaK6K{dy8*LWQueYa1oIhIyz9<xgRBn3B7rchB*|=1E8LM>cUV
zGYIW^>LeoqmX=HeVg0no?Y6u(s#X>~0+gFdvPS{Q74Y3R%d&9Uok}xWzIK>yiJ=eK
zSrQ{cS&W8)Uk6i+@Ii+Jp<Tw8+(kOaggW~Tmb`xXw*n=El;2wzl$Hyv!~96~r&ykk
zriY<v)h&)d8Pi<%uQTCV%(~M$r#U0Y?C&|~HZIL&Lo{%`1cVOO1{hR?fBY_xQ)Zf4
z|1^-{jwz8uIh++b*2t8fXpUkN!lk&M33Nhg!=JU2A(A4ZTHdWFG|;EmI(k>0d^93B
z&tzQ!Ef>J)n_kLHU^I_otT1INqj4aly)0Jf3H2-IACG=zeWi^DBN1_`0An6u44a?o
zokSEqOL!AsdBB9#qQ>TmwxfDZXAe7Tz||qw;{hD8g4TvZ!OKgx5mDBni}V3yKrLq&
z;F@80OH+I?$j2S;Cu_C9((fE%SK*68%-RKUZhqwJ5)|l>fR0EA?%SAWTAJs!3JnO|
z=n(20OAh}}H*){YB<dI#1#si&*Fg+n=YfWj#|Sp~7S@@?m9oVt6AR&{=y4)ZZ$A<@
z4@UC<OIF=K9)cbr-IOcaU0|qm2uA2MreGJ>Jshe+({qbh#5<{@7ySpyQ;PAQog3|y
zQz}b3p*<6H?mrh$<b{Jlh<&MzF*ZT3p5n5{8=^nB1&_<@-3{~jQf2rBG2C_0i6UJ}
zU@;Nm_;|Ca)akAV)lGRHV_2KEBYC1~)!;=yq58msWQ@MYQDO*c_eN(8!Fr%mGmq1&
zlG`z7etSkt>khOjH!>fxB@L+6VIU5b8UPD+v-CjtJq#)8&jL@?=P7eU7PUW_i>3tw
zZSaq5sU^v55_|i`{DG%C^<7Wr%8&SL3zPTYALxDg?eI5a%v>@Mo2^DH^c7#)H<<5^
zUtE*~o$nMKgjSxwks^#72jH1RI_F7c`{4IvnYLwhUq%$aEn<1Pq%I-4i*FY<w<ieS
zAd5MOXnO_P0{K@e`(6#7%iH?NGM?z?*gs1enO1M<@|oVUFl6NH03)l%B=W86ZT%j^
zN=SXBHwca18WFHNadS~&Oqy`NGG~o?o=C>{dv_RgG}0b6LO$hx<w===9fBAn7;D1?
zn%a)ov!#q?_BSY#q+*(d8BUk>PNMcDh7(Pb`=O&tbj#1QMHvj^33=o*W*LU5h9;>V
zu9+U@rIzNi<2@@<m*g?PcET@wKS?pleSS|OLJq?e3Ddi%<L-3x_3r1tgjdWWKTJ5i
zQ0>rJx?XA3&{qX#n5Vw1HznlOF9~?bgq<o;#KXL>BXHicd7KzGpV<AcX|vGgMRf3I
z=NSe46vM<pP-_-gZ#@3Qcit|jfu1xedbG6vTpWH?Yq+vcNDz%Gq3D%~_h@>5MeHu5
znMVV@5mFDWJvn9uxgMRwshVej1{A0QKBt(<tpsR&c5Yi07?+|nC2*3U@qDuBtsvu9
zgk3@Wt$%I{nk^+8G%jrmFkqGt7dqz6wn;L$Q_@lr%SH)}LzBh!qK!lGDGY6S<c(Sx
zhJ{ktkFLX?R4$2;y-heS($kQg8w_sN@$cR&$g4-1EniCyrk0PkCwj+b!D(qlteO2~
z%X%!-aWVJ`XgADqIop;nswd*_pLV|njvA;(X{k8054P}>;^%Xm&R#DEE<?EMlQ#s&
zu7f{HYdR-$nk_}mS=i@uVuZ2B@mOCvpBUa!89FMWpZZ6};;lW)cnJ%%Q$_C$on=PL
zL?;p>8uYXD+iJG$k46N-H$seG7GM8KH5_JakZokf%7D1{nqiJz9s~MNtazoy2TwN7
z9t%sl=V`fVWX4R3xYy{8jM8jH#WlSVo=3b9k?CE4X|v${GRGJJVdk>+^)I%%<+uo?
zv<DI3e)+a^O-9c;Y46b+;sgN3D}3x}ES(C<_*tS$evV6Wj!QmGzlQI>5tn%8!z*%_
z;O_Rlw>8ojZ=~U}((c_w$yi)+wg=OK{yd}cwO*n>gStcGsNT{na_UC7t{ASJC43DG
zU6K_1L}%8)jJj~BW%0i20=+ebw%9=9Dj~N>fPav>*zq++uZ<{U(Grv`X3Sz4c|4|t
zh47*5l_a&}tEGb^WOj$T?-&3TDraJ!%I{*3Kf96LbY#@;xUfau0QJ6is3m$G?w9YK
zRR?a5=Hk0~a>oj|>jStB058aNUt8WIN<6=1!F)a5zr1@j(eVMC7i?O27GI>`1fymM
zI$xGF+xa8aN!O9d5G|0h9LvSs7{aSqX_f0uhQviM?%i$NP(f!^yPytVSbqLsBzYRe
z$|wkmi~o=VpBm2q<6s3kvyQ_SJHQaGZ(RRkMKzvIRyhm1j8H{*UXbUezguKuPmPvv
zlt?TnX%p!9eCY|fmd?%#^~)Am)p0+7ooNrfjPQMIk)e8DSGi-?CjUTVDU???XE9+h
zi*})$dP{po?Sn#H{EALZ@aWshVd25)i&<(`Xf~4k#d}Dj_jGm?4V9$G=T{kGVuD1w
zC`HLsko6dUy&RzD-L{1V8+~l>MmgK?Q^wo_gb-==rqNR!pzOIb(svDO)N9lOcqCdK
zRA*f(i;rwM3(F&AhUi%+c933#@#5%EM}ow2sjM&$MJkUi%L5894#|>~JIq6Fy!89B
z%kOe%9?u*=4XkGxDG+Pq*K@mGLQM7JT~n#WHrsJI?ifu8*WLgm8F$u)RbRPPj2tv`
z{<7qI$fu*2;M^=WvxT`bhYI{aWVeUYl2lM1V!lIR?CGZzb^dF#4rhHBpjPq)yX4PP
z<~r;}Csf98?TlMN(m0RBQq=p4U<-EMfg2M68w3&=4#7+VKlrZ1bFMsp(Rbrbpvy~{
z%lfjo9-t?3(hr(4d8ZM9Wm$4}#Hk){Ne41%*5^YK`h{lmBn)WOn5+sYpmDUGA_5y7
zZ9Hndq5=b=&>sH5G4Vk+uZhlsCL&pww`CY<R@gz-A5574RxiWforc)mn$7-N9A&6O
zB@5*^Jh|X#WgtJ3M~ai4#b{~VF+Kc=+mb6mRlY3A9gL%A^kEaNQG-gz>lzLc2xv0*
z$*k<o^rlg|kj=+60ugH=Z0;<Sn)){7Eyhna6btJsBh=qyqY&hZ^_47qnqD<x03Xb_
zEd(I_rGk^~54zCqV17f_{R>LQ=d1)XCmLZKU@GS60Q7Bh4Qktr$rtLM!U91z%>bmS
zd8g5`@L>rzu1rQvYVyoR*k)-%IdI~HP(pO45>~ZVPoQ>5K*|y%u2NZQq})^?cwIL-
z4DM_nqG1&w^G6%)JEGn1-kxauml=}2l@P8HgPrhQA+LQ85+<C3cybDQWRZkZw7glM
z<L)wv$X8r0HQYLNux0**SK(EW(dh(00xnf|+Ypeot{fX0FTUP>X4FnsX96)E<;Ffe
zPciIvv{-1y%)>05ZSIot>-6r+Za_|OMr#uPA+taj&nWjA6a7YyV+w7qF{LKahSG-l
zfJPK~Mspn)3e*5=KI<epfA>|d9SP~=>gQLkm5?cUqWY(n5VXH5s{wvBY8Zt$S?c@%
z#&v$>1{Y#gHam|8xNUD^*b*U+ab|#}Q7Z%oV59jcx~I`}kNVO166W;FD5j;%OO`qR
zGwt_+n`W<qW|3-lyi*S+reB1yH-Eme#UIzlpp!PDV#i5P?!W1+ivQ41PiMYyMtG-@
z@mLnaWnInTG>`a5f-Jqq3nY0?Q9YmfGNaqu6`glPzsv$jk?!$4A*@U+bK465hn-Sf
z^+uiZl>gMrWJhtuodx+>npHf-ou475tqx~*Pg0WXZKd8X*i!0%OnzGmu>m<J^3Om&
zc@A8J?)jO6IjvtPZLhFA6wPiHq+C^~s}Q(fEkI`@?a?f&Ibdn0TmHZ>9^e=cbIiAs
zJW{(Qz}74vXy;-WjUqJ@W-amwLW&zg+U0a_VYlYq|Ci#v0KL|XbSx?Zi!v!k_gZM?
z8TsqO^mb+$o^DVG?)c!>Cp5FxHVWDof-~u?3>vl03h&6q*7o^c)(xr5$(~$$s4MGG
z*U1!zCj^&>_|QFI*)qg;rjF6sZv2!X_8`J_dE5I{JE)-9q|~B26d>2(D?xYSD*3i<
zjtJNAXiy`XUS)Jq?mZoW=9s`1D<lQOQ~~#%60I<jGNO{BS3iLQIF}$Lg%Y3$sgGn-
zQ73XzZ#K9WXS#`lSmt8MH>Lo%&f8zxXJS(10gXeg`H(c3p(U0@Ias$8S6&P)K8n`B
z^k_b2{(j14=Yij-Ng9_3+0XwjW%}o6&)?yirwk?OVrY|c3lmp!`jCO){k%kf9>w}>
zovBOZ?FPsfGVQ-$wcsGQx&~5X9jPVH+VGXEg-D#x2D1a&#@%Mbc<_E@4F<t4KC72B
zc1_TiFVk6_8Qyy*0Z=H<VX4Nu9`E}?&nTGOCaBwpQpIRku~o2`YX}0MAzeynGZA$!
z0#-jVzlqY)NIMQY-3TiK3H8Walqx7ud`!=M@RRO%cOtmayZ9?pV;g`N_m%nQgZ9$3
zRi+Su<qfq;7Cpi#Ca~<g@2Q^!y0PwpPY=bjERkQ(gceeiw4W(yJyWbmQIu~-vKKpu
zJwgx~+|^|x8)hRL`UClX4Cd%0o>#ef_5CjI-;uEEha7ABY~9My&7*1pI6crD=miOQ
zbhv7;EGXr$&6*6*A~_Bx6}g===qgd!G3Y~ct2>Qa98-)>@K}eZ6=gtF;4ixCU91!`
z^};T-lTSToBskBBWN}lmSkz~kLmwdc0|=8_a6#IOA!TGm7;}YI)Kg@Kk*IiB5~f+;
zk`u@x2QLEp);;zF(-{(z2}VKmv#Tt@MrLxA58+n<V@YOlPNW5Raee;zd)ubT_`J;S
zb0)ynlnOA-%l^mWUd&O36t!E<JqwnwKT~pJ;N)|Pr9~WxZpJRtz-|oNUX10z*DhVt
z=w4W5Ynb_itA7t7P@n!w_ESvIRRg$@BkQA}lo=jL6aR#TnfWZcjh?lfwXY?tJ<>rA
zN$=s%Ms#ggp>i{Q-+5vAZh>j);E-cV#xwo*U7^7uDZxjovuXwU7U{|)1yq&`ieEE?
z+!nxD$%ok$-miSVs}6apNr9r%gy0!WXf(FS(*|Nmlu(T@#k3Sh&vK^f>%C8FTF;>|
zlc=5$P<@1+$m=EnVj6xkc^MP_)teB!vMg!S8^C_`7m-O(k`D*a--XRV771(&tZZP9
zM5kQO5ELYiGd8gvnf2N3^j3y6*#I>?D;|aSx>ghg<LJHK>8Afb>*3O|?5`%Cgrk=c
zrimZKIx@qb)#CKqgV9|z99cc`8b}%qr?WkrQ?%wAA^9bTlT(c5^qHap_IoN|gu^9A
zY5D_CU9dty#m(L_nb`d>%ZC;%pH$+Vk_Fp%Gz7!Ql>q`}yL|VPz(rf~IvnU8sz4sy
zJC5N1rHs0>PNf3eB0^6J7act0qERo=Gy&nu10(QOu49d;vF6m+3Reg|1p`_1+sjDd
zk^cm38a>t_KxKRjE>&4m-eS3Ai#9#HA<HBR@Z~JRxX=tcVBYX`eIU=JdunV8(+^W@
z1<5n6#8LR}|0)4Gt&9v;4aw9gRfVO<LbID!??U&MDaH6YKD3iP_>?uk5I3I$LnO&8
z+X$eOShpT^tINX1f>PADBhNitcsf99OE_-1^iV#)uF%ExGs3X6)6{Y^P%?@x^W?Bw
z&vkQA>KKJ>8LH7x5c22gRUmlUd%J^=H5N~4B>CA7NL&JCy{bKk+$n3y+{w+kA&h{S
z@>0(TN{vv;4}fW(J7U2s9_GKJw)%XHk74!7?cg^+>56#c%9g^Y`)OIrndxTZ-B`QX
z7j{}Z1M?TnqiN0ZD2heGy@KskGz3S4ddI{&yB{qf6P)e6Chkv)WM`3ICH;0}(65Nx
zcZ_LXj06I!wPP>;8LlIMbAs~@ilRX<OLsF*FW2S}HetjSt<R!DBv7)Nf~91a;2~|q
z^3Gj<q6Jx8C5)rmQs~Pg>mA`<d`WS+EE9-cdMsPeN$$2z*T%bgpP+Bg45%hWr+PhT
zK^=F|pk6=22BwikpHW&_fTghn4@TK(1fhXBptPy6?r@#`EE3>-`66IfwKa@`$hd&p
zkWy=k;te~&nu1WTiv?{$gx?#$iHv^Zk}+Tl18L()ktJ^mlif=U-V|}(Txt0fg+P+s
zz9B4jeDH|IA__KN)XP@B(1^urW9Qji=^AYTG;-#<(8ynvyM2u2Ry!(TJt>Z;<ShL=
zmBL|3K5<Ix<gHl2<&la2&hX$itl08~T+2+QKJC%%>xqFsxl5=V|H=5lXFG5Ho9u?i
z64-tlteji?mk2O(?|U+wB7%xti*HOSW04xQ<pE^A@*|1_!T#-nx5YWWN3;8O!8F>`
z@2OsY+x$ylyYn6HNZ*iDD>sw*JJ%j1Sm7o*bBh^$)H(St#l?E+pC&;6))&-q%PgCc
zQdA8YLi!hbQg1#4Lrs;>e~YNNBhLS6^7n7)fdz$NiF@X~`TJt9&c2-FQP9!&>{s(`
z?$sXly}=3=OG(oa6oU7l<{6NoU09D>DC~&%{l6srE~?*4`m>-tBWp>lNZBRzJG#~W
zuDtn>=WM6GH5>_L|F^Ke8cvaKjIKn_mCej}l-Yvj{pC9vKdngrr$bKTI>N4=r+$r2
z|K3l`c~>Fyn+uSM)2pZ4yen=aNZ`XvMpLIt!`F7>E5s#y8%>?umaN(XTLdQUl{u$u
z6mP@{VY`JUqvG<Em4?~UO)zqU>5Xg|Tyly74VbW$KEKdaKgs~u-vy1cAwd+n4e$@D
zw7l@kYP5pz7izR(jh1T7Cs1dSsk#N4RZxNH&CgMR$mU#BAg1{<Dln({XLMkG^UZ}7
z_Nhs=Y<_%xQa{aSfoloAm2yA94eavyuUUlINylZvkLWU%^}h32Uwr4|UI0kkV6aG6
zO7GQ!8(@rSSt@HJI@RRf)k0VinDKc2=Wj2^ue=v(`O9CQWnhOMeNI2SJ?TFC))?w3
zzJAp6ZNW>Xb<Ahqo1EK}o%^$9o~eb*m<d^x0Mq@|Fk%H{E>+TVGy!Loa9>ebSy@r>
z-w)^riDZtIqve9HzDuC^sC@FvdWOAR;>(0{nV+dJ{LO1rq&x2NwRqK;;}A2IzP6v$
zJFaCV-PaBASsO7c6&Cw77qRRlc}x2Ho$XaA07tKK@h^97^`CdnEa3Qa`adkhCx#nb
zw3@$E7hq+7yqcqXo#e~S-|bPb=P9_>=l_CGx>x+uo`#Z-{6hAJyGk+vMwEE%FV;Jm
z_D}1*aF*o8AHL?Spe``k*Dt>H6->PU^cBTsBp+Y=e(B9K2Z4iN|BEZ#cK)YlD!fB_
zll%`8lWM)7O?~t6qi-|eM)`mGL2f#dXNkWXG@W@daDJ!$63HYU{?j0T97SgQkE8h0
zsEGgDRxw+BTv@jMg_LXrn(j0X_81vj9Rr&Yb+<Qtode{iEKaY;RB{uXtGcBQcTe_^
zMS7O&2pZZ`yq;=H@+Z7DtwU6=DEDdw5uMzRx-ZRyd^uo%_dgylGHAa=<aR#UE;O?&
zf3>phxKZ`_MM;fp8eb^WYT83WTSMmXrNhe1GVaHVgrxcVp54Q?gwNv#@*2JDg1zeI
zrSlzCq^b-fSbelWR=0UcdS4I-tFnIytABDj8~U|tJ2lGkOg$fE+SIt5HWHf1L!>!f
zjv5N?K3B-QnDR!uS5<Q89RtbS8cmZNf&v?|AEmx4a?isf!tJ_8M=?D?MG}fuePatl
zoL^=$hH>un<{!E}aj2?QY*iA}@c7*E+V`PjSWGHnVf-gPbg~Kdi!DqFjIuwnFa7rp
zlxU&Fs+FYkWcL@t5cjI?TJj)mh3n4Qb+_MA)9c)6x7=Y%6qkU8|LnyDhpm2jjiBCp
z^-@;cMSvy0YbIrcZK0%Pm6Mlg5Obwt96U=>pWujp*M0Lfko5biv>ckxd!4_GOPQWF
z9-N5h+wDK<wD<a;cd-D3cMz*Etba+r{^aBi1-TM<F(MuxnUB*(&@J8Kaw@D~9b;L~
zOr987<9K&IlIx4cpmwi8YQ5+6tGvy)Lb935bk&vN)KDgZJW}#CPRrR~u?fR|x`o*o
zCO*-mEhz}v=5j3MG;I2)G&oO#PF?kZdwrSsWrjnCfwROEc!Q8miultzSl4}Z9<WBx
zB^-2QoFO@Sp8VUW`e$P}q>E?|e3jE>%fktggKDgBmw6Umh+pwenhncOV@kMlX%Gxn
zidg1?wUwG*ZI|6iG8id{n&YBu&U_rP+dINrMQq{?sXUJkhjDAUhc>MZzms!AEV|hd
z&6`80JZZ+Op9Q_v8A;9?-j@gX(4*GB4{_kO8JN98M<_Byw7xS^{gU_6Y_bt5QA?VV
zRsivfTjq-YIGeS&!$q0Qz4MXt%~8b&*prA>)CKNokJB)z$ou`Y*vhxCAXtkgYzFj`
z9u@t4XxYtqyyO13DJS@(ZzY$BaKvk>g9~{%&D!2oYj-Yjw)o`Ngr^mt9=LQE9K6EF
zxvyMRy-1KVIXKUOZax)z0pU(Gt<vIjE{n*OhNPl<TTpeT%;I!{C4tU1ae%?2s^O4b
zd#Cap7o(=2YSCe$J%NdLoc<=NpjDu!!i85><EPx)|KWx&=mauGK<~;XsGJx)dzx}%
z?5bpNID6KWAuS>FIm6RQ&%m23qZ(gaT;+8LJ4Q`%c2{=tQO0>>hoNKnfkiG4;4&UZ
zTOMRUlr`$Hb4SgKhk$80kuPyt7ofSLoy<nFkPa;9quZf>pA}T@y4PHdxR64|C#=mp
zMrn9j&#^Z64Q1`=DK`i02DzGFnobp5-U+4gq8Z-_sODOqoJ?|W_kAs>YQq}IlelB6
z-CJ`+cE99Nb;`=<%SE&#^MQ8o?#CO5Gj52QoPr13TVpW?Z;TOHYx;_w*UNgG4!ZX<
zG0iyF2=a{b8=uMnQ;(d!g0D{J8P~M4&GhF{U2l*CocYU~wQu~EH(gF<UYkKx!Q0r6
zP3N%%#Mw(6*v^A6UydE~osIc>Ca{Sn<1&k#_hzr#eYqrp(z1R5vx$j}V-viY;z42z
ziyww*y7&lV^)uS|q6fzh&X4cp7T$G};QZL>i4oU^D;zBEg$1LZNr>m@<u@<ct6>#O
z84(=T7G-v`3Kqj>mlmrpdFN%~B!HKF|JQQu&;A0gayt|bYbyJsx^r8@k;R1m=w@bu
z-R>9p5B!nFQg1Ph`Y|!aT+!|)wBa`uX9w0h5ACOD+NlyTvpek7T-EJ0@-dT%8Lu^o
zO1{Q(;_RGD2FlOL+=n6uOgD}svo?AKaGkCWe+zpuD=F%hiP4Pmc(zJhM3fOZjgoxR
zyry!u6QmB77g~)fn$fBI(&qL7>}a~IY{u45SdcmckJs$9CEP)$zxJ7<S#SJh0PP55
zwUwqUeIj}b`)K)2<6?A#LH^2g@-KzbpYk#<y@0%rU5%a2qLBQsH&^pxU#H5XrQfz^
z614r9>GI(bF?n&K>Huzg{0^qhMz#&L4eiYcJ?M@kFP7dxgwTz}EpKeQ4?S^RY|8YN
zM(XR#H?2q|hqHwpteqOC#Cj7x?XX=Sx*>C19F?w&KBm1LTr3UfiSU=#R_nDVoT6b~
z#=AjlM7EYl*lO!^@ay37YK#%4Fe~eZ))Mwr`kU5`gHo~tCUJK+u9PZ@N1N=Ma_{7V
zMn#>gf@EPVu=$hEoqS#|!16Huw&LuPrA~)SM~ZaS7Gyw`$MTmd?@uYLD?G2_rs9RQ
z$n%^kR{1@V*N40Vj`+ujupfT8=c^;n^m8G<`Aw;-zAQBYUnFm13w~C5q7B~`{c=`2
z;_@qr^Mgi`i99Kt2og4;Xh8k)Cp@z9T@5<J%LcK`RrR@<lsKSoid4MKG_y)0q<k!$
zxXbybDI%SCg7}FhLHQ1rc>aB-`Q>anw1iD|ZPutlMkPf%!>HFa^o239Tyw3ZqTu57
zp;!`x#rS<{Jzb9#Q8C&T4arR_ko`;khv;zxLC;Nl{p7zC8EBxEN%RTaI&#eU+~0eZ
zAGHSZN7?tM2FRam=11A5_M-y-(;U@5#rGdzNX8E^<WKXtf8bJgen5ogKdj=<Q|o_N
z#Sg0hov<IV;zz7F?*Ai$O8(JKD*91Z{P}%`A6D_hDgd|UN45Q<+9s|4fkActV1W$%
zKxY3;P5)sPKdb@}Ie+vke)KC|O#EOB{vdAxe)JFW=AWLV`(YJ7tm21NeEU%253BfL
z6+f)vhgGEBYP-4mL;mvrk^E(&`P3g8xxbO*gvX!ACCY!j9-W+=H-CRC_3!q{k@+{l
z{GA-kb28XRRG-9mC0KfJjNA(_#p&!n2=K;izds!Me`RGP+OWKvzs?H$8#ryy@At>$
zEAzpNH1$WpD7-6w*RTG6{Y$(w&W9ME(z~ZoZ>l3P)|DH8L6Q7A==8rm&_`Fb;rx-z
z=w0+bhWLK7dBbesu+`F2K*M_U9|DYKrDIx$SG#^OO`L^O|AL16W6;F6%D27L0tk53
zoaCqPTm?^cje0hiMA6#G3);P?Ti-ph6m9Adv~&Lq)$?!|2N(mw@f-JiQTq2cz8`8I
z`Qrh-ziBb%QyuB^^1J?#mfh9(C&{bm2|KQYCtuZtJo%`j-@Puw?%ME|!q%fLF8VW2
zM)1Y?e`D2(QU3NAcCx0%a|}xBm#-?xze_g$b+NY`HPSxCNdmde2O8~Os(*~$`ft~b
zj(~NBW0E^*wR=N=fq|i2-+oe(8$Dr5oj~%;7<S4Crt<PTOMYJfF$VPPqK049o!_o|
zNmUyTjN!fVtAD5u|2so@jgk9+%}>6m4Zr=3;Pp>-17xViHC)mfcS!m2Q3+?hYjbv{
zu+z5G%VQOh>s4)T;(*+4%>I?!t`d_;^<0kb%bD}Pz9IE*ELM{bt@;c4C<zG(JIB|%
z37*g3N`P?`WR7F}+uvXRnFYPu^zY09e2C<H;MXhi>k}&e;NAk!?6*Qo3BO;R+t**t
zzXx7KPkt_!Yow8;fM_v=xjRn%<65<t>Pc*^(MBCNFoH?ae*f=uV*DFn?h@cpy03rh
zx5Z+vp(naIz-uEweG0~mee1qq_sMu}YNY++Gb;ICoi}*CCrTB}(25oag=J~~ItuSw
zBSa^YS3LdwQzVl9zkNk?0<5zGll)jmDy5k5>{MB&jkV*y`8;dION`uOu0Qrx@VDje
z4}fh&|N6D_QN7>4k`VJ6AQ}NbpZ(r}7ccL89Vq_qJT$f7W59g}KP%F|?d@AmwCc1n
z0>(i#cd7tFXBP^iKK|YPL}i}L5&3<A&ntf0n$Nd-mBCCjBY8t$=QZE8b6sk|ap2rI
zoPXaTmFC|*{1#l-p-*ra$N#D8O8lC-vhZVX!GKi)$|9{DwS)p%WOHFrDT*VcBrhld
zgIY%nOCT7L9Z8W6j-Z2agF*l!;l%`$Eg-vPF$jnf0cA;8M1w@Ou*i~m2xzp^KOpDc
z^PTVe&P{%~=bE9utO$~BV@N*>rT>eSu{q^?mg|UC)6VzsV7=9OC<hKKhCEd4@-$I6
z8L!5qrNq62igq=LJZM_6A?t`u$C#m8Roqb<g=cpExhvWtYrA+kQIh<J{|@~XJ+GT^
zvG>5m)|V}okzItV-QrI}IEO>+Xk1Mn%0^{L2*8!)dUwDEA7qjSj%L$ba>H*8BpIiX
zPxnXcIfA^@*N`FXek&^sT(mnQdhvH>cKof8wT+PGE;z|W#x9RKgVTyOcUh8SOzhow
zmmBb4RGvrtT~Us@jIRBZn4s#1Td{C`;0sTSAKS95;u!uT$lC_@k%Q5-qbI-QpphN>
zV_H@O9HTyYu?@(<VSp_NvU0pUsw!Xg2>(T#j2jlpx1uD>Od_-ARTHFH>Njq}sfX_&
za^ss9hqvzH?7=B*I{98YZz~l`--Zn&n)wu8J;mJR5?TvKb-A^S)-Go65oDTK2pXP>
zc2WzOhqB2YTLLa(;}ImHBXoO$>BS3Sd7qb!NDFO+=fIN|4KXY)rij>G7^3YqawpYt
z5xx(nBFry}VCiZ%IlxZ1f5|^a+#W;T|9Sr8GTX6l`u>+U+mUo!w&NjiuW=h1$Jlxq
zH2gTl0(lT!b1<ZEq7=p>^@r1!&Cu|@{jpSl3A28YWfKQ8x88@gz|WR`JlibRL-Y%V
zk8bd^$1wz#QY<Omf{;9In6L1dn<WV_epaPEk8BxN27q%J%Tk!Wr_FNxaV^$xn%j^?
z(1}&M3AX%7ke6Xh&mv<sn1hG{52WPS-o?H>y*>J_YIM?n=>>$(_t-ivRSi2vQ9{(&
zj#Z0Pb?SmLAC)W0^wA17P~fzi2<Z@uQN$XTjqokj#ei40#e5{-;g`4n;XSOqn<UGq
z4@BI>bRD6?lMvg#gO8{Sp`Y#XLJ1@K7IeX#6Yo9>kE+)^{z3GNe>%l{nekyb*5(t)
zOARQUO!Mu(s(G&_XdRl|1bhN>-tQ#ym?|@y$Q*!}NY=Rzx3Q*NnxJzYa9ekZyQ;{Z
z&lp6=m{}zil?skpC#it&x{n#QC{}M~PK-<Sb}g2-2d-ruJN-Mn9Tld)eN(wl;uevN
z_98HLixhBkU>~m8xxK*0nA2O9GDYd`LzWI)guCuzNV6WIZ$EJ0$qUoaZkWeX>7@9u
zW5SSX^@zfZ;mlWszL=}}W-V*2dRm2>&uqT)r@Z3Y^N&Q2*(DEOW(AkL>l`+B?~=x?
z{i@&fmRB@NGwkPNCkKDQF0}czB52GqYlv`nLo10-;fH}#s!yP>#Dn{@n@I;kd(^>y
za!VzyM!$b9K{+7#dk$40Pl)!jq7Ys{F+bsF*gtB-pWRgES}}JBeCLK^jBN`rv8gO)
zZ1R>4wjqGZJFZuBtu(Ng@CLxDakkSTkPRYme$V;W*dpV5V4#Y1MW$TmtKWwNmA+P3
zUFWU@HtL5an%F6nQLa-N&U)&>n5@Lb<{dcrWT81n7l=N@*k~EBfvGbd2gO`~=q6A)
zk-{Q34$mH!2-H1`f3@`ZQ@i+i8h}RzUmoA7Q@Js#Q%B|1)t~~hNK3t+U2)Vih;~a6
zk8Jwh*xqMq`pwK#T-}guh2R;f%^<bAZ!kx#;$_4_GXUgfWBZkx6u=YZV0I7`MP!Cv
zWb>3t$YrVIZwUR)QS!cEr+w2qZ{T7I*+=gNCgC}+3U76pPzJ`%;26d6Y}LUl*XRWY
z@q9@dMMI<K`g3M5Au=j55`JSs@}NmJ7ab@c%svGL5t+wXFEk2K;%^6ow?~_+mpG_D
zHgxnE5E$##=fSvC(_TAG(R1BKnv0;VJ<uMMfx=*~!dtw1jF!01QhKHLO&>1^G?j`E
zit#yfaRAVcMUfQ-&qG%>K&m>BzaJ=Ki8%Hkt`TS4Ml13M#ec?LBn#y|i;ub#|87c7
zx0U<L;txA!pSt0!^9iF8(Rnzht8h+X{2(wng<uH)D<tA*fJz8(oGsdcRg!=dH%U9)
zopp^>%aYgg_+3qVpnABNT;|V>%?XrQL%pfQA)(PQ%V*$i*XtqvLkh?B1Uih{1ZIb?
zO1Y?!OFI3v`-6P2Oc2W!jgGgyOY51RrcG1((iA76ls_?{jqQZM_+c6`dqK1*=m-+P
zU@#HPLO@(%DW`%oS0k$OTTpC=xYU%M7GQ_fke0PYRtkrfR}}CgDIYw|aScN!d9kWP
zZg27)=HVm*ZxS@b^IEoZb8i|RCc;Y#|A-8H{q@~3NDgQ}yaZ^A4Ho$#9mTu|U57HE
z9Owa52R$nh+y~3nuOKLsov~g+1Rg~98!doJukaw8p)Y8an6GF|m?2LL4!%n>x9FM}
zzBe;--;Yl)3=a8rXy|(L^}73;E4nG~O<^jsm#CQ81+|*-t@*avF!R^2oLP~q5?zm|
znd6e-++``93FtH?`#M{D8P$=5hmX#NO6WJ-`dM;J1atlEVkiBKxw5uq8GN}7!K|pT
zTM>?6X9EF4Sr5&%R5Vyo=Fh)sb1d)S$+EN!&i7Oy4D$EjP7nk7fK&u3UsNP25toM_
z;otcLuvp95I!iB?)&~QuoiJo<qul;^O~=+(&UK0Olb*qHdoLWay>0N?rotZpENJna
zl_7MZM-j^Wp9P1^T?)|f{cemoSb#G>T+l%$vp7S&4Jv?T&9WaosR}Hre`Gxn&DN`+
zJq#IcL2ZgakFXS(tC@PtA96uq{?j%2XB%;nKHX=gc(AWl6STFMmNe{LV23$N*8o7_
z@`{fQAXOHeS_GI3<{?leCgr|h@^MzLIyur&;kAH^@9$3uti?GCs)ePJI)KXC_ep!t
z#dSE!%ziI!xDX59<2Nx-&@4m&mFmkzWvUL^&tp8XWmtVM0_-wp@}Q2AS7RqZ5|tgl
zvwlV&L8q=IU3wVA+lIIPO)V}+_~(ZA>%3q>-h@qbScId5>=(VsOl7`bn0PaZ8^}39
z+6);Gp4iMkYBG}k1fzCs3AIu#*cb=V6QFWP3~kWG`tZq~A%syh7%+3Re?yecieKrc
zob%C3#Uym_zVon3Q;VBq*?v(VE8G2&xruENgROJYug`_F^E6z$!sA6_riNlY_QayE
z;Fe^tZ3GRX1DDmtDGdh#d}LQiNn2XQIwKi&uX?12H%+g1n`6OTWNu<^WA0`ifNQi1
zu90+nNEz_LWY;57RG`|Cy`cRj+#eRq-ja8d5x`cit7T_t8@Db^dD+$NRJL^M3=UpB
zQ7HVuM6ac&2wGyfB2u2FKv9xhILmPwI3e%|kB&I_W#c%_R28L&(nJ{|hDmk=+?7nK
zNaH8Ls@)6QKT&veht-}ey+T?hH(;N3)39;*vEBc7ry?}6^&tNjz8h7<df|&MrgTKi
znzB^Iqghoe6s=1ys{LliKrUOahDLqglqjdnmj@Nil?znNzb-_jIJ(D7Mn!hPZv&x_
z#plQE`0XR<kl@a2yau4$CU)>2IaU2JQt@)6lv*0KBp}o@a@AI*>JpZU$ggPs#@Z-1
z)u^-=<tq+L=SpC=TDJcdGptep#*HtAd!|~TkmFH&z@<1SCy;8pcEzo1n##<bTh=@J
z57?RLwZ<xxqM1el+LZlhj>T%MdMmP3xAnW$Ev_@`th5chdj3)|3JmJaC0I@FSi;=~
zDiCvhWhkB)M7o4IQ+ow(eOXO~A_Pn|Mb6U+j;t7nO58W`w>!T#vlpzYnQF8F)^!S+
ze_Ihuawh2#^$ZV=mSj{%5w5DZ2P)A3N(?=oUQ3@`jotjW8x3cw5>tukoZHgti(pJ`
z44z6lwxaV_6ZpPw{|FqxB@9#tdRo=0IXno89BqN<PwDdMHdlCcmBrJ*Ec|5EeA;Kt
z4>pcw>>yT()knai(O6Xjlu<mN%G#;{`ki0ivS5RHr9;!x^(v%+UpXo5u}R^t;kY{A
zL~Nubo(~$8n;bTk&IIdFC&NdH^D?D_JGbjg?93`r26V^%5WleiolGehj%1>^b}q$!
zreq&mgOw77St+zxIcMpWB47`BVxspdR=)dm)Sw4#dEb-IqzkjBZnAnQwJeFO+&*B!
zNzYk~s^{k4Y{q$UvGYZ9+{djqRhlO}TVF>S2;ii=j2$oa2di#IHE)r_EYV?VK{E)s
z7YPVf&SoDv1r!9uD7!t?C1h{#AQI+b8{(HY(&n$Oh)gV8_g1j)5AvLaUQ2A|12UAe
z+Z~D3Y}JkVL<snx`{4SLyLmHIi8naOmNxU+9*0k*EvSjPu|p)GduIS8mHg;vKQGd0
z#d?CtYt9C6oUPC6I=`uY<7wUgU=X5D(tlbmApC`WYWYw)<b-TB^W5<+Bm>3m(lRNJ
zRSSH`2&qNPT3napt=K;|>0xeSCWUA1Va+r;bx!D8F@K;^kdQms1=<rVSM#Ky(}W7F
zfsU=)J64p%Ld*2*V;4-+gW()__czEcC5`$l;Tl{q1L;qS#dpn4i9=!=dg3(vf2)|w
zh<{z)KBW&<(aya7Hze588E_(%Ty(Vmex!57!h4ndI(nI>?g%c!fq(-J&igofykh<b
DW@6_s

literal 0
HcmV?d00001

diff --git a/assets/novel_list.png b/assets/novel_list.png
new file mode 100644
index 0000000000000000000000000000000000000000..e7f9274ec4859b0dc581217bfd752905dff71422
GIT binary patch
literal 80553
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
T>?;;EfT}Q0S3j3^P6<r_VH5JN

literal 0
HcmV?d00001

diff --git a/assets/novel_pub.png b/assets/novel_pub.png
new file mode 100644
index 0000000000000000000000000000000000000000..b20f3c093d40f6b854b8ce9e1a28ed6ad457b8fe
GIT binary patch
literal 70254
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

literal 0
HcmV?d00001

diff --git a/novel-admin/src/main/resources/application.yml b/novel-admin/src/main/resources/application.yml
index cd945a7..8c22c88 100644
--- a/novel-admin/src/main/resources/application.yml
+++ b/novel-admin/src/main/resources/application.yml
@@ -35,9 +35,9 @@ spring:
   datasource:
     type: com.alibaba.druid.pool.DruidDataSource
     driverClassName: com.mysql.jdbc.Driver
-    url: jdbc:mysql://127.0.0.1:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
-    username: books
-    password: books
+    url: jdbc:mysql://127.0.0.1:3306/books?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
+    username: root
+    password: test123456
     #password:
     initialSize: 1
     minIdle: 3
diff --git a/novel-admin/src/main/resources/static/wangEditor/.eslintignore b/novel-admin/src/main/resources/static/wangEditor/.eslintignore
new file mode 100644
index 0000000..c02d109
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/.eslintignore
@@ -0,0 +1,2 @@
+src/js/util/ierange.js
+src/js/util/poly-fill.js
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/.eslintrc.json b/novel-admin/src/main/resources/static/wangEditor/.eslintrc.json
new file mode 100644
index 0000000..0148b38
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/.eslintrc.json
@@ -0,0 +1,38 @@
+{
+    "env": {
+        "browser": true,
+        "commonjs": true,
+        "es6": true
+    },
+    "globals": {
+        "ENV": true
+    },
+    "extends": "eslint:recommended",
+    "parserOptions": {
+        "sourceType": "module"
+    },
+    "rules": {
+        "no-console":0,
+        "indent": [
+            "error",
+            4
+        ],
+        "linebreak-style": [
+            "error",
+            "unix"
+        ],
+        "quotes": [
+            "error",
+            "single",
+            {
+                "allowTemplateLiterals": true
+            }
+        ],
+        "semi": [
+            "error",
+            "never"
+        ],
+        "no-unused-vars": 0,
+        "no-debugger": 0
+    }
+}
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/.gitattributes b/novel-admin/src/main/resources/static/wangEditor/.gitattributes
new file mode 100644
index 0000000..412eeda
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/.gitattributes
@@ -0,0 +1,22 @@
+# Auto detect text files and perform LF normalization
+* text=auto
+
+# Custom for Visual Studio
+*.cs     diff=csharp
+*.sln    merge=union
+*.csproj merge=union
+*.vbproj merge=union
+*.fsproj merge=union
+*.dbproj merge=union
+
+# Standard to msysgit
+*.doc	 diff=astextplain
+*.DOC	 diff=astextplain
+*.docx diff=astextplain
+*.DOCX diff=astextplain
+*.dot  diff=astextplain
+*.DOT  diff=astextplain
+*.pdf  diff=astextplain
+*.PDF	 diff=astextplain
+*.rtf	 diff=astextplain
+*.RTF	 diff=astextplain
diff --git a/novel-admin/src/main/resources/static/wangEditor/.gitignore b/novel-admin/src/main/resources/static/wangEditor/.gitignore
new file mode 100644
index 0000000..481571c
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/.gitignore
@@ -0,0 +1,51 @@
+
+#忽略
+**/node_modules/*
+node_modules/*
+npm-debug.log
+example/upload-files
+
+# Windows image file caches
+Thumbs.db
+ehthumbs.db
+
+# Folder config file
+Desktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msm
+*.msp
+
+# =========================
+# Operating System Files
+# =========================
+
+# OSX
+# =========================
+
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear on external disk
+.Spotlight-V100
+.Trashes
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
diff --git a/novel-admin/src/main/resources/static/wangEditor/.npmignore b/novel-admin/src/main/resources/static/wangEditor/.npmignore
new file mode 100644
index 0000000..333dd25
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/.npmignore
@@ -0,0 +1,5 @@
+node_modules/*
+npm-debug.log
+docs/*
+src/*
+example/*
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/ISSUE.md b/novel-admin/src/main/resources/static/wangEditor/ISSUE.md
new file mode 100644
index 0000000..796cbee
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/ISSUE.md
@@ -0,0 +1,157 @@
+# 问题记录
+
+## 版本修复
+
+### v3.0.1 
+
+- [done] 如何设置自动增加高度(补充文档)
+- [done] src/js/editor/Bar 改为 Progress,仅供上传图片使用
+- [done] Panel 在右上角增加一个“关闭”按钮
+- [done] 显示页面 table、quote、code 等样式,说明一下
+- [done] 增加自定义上传回调函数,用以自定义返回图片的格式
+- [done] 上传附带的参数,也加入到 form-data 中一份
+- [done] 编辑器默认情况下,菜单栏不能点击,必须focus了编辑器求之后才能点击
+- [done] 点击菜单弹出panel之后,再点击编辑器区域其他地方,panel不消失
+- [done] 自定义filename,v2版本就有
+- [done] ff 中的 bug
+- [done] ff 中粘贴图片和文字出现问题 https://github.com/wangfupeng1988/wangEditor/issues/609
+- [done] 火狐浏览器下,创建表格,编辑表格内容时,会出现两个控制点(有人提供了解决方案)
+- [done] 配置最多上传的文件个数
+- [done] 连续给两段内容 添加有/无序列表时,样式会出问题,且其他内容找不到了,并且编辑器不处于编辑状态。
+- [done] onchange
+- [done] IE11下面一直报错。并且表格无法正常使用
+
+### v3.0.2
+
+- [done] 用 onchange 完善 vue react 的 demo
+- [done] 插入图片之后,光标移动到图片的前面,然后回车,图片消失,并且不能撤销
+- [done] 修复上传图片 customInsert 无效的bug
+- [done] 编辑区域 z-index 可配置
+- [done] 上传图片不应该把状态码限制在 200,而是 2xx
+- [done] editor.txt.html() 之后,没有定位光标位置
+
+### v3.0.3
+
+- [done] 粘贴图片在低版本的谷歌浏览器中无法使用,提示验证图片未通过,undefined不是图片。
+- [done] 动态赋值内容,会自动换行,因为给自动加了`<p><br></p>`
+- [done] 不选中任何内容,点击“加粗”报错:Failed to execute 'setEnd' on 'Range' 
+- [done] toolbar 小图标的 z-index 可配置
+
+### v3.0.4
+
+- [done] 允许使用者通过`replace`实现多语言
+- [done] `_alert()`,可自定义配置提示框
+- [done] 支持用户自定义上传图片的事件,如用户要上传到七牛云、阿里云
+
+### v3.0.5
+
+- [done] 图片上传中,insertLinkImg 方法中,去掉 img.onload 之后再插入的逻辑吧,这样会打乱多个图片的顺序
+- [done] `<h>` 标签重叠问题,两行文字都是`h2`,然后将第一行选中设置为`h1`,结果是 `<h2><h1>测试1</h1>测试2</h2>`
+- [done] 补充 ng 集成的示例 https://github.com/wangfupeng1988/wangEditor/issues/859
+- [done] 菜单不能折叠的说明,加入到文档中
+- [done] 上传图片 before 函数中,增加一个判断,可以让用户终止图片的上传
+
+### v3.0.6
+
+- [done] src/fonts 中的字体文件名改一下,用 icomoon 容易发生冲突
+- [done] 将禁用编辑器的操作完善到文档中 https://www.kancloud.cn/wangfupeng/wangeditor3/368562
+- [done] 开放表格中的粘贴功能(之前因不明问题而封闭)
+- [done] 代码块中,光标定位到最后位置时,连续两次回车要跳出代码块
+
+### v3.0.7
+
+- [done] 紧急修复上一个版本导致的菜单图标不显示的 bug
+
+### v3.0.8
+
+- [done] 修复 backColor 和 foreColor 代码文件名混淆的问题
+- [done] 修改 IE 中 “引用” 的功能
+- [done] 增加粘贴过滤样式的可配置
+- [done] 修复 IE 粘贴文字的问题
+
+### v3.0.9
+
+- [done] config 中,上传图片的 token 注视掉
+- [done] 将一些常见 API 开放,写到文档中 https://www.kancloud.cn/wangfupeng/wangeditor3/404586
+- [done] IE 火狐 插入多行代码有问题
+- [done] 粘贴时,在`<p>`中,不能只粘贴纯文本,还得要图片 
+- [done] 粘贴内容中,过滤掉`<!--xxx-->`注释
+- [done] **支持上传七牛云存储**
+
+### v3.0.10
+
+- [done] 支持插入网络图片的回调函数
+- [done] 插入链接时候的格式校验
+- [done] 支持拖拽上传
+
+### v3.0.11
+
+- [done] 如何用 textarea 创建编辑器,完善到文档中,许多人提问
+- [done] 修复`editor.customConfig.customUploadImg`不触发的 bug
+- [done] 修复有序列表和无序列表切换时 onchange 不触发的 bug
+
+### v3.0.12
+
+- [done] 增加 onfocus 和 onblur (感谢 [hold-baby](https://github.com/hold-baby) 提交的 [PR](https://github.com/wangfupeng1988/wangEditor/pull/1076))
+- [done] 上传的自定义参数`editor.customConfig.uploadImgParams`是否拼接到 url 中,支持可配置
+- [done] onchange 触发的延迟时间,支持可配置
+
+### v3.0.13
+
+- [done] 修复图片 选中/取消选中 时,触发 onchange 的问题
+- [done] 修复只通过 length 判断 onchange 是否触发的问题
+- [done] 增加插入网络图片的校验函数
+- [done] 增加自定义处理粘贴文本的事件
+- [done] 修复选中一个图片时点击删除键会误删除其他内容的 bug 
+- [done] 修复 window chrome 中“复制图片”然后粘贴图片,会粘贴为两张的 bug 
+- [done] 修复无法撤销“引用”的问题
+
+### v3.0.14
+
+- [done] 可以配置前景色、背景色
+- [done] 回车时无法从`<p><code>....</code></p>`中跳出
+- [done] 增加获取 JSON 格式内容的 API
+
+### v3.0.15
+
+- [done] 表情兼容图片和 emoji ,都可自定义配置
+
+### v3.0.16
+
+- [done] 修复粘贴图片的 bug
+- [done] 修复`pasteTextHandle`执行两次的问题
+- [done] 修复插入链接时,文字和链接为空时,`linkCheck`不执行的 bug
+- [done] 粘贴 html 时,过滤掉其中的`data-xxx`属性
+- [done] 修复中文输入法输入过程中出发 onchange 的问题,感谢 [github.com/CongAn](https://github.com/CongAn) PR
+- [done] `editor.txt.html`和`editor.txt.text`中,替换`&#8203`字符为空字符串
+- [done] 精确图片大小计算,将`maxSize / 1000 / 1000`改为`maxSize / 1024 / 1024`
+- [done] 修复 droplist 类型菜单(颜色、背景色等)点击不准确的问题
+
+### v3.0.17
+
+- [done] 合并 pr [菜单和编辑区域分离 onfocus onblur 失效bug](https://github.com/wangfupeng1988/wangEditor/pull/1174) ,感谢 [hold-baby](https://github.com/hold-baby) 提供 pr
+- [done] 使用`document.execCommand("styleWithCSS", null, true)`,这样设置字体颜色就会用 css 而不是用`<font color=xxx>`
+
+
+### 近期计划解决
+
+- 撤销的兼容性问题(会误伤其他编辑器或者 input textarea 等),考虑用 onchange 记录 undo 和 redo 的内容(但是得考虑直接修改 dom 的情况,如 quote code img list table 菜单)
+    - 列表撤销会删除一行?https://github.com/wangfupeng1988/wangEditor/issues/1131
+    - 页面中有 input 等输入标签时,undo redo 会误伤 https://github.com/wangfupeng1988/wangEditor/issues/1024
+    - 两个编辑器 undo 的问题 https://github.com/wangfupeng1988/wangEditor/issues/1010
+    - list undo redo 有问题。选中几行,先设置有序列表,再设置无序列表,然后撤销,就能复现问题
+- 粘贴文字的样式问题(可暂时配置 `pasteTextHandle` 自行处理)
+    - 先输入文字,再粘贴 excel 表格,样式丢失 https://github.com/wangfupeng1988/wangEditor/issues/1000
+    - IE 11 直接输入文字会空一行在第二行出现内容 https://github.com/wangfupeng1988/wangEditor/issues/919
+    - windows 下 word excel 的粘贴,存在垃圾数据
+
+## 待排期
+
+- 调研 safari、IE 和ff中粘贴图片  https://github.com/wangfupeng1988/wangEditor/issues/831
+- 图片调整大小,表格调整的方式,是否用 toolbar 的方式?
+- 删除掉`./release`之后,执行`npm run release`会报错,原因是`fonts`文件没拷贝全,就要去替换`css`中的字体文件为`base64`格式,导致找不到文件。
+- 先点击'B'再输入内容这种形式,前期先支持 webkit 和 IE,火狐的支持后面再加上
+- 图片压缩 canvas https://github.com/think2011/localResizeIMG 
+- github 徽章 https://github.com/EyreFree/GitHubBadgeIntroduction
+- 将代码在进行拆分,做到“每个程序只做一件事”,不要出现过长的代码文件。例如 `src/js/command/index.js` 和 `src/js/selection/index.js`
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/LICENSE b/novel-admin/src/main/resources/static/wangEditor/LICENSE
new file mode 100644
index 0000000..5239660
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2017 王福朋
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/README.md b/novel-admin/src/main/resources/static/wangEditor/README.md
new file mode 100644
index 0000000..0ab9445
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/README.md
@@ -0,0 +1,70 @@
+
+# wangEditor
+
+## 介绍
+
+**wangEditor** —— 轻量级 web 富文本编辑器,配置方便,使用简单。支持 IE10+ 浏览器。
+
+- 官网:[www.wangEditor.com](http://www.wangeditor.com/)
+- 文档:[www.kancloud.cn/wangfupeng/wangeditor3/332599](http://www.kancloud.cn/wangfupeng/wangeditor3/332599)
+- 源码:[github.com/wangfupeng1988/wangEditor](https://github.com/wangfupeng1988/wangEditor) (欢迎 star)
+
+![图片](http://images2015.cnblogs.com/blog/138012/201705/138012-20170530202905633-1840158981.png)
+
+*查看 v2 版本的代码和文档点击[这里](https://github.com/wangfupeng1988/wangEditor/tree/v2)*
+
+
+## 下载
+
+- 直接下载:[https://github.com/wangfupeng1988/wangEditor/releases](https://github.com/wangfupeng1988/wangEditor/releases)
+- 使用`npm`下载:`npm install wangeditor` (注意 `wangeditor` 全部是**小写字母**)
+- 使用`bower`下载:`bower install wangEditor` (前提保证电脑已安装了`bower`)
+- 使用CDN:[//unpkg.com/wangeditor/release/wangEditor.min.js](https://unpkg.com/wangeditor/release/wangEditor.min.js)
+
+
+## 使用
+
+```javascript
+var E = window.wangEditor
+var editor = new E('#div1')
+editor.create()
+```
+
+
+## 运行 demo
+
+- 下载源码 `git clone git@github.com:wangfupeng1988/wangEditor.git`
+- 安装或者升级最新版本 node(最低`v6.x.x`)
+- 进入目录,安装依赖包 `cd wangEditor && npm i`
+- 安装包完成之后,windows 用户运行`npm run win-example`,Mac 用户运行`npm run example`
+- 打开浏览器访问[localhost:3000/index.html](http://localhost:3000/index.html)
+- 用于 React、vue 或者 angular 可查阅[文档](http://www.kancloud.cn/wangfupeng/wangeditor3/332599)中[其他](https://www.kancloud.cn/wangfupeng/wangeditor3/335783)章节中的相关介绍
+
+## 交流
+
+### QQ 群
+
+以下 QQ 群欢迎加入交流问题(可能有些群已经满员)
+
+- 164999061
+- 281268320
+
+### 提问
+
+注意,作者只受理以下几种提问方式,其他方式直接忽略
+
+- 直接在 [github issues](https://github.com/wangfupeng1988/wangEditor/issues) 提交问题
+- 去[知乎](https://www.zhihu.com/)提问,并邀请[作者](https://www.zhihu.com/people/wang-fu-peng-54/activities)来回答
+- 去[segmentfault](https://segmentfault.com)提问,并邀请[作者](https://segmentfault.com/u/wangfupeng1988)来回答
+
+每次升级版本修复的问题记录在[这里](./ISSUE.md)
+
+## 关于作者
+
+- 关注作者的博客 - 《[深入理解javascript原型和闭包系列](http://www.cnblogs.com/wangfupeng1988/p/4001284.html)》《[深入理解javascript异步系列](https://github.com/wangfupeng1988/js-async-tutorial)》《[CSS知多少](http://www.cnblogs.com/wangfupeng1988/p/4325007.html)》 
+- 学习作者的教程 - 《[前端JS基础面试题](http://coding.imooc.com/class/115.html)》《[React.js模拟大众点评webapp](http://coding.imooc.com/class/99.html)》《[zepto设计与源码分析](http://www.imooc.com/learn/745)》《[用grunt搭建自动化的web前端开发环境](http://study.163.com/course/courseMain.htm?courseId=1103003)》《[json2.js源码解读](http://study.163.com/course/courseMain.htm?courseId=691008)》
+
+如果你感觉有收获,欢迎给我打赏 ———— 以激励我更多输出优质开源内容
+
+![图片](https://camo.githubusercontent.com/e1558b631931e0a1606c769a61f48770cc0ccb56/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3133383031322f3230313730322f3133383031322d32303137303232383131323233373739382d313530373139363634332e706e67)
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/bower.json b/novel-admin/src/main/resources/static/wangEditor/bower.json
new file mode 100644
index 0000000..0c4ed0d
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/bower.json
@@ -0,0 +1,20 @@
+{
+  "name": "wangEditor",
+  "description": "wangEditor - 基于javascript和css开发的 web 富文本编辑器, 轻量、简洁、易用、开源免费",
+  "main": "release/wangEditor.js",
+  "authors": [
+    "wangfupeng <wangfupeng1988@163.com>"
+  ],
+  "license": "MIT",
+  "keywords": [
+    "wangEditor",
+    "web 富文本编辑器"
+  ],
+  "homepage": "https://github.com/wangfupeng1988/wangEditor",
+  "moduleType":  [
+    "amd",
+    "cmd",
+    "node"
+  ],
+  "private": true
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/dev/README.md b/novel-admin/src/main/resources/static/wangEditor/docs/dev/README.md
new file mode 100644
index 0000000..473dbcb
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/dev/README.md
@@ -0,0 +1,25 @@
+面向开发者的文档
+
+
+框架介绍
+
+- 下载和运行
+- 目录结构介绍
+- `example`目录
+- `src`目录(`js`目录,`less`目录)
+- `package.json`
+- `gulpfile.js`
+
+如何提交 PR
+
+
+
+上线
+
+- 修改`package.json`版本
+- 提交到github,并创建tag
+- 提交到 npm
+- 更新 .md 文档
+- 文档同步到 kancloud
+- ……
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/01-demo.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/01-demo.md
new file mode 100644
index 0000000..b71612f
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/01-demo.md
@@ -0,0 +1,41 @@
+# 简单的 demo
+
+## 下载
+
+- 点击 [https://github.com/wangfupeng1988/wangEditor/releases](https://github.com/wangfupeng1988/wangEditor/releases) 下载最新版。进入`release`文件夹下找到`wangEditor.js`或者`wangEditor.min.js`即可
+- 使用CDN:[//unpkg.com/wangeditor/release/wangEditor.min.js](https://unpkg.com/wangeditor/release/wangEditor.min.js)
+- 使用`bower`下载:`bower install wangEditor` (前提保证电脑已安装了`bower`)
+
+*PS:支持`npm`安装,请参见后面的章节*
+
+## 制作 demo
+
+编辑器效果如下。
+
+![图片](https://camo.githubusercontent.com/f3d072718d8fcbbacf8cc80465a34cceffcf5b4a/687474703a2f2f696d61676573323031352e636e626c6f67732e636f6d2f626c6f672f3133383031322f3230313730352f3133383031322d32303137303533303230323930353633332d313834303135383938312e706e67)
+
+代码示例如下。**注意,以下代码中无需引用任何 CSS 文件!!!**
+
+```html
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor demo</title>
+</head>
+<body>
+    <div id="editor">
+        <p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
+    </div>
+
+    <!-- 注意, 只需要引用 JS,无需引用任何 CSS !!!-->
+    <script type="text/javascript" src="/wangEditor.min.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor = new E('#editor')
+        // 或者 var editor = new E( document.getElementById('#editor') )
+        editor.create()
+    </script>
+</body>
+</html>
+```
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/02-use-module.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/02-use-module.md
new file mode 100644
index 0000000..0356a68
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/02-use-module.md
@@ -0,0 +1,49 @@
+# 使用模块定义
+
+wangEditor 除了直接使用`<script>`引用之外,还支持`AMD`和`CommonJS`的引用方式。
+
+## AMD
+
+以`require.js`为例演示
+
+先创建`main.js`,代码为
+
+```javascript
+require(['/wangEditor.min.js'], function (E) {
+    var editor = new E('#editor')
+    editor.create()
+})
+```
+
+然后创建页面,代码为
+
+```html
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor demo</title>
+</head>
+<body>
+    <div id="editor">
+        <p>欢迎使用 wangEditor 富文本编辑器</p>
+    </div>
+
+    <script data-main="./main.js" src="//cdn.bootcss.com/require.js/2.3.3/require.js"></script>
+</body>
+</html>
+```
+
+## CommonJS
+
+可以使用`npm install wangeditor`安装(注意,这里`wangeditor`全是**小写字母**)
+
+```javascript
+// 引用
+var E = require('wangeditor')  // 使用 npm 安装
+var E = require('/wangEditor.min.js')  // 使用下载的源码
+
+// 创建编辑器
+var editor = new E('#editor')
+editor.create()
+```
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/03-sperate.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/03-sperate.md
new file mode 100644
index 0000000..0fcd276
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/03-sperate.md
@@ -0,0 +1,48 @@
+# 菜单和编辑区域分离
+
+如果你想要像 知乎专栏、简书、石墨、网易云笔记 这些编辑页面一样,将编辑区域和菜单分离,也可以实现。
+
+这样,菜单和编辑器区域就是使用者可自己控制的元素,可自定义样式。例如:将菜单`fixed`、编辑器区域高度自动增加等
+
+## 代码示例
+
+```html
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor 菜单和编辑器区域分离</title>
+    <style type="text/css">
+        .toolbar {
+            border: 1px solid #ccc;
+        }
+        .text {
+            border: 1px solid #ccc;
+            height: 400px;
+        }
+    </style>
+</head>
+<body>
+    <div id="div1" class="toolbar">
+    </div>
+    <div style="padding: 5px 0; color: #ccc">中间隔离带</div>
+    <div id="div2" class="text"> <!--可使用 min-height 实现编辑区域自动增加高度-->
+        <p>请输入内容</p>
+    </div>
+
+    <script type="text/javascript" src="/wangEditor.min.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor1 = new E('#div1', '#div2')  // 两个参数也可以传入 elem 对象,class 选择器
+        editor1.create()
+    </script>
+</body>
+</html>
+```
+
+## 显示效果
+
+从上面代码可以看出,菜单和编辑区域其实就是两个单独的`<div>`,位置、尺寸都可以随便定义。
+
+![](http://images2015.cnblogs.com/blog/138012/201705/138012-20170531224756289-7442240.png)
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/04-multi.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/04-multi.md
new file mode 100644
index 0000000..aee3540
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/01-getstart/04-multi.md
@@ -0,0 +1,50 @@
+# 同一个页面创建多个编辑器
+
+wangEditor 支持一个页面创建多个编辑器
+
+## 代码示例
+
+```html
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor 一个页面多个编辑器</title>
+    <style type="text/css">
+        .toolbar {
+            background-color: #f1f1f1;
+            border: 1px solid #ccc;
+        }
+        .text {
+            border: 1px solid #ccc;
+            height: 200px;
+        }
+    </style>
+</head>
+<body>
+    <div id="div1" class="toolbar">
+    </div>
+    <div style="padding: 5px 0; color: #ccc">中间隔离带</div>
+    <div id="div2" class="text">
+        <p>第一个 demo(菜单和编辑器区域分开)</p>
+    </div>
+
+    <div id="div3">
+        <p>第二个 demo(常规)</p>
+    </div>
+
+    <!-- 引用js -->
+    <script type="text/javascript" src="/wangEditor.min.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+
+        var editor1 = new E('#div1', '#div2')
+        editor1.create()
+
+        var editor2 = new E('#div3')
+        editor2.create()
+    </script>
+</body>
+</html>
+```
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/01-set-content.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/01-set-content.md
new file mode 100644
index 0000000..7631f6f
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/01-set-content.md
@@ -0,0 +1,46 @@
+# 设置内容
+
+以下方式中,如果条件允许,尽量使用第一种方式,效率最高。
+
+## html 初始化内容
+
+直接将内容写到要创建编辑器的`<div>`标签中
+
+```html
+<div id="div1">
+    <p>初始化的内容</p>
+    <p>初始化的内容</p>
+</div>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+    editor.create()
+</script>
+```
+
+## js 设置内容
+
+创建编辑器之后,使用`editor.txt.html(...)`设置编辑器内容
+
+```html
+<div id="div1">
+</div>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+    editor.create()
+    editor.txt.html('<p>用 JS 设置的内容</p>')
+</script>
+```
+
+## 追加内容
+
+创建编辑器之后,可使用`editor.txt.append('<p>追加的内容</p>')`继续追加内容。
+
+## 清空内容
+
+可使用`editor.txt.clear()`清空编辑器内容
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/02-get-content.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/02-get-content.md
new file mode 100644
index 0000000..e21c277
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/02-get-content.md
@@ -0,0 +1,80 @@
+# 读取内容
+
+可以`html`和`text`的方式读取编辑器的内容。
+
+```html
+<div id="div1">
+    <p>欢迎使用 wangEditor 编辑器</p>
+</div>
+<button id="btn1">获取html</button>
+<button id="btn2">获取text</button>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+    editor.create()
+
+    document.getElementById('btn1').addEventListener('click', function () {
+        // 读取 html
+        alert(editor.txt.html())
+    }, false)
+
+    document.getElementById('btn2').addEventListener('click', function () {
+        // 读取 text
+        alert(editor.txt.text())
+    }, false)
+
+</script>
+```
+
+需要注意的是:**从编辑器中获取的 html 代码是不包含任何样式的纯 html**,如果显示的时候需要对其中的`<table>` `<code>` `<blockquote>`等标签进行自定义样式(这样既可实现多皮肤功能),下面提供了编辑器中使用的样式供参考
+
+```css
+/* table 样式 */
+table {
+  border-top: 1px solid #ccc;
+  border-left: 1px solid #ccc;
+}
+table td,
+table th {
+  border-bottom: 1px solid #ccc;
+  border-right: 1px solid #ccc;
+  padding: 3px 5px;
+}
+table th {
+  border-bottom: 2px solid #ccc;
+  text-align: center;
+}
+
+/* blockquote 样式 */
+blockquote {
+  display: block;
+  border-left: 8px solid #d0e5f2;
+  padding: 5px 10px;
+  margin: 10px 0;
+  line-height: 1.4;
+  font-size: 100%;
+  background-color: #f1f1f1;
+}
+
+/* code 样式 */
+code {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+  background-color: #f1f1f1;
+  border-radius: 3px;
+  padding: 3px 5px;
+  margin: 0 3px;
+}
+pre code {
+  display: block;
+}
+
+/* ul ol 样式 */
+ul, ol {
+  margin: 10px 0 10px 20px;
+}
+```
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/03-use-textarea.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/03-use-textarea.md
new file mode 100644
index 0000000..1707e13
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/03-use-textarea.md
@@ -0,0 +1,25 @@
+# 使用 textarea
+
+wangEditor 从`v3`版本开始不支持 textarea ,但是可以通过`onchange`来实现 textarea 中提交富文本内容。
+
+```html
+    <div id="div1">
+        <p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
+    </div>
+    <textarea id="text1" style="width:100%; height:200px;"></textarea>
+
+    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
+    <script type="text/javascript" src="../wangEditor.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor = new E('#div1')
+        var $text1 = $('#text1')
+        editor.customConfig.onchange = function (html) {
+            // 监控变化,同步更新到 textarea
+            $text1.val(html)
+        }
+        editor.create()
+        // 初始化 textarea 的值
+        $text1.val(editor.txt.html())
+    </script>
+```
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/04-get-json.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/04-get-json.md
new file mode 100644
index 0000000..d623ac4
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/02-content/04-get-json.md
@@ -0,0 +1,82 @@
+# 获取 JSON 格式的内容
+
+可以通过`editor.txt.getJSON`获取 JSON 格式的编辑器的内容,`v3.0.14`开始支持,示例如下
+
+```html
+<div id="div1">
+    <p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
+    <img src="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo_top_ca79a146.png" style="max-width:100%;"/>
+</div>
+<button id="btn1">getJSON</button>
+
+<script type="text/javascript" src="/wangEditor.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+    editor.create()
+
+    document.getElementById('btn1').addEventListener('click', function () {
+        var json = editor.txt.getJSON()  // 获取 JSON 格式的内容
+        var jsonStr = JSON.stringify(json)
+        console.log(json)
+        console.log(jsonStr)
+    })
+</script>
+```
+
+
+-----
+
+如果编辑器区域的 html 内容是如下:
+
+```html
+<p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
+<img src="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo_top_ca79a146.png" style="max-width:100%;"/>
+```
+
+那么获取的 JSON 格式就如下:
+
+```json
+[
+    {
+        "tag": "p",
+        "attrs": [],
+        "children": [
+            "欢迎使用 ",
+            {
+                "tag": "b",
+                "attrs": [],
+                "children": [
+                    "wangEditor"
+                ]
+            },
+            " 富文本编辑器"
+        ]
+    },
+    {
+        "tag": "img",
+        "attrs": [
+            {
+                "name": "src",
+                "value": "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo_top_ca79a146.png"
+            },
+            {
+                "name": "style",
+                "value": "max-width:100%;"
+            }
+        ],
+        "children": []
+    },
+    {
+        "tag": "p",
+        "attrs": [],
+        "children": [
+            {
+                "tag": "br",
+                "attrs": [],
+                "children": []
+            }
+        ]
+    }
+]
+```
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/01-menu.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/01-menu.md
new file mode 100644
index 0000000..bce6ba7
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/01-menu.md
@@ -0,0 +1,52 @@
+# 自定义菜单
+
+编辑器创建之前,可使用`editor.customConfig.menus`定义显示哪些菜单和菜单的顺序。**注意:v3 版本的菜单不支持换行折叠了(因为换行之后菜单栏是在太难看),如果菜单栏宽度不够,建议精简菜单项。**
+
+## 代码示例
+
+```html
+<div id="div1">
+    <p>欢迎使用 wangEditor 富文本编辑器</p>
+</div>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+    // 自定义菜单配置
+    editor.customConfig.menus = [
+        'head',
+        'bold',
+        'italic',
+        'underline'
+    ]
+    editor.create()
+</script>
+```
+
+## 默认菜单
+
+编辑默认的菜单配置如下
+
+```javascript
+[
+    'head',  // 标题
+    'bold',  // 粗体
+    'italic',  // 斜体
+    'underline',  // 下划线
+    'strikeThrough',  // 删除线
+    'foreColor',  // 文字颜色
+    'backColor',  // 背景颜色
+    'link',  // 插入链接
+    'list',  // 列表
+    'justify',  // 对齐方式
+    'quote',  // 引用
+    'emoticon',  // 表情
+    'image',  // 插入图片
+    'table',  // 表格
+    'video',  // 插入视频
+    'code',  // 插入代码
+    'undo',  // 撤销
+    'redo'  // 重复
+]
+```
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/02-debug.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/02-debug.md
new file mode 100644
index 0000000..e94d7a4
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/02-debug.md
@@ -0,0 +1,21 @@
+# 定义 debug 模式
+
+可通过`editor.customConfig.debug = true`配置`debug`模式,`debug`模式下,有 JS 错误会以`throw Error`方式提示出来。默认值为`false`,即不会抛出异常。
+
+但是,在实际开发中不建议直接定义为`true`或者`false`,可通过 url 参数进行干预,示例如下:
+
+```html
+<div id="div1">
+    <p>欢迎使用 wangEditor 富文本编辑器</p>
+</div>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+    // 通过 url 参数配置 debug 模式。url 中带有 wangeditor_debug_mode=1 才会开启 debug 模式
+    editor.customConfig.debug = location.href.indexOf('wangeditor_debug_mode=1') > 0
+    editor.create()
+</script>
+```
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/03-onchange.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/03-onchange.md
new file mode 100644
index 0000000..296091c
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/03-onchange.md
@@ -0,0 +1,40 @@
+# 配置 onchange 函数
+
+配置`onchange`函数之后,用户操作(鼠标点击、键盘打字等)导致的内容变化之后,会自动触发`onchange`函数执行。
+
+但是,**用户自己使用 JS 修改了`div1`的`innerHTML`,不会自动触发`onchange`函数**,此时你可以通过执行`editor.change()`来手动触发`onchange`函数的执行。
+
+```html
+<div id="div1">
+    <p>欢迎使用 wangEditor 富文本编辑器</p>
+</div>
+
+<p>手动触发 onchange 函数执行</p>
+<button id="btn1">change</button>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+    editor.customConfig.onchange = function (html) {
+        // html 即变化之后的内容
+        console.log(html)
+    }
+    editor.create()
+
+    document.getElementById('btn1').addEventListener('click', function () {
+        // 如果未配置 editor.customConfig.onchange,则 editor.change 为 undefined
+        editor.change && editor.change()
+    })
+
+</script>
+```
+
+-----
+
+另外,如果需要修改 onchange 触发的延迟时间(onchange 会在用户无任何操作的 xxx 毫秒之后被触发),可通过如下配置
+
+```js
+// 自定义 onchange 触发的延迟时间,默认为 200 ms
+editor.customConfig.onchangeTimeout = 1000 // 单位 ms
+```
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/04-z-index.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/04-z-index.md
new file mode 100644
index 0000000..129bf1c
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/04-z-index.md
@@ -0,0 +1,19 @@
+# 配置编辑区域的 z-index
+
+编辑区域的`z-index`默认为`10000`,可自定义修改,代码配置如下。需改之后,编辑区域和菜单的`z-index`会同时生效。
+
+```html
+<div id="div1">
+    <p>欢迎使用 wangEditor 富文本编辑器</p>
+</div>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+    editor.customConfig.zIndex = 100
+    editor.create()
+</script>
+```
+
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/05-lang.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/05-lang.md
new file mode 100644
index 0000000..01900fe
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/05-lang.md
@@ -0,0 +1,30 @@
+# 多语言
+
+可以通过`lang`配置项配置多语言,其实就是通过该配置项中的配置,将编辑器显示的文字,替换成你需要的文字。
+
+```html
+<div id="div1">
+    <p>欢迎使用 wangEditor 富文本编辑器</p>
+</div>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+
+    editor.customConfig.lang = {
+        '设置标题': 'title',
+        '正文': 'p',
+        '链接文字': 'link text',
+        '链接': 'link',
+        '上传图片': 'upload image',
+        '上传': 'upload',
+        '创建': 'init'
+        // 还可自定添加更多
+    }
+
+    editor.create()
+</script>
+```
+
+**注意,以上代码中的`链接文字`要写在`链接`前面,`上传图片`要写在`上传`前面,因为前者包含后者。如果不这样做,可能会出现替换不全的问题,切记切记!**
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/06-paste.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/06-paste.md
new file mode 100644
index 0000000..a7126c8
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/06-paste.md
@@ -0,0 +1,33 @@
+# 粘贴文本
+
+**注意,以下配置暂时对 IE 无效。IE 暂时使用系统自带的粘贴功能,没有样式过滤!**
+
+## 关闭粘贴样式的过滤
+
+当从其他网页复制文本内容粘贴到编辑器中,编辑器会默认过滤掉复制文本中自带的样式,目的是让粘贴后的文本变得更加简洁和轻量。用户可通过`editor.customConfig.pasteFilterStyle = false`手动关闭掉粘贴样式的过滤。
+
+## 自定义处理粘贴的文本内容
+
+使用者可通过`editor.customConfig.pasteTextHandle`对粘贴的文本内容进行自定义的过滤、处理等操作,然后返回处理之后的文本内容。编辑器最终会粘贴用户处理之后并且返回的的内容。
+
+## 示例代码
+
+```html
+<div id="div1">
+    <p>欢迎使用 wangEditor 富文本编辑器</p>
+</div>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+    // 关闭粘贴样式的过滤
+    editor.customConfig.pasteFilterStyle = false
+    // 自定义处理粘贴的文本内容
+    editor.customConfig.pasteTextHandle = function (content) {
+        // content 即粘贴过来的内容(html 或 纯文本),可进行自定义处理然后返回
+        return content + '<p>在粘贴内容后面追加一行</p>'
+    }
+    editor.create()
+</script>
+```
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/07-linkImgCallback.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/07-linkImgCallback.md
new file mode 100644
index 0000000..52169e8
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/07-linkImgCallback.md
@@ -0,0 +1,12 @@
+# 插入网络图片的回调
+
+插入网络图片时,可通过如下配置获取到图片的信息。`v3.0.10`开始支持。
+
+```js
+var E = window.wangEditor
+var editor = new E('#div1')
+editor.customConfig.linkImgCallback = function (url) {
+    console.log(url) // url 即插入图片的地址
+}
+editor.create()
+```
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/08-linkCheck.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/08-linkCheck.md
new file mode 100644
index 0000000..b581438
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/08-linkCheck.md
@@ -0,0 +1,16 @@
+# 插入链接的校验
+
+插入链接时,可通过如下配置对文字和链接进行校验。`v3.0.10`开始支持。
+
+```js
+var E = window.wangEditor
+var editor = new E('#div1')
+editor.customConfig.linkCheck = function (text, link) {
+    console.log(text) // 插入的文字
+    console.log(link) // 插入的链接
+
+    return true // 返回 true 表示校验成功
+    // return '验证失败' // 返回字符串,即校验失败的提示信息
+}
+editor.create()
+```
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/09-onfocus.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/09-onfocus.md
new file mode 100644
index 0000000..7caba6b
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/09-onfocus.md
@@ -0,0 +1,19 @@
+# 配置 onfocus 函数
+
+配置`onfocus`函数之后,用户点击富文本区域会触发`onfocus`函数执行。
+
+```html
+<div id="div1">
+    <p>欢迎使用 wangEditor 富文本编辑器</p>
+</div>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+    editor.customConfig.onfocus = function () {
+        console.log("onfocus")
+    }
+    editor.create()
+</script>
+```
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/10-onblur.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/10-onblur.md
new file mode 100644
index 0000000..f7544bc
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/10-onblur.md
@@ -0,0 +1,20 @@
+# 配置 onblur 函数
+
+配置`onblur`函数之后,如果当前有手动获取焦点的富文本并且鼠标点击富文本以外的区域,则会触发`onblur`函数执行。
+
+```html
+<div id="div1">
+    <p>欢迎使用 wangEditor 富文本编辑器</p>
+</div>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+    editor.customConfig.onblur = function (html) {
+        // html 即编辑器中的内容
+        console.log('onblur', html)
+    }
+    editor.create()
+</script>
+```
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/11-linkImgCheck.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/11-linkImgCheck.md
new file mode 100644
index 0000000..efb3320
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/11-linkImgCheck.md
@@ -0,0 +1,15 @@
+# 插入网络图片的校验
+
+插入网络图片时,可对图片地址做自定义校验。`v3.0.13`开始支持。
+
+```js
+var E = window.wangEditor
+var editor = new E('#div1')
+editor.customConfig.linkImgCheck = function (src) {
+    console.log(src) // 图片的链接
+
+    return true // 返回 true 表示校验成功
+    // return '验证失败' // 返回字符串,即校验失败的提示信息
+}
+editor.create()
+```
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/12-colors.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/12-colors.md
new file mode 100644
index 0000000..e86e57d
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/12-colors.md
@@ -0,0 +1,29 @@
+# 配置字体颜色、背景色
+
+编辑器的字体颜色和背景色,可以通过`editor.customConfig.colors`自定义配置
+
+```html
+<div id="div1">
+    <p>欢迎使用 wangEditor 富文本编辑器</p>
+</div>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+    // 自定义配置颜色(字体颜色、背景色)
+    editor.customConfig.colors = [
+        '#000000',
+        '#eeece0',
+        '#1c487f',
+        '#4d80bf',
+        '#c24f4a',
+        '#8baa4a',
+        '#7b5ba1',
+        '#46acc8',
+        '#f9963b',
+        '#ffffff'
+    ]
+    editor.create()
+</script>
+```
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/13-emot.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/13-emot.md
new file mode 100644
index 0000000..5363834
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/03-config/13-emot.md
@@ -0,0 +1,48 @@
+# 配置表情
+
+`v3.0.15`开始支持配置表情,支持图片格式和 emoji ,可通过`editor.customConfig.emotions`配置。**注意看代码示例中的注释:**
+
+```html
+<div id="div1">
+    <p>欢迎使用 wangEditor 富文本编辑器</p>
+</div>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+
+    // 表情面板可以有多个 tab ,因此要配置成一个数组。数组每个元素代表一个 tab 的配置
+    editor.customConfig.emotions = [
+        {
+            // tab 的标题
+            title: '默认',
+            // type -> 'emoji' / 'image'
+            type: 'image',
+            // content -> 数组
+            content: [
+                {
+                    alt: '[坏笑]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/50/pcmoren_huaixiao_org.png'
+                },
+                {
+                    alt: '[舔屏]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/pcmoren_tian_org.png'
+                }
+            ]
+        },
+        {
+            // tab 的标题
+            title: 'emoji',
+            // type -> 'emoji' / 'image'
+            type: 'emoji',
+            // content -> 数组
+            content: ['😀', '😃', '😄', '😁', '😆']
+        }
+    ]
+
+    editor.create()
+</script>
+```
+
+温馨提示:需要表情图片可以去 https://api.weibo.com/2/emotions.json?source=1362404091 和 http://yuncode.net/code/c_524ba520e58ce30 逛一逛,或者自己搜索。
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/01-show-tab.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/01-show-tab.md
new file mode 100644
index 0000000..8261950
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/01-show-tab.md
@@ -0,0 +1,52 @@
+# 隐藏/显示 tab
+
+## 显示“上传图片”tab
+
+默认情况下,编辑器不会显示“上传图片”的tab,因为你还没有配置上传图片的信息。
+
+![](http://images2015.cnblogs.com/blog/138012/201706/138012-20170601204308039-691571074.png)
+
+参考一下示例显示“上传图片”tab
+
+```html
+<div id="div1">
+    <p>欢迎使用 wangEditor 富文本编辑器</p>
+</div>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+
+    // 下面两个配置,使用其中一个即可显示“上传图片”的tab。但是两者不要同时使用!!!
+    // editor.customConfig.uploadImgShowBase64 = true   // 使用 base64 保存图片
+    // editor.customConfig.uploadImgServer = '/upload'  // 上传图片到服务器
+
+    editor.create()
+</script>
+```
+
+显示效果
+
+![](http://images2015.cnblogs.com/blog/138012/201706/138012-20170601204504524-830243744.png)
+
+## 隐藏“网络图片”tab
+
+默认情况下,“网络图片”tab是一直存在的。如果不需要,可以参考一下示例来隐藏它。
+
+```html
+<div id="div1">
+    <p>欢迎使用 wangEditor 富文本编辑器</p>
+</div>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+
+    // 隐藏“网络图片”tab
+    editor.customConfig.showLinkImg = false
+
+    editor.create()
+</script>
+```
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/02-base64.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/02-base64.md
new file mode 100644
index 0000000..3a2d71a
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/02-base64.md
@@ -0,0 +1,23 @@
+# 使用 base64 保存图片
+
+如果需要使用 base64 编码直接将图片插入到内容中,可参考一下示例配置
+
+```html
+<div id="div1">
+    <p>欢迎使用 wangEditor 富文本编辑器</p>
+</div>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+    editor.customConfig.uploadImgShowBase64 = true   // 使用 base64 保存图片
+    editor.create()
+</script>
+```
+
+示例效果如下
+
+![](http://images2015.cnblogs.com/blog/138012/201706/138012-20170601204759258-1412289899.png)
+
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/03-upload-config.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/03-upload-config.md
new file mode 100644
index 0000000..6720ce6
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/03-upload-config.md
@@ -0,0 +1,188 @@
+# 上传图片 & 配置
+
+将图片上传到服务器上的配置方式
+
+## 上传图片
+
+参考如下代码
+
+```html
+<div id="div1">
+    <p>欢迎使用 wangEditor 富文本编辑器</p>
+</div>
+
+<script type="text/javascript" src="/wangEditor.min.js"></script>
+<script type="text/javascript">
+    var E = window.wangEditor
+    var editor = new E('#div1')
+
+    // 配置服务器端地址
+    editor.customConfig.uploadImgServer = '/upload'
+
+    // 进行下文提到的其他配置
+    // ……
+    // ……
+    // ……
+
+    editor.create()
+</script>
+```
+
+其中`/upload`是上传图片的服务器端接口,接口返回的**数据格式**如下(**实际返回数据时,不要加任何注释!!!**)
+
+```json
+{
+    // errno 即错误代码,0 表示没有错误。
+    //       如果有错误,errno != 0,可通过下文中的监听函数 fail 拿到该错误码进行自定义处理
+    "errno": 0,
+
+    // data 是一个数组,返回若干图片的线上地址
+    "data": [
+        "图片1地址",
+        "图片2地址",
+        "……"
+    ]
+}
+```
+
+## 限制图片大小
+
+默认限制图片大小是 5M
+
+```javascript
+// 将图片大小限制为 3M
+editor.customConfig.uploadImgMaxSize = 3 * 1024 * 1024
+```
+
+## 限制一次最多能传几张图片
+
+默认为 10000 张(即不限制),需要限制可自己配置
+
+```javascript
+// 限制一次最多上传 5 张图片
+editor.customConfig.uploadImgMaxLength = 5
+```
+
+## 自定义上传参数
+
+上传图片时可自定义传递一些参数,例如传递验证的`token`等。参数会被添加到`formdata`中。
+
+```javascript
+editor.customConfig.uploadImgParams = {
+    token: 'abcdef12345'  // 属性值会自动进行 encode ,此处无需 encode
+}
+```
+
+如果**还需要**将参数拼接到 url 中,可再加上如下配置
+
+```
+editor.customConfig.uploadImgParamsWithUrl = true
+```
+
+## 自定义 fileName
+
+上传图片时,可自定义`filename`,即在使用`formdata.append(name, file)`添加图片文件时,自定义第一个参数。
+
+```javascript
+editor.customConfig.uploadFileName = 'yourFileName'
+```
+
+## 自定义 header
+
+上传图片时刻自定义设置 header
+
+```javascript
+editor.customConfig.uploadImgHeaders = {
+    'Accept': 'text/x-json'
+}
+```
+
+## withCredentials(跨域传递 cookie)
+
+跨域上传中如果需要传递 cookie 需设置 withCredentials
+
+```javascript
+editor.customConfig.withCredentials = true
+```
+
+## 自定义 timeout 时间
+
+默认的 timeout 时间是 10 秒钟
+
+```javascript
+// 将 timeout 时间改为 3s
+editor.customConfig.uploadImgTimeout = 3000
+```
+
+## 监听函数
+
+可使用监听函数在上传图片的不同阶段做相应处理
+
+```javascript
+editor.customConfig.uploadImgHooks = {
+    before: function (xhr, editor, files) {
+        // 图片上传之前触发
+        // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,files 是选择的图片文件
+        
+        // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传
+        // return {
+        //     prevent: true,
+        //     msg: '放弃上传'
+        // }
+    },
+    success: function (xhr, editor, result) {
+        // 图片上传并返回结果,图片插入成功之后触发
+        // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
+    },
+    fail: function (xhr, editor, result) {
+        // 图片上传并返回结果,但图片插入错误时触发
+        // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象,result 是服务器端返回的结果
+    },
+    error: function (xhr, editor) {
+        // 图片上传出错时触发
+        // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
+    },
+    timeout: function (xhr, editor) {
+        // 图片上传超时时触发
+        // xhr 是 XMLHttpRequst 对象,editor 是编辑器对象
+    },
+
+    // 如果服务器端返回的不是 {errno:0, data: [...]} 这种格式,可使用该配置
+    // (但是,服务器端返回的必须是一个 JSON 格式字符串!!!否则会报错)
+    customInsert: function (insertImg, result, editor) {
+        // 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)
+        // insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果
+
+        // 举例:假如上传图片成功后,服务器端返回的是 {url:'....'} 这种格式,即可这样插入图片:
+        var url = result.url
+        insertImg(url)
+
+        // result 必须是一个 JSON 格式字符串!!!否则报错
+    }
+}
+```
+
+## 自定义提示方法
+
+上传图片的错误提示默认使用`alert`弹出,你也可以自定义用户体验更好的提示方式
+
+```javascript
+editor.customConfig.customAlert = function (info) {
+    // info 是需要提示的内容
+    alert('自定义提示:' + info)
+}
+```
+
+## 自定义上传图片事件
+
+如果想完全自己控制图片上传的过程,可以使用如下代码
+
+```javascript
+editor.customConfig.customUploadImg = function (files, insert) {
+    // files 是 input 中选中的文件列表
+    // insert 是获取图片 url 后,插入到编辑器的方法
+
+    // 上传代码返回结果之后,将图片插入到编辑器中
+    insert(imgUrl)
+}
+```
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/04-qiniu.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/04-qiniu.md
new file mode 100644
index 0000000..e5c2ca4
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/04-uploadimg/04-qiniu.md
@@ -0,0 +1,115 @@
+# 上传到七牛云存储
+
+完整的 demo 请参见 https://github.com/wangfupeng1988/js-sdk ,可下载下来本地运行 demo
+
+> 注意:配置了上传七牛云存储之后,**无法再使用插入网络图片**
+
+核心代码如下:
+
+```js
+var E = window.wangEditor
+var editor = new E('#div1')
+// 允许上传到七牛云存储
+editor.customConfig.qiniu = true
+editor.create()
+
+// 初始化七牛上传
+uploadInit()
+
+// 初始化七牛上传的方法
+function uploadInit() {
+    // 获取相关 DOM 节点的 ID
+    var btnId = editor.imgMenuId;
+    var containerId = editor.toolbarElemId;
+    var textElemId = editor.textElemId;
+
+    // 创建上传对象
+    var uploader = Qiniu.uploader({
+        runtimes: 'html5,flash,html4',    //上传模式,依次退化
+        browse_button: btnId,       //上传选择的点选按钮,**必需**
+        uptoken_url: '/uptoken',
+            //Ajax请求upToken的Url,**强烈建议设置**(服务端提供)
+        // uptoken : '<Your upload token>',
+            //若未指定uptoken_url,则必须指定 uptoken ,uptoken由其他程序生成
+        // unique_names: true,
+            // 默认 false,key为文件名。若开启该选项,SDK会为每个文件自动生成key(文件名)
+        // save_key: true,
+            // 默认 false。若在服务端生成uptoken的上传策略中指定了 `sava_key`,则开启,SDK在前端将不对key进行任何处理
+        domain: 'http://7xrjl5.com1.z0.glb.clouddn.com/',
+            //bucket 域名,下载资源时用到,**必需**
+        container: containerId,           //上传区域DOM ID,默认是browser_button的父元素,
+        max_file_size: '100mb',           //最大文件体积限制
+        flash_swf_url: '../js/plupload/Moxie.swf',  //引入flash,相对路径
+        filters: {
+                mime_types: [
+                  //只允许上传图片文件 (注意,extensions中,逗号后面不要加空格)
+                  { title: "图片文件", extensions: "jpg,gif,png,bmp" }
+                ]
+        },
+        max_retries: 3,                   //上传失败最大重试次数
+        dragdrop: true,                   //开启可拖曳上传
+        drop_element: textElemId,        //拖曳上传区域元素的ID,拖曳文件或文件夹后可触发上传
+        chunk_size: '4mb',                //分块上传时,每片的体积
+        auto_start: true,                 //选择文件后自动上传,若关闭需要自己绑定事件触发上传
+        init: {
+            'FilesAdded': function(up, files) {
+                plupload.each(files, function(file) {
+                    // 文件添加进队列后,处理相关的事情
+                    printLog('on FilesAdded');
+                });
+            },
+            'BeforeUpload': function(up, file) {
+                // 每个文件上传前,处理相关的事情
+                printLog('on BeforeUpload');
+            },
+            'UploadProgress': function(up, file) {
+                // 显示进度
+                printLog('进度 ' + file.percent)
+            },
+            'FileUploaded': function(up, file, info) {
+                // 每个文件上传成功后,处理相关的事情
+                // 其中 info 是文件上传成功后,服务端返回的json,形式如
+                // {
+                //    "hash": "Fh8xVqod2MQ1mocfI4S4KpRL6D98",
+                //    "key": "gogopher.jpg"
+                //  }
+                printLog(info);
+                // 参考http://developer.qiniu.com/docs/v6/api/overview/up/response/simple-response.html
+                
+                var domain = up.getOption('domain');
+                var res = $.parseJSON(info);
+                var sourceLink = domain + res.key; //获取上传成功后的文件的Url
+
+                printLog(sourceLink);
+
+                // 插入图片到editor
+                editor.cmd.do('insertHtml', '<img src="' + sourceLink + '" style="max-width:100%;"/>')
+            },
+            'Error': function(up, err, errTip) {
+                //上传出错时,处理相关的事情
+                printLog('on Error');
+            },
+            'UploadComplete': function() {
+                //队列文件处理完毕后,处理相关的事情
+                printLog('on UploadComplete');
+            }
+            // Key 函数如果有需要自行配置,无特殊需要请注释
+            //,
+            // 'Key': function(up, file) {
+            //     // 若想在前端对每个文件的key进行个性化处理,可以配置该函数
+            //     // 该配置必须要在 unique_names: false , save_key: false 时才生效
+            //     var key = "";
+            //     // do something with key here
+            //     return key
+            // }
+        }
+        // domain 为七牛空间(bucket)对应的域名,选择某个空间后,可通过"空间设置->基本设置->域名设置"查看获取
+        // uploader 为一个plupload对象,继承了所有plupload的方法,参考http://plupload.com/docs
+    });
+}
+
+// 封装 console.log 函数
+function printLog(title, info) {
+    window.console && console.log(title, info);
+}
+```
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/01-全屏-预览-查看源码.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/01-全屏-预览-查看源码.md
new file mode 100644
index 0000000..27588c8
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/01-全屏-预览-查看源码.md
@@ -0,0 +1,10 @@
+# 全屏 & 预览 & 查看源码
+
+## 全屏
+
+虽然 wangEditor 没有内置全屏功能,但是你可以通过简单的代码来搞定,作者已经做了一个demo来示范。通过运行 demo(文档一开始就介绍了)即可看到该示例页面,直接查看页面源代码即可。
+
+## 预览 & 查看源码
+
+如果需要预览和查看源码的功能,也需要跟全屏功能一样,自己定义按钮。点击按钮时通过`editor.txt.html()`获取编辑器内容,然后自定义实现预览和查看源码功能。
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/02-上传附件.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/02-上传附件.md
new file mode 100644
index 0000000..1f3cc88
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/02-上传附件.md
@@ -0,0 +1,24 @@
+# 关于上传附件
+
+**有用户问到编辑器能否有上传附件的功能?我的建议是不要把附件做到内容中。**
+
+原因很简单,如果将附件上传之后再插入到富文本内容中,其实就是一个链接的形式。如下图:
+
+![](http://box.kancloud.cn/2016-02-19_56c718ec6f9bf.png)
+
+而用户在用编辑器编辑文本时,操作是非常随意多样的,他把这个链接删了,你服务器要想实时删除上传的附件文件,是难监控到的。
+
+还有,用户如果要上传很多个附件,也是很难管理的,还是因为富文本的内容变化多样,用户可以随便在什么地方插入附件,而且形式和链接一样。
+
+-------
+
+反过来,我们想一下平时用附件和编辑器最多的产品是什么——是邮箱。邮箱如何处理附件的,大家应该很清楚。它把文本内容和附件分开,这样附件就可以很轻松、明了的进行管理,绝对不会和编辑内容的链接产生混淆。
+
+![](http://box.kancloud.cn/2016-02-19_56c718ec83f7e.png)
+
+你能看到的所有的邮箱产品,几乎都是这样设计的。
+
+-------
+
+因此,在你提问编辑器能否上传附件这个问题的时候,可以想一下能否参照邮箱的实现来设计?
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/03-markdown.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/03-markdown.md
new file mode 100644
index 0000000..c723347
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/03-markdown.md
@@ -0,0 +1,12 @@
+# 关于 markdown
+
+**好多使用者问到,wangEditor编辑器能否集成markdown?——答案是:富文本编辑器无法和markdown集成到一起。**
+
+-----
+
+
+你可以参考 [简书](http://www.jianshu.com/) 的实现方式,简书中编辑器也无法实现富文本和`markdown`的自由切换。要么使用富文本编写文章,要么使用`markdown`编写文章,不能公用。
+
+本质上,富文本编辑器和`markdown`编辑器是两回事儿。
+
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/04-xss.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/04-xss.md
new file mode 100644
index 0000000..286337f
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/04-xss.md
@@ -0,0 +1,23 @@
+# 预防 XSS 攻击
+
+> 术业有专攻
+
+要想在前端预防 xss 攻击,还得依赖于其他工具,例如[xss.js](http://jsxss.com/zh/index.html)(如果打不开页面,就从百度搜一下)
+
+代码示例如下
+
+```html
+<script src='/xss.js'></script>
+<script src='/wangEditor.min.js'></script>
+<script>
+    var E = window.wangEditor
+    var editor = new E('#div1')
+
+    document.getElementById('btn1').addEventListener('click', function () {
+        var html = editor.txt.html()
+        var filterHtml = filterXSS(html)  // 此处进行 xss 攻击过滤
+        alert(filterHtml)
+    }, false)
+</script>
+```
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/05-react.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/05-react.md
new file mode 100644
index 0000000..8dcc2d4
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/05-react.md
@@ -0,0 +1,7 @@
+# 用于 React
+
+如果需要将 wangEditor 用于 React 中,可参见如下示例
+
+- 下载源码 `git clone git@github.com:wangfupeng1988/wangEditor.git`
+- 进入 React 示例目录 `cd wangEditor/example/demo/in-react/`,查看`src/App.js`即可
+- 也可以运行`npm install && npm start`查看在 React 中的效果(`http://localhost:3000/`)
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/06-vue.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/06-vue.md
new file mode 100644
index 0000000..47e167a
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/06-vue.md
@@ -0,0 +1,7 @@
+# 用于 Vue
+
+如果需要将 wangEditor 用于 Vue 中,可参见如下示例
+
+- 下载源码 `git clone git@github.com:wangfupeng1988/wangEditor.git`
+- 进入 vue 示例目录 `cd wangEditor/example/demo/in-vue/`,查看`src/components/Editor.vue`即可
+- 也可以运行`npm install && npm run dev`查看在 vue 中的效果(`http://localhost:8080/`)
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/07-ng.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/07-ng.md
new file mode 100644
index 0000000..1d59afc
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/07-ng.md
@@ -0,0 +1,3 @@
+# 用于 Angular
+
+感谢 [@fengnovo](https://github.com/fengnovo) 提供了一个 angular2 的兼容示例,可供参考 https://github.com/fengnovo/wangEditor/tree/master/example/demo/in-ng2
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/08-api.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/08-api.md
new file mode 100644
index 0000000..e8b4f6d
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/05-other/08-api.md
@@ -0,0 +1,27 @@
+# 常用 API
+
+## 属性
+
+- 获取编辑器的唯一标识 `editor.id`
+- 获取编辑区域 DOM 节点 `editor.$textElem[0]`
+- 获取菜单栏 DOM 节点 `editor.$toolbarElem[0]`
+- 获取编辑器配置信息 `editor.config`
+- 获取编辑区域 DOM 节点 ID `editor.textElemId`
+- 获取菜单栏 DOM 节点 ID `editor.toolbarElemId`
+- 获取菜单栏中“图片”菜单的 DOM 节点 ID `editor.imgMenuId`
+
+## 方法
+
+### 选取操作
+
+- 获取选中的文字 `editor.selection.getSelectionText()`
+- 获取选取所在的 DOM 节点 `editor.selection.getSelectionContainerElem()[0]`
+    - 开始节点 `editor.selection.getSelectionStartElem()[0]`
+    - 结束节点 `editor.selection.getSelectionEndElem()[0]`
+- 折叠选取 `editor.selection.collapseRange()`
+- 更多可参见[源码中](https://github.com/wangfupeng1988/wangEditor/blob/master/src/js/selection/index.js)定义的方法
+
+### 编辑内容操作
+
+- 插入 HTML `editor.cmd.do('insertHTML', '<p>...</p>')`
+- 可通过`editor.cmd.do(name, value)`来执行`document.execCommand(name, false, value)`的操作
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/docs/usage/README.md b/novel-admin/src/main/resources/static/wangEditor/docs/usage/README.md
new file mode 100644
index 0000000..4c801e6
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/docs/usage/README.md
@@ -0,0 +1,3 @@
+同步[../../README.md](../../README.md)的内容
+
+将所有文档跟新到 www.kancloud.cn/wangfupeng/wangeditor3/332599 中
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/README.md b/novel-admin/src/main/resources/static/wangEditor/example/README.md
new file mode 100644
index 0000000..6e17ca0
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/README.md
@@ -0,0 +1 @@
+wangEditor demo
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/package.json b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/package.json
new file mode 100644
index 0000000..054d5cd
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/package.json
@@ -0,0 +1,19 @@
+{
+  "name": "wangeditor-in-react",
+  "version": "0.1.0",
+  "private": true,
+  "dependencies": {
+    "react": "^15.5.4",
+    "react-dom": "^15.5.4",
+    "wangeditor": ">=3.0.0"
+  },
+  "devDependencies": {
+    "react-scripts": "1.0.7"
+  },
+  "scripts": {
+    "start": "react-scripts start",
+    "build": "react-scripts build",
+    "test": "react-scripts test --env=jsdom",
+    "eject": "react-scripts eject"
+  }
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/public/favicon.ico b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/public/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..5c125de5d897c1ff5692a656485b3216123dcd89
GIT binary patch
literal 24838
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
F{{x|jBbfjI

literal 0
HcmV?d00001

diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/public/index.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/public/index.html
new file mode 100644
index 0000000..7bee027
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/public/index.html
@@ -0,0 +1,40 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <meta name="theme-color" content="#000000">
+    <!--
+      manifest.json provides metadata used when your web app is added to the
+      homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
+    -->
+    <link rel="manifest" href="%PUBLIC_URL%/manifest.json">
+    <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
+    <!--
+      Notice the use of %PUBLIC_URL% in the tags above.
+      It will be replaced with the URL of the `public` folder during the build.
+      Only files inside the `public` folder can be referenced from the HTML.
+
+      Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
+      work correctly both with client-side routing and a non-root public URL.
+      Learn how to configure a non-root public URL by running `npm run build`.
+    -->
+    <title>React App</title>
+  </head>
+  <body>
+    <noscript>
+      You need to enable JavaScript to run this app.
+    </noscript>
+    <div id="root"></div>
+    <!--
+      This HTML file is a template.
+      If you open it directly in the browser, you will see an empty page.
+
+      You can add webfonts, meta tags, or analytics to this file.
+      The build step will place the bundled scripts into the <body> tag.
+
+      To begin the development, run `npm start` or `yarn start`.
+      To create a production bundle, use `npm run build` or `yarn build`.
+    -->
+  </body>
+</html>
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/public/manifest.json b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/public/manifest.json
new file mode 100644
index 0000000..be607e4
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/public/manifest.json
@@ -0,0 +1,15 @@
+{
+  "short_name": "React App",
+  "name": "Create React App Sample",
+  "icons": [
+    {
+      "src": "favicon.ico",
+      "sizes": "192x192",
+      "type": "image/png"
+    }
+  ],
+  "start_url": "./index.html",
+  "display": "standalone",
+  "theme_color": "#000000",
+  "background_color": "#ffffff"
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/App.css b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/App.css
new file mode 100644
index 0000000..15adfdc
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/App.css
@@ -0,0 +1,24 @@
+.App {
+  text-align: center;
+}
+
+.App-logo {
+  animation: App-logo-spin infinite 20s linear;
+  height: 80px;
+}
+
+.App-header {
+  background-color: #222;
+  height: 150px;
+  padding: 20px;
+  color: white;
+}
+
+.App-intro {
+  font-size: large;
+}
+
+@keyframes App-logo-spin {
+  from { transform: rotate(0deg); }
+  to { transform: rotate(360deg); }
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/App.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/App.js
new file mode 100644
index 0000000..95b21fb
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/App.js
@@ -0,0 +1,48 @@
+import React, { Component } from 'react';
+import logo from './logo.svg';
+import './App.css';
+import E from 'wangeditor'
+
+class App extends Component {
+  constructor(props, context) {
+      super(props, context);
+      this.state = {
+        editorContent: ''
+      }
+  }
+  render() {
+    return (
+      <div className="App">
+        <div className="App-header">
+          <img src={logo} className="App-logo" alt="logo" />
+          <h2>Welcome to React</h2>
+        </div>
+        <p className="App-intro">
+          To get started, edit <code>src/App.js</code> and save to reload.
+        </p>
+
+        {/* 将生成编辑器 */}
+        <div ref="editorElem" style={{textAlign: 'left'}}>
+        </div>
+
+        <button onClick={this.clickHandle.bind(this)}>获取内容</button>
+      </div>
+    );
+  }
+  componentDidMount() {
+    const elem = this.refs.editorElem
+    const editor = new E(elem)
+    // 使用 onchange 函数监听内容的变化,并实时更新到 state 中
+    editor.customConfig.onchange = html => {
+      this.setState({
+        editorContent: html
+      })
+    }
+    editor.create()
+  }
+  clickHandle() {
+      alert(this.state.editorContent)
+  }
+}
+
+export default App;
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/App.test.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/App.test.js
new file mode 100644
index 0000000..b84af98
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/App.test.js
@@ -0,0 +1,8 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import App from './App';
+
+it('renders without crashing', () => {
+  const div = document.createElement('div');
+  ReactDOM.render(<App />, div);
+});
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/index.css b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/index.css
new file mode 100644
index 0000000..b4cc725
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/index.css
@@ -0,0 +1,5 @@
+body {
+  margin: 0;
+  padding: 0;
+  font-family: sans-serif;
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/index.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/index.js
new file mode 100644
index 0000000..53c7688
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/index.js
@@ -0,0 +1,8 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import App from './App';
+import registerServiceWorker from './registerServiceWorker';
+import './index.css';
+
+ReactDOM.render(<App />, document.getElementById('root'));
+registerServiceWorker();
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/logo.svg b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/logo.svg
new file mode 100644
index 0000000..6b60c10
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/logo.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3">
+    <g fill="#61DAFB">
+        <path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/>
+        <circle cx="420.9" cy="296.5" r="45.7"/>
+        <path d="M520.5 78.1z"/>
+    </g>
+</svg>
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/registerServiceWorker.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/registerServiceWorker.js
new file mode 100644
index 0000000..9966897
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-react/src/registerServiceWorker.js
@@ -0,0 +1,51 @@
+// In production, we register a service worker to serve assets from local cache.
+
+// This lets the app load faster on subsequent visits in production, and gives
+// it offline capabilities. However, it also means that developers (and users)
+// will only see deployed updates on the "N+1" visit to a page, since previously
+// cached resources are updated in the background.
+
+// To learn more about the benefits of this model, read https://goo.gl/KwvDNy.
+// This link also includes instructions on opting out of this behavior.
+
+export default function register() {
+  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
+    window.addEventListener('load', () => {
+      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
+      navigator.serviceWorker
+        .register(swUrl)
+        .then(registration => {
+          registration.onupdatefound = () => {
+            const installingWorker = registration.installing;
+            installingWorker.onstatechange = () => {
+              if (installingWorker.state === 'installed') {
+                if (navigator.serviceWorker.controller) {
+                  // At this point, the old content will have been purged and
+                  // the fresh content will have been added to the cache.
+                  // It's the perfect time to display a "New content is
+                  // available; please refresh." message in your web app.
+                  console.log('New content is available; please refresh.');
+                } else {
+                  // At this point, everything has been precached.
+                  // It's the perfect time to display a
+                  // "Content is cached for offline use." message.
+                  console.log('Content is cached for offline use.');
+                }
+              }
+            };
+          };
+        })
+        .catch(error => {
+          console.error('Error during service worker registration:', error);
+        });
+    });
+  }
+}
+
+export function unregister() {
+  if ('serviceWorker' in navigator) {
+    navigator.serviceWorker.ready.then(registration => {
+      registration.unregister();
+    });
+  }
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/.babelrc b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/.babelrc
new file mode 100644
index 0000000..13f0e47
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/.babelrc
@@ -0,0 +1,14 @@
+{
+  "presets": [
+    ["env", { "modules": false }],
+    "stage-2"
+  ],
+  "plugins": ["transform-runtime"],
+  "comments": false,
+  "env": {
+    "test": {
+      "presets": ["env", "stage-2"],
+      "plugins": [ "istanbul" ]
+    }
+  }
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/.editorconfig b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/.editorconfig
new file mode 100644
index 0000000..9d08a1a
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/.editorconfig
@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/.postcssrc.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/.postcssrc.js
new file mode 100644
index 0000000..ea9a5ab
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/.postcssrc.js
@@ -0,0 +1,8 @@
+// https://github.com/michael-ciniawsky/postcss-load-config
+
+module.exports = {
+  "plugins": {
+    // to edit target browsers: use "browserlist" field in package.json
+    "autoprefixer": {}
+  }
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/build.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/build.js
new file mode 100644
index 0000000..6b8add1
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/build.js
@@ -0,0 +1,35 @@
+require('./check-versions')()
+
+process.env.NODE_ENV = 'production'
+
+var ora = require('ora')
+var rm = require('rimraf')
+var path = require('path')
+var chalk = require('chalk')
+var webpack = require('webpack')
+var config = require('../config')
+var webpackConfig = require('./webpack.prod.conf')
+
+var spinner = ora('building for production...')
+spinner.start()
+
+rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
+  if (err) throw err
+  webpack(webpackConfig, function (err, stats) {
+    spinner.stop()
+    if (err) throw err
+    process.stdout.write(stats.toString({
+      colors: true,
+      modules: false,
+      children: false,
+      chunks: false,
+      chunkModules: false
+    }) + '\n\n')
+
+    console.log(chalk.cyan('  Build complete.\n'))
+    console.log(chalk.yellow(
+      '  Tip: built files are meant to be served over an HTTP server.\n' +
+      '  Opening index.html over file:// won\'t work.\n'
+    ))
+  })
+})
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/check-versions.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/check-versions.js
new file mode 100644
index 0000000..100f3a0
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/check-versions.js
@@ -0,0 +1,48 @@
+var chalk = require('chalk')
+var semver = require('semver')
+var packageConfig = require('../package.json')
+var shell = require('shelljs')
+function exec (cmd) {
+  return require('child_process').execSync(cmd).toString().trim()
+}
+
+var versionRequirements = [
+  {
+    name: 'node',
+    currentVersion: semver.clean(process.version),
+    versionRequirement: packageConfig.engines.node
+  },
+]
+
+if (shell.which('npm')) {
+  versionRequirements.push({
+    name: 'npm',
+    currentVersion: exec('npm --version'),
+    versionRequirement: packageConfig.engines.npm
+  })
+}
+
+module.exports = function () {
+  var warnings = []
+  for (var i = 0; i < versionRequirements.length; i++) {
+    var mod = versionRequirements[i]
+    if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
+      warnings.push(mod.name + ': ' +
+        chalk.red(mod.currentVersion) + ' should be ' +
+        chalk.green(mod.versionRequirement)
+      )
+    }
+  }
+
+  if (warnings.length) {
+    console.log('')
+    console.log(chalk.yellow('To use this template, you must update following to modules:'))
+    console.log()
+    for (var i = 0; i < warnings.length; i++) {
+      var warning = warnings[i]
+      console.log('  ' + warning)
+    }
+    console.log()
+    process.exit(1)
+  }
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/dev-client.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/dev-client.js
new file mode 100644
index 0000000..18aa1e2
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/dev-client.js
@@ -0,0 +1,9 @@
+/* eslint-disable */
+require('eventsource-polyfill')
+var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
+
+hotClient.subscribe(function (event) {
+  if (event.action === 'reload') {
+    window.location.reload()
+  }
+})
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/dev-server.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/dev-server.js
new file mode 100644
index 0000000..782dc6f
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/dev-server.js
@@ -0,0 +1,89 @@
+require('./check-versions')()
+
+var config = require('../config')
+if (!process.env.NODE_ENV) {
+  process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
+}
+
+var opn = require('opn')
+var path = require('path')
+var express = require('express')
+var webpack = require('webpack')
+var proxyMiddleware = require('http-proxy-middleware')
+var webpackConfig = require('./webpack.dev.conf')
+
+// default port where dev server listens for incoming traffic
+var port = process.env.PORT || config.dev.port
+// automatically open browser, if not set will be false
+var autoOpenBrowser = !!config.dev.autoOpenBrowser
+// Define HTTP proxies to your custom API backend
+// https://github.com/chimurai/http-proxy-middleware
+var proxyTable = config.dev.proxyTable
+
+var app = express()
+var compiler = webpack(webpackConfig)
+
+var devMiddleware = require('webpack-dev-middleware')(compiler, {
+  publicPath: webpackConfig.output.publicPath,
+  quiet: true
+})
+
+var hotMiddleware = require('webpack-hot-middleware')(compiler, {
+  log: () => {}
+})
+// force page reload when html-webpack-plugin template changes
+compiler.plugin('compilation', function (compilation) {
+  compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
+    hotMiddleware.publish({ action: 'reload' })
+    cb()
+  })
+})
+
+// proxy api requests
+Object.keys(proxyTable).forEach(function (context) {
+  var options = proxyTable[context]
+  if (typeof options === 'string') {
+    options = { target: options }
+  }
+  app.use(proxyMiddleware(options.filter || context, options))
+})
+
+// handle fallback for HTML5 history API
+app.use(require('connect-history-api-fallback')())
+
+// serve webpack bundle output
+app.use(devMiddleware)
+
+// enable hot-reload and state-preserving
+// compilation error display
+app.use(hotMiddleware)
+
+// serve pure static assets
+var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
+app.use(staticPath, express.static('./static'))
+
+var uri = 'http://localhost:' + port
+
+var _resolve
+var readyPromise = new Promise(resolve => {
+  _resolve = resolve
+})
+
+console.log('> Starting dev server...')
+devMiddleware.waitUntilValid(() => {
+  console.log('> Listening at ' + uri + '\n')
+  // when env is testing, don't need open it
+  if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
+    opn(uri)
+  }
+  _resolve()
+})
+
+var server = app.listen(port)
+
+module.exports = {
+  ready: readyPromise,
+  close: () => {
+    server.close()
+  }
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/utils.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/utils.js
new file mode 100644
index 0000000..b1d54b4
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/utils.js
@@ -0,0 +1,71 @@
+var path = require('path')
+var config = require('../config')
+var ExtractTextPlugin = require('extract-text-webpack-plugin')
+
+exports.assetsPath = function (_path) {
+  var assetsSubDirectory = process.env.NODE_ENV === 'production'
+    ? config.build.assetsSubDirectory
+    : config.dev.assetsSubDirectory
+  return path.posix.join(assetsSubDirectory, _path)
+}
+
+exports.cssLoaders = function (options) {
+  options = options || {}
+
+  var cssLoader = {
+    loader: 'css-loader',
+    options: {
+      minimize: process.env.NODE_ENV === 'production',
+      sourceMap: options.sourceMap
+    }
+  }
+
+  // generate loader string to be used with extract text plugin
+  function generateLoaders (loader, loaderOptions) {
+    var loaders = [cssLoader]
+    if (loader) {
+      loaders.push({
+        loader: loader + '-loader',
+        options: Object.assign({}, loaderOptions, {
+          sourceMap: options.sourceMap
+        })
+      })
+    }
+
+    // Extract CSS when that option is specified
+    // (which is the case during production build)
+    if (options.extract) {
+      return ExtractTextPlugin.extract({
+        use: loaders,
+        fallback: 'vue-style-loader'
+      })
+    } else {
+      return ['vue-style-loader'].concat(loaders)
+    }
+  }
+
+  // https://vue-loader.vuejs.org/en/configurations/extract-css.html
+  return {
+    css: generateLoaders(),
+    postcss: generateLoaders(),
+    less: generateLoaders('less'),
+    sass: generateLoaders('sass', { indentedSyntax: true }),
+    scss: generateLoaders('sass'),
+    stylus: generateLoaders('stylus'),
+    styl: generateLoaders('stylus')
+  }
+}
+
+// Generate loaders for standalone style files (outside of .vue)
+exports.styleLoaders = function (options) {
+  var output = []
+  var loaders = exports.cssLoaders(options)
+  for (var extension in loaders) {
+    var loader = loaders[extension]
+    output.push({
+      test: new RegExp('\\.' + extension + '$'),
+      use: loader
+    })
+  }
+  return output
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/vue-loader.conf.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/vue-loader.conf.js
new file mode 100644
index 0000000..7aee79b
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/vue-loader.conf.js
@@ -0,0 +1,12 @@
+var utils = require('./utils')
+var config = require('../config')
+var isProduction = process.env.NODE_ENV === 'production'
+
+module.exports = {
+  loaders: utils.cssLoaders({
+    sourceMap: isProduction
+      ? config.build.productionSourceMap
+      : config.dev.cssSourceMap,
+    extract: isProduction
+  })
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/webpack.base.conf.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/webpack.base.conf.js
new file mode 100644
index 0000000..daa3589
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/webpack.base.conf.js
@@ -0,0 +1,58 @@
+var path = require('path')
+var utils = require('./utils')
+var config = require('../config')
+var vueLoaderConfig = require('./vue-loader.conf')
+
+function resolve (dir) {
+  return path.join(__dirname, '..', dir)
+}
+
+module.exports = {
+  entry: {
+    app: './src/main.js'
+  },
+  output: {
+    path: config.build.assetsRoot,
+    filename: '[name].js',
+    publicPath: process.env.NODE_ENV === 'production'
+      ? config.build.assetsPublicPath
+      : config.dev.assetsPublicPath
+  },
+  resolve: {
+    extensions: ['.js', '.vue', '.json'],
+    alias: {
+      'vue$': 'vue/dist/vue.esm.js',
+      '@': resolve('src')
+    }
+  },
+  module: {
+    rules: [
+      {
+        test: /\.vue$/,
+        loader: 'vue-loader',
+        options: vueLoaderConfig
+      },
+      {
+        test: /\.js$/,
+        loader: 'babel-loader',
+        include: [resolve('src'), resolve('test')]
+      },
+      {
+        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('img/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
+        }
+      }
+    ]
+  }
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/webpack.dev.conf.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/webpack.dev.conf.js
new file mode 100644
index 0000000..5470402
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/webpack.dev.conf.js
@@ -0,0 +1,35 @@
+var utils = require('./utils')
+var webpack = require('webpack')
+var config = require('../config')
+var merge = require('webpack-merge')
+var baseWebpackConfig = require('./webpack.base.conf')
+var HtmlWebpackPlugin = require('html-webpack-plugin')
+var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
+
+// add hot-reload related code to entry chunks
+Object.keys(baseWebpackConfig.entry).forEach(function (name) {
+  baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
+})
+
+module.exports = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
+  },
+  // cheap-module-eval-source-map is faster for development
+  devtool: '#cheap-module-eval-source-map',
+  plugins: [
+    new webpack.DefinePlugin({
+      'process.env': config.dev.env
+    }),
+    // https://github.com/glenjamin/webpack-hot-middleware#installation--usage
+    new webpack.HotModuleReplacementPlugin(),
+    new webpack.NoEmitOnErrorsPlugin(),
+    // https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: 'index.html',
+      template: 'index.html',
+      inject: true
+    }),
+    new FriendlyErrorsPlugin()
+  ]
+})
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/webpack.prod.conf.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/webpack.prod.conf.js
new file mode 100644
index 0000000..da44b65
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/build/webpack.prod.conf.js
@@ -0,0 +1,120 @@
+var path = require('path')
+var utils = require('./utils')
+var webpack = require('webpack')
+var config = require('../config')
+var merge = require('webpack-merge')
+var baseWebpackConfig = require('./webpack.base.conf')
+var CopyWebpackPlugin = require('copy-webpack-plugin')
+var HtmlWebpackPlugin = require('html-webpack-plugin')
+var ExtractTextPlugin = require('extract-text-webpack-plugin')
+var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
+
+var env = config.build.env
+
+var webpackConfig = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({
+      sourceMap: config.build.productionSourceMap,
+      extract: true
+    })
+  },
+  devtool: config.build.productionSourceMap ? '#source-map' : false,
+  output: {
+    path: config.build.assetsRoot,
+    filename: utils.assetsPath('js/[name].[chunkhash].js'),
+    chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
+  },
+  plugins: [
+    // http://vuejs.github.io/vue-loader/en/workflow/production.html
+    new webpack.DefinePlugin({
+      'process.env': env
+    }),
+    new webpack.optimize.UglifyJsPlugin({
+      compress: {
+        warnings: false
+      },
+      sourceMap: true
+    }),
+    // extract css into its own file
+    new ExtractTextPlugin({
+      filename: utils.assetsPath('css/[name].[contenthash].css')
+    }),
+    // Compress extracted CSS. We are using this plugin so that possible
+    // duplicated CSS from different components can be deduped.
+    new OptimizeCSSPlugin({
+      cssProcessorOptions: {
+        safe: true
+      }
+    }),
+    // generate dist index.html with correct asset hash for caching.
+    // you can customize output by editing /index.html
+    // see https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: config.build.index,
+      template: 'index.html',
+      inject: true,
+      minify: {
+        removeComments: true,
+        collapseWhitespace: true,
+        removeAttributeQuotes: true
+        // more options:
+        // https://github.com/kangax/html-minifier#options-quick-reference
+      },
+      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
+      chunksSortMode: 'dependency'
+    }),
+    // split vendor js into its own file
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'vendor',
+      minChunks: function (module, count) {
+        // any required modules inside node_modules are extracted to vendor
+        return (
+          module.resource &&
+          /\.js$/.test(module.resource) &&
+          module.resource.indexOf(
+            path.join(__dirname, '../node_modules')
+          ) === 0
+        )
+      }
+    }),
+    // extract webpack runtime and module manifest to its own file in order to
+    // prevent vendor hash from being updated whenever app bundle is updated
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'manifest',
+      chunks: ['vendor']
+    }),
+    // copy custom static assets
+    new CopyWebpackPlugin([
+      {
+        from: path.resolve(__dirname, '../static'),
+        to: config.build.assetsSubDirectory,
+        ignore: ['.*']
+      }
+    ])
+  ]
+})
+
+if (config.build.productionGzip) {
+  var CompressionWebpackPlugin = require('compression-webpack-plugin')
+
+  webpackConfig.plugins.push(
+    new CompressionWebpackPlugin({
+      asset: '[path].gz[query]',
+      algorithm: 'gzip',
+      test: new RegExp(
+        '\\.(' +
+        config.build.productionGzipExtensions.join('|') +
+        ')$'
+      ),
+      threshold: 10240,
+      minRatio: 0.8
+    })
+  )
+}
+
+if (config.build.bundleAnalyzerReport) {
+  var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
+  webpackConfig.plugins.push(new BundleAnalyzerPlugin())
+}
+
+module.exports = webpackConfig
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/config/dev.env.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/config/dev.env.js
new file mode 100644
index 0000000..efead7c
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/config/dev.env.js
@@ -0,0 +1,6 @@
+var merge = require('webpack-merge')
+var prodEnv = require('./prod.env')
+
+module.exports = merge(prodEnv, {
+  NODE_ENV: '"development"'
+})
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/config/index.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/config/index.js
new file mode 100644
index 0000000..196da1f
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/config/index.js
@@ -0,0 +1,38 @@
+// see http://vuejs-templates.github.io/webpack for documentation.
+var path = require('path')
+
+module.exports = {
+  build: {
+    env: require('./prod.env'),
+    index: path.resolve(__dirname, '../dist/index.html'),
+    assetsRoot: path.resolve(__dirname, '../dist'),
+    assetsSubDirectory: 'static',
+    assetsPublicPath: '/',
+    productionSourceMap: true,
+    // Gzip off by default as many popular static hosts such as
+    // Surge or Netlify already gzip all static assets for you.
+    // Before setting to `true`, make sure to:
+    // npm install --save-dev compression-webpack-plugin
+    productionGzip: false,
+    productionGzipExtensions: ['js', 'css'],
+    // Run the build command with an extra argument to
+    // View the bundle analyzer report after build finishes:
+    // `npm run build --report`
+    // Set to `true` or `false` to always turn it on or off
+    bundleAnalyzerReport: process.env.npm_config_report
+  },
+  dev: {
+    env: require('./dev.env'),
+    port: 8080,
+    autoOpenBrowser: true,
+    assetsSubDirectory: 'static',
+    assetsPublicPath: '/',
+    proxyTable: {},
+    // CSS Sourcemaps off by default because relative paths are "buggy"
+    // with this option, according to the CSS-Loader README
+    // (https://github.com/webpack/css-loader#sourcemaps)
+    // In our experience, they generally work as expected,
+    // just be aware of this issue when enabling this option.
+    cssSourceMap: false
+  }
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/config/prod.env.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/config/prod.env.js
new file mode 100644
index 0000000..773d263
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/config/prod.env.js
@@ -0,0 +1,3 @@
+module.exports = {
+  NODE_ENV: '"production"'
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/index.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/index.html
new file mode 100644
index 0000000..47ae14a
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/index.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>wangeditor-in-vue</title>
+  </head>
+  <body>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/package.json b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/package.json
new file mode 100644
index 0000000..80cf68f
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/package.json
@@ -0,0 +1,60 @@
+{
+  "name": "wangeditor-in-vue",
+  "version": "1.0.0",
+  "description": "A Vue.js project",
+  "author": "git <git@git.com>",
+  "private": true,
+  "scripts": {
+    "dev": "node build/dev-server.js",
+    "start": "node build/dev-server.js",
+    "build": "node build/build.js"
+  },
+  "dependencies": {
+    "vue": "^2.3.3",
+    "wangeditor": ">=3.0.0"
+  },
+  "devDependencies": {
+    "autoprefixer": "^6.7.2",
+    "babel-core": "^6.22.1",
+    "babel-loader": "^6.2.10",
+    "babel-plugin-transform-runtime": "^6.22.0",
+    "babel-preset-env": "^1.3.2",
+    "babel-preset-stage-2": "^6.22.0",
+    "babel-register": "^6.22.0",
+    "chalk": "^1.1.3",
+    "connect-history-api-fallback": "^1.3.0",
+    "copy-webpack-plugin": "^4.0.1",
+    "css-loader": "^0.28.0",
+    "eventsource-polyfill": "^0.9.6",
+    "express": "^4.14.1",
+    "extract-text-webpack-plugin": "^2.0.0",
+    "file-loader": "^0.11.1",
+    "friendly-errors-webpack-plugin": "^1.1.3",
+    "html-webpack-plugin": "^2.28.0",
+    "http-proxy-middleware": "^0.17.3",
+    "webpack-bundle-analyzer": "^2.2.1",
+    "semver": "^5.3.0",
+    "shelljs": "^0.7.6",
+    "opn": "^4.0.2",
+    "optimize-css-assets-webpack-plugin": "^1.3.0",
+    "ora": "^1.2.0",
+    "rimraf": "^2.6.0",
+    "url-loader": "^0.5.8",
+    "vue-loader": "^12.1.0",
+    "vue-style-loader": "^3.0.1",
+    "vue-template-compiler": "^2.3.3",
+    "webpack": "^2.6.1",
+    "webpack-dev-middleware": "^1.10.0",
+    "webpack-hot-middleware": "^2.18.0",
+    "webpack-merge": "^4.1.0"
+  },
+  "engines": {
+    "node": ">= 4.0.0",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ]
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/App.vue b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/App.vue
new file mode 100644
index 0000000..27d15ff
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/App.vue
@@ -0,0 +1,31 @@
+<template>
+  <div id="app">
+    <img src="./assets/logo.png">
+    <hello></hello>
+    <editor></editor>
+  </div>
+</template>
+
+<script>
+import Hello from './components/Hello'
+import Editor from './components/Editor'
+
+export default {
+  name: 'app',
+  components: {
+    Hello,
+    Editor
+  }
+}
+</script>
+
+<style>
+#app {
+  font-family: 'Avenir', Helvetica, Arial, sans-serif;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  text-align: center;
+  color: #2c3e50;
+  margin-top: 60px;
+}
+</style>
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/assets/logo.png b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/assets/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43
GIT binary patch
literal 6849
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

literal 0
HcmV?d00001

diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/components/Editor.vue b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/components/Editor.vue
new file mode 100644
index 0000000..aee43c2
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/components/Editor.vue
@@ -0,0 +1,34 @@
+<template>
+    <div>
+        <div ref="editor" style="text-align:left"></div>
+        <button v-on:click="getContent">查看内容</button>
+    </div>
+</template>
+
+<script>
+    import E from 'wangeditor'
+
+    export default {
+      name: 'editor',
+      data () {
+        return {
+          editorContent: ''
+        }
+      },
+      methods: {
+        getContent: function () {
+            alert(this.editorContent)
+        }
+      },
+      mounted() {
+        var editor = new E(this.$refs.editor)
+        editor.customConfig.onchange = (html) => {
+          this.editorContent = html
+        }
+        editor.create()
+      }
+    }
+</script>
+
+<style scoped>
+</style>
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/components/Hello.vue b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/components/Hello.vue
new file mode 100644
index 0000000..2d80539
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/components/Hello.vue
@@ -0,0 +1,53 @@
+<template>
+  <div class="hello">
+    <h1>{{ msg }}</h1>
+    <h2>Essential Links</h2>
+    <ul>
+      <li><a href="https://vuejs.org" target="_blank">Core Docs</a></li>
+      <li><a href="https://forum.vuejs.org" target="_blank">Forum</a></li>
+      <li><a href="https://gitter.im/vuejs/vue" target="_blank">Gitter Chat</a></li>
+      <li><a href="https://twitter.com/vuejs" target="_blank">Twitter</a></li>
+      <br>
+      <li><a href="http://vuejs-templates.github.io/webpack/" target="_blank">Docs for This Template</a></li>
+    </ul>
+    <h2>Ecosystem</h2>
+    <ul>
+      <li><a href="http://router.vuejs.org/" target="_blank">vue-router</a></li>
+      <li><a href="http://vuex.vuejs.org/" target="_blank">vuex</a></li>
+      <li><a href="http://vue-loader.vuejs.org/" target="_blank">vue-loader</a></li>
+      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank">awesome-vue</a></li>
+    </ul>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'hello',
+  data () {
+    return {
+      msg: 'Welcome to Your Vue.js App'
+    }
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped>
+h1, h2 {
+  font-weight: normal;
+}
+
+ul {
+  list-style-type: none;
+  padding: 0;
+}
+
+li {
+  display: inline-block;
+  margin: 0 10px;
+}
+
+a {
+  color: #42b983;
+}
+</style>
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/main.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/main.js
new file mode 100644
index 0000000..7b7fec7
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/src/main.js
@@ -0,0 +1,13 @@
+// The Vue build version to load with the `import` command
+// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
+import Vue from 'vue'
+import App from './App'
+
+Vue.config.productionTip = false
+
+/* eslint-disable no-new */
+new Vue({
+  el: '#app',
+  template: '<App/>',
+  components: { App }
+})
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/static/.gitkeep b/novel-admin/src/main/resources/static/wangEditor/example/demo/in-vue/static/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-amd-main.js b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-amd-main.js
new file mode 100644
index 0000000..444b2da
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-amd-main.js
@@ -0,0 +1,4 @@
+require(['/wangEditor.min.js'], function (E) {
+    var editor2 = new E('#div3')
+    editor2.create()
+})
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-amd.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-amd.html
new file mode 100644
index 0000000..6a3d666
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-amd.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor 使用 AMD 加载</title>
+</head>
+<body>
+    <p>wangEditor 使用 AMD 加载</p>
+    <div id="div3">
+        <p>欢迎使用 wangEditor 富文本编辑器</p>
+    </div>
+
+    <script data-main="./test-amd-main.js" src="//cdn.bootcss.com/require.js/2.3.3/require.js"></script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-css-reset.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-css-reset.html
new file mode 100644
index 0000000..c01a10d
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-css-reset.html
@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor css reset</title>
+    <style type="text/css">
+        /* reset 代码参考 https://meyerweb.com/eric/tools/css/reset/ */
+        html, body, div, span, applet, object, iframe,
+        h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+        a, abbr, acronym, address, big, cite, code,
+        del, dfn, em, img, ins, kbd, q, s, samp,
+        small, strike, strong, sub, sup, tt, var,
+        b, u, i, center,
+        dl, dt, dd, ol, ul, li,
+        fieldset, form, label, legend,
+        table, caption, tbody, tfoot, thead, tr, th, td,
+        article, aside, canvas, details, embed, 
+        figure, figcaption, footer, header, hgroup, 
+        menu, nav, output, ruby, section, summary,
+        time, mark, audio, video {
+            margin: 0;
+            padding: 0;
+            border: 0;
+            font-size: 100%;
+            font: inherit;
+            vertical-align: baseline;
+        }
+        /* HTML5 display-role reset for older browsers */
+        article, aside, details, figcaption, figure, 
+        footer, header, hgroup, menu, nav, section {
+            display: block;
+        }
+        body {
+            line-height: 1;
+        }
+        ol, ul {
+            list-style: none;
+        }
+        blockquote, q {
+            quotes: none;
+        }
+        blockquote:before, blockquote:after,
+        q:before, q:after {
+            content: '';
+            content: none;
+        }
+        table {
+            border-collapse: collapse;
+            border-spacing: 0;
+        }
+    </style>
+</head>
+<body>
+    <p>wangEditor css reset</p>
+    <div id="div1">
+        <p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
+    </div>
+
+    <script type="text/javascript" src="/wangEditor.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor = new E('#div1')
+        editor.create()
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-emot.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-emot.html
new file mode 100644
index 0000000..02d8f7f
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-emot.html
@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor 配置表情</title>
+</head>
+<body>
+    <p>wangEditor 配置表情</p>
+    <div id="div1">
+        <p>欢迎使用 wangEditor 富文本编辑器</p>
+    </div>
+    
+    <script type="text/javascript" src="/wangEditor.min.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor = new E('#div1')
+        editor.customConfig.emotions = [
+            {
+                // tab 的标题
+                title: '默认',
+                // type -> 'emoji' / 'image'
+                type: 'image',
+                // content -> 数组
+                content: [
+                    {
+                        alt: '[坏笑]',
+                        src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/50/pcmoren_huaixiao_org.png'
+                    },
+                    {
+                        alt: '[舔屏]',
+                        src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/pcmoren_tian_org.png'
+                    },
+                    {
+                        alt: '[污]',
+                        src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/pcmoren_wu_org.png'
+                    },
+                    {
+                        alt: '[允悲]',
+                        src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/2c/moren_yunbei_org.png'
+                    }
+                ]
+            },
+            {
+                // tab 的标题
+                title: '新浪',
+                // type -> 'emoji' / 'image'
+                type: 'image',
+                // content -> 数组
+                content: [
+                    {
+                        src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/7a/shenshou_thumb.gif',
+                        alt: '[草泥马]'
+                    },
+                    {
+                        src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/60/horse2_thumb.gif',
+                        alt: '[神马]'
+                    },
+                    {
+                        src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/bc/fuyun_thumb.gif',
+                        alt: '[浮云]'
+                    }
+                ]
+            },
+            {
+                // tab 的标题
+                title: 'emoji',
+                // type -> 'emoji' / 'image'
+                type: 'emoji',
+                // content -> 数组
+                content: '😀 😃 😄 😁 😆 😅 😂 😊 😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 😜 😝 😛 🤑 🤗 🤓 😎 😏 😒 😞 😔 😟 😕 🙁  😣 😖 😫 😩 😤 😠 😡 😶 😐 😑 😯 😦 😧 😮 😲 😵 😳 😱 😨 😰 😢 😥 😭 😓 😪 😴 🙄 🤔 😬 🤐'.split(/\s/)
+            },
+            {
+                // tab 的标题
+                title: 'emoji手势',
+                // type -> 'emoji' / 'image'
+                type: 'emoji',
+                // content -> 数组
+                content: ['🙌', '👏', '👋', '👍', '👎', '👊', '✊', '️👌', '✋', '👐', '💪', '🙏', '️👆', '👇', '👈', '👉', '🖕', '🖐', '🤘']
+            }
+        ]
+        editor.create()
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-fullscreen.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-fullscreen.html
new file mode 100644
index 0000000..cbbaa01
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-fullscreen.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor 全屏</title>
+    <style type="text/css">
+        #container {
+            width: 800px;
+            margin: 0 auto;
+        }
+        #toolbar-container {
+            border: 1px solid #ccc;
+            background-color: #fff;
+        }
+        #toolbar-container:after {
+            display: table;
+            content: '';
+            clear: both;
+        }
+        #editor-toolbar {
+            float: left;
+        }
+        #btn-container {
+            float: right;
+            text-align: right;
+        }
+        #editor-text {
+            border: 1px solid #ccc;
+            border-top: 0;
+            height: 300px;
+            background-color: #fff;
+        }
+        #cover {
+            display: none;
+            position: fixed;
+            z-index: 100;
+            top: 50px;
+            left: 50px;
+            right: 50px;
+            height: 500px;
+            padding: 20px;
+            background-color: #f1f1f1;
+        }
+    </style>
+</head>
+<body>
+    <p>wangEditor 全屏</p>
+
+    <!--非全屏模式-->
+    <div id="container">
+        <!--菜单栏-->
+        <div id="toolbar-container">
+            <div id="editor-toolbar"></div>
+            <div id="btn-container">
+                <button id="btn1">全屏</button>
+            </div>
+        </div>
+        <!--编辑区域-->
+        <div id="editor-text">
+            <p>wangEditor 本身不包含“全屏”功能,不过可以很简单的开发出来</p>
+            <p>注意,全屏模式与<code>max-height</code>有冲突,尽量避免一起使用</p>
+        </div>
+    </div>
+
+    <!--全屏模式-->
+    <div id="cover"></div>
+
+
+    <script type="text/javascript" src="/wangEditor.min.js"></script>
+    <script type="text/javascript">
+        // 创建编辑器
+        var E = window.wangEditor
+        var editor2 = new E('#editor-toolbar', '#editor-text')
+        editor2.create()
+
+        // 获取使用到的元素
+        var toolbarContaner = document.getElementById('toolbar-container')
+        var editorText = document.getElementById('editor-text')
+        var cover = document.getElementById('cover')
+        var container = document.getElementById('container')
+
+        // 全屏事件
+        function doFullScreen() {
+            cover.style.display = 'block'
+            editorText.style.height = '460px';
+            cover.appendChild(toolbarContaner)
+            cover.appendChild(editorText)
+        }
+
+        // 退出全屏事件
+        function unDoFullScreen() {
+            container.appendChild(toolbarContaner)
+            container.appendChild(editorText)
+            editorText.style.height = '300px';
+            cover.style.display = 'none'
+        }
+
+        // 是否是全屏的标志
+        var isFullScreen = false
+
+        // 点击事件
+        var btn1 = document.getElementById('btn1')
+        btn1.addEventListener('click', function () {
+            if (isFullScreen) {
+                isFullScreen = false
+                unDoFullScreen()
+            } else {
+                isFullScreen = true
+                doFullScreen()
+            }
+        }, false)
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-get-content.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-get-content.html
new file mode 100644
index 0000000..012c81c
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-get-content.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor 获取内容</title>
+</head>
+<body>
+    <p>wangEditor 获取内容</p>
+    <div id="div3">
+        <p>欢迎使用 wangEditor 富文本编辑器</p>
+        <p>欢迎使用 wangEditor 富文本编辑器</p>
+    </div>
+    <div>
+        <button id="btn1">获取html</button>
+        <button id="btn2">获取text</button>
+    </div>
+    
+    <script type="text/javascript" src="/wangEditor.min.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor2 = new E('#div3')
+        editor2.create()
+
+        document.getElementById('btn1').addEventListener('click', function () {
+            console.log(editor2.txt.html())
+            alert(editor2.txt.html())
+        }, false)
+
+        document.getElementById('btn2').addEventListener('click', function () {
+            alert(editor2.txt.text())
+        }, false)
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-getJSON.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-getJSON.html
new file mode 100644
index 0000000..68cd155
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-getJSON.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor demo getJSON</title>
+</head>
+<body>
+    <p>获取 JSON</p>
+    <div id="div1">
+        <p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
+        <img src="https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo_top_ca79a146.png" style="max-width:100%;"/>
+    </div>
+    <button id="btn1">getJSON</button>
+
+    <script type="text/javascript" src="/wangEditor.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor = new E('#div1')
+        editor.create()
+
+        document.getElementById('btn1').addEventListener('click', function () {
+            var json = editor.txt.getJSON()
+            var jsonStr = JSON.stringify(json)
+            console.log(json)
+            console.log(jsonStr)
+            alert(jsonStr)
+        })
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-lang.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-lang.html
new file mode 100644
index 0000000..6c77826
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-lang.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor lang test</title>
+</head>
+<body>
+    <p>多语言测试</p>
+    <div id="div1">
+        <p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
+    </div>
+
+    <script type="text/javascript" src="/wangEditor.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor = new E('#div1')
+
+        editor.customConfig.lang = {
+            '设置标题': 'title',
+            '正文': 'p',
+            '链接文字': 'link text',
+            '链接': 'link',
+            '上传图片': 'upload image',
+            '上传': 'upload',
+            '创建': 'init'
+        }
+
+        editor.create()
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-menus.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-menus.html
new file mode 100644
index 0000000..4afd45f
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-menus.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor 菜单配置</title>
+</head>
+<body>
+    <p>wangEditor 自定义菜单配置</p>
+    <div id="div3">
+        <p>欢迎使用 wangEditor 富文本编辑器</p>
+    </div>
+
+    <script type="text/javascript" src="/wangEditor.min.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor2 = new E('#div3')
+        editor2.customConfig.menus = [
+            'head',
+            'bold',
+            'italic',
+            'underline'
+        ]
+        editor2.create()
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-mult.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-mult.html
new file mode 100644
index 0000000..bd6f7e1
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-mult.html
@@ -0,0 +1,44 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor 一个页面多个编辑器</title>
+    <style type="text/css">
+        .toolbar {
+            background-color: #f1f1f1;
+            border: 1px solid #ccc;
+        }
+        .text {
+            border: 1px solid #ccc;
+            height: 200px;
+        }
+    </style>
+</head>
+<body>
+
+    <p>第一个 demo(菜单和编辑器区域分开)</p>
+    <div id="div1" class="toolbar">
+    </div>
+    <div style="padding: 5px 0; color: #ccc">中间隔离带</div>
+    <div id="div2" class="text">
+        <p>请输入内容</p>
+    </div>
+
+    <p>第二个 demo(常规)</p>
+    <div id="div3">
+        <p>请输入内容</p>
+    </div>
+
+    <!-- 引用js -->
+    <script type="text/javascript" src="/wangEditor.min.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+
+        var editor1 = new E('#div1', '#div2')
+        editor1.create()
+
+        var editor2 = new E('#div3')
+        editor2.create()
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-onblur.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-onblur.html
new file mode 100644
index 0000000..a6644bf
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-onblur.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor test onblur</title>
+</head>
+<body>
+    <div id="div1">
+        <p>欢迎使用 wangEditor 富文本编辑器</p>
+    </div>
+
+    <script type="text/javascript" src="/wangEditor.min.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor = new E('#div1')
+        editor.customConfig.onblur = function (html) {
+            // html 即编辑器中的内容
+            console.log('onblur', html)
+        }
+        editor.create()
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-onchange.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-onchange.html
new file mode 100644
index 0000000..231de10
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-onchange.html
@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor test onchange</title>
+</head>
+<body>
+    <div id="div1">
+        <p>欢迎使用 wangEditor 富文本编辑器</p>
+    </div>
+
+    <script type="text/javascript" src="/wangEditor.min.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor = new E('#div1')
+        editor.customConfig.onchange = function (html) {
+            // html 即编辑器中的内容
+            console.log('onchange', html)
+        }
+        editor.customConfig.onchangeTimeout = 200  // 自定义 onchange 触发的延迟时间
+        editor.create()
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-onfocus.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-onfocus.html
new file mode 100644
index 0000000..7d95de0
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-onfocus.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor test onfocus</title>
+</head>
+<body>
+    <div id="div1">
+        <p>欢迎使用 wangEditor 富文本编辑器</p>
+    </div>
+
+    <script type="text/javascript" src="/wangEditor.min.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor = new E('#div1')
+        editor.customConfig.onfocus = function () {
+            console.log("onfocus")
+        }
+        editor.create()
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-paste.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-paste.html
new file mode 100644
index 0000000..a3a7477
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-paste.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor paste test</title>
+</head>
+<body>
+    <p>wangEditor paste test</p>
+    <div id="div1">
+        <p>欢迎使用 wangEditor 富文本编辑器</p>
+    </div>
+
+    <script type="text/javascript" src="/wangEditor.min.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor = new E('#div1')
+        // editor.customConfig.pasteFilterStyle = false
+        editor.customConfig.pasteTextHandle = function (content) {
+            console.log(content)
+            return content
+        }
+        editor.create()
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-set-content.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-set-content.html
new file mode 100644
index 0000000..42eff3b
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-set-content.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor 设置内容</title>
+</head>
+<body>
+    <p>wangEditor 设置内容</p>
+    <div id="div3">
+        <p>欢迎使用 wangEditor 富文本编辑器</p>
+    </div>
+    <div>
+        <button id="btn1">追加内容</button>
+        <button id="btn2">清空内容</button>
+    </div>
+    
+    <script type="text/javascript" src="/wangEditor.min.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor2 = new E('#div3')
+        editor2.create()
+
+        // 设置内容
+        editor2.txt.html('<p>通过 js 动态设置的内容</p>')
+
+        // 追加内容
+        document.getElementById('btn1').addEventListener('click', function () {
+            editor2.txt.append('<p>追加的内容</p>')
+        }, false)
+        document.getElementById('btn2').addEventListener('click', function () {
+            editor2.txt.clear()
+        }, false)
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-sperate.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-sperate.html
new file mode 100644
index 0000000..0d0b857
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-sperate.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor 菜单和编辑器区域分离</title>
+    <style type="text/css">
+        .toolbar {
+            border: 1px solid #ccc;
+        }
+        .text {
+            border: 1px solid #ccc;
+            min-height: 300px;
+        }
+    </style>
+</head>
+<body>
+    
+    <p>wangEditor 菜单和编辑器区域分离</p>
+    <div id="div1" class="toolbar">
+    </div>
+    <div style="padding: 10px 0; color: #ccc">中间隔离带</div>
+    <div id="div2" class="text">
+        <p>请输入内容</p>
+    </div>
+
+    <script type="text/javascript" src="/wangEditor.min.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+
+        var editor1 = new E('#div1', '#div2')
+        editor1.create()
+
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-textarea.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-textarea.html
new file mode 100644
index 0000000..8e41119
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-textarea.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor demo textarea</title>
+</head>
+<body>
+    <p>编辑器</p>
+    <div id="div1">
+        <p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
+    </div>
+
+    <hr>
+
+    <p>textarea</p>
+    <textarea id="text1" style="width:100%; height:200px;"></textarea>
+
+    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
+    <script type="text/javascript" src="../wangEditor.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor = new E('#div1')
+        var $text1 = $('#text1')
+        editor.customConfig.onchange = function (html) {
+            // 监控变化,同步更新到 textarea
+            $text1.val(html)
+        }
+        editor.create()
+        // 初始化 textarea 的值
+        $text1.val(editor.txt.html())
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/demo/test-uploadimg.html b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-uploadimg.html
new file mode 100644
index 0000000..97246ca
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/demo/test-uploadimg.html
@@ -0,0 +1,58 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor 上传图片</title>
+</head>
+<body>
+    <p>wangEditor 上传图片到服务器</p>
+    <div id="div3">
+        <p>欢迎使用 wangEditor 富文本编辑器</p>
+    </div>
+
+    <p>wangEditor 以base64保存图片文件</p>
+    <div id="div4">
+        <p>欢迎使用 wangEditor 富文本编辑器</p>
+    </div>
+
+    <p>wangEditor 自定义上传图片</p>
+    <div id="div5">
+        <p>欢迎使用 wangEditor 富文本编辑器</p>
+    </div>
+
+    <script type="text/javascript" src="/wangEditor.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+
+        var editor2 = new E('#div3')
+        editor2.customConfig.uploadImgServer = '/upload-img'
+        editor2.customConfig.uploadImgHooks = {
+            // customInsert: function (insertImg, result, editor) {
+            //     console.log(JSON.stringify(result))
+            //     insertImg(result.data[0])
+            // },
+
+            // customInsert: function (insertImg, result, editor) {
+            //     console.log(result)
+            // }
+        }
+        // editor2.customConfig.uploadImgParams = {
+        //     a: 123,
+        //     b: 'vvv'
+        // }
+        // editor2.customConfig.uploadImgParamsWithUrl = true
+        editor2.create()
+
+        var editor1 = new E('#div4')
+        editor1.customConfig.uploadImgShowBase64 = true
+        editor1.create()
+
+        var editor = new E('#div5')
+        editor.customConfig.customUploadImg = function (files, insert) {
+            console.log(files)
+            insert('https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png')
+        }
+        editor.create()
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/favicon.ico b/novel-admin/src/main/resources/static/wangEditor/example/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..6075775de436a980a4302ef7aef74de01c41b0c0
GIT binary patch
literal 4286
zcmc&&O>B%&6n$7UQqdt=@z*v&Q?bzKLSoUO#6~PE5H>bMLPQ%IVu3WFL~PjjU9e$c
zfk;F|M@mb`Y=jVGM%$!C!VrRx);ZI6larS>W7DtNoZk2D-+AwS_uX%%&P~8?eZAvf
zcO~UqjdQLMfXb}^s4xD&HobBbqYCHF@12$fJ_32*-8g|<<Ro_i82L{iH`hY`VPFX8
z0|pa94tYNTwqHAQ&ijD|U<NQNA*7IZ9bo)?-nM`4y8>_tqZ#>?|C^uxf~-xLn|oXB
z`M3t|{{_H0cm>P`lHUI+aOnQ4F`p02^xQ3w4}p8YBj6%13HaB#=D_DJ&;u}*Ia+}*
zF60mGR}o|DGr261Cyd(_iMteuE62~e{}Rb_B9bTM?~25|hmJL`zUBD0OAgk=4?ky}
zOa?TMju*rB$NS!deCx+NzYT!;mgB$e<9<Re1UCCQ^K1b$kB$#}Kb`^g%5gb}QyceX
zd00Po7kfp|UP%6HqO%y2Prc86@54Sa;C20wm0lmNP5JfgJH-E_&+{EJc0ZSTJJ+an
zdPekXFt)Xp+W)N*{%O%~lRTF1fVbx$wSR7uIIZ6pe<OT<d;hRzCqn<++cJ>GOG(=^
zZ@UoK_#XM}ZEqlLZ883R-j8Q^9Z(LAkBNPW*x9QXLu?hj#q%zhoqd=37(e@*`R(z3
zmV>fM?8n7^+Uwaf*gG_a<DK5l+^4)f?Ej0Px3eF{nDrFq;ru?pJTJxm+UstJPGc89
z&%4YxzGrA#?&s98{`Kr1W3KT!-XU?k6Lv3{XLp%6t?L^2)dP$%{$82u*(x{3^8o9I
z7Ej4D<MRpqZQc%>`ESCwPUhS{KL?s!@2SPByd%CAlY@@;K>c*g-fX^4FkT7RKFCkd
z{sG|mXlyuM3;P403*ft!bsMW!jpN$R0(`dTfc3yvfSk%dfO$2bu}O@1#&#acKLmZO
zzmD}9T1)T`LLa-sW6dA-AAA1ewg0gH7=J(ZZ#{af_pJGvOPoLX8vwpH_#Bb|KZ}+6
z{=q)NXV3?*7Lq^?dBg8t{G4a^VZ0@|vjBTw9<ckEv?Lcfv-W=glT{-l1w$&GDHMQw
wI@6Y~I|OvLb=P$^byrO(qGRgZ)X^igMO5^(q^dG$S418%f6!STmBwT8FYDWbh5!Hn

literal 0
HcmV?d00001

diff --git a/novel-admin/src/main/resources/static/wangEditor/example/icomoon/Read Me.txt b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/Read Me.txt
new file mode 100644
index 0000000..8491652
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/Read Me.txt	
@@ -0,0 +1,7 @@
+Open *demo.html* to see a list of all the glyphs in your font along with their codes/ligatures.
+
+To use the generated font in desktop programs, you can install the TTF font. In order to copy the character associated with each icon, refer to the text box at the bottom right corner of each glyph in demo.html. The character inside this text box may be invisible; but it can still be copied. See this guide for more info: https://icomoon.io/#docs/local-fonts
+
+You won't need any of the files located under the *demo-files* directory when including the generated font in your own projects.
+
+You can import *selection.json* back to the IcoMoon app using the *Import Icons* button (or via Main Menu → Manage Projects) to retrieve your icon selection.
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/icomoon/demo-files/demo.css b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/demo-files/demo.css
new file mode 100644
index 0000000..f9ab27c
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/demo-files/demo.css
@@ -0,0 +1,155 @@
+body {
+  padding: 0;
+  margin: 0;
+  font-family: sans-serif;
+  font-size: 1em;
+  line-height: 1.5;
+  color: #555;
+  background: #fff;
+}
+h1 {
+  font-size: 1.5em;
+  font-weight: normal;
+}
+small {
+  font-size: .66666667em;
+}
+a {
+  color: #e74c3c;
+  text-decoration: none;
+}
+a:hover, a:focus {
+  box-shadow: 0 1px #e74c3c;
+}
+.bshadow0, input {
+  box-shadow: inset 0 -2px #e7e7e7;
+}
+input:hover {
+  box-shadow: inset 0 -2px #ccc;
+}
+input, fieldset {
+  font-family: sans-serif;
+  font-size: 1em;
+  margin: 0;
+  padding: 0;
+  border: 0;
+}
+input {
+  color: inherit;
+  line-height: 1.5;
+  height: 1.5em;
+  padding: .25em 0;
+}
+input:focus {
+  outline: none;
+  box-shadow: inset 0 -2px #449fdb;
+}
+.glyph {
+  font-size: 16px;
+  width: 15em;
+  padding-bottom: 1em;
+  margin-right: 4em;
+  margin-bottom: 1em;
+  float: left;
+  overflow: hidden;
+}
+.liga {
+  width: 80%;
+  width: calc(100% - 2.5em);
+}
+.talign-right {
+  text-align: right;
+}
+.talign-center {
+  text-align: center;
+}
+.bgc1 {
+  background: #f1f1f1;
+}
+.fgc1 {
+  color: #999;
+}
+.fgc0 {
+  color: #000;
+}
+p {
+  margin-top: 1em;
+  margin-bottom: 1em;
+}
+.mvm {
+  margin-top: .75em;
+  margin-bottom: .75em;
+}
+.mtn {
+  margin-top: 0;
+}
+.mtl, .mal {
+  margin-top: 1.5em;
+}
+.mbl, .mal {
+  margin-bottom: 1.5em;
+}
+.mal, .mhl {
+  margin-left: 1.5em;
+  margin-right: 1.5em;
+}
+.mhmm {
+  margin-left: 1em;
+  margin-right: 1em;
+}
+.mls {
+  margin-left: .25em;
+}
+.ptl {
+  padding-top: 1.5em;
+}
+.pbs, .pvs {
+  padding-bottom: .25em;
+}
+.pvs, .pts {
+  padding-top: .25em;
+}
+.unit {
+  float: left;
+}
+.unitRight {
+  float: right;
+}
+.size1of2 {
+  width: 50%;
+}
+.size1of1 {
+  width: 100%;
+}
+.clearfix:before, .clearfix:after {
+  content: " ";
+  display: table;
+}
+.clearfix:after {
+  clear: both;
+}
+.hidden-true {
+  display: none;
+}
+.textbox0 {
+  width: 3em;
+  background: #f1f1f1;
+  padding: .25em .5em;
+  line-height: 1.5;
+  height: 1.5em;
+}
+#testDrive {
+  display: block;
+  padding-top: 24px;
+  line-height: 1.5;
+}
+.fs0 {
+  font-size: 16px;
+}
+.fs1 {
+  font-size: 16px;
+}
+.fs2 {
+  font-size: 16px;
+}
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/icomoon/demo-files/demo.js b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/demo-files/demo.js
new file mode 100644
index 0000000..6f45f1c
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/demo-files/demo.js
@@ -0,0 +1,30 @@
+if (!('boxShadow' in document.body.style)) {
+    document.body.setAttribute('class', 'noBoxShadow');
+}
+
+document.body.addEventListener("click", function(e) {
+    var target = e.target;
+    if (target.tagName === "INPUT" &&
+        target.getAttribute('class').indexOf('liga') === -1) {
+        target.select();
+    }
+});
+
+(function() {
+    var fontSize = document.getElementById('fontSize'),
+        testDrive = document.getElementById('testDrive'),
+        testText = document.getElementById('testText');
+    function updateTest() {
+        testDrive.innerHTML = testText.value || String.fromCharCode(160);
+        if (window.icomoonLiga) {
+            window.icomoonLiga(testDrive);
+        }
+    }
+    function updateSize() {
+        testDrive.style.fontSize = fontSize.value + 'px';
+    }
+    fontSize.addEventListener('change', updateSize, false);
+    testText.addEventListener('input', updateTest, false);
+    testText.addEventListener('change', updateTest, false);
+    updateSize();
+}());
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/icomoon/demo.html b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/demo.html
new file mode 100644
index 0000000..a36d3ba
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/demo.html
@@ -0,0 +1,505 @@
+<!doctype html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <title>IcoMoon Demo</title>
+    <meta name="description" content="An Icon Font Generated By IcoMoon.io">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="stylesheet" href="demo-files/demo.css">
+    <link rel="stylesheet" href="style.css"></head>
+<body>
+    <div class="bgc1 clearfix">
+        <h1 class="mhmm mvm"><span class="fgc1">Font Name:</span> icomoon <small class="fgc1">(Glyphs:&nbsp;27)</small></h1>
+    </div>
+    <div class="clearfix mhl ptl">
+        <h1 class="mvm mtn fgc1">Grid Size: 14</h1>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-close">
+                
+                </span>
+                <span class="mls"> icon-close</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="f00d" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xf00d;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-remove">
+                
+                </span>
+                <span class="mls"> icon-remove</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="f00d" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xf00d;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-times">
+                
+                </span>
+                <span class="mls"> icon-times</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="f00d" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xf00d;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-trash-o">
+                
+                </span>
+                <span class="mls"> icon-trash-o</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="f014" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xf014;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-terminal">
+                
+                </span>
+                <span class="mls"> icon-terminal</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="f120" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xf120;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-header">
+                
+                </span>
+                <span class="mls"> icon-header</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="f1dc" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xf1dc;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs1">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-paint-brush">
+                
+                </span>
+                <span class="mls"> icon-paint-brush</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="f1fc" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xf1fc;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="" class="liga unitRight" />
+            </div>
+        </div>
+    </div>
+    <div class="clearfix mhl ptl">
+        <h1 class="mvm mtn fgc1">Grid Size: 16</h1>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-pencil2">
+                
+                </span>
+                <span class="mls"> icon-pencil2</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="e906" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xe906;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="pencil2, write2" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-image">
+                
+                </span>
+                <span class="mls"> icon-image</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="e90d" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xe90d;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="image, picture" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-play">
+                
+                </span>
+                <span class="mls"> icon-play</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="e912" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xe912;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="play, video" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-location">
+                
+                </span>
+                <span class="mls"> icon-location</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="e947" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xe947;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="location, map-marker" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-undo">
+                
+                </span>
+                <span class="mls"> icon-undo</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="e965" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xe965;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="undo, ccw" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-redo">
+                
+                </span>
+                <span class="mls"> icon-redo</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="e966" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xe966;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="redo, cw" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-quotes-left">
+                
+                </span>
+                <span class="mls"> icon-quotes-left</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="e977" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xe977;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="quotes-left, ldquo" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-list-numbered">
+                
+                </span>
+                <span class="mls"> icon-list-numbered</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="e9b9" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xe9b9;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="list-numbered, options" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-list2">
+                
+                </span>
+                <span class="mls"> icon-list2</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="e9bb" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xe9bb;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="list2, todo2" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-upload2">
+                
+                </span>
+                <span class="mls"> icon-upload2</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="e9c6" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xe9c6;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="upload2, load2" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-link">
+                
+                </span>
+                <span class="mls"> icon-link</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="e9cb" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xe9cb;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="link, chain" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-happy">
+                
+                </span>
+                <span class="mls"> icon-happy</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="e9df" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xe9df;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="happy, emoticon" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-cancel-circle">
+                
+                </span>
+                <span class="mls"> icon-cancel-circle</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="ea0d" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xea0d;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="cancel-circle, close" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-bold">
+                
+                </span>
+                <span class="mls"> icon-bold</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="ea62" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xea62;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="bold, wysiwyg4" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-underline">
+                
+                </span>
+                <span class="mls"> icon-underline</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="ea63" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xea63;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="underline, wysiwyg5" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-italic">
+                
+                </span>
+                <span class="mls"> icon-italic</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="ea64" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xea64;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="italic, wysiwyg6" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-strikethrough">
+                
+                </span>
+                <span class="mls"> icon-strikethrough</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="ea65" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xea65;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="strikethrough, wysiwyg7" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-page-break">
+                
+                </span>
+                <span class="mls"> icon-page-break</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="ea68" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xea68;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="page-break, wysiwyg10" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-table2">
+                
+                </span>
+                <span class="mls"> icon-table2</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="ea71" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xea71;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="table2, wysiwyg19" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-paragraph-left">
+                
+                </span>
+                <span class="mls"> icon-paragraph-left</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="ea77" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xea77;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="paragraph-left, wysiwyg25" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-paragraph-center">
+                
+                </span>
+                <span class="mls"> icon-paragraph-center</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="ea78" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xea78;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="paragraph-center, wysiwyg26" class="liga unitRight" />
+            </div>
+        </div>
+        <div class="glyph fs2">
+            <div class="clearfix bshadow0 pbs">
+                <span class="icon-paragraph-right">
+                
+                </span>
+                <span class="mls"> icon-paragraph-right</span>
+            </div>
+            <fieldset class="fs0 size1of1 clearfix hidden-false">
+                <input type="text" readonly value="ea79" class="unit size1of2" />
+                <input type="text" maxlength="1" readonly value="&#xea79;" class="unitRight size1of2 talign-right" />
+            </fieldset>
+            <div class="fs0 bshadow0 clearfix hidden-true">
+                <span class="unit pvs fgc1">liga: </span>
+                <input type="text" readonly value="paragraph-right, wysiwyg27" class="liga unitRight" />
+            </div>
+        </div>
+    </div>
+
+    <!--[if gt IE 8]><!-->
+    <div class="mhl clearfix mbl">
+        <h1>Font Test Drive</h1>
+        <label>
+            Font Size: <input id="fontSize" type="number" class="textbox0 mbm"
+            min="8" value="48" />
+            px
+        </label>
+        <input id="testText" type="text" class="phl size1of1 mvl"
+        placeholder="Type some text to test..." value=""/>
+        <div id="testDrive" class="icon-">&nbsp;
+        </div>
+    </div>
+    <!--<![endif]-->
+    <div class="bgc1 clearfix">
+        <p class="mhl">Generated by <a href="https://icomoon.io/app">IcoMoon</a></p>
+    </div>
+
+    <script src="demo-files/demo.js"></script>
+</body>
+</html>
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/icomoon/fonts/icomoon.eot b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/fonts/icomoon.eot
new file mode 100644
index 0000000000000000000000000000000000000000..0d144fdfa4924f18e0bb237e911d7b4847e3f4fe
GIT binary patch
literal 5656
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

literal 0
HcmV?d00001

diff --git a/novel-admin/src/main/resources/static/wangEditor/example/icomoon/fonts/icomoon.svg b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/fonts/icomoon.svg
new file mode 100644
index 0000000..21be016
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/fonts/icomoon.svg
@@ -0,0 +1,37 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="icomoon" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
+<glyph unicode="&#xe906;" glyph-name="pencil2" d="M384 320l128 64 448 448-64 64-448-448-64-128zM289.3 92.902c-31.632 66.728-65.666 100.762-132.396 132.394l99.096 272.792 128 77.912 384 384h-192l-384-384-192-640 640 192 384 384v192l-384-384-77.912-128z" />
+<glyph unicode="&#xe90d;" glyph-name="image" d="M959.884 832c0.040-0.034 0.082-0.076 0.116-0.116v-767.77c-0.034-0.040-0.076-0.082-0.116-0.116h-895.77c-0.040 0.034-0.082 0.076-0.114 0.116v767.772c0.034 0.040 0.076 0.082 0.114 0.114h895.77zM960 896h-896c-35.2 0-64-28.8-64-64v-768c0-35.2 28.8-64 64-64h896c35.2 0 64 28.8 64 64v768c0 35.2-28.8 64-64 64v0zM832 672c0-53.020-42.98-96-96-96s-96 42.98-96 96 42.98 96 96 96 96-42.98 96-96zM896 128h-768v128l224 384 256-320h64l224 192z" />
+<glyph unicode="&#xe912;" glyph-name="play" d="M981.188 799.892c-143.632 20.65-302.332 32.108-469.186 32.108-166.86 0-325.556-11.458-469.194-32.108-27.53-107.726-42.808-226.75-42.808-351.892 0-125.14 15.278-244.166 42.808-351.89 143.638-20.652 302.336-32.11 469.194-32.11 166.854 0 325.552 11.458 469.186 32.11 27.532 107.724 42.812 226.75 42.812 351.89 0 125.142-15.28 244.166-42.812 351.892zM384.002 256v384l320-192-320-192z" />
+<glyph unicode="&#xe947;" glyph-name="location" d="M512 960c-176.732 0-320-143.268-320-320 0-320 320-704 320-704s320 384 320 704c0 176.732-143.27 320-320 320zM512 448c-106.040 0-192 85.96-192 192s85.96 192 192 192 192-85.96 192-192-85.96-192-192-192z" />
+<glyph unicode="&#xe965;" glyph-name="undo" d="M512 896c-141.384 0-269.376-57.32-362.032-149.978l-149.968 149.978v-384h384l-143.532 143.522c69.496 69.492 165.492 112.478 271.532 112.478 212.068 0 384-171.924 384-384 0-114.696-50.292-217.636-130.018-288l84.666-96c106.302 93.816 173.352 231.076 173.352 384 0 282.77-229.23 512-512 512z" />
+<glyph unicode="&#xe966;" glyph-name="redo" d="M0 384c0-152.924 67.048-290.184 173.35-384l84.666 96c-79.726 70.364-130.016 173.304-130.016 288 0 212.076 171.93 384 384 384 106.042 0 202.038-42.986 271.53-112.478l-143.53-143.522h384v384l-149.97-149.978c-92.654 92.658-220.644 149.978-362.030 149.978-282.77 0-512-229.23-512-512z" />
+<glyph unicode="&#xe977;" glyph-name="quotes-left" d="M225 512c123.712 0 224-100.29 224-224 0-123.712-100.288-224-224-224s-224 100.288-224 224l-1 32c0 247.424 200.576 448 448 448v-128c-85.474 0-165.834-33.286-226.274-93.726-11.634-11.636-22.252-24.016-31.83-37.020 11.438 1.8 23.16 2.746 35.104 2.746zM801 512c123.71 0 224-100.29 224-224 0-123.712-100.29-224-224-224s-224 100.288-224 224l-1 32c0 247.424 200.576 448 448 448v-128c-85.474 0-165.834-33.286-226.274-93.726-11.636-11.636-22.254-24.016-31.832-37.020 11.44 1.8 23.16 2.746 35.106 2.746z" />
+<glyph unicode="&#xe9b9;" glyph-name="list-numbered" d="M384 128h640v-128h-640zM384 512h640v-128h-640zM384 896h640v-128h-640zM192 960v-256h-64v192h-64v64zM128 434v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM256 256v-320h-192v64h128v64h-128v64h128v64h-128v64z" />
+<glyph unicode="&#xe9bb;" glyph-name="list2" d="M384 896h640v-128h-640v128zM384 512h640v-128h-640v128zM384 128h640v-128h-640v128zM0 832c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128s-128 57.308-128 128zM0 448c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128s-128 57.308-128 128zM0 64c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128s-128 57.308-128 128z" />
+<glyph unicode="&#xe9c6;" glyph-name="upload2" d="M0 64h1024v-64h-1024zM1024 192v-64h-1024v64l128 256h256v-128h256v128h256zM224 640l288 288 288-288h-224v-256h-128v256z" />
+<glyph unicode="&#xe9cb;" glyph-name="link" d="M440.236 324.234c-13.31 0-26.616 5.076-36.77 15.23-95.134 95.136-95.134 249.934 0 345.070l192 192c46.088 46.086 107.36 71.466 172.534 71.466s126.448-25.38 172.536-71.464c95.132-95.136 95.132-249.934 0-345.070l-87.766-87.766c-20.308-20.308-53.23-20.308-73.54 0-20.306 20.306-20.306 53.232 0 73.54l87.766 87.766c54.584 54.586 54.584 143.404 0 197.99-26.442 26.442-61.6 41.004-98.996 41.004s-72.552-14.562-98.996-41.006l-192-191.998c-54.586-54.586-54.586-143.406 0-197.992 20.308-20.306 20.306-53.232 0-73.54-10.15-10.152-23.462-15.23-36.768-15.23zM256-52c-65.176 0-126.45 25.38-172.534 71.464-95.134 95.136-95.134 249.934 0 345.070l87.764 87.764c20.308 20.306 53.234 20.306 73.54 0 20.308-20.306 20.308-53.232 0-73.54l-87.764-87.764c-54.586-54.586-54.586-143.406 0-197.992 26.44-26.44 61.598-41.002 98.994-41.002s72.552 14.562 98.998 41.006l192 191.998c54.584 54.586 54.584 143.406 0 197.992-20.308 20.308-20.306 53.232 0 73.54 20.306 20.306 53.232 20.306 73.54-0.002 95.132-95.134 95.132-249.932 0.002-345.068l-192.002-192c-46.090-46.088-107.364-71.466-172.538-71.466z" />
+<glyph unicode="&#xe9df;" glyph-name="happy" d="M512-64c282.77 0 512 229.23 512 512s-229.23 512-512 512-512-229.23-512-512 229.23-512 512-512zM512 864c229.75 0 416-186.25 416-416s-186.25-416-416-416-416 186.25-416 416 186.25 416 416 416zM512 361.24c115.95 0 226.23 30.806 320 84.92-14.574-178.438-153.128-318.16-320-318.16-166.868 0-305.422 139.872-320 318.304 93.77-54.112 204.050-85.064 320-85.064zM256 608c0 53.019 28.654 96 64 96s64-42.981 64-96c0-53.019-28.654-96-64-96s-64 42.981-64 96zM640 608c0 53.019 28.654 96 64 96s64-42.981 64-96c0-53.019-28.654-96-64-96s-64 42.981-64 96z" />
+<glyph unicode="&#xea0d;" glyph-name="cancel-circle" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512 32c-229.75 0-416 186.25-416 416s186.25 416 416 416 416-186.25 416-416-186.25-416-416-416zM672 704l-160-160-160 160-96-96 160-160-160-160 96-96 160 160 160-160 96 96-160 160 160 160z" />
+<glyph unicode="&#xea62;" glyph-name="bold" d="M707.88 475.348c37.498 44.542 60.12 102.008 60.12 164.652 0 141.16-114.842 256-256 256h-320v-896h384c141.158 0 256 114.842 256 256 0 92.956-49.798 174.496-124.12 219.348zM384 768h101.5c55.968 0 101.5-57.42 101.5-128s-45.532-128-101.5-128h-101.5v256zM543 128h-159v256h159c58.45 0 106-57.42 106-128s-47.55-128-106-128z" />
+<glyph unicode="&#xea63;" glyph-name="underline" d="M704 896h128v-416c0-159.058-143.268-288-320-288-176.73 0-320 128.942-320 288v416h128v-416c0-40.166 18.238-78.704 51.354-108.506 36.896-33.204 86.846-51.494 140.646-51.494s103.75 18.29 140.646 51.494c33.116 29.802 51.354 68.34 51.354 108.506v416zM192 128h640v-128h-640z" />
+<glyph unicode="&#xea64;" glyph-name="italic" d="M896 896v-64h-128l-320-768h128v-64h-448v64h128l320 768h-128v64z" />
+<glyph unicode="&#xea65;" glyph-name="strikethrough" d="M1024 448v-64h-234.506c27.504-38.51 42.506-82.692 42.506-128 0-70.878-36.66-139.026-100.58-186.964-59.358-44.518-137.284-69.036-219.42-69.036-82.138 0-160.062 24.518-219.42 69.036-63.92 47.938-100.58 116.086-100.58 186.964h128c0-69.382 87.926-128 192-128s192 58.618 192 128c0 69.382-87.926 128-192 128h-512v64h299.518c-2.338 1.654-4.656 3.324-6.938 5.036-63.92 47.94-100.58 116.086-100.58 186.964s36.66 139.024 100.58 186.964c59.358 44.518 137.282 69.036 219.42 69.036 82.136 0 160.062-24.518 219.42-69.036 63.92-47.94 100.58-116.086 100.58-186.964h-128c0 69.382-87.926 128-192 128s-192-58.618-192-128c0-69.382 87.926-128 192-128 78.978 0 154.054-22.678 212.482-64h299.518z" />
+<glyph unicode="&#xea68;" glyph-name="page-break" d="M0 448h128v-64h-128zM192 448h192v-64h-192zM448 448h128v-64h-128zM640 448h192v-64h-192zM896 448h128v-64h-128zM880 960l16-448h-768l16 448h32l16-384h640l16 384zM144-64l-16 384h768l-16-384h-32l-16 320h-640l-16-320z" />
+<glyph unicode="&#xea71;" glyph-name="table2" d="M0 896v-896h1024v896h-1024zM384 320v192h256v-192h-256zM640 256v-192h-256v192h256zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM64 512h256v-192h-256v192zM704 512h256v-192h-256v192zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192zM704 64v192h256v-192h-256z" />
+<glyph unicode="&#xea77;" glyph-name="paragraph-left" d="M0 896h1024v-128h-1024zM0 704h640v-128h-640zM0 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
+<glyph unicode="&#xea78;" glyph-name="paragraph-center" d="M0 896h1024v-128h-1024zM192 704h640v-128h-640zM192 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
+<glyph unicode="&#xea79;" glyph-name="paragraph-right" d="M0 896h1024v-128h-1024zM384 704h640v-128h-640zM384 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
+<glyph unicode="&#xf00d;" glyph-name="close, remove, times" horiz-adv-x="805" d="M741.714 195.428q0-22.857-16-38.857l-77.714-77.714q-16-16-38.857-16t-38.857 16l-168 168-168-168q-16-16-38.857-16t-38.857 16l-77.714 77.714q-16 16-16 38.857t16 38.857l168 168-168 168q-16 16-16 38.857t16 38.857l77.714 77.714q16 16 38.857 16t38.857-16l168-168 168 168q16 16 38.857 16t38.857-16l77.714-77.714q16-16 16-38.857t-16-38.857l-168-168 168-168q16-16 16-38.857z" />
+<glyph unicode="&#xf014;" glyph-name="trash-o" horiz-adv-x="805" d="M292.571 530.286v-329.143q0-8-5.143-13.143t-13.143-5.143h-36.571q-8 0-13.143 5.143t-5.143 13.143v329.143q0 8 5.143 13.143t13.143 5.143h36.571q8 0 13.143-5.143t5.143-13.143zM438.857 530.286v-329.143q0-8-5.143-13.143t-13.143-5.143h-36.571q-8 0-13.143 5.143t-5.143 13.143v329.143q0 8 5.143 13.143t13.143 5.143h36.571q8 0 13.143-5.143t5.143-13.143zM585.143 530.286v-329.143q0-8-5.143-13.143t-13.143-5.143h-36.571q-8 0-13.143 5.143t-5.143 13.143v329.143q0 8 5.143 13.143t13.143 5.143h36.571q8 0 13.143-5.143t5.143-13.143zM658.286 116.571v541.714h-512v-541.714q0-12.571 4-23.143t8.286-15.429 6-4.857h475.429q1.714 0 6 4.857t8.286 15.429 4 23.143zM274.286 731.428h256l-27.429 66.857q-4 5.143-9.714 6.286h-181.143q-5.714-1.143-9.714-6.286zM804.571 713.143v-36.571q0-8-5.143-13.143t-13.143-5.143h-54.857v-541.714q0-47.429-26.857-82t-64.571-34.571h-475.429q-37.714 0-64.571 33.429t-26.857 80.857v544h-54.857q-8 0-13.143 5.143t-5.143 13.143v36.571q0 8 5.143 13.143t13.143 5.143h176.571l40 95.429q8.571 21.143 30.857 36t45.143 14.857h182.857q22.857 0 45.143-14.857t30.857-36l40-95.429h176.571q8 0 13.143-5.143t5.143-13.143z" />
+<glyph unicode="&#xf120;" glyph-name="terminal" horiz-adv-x="958" d="M334.286 389.143l-266.286-266.286q-5.714-5.714-13.143-5.714t-13.143 5.714l-28.571 28.571q-5.714 5.714-5.714 13.143t5.714 13.143l224.571 224.571-224.571 224.571q-5.714 5.714-5.714 13.143t5.714 13.143l28.571 28.571q5.714 5.714 13.143 5.714t13.143-5.714l266.286-266.286q5.714-5.714 5.714-13.143t-5.714-13.143zM950.857 128v-36.571q0-8-5.143-13.143t-13.143-5.143h-548.571q-8 0-13.143 5.143t-5.143 13.143v36.571q0 8 5.143 13.143t13.143 5.143h548.571q8 0 13.143-5.143t5.143-13.143z" />
+<glyph unicode="&#xf1dc;" glyph-name="header" d="M961.143 0q-25.143 0-75.714 2t-76.286 2q-25.143 0-75.429-2t-75.429-2q-13.714 0-21.143 11.714t-7.429 26q0 17.714 9.714 26.286t22.286 9.714 29.143 4 25.714 8.571q18.857 12 18.857 80l-0.571 223.429q0 12-0.571 17.714-7.429 2.286-28.571 2.286h-385.714q-21.714 0-29.143-2.286-0.571-5.714-0.571-17.714l-0.571-212q0-81.143 21.143-93.714 9.143-5.714 27.429-7.429t32.571-2 25.714-8.571 11.429-26q0-14.857-7.143-27.429t-20.857-12.571q-26.857 0-79.714 2t-79.143 2q-24.571 0-73.143-2t-72.571-2q-13.143 0-20.286 12t-7.143 25.714q0 17.143 8.857 25.714t20.571 10 27.143 4.286 24 8.571q18.857 13.143 18.857 81.714l-0.571 32.571v464.571q0 1.714 0.286 14.857t0 20.857-0.857 22-2 24-3.714 20.857-6.286 18-9.143 10.286q-8.571 5.714-25.714 6.857t-30.286 1.143-23.429 8-10.286 25.714q0 14.857 6.857 27.429t20.571 12.571q26.286 0 79.143-2t79.143-2q24 0 72.286 2t72.286 2q14.286 0 21.429-12.571t7.143-27.429q0-17.143-9.714-24.857t-22-8.286-28.286-2.286-24.571-7.429q-20-12-20-91.429l0.571-182.857q0-12 0.571-18.286 7.429-1.714 22.286-1.714h399.429q14.286 0 21.714 1.714 0.571 6.286 0.571 18.286l0.571 182.857q0 79.429-20 91.429-10.286 6.286-33.429 7.143t-37.714 7.429-14.571 28.286q0 14.857 7.143 27.429t21.429 12.571q25.143 0 75.429-2t75.429-2q24.571 0 73.714 2t73.714 2q14.286 0 21.429-12.571t7.143-27.429q0-17.143-10-25.143t-22.857-8.286-29.429-1.714-25.143-7.143q-20-13.143-20-92l0.571-538.857q0-68 19.429-80 9.143-5.714 26.286-7.714t30.571-2.571 23.714-8.857 10.286-25.429q0-14.857-6.857-27.429t-20.571-12.571z" />
+<glyph unicode="&#xf1fc;" glyph-name="paint-brush" horiz-adv-x="1023" d="M922.857 950.857q40 0 70-26.571t30-66.571q0-36-25.714-86.286-189.714-359.429-265.714-429.714-55.429-52-124.571-52-72 0-123.714 52.857t-51.714 125.429q0 73.143 52.571 121.143l364.571 330.857q33.714 30.857 74.286 30.857zM403.429 360q22.286-43.429 60.857-74.286t86-43.429l0.571-40.571q2.286-121.714-74-198.286t-199.143-76.571q-70.286 0-124.571 26.571t-87.143 72.857-49.429 104.571-16.571 125.714q4-2.857 23.429-17.143t35.429-25.429 33.714-20.857 26.286-9.714q23.429 0 31.429 21.143 14.286 37.714 32.857 64.286t39.714 43.429 50.286 27.143 58.857 14.571 71.429 6z" />
+</font></defs></svg>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/icomoon/fonts/icomoon.ttf b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/fonts/icomoon.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..80be9ad27182d62f562b8181714691ace353524a
GIT binary patch
literal 5492
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

literal 0
HcmV?d00001

diff --git a/novel-admin/src/main/resources/static/wangEditor/example/icomoon/fonts/icomoon.woff b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/fonts/icomoon.woff
new file mode 100644
index 0000000000000000000000000000000000000000..fa64c4d86cef0bd3aadc1906f25b2c0ce6bf96da
GIT binary patch
literal 5568
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
QY+$Fm0gCU~<yV&f0lFt9;Q#;t

literal 0
HcmV?d00001

diff --git a/novel-admin/src/main/resources/static/wangEditor/example/icomoon/selection.json b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/selection.json
new file mode 100644
index 0000000..b4a875f
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/selection.json
@@ -0,0 +1,775 @@
+{
+  "IcoMoonType": "selection",
+  "icons": [
+    {
+      "icon": {
+        "paths": [
+          "M741.714 755.429q0 22.857-16 38.857l-77.714 77.714q-16 16-38.857 16t-38.857-16l-168-168-168 168q-16 16-38.857 16t-38.857-16l-77.714-77.714q-16-16-16-38.857t16-38.857l168-168-168-168q-16-16-16-38.857t16-38.857l77.714-77.714q16-16 38.857-16t38.857 16l168 168 168-168q16-16 38.857-16t38.857 16l77.714 77.714q16 16 16 38.857t-16 38.857l-168 168 168 168q16 16 16 38.857z"
+        ],
+        "width": 804.5720062255859,
+        "attrs": [],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "close",
+          "remove",
+          "times"
+        ],
+        "defaultCode": 61453,
+        "grid": 14
+      },
+      "attrs": [],
+      "properties": {
+        "name": "close, remove, times",
+        "id": 13,
+        "order": 60,
+        "prevSize": 16,
+        "code": 61453
+      },
+      "setIdx": 0,
+      "setId": 2,
+      "iconIdx": 13
+    },
+    {
+      "icon": {
+        "paths": [
+          "M292.571 420.571v329.143q0 8-5.143 13.143t-13.143 5.143h-36.571q-8 0-13.143-5.143t-5.143-13.143v-329.143q0-8 5.143-13.143t13.143-5.143h36.571q8 0 13.143 5.143t5.143 13.143zM438.857 420.571v329.143q0 8-5.143 13.143t-13.143 5.143h-36.571q-8 0-13.143-5.143t-5.143-13.143v-329.143q0-8 5.143-13.143t13.143-5.143h36.571q8 0 13.143 5.143t5.143 13.143zM585.143 420.571v329.143q0 8-5.143 13.143t-13.143 5.143h-36.571q-8 0-13.143-5.143t-5.143-13.143v-329.143q0-8 5.143-13.143t13.143-5.143h36.571q8 0 13.143 5.143t5.143 13.143zM658.286 834.286v-541.714h-512v541.714q0 12.571 4 23.143t8.286 15.429 6 4.857h475.429q1.714 0 6-4.857t8.286-15.429 4-23.143zM274.286 219.429h256l-27.429-66.857q-4-5.143-9.714-6.286h-181.143q-5.714 1.143-9.714 6.286zM804.571 237.714v36.571q0 8-5.143 13.143t-13.143 5.143h-54.857v541.714q0 47.429-26.857 82t-64.571 34.571h-475.429q-37.714 0-64.571-33.429t-26.857-80.857v-544h-54.857q-8 0-13.143-5.143t-5.143-13.143v-36.571q0-8 5.143-13.143t13.143-5.143h176.571l40-95.429q8.571-21.143 30.857-36t45.143-14.857h182.857q22.857 0 45.143 14.857t30.857 36l40 95.429h176.571q8 0 13.143 5.143t5.143 13.143z"
+        ],
+        "width": 804.5710134506226,
+        "attrs": [],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "trash-o"
+        ],
+        "defaultCode": 61460,
+        "grid": 14
+      },
+      "attrs": [],
+      "properties": {
+        "name": "trash-o",
+        "id": 19,
+        "order": 53,
+        "prevSize": 16,
+        "code": 61460
+      },
+      "setIdx": 0,
+      "setId": 2,
+      "iconIdx": 19
+    },
+    {
+      "icon": {
+        "paths": [
+          "M334.286 561.714l-266.286 266.286q-5.714 5.714-13.143 5.714t-13.143-5.714l-28.571-28.571q-5.714-5.714-5.714-13.143t5.714-13.143l224.571-224.571-224.571-224.571q-5.714-5.714-5.714-13.143t5.714-13.143l28.571-28.571q5.714-5.714 13.143-5.714t13.143 5.714l266.286 266.286q5.714 5.714 5.714 13.143t-5.714 13.143zM950.857 822.857v36.571q0 8-5.143 13.143t-13.143 5.143h-548.571q-8 0-13.143-5.143t-5.143-13.143v-36.571q0-8 5.143-13.143t13.143-5.143h548.571q8 0 13.143 5.143t5.143 13.143z"
+        ],
+        "width": 958.2859897613525,
+        "attrs": [],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "terminal"
+        ],
+        "defaultCode": 61728,
+        "grid": 14
+      },
+      "attrs": [],
+      "properties": {
+        "name": "terminal",
+        "id": 256,
+        "order": 55,
+        "prevSize": 16,
+        "code": 61728
+      },
+      "setIdx": 0,
+      "setId": 2,
+      "iconIdx": 256
+    },
+    {
+      "icon": {
+        "paths": [
+          "M961.143 950.857q-25.143 0-75.714-2t-76.286-2q-25.143 0-75.429 2t-75.429 2q-13.714 0-21.143-11.714t-7.429-26q0-17.714 9.714-26.286t22.286-9.714 29.143-4 25.714-8.571q18.857-12 18.857-80l-0.571-223.429q0-12-0.571-17.714-7.429-2.286-28.571-2.286h-385.714q-21.714 0-29.143 2.286-0.571 5.714-0.571 17.714l-0.571 212q0 81.143 21.143 93.714 9.143 5.714 27.429 7.429t32.571 2 25.714 8.571 11.429 26q0 14.857-7.143 27.429t-20.857 12.571q-26.857 0-79.714-2t-79.143-2q-24.571 0-73.143 2t-72.571 2q-13.143 0-20.286-12t-7.143-25.714q0-17.143 8.857-25.714t20.571-10 27.143-4.286 24-8.571q18.857-13.143 18.857-81.714l-0.571-32.571v-464.571q0-1.714 0.286-14.857t0-20.857-0.857-22-2-24-3.714-20.857-6.286-18-9.143-10.286q-8.571-5.714-25.714-6.857t-30.286-1.143-23.429-8-10.286-25.714q0-14.857 6.857-27.429t20.571-12.571q26.286 0 79.143 2t79.143 2q24 0 72.286-2t72.286-2q14.286 0 21.429 12.571t7.143 27.429q0 17.143-9.714 24.857t-22 8.286-28.286 2.286-24.571 7.429q-20 12-20 91.429l0.571 182.857q0 12 0.571 18.286 7.429 1.714 22.286 1.714h399.429q14.286 0 21.714-1.714 0.571-6.286 0.571-18.286l0.571-182.857q0-79.429-20-91.429-10.286-6.286-33.429-7.143t-37.714-7.429-14.571-28.286q0-14.857 7.143-27.429t21.429-12.571q25.143 0 75.429 2t75.429 2q24.571 0 73.714-2t73.714-2q14.286 0 21.429 12.571t7.143 27.429q0 17.143-10 25.143t-22.857 8.286-29.429 1.714-25.143 7.143q-20 13.143-20 92l0.571 538.857q0 68 19.429 80 9.143 5.714 26.286 7.714t30.571 2.571 23.714 8.857 10.286 25.429q0 14.857-6.857 27.429t-20.571 12.571z"
+        ],
+        "width": 1024.001937866211,
+        "attrs": [],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "header"
+        ],
+        "defaultCode": 61916,
+        "grid": 14
+      },
+      "attrs": [],
+      "properties": {
+        "name": "header",
+        "id": 433,
+        "order": 49,
+        "prevSize": 16,
+        "code": 61916
+      },
+      "setIdx": 0,
+      "setId": 2,
+      "iconIdx": 433
+    },
+    {
+      "icon": {
+        "paths": [
+          "M922.857 0q40 0 70 26.571t30 66.571q0 36-25.714 86.286-189.714 359.429-265.714 429.714-55.429 52-124.571 52-72 0-123.714-52.857t-51.714-125.429q0-73.143 52.571-121.143l364.571-330.857q33.714-30.857 74.286-30.857zM403.429 590.857q22.286 43.429 60.857 74.286t86 43.429l0.571 40.571q2.286 121.714-74 198.286t-199.143 76.571q-70.286 0-124.571-26.571t-87.143-72.857-49.429-104.571-16.571-125.714q4 2.857 23.429 17.143t35.429 25.429 33.714 20.857 26.286 9.714q23.429 0 31.429-21.143 14.286-37.714 32.857-64.286t39.714-43.429 50.286-27.143 58.857-14.571 71.429-6z"
+        ],
+        "width": 1022.8569793701172,
+        "attrs": [],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "paint-brush"
+        ],
+        "defaultCode": 61948,
+        "grid": 14
+      },
+      "attrs": [],
+      "properties": {
+        "name": "paint-brush",
+        "id": 463,
+        "order": 54,
+        "prevSize": 16,
+        "code": 61948
+      },
+      "setIdx": 0,
+      "setId": 2,
+      "iconIdx": 463
+    },
+    {
+      "icon": {
+        "paths": [
+          "M384 640l128-64 448-448-64-64-448 448-64 128zM289.3 867.098c-31.632-66.728-65.666-100.762-132.396-132.394l99.096-272.792 128-77.912 384-384h-192l-384 384-192 640 640-192 384-384v-192l-384 384-77.912 128z"
+        ],
+        "tags": [
+          "pencil",
+          "write",
+          "edit"
+        ],
+        "defaultCode": 59654,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "pencil2, write2",
+        "name": "pencil2",
+        "order": 32,
+        "id": 7,
+        "prevSize": 16,
+        "code": 59654
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 6
+    },
+    {
+      "icon": {
+        "paths": [
+          "M959.884 128c0.040 0.034 0.082 0.076 0.116 0.116v767.77c-0.034 0.040-0.076 0.082-0.116 0.116h-895.77c-0.040-0.034-0.082-0.076-0.114-0.116v-767.772c0.034-0.040 0.076-0.082 0.114-0.114h895.77zM960 64h-896c-35.2 0-64 28.8-64 64v768c0 35.2 28.8 64 64 64h896c35.2 0 64-28.8 64-64v-768c0-35.2-28.8-64-64-64v0z",
+          "M832 288c0 53.020-42.98 96-96 96s-96-42.98-96-96 42.98-96 96-96 96 42.98 96 96z",
+          "M896 832h-768v-128l224-384 256 320h64l224-192z"
+        ],
+        "tags": [
+          "image",
+          "picture",
+          "photo",
+          "graphic"
+        ],
+        "defaultCode": 59661,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "image, picture",
+        "name": "image",
+        "order": 44,
+        "id": 14,
+        "prevSize": 16,
+        "code": 59661
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 13
+    },
+    {
+      "icon": {
+        "paths": [
+          "M981.188 160.108c-143.632-20.65-302.332-32.108-469.186-32.108-166.86 0-325.556 11.458-469.194 32.108-27.53 107.726-42.808 226.75-42.808 351.892 0 125.14 15.278 244.166 42.808 351.89 143.638 20.652 302.336 32.11 469.194 32.11 166.854 0 325.552-11.458 469.186-32.11 27.532-107.724 42.812-226.75 42.812-351.89 0-125.142-15.28-244.166-42.812-351.892zM384.002 704v-384l320 192-320 192z"
+        ],
+        "tags": [
+          "play",
+          "video",
+          "movie"
+        ],
+        "defaultCode": 59666,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "play, video",
+        "name": "play",
+        "order": 51,
+        "id": 19,
+        "prevSize": 16,
+        "code": 59666
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 18
+    },
+    {
+      "icon": {
+        "paths": [
+          "M512 0c-176.732 0-320 143.268-320 320 0 320 320 704 320 704s320-384 320-704c0-176.732-143.27-320-320-320zM512 512c-106.040 0-192-85.96-192-192s85.96-192 192-192 192 85.96 192 192-85.96 192-192 192z"
+        ],
+        "tags": [
+          "location",
+          "map-marker",
+          "pin"
+        ],
+        "defaultCode": 59719,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "location, map-marker",
+        "name": "location",
+        "order": 48,
+        "id": 72,
+        "prevSize": 16,
+        "code": 59719
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 71
+    },
+    {
+      "icon": {
+        "paths": [
+          "M512 64c-141.384 0-269.376 57.32-362.032 149.978l-149.968-149.978v384h384l-143.532-143.522c69.496-69.492 165.492-112.478 271.532-112.478 212.068 0 384 171.924 384 384 0 114.696-50.292 217.636-130.018 288l84.666 96c106.302-93.816 173.352-231.076 173.352-384 0-282.77-229.23-512-512-512z"
+        ],
+        "tags": [
+          "undo",
+          "ccw",
+          "arrow"
+        ],
+        "defaultCode": 59749,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "undo, ccw",
+        "name": "undo",
+        "order": 35,
+        "id": 102,
+        "prevSize": 16,
+        "code": 59749
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 101
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0 576c0 152.924 67.048 290.184 173.35 384l84.666-96c-79.726-70.364-130.016-173.304-130.016-288 0-212.076 171.93-384 384-384 106.042 0 202.038 42.986 271.53 112.478l-143.53 143.522h384v-384l-149.97 149.978c-92.654-92.658-220.644-149.978-362.030-149.978-282.77 0-512 229.23-512 512z"
+        ],
+        "tags": [
+          "redo",
+          "cw",
+          "arrow"
+        ],
+        "defaultCode": 59750,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "redo, cw",
+        "name": "redo",
+        "order": 36,
+        "id": 103,
+        "prevSize": 16,
+        "code": 59750
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 102
+    },
+    {
+      "icon": {
+        "paths": [
+          "M225 448c123.712 0 224 100.29 224 224 0 123.712-100.288 224-224 224s-224-100.288-224-224l-1-32c0-247.424 200.576-448 448-448v128c-85.474 0-165.834 33.286-226.274 93.726-11.634 11.636-22.252 24.016-31.83 37.020 11.438-1.8 23.16-2.746 35.104-2.746zM801 448c123.71 0 224 100.29 224 224 0 123.712-100.29 224-224 224s-224-100.288-224-224l-1-32c0-247.424 200.576-448 448-448v128c-85.474 0-165.834 33.286-226.274 93.726-11.636 11.636-22.254 24.016-31.832 37.020 11.44-1.8 23.16-2.746 35.106-2.746z"
+        ],
+        "tags": [
+          "quotes-left",
+          "ldquo"
+        ],
+        "defaultCode": 59767,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "quotes-left, ldquo",
+        "name": "quotes-left",
+        "order": 34,
+        "id": 120,
+        "prevSize": 16,
+        "code": 59767
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 119
+    },
+    {
+      "icon": {
+        "paths": [
+          "M384 832h640v128h-640zM384 448h640v128h-640zM384 64h640v128h-640zM192 0v256h-64v-192h-64v-64zM128 526v50h128v64h-192v-146l128-60v-50h-128v-64h192v146zM256 704v320h-192v-64h128v-64h-128v-64h128v-64h-128v-64z"
+        ],
+        "tags": [
+          "list-numbered",
+          "options"
+        ],
+        "defaultCode": 59833,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "list-numbered, options",
+        "name": "list-numbered",
+        "order": 37,
+        "id": 186,
+        "prevSize": 16,
+        "code": 59833
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 185
+    },
+    {
+      "icon": {
+        "paths": [
+          "M384 64h640v128h-640v-128zM384 448h640v128h-640v-128zM384 832h640v128h-640v-128zM0 128c0-70.692 57.308-128 128-128s128 57.308 128 128c0 70.692-57.308 128-128 128s-128-57.308-128-128zM0 512c0-70.692 57.308-128 128-128s128 57.308 128 128c0 70.692-57.308 128-128 128s-128-57.308-128-128zM0 896c0-70.692 57.308-128 128-128s128 57.308 128 128c0 70.692-57.308 128-128 128s-128-57.308-128-128z"
+        ],
+        "tags": [
+          "list",
+          "todo",
+          "bullet",
+          "menu",
+          "options"
+        ],
+        "defaultCode": 59835,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "list2, todo2",
+        "name": "list2",
+        "order": 38,
+        "id": 188,
+        "prevSize": 16,
+        "code": 59835
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 187
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0 896h1024v64h-1024zM1024 768v64h-1024v-64l128-256h256v128h256v-128h256zM224 320l288-288 288 288h-224v256h-128v-256z"
+        ],
+        "tags": [
+          "upload",
+          "load",
+          "open"
+        ],
+        "defaultCode": 59846,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "upload2, load2",
+        "name": "upload2",
+        "order": 52,
+        "id": 199,
+        "prevSize": 16,
+        "code": 59846
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 198
+    },
+    {
+      "icon": {
+        "paths": [
+          "M440.236 635.766c-13.31 0-26.616-5.076-36.77-15.23-95.134-95.136-95.134-249.934 0-345.070l192-192c46.088-46.086 107.36-71.466 172.534-71.466s126.448 25.38 172.536 71.464c95.132 95.136 95.132 249.934 0 345.070l-87.766 87.766c-20.308 20.308-53.23 20.308-73.54 0-20.306-20.306-20.306-53.232 0-73.54l87.766-87.766c54.584-54.586 54.584-143.404 0-197.99-26.442-26.442-61.6-41.004-98.996-41.004s-72.552 14.562-98.996 41.006l-192 191.998c-54.586 54.586-54.586 143.406 0 197.992 20.308 20.306 20.306 53.232 0 73.54-10.15 10.152-23.462 15.23-36.768 15.23z",
+          "M256 1012c-65.176 0-126.45-25.38-172.534-71.464-95.134-95.136-95.134-249.934 0-345.070l87.764-87.764c20.308-20.306 53.234-20.306 73.54 0 20.308 20.306 20.308 53.232 0 73.54l-87.764 87.764c-54.586 54.586-54.586 143.406 0 197.992 26.44 26.44 61.598 41.002 98.994 41.002s72.552-14.562 98.998-41.006l192-191.998c54.584-54.586 54.584-143.406 0-197.992-20.308-20.308-20.306-53.232 0-73.54 20.306-20.306 53.232-20.306 73.54 0.002 95.132 95.134 95.132 249.932 0.002 345.068l-192.002 192c-46.090 46.088-107.364 71.466-172.538 71.466z"
+        ],
+        "tags": [
+          "link",
+          "chain",
+          "url",
+          "uri",
+          "anchor"
+        ],
+        "defaultCode": 59851,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "link, chain",
+        "name": "link",
+        "order": 42,
+        "id": 204,
+        "prevSize": 16,
+        "code": 59851
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 203
+    },
+    {
+      "icon": {
+        "paths": [
+          "M512 1024c282.77 0 512-229.23 512-512s-229.23-512-512-512-512 229.23-512 512 229.23 512 512 512zM512 96c229.75 0 416 186.25 416 416s-186.25 416-416 416-416-186.25-416-416 186.25-416 416-416zM512 598.76c115.95 0 226.23-30.806 320-84.92-14.574 178.438-153.128 318.16-320 318.16-166.868 0-305.422-139.872-320-318.304 93.77 54.112 204.050 85.064 320 85.064zM256 352c0-53.019 28.654-96 64-96s64 42.981 64 96c0 53.019-28.654 96-64 96s-64-42.981-64-96zM640 352c0-53.019 28.654-96 64-96s64 42.981 64 96c0 53.019-28.654 96-64 96s-64-42.981-64-96z"
+        ],
+        "tags": [
+          "happy",
+          "emoticon",
+          "smiley",
+          "face"
+        ],
+        "defaultCode": 59871,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "happy, emoticon",
+        "name": "happy",
+        "order": 31,
+        "id": 224,
+        "prevSize": 16,
+        "code": 59871
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 223
+    },
+    {
+      "icon": {
+        "paths": [
+          "M512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM512 928c-229.75 0-416-186.25-416-416s186.25-416 416-416 416 186.25 416 416-186.25 416-416 416z",
+          "M672 256l-160 160-160-160-96 96 160 160-160 160 96 96 160-160 160 160 96-96-160-160 160-160z"
+        ],
+        "tags": [
+          "cancel-circle",
+          "close",
+          "remove",
+          "delete"
+        ],
+        "defaultCode": 59917,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "cancel-circle, close",
+        "name": "cancel-circle",
+        "order": 59,
+        "id": 270,
+        "prevSize": 16,
+        "code": 59917
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 269
+    },
+    {
+      "icon": {
+        "paths": [
+          "M707.88 484.652c37.498-44.542 60.12-102.008 60.12-164.652 0-141.16-114.842-256-256-256h-320v896h384c141.158 0 256-114.842 256-256 0-92.956-49.798-174.496-124.12-219.348zM384 192h101.5c55.968 0 101.5 57.42 101.5 128s-45.532 128-101.5 128h-101.5v-256zM543 832h-159v-256h159c58.45 0 106 57.42 106 128s-47.55 128-106 128z"
+        ],
+        "tags": [
+          "bold",
+          "wysiwyg"
+        ],
+        "defaultCode": 60002,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "bold, wysiwyg4",
+        "name": "bold",
+        "order": 27,
+        "id": 355,
+        "prevSize": 16,
+        "code": 60002
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 354
+    },
+    {
+      "icon": {
+        "paths": [
+          "M704 64h128v416c0 159.058-143.268 288-320 288-176.73 0-320-128.942-320-288v-416h128v416c0 40.166 18.238 78.704 51.354 108.506 36.896 33.204 86.846 51.494 140.646 51.494s103.75-18.29 140.646-51.494c33.116-29.802 51.354-68.34 51.354-108.506v-416zM192 832h640v128h-640z"
+        ],
+        "tags": [
+          "underline",
+          "wysiwyg"
+        ],
+        "defaultCode": 60003,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "underline, wysiwyg5",
+        "name": "underline",
+        "order": 28,
+        "id": 356,
+        "prevSize": 16,
+        "code": 60003
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 355
+    },
+    {
+      "icon": {
+        "paths": [
+          "M896 64v64h-128l-320 768h128v64h-448v-64h128l320-768h-128v-64z"
+        ],
+        "tags": [
+          "italic",
+          "wysiwyg"
+        ],
+        "defaultCode": 60004,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "italic, wysiwyg6",
+        "name": "italic",
+        "order": 29,
+        "id": 357,
+        "prevSize": 16,
+        "code": 60004
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 356
+    },
+    {
+      "icon": {
+        "paths": [
+          "M1024 512v64h-234.506c27.504 38.51 42.506 82.692 42.506 128 0 70.878-36.66 139.026-100.58 186.964-59.358 44.518-137.284 69.036-219.42 69.036-82.138 0-160.062-24.518-219.42-69.036-63.92-47.938-100.58-116.086-100.58-186.964h128c0 69.382 87.926 128 192 128s192-58.618 192-128c0-69.382-87.926-128-192-128h-512v-64h299.518c-2.338-1.654-4.656-3.324-6.938-5.036-63.92-47.94-100.58-116.086-100.58-186.964s36.66-139.024 100.58-186.964c59.358-44.518 137.282-69.036 219.42-69.036 82.136 0 160.062 24.518 219.42 69.036 63.92 47.94 100.58 116.086 100.58 186.964h-128c0-69.382-87.926-128-192-128s-192 58.618-192 128c0 69.382 87.926 128 192 128 78.978 0 154.054 22.678 212.482 64h299.518z"
+        ],
+        "tags": [
+          "strikethrough",
+          "wysiwyg"
+        ],
+        "defaultCode": 60005,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "strikethrough, wysiwyg7",
+        "name": "strikethrough",
+        "order": 30,
+        "id": 358,
+        "prevSize": 16,
+        "code": 60005
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 357
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0 512h128v64h-128zM192 512h192v64h-192zM448 512h128v64h-128zM640 512h192v64h-192zM896 512h128v64h-128zM880 0l16 448h-768l16-448h32l16 384h640l16-384zM144 1024l-16-384h768l-16 384h-32l-16-320h-640l-16 320z"
+        ],
+        "tags": [
+          "page-break",
+          "wysiwyg"
+        ],
+        "defaultCode": 60008,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "page-break, wysiwyg10",
+        "name": "page-break",
+        "order": 57,
+        "id": 361,
+        "prevSize": 16,
+        "code": 60008
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 360
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0 64v896h1024v-896h-1024zM384 640v-192h256v192h-256zM640 704v192h-256v-192h256zM640 192v192h-256v-192h256zM320 192v192h-256v-192h256zM64 448h256v192h-256v-192zM704 448h256v192h-256v-192zM704 384v-192h256v192h-256zM64 704h256v192h-256v-192zM704 896v-192h256v192h-256z"
+        ],
+        "tags": [
+          "table",
+          "wysiwyg"
+        ],
+        "defaultCode": 60017,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "table2, wysiwyg19",
+        "name": "table2",
+        "order": 43,
+        "id": 370,
+        "prevSize": 16,
+        "code": 60017
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 369
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0 64h1024v128h-1024zM0 256h640v128h-640zM0 640h640v128h-640zM0 448h1024v128h-1024zM0 832h1024v128h-1024z"
+        ],
+        "tags": [
+          "paragraph-left",
+          "wysiwyg",
+          "align-left",
+          "left"
+        ],
+        "defaultCode": 60023,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "paragraph-left, wysiwyg25",
+        "name": "paragraph-left",
+        "order": 39,
+        "id": 376,
+        "prevSize": 16,
+        "code": 60023
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 375
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0 64h1024v128h-1024zM192 256h640v128h-640zM192 640h640v128h-640zM0 448h1024v128h-1024zM0 832h1024v128h-1024z"
+        ],
+        "tags": [
+          "paragraph-center",
+          "wysiwyg",
+          "align-center",
+          "center"
+        ],
+        "defaultCode": 60024,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "paragraph-center, wysiwyg26",
+        "name": "paragraph-center",
+        "order": 40,
+        "id": 377,
+        "prevSize": 16,
+        "code": 60024
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 376
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0 64h1024v128h-1024zM384 256h640v128h-640zM384 640h640v128h-640zM0 448h1024v128h-1024zM0 832h1024v128h-1024z"
+        ],
+        "tags": [
+          "paragraph-right",
+          "wysiwyg",
+          "align-right",
+          "right"
+        ],
+        "defaultCode": 60025,
+        "grid": 16,
+        "attrs": []
+      },
+      "attrs": [],
+      "properties": {
+        "ligatures": "paragraph-right, wysiwyg27",
+        "name": "paragraph-right",
+        "order": 41,
+        "id": 378,
+        "prevSize": 16,
+        "code": 60025
+      },
+      "setIdx": 1,
+      "setId": 1,
+      "iconIdx": 377
+    }
+  ],
+  "height": 1024,
+  "metadata": {
+    "name": "icomoon"
+  },
+  "preferences": {
+    "showGlyphs": true,
+    "showQuickUse": true,
+    "showQuickUse2": true,
+    "showSVGs": true,
+    "fontPref": {
+      "prefix": "icon-",
+      "metadata": {
+        "fontFamily": "icomoon"
+      },
+      "metrics": {
+        "emSize": 1024,
+        "baseline": 6.25,
+        "whitespace": 50
+      },
+      "embed": false
+    },
+    "imagePref": {
+      "prefix": "icon-",
+      "png": true,
+      "useClassSelector": true,
+      "color": 0,
+      "bgColor": 16777215,
+      "classSelector": ".icon"
+    },
+    "historySize": 100,
+    "showCodes": true,
+    "gridSize": 16
+  }
+}
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/icomoon/style.css b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/style.css
new file mode 100644
index 0000000..e8caa25
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/icomoon/style.css
@@ -0,0 +1,113 @@
+@font-face {
+  font-family: 'icomoon';
+  src:  url('fonts/icomoon.eot?b1ngen');
+  src:  url('fonts/icomoon.eot?b1ngen#iefix') format('embedded-opentype'),
+    url('fonts/icomoon.ttf?b1ngen') format('truetype'),
+    url('fonts/icomoon.woff?b1ngen') format('woff'),
+    url('fonts/icomoon.svg?b1ngen#icomoon') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+
+[class^="icon-"], [class*=" icon-"] {
+  /* use !important to prevent issues with browser extensions that change fonts */
+  font-family: 'icomoon' !important;
+  speak: none;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-close:before {
+  content: "\f00d";
+}
+.icon-remove:before {
+  content: "\f00d";
+}
+.icon-times:before {
+  content: "\f00d";
+}
+.icon-trash-o:before {
+  content: "\f014";
+}
+.icon-terminal:before {
+  content: "\f120";
+}
+.icon-header:before {
+  content: "\f1dc";
+}
+.icon-paint-brush:before {
+  content: "\f1fc";
+}
+.icon-pencil2:before {
+  content: "\e906";
+}
+.icon-image:before {
+  content: "\e90d";
+}
+.icon-play:before {
+  content: "\e912";
+}
+.icon-location:before {
+  content: "\e947";
+}
+.icon-undo:before {
+  content: "\e965";
+}
+.icon-redo:before {
+  content: "\e966";
+}
+.icon-quotes-left:before {
+  content: "\e977";
+}
+.icon-list-numbered:before {
+  content: "\e9b9";
+}
+.icon-list2:before {
+  content: "\e9bb";
+}
+.icon-upload2:before {
+  content: "\e9c6";
+}
+.icon-link:before {
+  content: "\e9cb";
+}
+.icon-happy:before {
+  content: "\e9df";
+}
+.icon-cancel-circle:before {
+  content: "\ea0d";
+}
+.icon-bold:before {
+  content: "\ea62";
+}
+.icon-underline:before {
+  content: "\ea63";
+}
+.icon-italic:before {
+  content: "\ea64";
+}
+.icon-strikethrough:before {
+  content: "\ea65";
+}
+.icon-page-break:before {
+  content: "\ea68";
+}
+.icon-table2:before {
+  content: "\ea71";
+}
+.icon-paragraph-left:before {
+  content: "\ea77";
+}
+.icon-paragraph-center:before {
+  content: "\ea78";
+}
+.icon-paragraph-right:before {
+  content: "\ea79";
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/index.html b/novel-admin/src/main/resources/static/wangEditor/example/index.html
new file mode 100644
index 0000000..6f55c8b
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/index.html
@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <title>wangEditor demo list</title>
+    <style type="text/css">
+        .body {
+            width: 800px;
+            margin: 0 auto 0 auto;
+        }
+    </style>
+</head>
+<body>
+    <div class="body">
+        <p>可访问 <a href="http://www.wangeditor.com/" target="_blank">wangEditor 官网</a> 了解更多内容</p>
+        <div id="div1">
+            <p>欢迎使用 <b>wangEditor</b> 富文本编辑器</p>
+        </div>
+
+        <p>wangEditor demo list(demo页面直接查看网页源代码即可)</p>
+        <div>
+            <ul>
+                <li><a href="demo/test-sperate.html" target="_blank">菜单和编辑器区域分离</a></li>
+                <li><a href="demo/test-mult.html" target="_blank">一个页面多个编辑器</a></li>
+                <li><a href="demo/test-menus.html" target="_blank">自定义菜单</a></li>
+                <li><a href="demo/test-fullscreen.html" target="_blank">全屏</a></li>
+                <li><a href="demo/test-set-content.html" target="_blank">设置内容</a></li>
+                <li><a href="demo/test-get-content.html" target="_blank">获取内容</a></li>
+                <li><a href="demo/test-uploadimg.html" target="_blank">上传图片</a></li>
+                <li><a href="demo/test-amd.html" target="_blank">使用 AMD 加载</a></li>
+                <li><a href="demo/test-textarea.html" target="_blank">使用 textarea</a></li>
+                <li><a href="demo/test-onblur.html" target="_blank">onblur</a></li>
+                <li><a href="demo/test-onfocus.html" target="_blank">onfocus</a></li>
+                <li><a href="demo/test-onchange.html" target="_blank">onchange</a></li>
+                <li><a href="demo/test-getJSON.html" target="_blank">获取 JSON</a></li>
+                <li><a href="demo/test-emot.html" target="_blank">配置表情</a></li>
+                <li><a href="demo/test-paste.html" target="_blank">粘贴</a></li>
+                <li><a href="demo/test-lang.html" target="_blank">多语言</a></li>
+                <li><a href="demo/test-css-reset.html" target="_blank">CSS-Reset</a></li>
+            </ul>
+        </div>
+
+        <p>其他链接</p>
+        <div>
+            <ul>
+                <li><a href="icomoon/demo.html" target="_blank">菜单图标</a></li>
+            </ul>
+        </div>
+
+        <p>向我捐赠</p>
+        <img src="./pay.png"/>
+    </div>
+
+    <!-- 引用js -->
+    <script type="text/javascript" src="/wangEditor.js"></script>
+    <script type="text/javascript">
+        var E = window.wangEditor
+        var editor = new E('#div1')
+        editor.create()
+    </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/pay.png b/novel-admin/src/main/resources/static/wangEditor/example/pay.png
new file mode 100644
index 0000000000000000000000000000000000000000..98efb8d042abe0e0dc1e3db9581ce383304f572f
GIT binary patch
literal 95517
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

literal 0
HcmV?d00001

diff --git a/novel-admin/src/main/resources/static/wangEditor/example/server/index.js b/novel-admin/src/main/resources/static/wangEditor/example/server/index.js
new file mode 100644
index 0000000..28d8a60
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/server/index.js
@@ -0,0 +1,88 @@
+const fs = require('fs')
+const path = require('path')
+const formidable = require('formidable')
+const util  = require('./util.js')
+
+const koa = require('koa')
+const app = koa()
+
+// 捕获错误
+const onerror = require('koa-onerror')
+onerror(app)
+
+// post body 解析
+const bodyParser = require('koa-bodyparser')
+app.use(bodyParser())
+
+// 静态文件服务,针对 html js css fonts 文件
+const staticCache = require('koa-static-cache')
+function setStaticCache() {
+    const exampleDir = path.join(__dirname, '..', '..', 'example')
+    const releaseDir = path.join(__dirname, '..', '..', 'release')
+    app.use(staticCache(exampleDir))
+    app.use(staticCache(releaseDir))
+}
+setStaticCache()
+
+// 配置路由
+const router = require('koa-router')()
+
+// 保存上传的文件
+function saveFiles(req) {
+    return new Promise((resolve, reject) => {
+        const imgLinks = []
+        const form = new formidable.IncomingForm()
+        form.parse(req, function (err, fields, files) {
+            if (err) {
+                reject('formidable, form.parse err', err.stack)
+            }
+            // 存储图片的文件夹
+            const storePath = path.resolve(__dirname, '..', 'upload-files')
+            if (!fs.existsSync(storePath)) {
+                fs.mkdirSync(storePath)
+            }
+
+            // 遍历所有上传来的图片
+            util.objForEach(files, (name, file) => {
+                // 图片临时位置
+                const tempFilePath = file.path
+                // 图片名称和路径
+                const fileName = file.name
+                const fullFileName = path.join(storePath, fileName)
+                // 将临时文件保存为正式文件
+                fs.renameSync(tempFilePath, fullFileName)
+                // 存储链接
+                imgLinks.push('/upload-files/' + fileName)
+            })
+
+            // 重新设置静态文件缓存
+            setStaticCache()
+
+            // 返回结果
+            resolve({
+                errno: 0,
+                data: imgLinks
+            })
+        })
+    })
+}
+
+// 上传图片
+router.post('/upload-img', function* () {
+    const ctx = this
+    const req = ctx.req
+    const res = ctx.res
+
+    // 获取数据
+    const data = yield saveFiles(req)
+
+    // 返回结果
+    this.body = JSON.stringify(data)
+})
+app.use(router.routes()).use(router.allowedMethods());
+
+// 启动服务
+app.listen(3000)
+console.log('listening on port %s', 3000)
+
+module.exports = app
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/example/server/util.js b/novel-admin/src/main/resources/static/wangEditor/example/server/util.js
new file mode 100644
index 0000000..62477f2
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/example/server/util.js
@@ -0,0 +1,14 @@
+module.exports = {
+    // 遍历对象
+    objForEach: function (obj, fn) {
+        let key, result
+        for (key in obj) {
+            if (obj.hasOwnProperty(key)) {
+                result = fn.call(obj, key, obj[key])
+                if (result === false) {
+                    break
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/gulpfile.js b/novel-admin/src/main/resources/static/wangEditor/gulpfile.js
new file mode 100644
index 0000000..171e7e5
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/gulpfile.js
@@ -0,0 +1,122 @@
+const path = require('path')
+const fs = require('fs')
+const gulp = require('gulp')
+const rollup = require('rollup')
+const uglify = require('gulp-uglify')
+const sourcemaps = require('gulp-sourcemaps')
+const rename = require('gulp-rename')
+const less = require('gulp-less')
+const concat = require('gulp-concat')
+const cssmin = require('gulp-cssmin')
+const eslint = require('rollup-plugin-eslint')
+const postcss = require('gulp-postcss')
+const autoprefixer = require('autoprefixer')
+const cssgrace = require('cssgrace')
+const resolve = require('rollup-plugin-node-resolve')
+const babel = require('rollup-plugin-babel')
+const gulpReplace = require('gulp-replace')
+
+// 拷贝 fonts 文件
+gulp.task('copy-fonts', () => {
+    gulp.src('./src/fonts/*')
+        .pipe(gulp.dest('./release/fonts'))
+})
+
+// 处理 css
+gulp.task('css', () => {
+    gulp.src('./src/less/**/*.less')
+        .pipe(less())
+        // 产出的未压缩的文件名
+        .pipe(concat('wangEditor.css'))
+        // 配置 postcss
+        .pipe(postcss([
+            autoprefixer,
+            cssgrace
+        ]))
+        // 将 css 引用的字体文件转换为 base64 格式
+        .pipe(gulpReplace( /'fonts\/w-e-icon\..+?'/gm, function (fontFile) {
+            // fontFile 例如 'fonts/w-e-icon.eot?paxlku'
+            fontFile = fontFile.slice(0, -1).slice(1)
+            fontFile = fontFile.split('?')[0]
+            var ext = fontFile.split('.')[1]
+            // 读取文件内容,转换为 base64 格式
+            var filePath = path.resolve(__dirname, 'release', fontFile)
+            var content = fs.readFileSync(filePath)
+            var base64 = content.toString('base64')
+            // 返回
+            return 'data:application/x-font-' + ext + ';charset=utf-8;base64,' + base64
+        }))
+        // 产出文件的位置
+        .pipe(gulp.dest('./release'))
+        // 产出的压缩后的文件名
+        .pipe(rename('wangEditor.min.css'))
+        .pipe(cssmin())
+        .pipe(gulp.dest('./release'))
+})
+
+// 处理 JS
+gulp.task('script', () => {
+    // rollup 打包 js 模块
+    return rollup.rollup({
+        // 入口文件
+        entry: './src/js/index.js',
+        plugins: [
+            // 对原始文件启动 eslint 检查,配置参见 ./.eslintrc.json
+            eslint(),
+            resolve(),
+            babel({
+                exclude: 'node_modules/**' // only transpile our source code
+            })
+        ]
+    }).then(bundle => {
+        bundle.write({
+            // 产出文件使用 umd 规范(即兼容 amd cjs 和 iife)
+            format: 'umd',
+            // iife 规范下的全局变量名称
+            moduleName: 'wangEditor',
+            // 产出的未压缩的文件名
+            dest: './release/wangEditor.js'
+        }).then(() => {
+            // 待 rollup 打包 js 完毕之后,再进行如下的处理:
+            gulp.src('./release/wangEditor.js')
+                // inline css
+                .pipe(gulpReplace(/__INLINE_CSS__/gm, function () {
+                    // 读取 css 文件内容
+                    var filePath = path.resolve(__dirname, 'release', 'wangEditor.css')
+                    var content = fs.readFileSync(filePath).toString('utf-8')
+                    // 替换 \n \ ' 三个字符
+                    content = content.replace(/\n/g, '').replace(/\\/g, '\\\\').replace(/'/g, '\\\'')
+                    return content
+                }))
+                .pipe(gulp.dest('./release'))
+                .pipe(sourcemaps.init())
+                // 压缩
+                .pipe(uglify())
+                // 产出的压缩的文件名
+                .pipe(rename('wangEditor.min.js'))
+                // 生成 sourcemap
+                .pipe(sourcemaps.write(''))
+                .pipe(gulp.dest('./release'))
+        })
+    })
+})
+
+
+// 默认任务配置
+gulp.task('default', () => {
+    gulp.run('copy-fonts', 'css', 'script')
+
+    // 监听 js 原始文件的变化
+    gulp.watch('./src/js/**/*.js', () => {
+        gulp.run('script')
+    })
+    // 监听 css 原始文件的变化
+    gulp.watch('./src/less/**/*.less', () => {
+        gulp.run('css', 'script')
+    })
+    // 监听 icon.less 的变化,变化时重新拷贝 fonts 文件
+    gulp.watch('./src/less/icon.less', () => {
+        gulp.run('copy-fonts')
+    })
+})
+
diff --git a/novel-admin/src/main/resources/static/wangEditor/package.json b/novel-admin/src/main/resources/static/wangEditor/package.json
new file mode 100644
index 0000000..b42d94d
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/package.json
@@ -0,0 +1,60 @@
+{
+  "name": "wangeditor",
+  "title": "wangEditor",
+  "version": "3.0.17",
+  "description": "wangEditor - 基于javascript和css开发的 web 富文本编辑器, 轻量、简洁、易用、开源免费",
+  "homepage": "http://wangeditor.github.io/",
+  "author": {
+    "name": "wangfupeng1988",
+    "url": "https://github.com/wangfupeng1988"
+  },
+  "keywords": [
+    "wangEditor",
+    "web 富文本编辑器"
+  ],
+  "main": "release/wangEditor.js",
+  "maintainers": [
+    {
+      "name": "wangfupeng1988",
+      "web": "http://www.cnblogs.com/wangfupeng1988/default.html?OnlyTitle=1",
+      "mail": "wangfupeng1988@163.com"
+    }
+  ],
+  "repositories": [
+    {
+      "type": "git",
+      "url": "https://github.com/wangfupeng1988/wangEditor"
+    }
+  ],
+  "scripts": {
+    "release": "gulp",
+    "win-example": "node ./example/server/index.js",
+    "example": "/bin/rm -rf ./example/upload-files && mkdir ./example/upload-files && npm run win-example"
+  },
+  "devDependencies": {
+    "autoprefixer": "^6.7.7",
+    "babel-plugin-external-helpers": "^6.22.0",
+    "babel-preset-latest": "^6.24.0",
+    "cssgrace": "^3.0.0",
+    "formidable": "^1.1.1",
+    "gulp": "^3.9.1",
+    "gulp-concat": "^2.6.1",
+    "gulp-cssmin": "^0.1.7",
+    "gulp-less": "^3.3.0",
+    "gulp-postcss": "^6.4.0",
+    "gulp-rename": "^1.2.2",
+    "gulp-replace": "^0.5.4",
+    "gulp-sourcemaps": "^2.5.0",
+    "gulp-uglify": "^2.1.2",
+    "koa": "^1.2.4",
+    "koa-bodyparser": "^2.3.0",
+    "koa-onerror": "^3.1.0",
+    "koa-router": "^5.4.0",
+    "koa-static-cache": "^4.0.0",
+    "rollup": "^0.41.6",
+    "rollup-plugin-babel": "^2.7.1",
+    "rollup-plugin-eslint": "^3.0.0",
+    "rollup-plugin-node-resolve": "^3.0.0"
+  },
+  "dependencies": {}
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/release/fonts/w-e-icon.woff b/novel-admin/src/main/resources/static/wangEditor/release/fonts/w-e-icon.woff
new file mode 100644
index 0000000000000000000000000000000000000000..fa64c4d86cef0bd3aadc1906f25b2c0ce6bf96da
GIT binary patch
literal 5568
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
QY+$Fm0gCU~<yV&f0lFt9;Q#;t

literal 0
HcmV?d00001

diff --git a/novel-admin/src/main/resources/static/wangEditor/release/wangEditor.css b/novel-admin/src/main/resources/static/wangEditor/release/wangEditor.css
new file mode 100644
index 0000000..78a4c41
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/release/wangEditor.css
@@ -0,0 +1,405 @@
+.w-e-toolbar,
+.w-e-text-container,
+.w-e-menu-panel {
+  padding: 0;
+  margin: 0;
+  box-sizing: border-box;
+}
+.w-e-toolbar *,
+.w-e-text-container *,
+.w-e-menu-panel * {
+  padding: 0;
+  margin: 0;
+  box-sizing: border-box;
+}
+.w-e-clear-fix:after {
+  content: "";
+  display: table;
+  clear: both;
+}
+
+.w-e-toolbar .w-e-droplist {
+  position: absolute;
+  left: 0;
+  top: 0;
+  background-color: #fff;
+  border: 1px solid #f1f1f1;
+  border-right-color: #ccc;
+  border-bottom-color: #ccc;
+}
+.w-e-toolbar .w-e-droplist .w-e-dp-title {
+  text-align: center;
+  color: #999;
+  line-height: 2;
+  border-bottom: 1px solid #f1f1f1;
+  font-size: 13px;
+}
+.w-e-toolbar .w-e-droplist ul.w-e-list {
+  list-style: none;
+  line-height: 1;
+}
+.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item {
+  color: #333;
+  padding: 5px 0;
+}
+.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item:hover {
+  background-color: #f1f1f1;
+}
+.w-e-toolbar .w-e-droplist ul.w-e-block {
+  list-style: none;
+  text-align: left;
+  padding: 5px;
+}
+.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+  padding: 3px 5px;
+}
+.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item:hover {
+  background-color: #f1f1f1;
+}
+
+@font-face {
+  font-family: 'w-e-icon';
+  src: url(data:application/x-font-woff;charset=utf-8;base64,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) format('truetype');
+  font-weight: normal;
+  font-style: normal;
+}
+[class^="w-e-icon-"],
+[class*=" w-e-icon-"] {
+  /* use !important to prevent issues with browser extensions that change fonts */
+  font-family: 'w-e-icon' !important;
+  speak: none;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.w-e-icon-close:before {
+  content: "\f00d";
+}
+.w-e-icon-upload2:before {
+  content: "\e9c6";
+}
+.w-e-icon-trash-o:before {
+  content: "\f014";
+}
+.w-e-icon-header:before {
+  content: "\f1dc";
+}
+.w-e-icon-pencil2:before {
+  content: "\e906";
+}
+.w-e-icon-paint-brush:before {
+  content: "\f1fc";
+}
+.w-e-icon-image:before {
+  content: "\e90d";
+}
+.w-e-icon-play:before {
+  content: "\e912";
+}
+.w-e-icon-location:before {
+  content: "\e947";
+}
+.w-e-icon-undo:before {
+  content: "\e965";
+}
+.w-e-icon-redo:before {
+  content: "\e966";
+}
+.w-e-icon-quotes-left:before {
+  content: "\e977";
+}
+.w-e-icon-list-numbered:before {
+  content: "\e9b9";
+}
+.w-e-icon-list2:before {
+  content: "\e9bb";
+}
+.w-e-icon-link:before {
+  content: "\e9cb";
+}
+.w-e-icon-happy:before {
+  content: "\e9df";
+}
+.w-e-icon-bold:before {
+  content: "\ea62";
+}
+.w-e-icon-underline:before {
+  content: "\ea63";
+}
+.w-e-icon-italic:before {
+  content: "\ea64";
+}
+.w-e-icon-strikethrough:before {
+  content: "\ea65";
+}
+.w-e-icon-table2:before {
+  content: "\ea71";
+}
+.w-e-icon-paragraph-left:before {
+  content: "\ea77";
+}
+.w-e-icon-paragraph-center:before {
+  content: "\ea78";
+}
+.w-e-icon-paragraph-right:before {
+  content: "\ea79";
+}
+.w-e-icon-terminal:before {
+  content: "\f120";
+}
+.w-e-icon-page-break:before {
+  content: "\ea68";
+}
+.w-e-icon-cancel-circle:before {
+  content: "\ea0d";
+}
+
+.w-e-toolbar {
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  padding: 0 5px;
+  /* flex-wrap: wrap; */
+  /* 单个菜单 */
+}
+.w-e-toolbar .w-e-menu {
+  position: relative;
+  text-align: center;
+  padding: 5px 10px;
+  cursor: pointer;
+}
+.w-e-toolbar .w-e-menu i {
+  color: #999;
+}
+.w-e-toolbar .w-e-menu:hover i {
+  color: #333;
+}
+.w-e-toolbar .w-e-active i {
+  color: #1e88e5;
+}
+.w-e-toolbar .w-e-active:hover i {
+  color: #1e88e5;
+}
+
+.w-e-text-container .w-e-panel-container {
+  position: absolute;
+  top: 0;
+  left: 50%;
+  border: 1px solid #ccc;
+  border-top: 0;
+  box-shadow: 1px 1px 2px #ccc;
+  color: #333;
+  background-color: #fff;
+  /* 为 emotion panel 定制的样式 */
+  /* 上传图片的 panel 定制样式 */
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-close {
+  position: absolute;
+  right: 0;
+  top: 0;
+  padding: 5px;
+  margin: 2px 5px 0 0;
+  cursor: pointer;
+  color: #999;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-close:hover {
+  color: #333;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-title {
+  list-style: none;
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  font-size: 14px;
+  margin: 2px 10px 0 10px;
+  border-bottom: 1px solid #f1f1f1;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-item {
+  padding: 3px 5px;
+  color: #999;
+  cursor: pointer;
+  margin: 0 3px;
+  position: relative;
+  top: 1px;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-active {
+  color: #333;
+  border-bottom: 1px solid #333;
+  cursor: default;
+  font-weight: 700;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content {
+  padding: 10px 15px 10px 15px;
+  font-size: 16px;
+  /* 输入框的样式 */
+  /* 按钮的样式 */
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input:focus,
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus,
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content button:focus {
+  outline: none;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea {
+  width: 100%;
+  border: 1px solid #ccc;
+  padding: 5px;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus {
+  border-color: #1e88e5;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text] {
+  border: none;
+  border-bottom: 1px solid #ccc;
+  font-size: 14px;
+  height: 20px;
+  color: #333;
+  text-align: left;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].small {
+  width: 30px;
+  text-align: center;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].block {
+  display: block;
+  width: 100%;
+  margin: 10px 0;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text]:focus {
+  border-bottom: 2px solid #1e88e5;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button {
+  font-size: 14px;
+  color: #1e88e5;
+  border: none;
+  padding: 5px 10px;
+  background-color: #fff;
+  cursor: pointer;
+  border-radius: 3px;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.left {
+  float: left;
+  margin-right: 10px;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.right {
+  float: right;
+  margin-left: 10px;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.gray {
+  color: #999;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.red {
+  color: #c24f4a;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button:hover {
+  background-color: #f1f1f1;
+}
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container:after {
+  content: "";
+  display: table;
+  clear: both;
+}
+.w-e-text-container .w-e-panel-container .w-e-emoticon-container .w-e-item {
+  cursor: pointer;
+  font-size: 18px;
+  padding: 0 3px;
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+.w-e-text-container .w-e-panel-container .w-e-up-img-container {
+  text-align: center;
+}
+.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+  color: #999;
+  cursor: pointer;
+  font-size: 60px;
+  line-height: 1;
+}
+.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn:hover {
+  color: #333;
+}
+
+.w-e-text-container {
+  position: relative;
+}
+.w-e-text-container .w-e-progress {
+  position: absolute;
+  background-color: #1e88e5;
+  bottom: 0;
+  left: 0;
+  height: 1px;
+}
+.w-e-text {
+  padding: 0 10px;
+  overflow-y: scroll;
+}
+.w-e-text p,
+.w-e-text h1,
+.w-e-text h2,
+.w-e-text h3,
+.w-e-text h4,
+.w-e-text h5,
+.w-e-text table,
+.w-e-text pre {
+  margin: 10px 0;
+  line-height: 1.5;
+}
+.w-e-text ul,
+.w-e-text ol {
+  margin: 10px 0 10px 20px;
+}
+.w-e-text blockquote {
+  display: block;
+  border-left: 8px solid #d0e5f2;
+  padding: 5px 10px;
+  margin: 10px 0;
+  line-height: 1.4;
+  font-size: 100%;
+  background-color: #f1f1f1;
+}
+.w-e-text code {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+  background-color: #f1f1f1;
+  border-radius: 3px;
+  padding: 3px 5px;
+  margin: 0 3px;
+}
+.w-e-text pre code {
+  display: block;
+}
+.w-e-text table {
+  border-top: 1px solid #ccc;
+  border-left: 1px solid #ccc;
+}
+.w-e-text table td,
+.w-e-text table th {
+  border-bottom: 1px solid #ccc;
+  border-right: 1px solid #ccc;
+  padding: 3px 5px;
+}
+.w-e-text table th {
+  border-bottom: 2px solid #ccc;
+  text-align: center;
+}
+.w-e-text:focus {
+  outline: none;
+}
+.w-e-text img {
+  cursor: pointer;
+}
+.w-e-text img:hover {
+  box-shadow: 0 0 5px #333;
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/release/wangEditor.js b/novel-admin/src/main/resources/static/wangEditor/release/wangEditor.js
new file mode 100644
index 0000000..ea701f1
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/release/wangEditor.js
@@ -0,0 +1,4679 @@
+(function (global, factory) {
+	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+	typeof define === 'function' && define.amd ? define(factory) :
+	(global.wangEditor = factory());
+}(this, (function () { 'use strict';
+
+/*
+    poly-fill
+*/
+
+var polyfill = function () {
+
+    // Object.assign
+    if (typeof Object.assign != 'function') {
+        Object.assign = function (target, varArgs) {
+            // .length of function is 2
+            if (target == null) {
+                // TypeError if undefined or null
+                throw new TypeError('Cannot convert undefined or null to object');
+            }
+
+            var to = Object(target);
+
+            for (var index = 1; index < arguments.length; index++) {
+                var nextSource = arguments[index];
+
+                if (nextSource != null) {
+                    // Skip over if undefined or null
+                    for (var nextKey in nextSource) {
+                        // Avoid bugs when hasOwnProperty is shadowed
+                        if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
+                            to[nextKey] = nextSource[nextKey];
+                        }
+                    }
+                }
+            }
+            return to;
+        };
+    }
+
+    // IE 中兼容 Element.prototype.matches
+    if (!Element.prototype.matches) {
+        Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) {
+            var matches = (this.document || this.ownerDocument).querySelectorAll(s),
+                i = matches.length;
+            while (--i >= 0 && matches.item(i) !== this) {}
+            return i > -1;
+        };
+    }
+};
+
+/*
+    DOM 操作 API
+*/
+
+// 根据 html 代码片段创建 dom 对象
+function createElemByHTML(html) {
+    var div = void 0;
+    div = document.createElement('div');
+    div.innerHTML = html;
+    return div.children;
+}
+
+// 是否是 DOM List
+function isDOMList(selector) {
+    if (!selector) {
+        return false;
+    }
+    if (selector instanceof HTMLCollection || selector instanceof NodeList) {
+        return true;
+    }
+    return false;
+}
+
+// 封装 document.querySelectorAll
+function querySelectorAll(selector) {
+    var result = document.querySelectorAll(selector);
+    if (isDOMList(result)) {
+        return result;
+    } else {
+        return [result];
+    }
+}
+
+// 记录所有的事件绑定
+var eventList = [];
+
+// 创建构造函数
+function DomElement(selector) {
+    if (!selector) {
+        return;
+    }
+
+    // selector 本来就是 DomElement 对象,直接返回
+    if (selector instanceof DomElement) {
+        return selector;
+    }
+
+    this.selector = selector;
+    var nodeType = selector.nodeType;
+
+    // 根据 selector 得出的结果(如 DOM,DOM List)
+    var selectorResult = [];
+    if (nodeType === 9) {
+        // document 节点
+        selectorResult = [selector];
+    } else if (nodeType === 1) {
+        // 单个 DOM 节点
+        selectorResult = [selector];
+    } else if (isDOMList(selector) || selector instanceof Array) {
+        // DOM List 或者数组
+        selectorResult = selector;
+    } else if (typeof selector === 'string') {
+        // 字符串
+        selector = selector.replace('/\n/mg', '').trim();
+        if (selector.indexOf('<') === 0) {
+            // 如 <div>
+            selectorResult = createElemByHTML(selector);
+        } else {
+            // 如 #id .class
+            selectorResult = querySelectorAll(selector);
+        }
+    }
+
+    var length = selectorResult.length;
+    if (!length) {
+        // 空数组
+        return this;
+    }
+
+    // 加入 DOM 节点
+    var i = void 0;
+    for (i = 0; i < length; i++) {
+        this[i] = selectorResult[i];
+    }
+    this.length = length;
+}
+
+// 修改原型
+DomElement.prototype = {
+    constructor: DomElement,
+
+    // 类数组,forEach
+    forEach: function forEach(fn) {
+        var i = void 0;
+        for (i = 0; i < this.length; i++) {
+            var elem = this[i];
+            var result = fn.call(elem, elem, i);
+            if (result === false) {
+                break;
+            }
+        }
+        return this;
+    },
+
+    // clone
+    clone: function clone(deep) {
+        var cloneList = [];
+        this.forEach(function (elem) {
+            cloneList.push(elem.cloneNode(!!deep));
+        });
+        return $(cloneList);
+    },
+
+    // 获取第几个元素
+    get: function get(index) {
+        var length = this.length;
+        if (index >= length) {
+            index = index % length;
+        }
+        return $(this[index]);
+    },
+
+    // 第一个
+    first: function first() {
+        return this.get(0);
+    },
+
+    // 最后一个
+    last: function last() {
+        var length = this.length;
+        return this.get(length - 1);
+    },
+
+    // 绑定事件
+    on: function on(type, selector, fn) {
+        // selector 不为空,证明绑定事件要加代理
+        if (!fn) {
+            fn = selector;
+            selector = null;
+        }
+
+        // type 是否有多个
+        var types = [];
+        types = type.split(/\s+/);
+
+        return this.forEach(function (elem) {
+            types.forEach(function (type) {
+                if (!type) {
+                    return;
+                }
+
+                // 记录下,方便后面解绑
+                eventList.push({
+                    elem: elem,
+                    type: type,
+                    fn: fn
+                });
+
+                if (!selector) {
+                    // 无代理
+                    elem.addEventListener(type, fn);
+                    return;
+                }
+
+                // 有代理
+                elem.addEventListener(type, function (e) {
+                    var target = e.target;
+                    if (target.matches(selector)) {
+                        fn.call(target, e);
+                    }
+                });
+            });
+        });
+    },
+
+    // 取消事件绑定
+    off: function off(type, fn) {
+        return this.forEach(function (elem) {
+            elem.removeEventListener(type, fn);
+        });
+    },
+
+    // 获取/设置 属性
+    attr: function attr(key, val) {
+        if (val == null) {
+            // 获取值
+            return this[0].getAttribute(key);
+        } else {
+            // 设置值
+            return this.forEach(function (elem) {
+                elem.setAttribute(key, val);
+            });
+        }
+    },
+
+    // 添加 class
+    addClass: function addClass(className) {
+        if (!className) {
+            return this;
+        }
+        return this.forEach(function (elem) {
+            var arr = void 0;
+            if (elem.className) {
+                // 解析当前 className 转换为数组
+                arr = elem.className.split(/\s/);
+                arr = arr.filter(function (item) {
+                    return !!item.trim();
+                });
+                // 添加 class
+                if (arr.indexOf(className) < 0) {
+                    arr.push(className);
+                }
+                // 修改 elem.class
+                elem.className = arr.join(' ');
+            } else {
+                elem.className = className;
+            }
+        });
+    },
+
+    // 删除 class
+    removeClass: function removeClass(className) {
+        if (!className) {
+            return this;
+        }
+        return this.forEach(function (elem) {
+            var arr = void 0;
+            if (elem.className) {
+                // 解析当前 className 转换为数组
+                arr = elem.className.split(/\s/);
+                arr = arr.filter(function (item) {
+                    item = item.trim();
+                    // 删除 class
+                    if (!item || item === className) {
+                        return false;
+                    }
+                    return true;
+                });
+                // 修改 elem.class
+                elem.className = arr.join(' ');
+            }
+        });
+    },
+
+    // 修改 css
+    css: function css(key, val) {
+        var currentStyle = key + ':' + val + ';';
+        return this.forEach(function (elem) {
+            var style = (elem.getAttribute('style') || '').trim();
+            var styleArr = void 0,
+                resultArr = [];
+            if (style) {
+                // 将 style 按照 ; 拆分为数组
+                styleArr = style.split(';');
+                styleArr.forEach(function (item) {
+                    // 对每项样式,按照 : 拆分为 key 和 value
+                    var arr = item.split(':').map(function (i) {
+                        return i.trim();
+                    });
+                    if (arr.length === 2) {
+                        resultArr.push(arr[0] + ':' + arr[1]);
+                    }
+                });
+                // 替换或者新增
+                resultArr = resultArr.map(function (item) {
+                    if (item.indexOf(key) === 0) {
+                        return currentStyle;
+                    } else {
+                        return item;
+                    }
+                });
+                if (resultArr.indexOf(currentStyle) < 0) {
+                    resultArr.push(currentStyle);
+                }
+                // 结果
+                elem.setAttribute('style', resultArr.join('; '));
+            } else {
+                // style 无值
+                elem.setAttribute('style', currentStyle);
+            }
+        });
+    },
+
+    // 显示
+    show: function show() {
+        return this.css('display', 'block');
+    },
+
+    // 隐藏
+    hide: function hide() {
+        return this.css('display', 'none');
+    },
+
+    // 获取子节点
+    children: function children() {
+        var elem = this[0];
+        if (!elem) {
+            return null;
+        }
+
+        return $(elem.children);
+    },
+
+    // 获取子节点(包括文本节点)
+    childNodes: function childNodes() {
+        var elem = this[0];
+        if (!elem) {
+            return null;
+        }
+
+        return $(elem.childNodes);
+    },
+
+    // 增加子节点
+    append: function append($children) {
+        return this.forEach(function (elem) {
+            $children.forEach(function (child) {
+                elem.appendChild(child);
+            });
+        });
+    },
+
+    // 移除当前节点
+    remove: function remove() {
+        return this.forEach(function (elem) {
+            if (elem.remove) {
+                elem.remove();
+            } else {
+                var parent = elem.parentElement;
+                parent && parent.removeChild(elem);
+            }
+        });
+    },
+
+    // 是否包含某个子节点
+    isContain: function isContain($child) {
+        var elem = this[0];
+        var child = $child[0];
+        return elem.contains(child);
+    },
+
+    // 尺寸数据
+    getSizeData: function getSizeData() {
+        var elem = this[0];
+        return elem.getBoundingClientRect(); // 可得到 bottom height left right top width 的数据
+    },
+
+    // 封装 nodeName
+    getNodeName: function getNodeName() {
+        var elem = this[0];
+        return elem.nodeName;
+    },
+
+    // 从当前元素查找
+    find: function find(selector) {
+        var elem = this[0];
+        return $(elem.querySelectorAll(selector));
+    },
+
+    // 获取当前元素的 text
+    text: function text(val) {
+        if (!val) {
+            // 获取 text
+            var elem = this[0];
+            return elem.innerHTML.replace(/<.*?>/g, function () {
+                return '';
+            });
+        } else {
+            // 设置 text
+            return this.forEach(function (elem) {
+                elem.innerHTML = val;
+            });
+        }
+    },
+
+    // 获取 html
+    html: function html(value) {
+        var elem = this[0];
+        if (value == null) {
+            return elem.innerHTML;
+        } else {
+            elem.innerHTML = value;
+            return this;
+        }
+    },
+
+    // 获取 value
+    val: function val() {
+        var elem = this[0];
+        return elem.value.trim();
+    },
+
+    // focus
+    focus: function focus() {
+        return this.forEach(function (elem) {
+            elem.focus();
+        });
+    },
+
+    // parent
+    parent: function parent() {
+        var elem = this[0];
+        return $(elem.parentElement);
+    },
+
+    // parentUntil 找到符合 selector 的父节点
+    parentUntil: function parentUntil(selector, _currentElem) {
+        var results = document.querySelectorAll(selector);
+        var length = results.length;
+        if (!length) {
+            // 传入的 selector 无效
+            return null;
+        }
+
+        var elem = _currentElem || this[0];
+        if (elem.nodeName === 'BODY') {
+            return null;
+        }
+
+        var parent = elem.parentElement;
+        var i = void 0;
+        for (i = 0; i < length; i++) {
+            if (parent === results[i]) {
+                // 找到,并返回
+                return $(parent);
+            }
+        }
+
+        // 继续查找
+        return this.parentUntil(selector, parent);
+    },
+
+    // 判断两个 elem 是否相等
+    equal: function equal($elem) {
+        if ($elem.nodeType === 1) {
+            return this[0] === $elem;
+        } else {
+            return this[0] === $elem[0];
+        }
+    },
+
+    // 将该元素插入到某个元素前面
+    insertBefore: function insertBefore(selector) {
+        var $referenceNode = $(selector);
+        var referenceNode = $referenceNode[0];
+        if (!referenceNode) {
+            return this;
+        }
+        return this.forEach(function (elem) {
+            var parent = referenceNode.parentNode;
+            parent.insertBefore(elem, referenceNode);
+        });
+    },
+
+    // 将该元素插入到某个元素后面
+    insertAfter: function insertAfter(selector) {
+        var $referenceNode = $(selector);
+        var referenceNode = $referenceNode[0];
+        if (!referenceNode) {
+            return this;
+        }
+        return this.forEach(function (elem) {
+            var parent = referenceNode.parentNode;
+            if (parent.lastChild === referenceNode) {
+                // 最后一个元素
+                parent.appendChild(elem);
+            } else {
+                // 不是最后一个元素
+                parent.insertBefore(elem, referenceNode.nextSibling);
+            }
+        });
+    }
+};
+
+// new 一个对象
+function $(selector) {
+    return new DomElement(selector);
+}
+
+// 解绑所有事件,用于销毁编辑器
+$.offAll = function () {
+    eventList.forEach(function (item) {
+        var elem = item.elem;
+        var type = item.type;
+        var fn = item.fn;
+        // 解绑
+        elem.removeEventListener(type, fn);
+    });
+};
+
+/*
+    配置信息
+*/
+
+var config = {
+
+    // 默认菜单配置
+    menus: ['head', 'bold', 'italic', 'underline', 'strikeThrough', 'foreColor', 'backColor', 'link', 'list', 'justify', 'quote', 'emoticon', 'image', 'table', 'video', 'code', 'undo', 'redo'],
+
+    colors: ['#000000', '#eeece0', '#1c487f', '#4d80bf', '#c24f4a', '#8baa4a', '#7b5ba1', '#46acc8', '#f9963b', '#ffffff'],
+
+    // // 语言配置
+    // lang: {
+    //     '设置标题': 'title',
+    //     '正文': 'p',
+    //     '链接文字': 'link text',
+    //     '链接': 'link',
+    //     '插入': 'insert',
+    //     '创建': 'init'
+    // },
+
+    // 表情
+    emotions: [{
+        // tab 的标题
+        title: '默认',
+        // type -> 'emoji' / 'image'
+        type: 'image',
+        // content -> 数组
+        content: [{
+            alt: '[坏笑]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/50/pcmoren_huaixiao_org.png'
+        }, {
+            alt: '[舔屏]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/pcmoren_tian_org.png'
+        }, {
+            alt: '[污]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/pcmoren_wu_org.png'
+        }, {
+            alt: '[允悲]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/2c/moren_yunbei_org.png'
+        }, {
+            alt: '[笑而不语]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3a/moren_xiaoerbuyu_org.png'
+        }, {
+            alt: '[费解]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/moren_feijie_org.png'
+        }, {
+            alt: '[憧憬]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/37/moren_chongjing_org.png'
+        }, {
+            alt: '[并不简单]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/fc/moren_bbjdnew_org.png'
+        }, {
+            alt: '[微笑]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/5c/huanglianwx_org.gif'
+        }, {
+            alt: '[酷]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/8a/pcmoren_cool2017_org.png'
+        }, {
+            alt: '[嘻嘻]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/0b/tootha_org.gif'
+        }, {
+            alt: '[哈哈]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6a/laugh.gif'
+        }, {
+            alt: '[可爱]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/14/tza_org.gif'
+        }, {
+            alt: '[可怜]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/af/kl_org.gif'
+        }, {
+            alt: '[挖鼻]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/0b/wabi_org.gif'
+        }, {
+            alt: '[吃惊]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/f4/cj_org.gif'
+        }, {
+            alt: '[害羞]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6e/shamea_org.gif'
+        }, {
+            alt: '[挤眼]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/c3/zy_org.gif'
+        }, {
+            alt: '[闭嘴]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/29/bz_org.gif'
+        }, {
+            alt: '[鄙视]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/71/bs2_org.gif'
+        }, {
+            alt: '[爱你]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6d/lovea_org.gif'
+        }, {
+            alt: '[泪]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/9d/sada_org.gif'
+        }, {
+            alt: '[偷笑]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/19/heia_org.gif'
+        }, {
+            alt: '[亲亲]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/8f/qq_org.gif'
+        }, {
+            alt: '[生病]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/b6/sb_org.gif'
+        }, {
+            alt: '[太开心]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/58/mb_org.gif'
+        }, {
+            alt: '[白眼]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/d9/landeln_org.gif'
+        }, {
+            alt: '[右哼哼]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/98/yhh_org.gif'
+        }, {
+            alt: '[左哼哼]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6d/zhh_org.gif'
+        }, {
+            alt: '[嘘]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/a6/x_org.gif'
+        }, {
+            alt: '[衰]',
+            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/af/cry.gif'
+        }]
+    }, {
+        // tab 的标题
+        title: '新浪',
+        // type -> 'emoji' / 'image'
+        type: 'image',
+        // content -> 数组
+        content: [{
+            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/7a/shenshou_thumb.gif',
+            alt: '[草泥马]'
+        }, {
+            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/60/horse2_thumb.gif',
+            alt: '[神马]'
+        }, {
+            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/bc/fuyun_thumb.gif',
+            alt: '[浮云]'
+        }, {
+            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/c9/geili_thumb.gif',
+            alt: '[给力]'
+        }, {
+            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/f2/wg_thumb.gif',
+            alt: '[围观]'
+        }, {
+            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/70/vw_thumb.gif',
+            alt: '[威武]'
+        }, {
+            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/6e/panda_thumb.gif',
+            alt: '[熊猫]'
+        }, {
+            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/81/rabbit_thumb.gif',
+            alt: '[兔子]'
+        }, {
+            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/bc/otm_thumb.gif',
+            alt: '[奥特曼]'
+        }, {
+            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/15/j_thumb.gif',
+            alt: '[囧]'
+        }, {
+            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/89/hufen_thumb.gif',
+            alt: '[互粉]'
+        }, {
+            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/c4/liwu_thumb.gif',
+            alt: '[礼物]'
+        }]
+    }, {
+        // tab 的标题
+        title: 'emoji',
+        // type -> 'emoji' / 'image'
+        type: 'emoji',
+        // content -> 数组
+        content: '😀 😃 😄 😁 😆 😅 😂 😊 😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 😜 😝 😛 🤑 🤗 🤓 😎 😏 😒 😞 😔 😟 😕 🙁  😣 😖 😫 😩 😤 😠 😡 😶 😐 😑 😯 😦 😧 😮 😲 😵 😳 😱 😨 😰 😢 😥 😭 😓 😪 😴 🙄 🤔 😬 🤐'.split(/\s/)
+    }],
+
+    // 编辑区域的 z-index
+    zIndex: 10000,
+
+    // 是否开启 debug 模式(debug 模式下错误会 throw error 形式抛出)
+    debug: false,
+
+    // 插入链接时候的格式校验
+    linkCheck: function linkCheck(text, link) {
+        // text 是插入的文字
+        // link 是插入的链接
+        return true; // 返回 true 即表示成功
+        // return '校验失败' // 返回字符串即表示失败的提示信息
+    },
+
+    // 插入网络图片的校验
+    linkImgCheck: function linkImgCheck(src) {
+        // src 即图片的地址
+        return true; // 返回 true 即表示成功
+        // return '校验失败'  // 返回字符串即表示失败的提示信息
+    },
+
+    // 粘贴过滤样式,默认开启
+    pasteFilterStyle: true,
+
+    // 对粘贴的文字进行自定义处理,返回处理后的结果。编辑器会将处理后的结果粘贴到编辑区域中。
+    // IE 暂时不支持
+    pasteTextHandle: function pasteTextHandle(content) {
+        // content 即粘贴过来的内容(html 或 纯文本),可进行自定义处理然后返回
+        return content;
+    },
+
+    // onchange 事件
+    // onchange: function (html) {
+    //     // html 即变化之后的内容
+    //     console.log(html)
+    // },
+
+    // 是否显示添加网络图片的 tab
+    showLinkImg: true,
+
+    // 插入网络图片的回调
+    linkImgCallback: function linkImgCallback(url) {
+        // console.log(url)  // url 即插入图片的地址
+    },
+
+    // 默认上传图片 max size: 5M
+    uploadImgMaxSize: 5 * 1024 * 1024,
+
+    // 配置一次最多上传几个图片
+    // uploadImgMaxLength: 5,
+
+    // 上传图片,是否显示 base64 格式
+    uploadImgShowBase64: false,
+
+    // 上传图片,server 地址(如果有值,则 base64 格式的配置则失效)
+    // uploadImgServer: '/upload',
+
+    // 自定义配置 filename
+    uploadFileName: '',
+
+    // 上传图片的自定义参数
+    uploadImgParams: {
+        // token: 'abcdef12345'
+    },
+
+    // 上传图片的自定义header
+    uploadImgHeaders: {
+        // 'Accept': 'text/x-json'
+    },
+
+    // 配置 XHR withCredentials
+    withCredentials: false,
+
+    // 自定义上传图片超时时间 ms
+    uploadImgTimeout: 10000,
+
+    // 上传图片 hook 
+    uploadImgHooks: {
+        // customInsert: function (insertLinkImg, result, editor) {
+        //     console.log('customInsert')
+        //     // 图片上传并返回结果,自定义插入图片的事件,而不是编辑器自动插入图片
+        //     const data = result.data1 || []
+        //     data.forEach(link => {
+        //         insertLinkImg(link)
+        //     })
+        // },
+        before: function before(xhr, editor, files) {
+            // 图片上传之前触发
+
+            // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传
+            // return {
+            //     prevent: true,
+            //     msg: '放弃上传'
+            // }
+        },
+        success: function success(xhr, editor, result) {
+            // 图片上传并返回结果,图片插入成功之后触发
+        },
+        fail: function fail(xhr, editor, result) {
+            // 图片上传并返回结果,但图片插入错误时触发
+        },
+        error: function error(xhr, editor) {
+            // 图片上传出错时触发
+        },
+        timeout: function timeout(xhr, editor) {
+            // 图片上传超时时触发
+        }
+    },
+
+    // 是否上传七牛云,默认为 false
+    qiniu: false
+
+};
+
+/*
+    工具
+*/
+
+// 和 UA 相关的属性
+var UA = {
+    _ua: navigator.userAgent,
+
+    // 是否 webkit
+    isWebkit: function isWebkit() {
+        var reg = /webkit/i;
+        return reg.test(this._ua);
+    },
+
+    // 是否 IE
+    isIE: function isIE() {
+        return 'ActiveXObject' in window;
+    }
+};
+
+// 遍历对象
+function objForEach(obj, fn) {
+    var key = void 0,
+        result = void 0;
+    for (key in obj) {
+        if (obj.hasOwnProperty(key)) {
+            result = fn.call(obj, key, obj[key]);
+            if (result === false) {
+                break;
+            }
+        }
+    }
+}
+
+// 遍历类数组
+function arrForEach(fakeArr, fn) {
+    var i = void 0,
+        item = void 0,
+        result = void 0;
+    var length = fakeArr.length || 0;
+    for (i = 0; i < length; i++) {
+        item = fakeArr[i];
+        result = fn.call(fakeArr, item, i);
+        if (result === false) {
+            break;
+        }
+    }
+}
+
+// 获取随机数
+function getRandom(prefix) {
+    return prefix + Math.random().toString().slice(2);
+}
+
+// 替换 html 特殊字符
+function replaceHtmlSymbol(html) {
+    if (html == null) {
+        return '';
+    }
+    return html.replace(/</gm, '&lt;').replace(/>/gm, '&gt;').replace(/"/gm, '&quot;');
+}
+
+// 返回百分比的格式
+
+
+// 判断是不是 function
+function isFunction(fn) {
+    return typeof fn === 'function';
+}
+
+/*
+    bold-menu
+*/
+// 构造函数
+function Bold(editor) {
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-bold"><i/>\n        </div>');
+    this.type = 'click';
+
+    // 当前是否 active 状态
+    this._active = false;
+}
+
+// 原型
+Bold.prototype = {
+    constructor: Bold,
+
+    // 点击事件
+    onClick: function onClick(e) {
+        // 点击菜单将触发这里
+
+        var editor = this.editor;
+        var isSeleEmpty = editor.selection.isSelectionEmpty();
+
+        if (isSeleEmpty) {
+            // 选区是空的,插入并选中一个“空白”
+            editor.selection.createEmptyRange();
+        }
+
+        // 执行 bold 命令
+        editor.cmd.do('bold');
+
+        if (isSeleEmpty) {
+            // 需要将选取折叠起来
+            editor.selection.collapseRange();
+            editor.selection.restoreSelection();
+        }
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function tryChangeActive(e) {
+        var editor = this.editor;
+        var $elem = this.$elem;
+        if (editor.cmd.queryCommandState('bold')) {
+            this._active = true;
+            $elem.addClass('w-e-active');
+        } else {
+            this._active = false;
+            $elem.removeClass('w-e-active');
+        }
+    }
+};
+
+/*
+    替换多语言
+ */
+
+var replaceLang = function (editor, str) {
+    var langArgs = editor.config.langArgs || [];
+    var result = str;
+
+    langArgs.forEach(function (item) {
+        var reg = item.reg;
+        var val = item.val;
+
+        if (reg.test(result)) {
+            result = result.replace(reg, function () {
+                return val;
+            });
+        }
+    });
+
+    return result;
+};
+
+/*
+    droplist
+*/
+var _emptyFn = function _emptyFn() {};
+
+// 构造函数
+function DropList(menu, opt) {
+    var _this = this;
+
+    // droplist 所依附的菜单
+    var editor = menu.editor;
+    this.menu = menu;
+    this.opt = opt;
+    // 容器
+    var $container = $('<div class="w-e-droplist"></div>');
+
+    // 标题
+    var $title = opt.$title;
+    var titleHtml = void 0;
+    if ($title) {
+        // 替换多语言
+        titleHtml = $title.html();
+        titleHtml = replaceLang(editor, titleHtml);
+        $title.html(titleHtml);
+
+        $title.addClass('w-e-dp-title');
+        $container.append($title);
+    }
+
+    var list = opt.list || [];
+    var type = opt.type || 'list'; // 'list' 列表形式(如“标题”菜单) / 'inline-block' 块状形式(如“颜色”菜单)
+    var onClick = opt.onClick || _emptyFn;
+
+    // 加入 DOM 并绑定事件
+    var $list = $('<ul class="' + (type === 'list' ? 'w-e-list' : 'w-e-block') + '"></ul>');
+    $container.append($list);
+    list.forEach(function (item) {
+        var $elem = item.$elem;
+
+        // 替换多语言
+        var elemHtml = $elem.html();
+        elemHtml = replaceLang(editor, elemHtml);
+        $elem.html(elemHtml);
+
+        var value = item.value;
+        var $li = $('<li class="w-e-item"></li>');
+        if ($elem) {
+            $li.append($elem);
+            $list.append($li);
+            $li.on('click', function (e) {
+                onClick(value);
+
+                // 隐藏
+                _this.hideTimeoutId = setTimeout(function () {
+                    _this.hide();
+                }, 0);
+            });
+        }
+    });
+
+    // 绑定隐藏事件
+    $container.on('mouseleave', function (e) {
+        _this.hideTimeoutId = setTimeout(function () {
+            _this.hide();
+        }, 0);
+    });
+
+    // 记录属性
+    this.$container = $container;
+
+    // 基本属性
+    this._rendered = false;
+    this._show = false;
+}
+
+// 原型
+DropList.prototype = {
+    constructor: DropList,
+
+    // 显示(插入DOM)
+    show: function show() {
+        if (this.hideTimeoutId) {
+            // 清除之前的定时隐藏
+            clearTimeout(this.hideTimeoutId);
+        }
+
+        var menu = this.menu;
+        var $menuELem = menu.$elem;
+        var $container = this.$container;
+        if (this._show) {
+            return;
+        }
+        if (this._rendered) {
+            // 显示
+            $container.show();
+        } else {
+            // 加入 DOM 之前先定位位置
+            var menuHeight = $menuELem.getSizeData().height || 0;
+            var width = this.opt.width || 100; // 默认为 100
+            $container.css('margin-top', menuHeight + 'px').css('width', width + 'px');
+
+            // 加入到 DOM
+            $menuELem.append($container);
+            this._rendered = true;
+        }
+
+        // 修改属性
+        this._show = true;
+    },
+
+    // 隐藏(移除DOM)
+    hide: function hide() {
+        if (this.showTimeoutId) {
+            // 清除之前的定时显示
+            clearTimeout(this.showTimeoutId);
+        }
+
+        var $container = this.$container;
+        if (!this._show) {
+            return;
+        }
+        // 隐藏并需改属性
+        $container.hide();
+        this._show = false;
+    }
+};
+
+/*
+    menu - header
+*/
+// 构造函数
+function Head(editor) {
+    var _this = this;
+
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-header"><i/></div>');
+    this.type = 'droplist';
+
+    // 当前是否 active 状态
+    this._active = false;
+
+    // 初始化 droplist
+    this.droplist = new DropList(this, {
+        width: 100,
+        $title: $('<p>设置标题</p>'),
+        type: 'list', // droplist 以列表形式展示
+        list: [{ $elem: $('<h1>H1</h1>'), value: '<h1>' }, { $elem: $('<h2>H2</h2>'), value: '<h2>' }, { $elem: $('<h3>H3</h3>'), value: '<h3>' }, { $elem: $('<h4>H4</h4>'), value: '<h4>' }, { $elem: $('<h5>H5</h5>'), value: '<h5>' }, { $elem: $('<p>正文</p>'), value: '<p>' }],
+        onClick: function onClick(value) {
+            // 注意 this 是指向当前的 Head 对象
+            _this._command(value);
+        }
+    });
+}
+
+// 原型
+Head.prototype = {
+    constructor: Head,
+
+    // 执行命令
+    _command: function _command(value) {
+        var editor = this.editor;
+
+        var $selectionElem = editor.selection.getSelectionContainerElem();
+        if (editor.$textElem.equal($selectionElem)) {
+            // 不能选中多行来设置标题,否则会出现问题
+            // 例如选中的是 <p>xxx</p><p>yyy</p> 来设置标题,设置之后会成为 <h1>xxx<br>yyy</h1> 不符合预期
+            return;
+        }
+
+        editor.cmd.do('formatBlock', value);
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function tryChangeActive(e) {
+        var editor = this.editor;
+        var $elem = this.$elem;
+        var reg = /^h/i;
+        var cmdValue = editor.cmd.queryCommandValue('formatBlock');
+        if (reg.test(cmdValue)) {
+            this._active = true;
+            $elem.addClass('w-e-active');
+        } else {
+            this._active = false;
+            $elem.removeClass('w-e-active');
+        }
+    }
+};
+
+/*
+    panel
+*/
+
+var emptyFn = function emptyFn() {};
+
+// 记录已经显示 panel 的菜单
+var _isCreatedPanelMenus = [];
+
+// 构造函数
+function Panel(menu, opt) {
+    this.menu = menu;
+    this.opt = opt;
+}
+
+// 原型
+Panel.prototype = {
+    constructor: Panel,
+
+    // 显示(插入DOM)
+    show: function show() {
+        var _this = this;
+
+        var menu = this.menu;
+        if (_isCreatedPanelMenus.indexOf(menu) >= 0) {
+            // 该菜单已经创建了 panel 不能再创建
+            return;
+        }
+
+        var editor = menu.editor;
+        var $body = $('body');
+        var $textContainerElem = editor.$textContainerElem;
+        var opt = this.opt;
+
+        // panel 的容器
+        var $container = $('<div class="w-e-panel-container"></div>');
+        var width = opt.width || 300; // 默认 300px
+        $container.css('width', width + 'px').css('margin-left', (0 - width) / 2 + 'px');
+
+        // 添加关闭按钮
+        var $closeBtn = $('<i class="w-e-icon-close w-e-panel-close"></i>');
+        $container.append($closeBtn);
+        $closeBtn.on('click', function () {
+            _this.hide();
+        });
+
+        // 准备 tabs 容器
+        var $tabTitleContainer = $('<ul class="w-e-panel-tab-title"></ul>');
+        var $tabContentContainer = $('<div class="w-e-panel-tab-content"></div>');
+        $container.append($tabTitleContainer).append($tabContentContainer);
+
+        // 设置高度
+        var height = opt.height;
+        if (height) {
+            $tabContentContainer.css('height', height + 'px').css('overflow-y', 'auto');
+        }
+
+        // tabs
+        var tabs = opt.tabs || [];
+        var tabTitleArr = [];
+        var tabContentArr = [];
+        tabs.forEach(function (tab, tabIndex) {
+            if (!tab) {
+                return;
+            }
+            var title = tab.title || '';
+            var tpl = tab.tpl || '';
+
+            // 替换多语言
+            title = replaceLang(editor, title);
+            tpl = replaceLang(editor, tpl);
+
+            // 添加到 DOM
+            var $title = $('<li class="w-e-item">' + title + '</li>');
+            $tabTitleContainer.append($title);
+            var $content = $(tpl);
+            $tabContentContainer.append($content);
+
+            // 记录到内存
+            $title._index = tabIndex;
+            tabTitleArr.push($title);
+            tabContentArr.push($content);
+
+            // 设置 active 项
+            if (tabIndex === 0) {
+                $title._active = true;
+                $title.addClass('w-e-active');
+            } else {
+                $content.hide();
+            }
+
+            // 绑定 tab 的事件
+            $title.on('click', function (e) {
+                if ($title._active) {
+                    return;
+                }
+                // 隐藏所有的 tab
+                tabTitleArr.forEach(function ($title) {
+                    $title._active = false;
+                    $title.removeClass('w-e-active');
+                });
+                tabContentArr.forEach(function ($content) {
+                    $content.hide();
+                });
+
+                // 显示当前的 tab
+                $title._active = true;
+                $title.addClass('w-e-active');
+                $content.show();
+            });
+        });
+
+        // 绑定关闭事件
+        $container.on('click', function (e) {
+            // 点击时阻止冒泡
+            e.stopPropagation();
+        });
+        $body.on('click', function (e) {
+            _this.hide();
+        });
+
+        // 添加到 DOM
+        $textContainerElem.append($container);
+
+        // 绑定 opt 的事件,只有添加到 DOM 之后才能绑定成功
+        tabs.forEach(function (tab, index) {
+            if (!tab) {
+                return;
+            }
+            var events = tab.events || [];
+            events.forEach(function (event) {
+                var selector = event.selector;
+                var type = event.type;
+                var fn = event.fn || emptyFn;
+                var $content = tabContentArr[index];
+                $content.find(selector).on(type, function (e) {
+                    e.stopPropagation();
+                    var needToHide = fn(e);
+                    // 执行完事件之后,是否要关闭 panel
+                    if (needToHide) {
+                        _this.hide();
+                    }
+                });
+            });
+        });
+
+        // focus 第一个 elem
+        var $inputs = $container.find('input[type=text],textarea');
+        if ($inputs.length) {
+            $inputs.get(0).focus();
+        }
+
+        // 添加到属性
+        this.$container = $container;
+
+        // 隐藏其他 panel
+        this._hideOtherPanels();
+        // 记录该 menu 已经创建了 panel
+        _isCreatedPanelMenus.push(menu);
+    },
+
+    // 隐藏(移除DOM)
+    hide: function hide() {
+        var menu = this.menu;
+        var $container = this.$container;
+        if ($container) {
+            $container.remove();
+        }
+
+        // 将该 menu 记录中移除
+        _isCreatedPanelMenus = _isCreatedPanelMenus.filter(function (item) {
+            if (item === menu) {
+                return false;
+            } else {
+                return true;
+            }
+        });
+    },
+
+    // 一个 panel 展示时,隐藏其他 panel
+    _hideOtherPanels: function _hideOtherPanels() {
+        if (!_isCreatedPanelMenus.length) {
+            return;
+        }
+        _isCreatedPanelMenus.forEach(function (menu) {
+            var panel = menu.panel || {};
+            if (panel.hide) {
+                panel.hide();
+            }
+        });
+    }
+};
+
+/*
+    menu - link
+*/
+// 构造函数
+function Link(editor) {
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-link"><i/></div>');
+    this.type = 'panel';
+
+    // 当前是否 active 状态
+    this._active = false;
+}
+
+// 原型
+Link.prototype = {
+    constructor: Link,
+
+    // 点击事件
+    onClick: function onClick(e) {
+        var editor = this.editor;
+        var $linkelem = void 0;
+
+        if (this._active) {
+            // 当前选区在链接里面
+            $linkelem = editor.selection.getSelectionContainerElem();
+            if (!$linkelem) {
+                return;
+            }
+            // 将该元素都包含在选取之内,以便后面整体替换
+            editor.selection.createRangeByElem($linkelem);
+            editor.selection.restoreSelection();
+            // 显示 panel
+            this._createPanel($linkelem.text(), $linkelem.attr('href'));
+        } else {
+            // 当前选区不在链接里面
+            if (editor.selection.isSelectionEmpty()) {
+                // 选区是空的,未选中内容
+                this._createPanel('', '');
+            } else {
+                // 选中内容了
+                this._createPanel(editor.selection.getSelectionText(), '');
+            }
+        }
+    },
+
+    // 创建 panel
+    _createPanel: function _createPanel(text, link) {
+        var _this = this;
+
+        // panel 中需要用到的id
+        var inputLinkId = getRandom('input-link');
+        var inputTextId = getRandom('input-text');
+        var btnOkId = getRandom('btn-ok');
+        var btnDelId = getRandom('btn-del');
+
+        // 是否显示“删除链接”
+        var delBtnDisplay = this._active ? 'inline-block' : 'none';
+
+        // 初始化并显示 panel
+        var panel = new Panel(this, {
+            width: 300,
+            // panel 中可包含多个 tab
+            tabs: [{
+                // tab 的标题
+                title: '链接',
+                // 模板
+                tpl: '<div>\n                            <input id="' + inputTextId + '" type="text" class="block" value="' + text + '" placeholder="\u94FE\u63A5\u6587\u5B57"/></td>\n                            <input id="' + inputLinkId + '" type="text" class="block" value="' + link + '" placeholder="http://..."/></td>\n                            <div class="w-e-button-container">\n                                <button id="' + btnOkId + '" class="right">\u63D2\u5165</button>\n                                <button id="' + btnDelId + '" class="gray right" style="display:' + delBtnDisplay + '">\u5220\u9664\u94FE\u63A5</button>\n                            </div>\n                        </div>',
+                // 事件绑定
+                events: [
+                // 插入链接
+                {
+                    selector: '#' + btnOkId,
+                    type: 'click',
+                    fn: function fn() {
+                        // 执行插入链接
+                        var $link = $('#' + inputLinkId);
+                        var $text = $('#' + inputTextId);
+                        var link = $link.val();
+                        var text = $text.val();
+                        _this._insertLink(text, link);
+
+                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                        return true;
+                    }
+                },
+                // 删除链接
+                {
+                    selector: '#' + btnDelId,
+                    type: 'click',
+                    fn: function fn() {
+                        // 执行删除链接
+                        _this._delLink();
+
+                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                        return true;
+                    }
+                }]
+            } // tab end
+            ] // tabs end
+        });
+
+        // 显示 panel
+        panel.show();
+
+        // 记录属性
+        this.panel = panel;
+    },
+
+    // 删除当前链接
+    _delLink: function _delLink() {
+        if (!this._active) {
+            return;
+        }
+        var editor = this.editor;
+        var $selectionELem = editor.selection.getSelectionContainerElem();
+        if (!$selectionELem) {
+            return;
+        }
+        var selectionText = editor.selection.getSelectionText();
+        editor.cmd.do('insertHTML', '<span>' + selectionText + '</span>');
+    },
+
+    // 插入链接
+    _insertLink: function _insertLink(text, link) {
+        var editor = this.editor;
+        var config = editor.config;
+        var linkCheck = config.linkCheck;
+        var checkResult = true; // 默认为 true
+        if (linkCheck && typeof linkCheck === 'function') {
+            checkResult = linkCheck(text, link);
+        }
+        if (checkResult === true) {
+            editor.cmd.do('insertHTML', '<a href="' + link + '" target="_blank">' + text + '</a>');
+        } else {
+            alert(checkResult);
+        }
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function tryChangeActive(e) {
+        var editor = this.editor;
+        var $elem = this.$elem;
+        var $selectionELem = editor.selection.getSelectionContainerElem();
+        if (!$selectionELem) {
+            return;
+        }
+        if ($selectionELem.getNodeName() === 'A') {
+            this._active = true;
+            $elem.addClass('w-e-active');
+        } else {
+            this._active = false;
+            $elem.removeClass('w-e-active');
+        }
+    }
+};
+
+/*
+    italic-menu
+*/
+// 构造函数
+function Italic(editor) {
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-italic"><i/>\n        </div>');
+    this.type = 'click';
+
+    // 当前是否 active 状态
+    this._active = false;
+}
+
+// 原型
+Italic.prototype = {
+    constructor: Italic,
+
+    // 点击事件
+    onClick: function onClick(e) {
+        // 点击菜单将触发这里
+
+        var editor = this.editor;
+        var isSeleEmpty = editor.selection.isSelectionEmpty();
+
+        if (isSeleEmpty) {
+            // 选区是空的,插入并选中一个“空白”
+            editor.selection.createEmptyRange();
+        }
+
+        // 执行 italic 命令
+        editor.cmd.do('italic');
+
+        if (isSeleEmpty) {
+            // 需要将选取折叠起来
+            editor.selection.collapseRange();
+            editor.selection.restoreSelection();
+        }
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function tryChangeActive(e) {
+        var editor = this.editor;
+        var $elem = this.$elem;
+        if (editor.cmd.queryCommandState('italic')) {
+            this._active = true;
+            $elem.addClass('w-e-active');
+        } else {
+            this._active = false;
+            $elem.removeClass('w-e-active');
+        }
+    }
+};
+
+/*
+    redo-menu
+*/
+// 构造函数
+function Redo(editor) {
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-redo"><i/>\n        </div>');
+    this.type = 'click';
+
+    // 当前是否 active 状态
+    this._active = false;
+}
+
+// 原型
+Redo.prototype = {
+    constructor: Redo,
+
+    // 点击事件
+    onClick: function onClick(e) {
+        // 点击菜单将触发这里
+
+        var editor = this.editor;
+
+        // 执行 redo 命令
+        editor.cmd.do('redo');
+    }
+};
+
+/*
+    strikeThrough-menu
+*/
+// 构造函数
+function StrikeThrough(editor) {
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-strikethrough"><i/>\n        </div>');
+    this.type = 'click';
+
+    // 当前是否 active 状态
+    this._active = false;
+}
+
+// 原型
+StrikeThrough.prototype = {
+    constructor: StrikeThrough,
+
+    // 点击事件
+    onClick: function onClick(e) {
+        // 点击菜单将触发这里
+
+        var editor = this.editor;
+        var isSeleEmpty = editor.selection.isSelectionEmpty();
+
+        if (isSeleEmpty) {
+            // 选区是空的,插入并选中一个“空白”
+            editor.selection.createEmptyRange();
+        }
+
+        // 执行 strikeThrough 命令
+        editor.cmd.do('strikeThrough');
+
+        if (isSeleEmpty) {
+            // 需要将选取折叠起来
+            editor.selection.collapseRange();
+            editor.selection.restoreSelection();
+        }
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function tryChangeActive(e) {
+        var editor = this.editor;
+        var $elem = this.$elem;
+        if (editor.cmd.queryCommandState('strikeThrough')) {
+            this._active = true;
+            $elem.addClass('w-e-active');
+        } else {
+            this._active = false;
+            $elem.removeClass('w-e-active');
+        }
+    }
+};
+
+/*
+    underline-menu
+*/
+// 构造函数
+function Underline(editor) {
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-underline"><i/>\n        </div>');
+    this.type = 'click';
+
+    // 当前是否 active 状态
+    this._active = false;
+}
+
+// 原型
+Underline.prototype = {
+    constructor: Underline,
+
+    // 点击事件
+    onClick: function onClick(e) {
+        // 点击菜单将触发这里
+
+        var editor = this.editor;
+        var isSeleEmpty = editor.selection.isSelectionEmpty();
+
+        if (isSeleEmpty) {
+            // 选区是空的,插入并选中一个“空白”
+            editor.selection.createEmptyRange();
+        }
+
+        // 执行 underline 命令
+        editor.cmd.do('underline');
+
+        if (isSeleEmpty) {
+            // 需要将选取折叠起来
+            editor.selection.collapseRange();
+            editor.selection.restoreSelection();
+        }
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function tryChangeActive(e) {
+        var editor = this.editor;
+        var $elem = this.$elem;
+        if (editor.cmd.queryCommandState('underline')) {
+            this._active = true;
+            $elem.addClass('w-e-active');
+        } else {
+            this._active = false;
+            $elem.removeClass('w-e-active');
+        }
+    }
+};
+
+/*
+    undo-menu
+*/
+// 构造函数
+function Undo(editor) {
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-undo"><i/>\n        </div>');
+    this.type = 'click';
+
+    // 当前是否 active 状态
+    this._active = false;
+}
+
+// 原型
+Undo.prototype = {
+    constructor: Undo,
+
+    // 点击事件
+    onClick: function onClick(e) {
+        // 点击菜单将触发这里
+
+        var editor = this.editor;
+
+        // 执行 undo 命令
+        editor.cmd.do('undo');
+    }
+};
+
+/*
+    menu - list
+*/
+// 构造函数
+function List(editor) {
+    var _this = this;
+
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-list2"><i/></div>');
+    this.type = 'droplist';
+
+    // 当前是否 active 状态
+    this._active = false;
+
+    // 初始化 droplist
+    this.droplist = new DropList(this, {
+        width: 120,
+        $title: $('<p>设置列表</p>'),
+        type: 'list', // droplist 以列表形式展示
+        list: [{ $elem: $('<span><i class="w-e-icon-list-numbered"></i> 有序列表</span>'), value: 'insertOrderedList' }, { $elem: $('<span><i class="w-e-icon-list2"></i> 无序列表</span>'), value: 'insertUnorderedList' }],
+        onClick: function onClick(value) {
+            // 注意 this 是指向当前的 List 对象
+            _this._command(value);
+        }
+    });
+}
+
+// 原型
+List.prototype = {
+    constructor: List,
+
+    // 执行命令
+    _command: function _command(value) {
+        var editor = this.editor;
+        var $textElem = editor.$textElem;
+        editor.selection.restoreSelection();
+        if (editor.cmd.queryCommandState(value)) {
+            return;
+        }
+        editor.cmd.do(value);
+
+        // 验证列表是否被包裹在 <p> 之内
+        var $selectionElem = editor.selection.getSelectionContainerElem();
+        if ($selectionElem.getNodeName() === 'LI') {
+            $selectionElem = $selectionElem.parent();
+        }
+        if (/^ol|ul$/i.test($selectionElem.getNodeName()) === false) {
+            return;
+        }
+        if ($selectionElem.equal($textElem)) {
+            // 证明是顶级标签,没有被 <p> 包裹
+            return;
+        }
+        var $parent = $selectionElem.parent();
+        if ($parent.equal($textElem)) {
+            // $parent 是顶级标签,不能删除
+            return;
+        }
+
+        $selectionElem.insertAfter($parent);
+        $parent.remove();
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function tryChangeActive(e) {
+        var editor = this.editor;
+        var $elem = this.$elem;
+        if (editor.cmd.queryCommandState('insertUnOrderedList') || editor.cmd.queryCommandState('insertOrderedList')) {
+            this._active = true;
+            $elem.addClass('w-e-active');
+        } else {
+            this._active = false;
+            $elem.removeClass('w-e-active');
+        }
+    }
+};
+
+/*
+    menu - justify
+*/
+// 构造函数
+function Justify(editor) {
+    var _this = this;
+
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-paragraph-left"><i/></div>');
+    this.type = 'droplist';
+
+    // 当前是否 active 状态
+    this._active = false;
+
+    // 初始化 droplist
+    this.droplist = new DropList(this, {
+        width: 100,
+        $title: $('<p>对齐方式</p>'),
+        type: 'list', // droplist 以列表形式展示
+        list: [{ $elem: $('<span><i class="w-e-icon-paragraph-left"></i> 靠左</span>'), value: 'justifyLeft' }, { $elem: $('<span><i class="w-e-icon-paragraph-center"></i> 居中</span>'), value: 'justifyCenter' }, { $elem: $('<span><i class="w-e-icon-paragraph-right"></i> 靠右</span>'), value: 'justifyRight' }],
+        onClick: function onClick(value) {
+            // 注意 this 是指向当前的 List 对象
+            _this._command(value);
+        }
+    });
+}
+
+// 原型
+Justify.prototype = {
+    constructor: Justify,
+
+    // 执行命令
+    _command: function _command(value) {
+        var editor = this.editor;
+        editor.cmd.do(value);
+    }
+};
+
+/*
+    menu - Forecolor
+*/
+// 构造函数
+function ForeColor(editor) {
+    var _this = this;
+
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-pencil2"><i/></div>');
+    this.type = 'droplist';
+
+    // 获取配置的颜色
+    var config = editor.config;
+    var colors = config.colors || [];
+
+    // 当前是否 active 状态
+    this._active = false;
+
+    // 初始化 droplist
+    this.droplist = new DropList(this, {
+        width: 120,
+        $title: $('<p>文字颜色</p>'),
+        type: 'inline-block', // droplist 内容以 block 形式展示
+        list: colors.map(function (color) {
+            return { $elem: $('<i style="color:' + color + ';" class="w-e-icon-pencil2"></i>'), value: color };
+        }),
+        onClick: function onClick(value) {
+            // 注意 this 是指向当前的 ForeColor 对象
+            _this._command(value);
+        }
+    });
+}
+
+// 原型
+ForeColor.prototype = {
+    constructor: ForeColor,
+
+    // 执行命令
+    _command: function _command(value) {
+        var editor = this.editor;
+        editor.cmd.do('foreColor', value);
+    }
+};
+
+/*
+    menu - BackColor
+*/
+// 构造函数
+function BackColor(editor) {
+    var _this = this;
+
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-paint-brush"><i/></div>');
+    this.type = 'droplist';
+
+    // 获取配置的颜色
+    var config = editor.config;
+    var colors = config.colors || [];
+
+    // 当前是否 active 状态
+    this._active = false;
+
+    // 初始化 droplist
+    this.droplist = new DropList(this, {
+        width: 120,
+        $title: $('<p>背景色</p>'),
+        type: 'inline-block', // droplist 内容以 block 形式展示
+        list: colors.map(function (color) {
+            return { $elem: $('<i style="color:' + color + ';" class="w-e-icon-paint-brush"></i>'), value: color };
+        }),
+        onClick: function onClick(value) {
+            // 注意 this 是指向当前的 BackColor 对象
+            _this._command(value);
+        }
+    });
+}
+
+// 原型
+BackColor.prototype = {
+    constructor: BackColor,
+
+    // 执行命令
+    _command: function _command(value) {
+        var editor = this.editor;
+        editor.cmd.do('backColor', value);
+    }
+};
+
+/*
+    menu - quote
+*/
+// 构造函数
+function Quote(editor) {
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-quotes-left"><i/>\n        </div>');
+    this.type = 'click';
+
+    // 当前是否 active 状态
+    this._active = false;
+}
+
+// 原型
+Quote.prototype = {
+    constructor: Quote,
+
+    onClick: function onClick(e) {
+        var editor = this.editor;
+        var $selectionElem = editor.selection.getSelectionContainerElem();
+        var nodeName = $selectionElem.getNodeName();
+
+        if (!UA.isIE()) {
+            if (nodeName === 'BLOCKQUOTE') {
+                // 撤销 quote
+                editor.cmd.do('formatBlock', '<P>');
+            } else {
+                // 转换为 quote
+                editor.cmd.do('formatBlock', '<BLOCKQUOTE>');
+            }
+            return;
+        }
+
+        // IE 中不支持 formatBlock <BLOCKQUOTE> ,要用其他方式兼容
+        var content = void 0,
+            $targetELem = void 0;
+        if (nodeName === 'P') {
+            // 将 P 转换为 quote
+            content = $selectionElem.text();
+            $targetELem = $('<blockquote>' + content + '</blockquote>');
+            $targetELem.insertAfter($selectionElem);
+            $selectionElem.remove();
+            return;
+        }
+        if (nodeName === 'BLOCKQUOTE') {
+            // 撤销 quote
+            content = $selectionElem.text();
+            $targetELem = $('<p>' + content + '</p>');
+            $targetELem.insertAfter($selectionElem);
+            $selectionElem.remove();
+        }
+    },
+
+    tryChangeActive: function tryChangeActive(e) {
+        var editor = this.editor;
+        var $elem = this.$elem;
+        var reg = /^BLOCKQUOTE$/i;
+        var cmdValue = editor.cmd.queryCommandValue('formatBlock');
+        if (reg.test(cmdValue)) {
+            this._active = true;
+            $elem.addClass('w-e-active');
+        } else {
+            this._active = false;
+            $elem.removeClass('w-e-active');
+        }
+    }
+};
+
+/*
+    menu - code
+*/
+// 构造函数
+function Code(editor) {
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-terminal"><i/>\n        </div>');
+    this.type = 'panel';
+
+    // 当前是否 active 状态
+    this._active = false;
+}
+
+// 原型
+Code.prototype = {
+    constructor: Code,
+
+    onClick: function onClick(e) {
+        var editor = this.editor;
+        var $startElem = editor.selection.getSelectionStartElem();
+        var $endElem = editor.selection.getSelectionEndElem();
+        var isSeleEmpty = editor.selection.isSelectionEmpty();
+        var selectionText = editor.selection.getSelectionText();
+        var $code = void 0;
+
+        if (!$startElem.equal($endElem)) {
+            // 跨元素选择,不做处理
+            editor.selection.restoreSelection();
+            return;
+        }
+        if (!isSeleEmpty) {
+            // 选取不是空,用 <code> 包裹即可
+            $code = $('<code>' + selectionText + '</code>');
+            editor.cmd.do('insertElem', $code);
+            editor.selection.createRangeByElem($code, false);
+            editor.selection.restoreSelection();
+            return;
+        }
+
+        // 选取是空,且没有夸元素选择,则插入 <pre><code></code></prev>
+        if (this._active) {
+            // 选中状态,将编辑内容
+            this._createPanel($startElem.html());
+        } else {
+            // 未选中状态,将创建内容
+            this._createPanel();
+        }
+    },
+
+    _createPanel: function _createPanel(value) {
+        var _this = this;
+
+        // value - 要编辑的内容
+        value = value || '';
+        var type = !value ? 'new' : 'edit';
+        var textId = getRandom('texxt');
+        var btnId = getRandom('btn');
+
+        var panel = new Panel(this, {
+            width: 500,
+            // 一个 Panel 包含多个 tab
+            tabs: [{
+                // 标题
+                title: '插入代码',
+                // 模板
+                tpl: '<div>\n                        <textarea id="' + textId + '" style="height:145px;;">' + value + '</textarea>\n                        <div class="w-e-button-container">\n                            <button id="' + btnId + '" class="right">\u63D2\u5165</button>\n                        </div>\n                    <div>',
+                // 事件绑定
+                events: [
+                // 插入代码
+                {
+                    selector: '#' + btnId,
+                    type: 'click',
+                    fn: function fn() {
+                        var $text = $('#' + textId);
+                        var text = $text.val() || $text.html();
+                        text = replaceHtmlSymbol(text);
+                        if (type === 'new') {
+                            // 新插入
+                            _this._insertCode(text);
+                        } else {
+                            // 编辑更新
+                            _this._updateCode(text);
+                        }
+
+                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                        return true;
+                    }
+                }]
+            } // first tab end
+            ] // tabs end
+        }); // new Panel end
+
+        // 显示 panel
+        panel.show();
+
+        // 记录属性
+        this.panel = panel;
+    },
+
+    // 插入代码
+    _insertCode: function _insertCode(value) {
+        var editor = this.editor;
+        editor.cmd.do('insertHTML', '<pre><code>' + value + '</code></pre><p><br></p>');
+    },
+
+    // 更新代码
+    _updateCode: function _updateCode(value) {
+        var editor = this.editor;
+        var $selectionELem = editor.selection.getSelectionContainerElem();
+        if (!$selectionELem) {
+            return;
+        }
+        $selectionELem.html(value);
+        editor.selection.restoreSelection();
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function tryChangeActive(e) {
+        var editor = this.editor;
+        var $elem = this.$elem;
+        var $selectionELem = editor.selection.getSelectionContainerElem();
+        if (!$selectionELem) {
+            return;
+        }
+        var $parentElem = $selectionELem.parent();
+        if ($selectionELem.getNodeName() === 'CODE' && $parentElem.getNodeName() === 'PRE') {
+            this._active = true;
+            $elem.addClass('w-e-active');
+        } else {
+            this._active = false;
+            $elem.removeClass('w-e-active');
+        }
+    }
+};
+
+/*
+    menu - emoticon
+*/
+// 构造函数
+function Emoticon(editor) {
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu">\n            <i class="w-e-icon-happy"><i/>\n        </div>');
+    this.type = 'panel';
+
+    // 当前是否 active 状态
+    this._active = false;
+}
+
+// 原型
+Emoticon.prototype = {
+    constructor: Emoticon,
+
+    onClick: function onClick() {
+        this._createPanel();
+    },
+
+    _createPanel: function _createPanel() {
+        var _this = this;
+
+        var editor = this.editor;
+        var config = editor.config;
+        // 获取表情配置
+        var emotions = config.emotions || [];
+
+        // 创建表情 dropPanel 的配置
+        var tabConfig = [];
+        emotions.forEach(function (emotData) {
+            var emotType = emotData.type;
+            var content = emotData.content || [];
+
+            // 这一组表情最终拼接出来的 html
+            var faceHtml = '';
+
+            // emoji 表情
+            if (emotType === 'emoji') {
+                content.forEach(function (item) {
+                    if (item) {
+                        faceHtml += '<span class="w-e-item">' + item + '</span>';
+                    }
+                });
+            }
+            // 图片表情
+            if (emotType === 'image') {
+                content.forEach(function (item) {
+                    var src = item.src;
+                    var alt = item.alt;
+                    if (src) {
+                        // 加一个 data-w-e 属性,点击图片的时候不再提示编辑图片
+                        faceHtml += '<span class="w-e-item"><img src="' + src + '" alt="' + alt + '" data-w-e="1"/></span>';
+                    }
+                });
+            }
+
+            tabConfig.push({
+                title: emotData.title,
+                tpl: '<div class="w-e-emoticon-container">' + faceHtml + '</div>',
+                events: [{
+                    selector: 'span.w-e-item',
+                    type: 'click',
+                    fn: function fn(e) {
+                        var target = e.target;
+                        var $target = $(target);
+                        var nodeName = $target.getNodeName();
+
+                        var insertHtml = void 0;
+                        if (nodeName === 'IMG') {
+                            // 插入图片
+                            insertHtml = $target.parent().html();
+                        } else {
+                            // 插入 emoji
+                            insertHtml = '<span>' + $target.html() + '</span>';
+                        }
+
+                        _this._insert(insertHtml);
+                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                        return true;
+                    }
+                }]
+            });
+        });
+
+        var panel = new Panel(this, {
+            width: 300,
+            height: 200,
+            // 一个 Panel 包含多个 tab
+            tabs: tabConfig
+        });
+
+        // 显示 panel
+        panel.show();
+
+        // 记录属性
+        this.panel = panel;
+    },
+
+    // 插入表情
+    _insert: function _insert(emotHtml) {
+        var editor = this.editor;
+        editor.cmd.do('insertHTML', emotHtml);
+    }
+};
+
+/*
+    menu - table
+*/
+// 构造函数
+function Table(editor) {
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-table2"><i/></div>');
+    this.type = 'panel';
+
+    // 当前是否 active 状态
+    this._active = false;
+}
+
+// 原型
+Table.prototype = {
+    constructor: Table,
+
+    onClick: function onClick() {
+        if (this._active) {
+            // 编辑现有表格
+            this._createEditPanel();
+        } else {
+            // 插入新表格
+            this._createInsertPanel();
+        }
+    },
+
+    // 创建插入新表格的 panel
+    _createInsertPanel: function _createInsertPanel() {
+        var _this = this;
+
+        // 用到的 id
+        var btnInsertId = getRandom('btn');
+        var textRowNum = getRandom('row');
+        var textColNum = getRandom('col');
+
+        var panel = new Panel(this, {
+            width: 250,
+            // panel 包含多个 tab
+            tabs: [{
+                // 标题
+                title: '插入表格',
+                // 模板
+                tpl: '<div>\n                        <p style="text-align:left; padding:5px 0;">\n                            \u521B\u5EFA\n                            <input id="' + textRowNum + '" type="text" value="5" style="width:40px;text-align:center;"/>\n                            \u884C\n                            <input id="' + textColNum + '" type="text" value="5" style="width:40px;text-align:center;"/>\n                            \u5217\u7684\u8868\u683C\n                        </p>\n                        <div class="w-e-button-container">\n                            <button id="' + btnInsertId + '" class="right">\u63D2\u5165</button>\n                        </div>\n                    </div>',
+                // 事件绑定
+                events: [{
+                    // 点击按钮,插入表格
+                    selector: '#' + btnInsertId,
+                    type: 'click',
+                    fn: function fn() {
+                        var rowNum = parseInt($('#' + textRowNum).val());
+                        var colNum = parseInt($('#' + textColNum).val());
+
+                        if (rowNum && colNum && rowNum > 0 && colNum > 0) {
+                            // form 数据有效
+                            _this._insert(rowNum, colNum);
+                        }
+
+                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                        return true;
+                    }
+                }]
+            } // first tab end
+            ] // tabs end
+        }); // panel end
+
+        // 展示 panel
+        panel.show();
+
+        // 记录属性
+        this.panel = panel;
+    },
+
+    // 插入表格
+    _insert: function _insert(rowNum, colNum) {
+        // 拼接 table 模板
+        var r = void 0,
+            c = void 0;
+        var html = '<table border="0" width="100%" cellpadding="0" cellspacing="0">';
+        for (r = 0; r < rowNum; r++) {
+            html += '<tr>';
+            if (r === 0) {
+                for (c = 0; c < colNum; c++) {
+                    html += '<th>&nbsp;</th>';
+                }
+            } else {
+                for (c = 0; c < colNum; c++) {
+                    html += '<td>&nbsp;</td>';
+                }
+            }
+            html += '</tr>';
+        }
+        html += '</table><p><br></p>';
+
+        // 执行命令
+        var editor = this.editor;
+        editor.cmd.do('insertHTML', html);
+
+        // 防止 firefox 下出现 resize 的控制点
+        editor.cmd.do('enableObjectResizing', false);
+        editor.cmd.do('enableInlineTableEditing', false);
+    },
+
+    // 创建编辑表格的 panel
+    _createEditPanel: function _createEditPanel() {
+        var _this2 = this;
+
+        // 可用的 id
+        var addRowBtnId = getRandom('add-row');
+        var addColBtnId = getRandom('add-col');
+        var delRowBtnId = getRandom('del-row');
+        var delColBtnId = getRandom('del-col');
+        var delTableBtnId = getRandom('del-table');
+
+        // 创建 panel 对象
+        var panel = new Panel(this, {
+            width: 320,
+            // panel 包含多个 tab
+            tabs: [{
+                // 标题
+                title: '编辑表格',
+                // 模板
+                tpl: '<div>\n                        <div class="w-e-button-container" style="border-bottom:1px solid #f1f1f1;padding-bottom:5px;margin-bottom:5px;">\n                            <button id="' + addRowBtnId + '" class="left">\u589E\u52A0\u884C</button>\n                            <button id="' + delRowBtnId + '" class="red left">\u5220\u9664\u884C</button>\n                            <button id="' + addColBtnId + '" class="left">\u589E\u52A0\u5217</button>\n                            <button id="' + delColBtnId + '" class="red left">\u5220\u9664\u5217</button>\n                        </div>\n                        <div class="w-e-button-container">\n                            <button id="' + delTableBtnId + '" class="gray left">\u5220\u9664\u8868\u683C</button>\n                        </dv>\n                    </div>',
+                // 事件绑定
+                events: [{
+                    // 增加行
+                    selector: '#' + addRowBtnId,
+                    type: 'click',
+                    fn: function fn() {
+                        _this2._addRow();
+                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                        return true;
+                    }
+                }, {
+                    // 增加列
+                    selector: '#' + addColBtnId,
+                    type: 'click',
+                    fn: function fn() {
+                        _this2._addCol();
+                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                        return true;
+                    }
+                }, {
+                    // 删除行
+                    selector: '#' + delRowBtnId,
+                    type: 'click',
+                    fn: function fn() {
+                        _this2._delRow();
+                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                        return true;
+                    }
+                }, {
+                    // 删除列
+                    selector: '#' + delColBtnId,
+                    type: 'click',
+                    fn: function fn() {
+                        _this2._delCol();
+                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                        return true;
+                    }
+                }, {
+                    // 删除表格
+                    selector: '#' + delTableBtnId,
+                    type: 'click',
+                    fn: function fn() {
+                        _this2._delTable();
+                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                        return true;
+                    }
+                }]
+            }]
+        });
+        // 显示 panel
+        panel.show();
+    },
+
+    // 获取选中的单元格的位置信息
+    _getLocationData: function _getLocationData() {
+        var result = {};
+        var editor = this.editor;
+        var $selectionELem = editor.selection.getSelectionContainerElem();
+        if (!$selectionELem) {
+            return;
+        }
+        var nodeName = $selectionELem.getNodeName();
+        if (nodeName !== 'TD' && nodeName !== 'TH') {
+            return;
+        }
+
+        // 获取 td index
+        var $tr = $selectionELem.parent();
+        var $tds = $tr.children();
+        var tdLength = $tds.length;
+        $tds.forEach(function (td, index) {
+            if (td === $selectionELem[0]) {
+                // 记录并跳出循环
+                result.td = {
+                    index: index,
+                    elem: td,
+                    length: tdLength
+                };
+                return false;
+            }
+        });
+
+        // 获取 tr index
+        var $tbody = $tr.parent();
+        var $trs = $tbody.children();
+        var trLength = $trs.length;
+        $trs.forEach(function (tr, index) {
+            if (tr === $tr[0]) {
+                // 记录并跳出循环
+                result.tr = {
+                    index: index,
+                    elem: tr,
+                    length: trLength
+                };
+                return false;
+            }
+        });
+
+        // 返回结果
+        return result;
+    },
+
+    // 增加行
+    _addRow: function _addRow() {
+        // 获取当前单元格的位置信息
+        var locationData = this._getLocationData();
+        if (!locationData) {
+            return;
+        }
+        var trData = locationData.tr;
+        var $currentTr = $(trData.elem);
+        var tdData = locationData.td;
+        var tdLength = tdData.length;
+
+        // 拼接即将插入的字符串
+        var newTr = document.createElement('tr');
+        var tpl = '',
+            i = void 0;
+        for (i = 0; i < tdLength; i++) {
+            tpl += '<td>&nbsp;</td>';
+        }
+        newTr.innerHTML = tpl;
+        // 插入
+        $(newTr).insertAfter($currentTr);
+    },
+
+    // 增加列
+    _addCol: function _addCol() {
+        // 获取当前单元格的位置信息
+        var locationData = this._getLocationData();
+        if (!locationData) {
+            return;
+        }
+        var trData = locationData.tr;
+        var tdData = locationData.td;
+        var tdIndex = tdData.index;
+        var $currentTr = $(trData.elem);
+        var $trParent = $currentTr.parent();
+        var $trs = $trParent.children();
+
+        // 遍历所有行
+        $trs.forEach(function (tr) {
+            var $tr = $(tr);
+            var $tds = $tr.children();
+            var $currentTd = $tds.get(tdIndex);
+            var name = $currentTd.getNodeName().toLowerCase();
+
+            // new 一个 td,并插入
+            var newTd = document.createElement(name);
+            $(newTd).insertAfter($currentTd);
+        });
+    },
+
+    // 删除行
+    _delRow: function _delRow() {
+        // 获取当前单元格的位置信息
+        var locationData = this._getLocationData();
+        if (!locationData) {
+            return;
+        }
+        var trData = locationData.tr;
+        var $currentTr = $(trData.elem);
+        $currentTr.remove();
+    },
+
+    // 删除列
+    _delCol: function _delCol() {
+        // 获取当前单元格的位置信息
+        var locationData = this._getLocationData();
+        if (!locationData) {
+            return;
+        }
+        var trData = locationData.tr;
+        var tdData = locationData.td;
+        var tdIndex = tdData.index;
+        var $currentTr = $(trData.elem);
+        var $trParent = $currentTr.parent();
+        var $trs = $trParent.children();
+
+        // 遍历所有行
+        $trs.forEach(function (tr) {
+            var $tr = $(tr);
+            var $tds = $tr.children();
+            var $currentTd = $tds.get(tdIndex);
+            // 删除
+            $currentTd.remove();
+        });
+    },
+
+    // 删除表格
+    _delTable: function _delTable() {
+        var editor = this.editor;
+        var $selectionELem = editor.selection.getSelectionContainerElem();
+        if (!$selectionELem) {
+            return;
+        }
+        var $table = $selectionELem.parentUntil('table');
+        if (!$table) {
+            return;
+        }
+        $table.remove();
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function tryChangeActive(e) {
+        var editor = this.editor;
+        var $elem = this.$elem;
+        var $selectionELem = editor.selection.getSelectionContainerElem();
+        if (!$selectionELem) {
+            return;
+        }
+        var nodeName = $selectionELem.getNodeName();
+        if (nodeName === 'TD' || nodeName === 'TH') {
+            this._active = true;
+            $elem.addClass('w-e-active');
+        } else {
+            this._active = false;
+            $elem.removeClass('w-e-active');
+        }
+    }
+};
+
+/*
+    menu - video
+*/
+// 构造函数
+function Video(editor) {
+    this.editor = editor;
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-play"><i/></div>');
+    this.type = 'panel';
+
+    // 当前是否 active 状态
+    this._active = false;
+}
+
+// 原型
+Video.prototype = {
+    constructor: Video,
+
+    onClick: function onClick() {
+        this._createPanel();
+    },
+
+    _createPanel: function _createPanel() {
+        var _this = this;
+
+        // 创建 id
+        var textValId = getRandom('text-val');
+        var btnId = getRandom('btn');
+
+        // 创建 panel
+        var panel = new Panel(this, {
+            width: 350,
+            // 一个 panel 多个 tab
+            tabs: [{
+                // 标题
+                title: '插入视频',
+                // 模板
+                tpl: '<div>\n                        <input id="' + textValId + '" type="text" class="block" placeholder="\u683C\u5F0F\u5982\uFF1A<iframe src=... ></iframe>"/>\n                        <div class="w-e-button-container">\n                            <button id="' + btnId + '" class="right">\u63D2\u5165</button>\n                        </div>\n                    </div>',
+                // 事件绑定
+                events: [{
+                    selector: '#' + btnId,
+                    type: 'click',
+                    fn: function fn() {
+                        var $text = $('#' + textValId);
+                        var val = $text.val().trim();
+
+                        // 测试用视频地址
+                        // <iframe height=498 width=510 src='http://player.youku.com/embed/XMjcwMzc3MzM3Mg==' frameborder=0 'allowfullscreen'></iframe>
+
+                        if (val) {
+                            // 插入视频
+                            _this._insert(val);
+                        }
+
+                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                        return true;
+                    }
+                }]
+            } // first tab end
+            ] // tabs end
+        }); // panel end
+
+        // 显示 panel
+        panel.show();
+
+        // 记录属性
+        this.panel = panel;
+    },
+
+    // 插入视频
+    _insert: function _insert(val) {
+        var editor = this.editor;
+        editor.cmd.do('insertHTML', val + '<p><br></p>');
+    }
+};
+
+/*
+    menu - img
+*/
+// 构造函数
+function Image(editor) {
+    this.editor = editor;
+    var imgMenuId = getRandom('w-e-img');
+    this.$elem = $('<div class="w-e-menu" id="' + imgMenuId + '"><i class="w-e-icon-image"><i/></div>');
+    editor.imgMenuId = imgMenuId;
+    this.type = 'panel';
+
+    // 当前是否 active 状态
+    this._active = false;
+}
+
+// 原型
+Image.prototype = {
+    constructor: Image,
+
+    onClick: function onClick() {
+        var editor = this.editor;
+        var config = editor.config;
+        if (config.qiniu) {
+            return;
+        }
+        if (this._active) {
+            this._createEditPanel();
+        } else {
+            this._createInsertPanel();
+        }
+    },
+
+    _createEditPanel: function _createEditPanel() {
+        var editor = this.editor;
+
+        // id
+        var width30 = getRandom('width-30');
+        var width50 = getRandom('width-50');
+        var width100 = getRandom('width-100');
+        var delBtn = getRandom('del-btn');
+
+        // tab 配置
+        var tabsConfig = [{
+            title: '编辑图片',
+            tpl: '<div>\n                    <div class="w-e-button-container" style="border-bottom:1px solid #f1f1f1;padding-bottom:5px;margin-bottom:5px;">\n                        <span style="float:left;font-size:14px;margin:4px 5px 0 5px;color:#333;">\u6700\u5927\u5BBD\u5EA6\uFF1A</span>\n                        <button id="' + width30 + '" class="left">30%</button>\n                        <button id="' + width50 + '" class="left">50%</button>\n                        <button id="' + width100 + '" class="left">100%</button>\n                    </div>\n                    <div class="w-e-button-container">\n                        <button id="' + delBtn + '" class="gray left">\u5220\u9664\u56FE\u7247</button>\n                    </dv>\n                </div>',
+            events: [{
+                selector: '#' + width30,
+                type: 'click',
+                fn: function fn() {
+                    var $img = editor._selectedImg;
+                    if ($img) {
+                        $img.css('max-width', '30%');
+                    }
+                    // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                    return true;
+                }
+            }, {
+                selector: '#' + width50,
+                type: 'click',
+                fn: function fn() {
+                    var $img = editor._selectedImg;
+                    if ($img) {
+                        $img.css('max-width', '50%');
+                    }
+                    // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                    return true;
+                }
+            }, {
+                selector: '#' + width100,
+                type: 'click',
+                fn: function fn() {
+                    var $img = editor._selectedImg;
+                    if ($img) {
+                        $img.css('max-width', '100%');
+                    }
+                    // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                    return true;
+                }
+            }, {
+                selector: '#' + delBtn,
+                type: 'click',
+                fn: function fn() {
+                    var $img = editor._selectedImg;
+                    if ($img) {
+                        $img.remove();
+                    }
+                    // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                    return true;
+                }
+            }]
+        }];
+
+        // 创建 panel 并显示
+        var panel = new Panel(this, {
+            width: 300,
+            tabs: tabsConfig
+        });
+        panel.show();
+
+        // 记录属性
+        this.panel = panel;
+    },
+
+    _createInsertPanel: function _createInsertPanel() {
+        var editor = this.editor;
+        var uploadImg = editor.uploadImg;
+        var config = editor.config;
+
+        // id
+        var upTriggerId = getRandom('up-trigger');
+        var upFileId = getRandom('up-file');
+        var linkUrlId = getRandom('link-url');
+        var linkBtnId = getRandom('link-btn');
+
+        // tabs 的配置
+        var tabsConfig = [{
+            title: '上传图片',
+            tpl: '<div class="w-e-up-img-container">\n                    <div id="' + upTriggerId + '" class="w-e-up-btn">\n                        <i class="w-e-icon-upload2"></i>\n                    </div>\n                    <div style="display:none;">\n                        <input id="' + upFileId + '" type="file" multiple="multiple" accept="image/jpg,image/jpeg,image/png,image/gif,image/bmp"/>\n                    </div>\n                </div>',
+            events: [{
+                // 触发选择图片
+                selector: '#' + upTriggerId,
+                type: 'click',
+                fn: function fn() {
+                    var $file = $('#' + upFileId);
+                    var fileElem = $file[0];
+                    if (fileElem) {
+                        fileElem.click();
+                    } else {
+                        // 返回 true 可关闭 panel
+                        return true;
+                    }
+                }
+            }, {
+                // 选择图片完毕
+                selector: '#' + upFileId,
+                type: 'change',
+                fn: function fn() {
+                    var $file = $('#' + upFileId);
+                    var fileElem = $file[0];
+                    if (!fileElem) {
+                        // 返回 true 可关闭 panel
+                        return true;
+                    }
+
+                    // 获取选中的 file 对象列表
+                    var fileList = fileElem.files;
+                    if (fileList.length) {
+                        uploadImg.uploadImg(fileList);
+                    }
+
+                    // 返回 true 可关闭 panel
+                    return true;
+                }
+            }]
+        }, // first tab end
+        {
+            title: '网络图片',
+            tpl: '<div>\n                    <input id="' + linkUrlId + '" type="text" class="block" placeholder="\u56FE\u7247\u94FE\u63A5"/></td>\n                    <div class="w-e-button-container">\n                        <button id="' + linkBtnId + '" class="right">\u63D2\u5165</button>\n                    </div>\n                </div>',
+            events: [{
+                selector: '#' + linkBtnId,
+                type: 'click',
+                fn: function fn() {
+                    var $linkUrl = $('#' + linkUrlId);
+                    var url = $linkUrl.val().trim();
+
+                    if (url) {
+                        uploadImg.insertLinkImg(url);
+                    }
+
+                    // 返回 true 表示函数执行结束之后关闭 panel
+                    return true;
+                }
+            }]
+        } // second tab end
+        ]; // tabs end
+
+        // 判断 tabs 的显示
+        var tabsConfigResult = [];
+        if ((config.uploadImgShowBase64 || config.uploadImgServer || config.customUploadImg) && window.FileReader) {
+            // 显示“上传图片”
+            tabsConfigResult.push(tabsConfig[0]);
+        }
+        if (config.showLinkImg) {
+            // 显示“网络图片”
+            tabsConfigResult.push(tabsConfig[1]);
+        }
+
+        // 创建 panel 并显示
+        var panel = new Panel(this, {
+            width: 300,
+            tabs: tabsConfigResult
+        });
+        panel.show();
+
+        // 记录属性
+        this.panel = panel;
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function tryChangeActive(e) {
+        var editor = this.editor;
+        var $elem = this.$elem;
+        if (editor._selectedImg) {
+            this._active = true;
+            $elem.addClass('w-e-active');
+        } else {
+            this._active = false;
+            $elem.removeClass('w-e-active');
+        }
+    }
+};
+
+/*
+    所有菜单的汇总
+*/
+
+// 存储菜单的构造函数
+var MenuConstructors = {};
+
+MenuConstructors.bold = Bold;
+
+MenuConstructors.head = Head;
+
+MenuConstructors.link = Link;
+
+MenuConstructors.italic = Italic;
+
+MenuConstructors.redo = Redo;
+
+MenuConstructors.strikeThrough = StrikeThrough;
+
+MenuConstructors.underline = Underline;
+
+MenuConstructors.undo = Undo;
+
+MenuConstructors.list = List;
+
+MenuConstructors.justify = Justify;
+
+MenuConstructors.foreColor = ForeColor;
+
+MenuConstructors.backColor = BackColor;
+
+MenuConstructors.quote = Quote;
+
+MenuConstructors.code = Code;
+
+MenuConstructors.emoticon = Emoticon;
+
+MenuConstructors.table = Table;
+
+MenuConstructors.video = Video;
+
+MenuConstructors.image = Image;
+
+/*
+    菜单集合
+*/
+// 构造函数
+function Menus(editor) {
+    this.editor = editor;
+    this.menus = {};
+}
+
+// 修改原型
+Menus.prototype = {
+    constructor: Menus,
+
+    // 初始化菜单
+    init: function init() {
+        var _this = this;
+
+        var editor = this.editor;
+        var config = editor.config || {};
+        var configMenus = config.menus || []; // 获取配置中的菜单
+
+        // 根据配置信息,创建菜单
+        configMenus.forEach(function (menuKey) {
+            var MenuConstructor = MenuConstructors[menuKey];
+            if (MenuConstructor && typeof MenuConstructor === 'function') {
+                // 创建单个菜单
+                _this.menus[menuKey] = new MenuConstructor(editor);
+            }
+        });
+
+        // 添加到菜单栏
+        this._addToToolbar();
+
+        // 绑定事件
+        this._bindEvent();
+    },
+
+    // 添加到菜单栏
+    _addToToolbar: function _addToToolbar() {
+        var editor = this.editor;
+        var $toolbarElem = editor.$toolbarElem;
+        var menus = this.menus;
+        var config = editor.config;
+        // config.zIndex 是配置的编辑区域的 z-index,菜单的 z-index 得在其基础上 +1
+        var zIndex = config.zIndex + 1;
+        objForEach(menus, function (key, menu) {
+            var $elem = menu.$elem;
+            if ($elem) {
+                // 设置 z-index
+                $elem.css('z-index', zIndex);
+                $toolbarElem.append($elem);
+            }
+        });
+    },
+
+    // 绑定菜单 click mouseenter 事件
+    _bindEvent: function _bindEvent() {
+        var menus = this.menus;
+        var editor = this.editor;
+        objForEach(menus, function (key, menu) {
+            var type = menu.type;
+            if (!type) {
+                return;
+            }
+            var $elem = menu.$elem;
+            var droplist = menu.droplist;
+            var panel = menu.panel;
+
+            // 点击类型,例如 bold
+            if (type === 'click' && menu.onClick) {
+                $elem.on('click', function (e) {
+                    if (editor.selection.getRange() == null) {
+                        return;
+                    }
+                    menu.onClick(e);
+                });
+            }
+
+            // 下拉框,例如 head
+            if (type === 'droplist' && droplist) {
+                $elem.on('mouseenter', function (e) {
+                    if (editor.selection.getRange() == null) {
+                        return;
+                    }
+                    // 显示
+                    droplist.showTimeoutId = setTimeout(function () {
+                        droplist.show();
+                    }, 200);
+                }).on('mouseleave', function (e) {
+                    // 隐藏
+                    droplist.hideTimeoutId = setTimeout(function () {
+                        droplist.hide();
+                    }, 0);
+                });
+            }
+
+            // 弹框类型,例如 link
+            if (type === 'panel' && menu.onClick) {
+                $elem.on('click', function (e) {
+                    e.stopPropagation();
+                    if (editor.selection.getRange() == null) {
+                        return;
+                    }
+                    // 在自定义事件中显示 panel
+                    menu.onClick(e);
+                });
+            }
+        });
+    },
+
+    // 尝试修改菜单状态
+    changeActive: function changeActive() {
+        var menus = this.menus;
+        objForEach(menus, function (key, menu) {
+            if (menu.tryChangeActive) {
+                setTimeout(function () {
+                    menu.tryChangeActive();
+                }, 100);
+            }
+        });
+    }
+};
+
+/*
+    粘贴信息的处理
+*/
+
+// 获取粘贴的纯文本
+function getPasteText(e) {
+    var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData;
+    var pasteText = void 0;
+    if (clipboardData == null) {
+        pasteText = window.clipboardData && window.clipboardData.getData('text');
+    } else {
+        pasteText = clipboardData.getData('text/plain');
+    }
+
+    return replaceHtmlSymbol(pasteText);
+}
+
+// 获取粘贴的html
+function getPasteHtml(e, filterStyle) {
+    var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData;
+    var pasteText = void 0,
+        pasteHtml = void 0;
+    if (clipboardData == null) {
+        pasteText = window.clipboardData && window.clipboardData.getData('text');
+    } else {
+        pasteText = clipboardData.getData('text/plain');
+        pasteHtml = clipboardData.getData('text/html');
+    }
+    if (!pasteHtml && pasteText) {
+        pasteHtml = '<p>' + replaceHtmlSymbol(pasteText) + '</p>';
+    }
+    if (!pasteHtml) {
+        return;
+    }
+
+    // 过滤word中状态过来的无用字符
+    var docSplitHtml = pasteHtml.split('</html>');
+    if (docSplitHtml.length === 2) {
+        pasteHtml = docSplitHtml[0];
+    }
+
+    // 过滤无用标签
+    pasteHtml = pasteHtml.replace(/<(meta|script|link).+?>/igm, '');
+    // 去掉注释
+    pasteHtml = pasteHtml.replace(/<!--.*?-->/mg, '');
+    // 过滤 data-xxx 属性
+    pasteHtml = pasteHtml.replace(/\s?data-.+?=('|").+?('|")/igm, '');
+
+    if (filterStyle) {
+        // 过滤样式
+        pasteHtml = pasteHtml.replace(/\s?(class|style)=('|").+?('|")/igm, '');
+    } else {
+        // 保留样式
+        pasteHtml = pasteHtml.replace(/\s?class=('|").+?('|")/igm, '');
+    }
+
+    return pasteHtml;
+}
+
+// 获取粘贴的图片文件
+function getPasteImgs(e) {
+    var result = [];
+    var txt = getPasteText(e);
+    if (txt) {
+        // 有文字,就忽略图片
+        return result;
+    }
+
+    var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData || {};
+    var items = clipboardData.items;
+    if (!items) {
+        return result;
+    }
+
+    objForEach(items, function (key, value) {
+        var type = value.type;
+        if (/image/i.test(type)) {
+            result.push(value.getAsFile());
+        }
+    });
+
+    return result;
+}
+
+/*
+    编辑区域
+*/
+
+// 获取一个 elem.childNodes 的 JSON 数据
+function getChildrenJSON($elem) {
+    var result = [];
+    var $children = $elem.childNodes() || []; // 注意 childNodes() 可以获取文本节点
+    $children.forEach(function (curElem) {
+        var elemResult = void 0;
+        var nodeType = curElem.nodeType;
+
+        // 文本节点
+        if (nodeType === 3) {
+            elemResult = curElem.textContent;
+        }
+
+        // 普通 DOM 节点
+        if (nodeType === 1) {
+            elemResult = {};
+
+            // tag
+            elemResult.tag = curElem.nodeName.toLowerCase();
+            // attr
+            var attrData = [];
+            var attrList = curElem.attributes || {};
+            var attrListLength = attrList.length || 0;
+            for (var i = 0; i < attrListLength; i++) {
+                var attr = attrList[i];
+                attrData.push({
+                    name: attr.name,
+                    value: attr.value
+                });
+            }
+            elemResult.attrs = attrData;
+            // children(递归)
+            elemResult.children = getChildrenJSON($(curElem));
+        }
+
+        result.push(elemResult);
+    });
+    return result;
+}
+
+// 构造函数
+function Text(editor) {
+    this.editor = editor;
+}
+
+// 修改原型
+Text.prototype = {
+    constructor: Text,
+
+    // 初始化
+    init: function init() {
+        // 绑定事件
+        this._bindEvent();
+    },
+
+    // 清空内容
+    clear: function clear() {
+        this.html('<p><br></p>');
+    },
+
+    // 获取 设置 html
+    html: function html(val) {
+        var editor = this.editor;
+        var $textElem = editor.$textElem;
+        var html = void 0;
+        if (val == null) {
+            html = $textElem.html();
+            // 未选中任何内容的时候点击“加粗”或者“斜体”等按钮,就得需要一个空的占位符 &#8203 ,这里替换掉
+            html = html.replace(/\u200b/gm, '');
+            return html;
+        } else {
+            $textElem.html(val);
+
+            // 初始化选取,将光标定位到内容尾部
+            editor.initSelection();
+        }
+    },
+
+    // 获取 JSON
+    getJSON: function getJSON() {
+        var editor = this.editor;
+        var $textElem = editor.$textElem;
+        return getChildrenJSON($textElem);
+    },
+
+    // 获取 设置 text
+    text: function text(val) {
+        var editor = this.editor;
+        var $textElem = editor.$textElem;
+        var text = void 0;
+        if (val == null) {
+            text = $textElem.text();
+            // 未选中任何内容的时候点击“加粗”或者“斜体”等按钮,就得需要一个空的占位符 &#8203 ,这里替换掉
+            text = text.replace(/\u200b/gm, '');
+            return text;
+        } else {
+            $textElem.text('<p>' + val + '</p>');
+
+            // 初始化选取,将光标定位到内容尾部
+            editor.initSelection();
+        }
+    },
+
+    // 追加内容
+    append: function append(html) {
+        var editor = this.editor;
+        var $textElem = editor.$textElem;
+        $textElem.append($(html));
+
+        // 初始化选取,将光标定位到内容尾部
+        editor.initSelection();
+    },
+
+    // 绑定事件
+    _bindEvent: function _bindEvent() {
+        // 实时保存选取
+        this._saveRangeRealTime();
+
+        // 按回车建时的特殊处理
+        this._enterKeyHandle();
+
+        // 清空时保留 <p><br></p>
+        this._clearHandle();
+
+        // 粘贴事件(粘贴文字,粘贴图片)
+        this._pasteHandle();
+
+        // tab 特殊处理
+        this._tabHandle();
+
+        // img 点击
+        this._imgHandle();
+
+        // 拖拽事件
+        this._dragHandle();
+    },
+
+    // 实时保存选取
+    _saveRangeRealTime: function _saveRangeRealTime() {
+        var editor = this.editor;
+        var $textElem = editor.$textElem;
+
+        // 保存当前的选区
+        function saveRange(e) {
+            // 随时保存选区
+            editor.selection.saveRange();
+            // 更新按钮 ative 状态
+            editor.menus.changeActive();
+        }
+        // 按键后保存
+        $textElem.on('keyup', saveRange);
+        $textElem.on('mousedown', function (e) {
+            // mousedown 状态下,鼠标滑动到编辑区域外面,也需要保存选区
+            $textElem.on('mouseleave', saveRange);
+        });
+        $textElem.on('mouseup', function (e) {
+            saveRange();
+            // 在编辑器区域之内完成点击,取消鼠标滑动到编辑区外面的事件
+            $textElem.off('mouseleave', saveRange);
+        });
+    },
+
+    // 按回车键时的特殊处理
+    _enterKeyHandle: function _enterKeyHandle() {
+        var editor = this.editor;
+        var $textElem = editor.$textElem;
+
+        function insertEmptyP($selectionElem) {
+            var $p = $('<p><br></p>');
+            $p.insertBefore($selectionElem);
+            editor.selection.createRangeByElem($p, true);
+            editor.selection.restoreSelection();
+            $selectionElem.remove();
+        }
+
+        // 将回车之后生成的非 <p> 的顶级标签,改为 <p>
+        function pHandle(e) {
+            var $selectionElem = editor.selection.getSelectionContainerElem();
+            var $parentElem = $selectionElem.parent();
+
+            if ($parentElem.html() === '<code><br></code>') {
+                // 回车之前光标所在一个 <p><code>.....</code></p> ,忽然回车生成一个空的 <p><code><br></code></p>
+                // 而且继续回车跳不出去,因此只能特殊处理
+                insertEmptyP($selectionElem);
+                return;
+            }
+
+            if (!$parentElem.equal($textElem)) {
+                // 不是顶级标签
+                return;
+            }
+
+            var nodeName = $selectionElem.getNodeName();
+            if (nodeName === 'P') {
+                // 当前的标签是 P ,不用做处理
+                return;
+            }
+
+            if ($selectionElem.text()) {
+                // 有内容,不做处理
+                return;
+            }
+
+            // 插入 <p> ,并将选取定位到 <p>,删除当前标签
+            insertEmptyP($selectionElem);
+        }
+
+        $textElem.on('keyup', function (e) {
+            if (e.keyCode !== 13) {
+                // 不是回车键
+                return;
+            }
+            // 将回车之后生成的非 <p> 的顶级标签,改为 <p>
+            pHandle(e);
+        });
+
+        // <pre><code></code></pre> 回车时 特殊处理
+        function codeHandle(e) {
+            var $selectionElem = editor.selection.getSelectionContainerElem();
+            if (!$selectionElem) {
+                return;
+            }
+            var $parentElem = $selectionElem.parent();
+            var selectionNodeName = $selectionElem.getNodeName();
+            var parentNodeName = $parentElem.getNodeName();
+
+            if (selectionNodeName !== 'CODE' || parentNodeName !== 'PRE') {
+                // 不符合要求 忽略
+                return;
+            }
+
+            if (!editor.cmd.queryCommandSupported('insertHTML')) {
+                // 必须原生支持 insertHTML 命令
+                return;
+            }
+
+            // 处理:光标定位到代码末尾,联系点击两次回车,即跳出代码块
+            if (editor._willBreakCode === true) {
+                // 此时可以跳出代码块
+                // 插入 <p> ,并将选取定位到 <p>
+                var $p = $('<p><br></p>');
+                $p.insertAfter($parentElem);
+                editor.selection.createRangeByElem($p, true);
+                editor.selection.restoreSelection();
+
+                // 修改状态
+                editor._willBreakCode = false;
+
+                e.preventDefault();
+                return;
+            }
+
+            var _startOffset = editor.selection.getRange().startOffset;
+
+            // 处理:回车时,不能插入 <br> 而是插入 \n ,因为是在 pre 标签里面
+            editor.cmd.do('insertHTML', '\n');
+            editor.selection.saveRange();
+            if (editor.selection.getRange().startOffset === _startOffset) {
+                // 没起作用,再来一遍
+                editor.cmd.do('insertHTML', '\n');
+            }
+
+            var codeLength = $selectionElem.html().length;
+            if (editor.selection.getRange().startOffset + 1 === codeLength) {
+                // 说明光标在代码最后的位置,执行了回车操作
+                // 记录下来,以便下次回车时候跳出 code
+                editor._willBreakCode = true;
+            }
+
+            // 阻止默认行为
+            e.preventDefault();
+        }
+
+        $textElem.on('keydown', function (e) {
+            if (e.keyCode !== 13) {
+                // 不是回车键
+                // 取消即将跳转代码块的记录
+                editor._willBreakCode = false;
+                return;
+            }
+            // <pre><code></code></pre> 回车时 特殊处理
+            codeHandle(e);
+        });
+    },
+
+    // 清空时保留 <p><br></p>
+    _clearHandle: function _clearHandle() {
+        var editor = this.editor;
+        var $textElem = editor.$textElem;
+
+        $textElem.on('keydown', function (e) {
+            if (e.keyCode !== 8) {
+                return;
+            }
+            var txtHtml = $textElem.html().toLowerCase().trim();
+            if (txtHtml === '<p><br></p>') {
+                // 最后剩下一个空行,就不再删除了
+                e.preventDefault();
+                return;
+            }
+        });
+
+        $textElem.on('keyup', function (e) {
+            if (e.keyCode !== 8) {
+                return;
+            }
+            var $p = void 0;
+            var txtHtml = $textElem.html().toLowerCase().trim();
+
+            // firefox 时用 txtHtml === '<br>' 判断,其他用 !txtHtml 判断
+            if (!txtHtml || txtHtml === '<br>') {
+                // 内容空了
+                $p = $('<p><br/></p>');
+                $textElem.html(''); // 一定要先清空,否则在 firefox 下有问题
+                $textElem.append($p);
+                editor.selection.createRangeByElem($p, false, true);
+                editor.selection.restoreSelection();
+            }
+        });
+    },
+
+    // 粘贴事件(粘贴文字 粘贴图片)
+    _pasteHandle: function _pasteHandle() {
+        var editor = this.editor;
+        var config = editor.config;
+        var pasteFilterStyle = config.pasteFilterStyle;
+        var pasteTextHandle = config.pasteTextHandle;
+        var $textElem = editor.$textElem;
+
+        // 粘贴图片、文本的事件,每次只能执行一个
+        // 判断该次粘贴事件是否可以执行
+        var pasteTime = 0;
+        function canDo() {
+            var now = Date.now();
+            var flag = false;
+            if (now - pasteTime >= 500) {
+                // 间隔大于 500 ms ,可以执行
+                flag = true;
+            }
+            pasteTime = now;
+            return flag;
+        }
+        function resetTime() {
+            pasteTime = 0;
+        }
+
+        // 粘贴文字
+        $textElem.on('paste', function (e) {
+            if (UA.isIE()) {
+                return;
+            } else {
+                // 阻止默认行为,使用 execCommand 的粘贴命令
+                e.preventDefault();
+            }
+
+            // 粘贴图片和文本,只能同时使用一个
+            if (!canDo()) {
+                return;
+            }
+
+            // 获取粘贴的文字
+            var pasteHtml = getPasteHtml(e, pasteFilterStyle);
+            var pasteText = getPasteText(e);
+            pasteText = pasteText.replace(/\n/gm, '<br>');
+
+            var $selectionElem = editor.selection.getSelectionContainerElem();
+            if (!$selectionElem) {
+                return;
+            }
+            var nodeName = $selectionElem.getNodeName();
+
+            // code 中只能粘贴纯文本
+            if (nodeName === 'CODE' || nodeName === 'PRE') {
+                if (pasteTextHandle && isFunction(pasteTextHandle)) {
+                    // 用户自定义过滤处理粘贴内容
+                    pasteText = '' + (pasteTextHandle(pasteText) || '');
+                }
+                editor.cmd.do('insertHTML', '<p>' + pasteText + '</p>');
+                return;
+            }
+
+            // 先放开注释,有问题再追查 ————
+            // // 表格中忽略,可能会出现异常问题
+            // if (nodeName === 'TD' || nodeName === 'TH') {
+            //     return
+            // }
+
+            if (!pasteHtml) {
+                // 没有内容,可继续执行下面的图片粘贴
+                resetTime();
+                return;
+            }
+            try {
+                // firefox 中,获取的 pasteHtml 可能是没有 <ul> 包裹的 <li>
+                // 因此执行 insertHTML 会报错
+                if (pasteTextHandle && isFunction(pasteTextHandle)) {
+                    // 用户自定义过滤处理粘贴内容
+                    pasteHtml = '' + (pasteTextHandle(pasteHtml) || '');
+                }
+                editor.cmd.do('insertHTML', pasteHtml);
+            } catch (ex) {
+                // 此时使用 pasteText 来兼容一下
+                if (pasteTextHandle && isFunction(pasteTextHandle)) {
+                    // 用户自定义过滤处理粘贴内容
+                    pasteText = '' + (pasteTextHandle(pasteText) || '');
+                }
+                editor.cmd.do('insertHTML', '<p>' + pasteText + '</p>');
+            }
+        });
+
+        // 粘贴图片
+        $textElem.on('paste', function (e) {
+            if (UA.isIE()) {
+                return;
+            } else {
+                e.preventDefault();
+            }
+
+            // 粘贴图片和文本,只能同时使用一个
+            if (!canDo()) {
+                return;
+            }
+
+            // 获取粘贴的图片
+            var pasteFiles = getPasteImgs(e);
+            if (!pasteFiles || !pasteFiles.length) {
+                return;
+            }
+
+            // 获取当前的元素
+            var $selectionElem = editor.selection.getSelectionContainerElem();
+            if (!$selectionElem) {
+                return;
+            }
+            var nodeName = $selectionElem.getNodeName();
+
+            // code 中粘贴忽略
+            if (nodeName === 'CODE' || nodeName === 'PRE') {
+                return;
+            }
+
+            // 上传图片
+            var uploadImg = editor.uploadImg;
+            uploadImg.uploadImg(pasteFiles);
+        });
+    },
+
+    // tab 特殊处理
+    _tabHandle: function _tabHandle() {
+        var editor = this.editor;
+        var $textElem = editor.$textElem;
+
+        $textElem.on('keydown', function (e) {
+            if (e.keyCode !== 9) {
+                return;
+            }
+            if (!editor.cmd.queryCommandSupported('insertHTML')) {
+                // 必须原生支持 insertHTML 命令
+                return;
+            }
+            var $selectionElem = editor.selection.getSelectionContainerElem();
+            if (!$selectionElem) {
+                return;
+            }
+            var $parentElem = $selectionElem.parent();
+            var selectionNodeName = $selectionElem.getNodeName();
+            var parentNodeName = $parentElem.getNodeName();
+
+            if (selectionNodeName === 'CODE' && parentNodeName === 'PRE') {
+                // <pre><code> 里面
+                editor.cmd.do('insertHTML', '    ');
+            } else {
+                // 普通文字
+                editor.cmd.do('insertHTML', '&nbsp;&nbsp;&nbsp;&nbsp;');
+            }
+
+            e.preventDefault();
+        });
+    },
+
+    // img 点击
+    _imgHandle: function _imgHandle() {
+        var editor = this.editor;
+        var $textElem = editor.$textElem;
+
+        // 为图片增加 selected 样式
+        $textElem.on('click', 'img', function (e) {
+            var img = this;
+            var $img = $(img);
+
+            if ($img.attr('data-w-e') === '1') {
+                // 是表情图片,忽略
+                return;
+            }
+
+            // 记录当前点击过的图片
+            editor._selectedImg = $img;
+
+            // 修改选区并 restore ,防止用户此时点击退格键,会删除其他内容
+            editor.selection.createRangeByElem($img);
+            editor.selection.restoreSelection();
+        });
+
+        // 去掉图片的 selected 样式
+        $textElem.on('click  keyup', function (e) {
+            if (e.target.matches('img')) {
+                // 点击的是图片,忽略
+                return;
+            }
+            // 删除记录
+            editor._selectedImg = null;
+        });
+    },
+
+    // 拖拽事件
+    _dragHandle: function _dragHandle() {
+        var editor = this.editor;
+
+        // 禁用 document 拖拽事件
+        var $document = $(document);
+        $document.on('dragleave drop dragenter dragover', function (e) {
+            e.preventDefault();
+        });
+
+        // 添加编辑区域拖拽事件
+        var $textElem = editor.$textElem;
+        $textElem.on('drop', function (e) {
+            e.preventDefault();
+            var files = e.dataTransfer && e.dataTransfer.files;
+            if (!files || !files.length) {
+                return;
+            }
+
+            // 上传图片
+            var uploadImg = editor.uploadImg;
+            uploadImg.uploadImg(files);
+        });
+    }
+};
+
+/*
+    命令,封装 document.execCommand
+*/
+
+// 构造函数
+function Command(editor) {
+    this.editor = editor;
+}
+
+// 修改原型
+Command.prototype = {
+    constructor: Command,
+
+    // 执行命令
+    do: function _do(name, value) {
+        var editor = this.editor;
+
+        // 使用 styleWithCSS
+        if (!editor._useStyleWithCSS) {
+            document.execCommand('styleWithCSS', null, true);
+            editor._useStyleWithCSS = true;
+        }
+
+        // 如果无选区,忽略
+        if (!editor.selection.getRange()) {
+            return;
+        }
+
+        // 恢复选取
+        editor.selection.restoreSelection();
+
+        // 执行
+        var _name = '_' + name;
+        if (this[_name]) {
+            // 有自定义事件
+            this[_name](value);
+        } else {
+            // 默认 command
+            this._execCommand(name, value);
+        }
+
+        // 修改菜单状态
+        editor.menus.changeActive();
+
+        // 最后,恢复选取保证光标在原来的位置闪烁
+        editor.selection.saveRange();
+        editor.selection.restoreSelection();
+
+        // 触发 onchange
+        editor.change && editor.change();
+    },
+
+    // 自定义 insertHTML 事件
+    _insertHTML: function _insertHTML(html) {
+        var editor = this.editor;
+        var range = editor.selection.getRange();
+
+        if (this.queryCommandSupported('insertHTML')) {
+            // W3C
+            this._execCommand('insertHTML', html);
+        } else if (range.insertNode) {
+            // IE
+            range.deleteContents();
+            range.insertNode($(html)[0]);
+        } else if (range.pasteHTML) {
+            // IE <= 10
+            range.pasteHTML(html);
+        }
+    },
+
+    // 插入 elem
+    _insertElem: function _insertElem($elem) {
+        var editor = this.editor;
+        var range = editor.selection.getRange();
+
+        if (range.insertNode) {
+            range.deleteContents();
+            range.insertNode($elem[0]);
+        }
+    },
+
+    // 封装 execCommand
+    _execCommand: function _execCommand(name, value) {
+        document.execCommand(name, false, value);
+    },
+
+    // 封装 document.queryCommandValue
+    queryCommandValue: function queryCommandValue(name) {
+        return document.queryCommandValue(name);
+    },
+
+    // 封装 document.queryCommandState
+    queryCommandState: function queryCommandState(name) {
+        return document.queryCommandState(name);
+    },
+
+    // 封装 document.queryCommandSupported
+    queryCommandSupported: function queryCommandSupported(name) {
+        return document.queryCommandSupported(name);
+    }
+};
+
+/*
+    selection range API
+*/
+
+// 构造函数
+function API(editor) {
+    this.editor = editor;
+    this._currentRange = null;
+}
+
+// 修改原型
+API.prototype = {
+    constructor: API,
+
+    // 获取 range 对象
+    getRange: function getRange() {
+        return this._currentRange;
+    },
+
+    // 保存选区
+    saveRange: function saveRange(_range) {
+        if (_range) {
+            // 保存已有选区
+            this._currentRange = _range;
+            return;
+        }
+
+        // 获取当前的选区
+        var selection = window.getSelection();
+        if (selection.rangeCount === 0) {
+            return;
+        }
+        var range = selection.getRangeAt(0);
+
+        // 判断选区内容是否在编辑内容之内
+        var $containerElem = this.getSelectionContainerElem(range);
+        if (!$containerElem) {
+            return;
+        }
+        var editor = this.editor;
+        var $textElem = editor.$textElem;
+        if ($textElem.isContain($containerElem)) {
+            // 是编辑内容之内的
+            this._currentRange = range;
+        }
+    },
+
+    // 折叠选区
+    collapseRange: function collapseRange(toStart) {
+        if (toStart == null) {
+            // 默认为 false
+            toStart = false;
+        }
+        var range = this._currentRange;
+        if (range) {
+            range.collapse(toStart);
+        }
+    },
+
+    // 选中区域的文字
+    getSelectionText: function getSelectionText() {
+        var range = this._currentRange;
+        if (range) {
+            return this._currentRange.toString();
+        } else {
+            return '';
+        }
+    },
+
+    // 选区的 $Elem
+    getSelectionContainerElem: function getSelectionContainerElem(range) {
+        range = range || this._currentRange;
+        var elem = void 0;
+        if (range) {
+            elem = range.commonAncestorContainer;
+            return $(elem.nodeType === 1 ? elem : elem.parentNode);
+        }
+    },
+    getSelectionStartElem: function getSelectionStartElem(range) {
+        range = range || this._currentRange;
+        var elem = void 0;
+        if (range) {
+            elem = range.startContainer;
+            return $(elem.nodeType === 1 ? elem : elem.parentNode);
+        }
+    },
+    getSelectionEndElem: function getSelectionEndElem(range) {
+        range = range || this._currentRange;
+        var elem = void 0;
+        if (range) {
+            elem = range.endContainer;
+            return $(elem.nodeType === 1 ? elem : elem.parentNode);
+        }
+    },
+
+    // 选区是否为空
+    isSelectionEmpty: function isSelectionEmpty() {
+        var range = this._currentRange;
+        if (range && range.startContainer) {
+            if (range.startContainer === range.endContainer) {
+                if (range.startOffset === range.endOffset) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    },
+
+    // 恢复选区
+    restoreSelection: function restoreSelection() {
+        var selection = window.getSelection();
+        selection.removeAllRanges();
+        selection.addRange(this._currentRange);
+    },
+
+    // 创建一个空白(即 &#8203 字符)选区
+    createEmptyRange: function createEmptyRange() {
+        var editor = this.editor;
+        var range = this.getRange();
+        var $elem = void 0;
+
+        if (!range) {
+            // 当前无 range
+            return;
+        }
+        if (!this.isSelectionEmpty()) {
+            // 当前选区必须没有内容才可以
+            return;
+        }
+
+        try {
+            // 目前只支持 webkit 内核
+            if (UA.isWebkit()) {
+                // 插入 &#8203
+                editor.cmd.do('insertHTML', '&#8203;');
+                // 修改 offset 位置
+                range.setEnd(range.endContainer, range.endOffset + 1);
+                // 存储
+                this.saveRange(range);
+            } else {
+                $elem = $('<strong>&#8203;</strong>');
+                editor.cmd.do('insertElem', $elem);
+                this.createRangeByElem($elem, true);
+            }
+        } catch (ex) {
+            // 部分情况下会报错,兼容一下
+        }
+    },
+
+    // 根据 $Elem 设置选区
+    createRangeByElem: function createRangeByElem($elem, toStart, isContent) {
+        // $elem - 经过封装的 elem
+        // toStart - true 开始位置,false 结束位置
+        // isContent - 是否选中Elem的内容
+        if (!$elem.length) {
+            return;
+        }
+
+        var elem = $elem[0];
+        var range = document.createRange();
+
+        if (isContent) {
+            range.selectNodeContents(elem);
+        } else {
+            range.selectNode(elem);
+        }
+
+        if (typeof toStart === 'boolean') {
+            range.collapse(toStart);
+        }
+
+        // 存储 range
+        this.saveRange(range);
+    }
+};
+
+/*
+    上传进度条
+*/
+
+function Progress(editor) {
+    this.editor = editor;
+    this._time = 0;
+    this._isShow = false;
+    this._isRender = false;
+    this._timeoutId = 0;
+    this.$textContainer = editor.$textContainerElem;
+    this.$bar = $('<div class="w-e-progress"></div>');
+}
+
+Progress.prototype = {
+    constructor: Progress,
+
+    show: function show(progress) {
+        var _this = this;
+
+        // 状态处理
+        if (this._isShow) {
+            return;
+        }
+        this._isShow = true;
+
+        // 渲染
+        var $bar = this.$bar;
+        if (!this._isRender) {
+            var $textContainer = this.$textContainer;
+            $textContainer.append($bar);
+        } else {
+            this._isRender = true;
+        }
+
+        // 改变进度(节流,100ms 渲染一次)
+        if (Date.now() - this._time > 100) {
+            if (progress <= 1) {
+                $bar.css('width', progress * 100 + '%');
+                this._time = Date.now();
+            }
+        }
+
+        // 隐藏
+        var timeoutId = this._timeoutId;
+        if (timeoutId) {
+            clearTimeout(timeoutId);
+        }
+        timeoutId = setTimeout(function () {
+            _this._hide();
+        }, 500);
+    },
+
+    _hide: function _hide() {
+        var $bar = this.$bar;
+        $bar.remove();
+
+        // 修改状态
+        this._time = 0;
+        this._isShow = false;
+        this._isRender = false;
+    }
+};
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
+  return typeof obj;
+} : function (obj) {
+  return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+};
+
+/*
+    上传图片
+*/
+
+// 构造函数
+function UploadImg(editor) {
+    this.editor = editor;
+}
+
+// 原型
+UploadImg.prototype = {
+    constructor: UploadImg,
+
+    // 根据 debug 弹出不同的信息
+    _alert: function _alert(alertInfo, debugInfo) {
+        var editor = this.editor;
+        var debug = editor.config.debug;
+        var customAlert = editor.config.customAlert;
+
+        if (debug) {
+            throw new Error('wangEditor: ' + (debugInfo || alertInfo));
+        } else {
+            if (customAlert && typeof customAlert === 'function') {
+                customAlert(alertInfo);
+            } else {
+                alert(alertInfo);
+            }
+        }
+    },
+
+    // 根据链接插入图片
+    insertLinkImg: function insertLinkImg(link) {
+        var _this2 = this;
+
+        if (!link) {
+            return;
+        }
+        var editor = this.editor;
+        var config = editor.config;
+
+        // 校验格式
+        var linkImgCheck = config.linkImgCheck;
+        var checkResult = void 0;
+        if (linkImgCheck && typeof linkImgCheck === 'function') {
+            checkResult = linkImgCheck(link);
+            if (typeof checkResult === 'string') {
+                // 校验失败,提示信息
+                alert(checkResult);
+                return;
+            }
+        }
+
+        editor.cmd.do('insertHTML', '<img src="' + link + '" style="max-width:100%;"/>');
+
+        // 验证图片 url 是否有效,无效的话给出提示
+        var img = document.createElement('img');
+        img.onload = function () {
+            var callback = config.linkImgCallback;
+            if (callback && typeof callback === 'function') {
+                callback(link);
+            }
+
+            img = null;
+        };
+        img.onerror = function () {
+            img = null;
+            // 无法成功下载图片
+            _this2._alert('插入图片错误', 'wangEditor: \u63D2\u5165\u56FE\u7247\u51FA\u9519\uFF0C\u56FE\u7247\u94FE\u63A5\u662F "' + link + '"\uFF0C\u4E0B\u8F7D\u8BE5\u94FE\u63A5\u5931\u8D25');
+            return;
+        };
+        img.onabort = function () {
+            img = null;
+        };
+        img.src = link;
+    },
+
+    // 上传图片
+    uploadImg: function uploadImg(files) {
+        var _this3 = this;
+
+        if (!files || !files.length) {
+            return;
+        }
+
+        // ------------------------------ 获取配置信息 ------------------------------
+        var editor = this.editor;
+        var config = editor.config;
+        var uploadImgServer = config.uploadImgServer;
+        var uploadImgShowBase64 = config.uploadImgShowBase64;
+
+        var maxSize = config.uploadImgMaxSize;
+        var maxSizeM = maxSize / 1024 / 1024;
+        var maxLength = config.uploadImgMaxLength || 10000;
+        var uploadFileName = config.uploadFileName || '';
+        var uploadImgParams = config.uploadImgParams || {};
+        var uploadImgParamsWithUrl = config.uploadImgParamsWithUrl;
+        var uploadImgHeaders = config.uploadImgHeaders || {};
+        var hooks = config.uploadImgHooks || {};
+        var timeout = config.uploadImgTimeout || 3000;
+        var withCredentials = config.withCredentials;
+        if (withCredentials == null) {
+            withCredentials = false;
+        }
+        var customUploadImg = config.customUploadImg;
+
+        if (!customUploadImg) {
+            // 没有 customUploadImg 的情况下,需要如下两个配置才能继续进行图片上传
+            if (!uploadImgServer && !uploadImgShowBase64) {
+                return;
+            }
+        }
+
+        // ------------------------------ 验证文件信息 ------------------------------
+        var resultFiles = [];
+        var errInfo = [];
+        arrForEach(files, function (file) {
+            var name = file.name;
+            var size = file.size;
+
+            // chrome 低版本 name === undefined
+            if (!name || !size) {
+                return;
+            }
+
+            if (/\.(jpg|jpeg|png|bmp|gif)$/i.test(name) === false) {
+                // 后缀名不合法,不是图片
+                errInfo.push('\u3010' + name + '\u3011\u4E0D\u662F\u56FE\u7247');
+                return;
+            }
+            if (maxSize < size) {
+                // 上传图片过大
+                errInfo.push('\u3010' + name + '\u3011\u5927\u4E8E ' + maxSizeM + 'M');
+                return;
+            }
+
+            // 验证通过的加入结果列表
+            resultFiles.push(file);
+        });
+        // 抛出验证信息
+        if (errInfo.length) {
+            this._alert('图片验证未通过: \n' + errInfo.join('\n'));
+            return;
+        }
+        if (resultFiles.length > maxLength) {
+            this._alert('一次最多上传' + maxLength + '张图片');
+            return;
+        }
+
+        // ------------------------------ 自定义上传 ------------------------------
+        if (customUploadImg && typeof customUploadImg === 'function') {
+            customUploadImg(resultFiles, this.insertLinkImg.bind(this));
+
+            // 阻止以下代码执行
+            return;
+        }
+
+        // 添加图片数据
+        var formdata = new FormData();
+        arrForEach(resultFiles, function (file) {
+            var name = uploadFileName || file.name;
+            formdata.append(name, file);
+        });
+
+        // ------------------------------ 上传图片 ------------------------------
+        if (uploadImgServer && typeof uploadImgServer === 'string') {
+            // 添加参数
+            var uploadImgServerArr = uploadImgServer.split('#');
+            uploadImgServer = uploadImgServerArr[0];
+            var uploadImgServerHash = uploadImgServerArr[1] || '';
+            objForEach(uploadImgParams, function (key, val) {
+                val = encodeURIComponent(val);
+
+                // 第一,将参数拼接到 url 中
+                if (uploadImgParamsWithUrl) {
+                    if (uploadImgServer.indexOf('?') > 0) {
+                        uploadImgServer += '&';
+                    } else {
+                        uploadImgServer += '?';
+                    }
+                    uploadImgServer = uploadImgServer + key + '=' + val;
+                }
+
+                // 第二,将参数添加到 formdata 中
+                formdata.append(key, val);
+            });
+            if (uploadImgServerHash) {
+                uploadImgServer += '#' + uploadImgServerHash;
+            }
+
+            // 定义 xhr
+            var xhr = new XMLHttpRequest();
+            xhr.open('POST', uploadImgServer);
+
+            // 设置超时
+            xhr.timeout = timeout;
+            xhr.ontimeout = function () {
+                // hook - timeout
+                if (hooks.timeout && typeof hooks.timeout === 'function') {
+                    hooks.timeout(xhr, editor);
+                }
+
+                _this3._alert('上传图片超时');
+            };
+
+            // 监控 progress
+            if (xhr.upload) {
+                xhr.upload.onprogress = function (e) {
+                    var percent = void 0;
+                    // 进度条
+                    var progressBar = new Progress(editor);
+                    if (e.lengthComputable) {
+                        percent = e.loaded / e.total;
+                        progressBar.show(percent);
+                    }
+                };
+            }
+
+            // 返回数据
+            xhr.onreadystatechange = function () {
+                var result = void 0;
+                if (xhr.readyState === 4) {
+                    if (xhr.status < 200 || xhr.status >= 300) {
+                        // hook - error
+                        if (hooks.error && typeof hooks.error === 'function') {
+                            hooks.error(xhr, editor);
+                        }
+
+                        // xhr 返回状态错误
+                        _this3._alert('上传图片发生错误', '\u4E0A\u4F20\u56FE\u7247\u53D1\u751F\u9519\u8BEF\uFF0C\u670D\u52A1\u5668\u8FD4\u56DE\u72B6\u6001\u662F ' + xhr.status);
+                        return;
+                    }
+
+                    result = xhr.responseText;
+                    if ((typeof result === 'undefined' ? 'undefined' : _typeof(result)) !== 'object') {
+                        try {
+                            result = JSON.parse(result);
+                        } catch (ex) {
+                            // hook - fail
+                            if (hooks.fail && typeof hooks.fail === 'function') {
+                                hooks.fail(xhr, editor, result);
+                            }
+
+                            _this3._alert('上传图片失败', '上传图片返回结果错误,返回结果是: ' + result);
+                            return;
+                        }
+                    }
+                    if (!hooks.customInsert && result.errno != '0') {
+                        // hook - fail
+                        if (hooks.fail && typeof hooks.fail === 'function') {
+                            hooks.fail(xhr, editor, result);
+                        }
+
+                        // 数据错误
+                        _this3._alert('上传图片失败', '上传图片返回结果错误,返回结果 errno=' + result.errno);
+                    } else {
+                        if (hooks.customInsert && typeof hooks.customInsert === 'function') {
+                            // 使用者自定义插入方法
+                            hooks.customInsert(_this3.insertLinkImg.bind(_this3), result, editor);
+                        } else {
+                            // 将图片插入编辑器
+                            var data = result.data || [];
+                            data.forEach(function (link) {
+                                _this3.insertLinkImg(link);
+                            });
+                        }
+
+                        // hook - success
+                        if (hooks.success && typeof hooks.success === 'function') {
+                            hooks.success(xhr, editor, result);
+                        }
+                    }
+                }
+            };
+
+            // hook - before
+            if (hooks.before && typeof hooks.before === 'function') {
+                var beforeResult = hooks.before(xhr, editor, resultFiles);
+                if (beforeResult && (typeof beforeResult === 'undefined' ? 'undefined' : _typeof(beforeResult)) === 'object') {
+                    if (beforeResult.prevent) {
+                        // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传
+                        this._alert(beforeResult.msg);
+                        return;
+                    }
+                }
+            }
+
+            // 自定义 headers
+            objForEach(uploadImgHeaders, function (key, val) {
+                xhr.setRequestHeader(key, val);
+            });
+
+            // 跨域传 cookie
+            xhr.withCredentials = withCredentials;
+
+            // 发送请求
+            xhr.send(formdata);
+
+            // 注意,要 return 。不去操作接下来的 base64 显示方式
+            return;
+        }
+
+        // ------------------------------ 显示 base64 格式 ------------------------------
+        if (uploadImgShowBase64) {
+            arrForEach(files, function (file) {
+                var _this = _this3;
+                var reader = new FileReader();
+                reader.readAsDataURL(file);
+                reader.onload = function () {
+                    _this.insertLinkImg(this.result);
+                };
+            });
+        }
+    }
+};
+
+/*
+    编辑器构造函数
+*/
+
+// id,累加
+var editorId = 1;
+
+// 构造函数
+function Editor(toolbarSelector, textSelector) {
+    if (toolbarSelector == null) {
+        // 没有传入任何参数,报错
+        throw new Error('错误:初始化编辑器时候未传入任何参数,请查阅文档');
+    }
+    // id,用以区分单个页面不同的编辑器对象
+    this.id = 'wangEditor-' + editorId++;
+
+    this.toolbarSelector = toolbarSelector;
+    this.textSelector = textSelector;
+
+    // 自定义配置
+    this.customConfig = {};
+}
+
+// 修改原型
+Editor.prototype = {
+    constructor: Editor,
+
+    // 初始化配置
+    _initConfig: function _initConfig() {
+        // _config 是默认配置,this.customConfig 是用户自定义配置,将它们 merge 之后再赋值
+        var target = {};
+        this.config = Object.assign(target, config, this.customConfig);
+
+        // 将语言配置,生成正则表达式
+        var langConfig = this.config.lang || {};
+        var langArgs = [];
+        objForEach(langConfig, function (key, val) {
+            // key 即需要生成正则表达式的规则,如“插入链接”
+            // val 即需要被替换成的语言,如“insert link”
+            langArgs.push({
+                reg: new RegExp(key, 'img'),
+                val: val
+
+            });
+        });
+        this.config.langArgs = langArgs;
+    },
+
+    // 初始化 DOM
+    _initDom: function _initDom() {
+        var _this = this;
+
+        var toolbarSelector = this.toolbarSelector;
+        var $toolbarSelector = $(toolbarSelector);
+        var textSelector = this.textSelector;
+
+        var config$$1 = this.config;
+        var zIndex = config$$1.zIndex;
+
+        // 定义变量
+        var $toolbarElem = void 0,
+            $textContainerElem = void 0,
+            $textElem = void 0,
+            $children = void 0;
+
+        if (textSelector == null) {
+            // 只传入一个参数,即是容器的选择器或元素,toolbar 和 text 的元素自行创建
+            $toolbarElem = $('<div></div>');
+            $textContainerElem = $('<div></div>');
+
+            // 将编辑器区域原有的内容,暂存起来
+            $children = $toolbarSelector.children();
+
+            // 添加到 DOM 结构中
+            $toolbarSelector.append($toolbarElem).append($textContainerElem);
+
+            // 自行创建的,需要配置默认的样式
+            $toolbarElem.css('background-color', '#f1f1f1').css('border', '1px solid #ccc');
+            $textContainerElem.css('border', '1px solid #ccc').css('border-top', 'none').css('height', '300px');
+        } else {
+            // toolbar 和 text 的选择器都有值,记录属性
+            $toolbarElem = $toolbarSelector;
+            $textContainerElem = $(textSelector);
+            // 将编辑器区域原有的内容,暂存起来
+            $children = $textContainerElem.children();
+        }
+
+        // 编辑区域
+        $textElem = $('<div></div>');
+        $textElem.attr('contenteditable', 'true').css('width', '100%').css('height', '100%');
+
+        // 初始化编辑区域内容
+        if ($children && $children.length) {
+            $textElem.append($children);
+        } else {
+            $textElem.append($('<p><br></p>'));
+        }
+
+        // 编辑区域加入DOM
+        $textContainerElem.append($textElem);
+
+        // 设置通用的 class
+        $toolbarElem.addClass('w-e-toolbar');
+        $textContainerElem.addClass('w-e-text-container');
+        $textContainerElem.css('z-index', zIndex);
+        $textElem.addClass('w-e-text');
+
+        // 添加 ID
+        var toolbarElemId = getRandom('toolbar-elem');
+        $toolbarElem.attr('id', toolbarElemId);
+        var textElemId = getRandom('text-elem');
+        $textElem.attr('id', textElemId);
+
+        // 记录属性
+        this.$toolbarElem = $toolbarElem;
+        this.$textContainerElem = $textContainerElem;
+        this.$textElem = $textElem;
+        this.toolbarElemId = toolbarElemId;
+        this.textElemId = textElemId;
+
+        // 记录输入法的开始和结束
+        var compositionEnd = true;
+        $textContainerElem.on('compositionstart', function () {
+            // 输入法开始输入
+            compositionEnd = false;
+        });
+        $textContainerElem.on('compositionend', function () {
+            // 输入法结束输入
+            compositionEnd = true;
+        });
+
+        // 绑定 onchange
+        $textContainerElem.on('click keyup', function () {
+            // 输入法结束才出发 onchange
+            compositionEnd && _this.change && _this.change();
+        });
+        $toolbarElem.on('click', function () {
+            this.change && this.change();
+        });
+
+        //绑定 onfocus 与 onblur 事件
+        if (config$$1.onfocus || config$$1.onblur) {
+            // 当前编辑器是否是焦点状态
+            this.isFocus = false;
+
+            $(document).on('click', function (e) {
+                //判断当前点击元素是否在编辑器内
+                var isChild = $textElem.isContain($(e.target));
+
+                //判断当前点击元素是否为工具栏
+                var isToolbar = $toolbarElem.isContain($(e.target));
+                var isMenu = $toolbarElem[0] == e.target ? true : false;
+
+                if (!isChild) {
+                    //若为选择工具栏中的功能,则不视为成blur操作
+                    if (isToolbar && !isMenu) {
+                        return;
+                    }
+
+                    if (_this.isFocus) {
+                        _this.onblur && _this.onblur();
+                    }
+                    _this.isFocus = false;
+                } else {
+                    if (!_this.isFocus) {
+                        _this.onfocus && _this.onfocus();
+                    }
+                    _this.isFocus = true;
+                }
+            });
+        }
+    },
+
+    // 封装 command
+    _initCommand: function _initCommand() {
+        this.cmd = new Command(this);
+    },
+
+    // 封装 selection range API
+    _initSelectionAPI: function _initSelectionAPI() {
+        this.selection = new API(this);
+    },
+
+    // 添加图片上传
+    _initUploadImg: function _initUploadImg() {
+        this.uploadImg = new UploadImg(this);
+    },
+
+    // 初始化菜单
+    _initMenus: function _initMenus() {
+        this.menus = new Menus(this);
+        this.menus.init();
+    },
+
+    // 添加 text 区域
+    _initText: function _initText() {
+        this.txt = new Text(this);
+        this.txt.init();
+    },
+
+    // 初始化选区,将光标定位到内容尾部
+    initSelection: function initSelection(newLine) {
+        var $textElem = this.$textElem;
+        var $children = $textElem.children();
+        if (!$children.length) {
+            // 如果编辑器区域无内容,添加一个空行,重新设置选区
+            $textElem.append($('<p><br></p>'));
+            this.initSelection();
+            return;
+        }
+
+        var $last = $children.last();
+
+        if (newLine) {
+            // 新增一个空行
+            var html = $last.html().toLowerCase();
+            var nodeName = $last.getNodeName();
+            if (html !== '<br>' && html !== '<br\/>' || nodeName !== 'P') {
+                // 最后一个元素不是 <p><br></p>,添加一个空行,重新设置选区
+                $textElem.append($('<p><br></p>'));
+                this.initSelection();
+                return;
+            }
+        }
+
+        this.selection.createRangeByElem($last, false, true);
+        this.selection.restoreSelection();
+    },
+
+    // 绑定事件
+    _bindEvent: function _bindEvent() {
+        // -------- 绑定 onchange 事件 --------
+        var onChangeTimeoutId = 0;
+        var beforeChangeHtml = this.txt.html();
+        var config$$1 = this.config;
+
+        // onchange 触发延迟时间
+        var onchangeTimeout = config$$1.onchangeTimeout;
+        onchangeTimeout = parseInt(onchangeTimeout, 10);
+        if (!onchangeTimeout || onchangeTimeout <= 0) {
+            onchangeTimeout = 200;
+        }
+
+        var onchange = config$$1.onchange;
+        if (onchange && typeof onchange === 'function') {
+            // 触发 change 的有三个场景:
+            // 1. $textContainerElem.on('click keyup')
+            // 2. $toolbarElem.on('click')
+            // 3. editor.cmd.do()
+            this.change = function () {
+                // 判断是否有变化
+                var currentHtml = this.txt.html();
+
+                if (currentHtml.length === beforeChangeHtml.length) {
+                    // 需要比较每一个字符
+                    if (currentHtml === beforeChangeHtml) {
+                        return;
+                    }
+                }
+
+                // 执行,使用节流
+                if (onChangeTimeoutId) {
+                    clearTimeout(onChangeTimeoutId);
+                }
+                onChangeTimeoutId = setTimeout(function () {
+                    // 触发配置的 onchange 函数
+                    onchange(currentHtml);
+                    beforeChangeHtml = currentHtml;
+                }, onchangeTimeout);
+            };
+        }
+
+        // -------- 绑定 onblur 事件 --------
+        var onblur = config$$1.onblur;
+        if (onblur && typeof onblur === 'function') {
+            this.onblur = function () {
+                var currentHtml = this.txt.html();
+                onblur(currentHtml);
+            };
+        }
+
+        // -------- 绑定 onfocus 事件 --------
+        var onfocus = config$$1.onfocus;
+        if (onfocus && typeof onfocus === 'function') {
+            this.onfocus = function () {
+                onfocus();
+            };
+        }
+    },
+
+    // 创建编辑器
+    create: function create() {
+        // 初始化配置信息
+        this._initConfig();
+
+        // 初始化 DOM
+        this._initDom();
+
+        // 封装 command API
+        this._initCommand();
+
+        // 封装 selection range API
+        this._initSelectionAPI();
+
+        // 添加 text
+        this._initText();
+
+        // 初始化菜单
+        this._initMenus();
+
+        // 添加 图片上传
+        this._initUploadImg();
+
+        // 初始化选区,将光标定位到内容尾部
+        this.initSelection(true);
+
+        // 绑定事件
+        this._bindEvent();
+    },
+
+    // 解绑所有事件(暂时不对外开放)
+    _offAllEvent: function _offAllEvent() {
+        $.offAll();
+    }
+};
+
+// 检验是否浏览器环境
+try {
+    document;
+} catch (ex) {
+    throw new Error('请在浏览器环境下运行');
+}
+
+// polyfill
+polyfill();
+
+// 这里的 `inlinecss` 将被替换成 css 代码的内容,详情可去 ./gulpfile.js 中搜索 `inlinecss` 关键字
+var inlinecss = '.w-e-toolbar,.w-e-text-container,.w-e-menu-panel {  padding: 0;  margin: 0;  box-sizing: border-box;}.w-e-toolbar *,.w-e-text-container *,.w-e-menu-panel * {  padding: 0;  margin: 0;  box-sizing: border-box;}.w-e-clear-fix:after {  content: "";  display: table;  clear: both;}.w-e-toolbar .w-e-droplist {  position: absolute;  left: 0;  top: 0;  background-color: #fff;  border: 1px solid #f1f1f1;  border-right-color: #ccc;  border-bottom-color: #ccc;}.w-e-toolbar .w-e-droplist .w-e-dp-title {  text-align: center;  color: #999;  line-height: 2;  border-bottom: 1px solid #f1f1f1;  font-size: 13px;}.w-e-toolbar .w-e-droplist ul.w-e-list {  list-style: none;  line-height: 1;}.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item {  color: #333;  padding: 5px 0;}.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item:hover {  background-color: #f1f1f1;}.w-e-toolbar .w-e-droplist ul.w-e-block {  list-style: none;  text-align: left;  padding: 5px;}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item {  display: inline-block;  *display: inline;  *zoom: 1;  padding: 3px 5px;}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item:hover {  background-color: #f1f1f1;}@font-face {  font-family: \'w-e-icon\';  src: url(data:application/x-font-woff;charset=utf-8;base64,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) format(\'truetype\');  font-weight: normal;  font-style: normal;}[class^="w-e-icon-"],[class*=" w-e-icon-"] {  /* use !important to prevent issues with browser extensions that change fonts */  font-family: \'w-e-icon\' !important;  speak: none;  font-style: normal;  font-weight: normal;  font-variant: normal;  text-transform: none;  line-height: 1;  /* Better Font Rendering =========== */  -webkit-font-smoothing: antialiased;  -moz-osx-font-smoothing: grayscale;}.w-e-icon-close:before {  content: "\\f00d";}.w-e-icon-upload2:before {  content: "\\e9c6";}.w-e-icon-trash-o:before {  content: "\\f014";}.w-e-icon-header:before {  content: "\\f1dc";}.w-e-icon-pencil2:before {  content: "\\e906";}.w-e-icon-paint-brush:before {  content: "\\f1fc";}.w-e-icon-image:before {  content: "\\e90d";}.w-e-icon-play:before {  content: "\\e912";}.w-e-icon-location:before {  content: "\\e947";}.w-e-icon-undo:before {  content: "\\e965";}.w-e-icon-redo:before {  content: "\\e966";}.w-e-icon-quotes-left:before {  content: "\\e977";}.w-e-icon-list-numbered:before {  content: "\\e9b9";}.w-e-icon-list2:before {  content: "\\e9bb";}.w-e-icon-link:before {  content: "\\e9cb";}.w-e-icon-happy:before {  content: "\\e9df";}.w-e-icon-bold:before {  content: "\\ea62";}.w-e-icon-underline:before {  content: "\\ea63";}.w-e-icon-italic:before {  content: "\\ea64";}.w-e-icon-strikethrough:before {  content: "\\ea65";}.w-e-icon-table2:before {  content: "\\ea71";}.w-e-icon-paragraph-left:before {  content: "\\ea77";}.w-e-icon-paragraph-center:before {  content: "\\ea78";}.w-e-icon-paragraph-right:before {  content: "\\ea79";}.w-e-icon-terminal:before {  content: "\\f120";}.w-e-icon-page-break:before {  content: "\\ea68";}.w-e-icon-cancel-circle:before {  content: "\\ea0d";}.w-e-toolbar {  display: -webkit-box;  display: -ms-flexbox;  display: flex;  padding: 0 5px;  /* flex-wrap: wrap; */  /* 单个菜单 */}.w-e-toolbar .w-e-menu {  position: relative;  text-align: center;  padding: 5px 10px;  cursor: pointer;}.w-e-toolbar .w-e-menu i {  color: #999;}.w-e-toolbar .w-e-menu:hover i {  color: #333;}.w-e-toolbar .w-e-active i {  color: #1e88e5;}.w-e-toolbar .w-e-active:hover i {  color: #1e88e5;}.w-e-text-container .w-e-panel-container {  position: absolute;  top: 0;  left: 50%;  border: 1px solid #ccc;  border-top: 0;  box-shadow: 1px 1px 2px #ccc;  color: #333;  background-color: #fff;  /* 为 emotion panel 定制的样式 */  /* 上传图片的 panel 定制样式 */}.w-e-text-container .w-e-panel-container .w-e-panel-close {  position: absolute;  right: 0;  top: 0;  padding: 5px;  margin: 2px 5px 0 0;  cursor: pointer;  color: #999;}.w-e-text-container .w-e-panel-container .w-e-panel-close:hover {  color: #333;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title {  list-style: none;  display: -webkit-box;  display: -ms-flexbox;  display: flex;  font-size: 14px;  margin: 2px 10px 0 10px;  border-bottom: 1px solid #f1f1f1;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-item {  padding: 3px 5px;  color: #999;  cursor: pointer;  margin: 0 3px;  position: relative;  top: 1px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-active {  color: #333;  border-bottom: 1px solid #333;  cursor: default;  font-weight: 700;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content {  padding: 10px 15px 10px 15px;  font-size: 16px;  /* 输入框的样式 */  /* 按钮的样式 */}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content button:focus {  outline: none;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea {  width: 100%;  border: 1px solid #ccc;  padding: 5px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus {  border-color: #1e88e5;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text] {  border: none;  border-bottom: 1px solid #ccc;  font-size: 14px;  height: 20px;  color: #333;  text-align: left;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].small {  width: 30px;  text-align: center;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].block {  display: block;  width: 100%;  margin: 10px 0;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text]:focus {  border-bottom: 2px solid #1e88e5;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button {  font-size: 14px;  color: #1e88e5;  border: none;  padding: 5px 10px;  background-color: #fff;  cursor: pointer;  border-radius: 3px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.left {  float: left;  margin-right: 10px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.right {  float: right;  margin-left: 10px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.gray {  color: #999;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.red {  color: #c24f4a;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button:hover {  background-color: #f1f1f1;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container:after {  content: "";  display: table;  clear: both;}.w-e-text-container .w-e-panel-container .w-e-emoticon-container .w-e-item {  cursor: pointer;  font-size: 18px;  padding: 0 3px;  display: inline-block;  *display: inline;  *zoom: 1;}.w-e-text-container .w-e-panel-container .w-e-up-img-container {  text-align: center;}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn {  display: inline-block;  *display: inline;  *zoom: 1;  color: #999;  cursor: pointer;  font-size: 60px;  line-height: 1;}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn:hover {  color: #333;}.w-e-text-container {  position: relative;}.w-e-text-container .w-e-progress {  position: absolute;  background-color: #1e88e5;  bottom: 0;  left: 0;  height: 1px;}.w-e-text {  padding: 0 10px;  overflow-y: scroll;}.w-e-text p,.w-e-text h1,.w-e-text h2,.w-e-text h3,.w-e-text h4,.w-e-text h5,.w-e-text table,.w-e-text pre {  margin: 10px 0;  line-height: 1.5;}.w-e-text ul,.w-e-text ol {  margin: 10px 0 10px 20px;}.w-e-text blockquote {  display: block;  border-left: 8px solid #d0e5f2;  padding: 5px 10px;  margin: 10px 0;  line-height: 1.4;  font-size: 100%;  background-color: #f1f1f1;}.w-e-text code {  display: inline-block;  *display: inline;  *zoom: 1;  background-color: #f1f1f1;  border-radius: 3px;  padding: 3px 5px;  margin: 0 3px;}.w-e-text pre code {  display: block;}.w-e-text table {  border-top: 1px solid #ccc;  border-left: 1px solid #ccc;}.w-e-text table td,.w-e-text table th {  border-bottom: 1px solid #ccc;  border-right: 1px solid #ccc;  padding: 3px 5px;}.w-e-text table th {  border-bottom: 2px solid #ccc;  text-align: center;}.w-e-text:focus {  outline: none;}.w-e-text img {  cursor: pointer;}.w-e-text img:hover {  box-shadow: 0 0 5px #333;}';
+
+// 将 css 代码添加到 <style> 中
+var style = document.createElement('style');
+style.type = 'text/css';
+style.innerHTML = inlinecss;
+document.getElementsByTagName('HEAD').item(0).appendChild(style);
+
+// 返回
+var index = window.wangEditor || Editor;
+
+return index;
+
+})));
diff --git a/novel-admin/src/main/resources/static/wangEditor/release/wangEditor.min.css b/novel-admin/src/main/resources/static/wangEditor/release/wangEditor.min.css
new file mode 100644
index 0000000..5ec136d
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/release/wangEditor.min.css
@@ -0,0 +1 @@
+.w-e-text-container .w-e-panel-container .w-e-panel-tab-content button:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus,.w-e-text:focus{outline:0}.w-e-menu-panel,.w-e-menu-panel *,.w-e-text-container,.w-e-text-container *,.w-e-toolbar,.w-e-toolbar *{padding:0;margin:0;box-sizing:border-box}.w-e-clear-fix:after{content:"";display:table;clear:both}.w-e-toolbar .w-e-droplist{position:absolute;left:0;top:0;background-color:#fff;border:1px solid #f1f1f1;border-right-color:#ccc;border-bottom-color:#ccc}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item:hover,.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item:hover{background-color:#f1f1f1}.w-e-toolbar .w-e-droplist .w-e-dp-title{text-align:center;color:#999;line-height:2;border-bottom:1px solid #f1f1f1;font-size:13px}.w-e-toolbar .w-e-droplist ul.w-e-list{list-style:none;line-height:1}.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item{color:#333;padding:5px 0}.w-e-toolbar .w-e-droplist ul.w-e-block{list-style:none;text-align:left;padding:5px}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item{display:inline-block;padding:3px 5px}@font-face{font-family:w-e-icon;src:url(data:application/x-font-woff;charset=utf-8;base64,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) format('truetype');font-weight:400;font-style:normal}[class*=" w-e-icon-"],[class^=w-e-icon-]{font-family:w-e-icon!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.w-e-icon-close:before{content:"\f00d"}.w-e-icon-upload2:before{content:"\e9c6"}.w-e-icon-trash-o:before{content:"\f014"}.w-e-icon-header:before{content:"\f1dc"}.w-e-icon-pencil2:before{content:"\e906"}.w-e-icon-paint-brush:before{content:"\f1fc"}.w-e-icon-image:before{content:"\e90d"}.w-e-icon-play:before{content:"\e912"}.w-e-icon-location:before{content:"\e947"}.w-e-icon-undo:before{content:"\e965"}.w-e-icon-redo:before{content:"\e966"}.w-e-icon-quotes-left:before{content:"\e977"}.w-e-icon-list-numbered:before{content:"\e9b9"}.w-e-icon-list2:before{content:"\e9bb"}.w-e-icon-link:before{content:"\e9cb"}.w-e-icon-happy:before{content:"\e9df"}.w-e-icon-bold:before{content:"\ea62"}.w-e-icon-underline:before{content:"\ea63"}.w-e-icon-italic:before{content:"\ea64"}.w-e-icon-strikethrough:before{content:"\ea65"}.w-e-icon-table2:before{content:"\ea71"}.w-e-icon-paragraph-left:before{content:"\ea77"}.w-e-icon-paragraph-center:before{content:"\ea78"}.w-e-icon-paragraph-right:before{content:"\ea79"}.w-e-icon-terminal:before{content:"\f120"}.w-e-icon-page-break:before{content:"\ea68"}.w-e-icon-cancel-circle:before{content:"\ea0d"}.w-e-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 5px}.w-e-toolbar .w-e-menu{position:relative;text-align:center;padding:5px 10px;cursor:pointer}.w-e-toolbar .w-e-menu i{color:#999}.w-e-toolbar .w-e-menu:hover i{color:#333}.w-e-toolbar .w-e-active i,.w-e-toolbar .w-e-active:hover i{color:#1e88e5}.w-e-text-container .w-e-panel-container{position:absolute;top:0;left:50%;border:1px solid #ccc;border-top:0;box-shadow:1px 1px 2px #ccc;color:#333;background-color:#fff}.w-e-text-container .w-e-panel-container .w-e-panel-close{position:absolute;right:0;top:0;padding:5px;margin:2px 5px 0 0;cursor:pointer;color:#999}.w-e-text-container .w-e-panel-container .w-e-panel-close:hover{color:#333}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title{list-style:none;display:-webkit-box;display:-ms-flexbox;display:flex;font-size:14px;margin:2px 10px 0;border-bottom:1px solid #f1f1f1}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-item{padding:3px 5px;color:#999;cursor:pointer;margin:0 3px;position:relative;top:1px}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-active{color:#333;border-bottom:1px solid #333;cursor:default;font-weight:700}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content{padding:10px 15px;font-size:16px}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea{width:100%;border:1px solid #ccc;padding:5px}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus{border-color:#1e88e5}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text]{border:none;border-bottom:1px solid #ccc;font-size:14px;height:20px;color:#333;text-align:left}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].small{width:30px;text-align:center}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].block{display:block;width:100%;margin:10px 0}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text]:focus{border-bottom:2px solid #1e88e5}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button{font-size:14px;color:#1e88e5;border:none;padding:5px 10px;background-color:#fff;cursor:pointer;border-radius:3px}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.left{float:left;margin-right:10px}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.right{float:right;margin-left:10px}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.gray{color:#999}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.red{color:#c24f4a}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button:hover{background-color:#f1f1f1}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container:after{content:"";display:table;clear:both}.w-e-text-container .w-e-panel-container .w-e-emoticon-container .w-e-item{cursor:pointer;font-size:18px;padding:0 3px;display:inline-block}.w-e-text-container .w-e-panel-container .w-e-up-img-container{text-align:center}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn{display:inline-block;color:#999;cursor:pointer;font-size:60px;line-height:1}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn:hover{color:#333}.w-e-text-container{position:relative}.w-e-text-container .w-e-progress{position:absolute;background-color:#1e88e5;bottom:0;left:0;height:1px}.w-e-text{padding:0 10px;overflow-y:scroll}.w-e-text h1,.w-e-text h2,.w-e-text h3,.w-e-text h4,.w-e-text h5,.w-e-text p,.w-e-text pre,.w-e-text table{margin:10px 0;line-height:1.5}.w-e-text ol,.w-e-text ul{margin:10px 0 10px 20px}.w-e-text blockquote{display:block;border-left:8px solid #d0e5f2;padding:5px 10px;margin:10px 0;line-height:1.4;font-size:100%;background-color:#f1f1f1}.w-e-text code{display:inline-block;background-color:#f1f1f1;border-radius:3px;padding:3px 5px;margin:0 3px}.w-e-text pre code{display:block}.w-e-text table{border-top:1px solid #ccc;border-left:1px solid #ccc}.w-e-text table td,.w-e-text table th{border-bottom:1px solid #ccc;border-right:1px solid #ccc;padding:3px 5px}.w-e-text table th{border-bottom:2px solid #ccc;text-align:center}.w-e-text img{cursor:pointer}.w-e-text img:hover{box-shadow:0 0 5px #333}
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/release/wangEditor.min.js b/novel-admin/src/main/resources/static/wangEditor/release/wangEditor.min.js
new file mode 100644
index 0000000..fbcc47d
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/release/wangEditor.min.js
@@ -0,0 +1,4 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.wangEditor=e()}(this,function(){"use strict";function t(t){var e=void 0;return e=document.createElement("div"),e.innerHTML=t,e.children}function e(t){return!!t&&(t instanceof HTMLCollection||t instanceof NodeList)}function n(t){var n=document.querySelectorAll(t);return e(n)?n:[n]}function i(o){if(o){if(o instanceof i)return o;this.selector=o;var r=o.nodeType,a=[];9===r?a=[o]:1===r?a=[o]:e(o)||o instanceof Array?a=o:"string"==typeof o&&(o=o.replace("/\n/mg","").trim(),a=0===o.indexOf("<")?t(o):n(o));var c=a.length;if(!c)return this;var A=void 0;for(A=0;A<c;A++)this[A]=a[A];this.length=c}}function o(t){return new i(t)}function r(t,e){var n=void 0;for(n in t)if(t.hasOwnProperty(n)&&!1===e.call(t,n,t[n]))break}function a(t,e){var n=void 0,i=void 0,o=t.length||0;for(n=0;n<o&&(i=t[n],!1!==e.call(t,i,n));n++);}function c(t){return t+Math.random().toString().slice(2)}function A(t){return null==t?"":t.replace(/</gm,"&lt;").replace(/>/gm,"&gt;").replace(/"/gm,"&quot;")}function s(t){return"function"==typeof t}function l(t){this.editor=t,this.$elem=o('<div class="w-e-menu">\n            <i class="w-e-icon-bold"><i/>\n        </div>'),this.type="click",this._active=!1}function d(t,e){var n=this,i=t.editor;this.menu=t,this.opt=e;var r=o('<div class="w-e-droplist"></div>'),a=e.$title,c=void 0;a&&(c=a.html(),c=J(i,c),a.html(c),a.addClass("w-e-dp-title"),r.append(a));var A=e.list||[],s=e.type||"list",l=e.onClick||O,d=o('<ul class="'+("list"===s?"w-e-list":"w-e-block")+'"></ul>');r.append(d),A.forEach(function(t){var e=t.$elem,r=e.html();r=J(i,r),e.html(r);var a=t.value,c=o('<li class="w-e-item"></li>');e&&(c.append(e),d.append(c),c.on("click",function(t){l(a),n.hideTimeoutId=setTimeout(function(){n.hide()},0)}))}),r.on("mouseleave",function(t){n.hideTimeoutId=setTimeout(function(){n.hide()},0)}),this.$container=r,this._rendered=!1,this._show=!1}function u(t){var e=this;this.editor=t,this.$elem=o('<div class="w-e-menu"><i class="w-e-icon-header"><i/></div>'),this.type="droplist",this._active=!1,this.droplist=new d(this,{width:100,$title:o("<p>设置标题</p>"),type:"list",list:[{$elem:o("<h1>H1</h1>"),value:"<h1>"},{$elem:o("<h2>H2</h2>"),value:"<h2>"},{$elem:o("<h3>H3</h3>"),value:"<h3>"},{$elem:o("<h4>H4</h4>"),value:"<h4>"},{$elem:o("<h5>H5</h5>"),value:"<h5>"},{$elem:o("<p>正文</p>"),value:"<p>"}],onClick:function(t){e._command(t)}})}function p(t,e){this.menu=t,this.opt=e}function h(t){this.editor=t,this.$elem=o('<div class="w-e-menu"><i class="w-e-icon-link"><i/></div>'),this.type="panel",this._active=!1}function f(t){this.editor=t,this.$elem=o('<div class="w-e-menu">\n            <i class="w-e-icon-italic"><i/>\n        </div>'),this.type="click",this._active=!1}function g(t){this.editor=t,this.$elem=o('<div class="w-e-menu">\n            <i class="w-e-icon-redo"><i/>\n        </div>'),this.type="click",this._active=!1}function m(t){this.editor=t,this.$elem=o('<div class="w-e-menu">\n            <i class="w-e-icon-strikethrough"><i/>\n        </div>'),this.type="click",this._active=!1}function w(t){this.editor=t,this.$elem=o('<div class="w-e-menu">\n            <i class="w-e-icon-underline"><i/>\n        </div>'),this.type="click",this._active=!1}function v(t){this.editor=t,this.$elem=o('<div class="w-e-menu">\n            <i class="w-e-icon-undo"><i/>\n        </div>'),this.type="click",this._active=!1}function b(t){var e=this;this.editor=t,this.$elem=o('<div class="w-e-menu"><i class="w-e-icon-list2"><i/></div>'),this.type="droplist",this._active=!1,this.droplist=new d(this,{width:120,$title:o("<p>设置列表</p>"),type:"list",list:[{$elem:o('<span><i class="w-e-icon-list-numbered"></i> 有序列表</span>'),value:"insertOrderedList"},{$elem:o('<span><i class="w-e-icon-list2"></i> 无序列表</span>'),value:"insertUnorderedList"}],onClick:function(t){e._command(t)}})}function y(t){var e=this;this.editor=t,this.$elem=o('<div class="w-e-menu"><i class="w-e-icon-paragraph-left"><i/></div>'),this.type="droplist",this._active=!1,this.droplist=new d(this,{width:100,$title:o("<p>对齐方式</p>"),type:"list",list:[{$elem:o('<span><i class="w-e-icon-paragraph-left"></i> 靠左</span>'),value:"justifyLeft"},{$elem:o('<span><i class="w-e-icon-paragraph-center"></i> 居中</span>'),value:"justifyCenter"},{$elem:o('<span><i class="w-e-icon-paragraph-right"></i> 靠右</span>'),value:"justifyRight"}],onClick:function(t){e._command(t)}})}function x(t){var e=this;this.editor=t,this.$elem=o('<div class="w-e-menu"><i class="w-e-icon-pencil2"><i/></div>'),this.type="droplist";var n=t.config,i=n.colors||[];this._active=!1,this.droplist=new d(this,{width:120,$title:o("<p>文字颜色</p>"),type:"inline-block",list:i.map(function(t){return{$elem:o('<i style="color:'+t+';" class="w-e-icon-pencil2"></i>'),value:t}}),onClick:function(t){e._command(t)}})}function E(t){var e=this;this.editor=t,this.$elem=o('<div class="w-e-menu"><i class="w-e-icon-paint-brush"><i/></div>'),this.type="droplist";var n=t.config,i=n.colors||[];this._active=!1,this.droplist=new d(this,{width:120,$title:o("<p>背景色</p>"),type:"inline-block",list:i.map(function(t){return{$elem:o('<i style="color:'+t+';" class="w-e-icon-paint-brush"></i>'),value:t}}),onClick:function(t){e._command(t)}})}function C(t){this.editor=t,this.$elem=o('<div class="w-e-menu">\n            <i class="w-e-icon-quotes-left"><i/>\n        </div>'),this.type="click",this._active=!1}function B(t){this.editor=t,this.$elem=o('<div class="w-e-menu">\n            <i class="w-e-icon-terminal"><i/>\n        </div>'),this.type="panel",this._active=!1}function I(t){this.editor=t,this.$elem=o('<div class="w-e-menu">\n            <i class="w-e-icon-happy"><i/>\n        </div>'),this.type="panel",this._active=!1}function Q(t){this.editor=t,this.$elem=o('<div class="w-e-menu"><i class="w-e-icon-table2"><i/></div>'),this.type="panel",this._active=!1}function _(t){this.editor=t,this.$elem=o('<div class="w-e-menu"><i class="w-e-icon-play"><i/></div>'),this.type="panel",this._active=!1}function D(t){this.editor=t;var e=c("w-e-img");this.$elem=o('<div class="w-e-menu" id="'+e+'"><i class="w-e-icon-image"><i/></div>'),t.imgMenuId=e,this.type="panel",this._active=!1}function k(t){this.editor=t,this.menus={}}function M(t){var e=t.clipboardData||t.originalEvent&&t.originalEvent.clipboardData,n=void 0;return n=null==e?window.clipboardData&&window.clipboardData.getData("text"):e.getData("text/plain"),A(n)}function S(t,e){var n=t.clipboardData||t.originalEvent&&t.originalEvent.clipboardData,i=void 0,o=void 0;if(null==n?i=window.clipboardData&&window.clipboardData.getData("text"):(i=n.getData("text/plain"),o=n.getData("text/html")),!o&&i&&(o="<p>"+A(i)+"</p>"),o){var r=o.split("</html>");return 2===r.length&&(o=r[0]),o=o.replace(/<(meta|script|link).+?>/gim,""),o=o.replace(/<!--.*?-->/gm,""),o=o.replace(/\s?data-.+?=('|").+?('|")/gim,""),o=e?o.replace(/\s?(class|style)=('|").+?('|")/gim,""):o.replace(/\s?class=('|").+?('|")/gim,"")}}function U(t){var e=[];if(M(t))return e;var n=t.clipboardData||t.originalEvent&&t.originalEvent.clipboardData||{},i=n.items;return i?(r(i,function(t,n){var i=n.type;/image/i.test(i)&&e.push(n.getAsFile())}),e):e}function N(t){var e=[];return(t.childNodes()||[]).forEach(function(t){var n=void 0,i=t.nodeType;if(3===i&&(n=t.textContent),1===i){n={},n.tag=t.nodeName.toLowerCase();for(var r=[],a=t.attributes||{},c=a.length||0,A=0;A<c;A++){var s=a[A];r.push({name:s.name,value:s.value})}n.attrs=r,n.children=N(o(t))}e.push(n)}),e}function R(t){this.editor=t}function F(t){this.editor=t}function T(t){this.editor=t,this._currentRange=null}function j(t){this.editor=t,this._time=0,this._isShow=!1,this._isRender=!1,this._timeoutId=0,this.$textContainer=t.$textContainerElem,this.$bar=o('<div class="w-e-progress"></div>')}function H(t){this.editor=t}function Y(t,e){if(null==t)throw new Error("错误:初始化编辑器时候未传入任何参数,请查阅文档");this.id="wangEditor-"+K++,this.toolbarSelector=t,this.textSelector=e,this.customConfig={}}var L=[];i.prototype={constructor:i,forEach:function(t){var e=void 0;for(e=0;e<this.length;e++){var n=this[e];if(!1===t.call(n,n,e))break}return this},clone:function(t){var e=[];return this.forEach(function(n){e.push(n.cloneNode(!!t))}),o(e)},get:function(t){var e=this.length;return t>=e&&(t%=e),o(this[t])},first:function(){return this.get(0)},last:function(){var t=this.length;return this.get(t-1)},on:function(t,e,n){n||(n=e,e=null);var i=[];return i=t.split(/\s+/),this.forEach(function(t){i.forEach(function(i){if(i){if(L.push({elem:t,type:i,fn:n}),!e)return void t.addEventListener(i,n);t.addEventListener(i,function(t){var i=t.target;i.matches(e)&&n.call(i,t)})}})})},off:function(t,e){return this.forEach(function(n){n.removeEventListener(t,e)})},attr:function(t,e){return null==e?this[0].getAttribute(t):this.forEach(function(n){n.setAttribute(t,e)})},addClass:function(t){return t?this.forEach(function(e){var n=void 0;e.className?(n=e.className.split(/\s/),n=n.filter(function(t){return!!t.trim()}),n.indexOf(t)<0&&n.push(t),e.className=n.join(" ")):e.className=t}):this},removeClass:function(t){return t?this.forEach(function(e){var n=void 0;e.className&&(n=e.className.split(/\s/),n=n.filter(function(e){return!(!(e=e.trim())||e===t)}),e.className=n.join(" "))}):this},css:function(t,e){var n=t+":"+e+";";return this.forEach(function(e){var i=(e.getAttribute("style")||"").trim(),o=void 0,r=[];i?(o=i.split(";"),o.forEach(function(t){var e=t.split(":").map(function(t){return t.trim()});2===e.length&&r.push(e[0]+":"+e[1])}),r=r.map(function(e){return 0===e.indexOf(t)?n:e}),r.indexOf(n)<0&&r.push(n),e.setAttribute("style",r.join("; "))):e.setAttribute("style",n)})},show:function(){return this.css("display","block")},hide:function(){return this.css("display","none")},children:function(){var t=this[0];return t?o(t.children):null},childNodes:function(){var t=this[0];return t?o(t.childNodes):null},append:function(t){return this.forEach(function(e){t.forEach(function(t){e.appendChild(t)})})},remove:function(){return this.forEach(function(t){if(t.remove)t.remove();else{var e=t.parentElement;e&&e.removeChild(t)}})},isContain:function(t){var e=this[0],n=t[0];return e.contains(n)},getSizeData:function(){return this[0].getBoundingClientRect()},getNodeName:function(){return this[0].nodeName},find:function(t){return o(this[0].querySelectorAll(t))},text:function(t){return t?this.forEach(function(e){e.innerHTML=t}):this[0].innerHTML.replace(/<.*?>/g,function(){return""})},html:function(t){var e=this[0];return null==t?e.innerHTML:(e.innerHTML=t,this)},val:function(){return this[0].value.trim()},focus:function(){return this.forEach(function(t){t.focus()})},parent:function(){return o(this[0].parentElement)},parentUntil:function(t,e){var n=document.querySelectorAll(t),i=n.length;if(!i)return null;var r=e||this[0];if("BODY"===r.nodeName)return null;var a=r.parentElement,c=void 0;for(c=0;c<i;c++)if(a===n[c])return o(a);return this.parentUntil(t,a)},equal:function(t){return 1===t.nodeType?this[0]===t:this[0]===t[0]},insertBefore:function(t){var e=o(t),n=e[0];return n?this.forEach(function(t){n.parentNode.insertBefore(t,n)}):this},insertAfter:function(t){var e=o(t),n=e[0];return n?this.forEach(function(t){var e=n.parentNode;e.lastChild===n?e.appendChild(t):e.insertBefore(t,n.nextSibling)}):this}},o.offAll=function(){L.forEach(function(t){var e=t.elem,n=t.type,i=t.fn;e.removeEventListener(n,i)})};var P={menus:["head","bold","italic","underline","strikeThrough","foreColor","backColor","link","list","justify","quote","emoticon","image","table","video","code","undo","redo"],colors:["#000000","#eeece0","#1c487f","#4d80bf","#c24f4a","#8baa4a","#7b5ba1","#46acc8","#f9963b","#ffffff"],emotions:[{title:"默认",type:"image",content:[{alt:"[坏笑]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/50/pcmoren_huaixiao_org.png"},{alt:"[舔屏]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/pcmoren_tian_org.png"},{alt:"[污]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/pcmoren_wu_org.png"},{alt:"[允悲]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/2c/moren_yunbei_org.png"},{alt:"[笑而不语]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3a/moren_xiaoerbuyu_org.png"},{alt:"[费解]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/moren_feijie_org.png"},{alt:"[憧憬]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/37/moren_chongjing_org.png"},{alt:"[并不简单]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/fc/moren_bbjdnew_org.png"},{alt:"[微笑]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/5c/huanglianwx_org.gif"},{alt:"[酷]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/8a/pcmoren_cool2017_org.png"},{alt:"[嘻嘻]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/0b/tootha_org.gif"},{alt:"[哈哈]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6a/laugh.gif"},{alt:"[可爱]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/14/tza_org.gif"},{alt:"[可怜]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/af/kl_org.gif"},{alt:"[挖鼻]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/0b/wabi_org.gif"},{alt:"[吃惊]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/f4/cj_org.gif"},{alt:"[害羞]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6e/shamea_org.gif"},{alt:"[挤眼]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/c3/zy_org.gif"},{alt:"[闭嘴]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/29/bz_org.gif"},{alt:"[鄙视]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/71/bs2_org.gif"},{alt:"[爱你]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6d/lovea_org.gif"},{alt:"[泪]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/9d/sada_org.gif"},{alt:"[偷笑]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/19/heia_org.gif"},{alt:"[亲亲]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/8f/qq_org.gif"},{alt:"[生病]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/b6/sb_org.gif"},{alt:"[太开心]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/58/mb_org.gif"},{alt:"[白眼]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/d9/landeln_org.gif"},{alt:"[右哼哼]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/98/yhh_org.gif"},{alt:"[左哼哼]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6d/zhh_org.gif"},{alt:"[嘘]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/a6/x_org.gif"},{alt:"[衰]",src:"http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/af/cry.gif"}]},{title:"新浪",type:"image",content:[{src:"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/7a/shenshou_thumb.gif",alt:"[草泥马]"},{src:"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/60/horse2_thumb.gif",alt:"[神马]"},{src:"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/bc/fuyun_thumb.gif",alt:"[浮云]"},{src:"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/c9/geili_thumb.gif",alt:"[给力]"},{src:"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/f2/wg_thumb.gif",alt:"[围观]"},{src:"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/70/vw_thumb.gif",alt:"[威武]"},{src:"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/6e/panda_thumb.gif",alt:"[熊猫]"},{src:"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/81/rabbit_thumb.gif",alt:"[兔子]"},{src:"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/bc/otm_thumb.gif",alt:"[奥特曼]"},{src:"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/15/j_thumb.gif",alt:"[囧]"},{src:"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/89/hufen_thumb.gif",alt:"[互粉]"},{src:"http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/c4/liwu_thumb.gif",alt:"[礼物]"}]},{title:"emoji",type:"emoji",content:"😀 😃 😄 😁 😆 😅 😂 😊 😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 😜 😝 😛 🤑 🤗 🤓 😎 😏 😒 😞 😔 😟 😕 🙁  😣 😖 😫 😩 😤 😠 😡 😶 😐 😑 😯 😦 😧 😮 😲 😵 😳 😱 😨 😰 😢 😥 😭 😓 😪 😴 🙄 🤔 😬 🤐".split(/\s/)}],zIndex:1e4,debug:!1,linkCheck:function(t,e){return!0},linkImgCheck:function(t){return!0},pasteFilterStyle:!0,pasteTextHandle:function(t){return t},showLinkImg:!0,linkImgCallback:function(t){},uploadImgMaxSize:5242880,uploadImgShowBase64:!1,uploadFileName:"",uploadImgParams:{},uploadImgHeaders:{},withCredentials:!1,uploadImgTimeout:1e4,uploadImgHooks:{before:function(t,e,n){},success:function(t,e,n){},fail:function(t,e,n){},error:function(t,e){},timeout:function(t,e){}},qiniu:!1},z={_ua:navigator.userAgent,isWebkit:function(){return/webkit/i.test(this._ua)},isIE:function(){return"ActiveXObject"in window}};l.prototype={constructor:l,onClick:function(t){var e=this.editor,n=e.selection.isSelectionEmpty();n&&e.selection.createEmptyRange(),e.cmd.do("bold"),n&&(e.selection.collapseRange(),e.selection.restoreSelection())},tryChangeActive:function(t){var e=this.editor,n=this.$elem;e.cmd.queryCommandState("bold")?(this._active=!0,n.addClass("w-e-active")):(this._active=!1,n.removeClass("w-e-active"))}};var J=function(t,e){var n=t.config.langArgs||[],i=e;return n.forEach(function(t){var e=t.reg,n=t.val;e.test(i)&&(i=i.replace(e,function(){return n}))}),i},O=function(){};d.prototype={constructor:d,show:function(){this.hideTimeoutId&&clearTimeout(this.hideTimeoutId);var t=this.menu,e=t.$elem,n=this.$container;if(!this._show){if(this._rendered)n.show();else{var i=e.getSizeData().height||0,o=this.opt.width||100;n.css("margin-top",i+"px").css("width",o+"px"),e.append(n),this._rendered=!0}this._show=!0}},hide:function(){this.showTimeoutId&&clearTimeout(this.showTimeoutId);var t=this.$container;this._show&&(t.hide(),this._show=!1)}},u.prototype={constructor:u,_command:function(t){var e=this.editor,n=e.selection.getSelectionContainerElem();e.$textElem.equal(n)||e.cmd.do("formatBlock",t)},tryChangeActive:function(t){var e=this.editor,n=this.$elem,i=/^h/i,o=e.cmd.queryCommandValue("formatBlock");i.test(o)?(this._active=!0,n.addClass("w-e-active")):(this._active=!1,n.removeClass("w-e-active"))}};var G=function(){},$=[];p.prototype={constructor:p,show:function(){var t=this,e=this.menu;if(!($.indexOf(e)>=0)){var n=e.editor,i=o("body"),r=n.$textContainerElem,a=this.opt,c=o('<div class="w-e-panel-container"></div>'),A=a.width||300;c.css("width",A+"px").css("margin-left",(0-A)/2+"px");var s=o('<i class="w-e-icon-close w-e-panel-close"></i>');c.append(s),s.on("click",function(){t.hide()});var l=o('<ul class="w-e-panel-tab-title"></ul>'),d=o('<div class="w-e-panel-tab-content"></div>');c.append(l).append(d);var u=a.height;u&&d.css("height",u+"px").css("overflow-y","auto");var p=a.tabs||[],h=[],f=[];p.forEach(function(t,e){if(t){var i=t.title||"",r=t.tpl||"";i=J(n,i),r=J(n,r);var a=o('<li class="w-e-item">'+i+"</li>");l.append(a);var c=o(r);d.append(c),a._index=e,h.push(a),f.push(c),0===e?(a._active=!0,a.addClass("w-e-active")):c.hide(),a.on("click",function(t){a._active||(h.forEach(function(t){t._active=!1,t.removeClass("w-e-active")}),f.forEach(function(t){t.hide()}),a._active=!0,a.addClass("w-e-active"),c.show())})}}),c.on("click",function(t){t.stopPropagation()}),i.on("click",function(e){t.hide()}),r.append(c),p.forEach(function(e,n){if(e){(e.events||[]).forEach(function(e){var i=e.selector,o=e.type,r=e.fn||G;f[n].find(i).on(o,function(e){e.stopPropagation(),r(e)&&t.hide()})})}});var g=c.find("input[type=text],textarea");g.length&&g.get(0).focus(),this.$container=c,this._hideOtherPanels(),$.push(e)}},hide:function(){var t=this.menu,e=this.$container;e&&e.remove(),$=$.filter(function(e){return e!==t})},_hideOtherPanels:function(){$.length&&$.forEach(function(t){var e=t.panel||{};e.hide&&e.hide()})}},h.prototype={constructor:h,onClick:function(t){var e=this.editor,n=void 0;if(this._active){if(!(n=e.selection.getSelectionContainerElem()))return;e.selection.createRangeByElem(n),e.selection.restoreSelection(),this._createPanel(n.text(),n.attr("href"))}else e.selection.isSelectionEmpty()?this._createPanel("",""):this._createPanel(e.selection.getSelectionText(),"")},_createPanel:function(t,e){var n=this,i=c("input-link"),r=c("input-text"),a=c("btn-ok"),A=c("btn-del"),s=this._active?"inline-block":"none",l=new p(this,{width:300,tabs:[{title:"链接",tpl:'<div>\n                            <input id="'+r+'" type="text" class="block" value="'+t+'" placeholder="链接文字"/></td>\n                            <input id="'+i+'" type="text" class="block" value="'+e+'" placeholder="http://..."/></td>\n                            <div class="w-e-button-container">\n                                <button id="'+a+'" class="right">插入</button>\n                                <button id="'+A+'" class="gray right" style="display:'+s+'">删除链接</button>\n                            </div>\n                        </div>',events:[{selector:"#"+a,type:"click",fn:function(){var t=o("#"+i),e=o("#"+r),a=t.val(),c=e.val();return n._insertLink(c,a),!0}},{selector:"#"+A,type:"click",fn:function(){return n._delLink(),!0}}]}]});l.show(),this.panel=l},_delLink:function(){if(this._active){var t=this.editor;if(t.selection.getSelectionContainerElem()){var e=t.selection.getSelectionText();t.cmd.do("insertHTML","<span>"+e+"</span>")}}},_insertLink:function(t,e){var n=this.editor,i=n.config,o=i.linkCheck,r=!0;o&&"function"==typeof o&&(r=o(t,e)),!0===r?n.cmd.do("insertHTML",'<a href="'+e+'" target="_blank">'+t+"</a>"):alert(r)},tryChangeActive:function(t){var e=this.editor,n=this.$elem,i=e.selection.getSelectionContainerElem();i&&("A"===i.getNodeName()?(this._active=!0,n.addClass("w-e-active")):(this._active=!1,n.removeClass("w-e-active")))}},f.prototype={constructor:f,onClick:function(t){var e=this.editor,n=e.selection.isSelectionEmpty();n&&e.selection.createEmptyRange(),e.cmd.do("italic"),n&&(e.selection.collapseRange(),e.selection.restoreSelection())},tryChangeActive:function(t){var e=this.editor,n=this.$elem;e.cmd.queryCommandState("italic")?(this._active=!0,n.addClass("w-e-active")):(this._active=!1,n.removeClass("w-e-active"))}},g.prototype={constructor:g,onClick:function(t){this.editor.cmd.do("redo")}},m.prototype={constructor:m,onClick:function(t){var e=this.editor,n=e.selection.isSelectionEmpty();n&&e.selection.createEmptyRange(),e.cmd.do("strikeThrough"),n&&(e.selection.collapseRange(),e.selection.restoreSelection())},tryChangeActive:function(t){var e=this.editor,n=this.$elem;e.cmd.queryCommandState("strikeThrough")?(this._active=!0,n.addClass("w-e-active")):(this._active=!1,n.removeClass("w-e-active"))}},w.prototype={constructor:w,onClick:function(t){var e=this.editor,n=e.selection.isSelectionEmpty();n&&e.selection.createEmptyRange(),e.cmd.do("underline"),n&&(e.selection.collapseRange(),e.selection.restoreSelection())},tryChangeActive:function(t){var e=this.editor,n=this.$elem;e.cmd.queryCommandState("underline")?(this._active=!0,n.addClass("w-e-active")):(this._active=!1,n.removeClass("w-e-active"))}},v.prototype={constructor:v,onClick:function(t){this.editor.cmd.do("undo")}},b.prototype={constructor:b,_command:function(t){var e=this.editor,n=e.$textElem;if(e.selection.restoreSelection(),!e.cmd.queryCommandState(t)){e.cmd.do(t);var i=e.selection.getSelectionContainerElem();if("LI"===i.getNodeName()&&(i=i.parent()),!1!==/^ol|ul$/i.test(i.getNodeName())&&!i.equal(n)){var o=i.parent();o.equal(n)||(i.insertAfter(o),o.remove())}}},tryChangeActive:function(t){var e=this.editor,n=this.$elem;e.cmd.queryCommandState("insertUnOrderedList")||e.cmd.queryCommandState("insertOrderedList")?(this._active=!0,n.addClass("w-e-active")):(this._active=!1,n.removeClass("w-e-active"))}},y.prototype={constructor:y,_command:function(t){this.editor.cmd.do(t)}},x.prototype={constructor:x,_command:function(t){this.editor.cmd.do("foreColor",t)}},E.prototype={constructor:E,_command:function(t){this.editor.cmd.do("backColor",t)}},C.prototype={constructor:C,onClick:function(t){var e=this.editor,n=e.selection.getSelectionContainerElem(),i=n.getNodeName();if(!z.isIE())return void("BLOCKQUOTE"===i?e.cmd.do("formatBlock","<P>"):e.cmd.do("formatBlock","<BLOCKQUOTE>"));var r=void 0,a=void 0;if("P"===i)return r=n.text(),a=o("<blockquote>"+r+"</blockquote>"),a.insertAfter(n),void n.remove();"BLOCKQUOTE"===i&&(r=n.text(),a=o("<p>"+r+"</p>"),a.insertAfter(n),n.remove())},tryChangeActive:function(t){var e=this.editor,n=this.$elem,i=/^BLOCKQUOTE$/i,o=e.cmd.queryCommandValue("formatBlock");i.test(o)?(this._active=!0,n.addClass("w-e-active")):(this._active=!1,n.removeClass("w-e-active"))}},B.prototype={constructor:B,onClick:function(t){var e=this.editor,n=e.selection.getSelectionStartElem(),i=e.selection.getSelectionEndElem(),r=e.selection.isSelectionEmpty(),a=e.selection.getSelectionText(),c=void 0;return n.equal(i)?r?void(this._active?this._createPanel(n.html()):this._createPanel()):(c=o("<code>"+a+"</code>"),e.cmd.do("insertElem",c),e.selection.createRangeByElem(c,!1),void e.selection.restoreSelection()):void e.selection.restoreSelection()},_createPanel:function(t){var e=this;t=t||"";var n=t?"edit":"new",i=c("texxt"),r=c("btn"),a=new p(this,{width:500,tabs:[{title:"插入代码",tpl:'<div>\n                        <textarea id="'+i+'" style="height:145px;;">'+t+'</textarea>\n                        <div class="w-e-button-container">\n                            <button id="'+r+'" class="right">插入</button>\n                        </div>\n                    <div>',events:[{selector:"#"+r,type:"click",fn:function(){var t=o("#"+i),r=t.val()||t.html();return r=A(r),"new"===n?e._insertCode(r):e._updateCode(r),!0}}]}]});a.show(),this.panel=a},_insertCode:function(t){this.editor.cmd.do("insertHTML","<pre><code>"+t+"</code></pre><p><br></p>")},_updateCode:function(t){var e=this.editor,n=e.selection.getSelectionContainerElem();n&&(n.html(t),e.selection.restoreSelection())},tryChangeActive:function(t){var e=this.editor,n=this.$elem,i=e.selection.getSelectionContainerElem();if(i){var o=i.parent();"CODE"===i.getNodeName()&&"PRE"===o.getNodeName()?(this._active=!0,n.addClass("w-e-active")):(this._active=!1,n.removeClass("w-e-active"))}}},I.prototype={constructor:I,onClick:function(){this._createPanel()},_createPanel:function(){var t=this,e=this.editor,n=e.config,i=n.emotions||[],r=[];i.forEach(function(e){var n=e.type,i=e.content||[],a="";"emoji"===n&&i.forEach(function(t){t&&(a+='<span class="w-e-item">'+t+"</span>")}),"image"===n&&i.forEach(function(t){var e=t.src,n=t.alt;e&&(a+='<span class="w-e-item"><img src="'+e+'" alt="'+n+'" data-w-e="1"/></span>')}),r.push({title:e.title,tpl:'<div class="w-e-emoticon-container">'+a+"</div>",events:[{selector:"span.w-e-item",type:"click",fn:function(e){var n=e.target,i=o(n),r=i.getNodeName(),a=void 0;return a="IMG"===r?i.parent().html():"<span>"+i.html()+"</span>",t._insert(a),!0}}]})});var a=new p(this,{width:300,height:200,tabs:r});a.show(),this.panel=a},_insert:function(t){this.editor.cmd.do("insertHTML",t)}},Q.prototype={constructor:Q,onClick:function(){this._active?this._createEditPanel():this._createInsertPanel()},_createInsertPanel:function(){var t=this,e=c("btn"),n=c("row"),i=c("col"),r=new p(this,{width:250,tabs:[{title:"插入表格",tpl:'<div>\n                        <p style="text-align:left; padding:5px 0;">\n                            创建\n                            <input id="'+n+'" type="text" value="5" style="width:40px;text-align:center;"/>\n                            行\n                            <input id="'+i+'" type="text" value="5" style="width:40px;text-align:center;"/>\n                            列的表格\n                        </p>\n                        <div class="w-e-button-container">\n                            <button id="'+e+'" class="right">插入</button>\n                        </div>\n                    </div>',events:[{selector:"#"+e,type:"click",fn:function(){var e=parseInt(o("#"+n).val()),r=parseInt(o("#"+i).val());return e&&r&&e>0&&r>0&&t._insert(e,r),!0}}]}]});r.show(),this.panel=r},_insert:function(t,e){var n=void 0,i=void 0,o='<table border="0" width="100%" cellpadding="0" cellspacing="0">';for(n=0;n<t;n++){if(o+="<tr>",0===n)for(i=0;i<e;i++)o+="<th>&nbsp;</th>";else for(i=0;i<e;i++)o+="<td>&nbsp;</td>";o+="</tr>"}o+="</table><p><br></p>";var r=this.editor;r.cmd.do("insertHTML",o),r.cmd.do("enableObjectResizing",!1),r.cmd.do("enableInlineTableEditing",!1)},_createEditPanel:function(){var t=this,e=c("add-row"),n=c("add-col"),i=c("del-row"),o=c("del-col"),r=c("del-table");new p(this,{width:320,tabs:[{title:"编辑表格",tpl:'<div>\n                        <div class="w-e-button-container" style="border-bottom:1px solid #f1f1f1;padding-bottom:5px;margin-bottom:5px;">\n                            <button id="'+e+'" class="left">增加行</button>\n                            <button id="'+i+'" class="red left">删除行</button>\n                            <button id="'+n+'" class="left">增加列</button>\n                            <button id="'+o+'" class="red left">删除列</button>\n                        </div>\n                        <div class="w-e-button-container">\n                            <button id="'+r+'" class="gray left">删除表格</button>\n                        </dv>\n                    </div>',events:[{selector:"#"+e,type:"click",fn:function(){return t._addRow(),!0}},{selector:"#"+n,type:"click",fn:function(){return t._addCol(),!0}},{selector:"#"+i,type:"click",fn:function(){return t._delRow(),!0}},{selector:"#"+o,type:"click",fn:function(){return t._delCol(),!0}},{selector:"#"+r,type:"click",fn:function(){return t._delTable(),!0}}]}]}).show()},_getLocationData:function(){var t={},e=this.editor,n=e.selection.getSelectionContainerElem();if(n){var i=n.getNodeName();if("TD"===i||"TH"===i){var o=n.parent(),r=o.children(),a=r.length;r.forEach(function(e,i){if(e===n[0])return t.td={index:i,elem:e,length:a},!1});var c=o.parent(),A=c.children(),s=A.length;return A.forEach(function(e,n){if(e===o[0])return t.tr={index:n,elem:e,length:s},!1}),t}}},_addRow:function(){var t=this._getLocationData();if(t){var e=t.tr,n=o(e.elem),i=t.td,r=i.length,a=document.createElement("tr"),c="",A=void 0;for(A=0;A<r;A++)c+="<td>&nbsp;</td>";a.innerHTML=c,o(a).insertAfter(n)}},_addCol:function(){var t=this._getLocationData();if(t){var e=t.tr,n=t.td,i=n.index;o(e.elem).parent().children().forEach(function(t){var e=o(t),n=e.children(),r=n.get(i),a=r.getNodeName().toLowerCase();o(document.createElement(a)).insertAfter(r)})}},_delRow:function(){var t=this._getLocationData();if(t){o(t.tr.elem).remove()}},_delCol:function(){var t=this._getLocationData();if(t){var e=t.tr,n=t.td,i=n.index;o(e.elem).parent().children().forEach(function(t){o(t).children().get(i).remove()})}},_delTable:function(){var t=this.editor,e=t.selection.getSelectionContainerElem();if(e){var n=e.parentUntil("table");n&&n.remove()}},tryChangeActive:function(t){var e=this.editor,n=this.$elem,i=e.selection.getSelectionContainerElem();if(i){var o=i.getNodeName();"TD"===o||"TH"===o?(this._active=!0,n.addClass("w-e-active")):(this._active=!1,n.removeClass("w-e-active"))}}},_.prototype={constructor:_,onClick:function(){this._createPanel()},_createPanel:function(){var t=this,e=c("text-val"),n=c("btn"),i=new p(this,{width:350,tabs:[{title:"插入视频",tpl:'<div>\n                        <input id="'+e+'" type="text" class="block" placeholder="格式如:<iframe src=... ></iframe>"/>\n                        <div class="w-e-button-container">\n                            <button id="'+n+'" class="right">插入</button>\n                        </div>\n                    </div>',events:[{selector:"#"+n,type:"click",fn:function(){var n=o("#"+e),i=n.val().trim();return i&&t._insert(i),!0}}]}]});i.show(),this.panel=i},_insert:function(t){this.editor.cmd.do("insertHTML",t+"<p><br></p>")}},D.prototype={constructor:D,onClick:function(){this.editor.config.qiniu||(this._active?this._createEditPanel():this._createInsertPanel())},
+_createEditPanel:function(){var t=this.editor,e=c("width-30"),n=c("width-50"),i=c("width-100"),o=c("del-btn"),r=[{title:"编辑图片",tpl:'<div>\n                    <div class="w-e-button-container" style="border-bottom:1px solid #f1f1f1;padding-bottom:5px;margin-bottom:5px;">\n                        <span style="float:left;font-size:14px;margin:4px 5px 0 5px;color:#333;">最大宽度:</span>\n                        <button id="'+e+'" class="left">30%</button>\n                        <button id="'+n+'" class="left">50%</button>\n                        <button id="'+i+'" class="left">100%</button>\n                    </div>\n                    <div class="w-e-button-container">\n                        <button id="'+o+'" class="gray left">删除图片</button>\n                    </dv>\n                </div>',events:[{selector:"#"+e,type:"click",fn:function(){var e=t._selectedImg;return e&&e.css("max-width","30%"),!0}},{selector:"#"+n,type:"click",fn:function(){var e=t._selectedImg;return e&&e.css("max-width","50%"),!0}},{selector:"#"+i,type:"click",fn:function(){var e=t._selectedImg;return e&&e.css("max-width","100%"),!0}},{selector:"#"+o,type:"click",fn:function(){var e=t._selectedImg;return e&&e.remove(),!0}}]}],a=new p(this,{width:300,tabs:r});a.show(),this.panel=a},_createInsertPanel:function(){var t=this.editor,e=t.uploadImg,n=t.config,i=c("up-trigger"),r=c("up-file"),a=c("link-url"),A=c("link-btn"),s=[{title:"上传图片",tpl:'<div class="w-e-up-img-container">\n                    <div id="'+i+'" class="w-e-up-btn">\n                        <i class="w-e-icon-upload2"></i>\n                    </div>\n                    <div style="display:none;">\n                        <input id="'+r+'" type="file" multiple="multiple" accept="image/jpg,image/jpeg,image/png,image/gif,image/bmp"/>\n                    </div>\n                </div>',events:[{selector:"#"+i,type:"click",fn:function(){var t=o("#"+r),e=t[0];if(!e)return!0;e.click()}},{selector:"#"+r,type:"change",fn:function(){var t=o("#"+r),n=t[0];if(!n)return!0;var i=n.files;return i.length&&e.uploadImg(i),!0}}]},{title:"网络图片",tpl:'<div>\n                    <input id="'+a+'" type="text" class="block" placeholder="图片链接"/></td>\n                    <div class="w-e-button-container">\n                        <button id="'+A+'" class="right">插入</button>\n                    </div>\n                </div>',events:[{selector:"#"+A,type:"click",fn:function(){var t=o("#"+a),n=t.val().trim();return n&&e.insertLinkImg(n),!0}}]}],l=[];(n.uploadImgShowBase64||n.uploadImgServer||n.customUploadImg)&&window.FileReader&&l.push(s[0]),n.showLinkImg&&l.push(s[1]);var d=new p(this,{width:300,tabs:l});d.show(),this.panel=d},tryChangeActive:function(t){var e=this.editor,n=this.$elem;e._selectedImg?(this._active=!0,n.addClass("w-e-active")):(this._active=!1,n.removeClass("w-e-active"))}};var W={};W.bold=l,W.head=u,W.link=h,W.italic=f,W.redo=g,W.strikeThrough=m,W.underline=w,W.undo=v,W.list=b,W.justify=y,W.foreColor=x,W.backColor=E,W.quote=C,W.code=B,W.emoticon=I,W.table=Q,W.video=_,W.image=D,k.prototype={constructor:k,init:function(){var t=this,e=this.editor;((e.config||{}).menus||[]).forEach(function(n){var i=W[n];i&&"function"==typeof i&&(t.menus[n]=new i(e))}),this._addToToolbar(),this._bindEvent()},_addToToolbar:function(){var t=this.editor,e=t.$toolbarElem,n=this.menus,i=t.config,o=i.zIndex+1;r(n,function(t,n){var i=n.$elem;i&&(i.css("z-index",o),e.append(i))})},_bindEvent:function(){var t=this.menus,e=this.editor;r(t,function(t,n){var i=n.type;if(i){var o=n.$elem,r=n.droplist;n.panel;"click"===i&&n.onClick&&o.on("click",function(t){null!=e.selection.getRange()&&n.onClick(t)}),"droplist"===i&&r&&o.on("mouseenter",function(t){null!=e.selection.getRange()&&(r.showTimeoutId=setTimeout(function(){r.show()},200))}).on("mouseleave",function(t){r.hideTimeoutId=setTimeout(function(){r.hide()},0)}),"panel"===i&&n.onClick&&o.on("click",function(t){t.stopPropagation(),null!=e.selection.getRange()&&n.onClick(t)})}})},changeActive:function(){r(this.menus,function(t,e){e.tryChangeActive&&setTimeout(function(){e.tryChangeActive()},100)})}},R.prototype={constructor:R,init:function(){this._bindEvent()},clear:function(){this.html("<p><br></p>")},html:function(t){var e=this.editor,n=e.$textElem,i=void 0;if(null==t)return i=n.html(),i=i.replace(/\u200b/gm,""),i;n.html(t),e.initSelection()},getJSON:function(){return N(this.editor.$textElem)},text:function(t){var e=this.editor,n=e.$textElem,i=void 0;if(null==t)return i=n.text(),i=i.replace(/\u200b/gm,""),i;n.text("<p>"+t+"</p>"),e.initSelection()},append:function(t){var e=this.editor;e.$textElem.append(o(t)),e.initSelection()},_bindEvent:function(){this._saveRangeRealTime(),this._enterKeyHandle(),this._clearHandle(),this._pasteHandle(),this._tabHandle(),this._imgHandle(),this._dragHandle()},_saveRangeRealTime:function(){function t(t){e.selection.saveRange(),e.menus.changeActive()}var e=this.editor,n=e.$textElem;n.on("keyup",t),n.on("mousedown",function(e){n.on("mouseleave",t)}),n.on("mouseup",function(e){t(),n.off("mouseleave",t)})},_enterKeyHandle:function(){function t(t){var e=o("<p><br></p>");e.insertBefore(t),i.selection.createRangeByElem(e,!0),i.selection.restoreSelection(),t.remove()}function e(e){var n=i.selection.getSelectionContainerElem(),o=n.parent();if("<code><br></code>"===o.html())return void t(n);if(o.equal(r)){"P"!==n.getNodeName()&&(n.text()||t(n))}}function n(t){var e=i.selection.getSelectionContainerElem();if(e){var n=e.parent(),r=e.getNodeName(),a=n.getNodeName();if("CODE"===r&&"PRE"===a&&i.cmd.queryCommandSupported("insertHTML")){if(!0===i._willBreakCode){var c=o("<p><br></p>");return c.insertAfter(n),i.selection.createRangeByElem(c,!0),i.selection.restoreSelection(),i._willBreakCode=!1,void t.preventDefault()}var A=i.selection.getRange().startOffset;i.cmd.do("insertHTML","\n"),i.selection.saveRange(),i.selection.getRange().startOffset===A&&i.cmd.do("insertHTML","\n");var s=e.html().length;i.selection.getRange().startOffset+1===s&&(i._willBreakCode=!0),t.preventDefault()}}}var i=this.editor,r=i.$textElem;r.on("keyup",function(t){13===t.keyCode&&e(t)}),r.on("keydown",function(t){if(13!==t.keyCode)return void(i._willBreakCode=!1);n(t)})},_clearHandle:function(){var t=this.editor,e=t.$textElem;e.on("keydown",function(t){if(8===t.keyCode){return"<p><br></p>"===e.html().toLowerCase().trim()?void t.preventDefault():void 0}}),e.on("keyup",function(n){if(8===n.keyCode){var i=void 0,r=e.html().toLowerCase().trim();r&&"<br>"!==r||(i=o("<p><br/></p>"),e.html(""),e.append(i),t.selection.createRangeByElem(i,!1,!0),t.selection.restoreSelection())}})},_pasteHandle:function(){function t(){var t=Date.now(),e=!1;return t-c>=500&&(e=!0),c=t,e}function e(){c=0}var n=this.editor,i=n.config,o=i.pasteFilterStyle,r=i.pasteTextHandle,a=n.$textElem,c=0;a.on("paste",function(i){if(!z.isIE()&&(i.preventDefault(),t())){var a=S(i,o),c=M(i);c=c.replace(/\n/gm,"<br>");var A=n.selection.getSelectionContainerElem();if(A){var l=A.getNodeName();if("CODE"===l||"PRE"===l)return r&&s(r)&&(c=""+(r(c)||"")),void n.cmd.do("insertHTML","<p>"+c+"</p>");if(!a)return void e();try{r&&s(r)&&(a=""+(r(a)||"")),n.cmd.do("insertHTML",a)}catch(t){r&&s(r)&&(c=""+(r(c)||"")),n.cmd.do("insertHTML","<p>"+c+"</p>")}}}}),a.on("paste",function(e){if(!z.isIE()&&(e.preventDefault(),t())){var i=U(e);if(i&&i.length){var o=n.selection.getSelectionContainerElem();if(o){var r=o.getNodeName();if("CODE"!==r&&"PRE"!==r){n.uploadImg.uploadImg(i)}}}}})},_tabHandle:function(){var t=this.editor;t.$textElem.on("keydown",function(e){if(9===e.keyCode&&t.cmd.queryCommandSupported("insertHTML")){var n=t.selection.getSelectionContainerElem();if(n){var i=n.parent(),o=n.getNodeName(),r=i.getNodeName();"CODE"===o&&"PRE"===r?t.cmd.do("insertHTML","    "):t.cmd.do("insertHTML","&nbsp;&nbsp;&nbsp;&nbsp;"),e.preventDefault()}}})},_imgHandle:function(){var t=this.editor,e=t.$textElem;e.on("click","img",function(e){var n=this,i=o(n);"1"!==i.attr("data-w-e")&&(t._selectedImg=i,t.selection.createRangeByElem(i),t.selection.restoreSelection())}),e.on("click  keyup",function(e){e.target.matches("img")||(t._selectedImg=null)})},_dragHandle:function(){var t=this.editor;o(document).on("dragleave drop dragenter dragover",function(t){t.preventDefault()}),t.$textElem.on("drop",function(e){e.preventDefault();var n=e.dataTransfer&&e.dataTransfer.files;n&&n.length&&t.uploadImg.uploadImg(n)})}},F.prototype={constructor:F,do:function(t,e){var n=this.editor;if(n._useStyleWithCSS||(document.execCommand("styleWithCSS",null,!0),n._useStyleWithCSS=!0),n.selection.getRange()){n.selection.restoreSelection();var i="_"+t;this[i]?this[i](e):this._execCommand(t,e),n.menus.changeActive(),n.selection.saveRange(),n.selection.restoreSelection(),n.change&&n.change()}},_insertHTML:function(t){var e=this.editor,n=e.selection.getRange();this.queryCommandSupported("insertHTML")?this._execCommand("insertHTML",t):n.insertNode?(n.deleteContents(),n.insertNode(o(t)[0])):n.pasteHTML&&n.pasteHTML(t)},_insertElem:function(t){var e=this.editor,n=e.selection.getRange();n.insertNode&&(n.deleteContents(),n.insertNode(t[0]))},_execCommand:function(t,e){document.execCommand(t,!1,e)},queryCommandValue:function(t){return document.queryCommandValue(t)},queryCommandState:function(t){return document.queryCommandState(t)},queryCommandSupported:function(t){return document.queryCommandSupported(t)}},T.prototype={constructor:T,getRange:function(){return this._currentRange},saveRange:function(t){if(t)return void(this._currentRange=t);var e=window.getSelection();if(0!==e.rangeCount){var n=e.getRangeAt(0),i=this.getSelectionContainerElem(n);if(i){this.editor.$textElem.isContain(i)&&(this._currentRange=n)}}},collapseRange:function(t){null==t&&(t=!1);var e=this._currentRange;e&&e.collapse(t)},getSelectionText:function(){return this._currentRange?this._currentRange.toString():""},getSelectionContainerElem:function(t){t=t||this._currentRange;var e=void 0;if(t)return e=t.commonAncestorContainer,o(1===e.nodeType?e:e.parentNode)},getSelectionStartElem:function(t){t=t||this._currentRange;var e=void 0;if(t)return e=t.startContainer,o(1===e.nodeType?e:e.parentNode)},getSelectionEndElem:function(t){t=t||this._currentRange;var e=void 0;if(t)return e=t.endContainer,o(1===e.nodeType?e:e.parentNode)},isSelectionEmpty:function(){var t=this._currentRange;return!(!t||!t.startContainer||t.startContainer!==t.endContainer||t.startOffset!==t.endOffset)},restoreSelection:function(){var t=window.getSelection();t.removeAllRanges(),t.addRange(this._currentRange)},createEmptyRange:function(){var t=this.editor,e=this.getRange(),n=void 0;if(e&&this.isSelectionEmpty())try{z.isWebkit()?(t.cmd.do("insertHTML","&#8203;"),e.setEnd(e.endContainer,e.endOffset+1),this.saveRange(e)):(n=o("<strong>&#8203;</strong>"),t.cmd.do("insertElem",n),this.createRangeByElem(n,!0))}catch(t){}},createRangeByElem:function(t,e,n){if(t.length){var i=t[0],o=document.createRange();n?o.selectNodeContents(i):o.selectNode(i),"boolean"==typeof e&&o.collapse(e),this.saveRange(o)}}},j.prototype={constructor:j,show:function(t){var e=this;if(!this._isShow){this._isShow=!0;var n=this.$bar;if(this._isRender)this._isRender=!0;else{this.$textContainer.append(n)}Date.now()-this._time>100&&t<=1&&(n.css("width",100*t+"%"),this._time=Date.now());var i=this._timeoutId;i&&clearTimeout(i),i=setTimeout(function(){e._hide()},500)}},_hide:function(){this.$bar.remove(),this._time=0,this._isShow=!1,this._isRender=!1}};var q="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};H.prototype={constructor:H,_alert:function(t,e){var n=this.editor,i=n.config.debug,o=n.config.customAlert;if(i)throw new Error("wangEditor: "+(e||t));o&&"function"==typeof o?o(t):alert(t)},insertLinkImg:function(t){var e=this;if(t){var n=this.editor,i=n.config,o=i.linkImgCheck,r=void 0;if(o&&"function"==typeof o&&"string"==typeof(r=o(t)))return void alert(r);n.cmd.do("insertHTML",'<img src="'+t+'" style="max-width:100%;"/>');var a=document.createElement("img");a.onload=function(){var e=i.linkImgCallback;e&&"function"==typeof e&&e(t),a=null},a.onerror=function(){a=null,e._alert("插入图片错误",'wangEditor: 插入图片出错,图片链接是 "'+t+'",下载该链接失败')},a.onabort=function(){a=null},a.src=t}},uploadImg:function(t){var e=this;if(t&&t.length){var n=this.editor,i=n.config,o=i.uploadImgServer,c=i.uploadImgShowBase64,A=i.uploadImgMaxSize,s=A/1024/1024,l=i.uploadImgMaxLength||1e4,d=i.uploadFileName||"",u=i.uploadImgParams||{},p=i.uploadImgParamsWithUrl,h=i.uploadImgHeaders||{},f=i.uploadImgHooks||{},g=i.uploadImgTimeout||3e3,m=i.withCredentials;null==m&&(m=!1);var w=i.customUploadImg;if(w||o||c){var v=[],b=[];if(a(t,function(t){var e=t.name,n=t.size;if(e&&n)return!1===/\.(jpg|jpeg|png|bmp|gif)$/i.test(e)?void b.push("【"+e+"】不是图片"):A<n?void b.push("【"+e+"】大于 "+s+"M"):void v.push(t)}),b.length)return void this._alert("图片验证未通过: \n"+b.join("\n"));if(v.length>l)return void this._alert("一次最多上传"+l+"张图片");if(w&&"function"==typeof w)return void w(v,this.insertLinkImg.bind(this));var y=new FormData;if(a(v,function(t){var e=d||t.name;y.append(e,t)}),o&&"string"==typeof o){var x=o.split("#");o=x[0];var E=x[1]||"";r(u,function(t,e){e=encodeURIComponent(e),p&&(o.indexOf("?")>0?o+="&":o+="?",o=o+t+"="+e),y.append(t,e)}),E&&(o+="#"+E);var C=new XMLHttpRequest;if(C.open("POST",o),C.timeout=g,C.ontimeout=function(){f.timeout&&"function"==typeof f.timeout&&f.timeout(C,n),e._alert("上传图片超时")},C.upload&&(C.upload.onprogress=function(t){var e=void 0,i=new j(n);t.lengthComputable&&(e=t.loaded/t.total,i.show(e))}),C.onreadystatechange=function(){var t=void 0;if(4===C.readyState){if(C.status<200||C.status>=300)return f.error&&"function"==typeof f.error&&f.error(C,n),void e._alert("上传图片发生错误","上传图片发生错误,服务器返回状态是 "+C.status);if(t=C.responseText,"object"!==(void 0===t?"undefined":q(t)))try{t=JSON.parse(t)}catch(i){return f.fail&&"function"==typeof f.fail&&f.fail(C,n,t),void e._alert("上传图片失败","上传图片返回结果错误,返回结果是: "+t)}if(f.customInsert||"0"==t.errno){if(f.customInsert&&"function"==typeof f.customInsert)f.customInsert(e.insertLinkImg.bind(e),t,n);else{(t.data||[]).forEach(function(t){e.insertLinkImg(t)})}f.success&&"function"==typeof f.success&&f.success(C,n,t)}else f.fail&&"function"==typeof f.fail&&f.fail(C,n,t),e._alert("上传图片失败","上传图片返回结果错误,返回结果 errno="+t.errno)}},f.before&&"function"==typeof f.before){var B=f.before(C,n,v);if(B&&"object"===(void 0===B?"undefined":q(B))&&B.prevent)return void this._alert(B.msg)}return r(h,function(t,e){C.setRequestHeader(t,e)}),C.withCredentials=m,void C.send(y)}c&&a(t,function(t){var n=e,i=new FileReader;i.readAsDataURL(t),i.onload=function(){n.insertLinkImg(this.result)}})}}}};var K=1;Y.prototype={constructor:Y,_initConfig:function(){var t={};this.config=Object.assign(t,P,this.customConfig);var e=this.config.lang||{},n=[];r(e,function(t,e){n.push({reg:new RegExp(t,"img"),val:e})}),this.config.langArgs=n},_initDom:function(){var t=this,e=this.toolbarSelector,n=o(e),i=this.textSelector,r=this.config,a=r.zIndex,A=void 0,s=void 0,l=void 0,d=void 0;null==i?(A=o("<div></div>"),s=o("<div></div>"),d=n.children(),n.append(A).append(s),A.css("background-color","#f1f1f1").css("border","1px solid #ccc"),s.css("border","1px solid #ccc").css("border-top","none").css("height","300px")):(A=n,s=o(i),d=s.children()),l=o("<div></div>"),l.attr("contenteditable","true").css("width","100%").css("height","100%"),d&&d.length?l.append(d):l.append(o("<p><br></p>")),s.append(l),A.addClass("w-e-toolbar"),s.addClass("w-e-text-container"),s.css("z-index",a),l.addClass("w-e-text");var u=c("toolbar-elem");A.attr("id",u);var p=c("text-elem");l.attr("id",p),this.$toolbarElem=A,this.$textContainerElem=s,this.$textElem=l,this.toolbarElemId=u,this.textElemId=p;var h=!0;s.on("compositionstart",function(){h=!1}),s.on("compositionend",function(){h=!0}),s.on("click keyup",function(){h&&t.change&&t.change()}),A.on("click",function(){this.change&&this.change()}),(r.onfocus||r.onblur)&&(this.isFocus=!1,o(document).on("click",function(e){var n=l.isContain(o(e.target)),i=A.isContain(o(e.target)),r=A[0]==e.target;if(n)t.isFocus||t.onfocus&&t.onfocus(),t.isFocus=!0;else{if(i&&!r)return;t.isFocus&&t.onblur&&t.onblur(),t.isFocus=!1}}))},_initCommand:function(){this.cmd=new F(this)},_initSelectionAPI:function(){this.selection=new T(this)},_initUploadImg:function(){this.uploadImg=new H(this)},_initMenus:function(){this.menus=new k(this),this.menus.init()},_initText:function(){this.txt=new R(this),this.txt.init()},initSelection:function(t){var e=this.$textElem,n=e.children();if(!n.length)return e.append(o("<p><br></p>")),void this.initSelection();var i=n.last();if(t){var r=i.html().toLowerCase(),a=i.getNodeName();if("<br>"!==r&&"<br/>"!==r||"P"!==a)return e.append(o("<p><br></p>")),void this.initSelection()}this.selection.createRangeByElem(i,!1,!0),this.selection.restoreSelection()},_bindEvent:function(){var t=0,e=this.txt.html(),n=this.config,i=n.onchangeTimeout;(!(i=parseInt(i,10))||i<=0)&&(i=200);var o=n.onchange;o&&"function"==typeof o&&(this.change=function(){var n=this.txt.html();n.length===e.length&&n===e||(t&&clearTimeout(t),t=setTimeout(function(){o(n),e=n},i))});var r=n.onblur;r&&"function"==typeof r&&(this.onblur=function(){var t=this.txt.html();r(t)});var a=n.onfocus;a&&"function"==typeof a&&(this.onfocus=function(){a()})},create:function(){this._initConfig(),this._initDom(),this._initCommand(),this._initSelectionAPI(),this._initText(),this._initMenus(),this._initUploadImg(),this.initSelection(!0),this._bindEvent()},_offAllEvent:function(){o.offAll()}};try{document}catch(t){throw new Error("请在浏览器环境下运行")}!function(){"function"!=typeof Object.assign&&(Object.assign=function(t,e){if(null==t)throw new TypeError("Cannot convert undefined or null to object");for(var n=Object(t),i=1;i<arguments.length;i++){var o=arguments[i];if(null!=o)for(var r in o)Object.prototype.hasOwnProperty.call(o,r)&&(n[r]=o[r])}return n}),Element.prototype.matches||(Element.prototype.matches=Element.prototype.matchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector||Element.prototype.oMatchesSelector||Element.prototype.webkitMatchesSelector||function(t){for(var e=(this.document||this.ownerDocument).querySelectorAll(t),n=e.length;--n>=0&&e.item(n)!==this;);return n>-1})}();var V=document.createElement("style");return V.type="text/css",
+V.innerHTML='.w-e-toolbar,.w-e-text-container,.w-e-menu-panel {  padding: 0;  margin: 0;  box-sizing: border-box;}.w-e-toolbar *,.w-e-text-container *,.w-e-menu-panel * {  padding: 0;  margin: 0;  box-sizing: border-box;}.w-e-clear-fix:after {  content: "";  display: table;  clear: both;}.w-e-toolbar .w-e-droplist {  position: absolute;  left: 0;  top: 0;  background-color: #fff;  border: 1px solid #f1f1f1;  border-right-color: #ccc;  border-bottom-color: #ccc;}.w-e-toolbar .w-e-droplist .w-e-dp-title {  text-align: center;  color: #999;  line-height: 2;  border-bottom: 1px solid #f1f1f1;  font-size: 13px;}.w-e-toolbar .w-e-droplist ul.w-e-list {  list-style: none;  line-height: 1;}.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item {  color: #333;  padding: 5px 0;}.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item:hover {  background-color: #f1f1f1;}.w-e-toolbar .w-e-droplist ul.w-e-block {  list-style: none;  text-align: left;  padding: 5px;}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item {  display: inline-block;  *display: inline;  *zoom: 1;  padding: 3px 5px;}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item:hover {  background-color: #f1f1f1;}@font-face {  font-family: \'w-e-icon\';  src: url(data:application/x-font-woff;charset=utf-8;base64,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) format(\'truetype\');  font-weight: normal;  font-style: normal;}[class^="w-e-icon-"],[class*=" w-e-icon-"] {  /* use !important to prevent issues with browser extensions that change fonts */  font-family: \'w-e-icon\' !important;  speak: none;  font-style: normal;  font-weight: normal;  font-variant: normal;  text-transform: none;  line-height: 1;  /* Better Font Rendering =========== */  -webkit-font-smoothing: antialiased;  -moz-osx-font-smoothing: grayscale;}.w-e-icon-close:before {  content: "\\f00d";}.w-e-icon-upload2:before {  content: "\\e9c6";}.w-e-icon-trash-o:before {  content: "\\f014";}.w-e-icon-header:before {  content: "\\f1dc";}.w-e-icon-pencil2:before {  content: "\\e906";}.w-e-icon-paint-brush:before {  content: "\\f1fc";}.w-e-icon-image:before {  content: "\\e90d";}.w-e-icon-play:before {  content: "\\e912";}.w-e-icon-location:before {  content: "\\e947";}.w-e-icon-undo:before {  content: "\\e965";}.w-e-icon-redo:before {  content: "\\e966";}.w-e-icon-quotes-left:before {  content: "\\e977";}.w-e-icon-list-numbered:before {  content: "\\e9b9";}.w-e-icon-list2:before {  content: "\\e9bb";}.w-e-icon-link:before {  content: "\\e9cb";}.w-e-icon-happy:before {  content: "\\e9df";}.w-e-icon-bold:before {  content: "\\ea62";}.w-e-icon-underline:before {  content: "\\ea63";}.w-e-icon-italic:before {  content: "\\ea64";}.w-e-icon-strikethrough:before {  content: "\\ea65";}.w-e-icon-table2:before {  content: "\\ea71";}.w-e-icon-paragraph-left:before {  content: "\\ea77";}.w-e-icon-paragraph-center:before {  content: "\\ea78";}.w-e-icon-paragraph-right:before {  content: "\\ea79";}.w-e-icon-terminal:before {  content: "\\f120";}.w-e-icon-page-break:before {  content: "\\ea68";}.w-e-icon-cancel-circle:before {  content: "\\ea0d";}.w-e-toolbar {  display: -webkit-box;  display: -ms-flexbox;  display: flex;  padding: 0 5px;  /* flex-wrap: wrap; */  /* 单个菜单 */}.w-e-toolbar .w-e-menu {  position: relative;  text-align: center;  padding: 5px 10px;  cursor: pointer;}.w-e-toolbar .w-e-menu i {  color: #999;}.w-e-toolbar .w-e-menu:hover i {  color: #333;}.w-e-toolbar .w-e-active i {  color: #1e88e5;}.w-e-toolbar .w-e-active:hover i {  color: #1e88e5;}.w-e-text-container .w-e-panel-container {  position: absolute;  top: 0;  left: 50%;  border: 1px solid #ccc;  border-top: 0;  box-shadow: 1px 1px 2px #ccc;  color: #333;  background-color: #fff;  /* 为 emotion panel 定制的样式 */  /* 上传图片的 panel 定制样式 */}.w-e-text-container .w-e-panel-container .w-e-panel-close {  position: absolute;  right: 0;  top: 0;  padding: 5px;  margin: 2px 5px 0 0;  cursor: pointer;  color: #999;}.w-e-text-container .w-e-panel-container .w-e-panel-close:hover {  color: #333;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title {  list-style: none;  display: -webkit-box;  display: -ms-flexbox;  display: flex;  font-size: 14px;  margin: 2px 10px 0 10px;  border-bottom: 1px solid #f1f1f1;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-item {  padding: 3px 5px;  color: #999;  cursor: pointer;  margin: 0 3px;  position: relative;  top: 1px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-active {  color: #333;  border-bottom: 1px solid #333;  cursor: default;  font-weight: 700;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content {  padding: 10px 15px 10px 15px;  font-size: 16px;  /* 输入框的样式 */  /* 按钮的样式 */}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content button:focus {  outline: none;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea {  width: 100%;  border: 1px solid #ccc;  padding: 5px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus {  border-color: #1e88e5;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text] {  border: none;  border-bottom: 1px solid #ccc;  font-size: 14px;  height: 20px;  color: #333;  text-align: left;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].small {  width: 30px;  text-align: center;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].block {  display: block;  width: 100%;  margin: 10px 0;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text]:focus {  border-bottom: 2px solid #1e88e5;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button {  font-size: 14px;  color: #1e88e5;  border: none;  padding: 5px 10px;  background-color: #fff;  cursor: pointer;  border-radius: 3px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.left {  float: left;  margin-right: 10px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.right {  float: right;  margin-left: 10px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.gray {  color: #999;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.red {  color: #c24f4a;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button:hover {  background-color: #f1f1f1;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container:after {  content: "";  display: table;  clear: both;}.w-e-text-container .w-e-panel-container .w-e-emoticon-container .w-e-item {  cursor: pointer;  font-size: 18px;  padding: 0 3px;  display: inline-block;  *display: inline;  *zoom: 1;}.w-e-text-container .w-e-panel-container .w-e-up-img-container {  text-align: center;}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn {  display: inline-block;  *display: inline;  *zoom: 1;  color: #999;  cursor: pointer;  font-size: 60px;  line-height: 1;}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn:hover {  color: #333;}.w-e-text-container {  position: relative;}.w-e-text-container .w-e-progress {  position: absolute;  background-color: #1e88e5;  bottom: 0;  left: 0;  height: 1px;}.w-e-text {  padding: 0 10px;  overflow-y: scroll;}.w-e-text p,.w-e-text h1,.w-e-text h2,.w-e-text h3,.w-e-text h4,.w-e-text h5,.w-e-text table,.w-e-text pre {  margin: 10px 0;  line-height: 1.5;}.w-e-text ul,.w-e-text ol {  margin: 10px 0 10px 20px;}.w-e-text blockquote {  display: block;  border-left: 8px solid #d0e5f2;  padding: 5px 10px;  margin: 10px 0;  line-height: 1.4;  font-size: 100%;  background-color: #f1f1f1;}.w-e-text code {  display: inline-block;  *display: inline;  *zoom: 1;  background-color: #f1f1f1;  border-radius: 3px;  padding: 3px 5px;  margin: 0 3px;}.w-e-text pre code {  display: block;}.w-e-text table {  border-top: 1px solid #ccc;  border-left: 1px solid #ccc;}.w-e-text table td,.w-e-text table th {  border-bottom: 1px solid #ccc;  border-right: 1px solid #ccc;  padding: 3px 5px;}.w-e-text table th {  border-bottom: 2px solid #ccc;  text-align: center;}.w-e-text:focus {  outline: none;}.w-e-text img {  cursor: pointer;}.w-e-text img:hover {  box-shadow: 0 0 5px #333;}',document.getElementsByTagName("HEAD").item(0).appendChild(V),window.wangEditor||Y});
+//# sourceMappingURL=wangEditor.min.js.map
diff --git a/novel-admin/src/main/resources/static/wangEditor/release/wangEditor.min.js.map b/novel-admin/src/main/resources/static/wangEditor/release/wangEditor.min.js.map
new file mode 100644
index 0000000..1b2efbd
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/release/wangEditor.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["wangEditor.js"],"names":["global","factory","exports","module","define","amd","wangEditor","this","createElemByHTML","html","div","document","createElement","innerHTML","children","isDOMList","selector","HTMLCollection","NodeList","querySelectorAll","result","DomElement","nodeType","selectorResult","Array","replace","trim","indexOf","length","i","$","objForEach","obj","fn","key","hasOwnProperty","call","arrForEach","fakeArr","item","getRandom","prefix","Math","random","toString","slice","replaceHtmlSymbol","isFunction","Bold","editor","$elem","type","_active","DropList","menu","opt","_this","$container","$title","titleHtml","replaceLang","addClass","append","list","onClick","_emptyFn","$list","forEach","elemHtml","value","$li","on","e","hideTimeoutId","setTimeout","hide","_rendered","_show","Head","droplist","width","_command","Panel","Link","Italic","Redo","StrikeThrough","Underline","Undo","List","Justify","ForeColor","config","colors","map","color","BackColor","Quote","Code","Emoticon","Table","Video","Image","imgMenuId","Menus","menus","getPasteText","clipboardData","originalEvent","pasteText","window","getData","getPasteHtml","filterStyle","pasteHtml","docSplitHtml","split","getPasteImgs","items","test","push","getAsFile","getChildrenJSON","childNodes","curElem","elemResult","textContent","tag","nodeName","toLowerCase","attrData","attrList","attributes","attrListLength","attr","name","attrs","Text","Command","API","_currentRange","Progress","_time","_isShow","_isRender","_timeoutId","$textContainer","$textContainerElem","$bar","UploadImg","Editor","toolbarSelector","textSelector","Error","id","editorId","customConfig","eventList","prototype","constructor","elem","clone","deep","cloneList","cloneNode","get","index","first","last","types","addEventListener","target","matches","off","removeEventListener","val","getAttribute","setAttribute","className","arr","filter","join","removeClass","css","currentStyle","style","styleArr","resultArr","show","$children","child","appendChild","remove","parent","parentElement","removeChild","isContain","$child","contains","getSizeData","getBoundingClientRect","getNodeName","find","text","focus","parentUntil","_currentElem","results","equal","insertBefore","$referenceNode","referenceNode","parentNode","insertAfter","lastChild","nextSibling","offAll","emotions","title","content","alt","src","zIndex","debug","linkCheck","link","linkImgCheck","pasteFilterStyle","pasteTextHandle","showLinkImg","linkImgCallback","url","uploadImgMaxSize","uploadImgShowBase64","uploadFileName","uploadImgParams","uploadImgHeaders","withCredentials","uploadImgTimeout","uploadImgHooks","before","xhr","files","success","fail","error","timeout","qiniu","UA","_ua","navigator","userAgent","isWebkit","isIE","isSeleEmpty","selection","isSelectionEmpty","createEmptyRange","cmd","do","collapseRange","restoreSelection","tryChangeActive","queryCommandState","str","langArgs","reg","clearTimeout","$menuELem","menuHeight","height","showTimeoutId","$selectionElem","getSelectionContainerElem","$textElem","cmdValue","queryCommandValue","emptyFn","_isCreatedPanelMenus","$body","$closeBtn","$tabTitleContainer","$tabContentContainer","tabs","tabTitleArr","tabContentArr","tab","tabIndex","tpl","$content","_index","stopPropagation","events","event","$inputs","_hideOtherPanels","panel","$linkelem","createRangeByElem","_createPanel","getSelectionText","inputLinkId","inputTextId","btnOkId","btnDelId","delBtnDisplay","$link","$text","_insertLink","_delLink","selectionText","checkResult","alert","$selectionELem","$parent","$targetELem","$startElem","getSelectionStartElem","$endElem","getSelectionEndElem","$code","textId","btnId","_insertCode","_updateCode","$parentElem","tabConfig","emotData","emotType","faceHtml","$target","insertHtml","_insert","emotHtml","_createEditPanel","_createInsertPanel","btnInsertId","textRowNum","textColNum","rowNum","parseInt","colNum","r","c","_this2","addRowBtnId","addColBtnId","delRowBtnId","delColBtnId","delTableBtnId","_addRow","_addCol","_delRow","_delCol","_delTable","_getLocationData","$tr","$tds","tdLength","td","$tbody","$trs","trLength","tr","locationData","trData","$currentTr","tdData","newTr","tdIndex","$currentTd","$table","textValId","width30","width50","width100","delBtn","tabsConfig","$img","_selectedImg","uploadImg","upTriggerId","upFileId","linkUrlId","linkBtnId","$file","fileElem","click","fileList","$linkUrl","insertLinkImg","tabsConfigResult","uploadImgServer","customUploadImg","FileReader","MenuConstructors","bold","head","italic","redo","strikeThrough","underline","undo","justify","foreColor","backColor","quote","code","emoticon","table","video","image","init","menuKey","MenuConstructor","_addToToolbar","_bindEvent","$toolbarElem","getRange","changeActive","clear","initSelection","getJSON","_saveRangeRealTime","_enterKeyHandle","_clearHandle","_pasteHandle","_tabHandle","_imgHandle","_dragHandle","saveRange","insertEmptyP","$p","pHandle","codeHandle","selectionNodeName","parentNodeName","queryCommandSupported","_willBreakCode","preventDefault","_startOffset","startOffset","codeLength","keyCode","txtHtml","canDo","now","Date","flag","pasteTime","resetTime","ex","pasteFiles","img","dataTransfer","_useStyleWithCSS","execCommand","_name","_execCommand","change","_insertHTML","range","insertNode","deleteContents","pasteHTML","_insertElem","_range","getSelection","rangeCount","getRangeAt","$containerElem","toStart","collapse","commonAncestorContainer","startContainer","endContainer","endOffset","removeAllRanges","addRange","setEnd","isContent","createRange","selectNodeContents","selectNode","progress","timeoutId","_hide","_typeof","Symbol","iterator","_alert","alertInfo","debugInfo","customAlert","onload","callback","onerror","onabort","_this3","maxSize","maxSizeM","maxLength","uploadImgMaxLength","uploadImgParamsWithUrl","hooks","resultFiles","errInfo","file","size","bind","formdata","FormData","uploadImgServerArr","uploadImgServerHash","encodeURIComponent","XMLHttpRequest","open","ontimeout","upload","onprogress","percent","progressBar","lengthComputable","loaded","total","onreadystatechange","readyState","status","responseText","JSON","parse","customInsert","errno","data","beforeResult","prevent","msg","setRequestHeader","send","reader","readAsDataURL","_initConfig","Object","assign","langConfig","lang","RegExp","_initDom","$toolbarSelector","config$$1","toolbarElemId","textElemId","compositionEnd","onfocus","onblur","isFocus","isChild","isToolbar","isMenu","_initCommand","_initSelectionAPI","_initUploadImg","_initMenus","_initText","txt","newLine","$last","onChangeTimeoutId","beforeChangeHtml","onchangeTimeout","onchange","currentHtml","create","_offAllEvent","varArgs","TypeError","to","arguments","nextSource","nextKey","Element","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","s","ownerDocument","getElementsByTagName"],"mappings":"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","file":"wangEditor.min.js","sourcesContent":["(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.wangEditor = factory());\n}(this, (function () { 'use strict';\n\n/*\n    poly-fill\n*/\n\nvar polyfill = function () {\n\n    // Object.assign\n    if (typeof Object.assign != 'function') {\n        Object.assign = function (target, varArgs) {\n            // .length of function is 2\n            if (target == null) {\n                // TypeError if undefined or null\n                throw new TypeError('Cannot convert undefined or null to object');\n            }\n\n            var to = Object(target);\n\n            for (var index = 1; index < arguments.length; index++) {\n                var nextSource = arguments[index];\n\n                if (nextSource != null) {\n                    // Skip over if undefined or null\n                    for (var nextKey in nextSource) {\n                        // Avoid bugs when hasOwnProperty is shadowed\n                        if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n                            to[nextKey] = nextSource[nextKey];\n                        }\n                    }\n                }\n            }\n            return to;\n        };\n    }\n\n    // IE 中兼容 Element.prototype.matches\n    if (!Element.prototype.matches) {\n        Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) {\n            var matches = (this.document || this.ownerDocument).querySelectorAll(s),\n                i = matches.length;\n            while (--i >= 0 && matches.item(i) !== this) {}\n            return i > -1;\n        };\n    }\n};\n\n/*\n    DOM 操作 API\n*/\n\n// 根据 html 代码片段创建 dom 对象\nfunction createElemByHTML(html) {\n    var div = void 0;\n    div = document.createElement('div');\n    div.innerHTML = html;\n    return div.children;\n}\n\n// 是否是 DOM List\nfunction isDOMList(selector) {\n    if (!selector) {\n        return false;\n    }\n    if (selector instanceof HTMLCollection || selector instanceof NodeList) {\n        return true;\n    }\n    return false;\n}\n\n// 封装 document.querySelectorAll\nfunction querySelectorAll(selector) {\n    var result = document.querySelectorAll(selector);\n    if (isDOMList(result)) {\n        return result;\n    } else {\n        return [result];\n    }\n}\n\n// 记录所有的事件绑定\nvar eventList = [];\n\n// 创建构造函数\nfunction DomElement(selector) {\n    if (!selector) {\n        return;\n    }\n\n    // selector 本来就是 DomElement 对象,直接返回\n    if (selector instanceof DomElement) {\n        return selector;\n    }\n\n    this.selector = selector;\n    var nodeType = selector.nodeType;\n\n    // 根据 selector 得出的结果(如 DOM,DOM List)\n    var selectorResult = [];\n    if (nodeType === 9) {\n        // document 节点\n        selectorResult = [selector];\n    } else if (nodeType === 1) {\n        // 单个 DOM 节点\n        selectorResult = [selector];\n    } else if (isDOMList(selector) || selector instanceof Array) {\n        // DOM List 或者数组\n        selectorResult = selector;\n    } else if (typeof selector === 'string') {\n        // 字符串\n        selector = selector.replace('/\\n/mg', '').trim();\n        if (selector.indexOf('<') === 0) {\n            // 如 <div>\n            selectorResult = createElemByHTML(selector);\n        } else {\n            // 如 #id .class\n            selectorResult = querySelectorAll(selector);\n        }\n    }\n\n    var length = selectorResult.length;\n    if (!length) {\n        // 空数组\n        return this;\n    }\n\n    // 加入 DOM 节点\n    var i = void 0;\n    for (i = 0; i < length; i++) {\n        this[i] = selectorResult[i];\n    }\n    this.length = length;\n}\n\n// 修改原型\nDomElement.prototype = {\n    constructor: DomElement,\n\n    // 类数组,forEach\n    forEach: function forEach(fn) {\n        var i = void 0;\n        for (i = 0; i < this.length; i++) {\n            var elem = this[i];\n            var result = fn.call(elem, elem, i);\n            if (result === false) {\n                break;\n            }\n        }\n        return this;\n    },\n\n    // clone\n    clone: function clone(deep) {\n        var cloneList = [];\n        this.forEach(function (elem) {\n            cloneList.push(elem.cloneNode(!!deep));\n        });\n        return $(cloneList);\n    },\n\n    // 获取第几个元素\n    get: function get(index) {\n        var length = this.length;\n        if (index >= length) {\n            index = index % length;\n        }\n        return $(this[index]);\n    },\n\n    // 第一个\n    first: function first() {\n        return this.get(0);\n    },\n\n    // 最后一个\n    last: function last() {\n        var length = this.length;\n        return this.get(length - 1);\n    },\n\n    // 绑定事件\n    on: function on(type, selector, fn) {\n        // selector 不为空,证明绑定事件要加代理\n        if (!fn) {\n            fn = selector;\n            selector = null;\n        }\n\n        // type 是否有多个\n        var types = [];\n        types = type.split(/\\s+/);\n\n        return this.forEach(function (elem) {\n            types.forEach(function (type) {\n                if (!type) {\n                    return;\n                }\n\n                // 记录下,方便后面解绑\n                eventList.push({\n                    elem: elem,\n                    type: type,\n                    fn: fn\n                });\n\n                if (!selector) {\n                    // 无代理\n                    elem.addEventListener(type, fn);\n                    return;\n                }\n\n                // 有代理\n                elem.addEventListener(type, function (e) {\n                    var target = e.target;\n                    if (target.matches(selector)) {\n                        fn.call(target, e);\n                    }\n                });\n            });\n        });\n    },\n\n    // 取消事件绑定\n    off: function off(type, fn) {\n        return this.forEach(function (elem) {\n            elem.removeEventListener(type, fn);\n        });\n    },\n\n    // 获取/设置 属性\n    attr: function attr(key, val) {\n        if (val == null) {\n            // 获取值\n            return this[0].getAttribute(key);\n        } else {\n            // 设置值\n            return this.forEach(function (elem) {\n                elem.setAttribute(key, val);\n            });\n        }\n    },\n\n    // 添加 class\n    addClass: function addClass(className) {\n        if (!className) {\n            return this;\n        }\n        return this.forEach(function (elem) {\n            var arr = void 0;\n            if (elem.className) {\n                // 解析当前 className 转换为数组\n                arr = elem.className.split(/\\s/);\n                arr = arr.filter(function (item) {\n                    return !!item.trim();\n                });\n                // 添加 class\n                if (arr.indexOf(className) < 0) {\n                    arr.push(className);\n                }\n                // 修改 elem.class\n                elem.className = arr.join(' ');\n            } else {\n                elem.className = className;\n            }\n        });\n    },\n\n    // 删除 class\n    removeClass: function removeClass(className) {\n        if (!className) {\n            return this;\n        }\n        return this.forEach(function (elem) {\n            var arr = void 0;\n            if (elem.className) {\n                // 解析当前 className 转换为数组\n                arr = elem.className.split(/\\s/);\n                arr = arr.filter(function (item) {\n                    item = item.trim();\n                    // 删除 class\n                    if (!item || item === className) {\n                        return false;\n                    }\n                    return true;\n                });\n                // 修改 elem.class\n                elem.className = arr.join(' ');\n            }\n        });\n    },\n\n    // 修改 css\n    css: function css(key, val) {\n        var currentStyle = key + ':' + val + ';';\n        return this.forEach(function (elem) {\n            var style = (elem.getAttribute('style') || '').trim();\n            var styleArr = void 0,\n                resultArr = [];\n            if (style) {\n                // 将 style 按照 ; 拆分为数组\n                styleArr = style.split(';');\n                styleArr.forEach(function (item) {\n                    // 对每项样式,按照 : 拆分为 key 和 value\n                    var arr = item.split(':').map(function (i) {\n                        return i.trim();\n                    });\n                    if (arr.length === 2) {\n                        resultArr.push(arr[0] + ':' + arr[1]);\n                    }\n                });\n                // 替换或者新增\n                resultArr = resultArr.map(function (item) {\n                    if (item.indexOf(key) === 0) {\n                        return currentStyle;\n                    } else {\n                        return item;\n                    }\n                });\n                if (resultArr.indexOf(currentStyle) < 0) {\n                    resultArr.push(currentStyle);\n                }\n                // 结果\n                elem.setAttribute('style', resultArr.join('; '));\n            } else {\n                // style 无值\n                elem.setAttribute('style', currentStyle);\n            }\n        });\n    },\n\n    // 显示\n    show: function show() {\n        return this.css('display', 'block');\n    },\n\n    // 隐藏\n    hide: function hide() {\n        return this.css('display', 'none');\n    },\n\n    // 获取子节点\n    children: function children() {\n        var elem = this[0];\n        if (!elem) {\n            return null;\n        }\n\n        return $(elem.children);\n    },\n\n    // 获取子节点(包括文本节点)\n    childNodes: function childNodes() {\n        var elem = this[0];\n        if (!elem) {\n            return null;\n        }\n\n        return $(elem.childNodes);\n    },\n\n    // 增加子节点\n    append: function append($children) {\n        return this.forEach(function (elem) {\n            $children.forEach(function (child) {\n                elem.appendChild(child);\n            });\n        });\n    },\n\n    // 移除当前节点\n    remove: function remove() {\n        return this.forEach(function (elem) {\n            if (elem.remove) {\n                elem.remove();\n            } else {\n                var parent = elem.parentElement;\n                parent && parent.removeChild(elem);\n            }\n        });\n    },\n\n    // 是否包含某个子节点\n    isContain: function isContain($child) {\n        var elem = this[0];\n        var child = $child[0];\n        return elem.contains(child);\n    },\n\n    // 尺寸数据\n    getSizeData: function getSizeData() {\n        var elem = this[0];\n        return elem.getBoundingClientRect(); // 可得到 bottom height left right top width 的数据\n    },\n\n    // 封装 nodeName\n    getNodeName: function getNodeName() {\n        var elem = this[0];\n        return elem.nodeName;\n    },\n\n    // 从当前元素查找\n    find: function find(selector) {\n        var elem = this[0];\n        return $(elem.querySelectorAll(selector));\n    },\n\n    // 获取当前元素的 text\n    text: function text(val) {\n        if (!val) {\n            // 获取 text\n            var elem = this[0];\n            return elem.innerHTML.replace(/<.*?>/g, function () {\n                return '';\n            });\n        } else {\n            // 设置 text\n            return this.forEach(function (elem) {\n                elem.innerHTML = val;\n            });\n        }\n    },\n\n    // 获取 html\n    html: function html(value) {\n        var elem = this[0];\n        if (value == null) {\n            return elem.innerHTML;\n        } else {\n            elem.innerHTML = value;\n            return this;\n        }\n    },\n\n    // 获取 value\n    val: function val() {\n        var elem = this[0];\n        return elem.value.trim();\n    },\n\n    // focus\n    focus: function focus() {\n        return this.forEach(function (elem) {\n            elem.focus();\n        });\n    },\n\n    // parent\n    parent: function parent() {\n        var elem = this[0];\n        return $(elem.parentElement);\n    },\n\n    // parentUntil 找到符合 selector 的父节点\n    parentUntil: function parentUntil(selector, _currentElem) {\n        var results = document.querySelectorAll(selector);\n        var length = results.length;\n        if (!length) {\n            // 传入的 selector 无效\n            return null;\n        }\n\n        var elem = _currentElem || this[0];\n        if (elem.nodeName === 'BODY') {\n            return null;\n        }\n\n        var parent = elem.parentElement;\n        var i = void 0;\n        for (i = 0; i < length; i++) {\n            if (parent === results[i]) {\n                // 找到,并返回\n                return $(parent);\n            }\n        }\n\n        // 继续查找\n        return this.parentUntil(selector, parent);\n    },\n\n    // 判断两个 elem 是否相等\n    equal: function equal($elem) {\n        if ($elem.nodeType === 1) {\n            return this[0] === $elem;\n        } else {\n            return this[0] === $elem[0];\n        }\n    },\n\n    // 将该元素插入到某个元素前面\n    insertBefore: function insertBefore(selector) {\n        var $referenceNode = $(selector);\n        var referenceNode = $referenceNode[0];\n        if (!referenceNode) {\n            return this;\n        }\n        return this.forEach(function (elem) {\n            var parent = referenceNode.parentNode;\n            parent.insertBefore(elem, referenceNode);\n        });\n    },\n\n    // 将该元素插入到某个元素后面\n    insertAfter: function insertAfter(selector) {\n        var $referenceNode = $(selector);\n        var referenceNode = $referenceNode[0];\n        if (!referenceNode) {\n            return this;\n        }\n        return this.forEach(function (elem) {\n            var parent = referenceNode.parentNode;\n            if (parent.lastChild === referenceNode) {\n                // 最后一个元素\n                parent.appendChild(elem);\n            } else {\n                // 不是最后一个元素\n                parent.insertBefore(elem, referenceNode.nextSibling);\n            }\n        });\n    }\n};\n\n// new 一个对象\nfunction $(selector) {\n    return new DomElement(selector);\n}\n\n// 解绑所有事件,用于销毁编辑器\n$.offAll = function () {\n    eventList.forEach(function (item) {\n        var elem = item.elem;\n        var type = item.type;\n        var fn = item.fn;\n        // 解绑\n        elem.removeEventListener(type, fn);\n    });\n};\n\n/*\n    配置信息\n*/\n\nvar config = {\n\n    // 默认菜单配置\n    menus: ['head', 'bold', 'italic', 'underline', 'strikeThrough', 'foreColor', 'backColor', 'link', 'list', 'justify', 'quote', 'emoticon', 'image', 'table', 'video', 'code', 'undo', 'redo'],\n\n    colors: ['#000000', '#eeece0', '#1c487f', '#4d80bf', '#c24f4a', '#8baa4a', '#7b5ba1', '#46acc8', '#f9963b', '#ffffff'],\n\n    // // 语言配置\n    // lang: {\n    //     '设置标题': 'title',\n    //     '正文': 'p',\n    //     '链接文字': 'link text',\n    //     '链接': 'link',\n    //     '插入': 'insert',\n    //     '创建': 'init'\n    // },\n\n    // 表情\n    emotions: [{\n        // tab 的标题\n        title: '默认',\n        // type -> 'emoji' / 'image'\n        type: 'image',\n        // content -> 数组\n        content: [{\n            alt: '[坏笑]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/50/pcmoren_huaixiao_org.png'\n        }, {\n            alt: '[舔屏]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/pcmoren_tian_org.png'\n        }, {\n            alt: '[污]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/pcmoren_wu_org.png'\n        }, {\n            alt: '[允悲]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/2c/moren_yunbei_org.png'\n        }, {\n            alt: '[笑而不语]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3a/moren_xiaoerbuyu_org.png'\n        }, {\n            alt: '[费解]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/moren_feijie_org.png'\n        }, {\n            alt: '[憧憬]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/37/moren_chongjing_org.png'\n        }, {\n            alt: '[并不简单]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/fc/moren_bbjdnew_org.png'\n        }, {\n            alt: '[微笑]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/5c/huanglianwx_org.gif'\n        }, {\n            alt: '[酷]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/8a/pcmoren_cool2017_org.png'\n        }, {\n            alt: '[嘻嘻]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/0b/tootha_org.gif'\n        }, {\n            alt: '[哈哈]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6a/laugh.gif'\n        }, {\n            alt: '[可爱]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/14/tza_org.gif'\n        }, {\n            alt: '[可怜]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/af/kl_org.gif'\n        }, {\n            alt: '[挖鼻]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/0b/wabi_org.gif'\n        }, {\n            alt: '[吃惊]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/f4/cj_org.gif'\n        }, {\n            alt: '[害羞]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6e/shamea_org.gif'\n        }, {\n            alt: '[挤眼]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/c3/zy_org.gif'\n        }, {\n            alt: '[闭嘴]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/29/bz_org.gif'\n        }, {\n            alt: '[鄙视]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/71/bs2_org.gif'\n        }, {\n            alt: '[爱你]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6d/lovea_org.gif'\n        }, {\n            alt: '[泪]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/9d/sada_org.gif'\n        }, {\n            alt: '[偷笑]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/19/heia_org.gif'\n        }, {\n            alt: '[亲亲]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/8f/qq_org.gif'\n        }, {\n            alt: '[生病]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/b6/sb_org.gif'\n        }, {\n            alt: '[太开心]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/58/mb_org.gif'\n        }, {\n            alt: '[白眼]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/d9/landeln_org.gif'\n        }, {\n            alt: '[右哼哼]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/98/yhh_org.gif'\n        }, {\n            alt: '[左哼哼]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6d/zhh_org.gif'\n        }, {\n            alt: '[嘘]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/a6/x_org.gif'\n        }, {\n            alt: '[衰]',\n            src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/af/cry.gif'\n        }]\n    }, {\n        // tab 的标题\n        title: '新浪',\n        // type -> 'emoji' / 'image'\n        type: 'image',\n        // content -> 数组\n        content: [{\n            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/7a/shenshou_thumb.gif',\n            alt: '[草泥马]'\n        }, {\n            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/60/horse2_thumb.gif',\n            alt: '[神马]'\n        }, {\n            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/bc/fuyun_thumb.gif',\n            alt: '[浮云]'\n        }, {\n            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/c9/geili_thumb.gif',\n            alt: '[给力]'\n        }, {\n            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/f2/wg_thumb.gif',\n            alt: '[围观]'\n        }, {\n            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/70/vw_thumb.gif',\n            alt: '[威武]'\n        }, {\n            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/6e/panda_thumb.gif',\n            alt: '[熊猫]'\n        }, {\n            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/81/rabbit_thumb.gif',\n            alt: '[兔子]'\n        }, {\n            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/bc/otm_thumb.gif',\n            alt: '[奥特曼]'\n        }, {\n            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/15/j_thumb.gif',\n            alt: '[囧]'\n        }, {\n            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/89/hufen_thumb.gif',\n            alt: '[互粉]'\n        }, {\n            src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/c4/liwu_thumb.gif',\n            alt: '[礼物]'\n        }]\n    }, {\n        // tab 的标题\n        title: 'emoji',\n        // type -> 'emoji' / 'image'\n        type: 'emoji',\n        // content -> 数组\n        content: '😀 😃 😄 😁 😆 😅 😂 😊 😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 😜 😝 😛 🤑 🤗 🤓 😎 😏 😒 😞 😔 😟 😕 🙁  😣 😖 😫 😩 😤 😠 😡 😶 😐 😑 😯 😦 😧 😮 😲 😵 😳 😱 😨 😰 😢 😥 😭 😓 😪 😴 🙄 🤔 😬 🤐'.split(/\\s/)\n    }],\n\n    // 编辑区域的 z-index\n    zIndex: 10000,\n\n    // 是否开启 debug 模式(debug 模式下错误会 throw error 形式抛出)\n    debug: false,\n\n    // 插入链接时候的格式校验\n    linkCheck: function linkCheck(text, link) {\n        // text 是插入的文字\n        // link 是插入的链接\n        return true; // 返回 true 即表示成功\n        // return '校验失败' // 返回字符串即表示失败的提示信息\n    },\n\n    // 插入网络图片的校验\n    linkImgCheck: function linkImgCheck(src) {\n        // src 即图片的地址\n        return true; // 返回 true 即表示成功\n        // return '校验失败'  // 返回字符串即表示失败的提示信息\n    },\n\n    // 粘贴过滤样式,默认开启\n    pasteFilterStyle: true,\n\n    // 对粘贴的文字进行自定义处理,返回处理后的结果。编辑器会将处理后的结果粘贴到编辑区域中。\n    // IE 暂时不支持\n    pasteTextHandle: function pasteTextHandle(content) {\n        // content 即粘贴过来的内容(html 或 纯文本),可进行自定义处理然后返回\n        return content;\n    },\n\n    // onchange 事件\n    // onchange: function (html) {\n    //     // html 即变化之后的内容\n    //     console.log(html)\n    // },\n\n    // 是否显示添加网络图片的 tab\n    showLinkImg: true,\n\n    // 插入网络图片的回调\n    linkImgCallback: function linkImgCallback(url) {\n        // console.log(url)  // url 即插入图片的地址\n    },\n\n    // 默认上传图片 max size: 5M\n    uploadImgMaxSize: 5 * 1024 * 1024,\n\n    // 配置一次最多上传几个图片\n    // uploadImgMaxLength: 5,\n\n    // 上传图片,是否显示 base64 格式\n    uploadImgShowBase64: false,\n\n    // 上传图片,server 地址(如果有值,则 base64 格式的配置则失效)\n    // uploadImgServer: '/upload',\n\n    // 自定义配置 filename\n    uploadFileName: '',\n\n    // 上传图片的自定义参数\n    uploadImgParams: {\n        // token: 'abcdef12345'\n    },\n\n    // 上传图片的自定义header\n    uploadImgHeaders: {\n        // 'Accept': 'text/x-json'\n    },\n\n    // 配置 XHR withCredentials\n    withCredentials: false,\n\n    // 自定义上传图片超时时间 ms\n    uploadImgTimeout: 10000,\n\n    // 上传图片 hook \n    uploadImgHooks: {\n        // customInsert: function (insertLinkImg, result, editor) {\n        //     console.log('customInsert')\n        //     // 图片上传并返回结果,自定义插入图片的事件,而不是编辑器自动插入图片\n        //     const data = result.data1 || []\n        //     data.forEach(link => {\n        //         insertLinkImg(link)\n        //     })\n        // },\n        before: function before(xhr, editor, files) {\n            // 图片上传之前触发\n\n            // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传\n            // return {\n            //     prevent: true,\n            //     msg: '放弃上传'\n            // }\n        },\n        success: function success(xhr, editor, result) {\n            // 图片上传并返回结果,图片插入成功之后触发\n        },\n        fail: function fail(xhr, editor, result) {\n            // 图片上传并返回结果,但图片插入错误时触发\n        },\n        error: function error(xhr, editor) {\n            // 图片上传出错时触发\n        },\n        timeout: function timeout(xhr, editor) {\n            // 图片上传超时时触发\n        }\n    },\n\n    // 是否上传七牛云,默认为 false\n    qiniu: false\n\n};\n\n/*\n    工具\n*/\n\n// 和 UA 相关的属性\nvar UA = {\n    _ua: navigator.userAgent,\n\n    // 是否 webkit\n    isWebkit: function isWebkit() {\n        var reg = /webkit/i;\n        return reg.test(this._ua);\n    },\n\n    // 是否 IE\n    isIE: function isIE() {\n        return 'ActiveXObject' in window;\n    }\n};\n\n// 遍历对象\nfunction objForEach(obj, fn) {\n    var key = void 0,\n        result = void 0;\n    for (key in obj) {\n        if (obj.hasOwnProperty(key)) {\n            result = fn.call(obj, key, obj[key]);\n            if (result === false) {\n                break;\n            }\n        }\n    }\n}\n\n// 遍历类数组\nfunction arrForEach(fakeArr, fn) {\n    var i = void 0,\n        item = void 0,\n        result = void 0;\n    var length = fakeArr.length || 0;\n    for (i = 0; i < length; i++) {\n        item = fakeArr[i];\n        result = fn.call(fakeArr, item, i);\n        if (result === false) {\n            break;\n        }\n    }\n}\n\n// 获取随机数\nfunction getRandom(prefix) {\n    return prefix + Math.random().toString().slice(2);\n}\n\n// 替换 html 特殊字符\nfunction replaceHtmlSymbol(html) {\n    if (html == null) {\n        return '';\n    }\n    return html.replace(/</gm, '&lt;').replace(/>/gm, '&gt;').replace(/\"/gm, '&quot;');\n}\n\n// 返回百分比的格式\n\n\n// 判断是不是 function\nfunction isFunction(fn) {\n    return typeof fn === 'function';\n}\n\n/*\n    bold-menu\n*/\n// 构造函数\nfunction Bold(editor) {\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\">\\n            <i class=\"w-e-icon-bold\"><i/>\\n        </div>');\n    this.type = 'click';\n\n    // 当前是否 active 状态\n    this._active = false;\n}\n\n// 原型\nBold.prototype = {\n    constructor: Bold,\n\n    // 点击事件\n    onClick: function onClick(e) {\n        // 点击菜单将触发这里\n\n        var editor = this.editor;\n        var isSeleEmpty = editor.selection.isSelectionEmpty();\n\n        if (isSeleEmpty) {\n            // 选区是空的,插入并选中一个“空白”\n            editor.selection.createEmptyRange();\n        }\n\n        // 执行 bold 命令\n        editor.cmd.do('bold');\n\n        if (isSeleEmpty) {\n            // 需要将选取折叠起来\n            editor.selection.collapseRange();\n            editor.selection.restoreSelection();\n        }\n    },\n\n    // 试图改变 active 状态\n    tryChangeActive: function tryChangeActive(e) {\n        var editor = this.editor;\n        var $elem = this.$elem;\n        if (editor.cmd.queryCommandState('bold')) {\n            this._active = true;\n            $elem.addClass('w-e-active');\n        } else {\n            this._active = false;\n            $elem.removeClass('w-e-active');\n        }\n    }\n};\n\n/*\n    替换多语言\n */\n\nvar replaceLang = function (editor, str) {\n    var langArgs = editor.config.langArgs || [];\n    var result = str;\n\n    langArgs.forEach(function (item) {\n        var reg = item.reg;\n        var val = item.val;\n\n        if (reg.test(result)) {\n            result = result.replace(reg, function () {\n                return val;\n            });\n        }\n    });\n\n    return result;\n};\n\n/*\n    droplist\n*/\nvar _emptyFn = function _emptyFn() {};\n\n// 构造函数\nfunction DropList(menu, opt) {\n    var _this = this;\n\n    // droplist 所依附的菜单\n    var editor = menu.editor;\n    this.menu = menu;\n    this.opt = opt;\n    // 容器\n    var $container = $('<div class=\"w-e-droplist\"></div>');\n\n    // 标题\n    var $title = opt.$title;\n    var titleHtml = void 0;\n    if ($title) {\n        // 替换多语言\n        titleHtml = $title.html();\n        titleHtml = replaceLang(editor, titleHtml);\n        $title.html(titleHtml);\n\n        $title.addClass('w-e-dp-title');\n        $container.append($title);\n    }\n\n    var list = opt.list || [];\n    var type = opt.type || 'list'; // 'list' 列表形式(如“标题”菜单) / 'inline-block' 块状形式(如“颜色”菜单)\n    var onClick = opt.onClick || _emptyFn;\n\n    // 加入 DOM 并绑定事件\n    var $list = $('<ul class=\"' + (type === 'list' ? 'w-e-list' : 'w-e-block') + '\"></ul>');\n    $container.append($list);\n    list.forEach(function (item) {\n        var $elem = item.$elem;\n\n        // 替换多语言\n        var elemHtml = $elem.html();\n        elemHtml = replaceLang(editor, elemHtml);\n        $elem.html(elemHtml);\n\n        var value = item.value;\n        var $li = $('<li class=\"w-e-item\"></li>');\n        if ($elem) {\n            $li.append($elem);\n            $list.append($li);\n            $li.on('click', function (e) {\n                onClick(value);\n\n                // 隐藏\n                _this.hideTimeoutId = setTimeout(function () {\n                    _this.hide();\n                }, 0);\n            });\n        }\n    });\n\n    // 绑定隐藏事件\n    $container.on('mouseleave', function (e) {\n        _this.hideTimeoutId = setTimeout(function () {\n            _this.hide();\n        }, 0);\n    });\n\n    // 记录属性\n    this.$container = $container;\n\n    // 基本属性\n    this._rendered = false;\n    this._show = false;\n}\n\n// 原型\nDropList.prototype = {\n    constructor: DropList,\n\n    // 显示(插入DOM)\n    show: function show() {\n        if (this.hideTimeoutId) {\n            // 清除之前的定时隐藏\n            clearTimeout(this.hideTimeoutId);\n        }\n\n        var menu = this.menu;\n        var $menuELem = menu.$elem;\n        var $container = this.$container;\n        if (this._show) {\n            return;\n        }\n        if (this._rendered) {\n            // 显示\n            $container.show();\n        } else {\n            // 加入 DOM 之前先定位位置\n            var menuHeight = $menuELem.getSizeData().height || 0;\n            var width = this.opt.width || 100; // 默认为 100\n            $container.css('margin-top', menuHeight + 'px').css('width', width + 'px');\n\n            // 加入到 DOM\n            $menuELem.append($container);\n            this._rendered = true;\n        }\n\n        // 修改属性\n        this._show = true;\n    },\n\n    // 隐藏(移除DOM)\n    hide: function hide() {\n        if (this.showTimeoutId) {\n            // 清除之前的定时显示\n            clearTimeout(this.showTimeoutId);\n        }\n\n        var $container = this.$container;\n        if (!this._show) {\n            return;\n        }\n        // 隐藏并需改属性\n        $container.hide();\n        this._show = false;\n    }\n};\n\n/*\n    menu - header\n*/\n// 构造函数\nfunction Head(editor) {\n    var _this = this;\n\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\"><i class=\"w-e-icon-header\"><i/></div>');\n    this.type = 'droplist';\n\n    // 当前是否 active 状态\n    this._active = false;\n\n    // 初始化 droplist\n    this.droplist = new DropList(this, {\n        width: 100,\n        $title: $('<p>设置标题</p>'),\n        type: 'list', // droplist 以列表形式展示\n        list: [{ $elem: $('<h1>H1</h1>'), value: '<h1>' }, { $elem: $('<h2>H2</h2>'), value: '<h2>' }, { $elem: $('<h3>H3</h3>'), value: '<h3>' }, { $elem: $('<h4>H4</h4>'), value: '<h4>' }, { $elem: $('<h5>H5</h5>'), value: '<h5>' }, { $elem: $('<p>正文</p>'), value: '<p>' }],\n        onClick: function onClick(value) {\n            // 注意 this 是指向当前的 Head 对象\n            _this._command(value);\n        }\n    });\n}\n\n// 原型\nHead.prototype = {\n    constructor: Head,\n\n    // 执行命令\n    _command: function _command(value) {\n        var editor = this.editor;\n\n        var $selectionElem = editor.selection.getSelectionContainerElem();\n        if (editor.$textElem.equal($selectionElem)) {\n            // 不能选中多行来设置标题,否则会出现问题\n            // 例如选中的是 <p>xxx</p><p>yyy</p> 来设置标题,设置之后会成为 <h1>xxx<br>yyy</h1> 不符合预期\n            return;\n        }\n\n        editor.cmd.do('formatBlock', value);\n    },\n\n    // 试图改变 active 状态\n    tryChangeActive: function tryChangeActive(e) {\n        var editor = this.editor;\n        var $elem = this.$elem;\n        var reg = /^h/i;\n        var cmdValue = editor.cmd.queryCommandValue('formatBlock');\n        if (reg.test(cmdValue)) {\n            this._active = true;\n            $elem.addClass('w-e-active');\n        } else {\n            this._active = false;\n            $elem.removeClass('w-e-active');\n        }\n    }\n};\n\n/*\n    panel\n*/\n\nvar emptyFn = function emptyFn() {};\n\n// 记录已经显示 panel 的菜单\nvar _isCreatedPanelMenus = [];\n\n// 构造函数\nfunction Panel(menu, opt) {\n    this.menu = menu;\n    this.opt = opt;\n}\n\n// 原型\nPanel.prototype = {\n    constructor: Panel,\n\n    // 显示(插入DOM)\n    show: function show() {\n        var _this = this;\n\n        var menu = this.menu;\n        if (_isCreatedPanelMenus.indexOf(menu) >= 0) {\n            // 该菜单已经创建了 panel 不能再创建\n            return;\n        }\n\n        var editor = menu.editor;\n        var $body = $('body');\n        var $textContainerElem = editor.$textContainerElem;\n        var opt = this.opt;\n\n        // panel 的容器\n        var $container = $('<div class=\"w-e-panel-container\"></div>');\n        var width = opt.width || 300; // 默认 300px\n        $container.css('width', width + 'px').css('margin-left', (0 - width) / 2 + 'px');\n\n        // 添加关闭按钮\n        var $closeBtn = $('<i class=\"w-e-icon-close w-e-panel-close\"></i>');\n        $container.append($closeBtn);\n        $closeBtn.on('click', function () {\n            _this.hide();\n        });\n\n        // 准备 tabs 容器\n        var $tabTitleContainer = $('<ul class=\"w-e-panel-tab-title\"></ul>');\n        var $tabContentContainer = $('<div class=\"w-e-panel-tab-content\"></div>');\n        $container.append($tabTitleContainer).append($tabContentContainer);\n\n        // 设置高度\n        var height = opt.height;\n        if (height) {\n            $tabContentContainer.css('height', height + 'px').css('overflow-y', 'auto');\n        }\n\n        // tabs\n        var tabs = opt.tabs || [];\n        var tabTitleArr = [];\n        var tabContentArr = [];\n        tabs.forEach(function (tab, tabIndex) {\n            if (!tab) {\n                return;\n            }\n            var title = tab.title || '';\n            var tpl = tab.tpl || '';\n\n            // 替换多语言\n            title = replaceLang(editor, title);\n            tpl = replaceLang(editor, tpl);\n\n            // 添加到 DOM\n            var $title = $('<li class=\"w-e-item\">' + title + '</li>');\n            $tabTitleContainer.append($title);\n            var $content = $(tpl);\n            $tabContentContainer.append($content);\n\n            // 记录到内存\n            $title._index = tabIndex;\n            tabTitleArr.push($title);\n            tabContentArr.push($content);\n\n            // 设置 active 项\n            if (tabIndex === 0) {\n                $title._active = true;\n                $title.addClass('w-e-active');\n            } else {\n                $content.hide();\n            }\n\n            // 绑定 tab 的事件\n            $title.on('click', function (e) {\n                if ($title._active) {\n                    return;\n                }\n                // 隐藏所有的 tab\n                tabTitleArr.forEach(function ($title) {\n                    $title._active = false;\n                    $title.removeClass('w-e-active');\n                });\n                tabContentArr.forEach(function ($content) {\n                    $content.hide();\n                });\n\n                // 显示当前的 tab\n                $title._active = true;\n                $title.addClass('w-e-active');\n                $content.show();\n            });\n        });\n\n        // 绑定关闭事件\n        $container.on('click', function (e) {\n            // 点击时阻止冒泡\n            e.stopPropagation();\n        });\n        $body.on('click', function (e) {\n            _this.hide();\n        });\n\n        // 添加到 DOM\n        $textContainerElem.append($container);\n\n        // 绑定 opt 的事件,只有添加到 DOM 之后才能绑定成功\n        tabs.forEach(function (tab, index) {\n            if (!tab) {\n                return;\n            }\n            var events = tab.events || [];\n            events.forEach(function (event) {\n                var selector = event.selector;\n                var type = event.type;\n                var fn = event.fn || emptyFn;\n                var $content = tabContentArr[index];\n                $content.find(selector).on(type, function (e) {\n                    e.stopPropagation();\n                    var needToHide = fn(e);\n                    // 执行完事件之后,是否要关闭 panel\n                    if (needToHide) {\n                        _this.hide();\n                    }\n                });\n            });\n        });\n\n        // focus 第一个 elem\n        var $inputs = $container.find('input[type=text],textarea');\n        if ($inputs.length) {\n            $inputs.get(0).focus();\n        }\n\n        // 添加到属性\n        this.$container = $container;\n\n        // 隐藏其他 panel\n        this._hideOtherPanels();\n        // 记录该 menu 已经创建了 panel\n        _isCreatedPanelMenus.push(menu);\n    },\n\n    // 隐藏(移除DOM)\n    hide: function hide() {\n        var menu = this.menu;\n        var $container = this.$container;\n        if ($container) {\n            $container.remove();\n        }\n\n        // 将该 menu 记录中移除\n        _isCreatedPanelMenus = _isCreatedPanelMenus.filter(function (item) {\n            if (item === menu) {\n                return false;\n            } else {\n                return true;\n            }\n        });\n    },\n\n    // 一个 panel 展示时,隐藏其他 panel\n    _hideOtherPanels: function _hideOtherPanels() {\n        if (!_isCreatedPanelMenus.length) {\n            return;\n        }\n        _isCreatedPanelMenus.forEach(function (menu) {\n            var panel = menu.panel || {};\n            if (panel.hide) {\n                panel.hide();\n            }\n        });\n    }\n};\n\n/*\n    menu - link\n*/\n// 构造函数\nfunction Link(editor) {\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\"><i class=\"w-e-icon-link\"><i/></div>');\n    this.type = 'panel';\n\n    // 当前是否 active 状态\n    this._active = false;\n}\n\n// 原型\nLink.prototype = {\n    constructor: Link,\n\n    // 点击事件\n    onClick: function onClick(e) {\n        var editor = this.editor;\n        var $linkelem = void 0;\n\n        if (this._active) {\n            // 当前选区在链接里面\n            $linkelem = editor.selection.getSelectionContainerElem();\n            if (!$linkelem) {\n                return;\n            }\n            // 将该元素都包含在选取之内,以便后面整体替换\n            editor.selection.createRangeByElem($linkelem);\n            editor.selection.restoreSelection();\n            // 显示 panel\n            this._createPanel($linkelem.text(), $linkelem.attr('href'));\n        } else {\n            // 当前选区不在链接里面\n            if (editor.selection.isSelectionEmpty()) {\n                // 选区是空的,未选中内容\n                this._createPanel('', '');\n            } else {\n                // 选中内容了\n                this._createPanel(editor.selection.getSelectionText(), '');\n            }\n        }\n    },\n\n    // 创建 panel\n    _createPanel: function _createPanel(text, link) {\n        var _this = this;\n\n        // panel 中需要用到的id\n        var inputLinkId = getRandom('input-link');\n        var inputTextId = getRandom('input-text');\n        var btnOkId = getRandom('btn-ok');\n        var btnDelId = getRandom('btn-del');\n\n        // 是否显示“删除链接”\n        var delBtnDisplay = this._active ? 'inline-block' : 'none';\n\n        // 初始化并显示 panel\n        var panel = new Panel(this, {\n            width: 300,\n            // panel 中可包含多个 tab\n            tabs: [{\n                // tab 的标题\n                title: '链接',\n                // 模板\n                tpl: '<div>\\n                            <input id=\"' + inputTextId + '\" type=\"text\" class=\"block\" value=\"' + text + '\" placeholder=\"\\u94FE\\u63A5\\u6587\\u5B57\"/></td>\\n                            <input id=\"' + inputLinkId + '\" type=\"text\" class=\"block\" value=\"' + link + '\" placeholder=\"http://...\"/></td>\\n                            <div class=\"w-e-button-container\">\\n                                <button id=\"' + btnOkId + '\" class=\"right\">\\u63D2\\u5165</button>\\n                                <button id=\"' + btnDelId + '\" class=\"gray right\" style=\"display:' + delBtnDisplay + '\">\\u5220\\u9664\\u94FE\\u63A5</button>\\n                            </div>\\n                        </div>',\n                // 事件绑定\n                events: [\n                // 插入链接\n                {\n                    selector: '#' + btnOkId,\n                    type: 'click',\n                    fn: function fn() {\n                        // 执行插入链接\n                        var $link = $('#' + inputLinkId);\n                        var $text = $('#' + inputTextId);\n                        var link = $link.val();\n                        var text = $text.val();\n                        _this._insertLink(text, link);\n\n                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n                        return true;\n                    }\n                },\n                // 删除链接\n                {\n                    selector: '#' + btnDelId,\n                    type: 'click',\n                    fn: function fn() {\n                        // 执行删除链接\n                        _this._delLink();\n\n                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n                        return true;\n                    }\n                }]\n            } // tab end\n            ] // tabs end\n        });\n\n        // 显示 panel\n        panel.show();\n\n        // 记录属性\n        this.panel = panel;\n    },\n\n    // 删除当前链接\n    _delLink: function _delLink() {\n        if (!this._active) {\n            return;\n        }\n        var editor = this.editor;\n        var $selectionELem = editor.selection.getSelectionContainerElem();\n        if (!$selectionELem) {\n            return;\n        }\n        var selectionText = editor.selection.getSelectionText();\n        editor.cmd.do('insertHTML', '<span>' + selectionText + '</span>');\n    },\n\n    // 插入链接\n    _insertLink: function _insertLink(text, link) {\n        var editor = this.editor;\n        var config = editor.config;\n        var linkCheck = config.linkCheck;\n        var checkResult = true; // 默认为 true\n        if (linkCheck && typeof linkCheck === 'function') {\n            checkResult = linkCheck(text, link);\n        }\n        if (checkResult === true) {\n            editor.cmd.do('insertHTML', '<a href=\"' + link + '\" target=\"_blank\">' + text + '</a>');\n        } else {\n            alert(checkResult);\n        }\n    },\n\n    // 试图改变 active 状态\n    tryChangeActive: function tryChangeActive(e) {\n        var editor = this.editor;\n        var $elem = this.$elem;\n        var $selectionELem = editor.selection.getSelectionContainerElem();\n        if (!$selectionELem) {\n            return;\n        }\n        if ($selectionELem.getNodeName() === 'A') {\n            this._active = true;\n            $elem.addClass('w-e-active');\n        } else {\n            this._active = false;\n            $elem.removeClass('w-e-active');\n        }\n    }\n};\n\n/*\n    italic-menu\n*/\n// 构造函数\nfunction Italic(editor) {\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\">\\n            <i class=\"w-e-icon-italic\"><i/>\\n        </div>');\n    this.type = 'click';\n\n    // 当前是否 active 状态\n    this._active = false;\n}\n\n// 原型\nItalic.prototype = {\n    constructor: Italic,\n\n    // 点击事件\n    onClick: function onClick(e) {\n        // 点击菜单将触发这里\n\n        var editor = this.editor;\n        var isSeleEmpty = editor.selection.isSelectionEmpty();\n\n        if (isSeleEmpty) {\n            // 选区是空的,插入并选中一个“空白”\n            editor.selection.createEmptyRange();\n        }\n\n        // 执行 italic 命令\n        editor.cmd.do('italic');\n\n        if (isSeleEmpty) {\n            // 需要将选取折叠起来\n            editor.selection.collapseRange();\n            editor.selection.restoreSelection();\n        }\n    },\n\n    // 试图改变 active 状态\n    tryChangeActive: function tryChangeActive(e) {\n        var editor = this.editor;\n        var $elem = this.$elem;\n        if (editor.cmd.queryCommandState('italic')) {\n            this._active = true;\n            $elem.addClass('w-e-active');\n        } else {\n            this._active = false;\n            $elem.removeClass('w-e-active');\n        }\n    }\n};\n\n/*\n    redo-menu\n*/\n// 构造函数\nfunction Redo(editor) {\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\">\\n            <i class=\"w-e-icon-redo\"><i/>\\n        </div>');\n    this.type = 'click';\n\n    // 当前是否 active 状态\n    this._active = false;\n}\n\n// 原型\nRedo.prototype = {\n    constructor: Redo,\n\n    // 点击事件\n    onClick: function onClick(e) {\n        // 点击菜单将触发这里\n\n        var editor = this.editor;\n\n        // 执行 redo 命令\n        editor.cmd.do('redo');\n    }\n};\n\n/*\n    strikeThrough-menu\n*/\n// 构造函数\nfunction StrikeThrough(editor) {\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\">\\n            <i class=\"w-e-icon-strikethrough\"><i/>\\n        </div>');\n    this.type = 'click';\n\n    // 当前是否 active 状态\n    this._active = false;\n}\n\n// 原型\nStrikeThrough.prototype = {\n    constructor: StrikeThrough,\n\n    // 点击事件\n    onClick: function onClick(e) {\n        // 点击菜单将触发这里\n\n        var editor = this.editor;\n        var isSeleEmpty = editor.selection.isSelectionEmpty();\n\n        if (isSeleEmpty) {\n            // 选区是空的,插入并选中一个“空白”\n            editor.selection.createEmptyRange();\n        }\n\n        // 执行 strikeThrough 命令\n        editor.cmd.do('strikeThrough');\n\n        if (isSeleEmpty) {\n            // 需要将选取折叠起来\n            editor.selection.collapseRange();\n            editor.selection.restoreSelection();\n        }\n    },\n\n    // 试图改变 active 状态\n    tryChangeActive: function tryChangeActive(e) {\n        var editor = this.editor;\n        var $elem = this.$elem;\n        if (editor.cmd.queryCommandState('strikeThrough')) {\n            this._active = true;\n            $elem.addClass('w-e-active');\n        } else {\n            this._active = false;\n            $elem.removeClass('w-e-active');\n        }\n    }\n};\n\n/*\n    underline-menu\n*/\n// 构造函数\nfunction Underline(editor) {\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\">\\n            <i class=\"w-e-icon-underline\"><i/>\\n        </div>');\n    this.type = 'click';\n\n    // 当前是否 active 状态\n    this._active = false;\n}\n\n// 原型\nUnderline.prototype = {\n    constructor: Underline,\n\n    // 点击事件\n    onClick: function onClick(e) {\n        // 点击菜单将触发这里\n\n        var editor = this.editor;\n        var isSeleEmpty = editor.selection.isSelectionEmpty();\n\n        if (isSeleEmpty) {\n            // 选区是空的,插入并选中一个“空白”\n            editor.selection.createEmptyRange();\n        }\n\n        // 执行 underline 命令\n        editor.cmd.do('underline');\n\n        if (isSeleEmpty) {\n            // 需要将选取折叠起来\n            editor.selection.collapseRange();\n            editor.selection.restoreSelection();\n        }\n    },\n\n    // 试图改变 active 状态\n    tryChangeActive: function tryChangeActive(e) {\n        var editor = this.editor;\n        var $elem = this.$elem;\n        if (editor.cmd.queryCommandState('underline')) {\n            this._active = true;\n            $elem.addClass('w-e-active');\n        } else {\n            this._active = false;\n            $elem.removeClass('w-e-active');\n        }\n    }\n};\n\n/*\n    undo-menu\n*/\n// 构造函数\nfunction Undo(editor) {\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\">\\n            <i class=\"w-e-icon-undo\"><i/>\\n        </div>');\n    this.type = 'click';\n\n    // 当前是否 active 状态\n    this._active = false;\n}\n\n// 原型\nUndo.prototype = {\n    constructor: Undo,\n\n    // 点击事件\n    onClick: function onClick(e) {\n        // 点击菜单将触发这里\n\n        var editor = this.editor;\n\n        // 执行 undo 命令\n        editor.cmd.do('undo');\n    }\n};\n\n/*\n    menu - list\n*/\n// 构造函数\nfunction List(editor) {\n    var _this = this;\n\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\"><i class=\"w-e-icon-list2\"><i/></div>');\n    this.type = 'droplist';\n\n    // 当前是否 active 状态\n    this._active = false;\n\n    // 初始化 droplist\n    this.droplist = new DropList(this, {\n        width: 120,\n        $title: $('<p>设置列表</p>'),\n        type: 'list', // droplist 以列表形式展示\n        list: [{ $elem: $('<span><i class=\"w-e-icon-list-numbered\"></i> 有序列表</span>'), value: 'insertOrderedList' }, { $elem: $('<span><i class=\"w-e-icon-list2\"></i> 无序列表</span>'), value: 'insertUnorderedList' }],\n        onClick: function onClick(value) {\n            // 注意 this 是指向当前的 List 对象\n            _this._command(value);\n        }\n    });\n}\n\n// 原型\nList.prototype = {\n    constructor: List,\n\n    // 执行命令\n    _command: function _command(value) {\n        var editor = this.editor;\n        var $textElem = editor.$textElem;\n        editor.selection.restoreSelection();\n        if (editor.cmd.queryCommandState(value)) {\n            return;\n        }\n        editor.cmd.do(value);\n\n        // 验证列表是否被包裹在 <p> 之内\n        var $selectionElem = editor.selection.getSelectionContainerElem();\n        if ($selectionElem.getNodeName() === 'LI') {\n            $selectionElem = $selectionElem.parent();\n        }\n        if (/^ol|ul$/i.test($selectionElem.getNodeName()) === false) {\n            return;\n        }\n        if ($selectionElem.equal($textElem)) {\n            // 证明是顶级标签,没有被 <p> 包裹\n            return;\n        }\n        var $parent = $selectionElem.parent();\n        if ($parent.equal($textElem)) {\n            // $parent 是顶级标签,不能删除\n            return;\n        }\n\n        $selectionElem.insertAfter($parent);\n        $parent.remove();\n    },\n\n    // 试图改变 active 状态\n    tryChangeActive: function tryChangeActive(e) {\n        var editor = this.editor;\n        var $elem = this.$elem;\n        if (editor.cmd.queryCommandState('insertUnOrderedList') || editor.cmd.queryCommandState('insertOrderedList')) {\n            this._active = true;\n            $elem.addClass('w-e-active');\n        } else {\n            this._active = false;\n            $elem.removeClass('w-e-active');\n        }\n    }\n};\n\n/*\n    menu - justify\n*/\n// 构造函数\nfunction Justify(editor) {\n    var _this = this;\n\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\"><i class=\"w-e-icon-paragraph-left\"><i/></div>');\n    this.type = 'droplist';\n\n    // 当前是否 active 状态\n    this._active = false;\n\n    // 初始化 droplist\n    this.droplist = new DropList(this, {\n        width: 100,\n        $title: $('<p>对齐方式</p>'),\n        type: 'list', // droplist 以列表形式展示\n        list: [{ $elem: $('<span><i class=\"w-e-icon-paragraph-left\"></i> 靠左</span>'), value: 'justifyLeft' }, { $elem: $('<span><i class=\"w-e-icon-paragraph-center\"></i> 居中</span>'), value: 'justifyCenter' }, { $elem: $('<span><i class=\"w-e-icon-paragraph-right\"></i> 靠右</span>'), value: 'justifyRight' }],\n        onClick: function onClick(value) {\n            // 注意 this 是指向当前的 List 对象\n            _this._command(value);\n        }\n    });\n}\n\n// 原型\nJustify.prototype = {\n    constructor: Justify,\n\n    // 执行命令\n    _command: function _command(value) {\n        var editor = this.editor;\n        editor.cmd.do(value);\n    }\n};\n\n/*\n    menu - Forecolor\n*/\n// 构造函数\nfunction ForeColor(editor) {\n    var _this = this;\n\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\"><i class=\"w-e-icon-pencil2\"><i/></div>');\n    this.type = 'droplist';\n\n    // 获取配置的颜色\n    var config = editor.config;\n    var colors = config.colors || [];\n\n    // 当前是否 active 状态\n    this._active = false;\n\n    // 初始化 droplist\n    this.droplist = new DropList(this, {\n        width: 120,\n        $title: $('<p>文字颜色</p>'),\n        type: 'inline-block', // droplist 内容以 block 形式展示\n        list: colors.map(function (color) {\n            return { $elem: $('<i style=\"color:' + color + ';\" class=\"w-e-icon-pencil2\"></i>'), value: color };\n        }),\n        onClick: function onClick(value) {\n            // 注意 this 是指向当前的 ForeColor 对象\n            _this._command(value);\n        }\n    });\n}\n\n// 原型\nForeColor.prototype = {\n    constructor: ForeColor,\n\n    // 执行命令\n    _command: function _command(value) {\n        var editor = this.editor;\n        editor.cmd.do('foreColor', value);\n    }\n};\n\n/*\n    menu - BackColor\n*/\n// 构造函数\nfunction BackColor(editor) {\n    var _this = this;\n\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\"><i class=\"w-e-icon-paint-brush\"><i/></div>');\n    this.type = 'droplist';\n\n    // 获取配置的颜色\n    var config = editor.config;\n    var colors = config.colors || [];\n\n    // 当前是否 active 状态\n    this._active = false;\n\n    // 初始化 droplist\n    this.droplist = new DropList(this, {\n        width: 120,\n        $title: $('<p>背景色</p>'),\n        type: 'inline-block', // droplist 内容以 block 形式展示\n        list: colors.map(function (color) {\n            return { $elem: $('<i style=\"color:' + color + ';\" class=\"w-e-icon-paint-brush\"></i>'), value: color };\n        }),\n        onClick: function onClick(value) {\n            // 注意 this 是指向当前的 BackColor 对象\n            _this._command(value);\n        }\n    });\n}\n\n// 原型\nBackColor.prototype = {\n    constructor: BackColor,\n\n    // 执行命令\n    _command: function _command(value) {\n        var editor = this.editor;\n        editor.cmd.do('backColor', value);\n    }\n};\n\n/*\n    menu - quote\n*/\n// 构造函数\nfunction Quote(editor) {\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\">\\n            <i class=\"w-e-icon-quotes-left\"><i/>\\n        </div>');\n    this.type = 'click';\n\n    // 当前是否 active 状态\n    this._active = false;\n}\n\n// 原型\nQuote.prototype = {\n    constructor: Quote,\n\n    onClick: function onClick(e) {\n        var editor = this.editor;\n        var $selectionElem = editor.selection.getSelectionContainerElem();\n        var nodeName = $selectionElem.getNodeName();\n\n        if (!UA.isIE()) {\n            if (nodeName === 'BLOCKQUOTE') {\n                // 撤销 quote\n                editor.cmd.do('formatBlock', '<P>');\n            } else {\n                // 转换为 quote\n                editor.cmd.do('formatBlock', '<BLOCKQUOTE>');\n            }\n            return;\n        }\n\n        // IE 中不支持 formatBlock <BLOCKQUOTE> ,要用其他方式兼容\n        var content = void 0,\n            $targetELem = void 0;\n        if (nodeName === 'P') {\n            // 将 P 转换为 quote\n            content = $selectionElem.text();\n            $targetELem = $('<blockquote>' + content + '</blockquote>');\n            $targetELem.insertAfter($selectionElem);\n            $selectionElem.remove();\n            return;\n        }\n        if (nodeName === 'BLOCKQUOTE') {\n            // 撤销 quote\n            content = $selectionElem.text();\n            $targetELem = $('<p>' + content + '</p>');\n            $targetELem.insertAfter($selectionElem);\n            $selectionElem.remove();\n        }\n    },\n\n    tryChangeActive: function tryChangeActive(e) {\n        var editor = this.editor;\n        var $elem = this.$elem;\n        var reg = /^BLOCKQUOTE$/i;\n        var cmdValue = editor.cmd.queryCommandValue('formatBlock');\n        if (reg.test(cmdValue)) {\n            this._active = true;\n            $elem.addClass('w-e-active');\n        } else {\n            this._active = false;\n            $elem.removeClass('w-e-active');\n        }\n    }\n};\n\n/*\n    menu - code\n*/\n// 构造函数\nfunction Code(editor) {\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\">\\n            <i class=\"w-e-icon-terminal\"><i/>\\n        </div>');\n    this.type = 'panel';\n\n    // 当前是否 active 状态\n    this._active = false;\n}\n\n// 原型\nCode.prototype = {\n    constructor: Code,\n\n    onClick: function onClick(e) {\n        var editor = this.editor;\n        var $startElem = editor.selection.getSelectionStartElem();\n        var $endElem = editor.selection.getSelectionEndElem();\n        var isSeleEmpty = editor.selection.isSelectionEmpty();\n        var selectionText = editor.selection.getSelectionText();\n        var $code = void 0;\n\n        if (!$startElem.equal($endElem)) {\n            // 跨元素选择,不做处理\n            editor.selection.restoreSelection();\n            return;\n        }\n        if (!isSeleEmpty) {\n            // 选取不是空,用 <code> 包裹即可\n            $code = $('<code>' + selectionText + '</code>');\n            editor.cmd.do('insertElem', $code);\n            editor.selection.createRangeByElem($code, false);\n            editor.selection.restoreSelection();\n            return;\n        }\n\n        // 选取是空,且没有夸元素选择,则插入 <pre><code></code></prev>\n        if (this._active) {\n            // 选中状态,将编辑内容\n            this._createPanel($startElem.html());\n        } else {\n            // 未选中状态,将创建内容\n            this._createPanel();\n        }\n    },\n\n    _createPanel: function _createPanel(value) {\n        var _this = this;\n\n        // value - 要编辑的内容\n        value = value || '';\n        var type = !value ? 'new' : 'edit';\n        var textId = getRandom('texxt');\n        var btnId = getRandom('btn');\n\n        var panel = new Panel(this, {\n            width: 500,\n            // 一个 Panel 包含多个 tab\n            tabs: [{\n                // 标题\n                title: '插入代码',\n                // 模板\n                tpl: '<div>\\n                        <textarea id=\"' + textId + '\" style=\"height:145px;;\">' + value + '</textarea>\\n                        <div class=\"w-e-button-container\">\\n                            <button id=\"' + btnId + '\" class=\"right\">\\u63D2\\u5165</button>\\n                        </div>\\n                    <div>',\n                // 事件绑定\n                events: [\n                // 插入代码\n                {\n                    selector: '#' + btnId,\n                    type: 'click',\n                    fn: function fn() {\n                        var $text = $('#' + textId);\n                        var text = $text.val() || $text.html();\n                        text = replaceHtmlSymbol(text);\n                        if (type === 'new') {\n                            // 新插入\n                            _this._insertCode(text);\n                        } else {\n                            // 编辑更新\n                            _this._updateCode(text);\n                        }\n\n                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n                        return true;\n                    }\n                }]\n            } // first tab end\n            ] // tabs end\n        }); // new Panel end\n\n        // 显示 panel\n        panel.show();\n\n        // 记录属性\n        this.panel = panel;\n    },\n\n    // 插入代码\n    _insertCode: function _insertCode(value) {\n        var editor = this.editor;\n        editor.cmd.do('insertHTML', '<pre><code>' + value + '</code></pre><p><br></p>');\n    },\n\n    // 更新代码\n    _updateCode: function _updateCode(value) {\n        var editor = this.editor;\n        var $selectionELem = editor.selection.getSelectionContainerElem();\n        if (!$selectionELem) {\n            return;\n        }\n        $selectionELem.html(value);\n        editor.selection.restoreSelection();\n    },\n\n    // 试图改变 active 状态\n    tryChangeActive: function tryChangeActive(e) {\n        var editor = this.editor;\n        var $elem = this.$elem;\n        var $selectionELem = editor.selection.getSelectionContainerElem();\n        if (!$selectionELem) {\n            return;\n        }\n        var $parentElem = $selectionELem.parent();\n        if ($selectionELem.getNodeName() === 'CODE' && $parentElem.getNodeName() === 'PRE') {\n            this._active = true;\n            $elem.addClass('w-e-active');\n        } else {\n            this._active = false;\n            $elem.removeClass('w-e-active');\n        }\n    }\n};\n\n/*\n    menu - emoticon\n*/\n// 构造函数\nfunction Emoticon(editor) {\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\">\\n            <i class=\"w-e-icon-happy\"><i/>\\n        </div>');\n    this.type = 'panel';\n\n    // 当前是否 active 状态\n    this._active = false;\n}\n\n// 原型\nEmoticon.prototype = {\n    constructor: Emoticon,\n\n    onClick: function onClick() {\n        this._createPanel();\n    },\n\n    _createPanel: function _createPanel() {\n        var _this = this;\n\n        var editor = this.editor;\n        var config = editor.config;\n        // 获取表情配置\n        var emotions = config.emotions || [];\n\n        // 创建表情 dropPanel 的配置\n        var tabConfig = [];\n        emotions.forEach(function (emotData) {\n            var emotType = emotData.type;\n            var content = emotData.content || [];\n\n            // 这一组表情最终拼接出来的 html\n            var faceHtml = '';\n\n            // emoji 表情\n            if (emotType === 'emoji') {\n                content.forEach(function (item) {\n                    if (item) {\n                        faceHtml += '<span class=\"w-e-item\">' + item + '</span>';\n                    }\n                });\n            }\n            // 图片表情\n            if (emotType === 'image') {\n                content.forEach(function (item) {\n                    var src = item.src;\n                    var alt = item.alt;\n                    if (src) {\n                        // 加一个 data-w-e 属性,点击图片的时候不再提示编辑图片\n                        faceHtml += '<span class=\"w-e-item\"><img src=\"' + src + '\" alt=\"' + alt + '\" data-w-e=\"1\"/></span>';\n                    }\n                });\n            }\n\n            tabConfig.push({\n                title: emotData.title,\n                tpl: '<div class=\"w-e-emoticon-container\">' + faceHtml + '</div>',\n                events: [{\n                    selector: 'span.w-e-item',\n                    type: 'click',\n                    fn: function fn(e) {\n                        var target = e.target;\n                        var $target = $(target);\n                        var nodeName = $target.getNodeName();\n\n                        var insertHtml = void 0;\n                        if (nodeName === 'IMG') {\n                            // 插入图片\n                            insertHtml = $target.parent().html();\n                        } else {\n                            // 插入 emoji\n                            insertHtml = '<span>' + $target.html() + '</span>';\n                        }\n\n                        _this._insert(insertHtml);\n                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n                        return true;\n                    }\n                }]\n            });\n        });\n\n        var panel = new Panel(this, {\n            width: 300,\n            height: 200,\n            // 一个 Panel 包含多个 tab\n            tabs: tabConfig\n        });\n\n        // 显示 panel\n        panel.show();\n\n        // 记录属性\n        this.panel = panel;\n    },\n\n    // 插入表情\n    _insert: function _insert(emotHtml) {\n        var editor = this.editor;\n        editor.cmd.do('insertHTML', emotHtml);\n    }\n};\n\n/*\n    menu - table\n*/\n// 构造函数\nfunction Table(editor) {\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\"><i class=\"w-e-icon-table2\"><i/></div>');\n    this.type = 'panel';\n\n    // 当前是否 active 状态\n    this._active = false;\n}\n\n// 原型\nTable.prototype = {\n    constructor: Table,\n\n    onClick: function onClick() {\n        if (this._active) {\n            // 编辑现有表格\n            this._createEditPanel();\n        } else {\n            // 插入新表格\n            this._createInsertPanel();\n        }\n    },\n\n    // 创建插入新表格的 panel\n    _createInsertPanel: function _createInsertPanel() {\n        var _this = this;\n\n        // 用到的 id\n        var btnInsertId = getRandom('btn');\n        var textRowNum = getRandom('row');\n        var textColNum = getRandom('col');\n\n        var panel = new Panel(this, {\n            width: 250,\n            // panel 包含多个 tab\n            tabs: [{\n                // 标题\n                title: '插入表格',\n                // 模板\n                tpl: '<div>\\n                        <p style=\"text-align:left; padding:5px 0;\">\\n                            \\u521B\\u5EFA\\n                            <input id=\"' + textRowNum + '\" type=\"text\" value=\"5\" style=\"width:40px;text-align:center;\"/>\\n                            \\u884C\\n                            <input id=\"' + textColNum + '\" type=\"text\" value=\"5\" style=\"width:40px;text-align:center;\"/>\\n                            \\u5217\\u7684\\u8868\\u683C\\n                        </p>\\n                        <div class=\"w-e-button-container\">\\n                            <button id=\"' + btnInsertId + '\" class=\"right\">\\u63D2\\u5165</button>\\n                        </div>\\n                    </div>',\n                // 事件绑定\n                events: [{\n                    // 点击按钮,插入表格\n                    selector: '#' + btnInsertId,\n                    type: 'click',\n                    fn: function fn() {\n                        var rowNum = parseInt($('#' + textRowNum).val());\n                        var colNum = parseInt($('#' + textColNum).val());\n\n                        if (rowNum && colNum && rowNum > 0 && colNum > 0) {\n                            // form 数据有效\n                            _this._insert(rowNum, colNum);\n                        }\n\n                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n                        return true;\n                    }\n                }]\n            } // first tab end\n            ] // tabs end\n        }); // panel end\n\n        // 展示 panel\n        panel.show();\n\n        // 记录属性\n        this.panel = panel;\n    },\n\n    // 插入表格\n    _insert: function _insert(rowNum, colNum) {\n        // 拼接 table 模板\n        var r = void 0,\n            c = void 0;\n        var html = '<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\">';\n        for (r = 0; r < rowNum; r++) {\n            html += '<tr>';\n            if (r === 0) {\n                for (c = 0; c < colNum; c++) {\n                    html += '<th>&nbsp;</th>';\n                }\n            } else {\n                for (c = 0; c < colNum; c++) {\n                    html += '<td>&nbsp;</td>';\n                }\n            }\n            html += '</tr>';\n        }\n        html += '</table><p><br></p>';\n\n        // 执行命令\n        var editor = this.editor;\n        editor.cmd.do('insertHTML', html);\n\n        // 防止 firefox 下出现 resize 的控制点\n        editor.cmd.do('enableObjectResizing', false);\n        editor.cmd.do('enableInlineTableEditing', false);\n    },\n\n    // 创建编辑表格的 panel\n    _createEditPanel: function _createEditPanel() {\n        var _this2 = this;\n\n        // 可用的 id\n        var addRowBtnId = getRandom('add-row');\n        var addColBtnId = getRandom('add-col');\n        var delRowBtnId = getRandom('del-row');\n        var delColBtnId = getRandom('del-col');\n        var delTableBtnId = getRandom('del-table');\n\n        // 创建 panel 对象\n        var panel = new Panel(this, {\n            width: 320,\n            // panel 包含多个 tab\n            tabs: [{\n                // 标题\n                title: '编辑表格',\n                // 模板\n                tpl: '<div>\\n                        <div class=\"w-e-button-container\" style=\"border-bottom:1px solid #f1f1f1;padding-bottom:5px;margin-bottom:5px;\">\\n                            <button id=\"' + addRowBtnId + '\" class=\"left\">\\u589E\\u52A0\\u884C</button>\\n                            <button id=\"' + delRowBtnId + '\" class=\"red left\">\\u5220\\u9664\\u884C</button>\\n                            <button id=\"' + addColBtnId + '\" class=\"left\">\\u589E\\u52A0\\u5217</button>\\n                            <button id=\"' + delColBtnId + '\" class=\"red left\">\\u5220\\u9664\\u5217</button>\\n                        </div>\\n                        <div class=\"w-e-button-container\">\\n                            <button id=\"' + delTableBtnId + '\" class=\"gray left\">\\u5220\\u9664\\u8868\\u683C</button>\\n                        </dv>\\n                    </div>',\n                // 事件绑定\n                events: [{\n                    // 增加行\n                    selector: '#' + addRowBtnId,\n                    type: 'click',\n                    fn: function fn() {\n                        _this2._addRow();\n                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n                        return true;\n                    }\n                }, {\n                    // 增加列\n                    selector: '#' + addColBtnId,\n                    type: 'click',\n                    fn: function fn() {\n                        _this2._addCol();\n                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n                        return true;\n                    }\n                }, {\n                    // 删除行\n                    selector: '#' + delRowBtnId,\n                    type: 'click',\n                    fn: function fn() {\n                        _this2._delRow();\n                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n                        return true;\n                    }\n                }, {\n                    // 删除列\n                    selector: '#' + delColBtnId,\n                    type: 'click',\n                    fn: function fn() {\n                        _this2._delCol();\n                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n                        return true;\n                    }\n                }, {\n                    // 删除表格\n                    selector: '#' + delTableBtnId,\n                    type: 'click',\n                    fn: function fn() {\n                        _this2._delTable();\n                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n                        return true;\n                    }\n                }]\n            }]\n        });\n        // 显示 panel\n        panel.show();\n    },\n\n    // 获取选中的单元格的位置信息\n    _getLocationData: function _getLocationData() {\n        var result = {};\n        var editor = this.editor;\n        var $selectionELem = editor.selection.getSelectionContainerElem();\n        if (!$selectionELem) {\n            return;\n        }\n        var nodeName = $selectionELem.getNodeName();\n        if (nodeName !== 'TD' && nodeName !== 'TH') {\n            return;\n        }\n\n        // 获取 td index\n        var $tr = $selectionELem.parent();\n        var $tds = $tr.children();\n        var tdLength = $tds.length;\n        $tds.forEach(function (td, index) {\n            if (td === $selectionELem[0]) {\n                // 记录并跳出循环\n                result.td = {\n                    index: index,\n                    elem: td,\n                    length: tdLength\n                };\n                return false;\n            }\n        });\n\n        // 获取 tr index\n        var $tbody = $tr.parent();\n        var $trs = $tbody.children();\n        var trLength = $trs.length;\n        $trs.forEach(function (tr, index) {\n            if (tr === $tr[0]) {\n                // 记录并跳出循环\n                result.tr = {\n                    index: index,\n                    elem: tr,\n                    length: trLength\n                };\n                return false;\n            }\n        });\n\n        // 返回结果\n        return result;\n    },\n\n    // 增加行\n    _addRow: function _addRow() {\n        // 获取当前单元格的位置信息\n        var locationData = this._getLocationData();\n        if (!locationData) {\n            return;\n        }\n        var trData = locationData.tr;\n        var $currentTr = $(trData.elem);\n        var tdData = locationData.td;\n        var tdLength = tdData.length;\n\n        // 拼接即将插入的字符串\n        var newTr = document.createElement('tr');\n        var tpl = '',\n            i = void 0;\n        for (i = 0; i < tdLength; i++) {\n            tpl += '<td>&nbsp;</td>';\n        }\n        newTr.innerHTML = tpl;\n        // 插入\n        $(newTr).insertAfter($currentTr);\n    },\n\n    // 增加列\n    _addCol: function _addCol() {\n        // 获取当前单元格的位置信息\n        var locationData = this._getLocationData();\n        if (!locationData) {\n            return;\n        }\n        var trData = locationData.tr;\n        var tdData = locationData.td;\n        var tdIndex = tdData.index;\n        var $currentTr = $(trData.elem);\n        var $trParent = $currentTr.parent();\n        var $trs = $trParent.children();\n\n        // 遍历所有行\n        $trs.forEach(function (tr) {\n            var $tr = $(tr);\n            var $tds = $tr.children();\n            var $currentTd = $tds.get(tdIndex);\n            var name = $currentTd.getNodeName().toLowerCase();\n\n            // new 一个 td,并插入\n            var newTd = document.createElement(name);\n            $(newTd).insertAfter($currentTd);\n        });\n    },\n\n    // 删除行\n    _delRow: function _delRow() {\n        // 获取当前单元格的位置信息\n        var locationData = this._getLocationData();\n        if (!locationData) {\n            return;\n        }\n        var trData = locationData.tr;\n        var $currentTr = $(trData.elem);\n        $currentTr.remove();\n    },\n\n    // 删除列\n    _delCol: function _delCol() {\n        // 获取当前单元格的位置信息\n        var locationData = this._getLocationData();\n        if (!locationData) {\n            return;\n        }\n        var trData = locationData.tr;\n        var tdData = locationData.td;\n        var tdIndex = tdData.index;\n        var $currentTr = $(trData.elem);\n        var $trParent = $currentTr.parent();\n        var $trs = $trParent.children();\n\n        // 遍历所有行\n        $trs.forEach(function (tr) {\n            var $tr = $(tr);\n            var $tds = $tr.children();\n            var $currentTd = $tds.get(tdIndex);\n            // 删除\n            $currentTd.remove();\n        });\n    },\n\n    // 删除表格\n    _delTable: function _delTable() {\n        var editor = this.editor;\n        var $selectionELem = editor.selection.getSelectionContainerElem();\n        if (!$selectionELem) {\n            return;\n        }\n        var $table = $selectionELem.parentUntil('table');\n        if (!$table) {\n            return;\n        }\n        $table.remove();\n    },\n\n    // 试图改变 active 状态\n    tryChangeActive: function tryChangeActive(e) {\n        var editor = this.editor;\n        var $elem = this.$elem;\n        var $selectionELem = editor.selection.getSelectionContainerElem();\n        if (!$selectionELem) {\n            return;\n        }\n        var nodeName = $selectionELem.getNodeName();\n        if (nodeName === 'TD' || nodeName === 'TH') {\n            this._active = true;\n            $elem.addClass('w-e-active');\n        } else {\n            this._active = false;\n            $elem.removeClass('w-e-active');\n        }\n    }\n};\n\n/*\n    menu - video\n*/\n// 构造函数\nfunction Video(editor) {\n    this.editor = editor;\n    this.$elem = $('<div class=\"w-e-menu\"><i class=\"w-e-icon-play\"><i/></div>');\n    this.type = 'panel';\n\n    // 当前是否 active 状态\n    this._active = false;\n}\n\n// 原型\nVideo.prototype = {\n    constructor: Video,\n\n    onClick: function onClick() {\n        this._createPanel();\n    },\n\n    _createPanel: function _createPanel() {\n        var _this = this;\n\n        // 创建 id\n        var textValId = getRandom('text-val');\n        var btnId = getRandom('btn');\n\n        // 创建 panel\n        var panel = new Panel(this, {\n            width: 350,\n            // 一个 panel 多个 tab\n            tabs: [{\n                // 标题\n                title: '插入视频',\n                // 模板\n                tpl: '<div>\\n                        <input id=\"' + textValId + '\" type=\"text\" class=\"block\" placeholder=\"\\u683C\\u5F0F\\u5982\\uFF1A<iframe src=... ></iframe>\"/>\\n                        <div class=\"w-e-button-container\">\\n                            <button id=\"' + btnId + '\" class=\"right\">\\u63D2\\u5165</button>\\n                        </div>\\n                    </div>',\n                // 事件绑定\n                events: [{\n                    selector: '#' + btnId,\n                    type: 'click',\n                    fn: function fn() {\n                        var $text = $('#' + textValId);\n                        var val = $text.val().trim();\n\n                        // 测试用视频地址\n                        // <iframe height=498 width=510 src='http://player.youku.com/embed/XMjcwMzc3MzM3Mg==' frameborder=0 'allowfullscreen'></iframe>\n\n                        if (val) {\n                            // 插入视频\n                            _this._insert(val);\n                        }\n\n                        // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n                        return true;\n                    }\n                }]\n            } // first tab end\n            ] // tabs end\n        }); // panel end\n\n        // 显示 panel\n        panel.show();\n\n        // 记录属性\n        this.panel = panel;\n    },\n\n    // 插入视频\n    _insert: function _insert(val) {\n        var editor = this.editor;\n        editor.cmd.do('insertHTML', val + '<p><br></p>');\n    }\n};\n\n/*\n    menu - img\n*/\n// 构造函数\nfunction Image(editor) {\n    this.editor = editor;\n    var imgMenuId = getRandom('w-e-img');\n    this.$elem = $('<div class=\"w-e-menu\" id=\"' + imgMenuId + '\"><i class=\"w-e-icon-image\"><i/></div>');\n    editor.imgMenuId = imgMenuId;\n    this.type = 'panel';\n\n    // 当前是否 active 状态\n    this._active = false;\n}\n\n// 原型\nImage.prototype = {\n    constructor: Image,\n\n    onClick: function onClick() {\n        var editor = this.editor;\n        var config = editor.config;\n        if (config.qiniu) {\n            return;\n        }\n        if (this._active) {\n            this._createEditPanel();\n        } else {\n            this._createInsertPanel();\n        }\n    },\n\n    _createEditPanel: function _createEditPanel() {\n        var editor = this.editor;\n\n        // id\n        var width30 = getRandom('width-30');\n        var width50 = getRandom('width-50');\n        var width100 = getRandom('width-100');\n        var delBtn = getRandom('del-btn');\n\n        // tab 配置\n        var tabsConfig = [{\n            title: '编辑图片',\n            tpl: '<div>\\n                    <div class=\"w-e-button-container\" style=\"border-bottom:1px solid #f1f1f1;padding-bottom:5px;margin-bottom:5px;\">\\n                        <span style=\"float:left;font-size:14px;margin:4px 5px 0 5px;color:#333;\">\\u6700\\u5927\\u5BBD\\u5EA6\\uFF1A</span>\\n                        <button id=\"' + width30 + '\" class=\"left\">30%</button>\\n                        <button id=\"' + width50 + '\" class=\"left\">50%</button>\\n                        <button id=\"' + width100 + '\" class=\"left\">100%</button>\\n                    </div>\\n                    <div class=\"w-e-button-container\">\\n                        <button id=\"' + delBtn + '\" class=\"gray left\">\\u5220\\u9664\\u56FE\\u7247</button>\\n                    </dv>\\n                </div>',\n            events: [{\n                selector: '#' + width30,\n                type: 'click',\n                fn: function fn() {\n                    var $img = editor._selectedImg;\n                    if ($img) {\n                        $img.css('max-width', '30%');\n                    }\n                    // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n                    return true;\n                }\n            }, {\n                selector: '#' + width50,\n                type: 'click',\n                fn: function fn() {\n                    var $img = editor._selectedImg;\n                    if ($img) {\n                        $img.css('max-width', '50%');\n                    }\n                    // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n                    return true;\n                }\n            }, {\n                selector: '#' + width100,\n                type: 'click',\n                fn: function fn() {\n                    var $img = editor._selectedImg;\n                    if ($img) {\n                        $img.css('max-width', '100%');\n                    }\n                    // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n                    return true;\n                }\n            }, {\n                selector: '#' + delBtn,\n                type: 'click',\n                fn: function fn() {\n                    var $img = editor._selectedImg;\n                    if ($img) {\n                        $img.remove();\n                    }\n                    // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭\n                    return true;\n                }\n            }]\n        }];\n\n        // 创建 panel 并显示\n        var panel = new Panel(this, {\n            width: 300,\n            tabs: tabsConfig\n        });\n        panel.show();\n\n        // 记录属性\n        this.panel = panel;\n    },\n\n    _createInsertPanel: function _createInsertPanel() {\n        var editor = this.editor;\n        var uploadImg = editor.uploadImg;\n        var config = editor.config;\n\n        // id\n        var upTriggerId = getRandom('up-trigger');\n        var upFileId = getRandom('up-file');\n        var linkUrlId = getRandom('link-url');\n        var linkBtnId = getRandom('link-btn');\n\n        // tabs 的配置\n        var tabsConfig = [{\n            title: '上传图片',\n            tpl: '<div class=\"w-e-up-img-container\">\\n                    <div id=\"' + upTriggerId + '\" class=\"w-e-up-btn\">\\n                        <i class=\"w-e-icon-upload2\"></i>\\n                    </div>\\n                    <div style=\"display:none;\">\\n                        <input id=\"' + upFileId + '\" type=\"file\" multiple=\"multiple\" accept=\"image/jpg,image/jpeg,image/png,image/gif,image/bmp\"/>\\n                    </div>\\n                </div>',\n            events: [{\n                // 触发选择图片\n                selector: '#' + upTriggerId,\n                type: 'click',\n                fn: function fn() {\n                    var $file = $('#' + upFileId);\n                    var fileElem = $file[0];\n                    if (fileElem) {\n                        fileElem.click();\n                    } else {\n                        // 返回 true 可关闭 panel\n                        return true;\n                    }\n                }\n            }, {\n                // 选择图片完毕\n                selector: '#' + upFileId,\n                type: 'change',\n                fn: function fn() {\n                    var $file = $('#' + upFileId);\n                    var fileElem = $file[0];\n                    if (!fileElem) {\n                        // 返回 true 可关闭 panel\n                        return true;\n                    }\n\n                    // 获取选中的 file 对象列表\n                    var fileList = fileElem.files;\n                    if (fileList.length) {\n                        uploadImg.uploadImg(fileList);\n                    }\n\n                    // 返回 true 可关闭 panel\n                    return true;\n                }\n            }]\n        }, // first tab end\n        {\n            title: '网络图片',\n            tpl: '<div>\\n                    <input id=\"' + linkUrlId + '\" type=\"text\" class=\"block\" placeholder=\"\\u56FE\\u7247\\u94FE\\u63A5\"/></td>\\n                    <div class=\"w-e-button-container\">\\n                        <button id=\"' + linkBtnId + '\" class=\"right\">\\u63D2\\u5165</button>\\n                    </div>\\n                </div>',\n            events: [{\n                selector: '#' + linkBtnId,\n                type: 'click',\n                fn: function fn() {\n                    var $linkUrl = $('#' + linkUrlId);\n                    var url = $linkUrl.val().trim();\n\n                    if (url) {\n                        uploadImg.insertLinkImg(url);\n                    }\n\n                    // 返回 true 表示函数执行结束之后关闭 panel\n                    return true;\n                }\n            }]\n        } // second tab end\n        ]; // tabs end\n\n        // 判断 tabs 的显示\n        var tabsConfigResult = [];\n        if ((config.uploadImgShowBase64 || config.uploadImgServer || config.customUploadImg) && window.FileReader) {\n            // 显示“上传图片”\n            tabsConfigResult.push(tabsConfig[0]);\n        }\n        if (config.showLinkImg) {\n            // 显示“网络图片”\n            tabsConfigResult.push(tabsConfig[1]);\n        }\n\n        // 创建 panel 并显示\n        var panel = new Panel(this, {\n            width: 300,\n            tabs: tabsConfigResult\n        });\n        panel.show();\n\n        // 记录属性\n        this.panel = panel;\n    },\n\n    // 试图改变 active 状态\n    tryChangeActive: function tryChangeActive(e) {\n        var editor = this.editor;\n        var $elem = this.$elem;\n        if (editor._selectedImg) {\n            this._active = true;\n            $elem.addClass('w-e-active');\n        } else {\n            this._active = false;\n            $elem.removeClass('w-e-active');\n        }\n    }\n};\n\n/*\n    所有菜单的汇总\n*/\n\n// 存储菜单的构造函数\nvar MenuConstructors = {};\n\nMenuConstructors.bold = Bold;\n\nMenuConstructors.head = Head;\n\nMenuConstructors.link = Link;\n\nMenuConstructors.italic = Italic;\n\nMenuConstructors.redo = Redo;\n\nMenuConstructors.strikeThrough = StrikeThrough;\n\nMenuConstructors.underline = Underline;\n\nMenuConstructors.undo = Undo;\n\nMenuConstructors.list = List;\n\nMenuConstructors.justify = Justify;\n\nMenuConstructors.foreColor = ForeColor;\n\nMenuConstructors.backColor = BackColor;\n\nMenuConstructors.quote = Quote;\n\nMenuConstructors.code = Code;\n\nMenuConstructors.emoticon = Emoticon;\n\nMenuConstructors.table = Table;\n\nMenuConstructors.video = Video;\n\nMenuConstructors.image = Image;\n\n/*\n    菜单集合\n*/\n// 构造函数\nfunction Menus(editor) {\n    this.editor = editor;\n    this.menus = {};\n}\n\n// 修改原型\nMenus.prototype = {\n    constructor: Menus,\n\n    // 初始化菜单\n    init: function init() {\n        var _this = this;\n\n        var editor = this.editor;\n        var config = editor.config || {};\n        var configMenus = config.menus || []; // 获取配置中的菜单\n\n        // 根据配置信息,创建菜单\n        configMenus.forEach(function (menuKey) {\n            var MenuConstructor = MenuConstructors[menuKey];\n            if (MenuConstructor && typeof MenuConstructor === 'function') {\n                // 创建单个菜单\n                _this.menus[menuKey] = new MenuConstructor(editor);\n            }\n        });\n\n        // 添加到菜单栏\n        this._addToToolbar();\n\n        // 绑定事件\n        this._bindEvent();\n    },\n\n    // 添加到菜单栏\n    _addToToolbar: function _addToToolbar() {\n        var editor = this.editor;\n        var $toolbarElem = editor.$toolbarElem;\n        var menus = this.menus;\n        var config = editor.config;\n        // config.zIndex 是配置的编辑区域的 z-index,菜单的 z-index 得在其基础上 +1\n        var zIndex = config.zIndex + 1;\n        objForEach(menus, function (key, menu) {\n            var $elem = menu.$elem;\n            if ($elem) {\n                // 设置 z-index\n                $elem.css('z-index', zIndex);\n                $toolbarElem.append($elem);\n            }\n        });\n    },\n\n    // 绑定菜单 click mouseenter 事件\n    _bindEvent: function _bindEvent() {\n        var menus = this.menus;\n        var editor = this.editor;\n        objForEach(menus, function (key, menu) {\n            var type = menu.type;\n            if (!type) {\n                return;\n            }\n            var $elem = menu.$elem;\n            var droplist = menu.droplist;\n            var panel = menu.panel;\n\n            // 点击类型,例如 bold\n            if (type === 'click' && menu.onClick) {\n                $elem.on('click', function (e) {\n                    if (editor.selection.getRange() == null) {\n                        return;\n                    }\n                    menu.onClick(e);\n                });\n            }\n\n            // 下拉框,例如 head\n            if (type === 'droplist' && droplist) {\n                $elem.on('mouseenter', function (e) {\n                    if (editor.selection.getRange() == null) {\n                        return;\n                    }\n                    // 显示\n                    droplist.showTimeoutId = setTimeout(function () {\n                        droplist.show();\n                    }, 200);\n                }).on('mouseleave', function (e) {\n                    // 隐藏\n                    droplist.hideTimeoutId = setTimeout(function () {\n                        droplist.hide();\n                    }, 0);\n                });\n            }\n\n            // 弹框类型,例如 link\n            if (type === 'panel' && menu.onClick) {\n                $elem.on('click', function (e) {\n                    e.stopPropagation();\n                    if (editor.selection.getRange() == null) {\n                        return;\n                    }\n                    // 在自定义事件中显示 panel\n                    menu.onClick(e);\n                });\n            }\n        });\n    },\n\n    // 尝试修改菜单状态\n    changeActive: function changeActive() {\n        var menus = this.menus;\n        objForEach(menus, function (key, menu) {\n            if (menu.tryChangeActive) {\n                setTimeout(function () {\n                    menu.tryChangeActive();\n                }, 100);\n            }\n        });\n    }\n};\n\n/*\n    粘贴信息的处理\n*/\n\n// 获取粘贴的纯文本\nfunction getPasteText(e) {\n    var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData;\n    var pasteText = void 0;\n    if (clipboardData == null) {\n        pasteText = window.clipboardData && window.clipboardData.getData('text');\n    } else {\n        pasteText = clipboardData.getData('text/plain');\n    }\n\n    return replaceHtmlSymbol(pasteText);\n}\n\n// 获取粘贴的html\nfunction getPasteHtml(e, filterStyle) {\n    var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData;\n    var pasteText = void 0,\n        pasteHtml = void 0;\n    if (clipboardData == null) {\n        pasteText = window.clipboardData && window.clipboardData.getData('text');\n    } else {\n        pasteText = clipboardData.getData('text/plain');\n        pasteHtml = clipboardData.getData('text/html');\n    }\n    if (!pasteHtml && pasteText) {\n        pasteHtml = '<p>' + replaceHtmlSymbol(pasteText) + '</p>';\n    }\n    if (!pasteHtml) {\n        return;\n    }\n\n    // 过滤word中状态过来的无用字符\n    var docSplitHtml = pasteHtml.split('</html>');\n    if (docSplitHtml.length === 2) {\n        pasteHtml = docSplitHtml[0];\n    }\n\n    // 过滤无用标签\n    pasteHtml = pasteHtml.replace(/<(meta|script|link).+?>/igm, '');\n    // 去掉注释\n    pasteHtml = pasteHtml.replace(/<!--.*?-->/mg, '');\n    // 过滤 data-xxx 属性\n    pasteHtml = pasteHtml.replace(/\\s?data-.+?=('|\").+?('|\")/igm, '');\n\n    if (filterStyle) {\n        // 过滤样式\n        pasteHtml = pasteHtml.replace(/\\s?(class|style)=('|\").+?('|\")/igm, '');\n    } else {\n        // 保留样式\n        pasteHtml = pasteHtml.replace(/\\s?class=('|\").+?('|\")/igm, '');\n    }\n\n    return pasteHtml;\n}\n\n// 获取粘贴的图片文件\nfunction getPasteImgs(e) {\n    var result = [];\n    var txt = getPasteText(e);\n    if (txt) {\n        // 有文字,就忽略图片\n        return result;\n    }\n\n    var clipboardData = e.clipboardData || e.originalEvent && e.originalEvent.clipboardData || {};\n    var items = clipboardData.items;\n    if (!items) {\n        return result;\n    }\n\n    objForEach(items, function (key, value) {\n        var type = value.type;\n        if (/image/i.test(type)) {\n            result.push(value.getAsFile());\n        }\n    });\n\n    return result;\n}\n\n/*\n    编辑区域\n*/\n\n// 获取一个 elem.childNodes 的 JSON 数据\nfunction getChildrenJSON($elem) {\n    var result = [];\n    var $children = $elem.childNodes() || []; // 注意 childNodes() 可以获取文本节点\n    $children.forEach(function (curElem) {\n        var elemResult = void 0;\n        var nodeType = curElem.nodeType;\n\n        // 文本节点\n        if (nodeType === 3) {\n            elemResult = curElem.textContent;\n        }\n\n        // 普通 DOM 节点\n        if (nodeType === 1) {\n            elemResult = {};\n\n            // tag\n            elemResult.tag = curElem.nodeName.toLowerCase();\n            // attr\n            var attrData = [];\n            var attrList = curElem.attributes || {};\n            var attrListLength = attrList.length || 0;\n            for (var i = 0; i < attrListLength; i++) {\n                var attr = attrList[i];\n                attrData.push({\n                    name: attr.name,\n                    value: attr.value\n                });\n            }\n            elemResult.attrs = attrData;\n            // children(递归)\n            elemResult.children = getChildrenJSON($(curElem));\n        }\n\n        result.push(elemResult);\n    });\n    return result;\n}\n\n// 构造函数\nfunction Text(editor) {\n    this.editor = editor;\n}\n\n// 修改原型\nText.prototype = {\n    constructor: Text,\n\n    // 初始化\n    init: function init() {\n        // 绑定事件\n        this._bindEvent();\n    },\n\n    // 清空内容\n    clear: function clear() {\n        this.html('<p><br></p>');\n    },\n\n    // 获取 设置 html\n    html: function html(val) {\n        var editor = this.editor;\n        var $textElem = editor.$textElem;\n        var html = void 0;\n        if (val == null) {\n            html = $textElem.html();\n            // 未选中任何内容的时候点击“加粗”或者“斜体”等按钮,就得需要一个空的占位符 &#8203 ,这里替换掉\n            html = html.replace(/\\u200b/gm, '');\n            return html;\n        } else {\n            $textElem.html(val);\n\n            // 初始化选取,将光标定位到内容尾部\n            editor.initSelection();\n        }\n    },\n\n    // 获取 JSON\n    getJSON: function getJSON() {\n        var editor = this.editor;\n        var $textElem = editor.$textElem;\n        return getChildrenJSON($textElem);\n    },\n\n    // 获取 设置 text\n    text: function text(val) {\n        var editor = this.editor;\n        var $textElem = editor.$textElem;\n        var text = void 0;\n        if (val == null) {\n            text = $textElem.text();\n            // 未选中任何内容的时候点击“加粗”或者“斜体”等按钮,就得需要一个空的占位符 &#8203 ,这里替换掉\n            text = text.replace(/\\u200b/gm, '');\n            return text;\n        } else {\n            $textElem.text('<p>' + val + '</p>');\n\n            // 初始化选取,将光标定位到内容尾部\n            editor.initSelection();\n        }\n    },\n\n    // 追加内容\n    append: function append(html) {\n        var editor = this.editor;\n        var $textElem = editor.$textElem;\n        $textElem.append($(html));\n\n        // 初始化选取,将光标定位到内容尾部\n        editor.initSelection();\n    },\n\n    // 绑定事件\n    _bindEvent: function _bindEvent() {\n        // 实时保存选取\n        this._saveRangeRealTime();\n\n        // 按回车建时的特殊处理\n        this._enterKeyHandle();\n\n        // 清空时保留 <p><br></p>\n        this._clearHandle();\n\n        // 粘贴事件(粘贴文字,粘贴图片)\n        this._pasteHandle();\n\n        // tab 特殊处理\n        this._tabHandle();\n\n        // img 点击\n        this._imgHandle();\n\n        // 拖拽事件\n        this._dragHandle();\n    },\n\n    // 实时保存选取\n    _saveRangeRealTime: function _saveRangeRealTime() {\n        var editor = this.editor;\n        var $textElem = editor.$textElem;\n\n        // 保存当前的选区\n        function saveRange(e) {\n            // 随时保存选区\n            editor.selection.saveRange();\n            // 更新按钮 ative 状态\n            editor.menus.changeActive();\n        }\n        // 按键后保存\n        $textElem.on('keyup', saveRange);\n        $textElem.on('mousedown', function (e) {\n            // mousedown 状态下,鼠标滑动到编辑区域外面,也需要保存选区\n            $textElem.on('mouseleave', saveRange);\n        });\n        $textElem.on('mouseup', function (e) {\n            saveRange();\n            // 在编辑器区域之内完成点击,取消鼠标滑动到编辑区外面的事件\n            $textElem.off('mouseleave', saveRange);\n        });\n    },\n\n    // 按回车键时的特殊处理\n    _enterKeyHandle: function _enterKeyHandle() {\n        var editor = this.editor;\n        var $textElem = editor.$textElem;\n\n        function insertEmptyP($selectionElem) {\n            var $p = $('<p><br></p>');\n            $p.insertBefore($selectionElem);\n            editor.selection.createRangeByElem($p, true);\n            editor.selection.restoreSelection();\n            $selectionElem.remove();\n        }\n\n        // 将回车之后生成的非 <p> 的顶级标签,改为 <p>\n        function pHandle(e) {\n            var $selectionElem = editor.selection.getSelectionContainerElem();\n            var $parentElem = $selectionElem.parent();\n\n            if ($parentElem.html() === '<code><br></code>') {\n                // 回车之前光标所在一个 <p><code>.....</code></p> ,忽然回车生成一个空的 <p><code><br></code></p>\n                // 而且继续回车跳不出去,因此只能特殊处理\n                insertEmptyP($selectionElem);\n                return;\n            }\n\n            if (!$parentElem.equal($textElem)) {\n                // 不是顶级标签\n                return;\n            }\n\n            var nodeName = $selectionElem.getNodeName();\n            if (nodeName === 'P') {\n                // 当前的标签是 P ,不用做处理\n                return;\n            }\n\n            if ($selectionElem.text()) {\n                // 有内容,不做处理\n                return;\n            }\n\n            // 插入 <p> ,并将选取定位到 <p>,删除当前标签\n            insertEmptyP($selectionElem);\n        }\n\n        $textElem.on('keyup', function (e) {\n            if (e.keyCode !== 13) {\n                // 不是回车键\n                return;\n            }\n            // 将回车之后生成的非 <p> 的顶级标签,改为 <p>\n            pHandle(e);\n        });\n\n        // <pre><code></code></pre> 回车时 特殊处理\n        function codeHandle(e) {\n            var $selectionElem = editor.selection.getSelectionContainerElem();\n            if (!$selectionElem) {\n                return;\n            }\n            var $parentElem = $selectionElem.parent();\n            var selectionNodeName = $selectionElem.getNodeName();\n            var parentNodeName = $parentElem.getNodeName();\n\n            if (selectionNodeName !== 'CODE' || parentNodeName !== 'PRE') {\n                // 不符合要求 忽略\n                return;\n            }\n\n            if (!editor.cmd.queryCommandSupported('insertHTML')) {\n                // 必须原生支持 insertHTML 命令\n                return;\n            }\n\n            // 处理:光标定位到代码末尾,联系点击两次回车,即跳出代码块\n            if (editor._willBreakCode === true) {\n                // 此时可以跳出代码块\n                // 插入 <p> ,并将选取定位到 <p>\n                var $p = $('<p><br></p>');\n                $p.insertAfter($parentElem);\n                editor.selection.createRangeByElem($p, true);\n                editor.selection.restoreSelection();\n\n                // 修改状态\n                editor._willBreakCode = false;\n\n                e.preventDefault();\n                return;\n            }\n\n            var _startOffset = editor.selection.getRange().startOffset;\n\n            // 处理:回车时,不能插入 <br> 而是插入 \\n ,因为是在 pre 标签里面\n            editor.cmd.do('insertHTML', '\\n');\n            editor.selection.saveRange();\n            if (editor.selection.getRange().startOffset === _startOffset) {\n                // 没起作用,再来一遍\n                editor.cmd.do('insertHTML', '\\n');\n            }\n\n            var codeLength = $selectionElem.html().length;\n            if (editor.selection.getRange().startOffset + 1 === codeLength) {\n                // 说明光标在代码最后的位置,执行了回车操作\n                // 记录下来,以便下次回车时候跳出 code\n                editor._willBreakCode = true;\n            }\n\n            // 阻止默认行为\n            e.preventDefault();\n        }\n\n        $textElem.on('keydown', function (e) {\n            if (e.keyCode !== 13) {\n                // 不是回车键\n                // 取消即将跳转代码块的记录\n                editor._willBreakCode = false;\n                return;\n            }\n            // <pre><code></code></pre> 回车时 特殊处理\n            codeHandle(e);\n        });\n    },\n\n    // 清空时保留 <p><br></p>\n    _clearHandle: function _clearHandle() {\n        var editor = this.editor;\n        var $textElem = editor.$textElem;\n\n        $textElem.on('keydown', function (e) {\n            if (e.keyCode !== 8) {\n                return;\n            }\n            var txtHtml = $textElem.html().toLowerCase().trim();\n            if (txtHtml === '<p><br></p>') {\n                // 最后剩下一个空行,就不再删除了\n                e.preventDefault();\n                return;\n            }\n        });\n\n        $textElem.on('keyup', function (e) {\n            if (e.keyCode !== 8) {\n                return;\n            }\n            var $p = void 0;\n            var txtHtml = $textElem.html().toLowerCase().trim();\n\n            // firefox 时用 txtHtml === '<br>' 判断,其他用 !txtHtml 判断\n            if (!txtHtml || txtHtml === '<br>') {\n                // 内容空了\n                $p = $('<p><br/></p>');\n                $textElem.html(''); // 一定要先清空,否则在 firefox 下有问题\n                $textElem.append($p);\n                editor.selection.createRangeByElem($p, false, true);\n                editor.selection.restoreSelection();\n            }\n        });\n    },\n\n    // 粘贴事件(粘贴文字 粘贴图片)\n    _pasteHandle: function _pasteHandle() {\n        var editor = this.editor;\n        var config = editor.config;\n        var pasteFilterStyle = config.pasteFilterStyle;\n        var pasteTextHandle = config.pasteTextHandle;\n        var $textElem = editor.$textElem;\n\n        // 粘贴图片、文本的事件,每次只能执行一个\n        // 判断该次粘贴事件是否可以执行\n        var pasteTime = 0;\n        function canDo() {\n            var now = Date.now();\n            var flag = false;\n            if (now - pasteTime >= 500) {\n                // 间隔大于 500 ms ,可以执行\n                flag = true;\n            }\n            pasteTime = now;\n            return flag;\n        }\n        function resetTime() {\n            pasteTime = 0;\n        }\n\n        // 粘贴文字\n        $textElem.on('paste', function (e) {\n            if (UA.isIE()) {\n                return;\n            } else {\n                // 阻止默认行为,使用 execCommand 的粘贴命令\n                e.preventDefault();\n            }\n\n            // 粘贴图片和文本,只能同时使用一个\n            if (!canDo()) {\n                return;\n            }\n\n            // 获取粘贴的文字\n            var pasteHtml = getPasteHtml(e, pasteFilterStyle);\n            var pasteText = getPasteText(e);\n            pasteText = pasteText.replace(/\\n/gm, '<br>');\n\n            var $selectionElem = editor.selection.getSelectionContainerElem();\n            if (!$selectionElem) {\n                return;\n            }\n            var nodeName = $selectionElem.getNodeName();\n\n            // code 中只能粘贴纯文本\n            if (nodeName === 'CODE' || nodeName === 'PRE') {\n                if (pasteTextHandle && isFunction(pasteTextHandle)) {\n                    // 用户自定义过滤处理粘贴内容\n                    pasteText = '' + (pasteTextHandle(pasteText) || '');\n                }\n                editor.cmd.do('insertHTML', '<p>' + pasteText + '</p>');\n                return;\n            }\n\n            // 先放开注释,有问题再追查 ————\n            // // 表格中忽略,可能会出现异常问题\n            // if (nodeName === 'TD' || nodeName === 'TH') {\n            //     return\n            // }\n\n            if (!pasteHtml) {\n                // 没有内容,可继续执行下面的图片粘贴\n                resetTime();\n                return;\n            }\n            try {\n                // firefox 中,获取的 pasteHtml 可能是没有 <ul> 包裹的 <li>\n                // 因此执行 insertHTML 会报错\n                if (pasteTextHandle && isFunction(pasteTextHandle)) {\n                    // 用户自定义过滤处理粘贴内容\n                    pasteHtml = '' + (pasteTextHandle(pasteHtml) || '');\n                }\n                editor.cmd.do('insertHTML', pasteHtml);\n            } catch (ex) {\n                // 此时使用 pasteText 来兼容一下\n                if (pasteTextHandle && isFunction(pasteTextHandle)) {\n                    // 用户自定义过滤处理粘贴内容\n                    pasteText = '' + (pasteTextHandle(pasteText) || '');\n                }\n                editor.cmd.do('insertHTML', '<p>' + pasteText + '</p>');\n            }\n        });\n\n        // 粘贴图片\n        $textElem.on('paste', function (e) {\n            if (UA.isIE()) {\n                return;\n            } else {\n                e.preventDefault();\n            }\n\n            // 粘贴图片和文本,只能同时使用一个\n            if (!canDo()) {\n                return;\n            }\n\n            // 获取粘贴的图片\n            var pasteFiles = getPasteImgs(e);\n            if (!pasteFiles || !pasteFiles.length) {\n                return;\n            }\n\n            // 获取当前的元素\n            var $selectionElem = editor.selection.getSelectionContainerElem();\n            if (!$selectionElem) {\n                return;\n            }\n            var nodeName = $selectionElem.getNodeName();\n\n            // code 中粘贴忽略\n            if (nodeName === 'CODE' || nodeName === 'PRE') {\n                return;\n            }\n\n            // 上传图片\n            var uploadImg = editor.uploadImg;\n            uploadImg.uploadImg(pasteFiles);\n        });\n    },\n\n    // tab 特殊处理\n    _tabHandle: function _tabHandle() {\n        var editor = this.editor;\n        var $textElem = editor.$textElem;\n\n        $textElem.on('keydown', function (e) {\n            if (e.keyCode !== 9) {\n                return;\n            }\n            if (!editor.cmd.queryCommandSupported('insertHTML')) {\n                // 必须原生支持 insertHTML 命令\n                return;\n            }\n            var $selectionElem = editor.selection.getSelectionContainerElem();\n            if (!$selectionElem) {\n                return;\n            }\n            var $parentElem = $selectionElem.parent();\n            var selectionNodeName = $selectionElem.getNodeName();\n            var parentNodeName = $parentElem.getNodeName();\n\n            if (selectionNodeName === 'CODE' && parentNodeName === 'PRE') {\n                // <pre><code> 里面\n                editor.cmd.do('insertHTML', '    ');\n            } else {\n                // 普通文字\n                editor.cmd.do('insertHTML', '&nbsp;&nbsp;&nbsp;&nbsp;');\n            }\n\n            e.preventDefault();\n        });\n    },\n\n    // img 点击\n    _imgHandle: function _imgHandle() {\n        var editor = this.editor;\n        var $textElem = editor.$textElem;\n\n        // 为图片增加 selected 样式\n        $textElem.on('click', 'img', function (e) {\n            var img = this;\n            var $img = $(img);\n\n            if ($img.attr('data-w-e') === '1') {\n                // 是表情图片,忽略\n                return;\n            }\n\n            // 记录当前点击过的图片\n            editor._selectedImg = $img;\n\n            // 修改选区并 restore ,防止用户此时点击退格键,会删除其他内容\n            editor.selection.createRangeByElem($img);\n            editor.selection.restoreSelection();\n        });\n\n        // 去掉图片的 selected 样式\n        $textElem.on('click  keyup', function (e) {\n            if (e.target.matches('img')) {\n                // 点击的是图片,忽略\n                return;\n            }\n            // 删除记录\n            editor._selectedImg = null;\n        });\n    },\n\n    // 拖拽事件\n    _dragHandle: function _dragHandle() {\n        var editor = this.editor;\n\n        // 禁用 document 拖拽事件\n        var $document = $(document);\n        $document.on('dragleave drop dragenter dragover', function (e) {\n            e.preventDefault();\n        });\n\n        // 添加编辑区域拖拽事件\n        var $textElem = editor.$textElem;\n        $textElem.on('drop', function (e) {\n            e.preventDefault();\n            var files = e.dataTransfer && e.dataTransfer.files;\n            if (!files || !files.length) {\n                return;\n            }\n\n            // 上传图片\n            var uploadImg = editor.uploadImg;\n            uploadImg.uploadImg(files);\n        });\n    }\n};\n\n/*\n    命令,封装 document.execCommand\n*/\n\n// 构造函数\nfunction Command(editor) {\n    this.editor = editor;\n}\n\n// 修改原型\nCommand.prototype = {\n    constructor: Command,\n\n    // 执行命令\n    do: function _do(name, value) {\n        var editor = this.editor;\n\n        // 使用 styleWithCSS\n        if (!editor._useStyleWithCSS) {\n            document.execCommand('styleWithCSS', null, true);\n            editor._useStyleWithCSS = true;\n        }\n\n        // 如果无选区,忽略\n        if (!editor.selection.getRange()) {\n            return;\n        }\n\n        // 恢复选取\n        editor.selection.restoreSelection();\n\n        // 执行\n        var _name = '_' + name;\n        if (this[_name]) {\n            // 有自定义事件\n            this[_name](value);\n        } else {\n            // 默认 command\n            this._execCommand(name, value);\n        }\n\n        // 修改菜单状态\n        editor.menus.changeActive();\n\n        // 最后,恢复选取保证光标在原来的位置闪烁\n        editor.selection.saveRange();\n        editor.selection.restoreSelection();\n\n        // 触发 onchange\n        editor.change && editor.change();\n    },\n\n    // 自定义 insertHTML 事件\n    _insertHTML: function _insertHTML(html) {\n        var editor = this.editor;\n        var range = editor.selection.getRange();\n\n        if (this.queryCommandSupported('insertHTML')) {\n            // W3C\n            this._execCommand('insertHTML', html);\n        } else if (range.insertNode) {\n            // IE\n            range.deleteContents();\n            range.insertNode($(html)[0]);\n        } else if (range.pasteHTML) {\n            // IE <= 10\n            range.pasteHTML(html);\n        }\n    },\n\n    // 插入 elem\n    _insertElem: function _insertElem($elem) {\n        var editor = this.editor;\n        var range = editor.selection.getRange();\n\n        if (range.insertNode) {\n            range.deleteContents();\n            range.insertNode($elem[0]);\n        }\n    },\n\n    // 封装 execCommand\n    _execCommand: function _execCommand(name, value) {\n        document.execCommand(name, false, value);\n    },\n\n    // 封装 document.queryCommandValue\n    queryCommandValue: function queryCommandValue(name) {\n        return document.queryCommandValue(name);\n    },\n\n    // 封装 document.queryCommandState\n    queryCommandState: function queryCommandState(name) {\n        return document.queryCommandState(name);\n    },\n\n    // 封装 document.queryCommandSupported\n    queryCommandSupported: function queryCommandSupported(name) {\n        return document.queryCommandSupported(name);\n    }\n};\n\n/*\n    selection range API\n*/\n\n// 构造函数\nfunction API(editor) {\n    this.editor = editor;\n    this._currentRange = null;\n}\n\n// 修改原型\nAPI.prototype = {\n    constructor: API,\n\n    // 获取 range 对象\n    getRange: function getRange() {\n        return this._currentRange;\n    },\n\n    // 保存选区\n    saveRange: function saveRange(_range) {\n        if (_range) {\n            // 保存已有选区\n            this._currentRange = _range;\n            return;\n        }\n\n        // 获取当前的选区\n        var selection = window.getSelection();\n        if (selection.rangeCount === 0) {\n            return;\n        }\n        var range = selection.getRangeAt(0);\n\n        // 判断选区内容是否在编辑内容之内\n        var $containerElem = this.getSelectionContainerElem(range);\n        if (!$containerElem) {\n            return;\n        }\n        var editor = this.editor;\n        var $textElem = editor.$textElem;\n        if ($textElem.isContain($containerElem)) {\n            // 是编辑内容之内的\n            this._currentRange = range;\n        }\n    },\n\n    // 折叠选区\n    collapseRange: function collapseRange(toStart) {\n        if (toStart == null) {\n            // 默认为 false\n            toStart = false;\n        }\n        var range = this._currentRange;\n        if (range) {\n            range.collapse(toStart);\n        }\n    },\n\n    // 选中区域的文字\n    getSelectionText: function getSelectionText() {\n        var range = this._currentRange;\n        if (range) {\n            return this._currentRange.toString();\n        } else {\n            return '';\n        }\n    },\n\n    // 选区的 $Elem\n    getSelectionContainerElem: function getSelectionContainerElem(range) {\n        range = range || this._currentRange;\n        var elem = void 0;\n        if (range) {\n            elem = range.commonAncestorContainer;\n            return $(elem.nodeType === 1 ? elem : elem.parentNode);\n        }\n    },\n    getSelectionStartElem: function getSelectionStartElem(range) {\n        range = range || this._currentRange;\n        var elem = void 0;\n        if (range) {\n            elem = range.startContainer;\n            return $(elem.nodeType === 1 ? elem : elem.parentNode);\n        }\n    },\n    getSelectionEndElem: function getSelectionEndElem(range) {\n        range = range || this._currentRange;\n        var elem = void 0;\n        if (range) {\n            elem = range.endContainer;\n            return $(elem.nodeType === 1 ? elem : elem.parentNode);\n        }\n    },\n\n    // 选区是否为空\n    isSelectionEmpty: function isSelectionEmpty() {\n        var range = this._currentRange;\n        if (range && range.startContainer) {\n            if (range.startContainer === range.endContainer) {\n                if (range.startOffset === range.endOffset) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    },\n\n    // 恢复选区\n    restoreSelection: function restoreSelection() {\n        var selection = window.getSelection();\n        selection.removeAllRanges();\n        selection.addRange(this._currentRange);\n    },\n\n    // 创建一个空白(即 &#8203 字符)选区\n    createEmptyRange: function createEmptyRange() {\n        var editor = this.editor;\n        var range = this.getRange();\n        var $elem = void 0;\n\n        if (!range) {\n            // 当前无 range\n            return;\n        }\n        if (!this.isSelectionEmpty()) {\n            // 当前选区必须没有内容才可以\n            return;\n        }\n\n        try {\n            // 目前只支持 webkit 内核\n            if (UA.isWebkit()) {\n                // 插入 &#8203\n                editor.cmd.do('insertHTML', '&#8203;');\n                // 修改 offset 位置\n                range.setEnd(range.endContainer, range.endOffset + 1);\n                // 存储\n                this.saveRange(range);\n            } else {\n                $elem = $('<strong>&#8203;</strong>');\n                editor.cmd.do('insertElem', $elem);\n                this.createRangeByElem($elem, true);\n            }\n        } catch (ex) {\n            // 部分情况下会报错,兼容一下\n        }\n    },\n\n    // 根据 $Elem 设置选区\n    createRangeByElem: function createRangeByElem($elem, toStart, isContent) {\n        // $elem - 经过封装的 elem\n        // toStart - true 开始位置,false 结束位置\n        // isContent - 是否选中Elem的内容\n        if (!$elem.length) {\n            return;\n        }\n\n        var elem = $elem[0];\n        var range = document.createRange();\n\n        if (isContent) {\n            range.selectNodeContents(elem);\n        } else {\n            range.selectNode(elem);\n        }\n\n        if (typeof toStart === 'boolean') {\n            range.collapse(toStart);\n        }\n\n        // 存储 range\n        this.saveRange(range);\n    }\n};\n\n/*\n    上传进度条\n*/\n\nfunction Progress(editor) {\n    this.editor = editor;\n    this._time = 0;\n    this._isShow = false;\n    this._isRender = false;\n    this._timeoutId = 0;\n    this.$textContainer = editor.$textContainerElem;\n    this.$bar = $('<div class=\"w-e-progress\"></div>');\n}\n\nProgress.prototype = {\n    constructor: Progress,\n\n    show: function show(progress) {\n        var _this = this;\n\n        // 状态处理\n        if (this._isShow) {\n            return;\n        }\n        this._isShow = true;\n\n        // 渲染\n        var $bar = this.$bar;\n        if (!this._isRender) {\n            var $textContainer = this.$textContainer;\n            $textContainer.append($bar);\n        } else {\n            this._isRender = true;\n        }\n\n        // 改变进度(节流,100ms 渲染一次)\n        if (Date.now() - this._time > 100) {\n            if (progress <= 1) {\n                $bar.css('width', progress * 100 + '%');\n                this._time = Date.now();\n            }\n        }\n\n        // 隐藏\n        var timeoutId = this._timeoutId;\n        if (timeoutId) {\n            clearTimeout(timeoutId);\n        }\n        timeoutId = setTimeout(function () {\n            _this._hide();\n        }, 500);\n    },\n\n    _hide: function _hide() {\n        var $bar = this.$bar;\n        $bar.remove();\n\n        // 修改状态\n        this._time = 0;\n        this._isShow = false;\n        this._isRender = false;\n    }\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n  return typeof obj;\n} : function (obj) {\n  return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\n/*\n    上传图片\n*/\n\n// 构造函数\nfunction UploadImg(editor) {\n    this.editor = editor;\n}\n\n// 原型\nUploadImg.prototype = {\n    constructor: UploadImg,\n\n    // 根据 debug 弹出不同的信息\n    _alert: function _alert(alertInfo, debugInfo) {\n        var editor = this.editor;\n        var debug = editor.config.debug;\n        var customAlert = editor.config.customAlert;\n\n        if (debug) {\n            throw new Error('wangEditor: ' + (debugInfo || alertInfo));\n        } else {\n            if (customAlert && typeof customAlert === 'function') {\n                customAlert(alertInfo);\n            } else {\n                alert(alertInfo);\n            }\n        }\n    },\n\n    // 根据链接插入图片\n    insertLinkImg: function insertLinkImg(link) {\n        var _this2 = this;\n\n        if (!link) {\n            return;\n        }\n        var editor = this.editor;\n        var config = editor.config;\n\n        // 校验格式\n        var linkImgCheck = config.linkImgCheck;\n        var checkResult = void 0;\n        if (linkImgCheck && typeof linkImgCheck === 'function') {\n            checkResult = linkImgCheck(link);\n            if (typeof checkResult === 'string') {\n                // 校验失败,提示信息\n                alert(checkResult);\n                return;\n            }\n        }\n\n        editor.cmd.do('insertHTML', '<img src=\"' + link + '\" style=\"max-width:100%;\"/>');\n\n        // 验证图片 url 是否有效,无效的话给出提示\n        var img = document.createElement('img');\n        img.onload = function () {\n            var callback = config.linkImgCallback;\n            if (callback && typeof callback === 'function') {\n                callback(link);\n            }\n\n            img = null;\n        };\n        img.onerror = function () {\n            img = null;\n            // 无法成功下载图片\n            _this2._alert('插入图片错误', 'wangEditor: \\u63D2\\u5165\\u56FE\\u7247\\u51FA\\u9519\\uFF0C\\u56FE\\u7247\\u94FE\\u63A5\\u662F \"' + link + '\"\\uFF0C\\u4E0B\\u8F7D\\u8BE5\\u94FE\\u63A5\\u5931\\u8D25');\n            return;\n        };\n        img.onabort = function () {\n            img = null;\n        };\n        img.src = link;\n    },\n\n    // 上传图片\n    uploadImg: function uploadImg(files) {\n        var _this3 = this;\n\n        if (!files || !files.length) {\n            return;\n        }\n\n        // ------------------------------ 获取配置信息 ------------------------------\n        var editor = this.editor;\n        var config = editor.config;\n        var uploadImgServer = config.uploadImgServer;\n        var uploadImgShowBase64 = config.uploadImgShowBase64;\n\n        var maxSize = config.uploadImgMaxSize;\n        var maxSizeM = maxSize / 1024 / 1024;\n        var maxLength = config.uploadImgMaxLength || 10000;\n        var uploadFileName = config.uploadFileName || '';\n        var uploadImgParams = config.uploadImgParams || {};\n        var uploadImgParamsWithUrl = config.uploadImgParamsWithUrl;\n        var uploadImgHeaders = config.uploadImgHeaders || {};\n        var hooks = config.uploadImgHooks || {};\n        var timeout = config.uploadImgTimeout || 3000;\n        var withCredentials = config.withCredentials;\n        if (withCredentials == null) {\n            withCredentials = false;\n        }\n        var customUploadImg = config.customUploadImg;\n\n        if (!customUploadImg) {\n            // 没有 customUploadImg 的情况下,需要如下两个配置才能继续进行图片上传\n            if (!uploadImgServer && !uploadImgShowBase64) {\n                return;\n            }\n        }\n\n        // ------------------------------ 验证文件信息 ------------------------------\n        var resultFiles = [];\n        var errInfo = [];\n        arrForEach(files, function (file) {\n            var name = file.name;\n            var size = file.size;\n\n            // chrome 低版本 name === undefined\n            if (!name || !size) {\n                return;\n            }\n\n            if (/\\.(jpg|jpeg|png|bmp|gif)$/i.test(name) === false) {\n                // 后缀名不合法,不是图片\n                errInfo.push('\\u3010' + name + '\\u3011\\u4E0D\\u662F\\u56FE\\u7247');\n                return;\n            }\n            if (maxSize < size) {\n                // 上传图片过大\n                errInfo.push('\\u3010' + name + '\\u3011\\u5927\\u4E8E ' + maxSizeM + 'M');\n                return;\n            }\n\n            // 验证通过的加入结果列表\n            resultFiles.push(file);\n        });\n        // 抛出验证信息\n        if (errInfo.length) {\n            this._alert('图片验证未通过: \\n' + errInfo.join('\\n'));\n            return;\n        }\n        if (resultFiles.length > maxLength) {\n            this._alert('一次最多上传' + maxLength + '张图片');\n            return;\n        }\n\n        // ------------------------------ 自定义上传 ------------------------------\n        if (customUploadImg && typeof customUploadImg === 'function') {\n            customUploadImg(resultFiles, this.insertLinkImg.bind(this));\n\n            // 阻止以下代码执行\n            return;\n        }\n\n        // 添加图片数据\n        var formdata = new FormData();\n        arrForEach(resultFiles, function (file) {\n            var name = uploadFileName || file.name;\n            formdata.append(name, file);\n        });\n\n        // ------------------------------ 上传图片 ------------------------------\n        if (uploadImgServer && typeof uploadImgServer === 'string') {\n            // 添加参数\n            var uploadImgServerArr = uploadImgServer.split('#');\n            uploadImgServer = uploadImgServerArr[0];\n            var uploadImgServerHash = uploadImgServerArr[1] || '';\n            objForEach(uploadImgParams, function (key, val) {\n                val = encodeURIComponent(val);\n\n                // 第一,将参数拼接到 url 中\n                if (uploadImgParamsWithUrl) {\n                    if (uploadImgServer.indexOf('?') > 0) {\n                        uploadImgServer += '&';\n                    } else {\n                        uploadImgServer += '?';\n                    }\n                    uploadImgServer = uploadImgServer + key + '=' + val;\n                }\n\n                // 第二,将参数添加到 formdata 中\n                formdata.append(key, val);\n            });\n            if (uploadImgServerHash) {\n                uploadImgServer += '#' + uploadImgServerHash;\n            }\n\n            // 定义 xhr\n            var xhr = new XMLHttpRequest();\n            xhr.open('POST', uploadImgServer);\n\n            // 设置超时\n            xhr.timeout = timeout;\n            xhr.ontimeout = function () {\n                // hook - timeout\n                if (hooks.timeout && typeof hooks.timeout === 'function') {\n                    hooks.timeout(xhr, editor);\n                }\n\n                _this3._alert('上传图片超时');\n            };\n\n            // 监控 progress\n            if (xhr.upload) {\n                xhr.upload.onprogress = function (e) {\n                    var percent = void 0;\n                    // 进度条\n                    var progressBar = new Progress(editor);\n                    if (e.lengthComputable) {\n                        percent = e.loaded / e.total;\n                        progressBar.show(percent);\n                    }\n                };\n            }\n\n            // 返回数据\n            xhr.onreadystatechange = function () {\n                var result = void 0;\n                if (xhr.readyState === 4) {\n                    if (xhr.status < 200 || xhr.status >= 300) {\n                        // hook - error\n                        if (hooks.error && typeof hooks.error === 'function') {\n                            hooks.error(xhr, editor);\n                        }\n\n                        // xhr 返回状态错误\n                        _this3._alert('上传图片发生错误', '\\u4E0A\\u4F20\\u56FE\\u7247\\u53D1\\u751F\\u9519\\u8BEF\\uFF0C\\u670D\\u52A1\\u5668\\u8FD4\\u56DE\\u72B6\\u6001\\u662F ' + xhr.status);\n                        return;\n                    }\n\n                    result = xhr.responseText;\n                    if ((typeof result === 'undefined' ? 'undefined' : _typeof(result)) !== 'object') {\n                        try {\n                            result = JSON.parse(result);\n                        } catch (ex) {\n                            // hook - fail\n                            if (hooks.fail && typeof hooks.fail === 'function') {\n                                hooks.fail(xhr, editor, result);\n                            }\n\n                            _this3._alert('上传图片失败', '上传图片返回结果错误,返回结果是: ' + result);\n                            return;\n                        }\n                    }\n                    if (!hooks.customInsert && result.errno != '0') {\n                        // hook - fail\n                        if (hooks.fail && typeof hooks.fail === 'function') {\n                            hooks.fail(xhr, editor, result);\n                        }\n\n                        // 数据错误\n                        _this3._alert('上传图片失败', '上传图片返回结果错误,返回结果 errno=' + result.errno);\n                    } else {\n                        if (hooks.customInsert && typeof hooks.customInsert === 'function') {\n                            // 使用者自定义插入方法\n                            hooks.customInsert(_this3.insertLinkImg.bind(_this3), result, editor);\n                        } else {\n                            // 将图片插入编辑器\n                            var data = result.data || [];\n                            data.forEach(function (link) {\n                                _this3.insertLinkImg(link);\n                            });\n                        }\n\n                        // hook - success\n                        if (hooks.success && typeof hooks.success === 'function') {\n                            hooks.success(xhr, editor, result);\n                        }\n                    }\n                }\n            };\n\n            // hook - before\n            if (hooks.before && typeof hooks.before === 'function') {\n                var beforeResult = hooks.before(xhr, editor, resultFiles);\n                if (beforeResult && (typeof beforeResult === 'undefined' ? 'undefined' : _typeof(beforeResult)) === 'object') {\n                    if (beforeResult.prevent) {\n                        // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传\n                        this._alert(beforeResult.msg);\n                        return;\n                    }\n                }\n            }\n\n            // 自定义 headers\n            objForEach(uploadImgHeaders, function (key, val) {\n                xhr.setRequestHeader(key, val);\n            });\n\n            // 跨域传 cookie\n            xhr.withCredentials = withCredentials;\n\n            // 发送请求\n            xhr.send(formdata);\n\n            // 注意,要 return 。不去操作接下来的 base64 显示方式\n            return;\n        }\n\n        // ------------------------------ 显示 base64 格式 ------------------------------\n        if (uploadImgShowBase64) {\n            arrForEach(files, function (file) {\n                var _this = _this3;\n                var reader = new FileReader();\n                reader.readAsDataURL(file);\n                reader.onload = function () {\n                    _this.insertLinkImg(this.result);\n                };\n            });\n        }\n    }\n};\n\n/*\n    编辑器构造函数\n*/\n\n// id,累加\nvar editorId = 1;\n\n// 构造函数\nfunction Editor(toolbarSelector, textSelector) {\n    if (toolbarSelector == null) {\n        // 没有传入任何参数,报错\n        throw new Error('错误:初始化编辑器时候未传入任何参数,请查阅文档');\n    }\n    // id,用以区分单个页面不同的编辑器对象\n    this.id = 'wangEditor-' + editorId++;\n\n    this.toolbarSelector = toolbarSelector;\n    this.textSelector = textSelector;\n\n    // 自定义配置\n    this.customConfig = {};\n}\n\n// 修改原型\nEditor.prototype = {\n    constructor: Editor,\n\n    // 初始化配置\n    _initConfig: function _initConfig() {\n        // _config 是默认配置,this.customConfig 是用户自定义配置,将它们 merge 之后再赋值\n        var target = {};\n        this.config = Object.assign(target, config, this.customConfig);\n\n        // 将语言配置,生成正则表达式\n        var langConfig = this.config.lang || {};\n        var langArgs = [];\n        objForEach(langConfig, function (key, val) {\n            // key 即需要生成正则表达式的规则,如“插入链接”\n            // val 即需要被替换成的语言,如“insert link”\n            langArgs.push({\n                reg: new RegExp(key, 'img'),\n                val: val\n\n            });\n        });\n        this.config.langArgs = langArgs;\n    },\n\n    // 初始化 DOM\n    _initDom: function _initDom() {\n        var _this = this;\n\n        var toolbarSelector = this.toolbarSelector;\n        var $toolbarSelector = $(toolbarSelector);\n        var textSelector = this.textSelector;\n\n        var config$$1 = this.config;\n        var zIndex = config$$1.zIndex;\n\n        // 定义变量\n        var $toolbarElem = void 0,\n            $textContainerElem = void 0,\n            $textElem = void 0,\n            $children = void 0;\n\n        if (textSelector == null) {\n            // 只传入一个参数,即是容器的选择器或元素,toolbar 和 text 的元素自行创建\n            $toolbarElem = $('<div></div>');\n            $textContainerElem = $('<div></div>');\n\n            // 将编辑器区域原有的内容,暂存起来\n            $children = $toolbarSelector.children();\n\n            // 添加到 DOM 结构中\n            $toolbarSelector.append($toolbarElem).append($textContainerElem);\n\n            // 自行创建的,需要配置默认的样式\n            $toolbarElem.css('background-color', '#f1f1f1').css('border', '1px solid #ccc');\n            $textContainerElem.css('border', '1px solid #ccc').css('border-top', 'none').css('height', '300px');\n        } else {\n            // toolbar 和 text 的选择器都有值,记录属性\n            $toolbarElem = $toolbarSelector;\n            $textContainerElem = $(textSelector);\n            // 将编辑器区域原有的内容,暂存起来\n            $children = $textContainerElem.children();\n        }\n\n        // 编辑区域\n        $textElem = $('<div></div>');\n        $textElem.attr('contenteditable', 'true').css('width', '100%').css('height', '100%');\n\n        // 初始化编辑区域内容\n        if ($children && $children.length) {\n            $textElem.append($children);\n        } else {\n            $textElem.append($('<p><br></p>'));\n        }\n\n        // 编辑区域加入DOM\n        $textContainerElem.append($textElem);\n\n        // 设置通用的 class\n        $toolbarElem.addClass('w-e-toolbar');\n        $textContainerElem.addClass('w-e-text-container');\n        $textContainerElem.css('z-index', zIndex);\n        $textElem.addClass('w-e-text');\n\n        // 添加 ID\n        var toolbarElemId = getRandom('toolbar-elem');\n        $toolbarElem.attr('id', toolbarElemId);\n        var textElemId = getRandom('text-elem');\n        $textElem.attr('id', textElemId);\n\n        // 记录属性\n        this.$toolbarElem = $toolbarElem;\n        this.$textContainerElem = $textContainerElem;\n        this.$textElem = $textElem;\n        this.toolbarElemId = toolbarElemId;\n        this.textElemId = textElemId;\n\n        // 记录输入法的开始和结束\n        var compositionEnd = true;\n        $textContainerElem.on('compositionstart', function () {\n            // 输入法开始输入\n            compositionEnd = false;\n        });\n        $textContainerElem.on('compositionend', function () {\n            // 输入法结束输入\n            compositionEnd = true;\n        });\n\n        // 绑定 onchange\n        $textContainerElem.on('click keyup', function () {\n            // 输入法结束才出发 onchange\n            compositionEnd && _this.change && _this.change();\n        });\n        $toolbarElem.on('click', function () {\n            this.change && this.change();\n        });\n\n        //绑定 onfocus 与 onblur 事件\n        if (config$$1.onfocus || config$$1.onblur) {\n            // 当前编辑器是否是焦点状态\n            this.isFocus = false;\n\n            $(document).on('click', function (e) {\n                //判断当前点击元素是否在编辑器内\n                var isChild = $textElem.isContain($(e.target));\n\n                //判断当前点击元素是否为工具栏\n                var isToolbar = $toolbarElem.isContain($(e.target));\n                var isMenu = $toolbarElem[0] == e.target ? true : false;\n\n                if (!isChild) {\n                    //若为选择工具栏中的功能,则不视为成blur操作\n                    if (isToolbar && !isMenu) {\n                        return;\n                    }\n\n                    if (_this.isFocus) {\n                        _this.onblur && _this.onblur();\n                    }\n                    _this.isFocus = false;\n                } else {\n                    if (!_this.isFocus) {\n                        _this.onfocus && _this.onfocus();\n                    }\n                    _this.isFocus = true;\n                }\n            });\n        }\n    },\n\n    // 封装 command\n    _initCommand: function _initCommand() {\n        this.cmd = new Command(this);\n    },\n\n    // 封装 selection range API\n    _initSelectionAPI: function _initSelectionAPI() {\n        this.selection = new API(this);\n    },\n\n    // 添加图片上传\n    _initUploadImg: function _initUploadImg() {\n        this.uploadImg = new UploadImg(this);\n    },\n\n    // 初始化菜单\n    _initMenus: function _initMenus() {\n        this.menus = new Menus(this);\n        this.menus.init();\n    },\n\n    // 添加 text 区域\n    _initText: function _initText() {\n        this.txt = new Text(this);\n        this.txt.init();\n    },\n\n    // 初始化选区,将光标定位到内容尾部\n    initSelection: function initSelection(newLine) {\n        var $textElem = this.$textElem;\n        var $children = $textElem.children();\n        if (!$children.length) {\n            // 如果编辑器区域无内容,添加一个空行,重新设置选区\n            $textElem.append($('<p><br></p>'));\n            this.initSelection();\n            return;\n        }\n\n        var $last = $children.last();\n\n        if (newLine) {\n            // 新增一个空行\n            var html = $last.html().toLowerCase();\n            var nodeName = $last.getNodeName();\n            if (html !== '<br>' && html !== '<br\\/>' || nodeName !== 'P') {\n                // 最后一个元素不是 <p><br></p>,添加一个空行,重新设置选区\n                $textElem.append($('<p><br></p>'));\n                this.initSelection();\n                return;\n            }\n        }\n\n        this.selection.createRangeByElem($last, false, true);\n        this.selection.restoreSelection();\n    },\n\n    // 绑定事件\n    _bindEvent: function _bindEvent() {\n        // -------- 绑定 onchange 事件 --------\n        var onChangeTimeoutId = 0;\n        var beforeChangeHtml = this.txt.html();\n        var config$$1 = this.config;\n\n        // onchange 触发延迟时间\n        var onchangeTimeout = config$$1.onchangeTimeout;\n        onchangeTimeout = parseInt(onchangeTimeout, 10);\n        if (!onchangeTimeout || onchangeTimeout <= 0) {\n            onchangeTimeout = 200;\n        }\n\n        var onchange = config$$1.onchange;\n        if (onchange && typeof onchange === 'function') {\n            // 触发 change 的有三个场景:\n            // 1. $textContainerElem.on('click keyup')\n            // 2. $toolbarElem.on('click')\n            // 3. editor.cmd.do()\n            this.change = function () {\n                // 判断是否有变化\n                var currentHtml = this.txt.html();\n\n                if (currentHtml.length === beforeChangeHtml.length) {\n                    // 需要比较每一个字符\n                    if (currentHtml === beforeChangeHtml) {\n                        return;\n                    }\n                }\n\n                // 执行,使用节流\n                if (onChangeTimeoutId) {\n                    clearTimeout(onChangeTimeoutId);\n                }\n                onChangeTimeoutId = setTimeout(function () {\n                    // 触发配置的 onchange 函数\n                    onchange(currentHtml);\n                    beforeChangeHtml = currentHtml;\n                }, onchangeTimeout);\n            };\n        }\n\n        // -------- 绑定 onblur 事件 --------\n        var onblur = config$$1.onblur;\n        if (onblur && typeof onblur === 'function') {\n            this.onblur = function () {\n                var currentHtml = this.txt.html();\n                onblur(currentHtml);\n            };\n        }\n\n        // -------- 绑定 onfocus 事件 --------\n        var onfocus = config$$1.onfocus;\n        if (onfocus && typeof onfocus === 'function') {\n            this.onfocus = function () {\n                onfocus();\n            };\n        }\n    },\n\n    // 创建编辑器\n    create: function create() {\n        // 初始化配置信息\n        this._initConfig();\n\n        // 初始化 DOM\n        this._initDom();\n\n        // 封装 command API\n        this._initCommand();\n\n        // 封装 selection range API\n        this._initSelectionAPI();\n\n        // 添加 text\n        this._initText();\n\n        // 初始化菜单\n        this._initMenus();\n\n        // 添加 图片上传\n        this._initUploadImg();\n\n        // 初始化选区,将光标定位到内容尾部\n        this.initSelection(true);\n\n        // 绑定事件\n        this._bindEvent();\n    },\n\n    // 解绑所有事件(暂时不对外开放)\n    _offAllEvent: function _offAllEvent() {\n        $.offAll();\n    }\n};\n\n// 检验是否浏览器环境\ntry {\n    document;\n} catch (ex) {\n    throw new Error('请在浏览器环境下运行');\n}\n\n// polyfill\npolyfill();\n\n// 这里的 `inlinecss` 将被替换成 css 代码的内容,详情可去 ./gulpfile.js 中搜索 `inlinecss` 关键字\nvar inlinecss = '.w-e-toolbar,.w-e-text-container,.w-e-menu-panel {  padding: 0;  margin: 0;  box-sizing: border-box;}.w-e-toolbar *,.w-e-text-container *,.w-e-menu-panel * {  padding: 0;  margin: 0;  box-sizing: border-box;}.w-e-clear-fix:after {  content: \"\";  display: table;  clear: both;}.w-e-toolbar .w-e-droplist {  position: absolute;  left: 0;  top: 0;  background-color: #fff;  border: 1px solid #f1f1f1;  border-right-color: #ccc;  border-bottom-color: #ccc;}.w-e-toolbar .w-e-droplist .w-e-dp-title {  text-align: center;  color: #999;  line-height: 2;  border-bottom: 1px solid #f1f1f1;  font-size: 13px;}.w-e-toolbar .w-e-droplist ul.w-e-list {  list-style: none;  line-height: 1;}.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item {  color: #333;  padding: 5px 0;}.w-e-toolbar .w-e-droplist ul.w-e-list li.w-e-item:hover {  background-color: #f1f1f1;}.w-e-toolbar .w-e-droplist ul.w-e-block {  list-style: none;  text-align: left;  padding: 5px;}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item {  display: inline-block;  *display: inline;  *zoom: 1;  padding: 3px 5px;}.w-e-toolbar .w-e-droplist ul.w-e-block li.w-e-item:hover {  background-color: #f1f1f1;}@font-face {  font-family: \\'w-e-icon\\';  src: url(data:application/x-font-woff;charset=utf-8;base64,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) format(\\'truetype\\');  font-weight: normal;  font-style: normal;}[class^=\"w-e-icon-\"],[class*=\" w-e-icon-\"] {  /* use !important to prevent issues with browser extensions that change fonts */  font-family: \\'w-e-icon\\' !important;  speak: none;  font-style: normal;  font-weight: normal;  font-variant: normal;  text-transform: none;  line-height: 1;  /* Better Font Rendering =========== */  -webkit-font-smoothing: antialiased;  -moz-osx-font-smoothing: grayscale;}.w-e-icon-close:before {  content: \"\\\\f00d\";}.w-e-icon-upload2:before {  content: \"\\\\e9c6\";}.w-e-icon-trash-o:before {  content: \"\\\\f014\";}.w-e-icon-header:before {  content: \"\\\\f1dc\";}.w-e-icon-pencil2:before {  content: \"\\\\e906\";}.w-e-icon-paint-brush:before {  content: \"\\\\f1fc\";}.w-e-icon-image:before {  content: \"\\\\e90d\";}.w-e-icon-play:before {  content: \"\\\\e912\";}.w-e-icon-location:before {  content: \"\\\\e947\";}.w-e-icon-undo:before {  content: \"\\\\e965\";}.w-e-icon-redo:before {  content: \"\\\\e966\";}.w-e-icon-quotes-left:before {  content: \"\\\\e977\";}.w-e-icon-list-numbered:before {  content: \"\\\\e9b9\";}.w-e-icon-list2:before {  content: \"\\\\e9bb\";}.w-e-icon-link:before {  content: \"\\\\e9cb\";}.w-e-icon-happy:before {  content: \"\\\\e9df\";}.w-e-icon-bold:before {  content: \"\\\\ea62\";}.w-e-icon-underline:before {  content: \"\\\\ea63\";}.w-e-icon-italic:before {  content: \"\\\\ea64\";}.w-e-icon-strikethrough:before {  content: \"\\\\ea65\";}.w-e-icon-table2:before {  content: \"\\\\ea71\";}.w-e-icon-paragraph-left:before {  content: \"\\\\ea77\";}.w-e-icon-paragraph-center:before {  content: \"\\\\ea78\";}.w-e-icon-paragraph-right:before {  content: \"\\\\ea79\";}.w-e-icon-terminal:before {  content: \"\\\\f120\";}.w-e-icon-page-break:before {  content: \"\\\\ea68\";}.w-e-icon-cancel-circle:before {  content: \"\\\\ea0d\";}.w-e-toolbar {  display: -webkit-box;  display: -ms-flexbox;  display: flex;  padding: 0 5px;  /* flex-wrap: wrap; */  /* 单个菜单 */}.w-e-toolbar .w-e-menu {  position: relative;  text-align: center;  padding: 5px 10px;  cursor: pointer;}.w-e-toolbar .w-e-menu i {  color: #999;}.w-e-toolbar .w-e-menu:hover i {  color: #333;}.w-e-toolbar .w-e-active i {  color: #1e88e5;}.w-e-toolbar .w-e-active:hover i {  color: #1e88e5;}.w-e-text-container .w-e-panel-container {  position: absolute;  top: 0;  left: 50%;  border: 1px solid #ccc;  border-top: 0;  box-shadow: 1px 1px 2px #ccc;  color: #333;  background-color: #fff;  /* 为 emotion panel 定制的样式 */  /* 上传图片的 panel 定制样式 */}.w-e-text-container .w-e-panel-container .w-e-panel-close {  position: absolute;  right: 0;  top: 0;  padding: 5px;  margin: 2px 5px 0 0;  cursor: pointer;  color: #999;}.w-e-text-container .w-e-panel-container .w-e-panel-close:hover {  color: #333;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title {  list-style: none;  display: -webkit-box;  display: -ms-flexbox;  display: flex;  font-size: 14px;  margin: 2px 10px 0 10px;  border-bottom: 1px solid #f1f1f1;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-item {  padding: 3px 5px;  color: #999;  cursor: pointer;  margin: 0 3px;  position: relative;  top: 1px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-title .w-e-active {  color: #333;  border-bottom: 1px solid #333;  cursor: default;  font-weight: 700;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content {  padding: 10px 15px 10px 15px;  font-size: 16px;  /* 输入框的样式 */  /* 按钮的样式 */}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus,.w-e-text-container .w-e-panel-container .w-e-panel-tab-content button:focus {  outline: none;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea {  width: 100%;  border: 1px solid #ccc;  padding: 5px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content textarea:focus {  border-color: #1e88e5;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text] {  border: none;  border-bottom: 1px solid #ccc;  font-size: 14px;  height: 20px;  color: #333;  text-align: left;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].small {  width: 30px;  text-align: center;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text].block {  display: block;  width: 100%;  margin: 10px 0;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content input[type=text]:focus {  border-bottom: 2px solid #1e88e5;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button {  font-size: 14px;  color: #1e88e5;  border: none;  padding: 5px 10px;  background-color: #fff;  cursor: pointer;  border-radius: 3px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.left {  float: left;  margin-right: 10px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.right {  float: right;  margin-left: 10px;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.gray {  color: #999;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button.red {  color: #c24f4a;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container button:hover {  background-color: #f1f1f1;}.w-e-text-container .w-e-panel-container .w-e-panel-tab-content .w-e-button-container:after {  content: \"\";  display: table;  clear: both;}.w-e-text-container .w-e-panel-container .w-e-emoticon-container .w-e-item {  cursor: pointer;  font-size: 18px;  padding: 0 3px;  display: inline-block;  *display: inline;  *zoom: 1;}.w-e-text-container .w-e-panel-container .w-e-up-img-container {  text-align: center;}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn {  display: inline-block;  *display: inline;  *zoom: 1;  color: #999;  cursor: pointer;  font-size: 60px;  line-height: 1;}.w-e-text-container .w-e-panel-container .w-e-up-img-container .w-e-up-btn:hover {  color: #333;}.w-e-text-container {  position: relative;}.w-e-text-container .w-e-progress {  position: absolute;  background-color: #1e88e5;  bottom: 0;  left: 0;  height: 1px;}.w-e-text {  padding: 0 10px;  overflow-y: scroll;}.w-e-text p,.w-e-text h1,.w-e-text h2,.w-e-text h3,.w-e-text h4,.w-e-text h5,.w-e-text table,.w-e-text pre {  margin: 10px 0;  line-height: 1.5;}.w-e-text ul,.w-e-text ol {  margin: 10px 0 10px 20px;}.w-e-text blockquote {  display: block;  border-left: 8px solid #d0e5f2;  padding: 5px 10px;  margin: 10px 0;  line-height: 1.4;  font-size: 100%;  background-color: #f1f1f1;}.w-e-text code {  display: inline-block;  *display: inline;  *zoom: 1;  background-color: #f1f1f1;  border-radius: 3px;  padding: 3px 5px;  margin: 0 3px;}.w-e-text pre code {  display: block;}.w-e-text table {  border-top: 1px solid #ccc;  border-left: 1px solid #ccc;}.w-e-text table td,.w-e-text table th {  border-bottom: 1px solid #ccc;  border-right: 1px solid #ccc;  padding: 3px 5px;}.w-e-text table th {  border-bottom: 2px solid #ccc;  text-align: center;}.w-e-text:focus {  outline: none;}.w-e-text img {  cursor: pointer;}.w-e-text img:hover {  box-shadow: 0 0 5px #333;}';\n\n// 将 css 代码添加到 <style> 中\nvar style = document.createElement('style');\nstyle.type = 'text/css';\nstyle.innerHTML = inlinecss;\ndocument.getElementsByTagName('HEAD').item(0).appendChild(style);\n\n// 返回\nvar index = window.wangEditor || Editor;\n\nreturn index;\n\n})));\n"]}
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/fonts/w-e-icon.woff b/novel-admin/src/main/resources/static/wangEditor/src/fonts/w-e-icon.woff
new file mode 100644
index 0000000000000000000000000000000000000000..fa64c4d86cef0bd3aadc1906f25b2c0ce6bf96da
GIT binary patch
literal 5568
zcmb7IeQX@X6`$F;+r2yA*ZOYn9G^e#ZhbzRB>p;|FA&GxkYH-!7$*?(-P%b^5|r49
zaUe-iyFzVMHGedv6#`WimS_=bMJXx}C>7eOs6{G&^p7G{K!pJn)j>jlpdj$A`+K{0
z;qqZnXYb9tdGqGYn>TOX8~fhtM@ATDD4NCUoOXfg%a!YI=<Z{T`!F^|5UGzy`;JT>
z1??dE9}^gVjh#9$eK%;*?dTIPLG-}klXrr)ALxAqKT)6f_raNI^y`-}K0pw9`}z5U
zATkzfK);PZc}cu^@W{dm&<4@RTz214Mf~yb+&<!a4t;~5_oD&Nk?9jyH})C&X$P)g
z&(2OCnPDsrdHe?i4`1j1;^^Gn*rT?1o=*T1;thU=d7<OO(ktly*lqcHtib)~*A^bF
z?GbJ;_Th@KRxM@-04R=4(Nak}wX+JaCX5l@gqpaTn1}rnZ6EkNtRA%Vvb-Exu3x@(
z`Of8gm!DsLVfio1e_MX@T<F})xr679ojdtK=!5u&=?~xdaAmc;x{A42<NTbNi{|Wg
z=G=SH9KQNa!cKga_&8xD9!>l-u{*IVacyE-q9-A=C$%TEUulccP*e%8gtvyX6-}Lm
z{*Q_?4(%e&F5PJoW2Gw{(>Rqw{AwCTS1k{NRXr>QvzB<Ci!PpzmAKADju*MYO_N)O
zZ9J0P+_%r<re&L!gw{64xnVd%_AmN2C%HOK#Ik8QJSHTfK(@)EEW<Xke#qa%dsRTD
z+7>feSySVQLZ)w^sP?z(N?g{n?Zy6qLSG`5DaLrAB&-!vm@8&udwZjBYI9RZ$0h=!
z%$7JamIM&NjP}MdbGT41xg49y&ylW{1=oW*2J|sl2ipK$x`dt$OG;R1@fIoBA_{#&
zQfWvO`@5t(S3_L9I&kcslf%O&?>RP57paqFRF_i9zu|^$iL@{1^LS8o-gwJx-QBm{
za%1PEl=2cx15HR5c(X8I_ZVx1E>MKD=<OMjXnj#Nffkn~cJ=X_`u3mLk6+(S$FH6^
zdUOIHEb5&2{FVFff93NN#9}jN0D}-ni#WE=xYCupn#m9GLSG9O!mg9<Ms<l5_usx-
ze~_DJil-+gP9GYq&-S$J=`c1nOq_n<E@5i<lK!A=p6MSPJal?u{jSlijZ^yM-osbk
z^}^|insw5M4P?hs7c4j=;rNnDMpaxRvxbdE$DWp+Y&{8?I9)u$%?I_}x9=~K6mDL5
zc<-b>)wp$Z*LqT6u-_Rk<u&L~IX8|=-NLqDmC6?MY?oBb(^6ViR>E8v;+eIF-s;-D
zMc23N?xL2DoO<*Q<M>8@RPohIqiYYb>I`brcRYG(#O&$v#R3vvbAU0K8I?OFn1ZOU
zvS!xFST3Vw)C%NPy{H#sT0zr`C13?j1EoM1fSVGoQ57u1FigvY<Csp7n2DdY$}FS&
zQJ?X^AmDwQxC{epvkTTvGM#n918Uah&fS7z;hw2$;1_COn>&id9hU=PnyZX{!l*FV
z&s>Z+(U^R35m<=D5u>0@PQ&F!Tg>GATvv4!94ii(h->)DQ#{SnOQvC1h%yZO=V^Os
z6(dw6cEjo`;tBCIc85&Jv+emVY;2g5izkvTJT6DLoXxlQ5A%V3jOke-#FL3QTt&zI
zs_+l=f#i&|U?v2ByS={zvMU43{JB8Pr?<7~mVQfb?=3o^H%B%^B9WUrJL83>rb686
z?2JU<7tejgaAbY7Dui$MDQ&lY^VT*io6BV#?51cmvK|5#I^&uKc?+H3SA6ylziK=Z
zsY)T6AiGx1KF0EFGrN}E03w1KMHC8k6k#s7J-9qE3VLBgLIk}Qk+1QGTn#QUx~CKn
zs_o=M$F^=g_RwUtUB747nC>l2&J7RGO_sd+*seXV=2EE~0XM6dQ7eK(iN#tWB+T{)
zwRC*j!enpn<ifUiS_^(!iR6`-zlrvWU{JHy0(pSDKMLY*1Vwak;*cBgVoF{~D#=o^
zlrMelZmwHgoT~nWb+OJXQy1$jEmpZP4Z2xS&_Ld+XDNDT!6}_1!1Z^uYbPJY1zgW#
zy6U3ROHJvHkvodE#m(X!BOTlA@6B8>IM{jTBab|?VQ7fIp1rY~=qo01jV$mHx{kKV
z8MSmDs%xg4d{R&m<ednq0;LN9=Pp4HiUg8nQtqIfVWt|IMmsu2n;KF!qlhC+dus5|
z_{NRnhX(ngJ=L-)*^o*#BsaC#izc?hPzi9+YnE#|FW?FnxL!mgur1RzOm1Kl>DVxk
zklowr<RL_E@V9X6n{J?U0gDA>ek6Y6eFOqLJGx*fQq#S|nvMay4~Qv|^sx7|M6qYX
zv7w=38+wZ7{P_6%{J72d2Fb&FikFORo?VZ}N%Pihac^6u4Zpp`{;{$C{xO3Kj?Ts8
z4Dv8j&ij=cyCcZYDa23~L#QqRay6}pWnu*Y7a5@gC`ehB6RX@N8ZEPEIx3mbvJn-8
zmdz-Xsul^)DvtLQH&+<Fo#-XOSO9vsx%*2UlF*_RdgP&rno)T%qc!tPk;D2rfbxoy
zUqGi5hBY;aD8oM}Vy+@1IgL~ytT-+8=wT(yGW0eq3tohR%tGp07G6yj^g&#?L?1@6
zo4#sBqt*%E)wER&=Wq<eM23K0pe9jk%1c({iAw9pv#J8EwIr@7&s&j07CEoqm#NJ*
z*OEwnKFo%tccpjfrI@1xp=Z0f;?#JZ4)eTI<CWUVOHPdo9pTA@CcPUSk0z7R#~+U-
z6F><;lW-}?3gyph4}Ccuwvx$UA}3~%H#^uM+sXE@`=Op1R}ems-|%QI4Q%GfVj3>`
zCB)=qXyiahgh_gImj+4$hza@jye=zV%@IIT^o%20N4<qRD-fr%PAhIFR^vI@>ud9Q
z<x2B_*XzsqyeLj{QFqj49*@@}@z*5}3I(o|M}9{3@J}(n)R=0wbM2{A$rbQahY$Ll
zO(qilj^AMksop;8j_^@;#jokxw@J<AcS3am(kD<ClJ4B*l_c+;HlOS*ztfY&_PV9C
zSEdbkr!=JUh&Bby5l0m^D$YtzvPRa$nBP733r{@Ban=d~S;b6_fndvIf{)w(l@*`2
zS(e{=OO~6xK1JpMS(Xk#cKLO83ldq0e;=H3lMIHXw`4^Duh;&B`0X!htmq}*<`jR#
zzu*JEhcDtp^ej0dc_1AMeNX}94Cu|=Jz5;Equ?6sYJU-59<!=nRUjR10e;~eGHp>-
z@Ht`~e{q(gNwoUK%nCG6=npz_uOzt%Nf3WpSLkb8*H>5<@+tm6D5ypQ^<2^H?<8PG
ze|;<*4%R73I8`h*HuUy3gcQZ^uM0*a{(3HPNx*Y_^=c>-Af`rQ>gjC=gDDUUMWenr
zS0emOSmE(NG8q9qjOEs?>+M|!JP-(lqN*<*_p55ymB1vFU|mG@`#BfF8{EDW^iune
zT_G6@`h4|~V8~$#hE<;*8VGObnhgKD6bku#;cy^O2Tg>`Ygj|Ui0boUwj7*zHmGo}
z1fQJ<f<;ym6=@X~F3F+m%kORv%96zWJ{6;szuD?pu`13Y-&~0!cTFdqKW9Er;4o<`
zPq-xK0LaGp=(Ns%;^!SLEsZaZm9F_le}9o5$#j-KOSb2`ximKR?P~`HGMT9AiN&MQ
zdexuwMe1Xk*4*6E(kafS8avtw_QNCai_y^@zN5AL)cV%eP{*mAV~we<?yIiaE+XN&
zx<DY2OEs!$pw8ow;G0f)t@k7Uw<3d|usV;^e|7o~-zCItSI>I5u+XLZ<rd6y{-1*o
zkDaf2=*53wX>}#JM4CqZ8n9|`q8l~+8)|UkBQR@dtQHqJHVk0mMW%qR3->=hl!xQ^
zi*t<qjJ?JKc*7m#FH5pCA)OK)aZ0@Gkvs#QanEC(|9E@6H+xO*uf6ZfkI5e>Z~KOv
z-L$f&-CTZt*R?wgv)@+s%n@_wmQ$hlGgZMU`wvub5Afp^+>5uDR>5V^cU15IV%Cos
z{_ExOgA&Gwi%Y-{RB!=&O9l4;zpsLOS%Rf2xD5L43Le0JZGL%Z-`tV8xmk9I?PGK7
z2w;xQPR`8VeQ0hr-P_f}CfN*|XLo}E1CY~;*x7U0S(hd5o;h&*@bo+uoq?jq*<m)#
z<}b@RGB>-BJ}@&oGe5mBvp>D}WO{Vp+)n7$#YUX97qI#Ph?#XXnq~`V_k*^VokTtA
QY+$Fm0gCU~<yV&f0lFt9;Q#;t

literal 0
HcmV?d00001

diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/.babelrc b/novel-admin/src/main/resources/static/wangEditor/src/js/.babelrc
new file mode 100644
index 0000000..6570dbf
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/.babelrc
@@ -0,0 +1,10 @@
+{
+  "presets": [
+    ["latest", {
+      "es2015": {
+        "modules": false
+      }
+    }]
+  ],
+  "plugins": ["external-helpers"]
+}
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/command/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/command/index.js
new file mode 100644
index 0000000..6a885ff
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/command/index.js
@@ -0,0 +1,106 @@
+/*
+    命令,封装 document.execCommand
+*/
+
+import $ from '../util/dom-core.js'
+import { UA } from '../util/util.js'
+
+// 构造函数
+function Command(editor) {
+    this.editor = editor
+}
+
+// 修改原型
+Command.prototype = {
+    constructor: Command,
+
+    // 执行命令
+    do: function (name, value) {
+        const editor = this.editor
+
+        // 使用 styleWithCSS
+        if (!editor._useStyleWithCSS) {
+            document.execCommand('styleWithCSS', null, true)
+            editor._useStyleWithCSS = true
+        }
+
+        // 如果无选区,忽略
+        if (!editor.selection.getRange()) {
+            return
+        }
+
+        // 恢复选取
+        editor.selection.restoreSelection()
+
+        // 执行
+        const _name = '_' + name
+        if (this[_name]) {
+            // 有自定义事件
+            this[_name](value)
+        } else {
+            // 默认 command
+            this._execCommand(name, value)
+        }
+
+        // 修改菜单状态
+        editor.menus.changeActive()
+
+        // 最后,恢复选取保证光标在原来的位置闪烁
+        editor.selection.saveRange()
+        editor.selection.restoreSelection()
+
+        // 触发 onchange
+        editor.change && editor.change()
+    },
+
+    // 自定义 insertHTML 事件
+    _insertHTML: function (html) {
+        const editor = this.editor
+        const range = editor.selection.getRange()
+
+        if (this.queryCommandSupported('insertHTML')) {
+            // W3C
+            this._execCommand('insertHTML', html)
+        } else if (range.insertNode) {
+            // IE
+            range.deleteContents()
+            range.insertNode($(html)[0])
+        } else if (range.pasteHTML) {
+            // IE <= 10
+            range.pasteHTML(html)
+        } 
+    },
+
+    // 插入 elem
+    _insertElem: function ($elem) {
+        const editor = this.editor
+        const range = editor.selection.getRange()
+
+        if (range.insertNode) {
+            range.deleteContents()
+            range.insertNode($elem[0])
+        }
+    },
+
+    // 封装 execCommand
+    _execCommand: function (name, value) {
+        document.execCommand(name, false, value)
+    },
+
+    // 封装 document.queryCommandValue
+    queryCommandValue: function (name) {
+        return document.queryCommandValue(name)
+    },
+
+    // 封装 document.queryCommandState
+    queryCommandState: function (name) {
+        return document.queryCommandState(name)
+    },
+
+    // 封装 document.queryCommandSupported
+    queryCommandSupported: function (name) {
+        return document.queryCommandSupported(name)
+    }
+}
+
+export default Command
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/config.js b/novel-admin/src/main/resources/static/wangEditor/src/js/config.js
new file mode 100644
index 0000000..780df1e
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/config.js
@@ -0,0 +1,387 @@
+/*
+    配置信息
+*/
+
+const config = {
+
+    // 默认菜单配置
+    menus: [
+        'head',
+        'bold',
+        'italic',
+        'underline',
+        'strikeThrough',
+        'foreColor',
+        'backColor',
+        'link',
+        'list',
+        'justify',
+        'quote',
+        'emoticon',
+        'image',
+        'table',
+        'video',
+        'code',
+        'undo',
+        'redo'
+    ],
+
+    colors: [
+        '#000000',
+        '#eeece0',
+        '#1c487f',
+        '#4d80bf',
+        '#c24f4a',
+        '#8baa4a',
+        '#7b5ba1',
+        '#46acc8',
+        '#f9963b',
+        '#ffffff'
+    ],
+
+    // // 语言配置
+    // lang: {
+    //     '设置标题': 'title',
+    //     '正文': 'p',
+    //     '链接文字': 'link text',
+    //     '链接': 'link',
+    //     '插入': 'insert',
+    //     '创建': 'init'
+    // },
+
+    // 表情
+    emotions: [
+        {
+            // tab 的标题
+            title: '默认',
+            // type -> 'emoji' / 'image'
+            type: 'image',
+            // content -> 数组
+            content: [
+                {
+                    alt: '[坏笑]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/50/pcmoren_huaixiao_org.png'
+                },
+                {
+                    alt: '[舔屏]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/40/pcmoren_tian_org.png'
+                },
+                {
+                    alt: '[污]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/pcmoren_wu_org.png'
+                },
+                {
+                    alt: '[允悲]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/2c/moren_yunbei_org.png'
+                },
+                {
+                    alt: '[笑而不语]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3a/moren_xiaoerbuyu_org.png'
+                },
+                {
+                    alt: '[费解]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/3c/moren_feijie_org.png'
+                },
+                {
+                    alt: '[憧憬]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/37/moren_chongjing_org.png'
+                },
+                {
+                    alt: '[并不简单]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/fc/moren_bbjdnew_org.png'
+                },
+                {
+                    alt: '[微笑]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/5c/huanglianwx_org.gif'
+                },
+                {
+                    alt: '[酷]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/8a/pcmoren_cool2017_org.png'
+                },
+                {
+                    alt: '[嘻嘻]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/0b/tootha_org.gif'
+                },
+                {
+                    alt: '[哈哈]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6a/laugh.gif'
+                },
+                {
+                    alt: '[可爱]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/14/tza_org.gif'
+                },
+                {
+                    alt: '[可怜]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/af/kl_org.gif'
+                },
+                {
+                    alt: '[挖鼻]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/0b/wabi_org.gif'
+                },
+                {
+                    alt: '[吃惊]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/f4/cj_org.gif'
+                },
+                {
+                    alt: '[害羞]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6e/shamea_org.gif'
+                },
+                {
+                    alt: '[挤眼]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/c3/zy_org.gif'
+                },
+                {
+                    alt: '[闭嘴]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/29/bz_org.gif'
+                },
+                {
+                    alt: '[鄙视]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/71/bs2_org.gif'
+                },
+                {
+                    alt: '[爱你]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6d/lovea_org.gif'
+                },
+                {
+                    alt: '[泪]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/9d/sada_org.gif'
+                },
+                {
+                    alt: '[偷笑]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/19/heia_org.gif'
+                },
+                {
+                    alt: '[亲亲]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/8f/qq_org.gif'
+                },
+                {
+                    alt: '[生病]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/b6/sb_org.gif'
+                },
+                {
+                    alt: '[太开心]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/58/mb_org.gif'
+                },
+                {
+                    alt: '[白眼]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/d9/landeln_org.gif'
+                },
+                {
+                    alt: '[右哼哼]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/98/yhh_org.gif'
+                },
+                {
+                    alt: '[左哼哼]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/6d/zhh_org.gif'
+                },
+                {
+                    alt: '[嘘]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/a6/x_org.gif'
+                },
+                {
+                    alt: '[衰]',
+                    src: 'http://img.t.sinajs.cn/t4/appstyle/expression/ext/normal/af/cry.gif'
+                }
+            ]
+        },
+        {
+            // tab 的标题
+            title: '新浪',
+            // type -> 'emoji' / 'image'
+            type: 'image',
+            // content -> 数组
+            content: [
+                {
+                    src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/7a/shenshou_thumb.gif',
+                    alt: '[草泥马]'
+                },
+                {
+                    src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/60/horse2_thumb.gif',
+                    alt: '[神马]'
+                },
+                {
+                    src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/bc/fuyun_thumb.gif',
+                    alt: '[浮云]'
+                },
+                {
+                    src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/c9/geili_thumb.gif',
+                    alt: '[给力]'
+                },
+                {
+                    src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/f2/wg_thumb.gif',
+                    alt: '[围观]'
+                },
+                {
+                    src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/70/vw_thumb.gif',
+                    alt: '[威武]'
+                },
+                {
+                    src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/6e/panda_thumb.gif',
+                    alt: '[熊猫]'
+                },
+                {
+                    src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/81/rabbit_thumb.gif',
+                    alt: '[兔子]'
+                },
+                {
+                    src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/bc/otm_thumb.gif',
+                    alt: '[奥特曼]'
+                },
+                {
+                    src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/15/j_thumb.gif',
+                    alt: '[囧]'
+                },
+                {
+                    src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/89/hufen_thumb.gif',
+                    alt: '[互粉]'
+                },
+                {
+                    src: 'http://img.t.sinajs.cn/t35/style/images/common/face/ext/normal/c4/liwu_thumb.gif',
+                    alt: '[礼物]'
+                }
+            ]
+        },
+        {
+            // tab 的标题
+            title: 'emoji',
+            // type -> 'emoji' / 'image'
+            type: 'emoji',
+            // content -> 数组
+            content: '😀 😃 😄 😁 😆 😅 😂 😊 😇 🙂 🙃 😉 😌 😍 😘 😗 😙 😚 😋 😜 😝 😛 🤑 🤗 🤓 😎 😏 😒 😞 😔 😟 😕 🙁  😣 😖 😫 😩 😤 😠 😡 😶 😐 😑 😯 😦 😧 😮 😲 😵 😳 😱 😨 😰 😢 😥 😭 😓 😪 😴 🙄 🤔 😬 🤐'.split(/\s/)
+        },
+        // {
+        //     // tab 的标题
+        //     title: '手势',
+        //     // type -> 'emoji' / 'image'
+        //     type: 'emoji',
+        //     // content -> 数组
+        //     content: ['🙌', '👏', '👋', '👍', '👎', '👊', '✊', '️👌', '✋', '👐', '💪', '🙏', '️👆', '👇', '👈', '👉', '🖕', '🖐', '🤘']
+        // }
+    ],
+
+    // 编辑区域的 z-index
+    zIndex: 10000,
+
+    // 是否开启 debug 模式(debug 模式下错误会 throw error 形式抛出)
+    debug: false,
+
+    // 插入链接时候的格式校验
+    linkCheck: function (text, link) {
+        // text 是插入的文字
+        // link 是插入的链接
+        return true // 返回 true 即表示成功
+        // return '校验失败' // 返回字符串即表示失败的提示信息
+    },
+
+    // 插入网络图片的校验
+    linkImgCheck: function (src) {
+        // src 即图片的地址
+        return true // 返回 true 即表示成功
+        // return '校验失败'  // 返回字符串即表示失败的提示信息
+    },
+
+    // 粘贴过滤样式,默认开启
+    pasteFilterStyle: true,
+
+    // 对粘贴的文字进行自定义处理,返回处理后的结果。编辑器会将处理后的结果粘贴到编辑区域中。
+    // IE 暂时不支持
+    pasteTextHandle: function (content) {
+        // content 即粘贴过来的内容(html 或 纯文本),可进行自定义处理然后返回
+        return content
+    },
+
+    // onchange 事件
+    // onchange: function (html) {
+    //     // html 即变化之后的内容
+    //     console.log(html)
+    // },
+
+    // 是否显示添加网络图片的 tab
+    showLinkImg: true,
+
+    // 插入网络图片的回调
+    linkImgCallback: function (url) {
+        // console.log(url)  // url 即插入图片的地址
+    },
+
+    // 默认上传图片 max size: 5M
+    uploadImgMaxSize: 5 * 1024 * 1024,
+
+    // 配置一次最多上传几个图片
+    // uploadImgMaxLength: 5,
+
+    // 上传图片,是否显示 base64 格式
+    uploadImgShowBase64: false,
+
+    // 上传图片,server 地址(如果有值,则 base64 格式的配置则失效)
+    // uploadImgServer: '/upload',
+
+    // 自定义配置 filename
+    uploadFileName: '',
+
+    // 上传图片的自定义参数
+    uploadImgParams: {
+        // token: 'abcdef12345'
+    },
+
+    // 上传图片的自定义header
+    uploadImgHeaders: {
+        // 'Accept': 'text/x-json'
+    },
+
+    // 配置 XHR withCredentials
+    withCredentials: false,
+
+    // 自定义上传图片超时时间 ms
+    uploadImgTimeout: 10000,
+
+    // 上传图片 hook 
+    uploadImgHooks: {
+        // customInsert: function (insertLinkImg, result, editor) {
+        //     console.log('customInsert')
+        //     // 图片上传并返回结果,自定义插入图片的事件,而不是编辑器自动插入图片
+        //     const data = result.data1 || []
+        //     data.forEach(link => {
+        //         insertLinkImg(link)
+        //     })
+        // },
+        before: function (xhr, editor, files) {
+            // 图片上传之前触发
+
+            // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传
+            // return {
+            //     prevent: true,
+            //     msg: '放弃上传'
+            // }
+        },
+        success: function (xhr, editor, result) {
+            // 图片上传并返回结果,图片插入成功之后触发
+        },
+        fail: function (xhr, editor, result) {
+            // 图片上传并返回结果,但图片插入错误时触发
+        },
+        error: function (xhr, editor) {
+            // 图片上传出错时触发
+        },
+        timeout: function (xhr, editor) {
+            // 图片上传超时时触发
+        }
+    },
+
+    // 是否上传七牛云,默认为 false
+    qiniu: false,
+
+    // 上传图片自定义提示方法
+    // customAlert: function (info) {
+    //     // 自定义上传提示
+    // },
+    
+    // // 自定义上传图片
+    // customUploadImg: function (files, insert) {
+    //     // files 是 input 中选中的文件列表
+    //     // insert 是获取图片 url 后,插入到编辑器的方法
+    //     insert(imgUrl)
+    // }
+}
+
+export default config
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/editor/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/editor/index.js
new file mode 100644
index 0000000..5e8923c
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/editor/index.js
@@ -0,0 +1,339 @@
+/*
+    编辑器构造函数
+*/
+
+import $ from '../util/dom-core.js'
+import _config from '../config.js'
+import Menus from '../menus/index.js'
+import Text from '../text/index.js'
+import Command from '../command/index.js'
+import selectionAPI from '../selection/index.js'
+import UploadImg from './upload/upload-img.js'
+import { arrForEach, objForEach } from '../util/util.js'
+import { getRandom } from '../util/util.js'
+
+// id,累加
+let editorId = 1
+
+// 构造函数
+function Editor(toolbarSelector, textSelector) {
+    if (toolbarSelector == null) {
+        // 没有传入任何参数,报错
+        throw new Error('错误:初始化编辑器时候未传入任何参数,请查阅文档')
+    }
+    // id,用以区分单个页面不同的编辑器对象
+    this.id = 'wangEditor-' + editorId++
+
+    this.toolbarSelector = toolbarSelector
+    this.textSelector = textSelector
+
+    // 自定义配置
+    this.customConfig = {}
+}
+
+// 修改原型
+Editor.prototype = {
+    constructor: Editor,
+
+    // 初始化配置
+    _initConfig: function () {
+        // _config 是默认配置,this.customConfig 是用户自定义配置,将它们 merge 之后再赋值
+        let target = {}
+        this.config = Object.assign(target, _config, this.customConfig)
+
+        // 将语言配置,生成正则表达式
+        const langConfig = this.config.lang || {}
+        const langArgs = []
+        objForEach(langConfig, (key, val) => {
+            // key 即需要生成正则表达式的规则,如“插入链接”
+            // val 即需要被替换成的语言,如“insert link”
+            langArgs.push({
+                reg: new RegExp(key, 'img'),
+                val: val
+
+            })
+        })
+        this.config.langArgs = langArgs
+    },
+
+    // 初始化 DOM
+    _initDom: function () {
+        const toolbarSelector = this.toolbarSelector
+        const $toolbarSelector = $(toolbarSelector)
+        const textSelector = this.textSelector
+
+        const config = this.config
+        const zIndex = config.zIndex
+
+        // 定义变量
+        let $toolbarElem, $textContainerElem, $textElem, $children
+
+        if (textSelector == null) {
+            // 只传入一个参数,即是容器的选择器或元素,toolbar 和 text 的元素自行创建
+            $toolbarElem = $('<div></div>')
+            $textContainerElem = $('<div></div>')
+
+            // 将编辑器区域原有的内容,暂存起来
+            $children = $toolbarSelector.children()
+
+            // 添加到 DOM 结构中
+            $toolbarSelector.append($toolbarElem).append($textContainerElem)
+
+            // 自行创建的,需要配置默认的样式
+            $toolbarElem.css('background-color', '#f1f1f1')
+                            .css('border', '1px solid #ccc')
+            $textContainerElem.css('border', '1px solid #ccc')
+                            .css('border-top', 'none')
+                            .css('height', '300px')
+        } else {
+            // toolbar 和 text 的选择器都有值,记录属性
+            $toolbarElem = $toolbarSelector
+            $textContainerElem = $(textSelector)
+            // 将编辑器区域原有的内容,暂存起来
+            $children = $textContainerElem.children()
+        }
+
+        // 编辑区域
+        $textElem = $('<div></div>')
+        $textElem.attr('contenteditable', 'true')
+                .css('width', '100%')
+                .css('height', '100%')
+
+        // 初始化编辑区域内容
+        if ($children && $children.length) {
+            $textElem.append($children)
+        } else {
+            $textElem.append($('<p><br></p>'))
+        }
+
+        // 编辑区域加入DOM
+        $textContainerElem.append($textElem)
+
+        // 设置通用的 class
+        $toolbarElem.addClass('w-e-toolbar')
+        $textContainerElem.addClass('w-e-text-container')
+        $textContainerElem.css('z-index', zIndex)
+        $textElem.addClass('w-e-text')
+
+        // 添加 ID
+        const toolbarElemId = getRandom('toolbar-elem')
+        $toolbarElem.attr('id', toolbarElemId)
+        const textElemId = getRandom('text-elem')
+        $textElem.attr('id', textElemId)
+
+        // 记录属性
+        this.$toolbarElem = $toolbarElem
+        this.$textContainerElem = $textContainerElem
+        this.$textElem = $textElem
+        this.toolbarElemId = toolbarElemId
+        this.textElemId = textElemId
+
+        // 记录输入法的开始和结束
+        let compositionEnd = true
+        $textContainerElem.on('compositionstart', () => {
+            // 输入法开始输入
+            compositionEnd = false
+        })
+        $textContainerElem.on('compositionend', () => {
+            // 输入法结束输入
+            compositionEnd = true
+        })
+
+        // 绑定 onchange
+        $textContainerElem.on('click keyup', () => {
+            // 输入法结束才出发 onchange
+            compositionEnd && this.change &&  this.change()
+        })
+        $toolbarElem.on('click', function () {
+            this.change &&  this.change()
+        })
+
+        //绑定 onfocus 与 onblur 事件
+        if(config.onfocus || config.onblur){
+            // 当前编辑器是否是焦点状态
+            this.isFocus = false
+            
+            $(document).on('click', (e) => {
+                //判断当前点击元素是否在编辑器内
+                const isChild = $textElem.isContain($(e.target))
+                
+                //判断当前点击元素是否为工具栏
+                const isToolbar = $toolbarElem.isContain($(e.target))
+                const isMenu = $toolbarElem[0] == e.target ? true : false
+
+                if (!isChild) {
+                    //若为选择工具栏中的功能,则不视为成blur操作
+                    if(isToolbar && !isMenu){
+                        return
+                    }
+
+                    if(this.isFocus){
+                        this.onblur && this.onblur()
+                    }
+                    this.isFocus = false
+                }else{
+                    if(!this.isFocus){
+                        this.onfocus && this.onfocus()
+                    }
+                    this.isFocus = true
+                }
+            })
+        }
+
+    },
+
+    // 封装 command
+    _initCommand: function () {
+        this.cmd = new Command(this)
+    },
+
+    // 封装 selection range API
+    _initSelectionAPI: function () {
+        this.selection = new selectionAPI(this)
+    },
+
+    // 添加图片上传
+    _initUploadImg: function () {
+        this.uploadImg = new UploadImg(this)
+    },
+
+    // 初始化菜单
+    _initMenus: function () {
+        this.menus = new Menus(this)
+        this.menus.init()
+    },
+
+    // 添加 text 区域
+    _initText: function () {
+        this.txt = new Text(this)
+        this.txt.init()
+    },
+
+    // 初始化选区,将光标定位到内容尾部
+    initSelection: function (newLine) {
+        const $textElem = this.$textElem
+        const $children = $textElem.children()
+        if (!$children.length) {
+            // 如果编辑器区域无内容,添加一个空行,重新设置选区
+            $textElem.append($('<p><br></p>'))
+            this.initSelection()
+            return
+        }
+
+        const $last = $children.last()
+
+        if (newLine) {
+            // 新增一个空行
+            const html = $last.html().toLowerCase()
+            const nodeName = $last.getNodeName()
+            if ((html !== '<br>' && html !== '<br\/>') || nodeName !== 'P') {
+                // 最后一个元素不是 <p><br></p>,添加一个空行,重新设置选区
+                $textElem.append($('<p><br></p>'))
+                this.initSelection()
+                return
+            }
+        }
+
+        this.selection.createRangeByElem($last, false, true)
+        this.selection.restoreSelection()
+    },
+
+    // 绑定事件
+    _bindEvent: function () {
+        // -------- 绑定 onchange 事件 --------
+        let onChangeTimeoutId = 0
+        let beforeChangeHtml = this.txt.html()
+        const config = this.config
+
+        // onchange 触发延迟时间
+        let onchangeTimeout = config.onchangeTimeout
+        onchangeTimeout = parseInt(onchangeTimeout, 10)
+        if (!onchangeTimeout || onchangeTimeout <= 0) {
+            onchangeTimeout = 200
+        }
+
+        const onchange = config.onchange
+        if (onchange && typeof onchange === 'function'){
+            // 触发 change 的有三个场景:
+            // 1. $textContainerElem.on('click keyup')
+            // 2. $toolbarElem.on('click')
+            // 3. editor.cmd.do()
+            this.change = function () {
+                // 判断是否有变化
+                let currentHtml = this.txt.html()
+
+                if (currentHtml.length === beforeChangeHtml.length) {
+                    // 需要比较每一个字符
+                    if (currentHtml === beforeChangeHtml) {
+                        return
+                    }
+                }
+
+                // 执行,使用节流
+                if (onChangeTimeoutId) {
+                    clearTimeout(onChangeTimeoutId)
+                }
+                onChangeTimeoutId = setTimeout(() => {
+                    // 触发配置的 onchange 函数
+                    onchange(currentHtml)
+                    beforeChangeHtml = currentHtml
+                }, onchangeTimeout)
+            }   
+        }
+
+        // -------- 绑定 onblur 事件 --------
+        const onblur = config.onblur
+        if (onblur && typeof onblur === 'function') {
+            this.onblur = function () {
+                const currentHtml = this.txt.html()
+                onblur(currentHtml)
+            }
+        }
+
+        // -------- 绑定 onfocus 事件 --------
+        const onfocus = config.onfocus
+        if (onfocus && typeof onfocus === 'function') {
+            this.onfocus = function () {
+                onfocus()
+            }
+        }
+        
+    },
+
+    // 创建编辑器
+    create: function () {
+        // 初始化配置信息
+        this._initConfig()
+
+        // 初始化 DOM
+        this._initDom()
+
+        // 封装 command API
+        this._initCommand()
+
+        // 封装 selection range API
+        this._initSelectionAPI()
+
+        // 添加 text
+        this._initText()
+
+        // 初始化菜单
+        this._initMenus()
+
+        // 添加 图片上传
+        this._initUploadImg()
+
+        // 初始化选区,将光标定位到内容尾部
+        this.initSelection(true)
+
+        // 绑定事件
+        this._bindEvent()
+    },
+
+    // 解绑所有事件(暂时不对外开放)
+    _offAllEvent: function () {
+        $.offAll()
+    }
+}
+
+export default Editor
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/editor/upload/progress.js b/novel-admin/src/main/resources/static/wangEditor/src/js/editor/upload/progress.js
new file mode 100644
index 0000000..67dc2c1
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/editor/upload/progress.js
@@ -0,0 +1,65 @@
+/*
+    上传进度条
+*/
+
+import $ from '../../util/dom-core.js'
+
+function Progress(editor) {
+    this.editor = editor
+    this._time = 0
+    this._isShow = false
+    this._isRender = false
+    this._timeoutId = 0
+    this.$textContainer = editor.$textContainerElem
+    this.$bar = $('<div class="w-e-progress"></div>')
+}
+
+Progress.prototype = {
+    constructor: Progress,
+
+    show: function (progress) {
+        // 状态处理
+        if (this._isShow) {
+            return
+        }
+        this._isShow = true
+
+        // 渲染
+        const $bar = this.$bar
+        if (!this._isRender) {
+            const $textContainer = this.$textContainer
+            $textContainer.append($bar)
+        } else {
+            this._isRender = true
+        }
+
+        // 改变进度(节流,100ms 渲染一次)
+        if (Date.now() - this._time > 100) {
+            if (progress <= 1) {
+                $bar.css('width', progress * 100 + '%')
+                this._time = Date.now()
+            }
+        }
+
+        // 隐藏
+        let timeoutId = this._timeoutId
+        if (timeoutId) {
+            clearTimeout(timeoutId)
+        }
+        timeoutId = setTimeout(() => {
+            this._hide()
+        }, 500)
+    },
+
+    _hide: function () {
+        const $bar = this.$bar
+        $bar.remove()
+
+        // 修改状态
+        this._time = 0
+        this._isShow = false
+        this._isRender = false
+    }
+}
+
+export default Progress
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/editor/upload/upload-img.js b/novel-admin/src/main/resources/static/wangEditor/src/js/editor/upload/upload-img.js
new file mode 100644
index 0000000..d1440ad
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/editor/upload/upload-img.js
@@ -0,0 +1,316 @@
+/*
+    上传图片
+*/
+
+import { objForEach, arrForEach, percentFormat } from '../../util/util.js'
+import Progress from './progress.js'
+import { UA } from '../../util/util.js'
+
+// 构造函数
+function UploadImg(editor) {
+    this.editor = editor
+}
+
+// 原型
+UploadImg.prototype = {
+    constructor: UploadImg,
+
+    // 根据 debug 弹出不同的信息
+    _alert: function (alertInfo, debugInfo) {
+        const editor = this.editor
+        const debug = editor.config.debug
+        const customAlert = editor.config.customAlert
+
+        if (debug) {
+            throw new Error('wangEditor: ' + (debugInfo || alertInfo))
+        } else {
+            if (customAlert && typeof customAlert === 'function') {
+                customAlert(alertInfo)
+            } else {
+                alert(alertInfo)
+            }
+        }
+    },
+
+    // 根据链接插入图片
+    insertLinkImg: function (link) {
+        if (!link) {
+            return
+        }
+        const editor = this.editor
+        const config = editor.config
+
+        // 校验格式
+        const linkImgCheck = config.linkImgCheck
+        let checkResult
+        if (linkImgCheck && typeof linkImgCheck === 'function') {
+            checkResult = linkImgCheck(link)
+            if (typeof checkResult === 'string') {
+                // 校验失败,提示信息
+                alert(checkResult)
+                return
+            }
+        }
+
+        editor.cmd.do('insertHTML', `<img src="${link}" style="max-width:100%;"/>`)
+
+        // 验证图片 url 是否有效,无效的话给出提示
+        let img = document.createElement('img')
+        img.onload = () => {
+            const callback = config.linkImgCallback
+            if (callback && typeof callback === 'function') {
+                callback(link)
+            }
+
+            img = null
+        }
+        img.onerror = () => {
+            img = null
+            // 无法成功下载图片
+            this._alert('插入图片错误', `wangEditor: 插入图片出错,图片链接是 "${link}",下载该链接失败`)
+            return
+        }
+        img.onabort = () => {
+            img = null
+        }
+        img.src = link
+    },
+
+    // 上传图片
+    uploadImg: function (files) {
+        if (!files || !files.length) {
+            return
+        }
+
+        // ------------------------------ 获取配置信息 ------------------------------
+        const editor = this.editor
+        const config = editor.config
+        let uploadImgServer = config.uploadImgServer
+        const uploadImgShowBase64 = config.uploadImgShowBase64
+
+        const maxSize = config.uploadImgMaxSize
+        const maxSizeM = maxSize / 1024 / 1024
+        const maxLength = config.uploadImgMaxLength || 10000
+        const uploadFileName = config.uploadFileName || ''
+        const uploadImgParams = config.uploadImgParams || {}
+        const uploadImgParamsWithUrl = config.uploadImgParamsWithUrl
+        const uploadImgHeaders = config.uploadImgHeaders || {}
+        const hooks = config.uploadImgHooks || {}
+        const timeout = config.uploadImgTimeout || 3000
+        let withCredentials = config.withCredentials
+        if (withCredentials == null) {
+            withCredentials = false
+        }
+        const customUploadImg = config.customUploadImg
+
+        if (!customUploadImg) {
+            // 没有 customUploadImg 的情况下,需要如下两个配置才能继续进行图片上传
+            if (!uploadImgServer && !uploadImgShowBase64) {
+                return
+            }
+        }
+
+        // ------------------------------ 验证文件信息 ------------------------------
+        const resultFiles = []
+        let errInfo = []
+        arrForEach(files, file => {
+            var name = file.name
+            var size = file.size
+
+            // chrome 低版本 name === undefined
+            if (!name || !size) {
+                return
+            }
+
+            if (/\.(jpg|jpeg|png|bmp|gif)$/i.test(name) === false) {
+                // 后缀名不合法,不是图片
+                errInfo.push(`【${name}】不是图片`)
+                return
+            }
+            if (maxSize < size) {
+                // 上传图片过大
+                errInfo.push(`【${name}】大于 ${maxSizeM}M`)
+                return
+            }
+
+            // 验证通过的加入结果列表
+            resultFiles.push(file)
+        })
+        // 抛出验证信息
+        if (errInfo.length) {
+            this._alert('图片验证未通过: \n' + errInfo.join('\n'))
+            return
+        }
+        if (resultFiles.length > maxLength) {
+            this._alert('一次最多上传' + maxLength + '张图片')
+            return
+        }
+
+        // ------------------------------ 自定义上传 ------------------------------
+        if (customUploadImg && typeof customUploadImg === 'function') {
+            customUploadImg(resultFiles, this.insertLinkImg.bind(this))
+
+            // 阻止以下代码执行
+            return
+        }
+
+        // 添加图片数据
+        const formdata = new FormData()
+        arrForEach(resultFiles, file => {
+            const name = uploadFileName || file.name
+            formdata.append(name, file)
+        })
+
+        // ------------------------------ 上传图片 ------------------------------
+        if (uploadImgServer && typeof uploadImgServer === 'string') {
+            // 添加参数
+            const uploadImgServerArr = uploadImgServer.split('#')
+            uploadImgServer = uploadImgServerArr[0]
+            const uploadImgServerHash = uploadImgServerArr[1] || ''
+            objForEach(uploadImgParams, (key, val) => {
+                val = encodeURIComponent(val)
+
+                // 第一,将参数拼接到 url 中
+                if (uploadImgParamsWithUrl) {
+                    if (uploadImgServer.indexOf('?') > 0) {
+                        uploadImgServer += '&'
+                    } else {
+                        uploadImgServer += '?'
+                    }
+                    uploadImgServer = uploadImgServer + key + '=' + val
+                }
+
+                // 第二,将参数添加到 formdata 中
+                formdata.append(key, val)
+            })
+            if (uploadImgServerHash) {
+                uploadImgServer += '#' + uploadImgServerHash
+            }
+
+            // 定义 xhr
+            const xhr = new XMLHttpRequest()
+            xhr.open('POST', uploadImgServer)
+
+            // 设置超时
+            xhr.timeout = timeout
+            xhr.ontimeout = () => {
+                // hook - timeout
+                if (hooks.timeout && typeof hooks.timeout === 'function') {
+                    hooks.timeout(xhr, editor)
+                }
+
+                this._alert('上传图片超时')
+            }
+
+            // 监控 progress
+            if (xhr.upload) {
+                xhr.upload.onprogress = e => {
+                    let percent
+                    // 进度条
+                    const progressBar = new Progress(editor)
+                    if (e.lengthComputable) {
+                        percent = e.loaded / e.total
+                        progressBar.show(percent)
+                    }
+                }
+            }
+
+            // 返回数据
+            xhr.onreadystatechange = () => {
+                let result
+                if (xhr.readyState === 4) {
+                    if (xhr.status < 200 || xhr.status >= 300) {
+                        // hook - error
+                        if (hooks.error && typeof hooks.error === 'function') {
+                            hooks.error(xhr, editor)
+                        }
+
+                        // xhr 返回状态错误
+                        this._alert('上传图片发生错误', `上传图片发生错误,服务器返回状态是 ${xhr.status}`)
+                        return
+                    }
+
+                    result = xhr.responseText
+                    if (typeof result !== 'object') {
+                        try {
+                            result = JSON.parse(result)
+                        } catch (ex) {
+                            // hook - fail
+                            if (hooks.fail && typeof hooks.fail === 'function') {
+                                hooks.fail(xhr, editor, result)
+                            }
+
+                            this._alert('上传图片失败', '上传图片返回结果错误,返回结果是: ' + result)
+                            return
+                        }
+                    }
+                    if (!hooks.customInsert && result.errno != '0') {
+                        // hook - fail
+                        if (hooks.fail && typeof hooks.fail === 'function') {
+                            hooks.fail(xhr, editor, result)
+                        }
+
+                        // 数据错误
+                        this._alert('上传图片失败', '上传图片返回结果错误,返回结果 errno=' + result.errno)
+                    } else {
+                        if (hooks.customInsert && typeof hooks.customInsert === 'function') {
+                            // 使用者自定义插入方法
+                            hooks.customInsert(this.insertLinkImg.bind(this), result, editor)
+                        } else {
+                            // 将图片插入编辑器
+                            const data = result.data || []
+                            data.forEach(link => {
+                                this.insertLinkImg(link)
+                            })
+                        }
+
+                        // hook - success
+                        if (hooks.success && typeof hooks.success === 'function') {
+                            hooks.success(xhr, editor, result)
+                        }
+                    }
+                }
+            }
+
+            // hook - before
+            if (hooks.before && typeof hooks.before === 'function') {
+                const beforeResult = hooks.before(xhr, editor, resultFiles)
+                if (beforeResult && typeof beforeResult === 'object') {
+                    if (beforeResult.prevent) {
+                        // 如果返回的结果是 {prevent: true, msg: 'xxxx'} 则表示用户放弃上传
+                        this._alert(beforeResult.msg)
+                        return
+                    }
+                }
+            }
+
+            // 自定义 headers
+            objForEach(uploadImgHeaders, (key, val) => {
+                xhr.setRequestHeader(key, val)
+            })
+
+            // 跨域传 cookie
+            xhr.withCredentials = withCredentials
+
+            // 发送请求
+            xhr.send(formdata)
+
+            // 注意,要 return 。不去操作接下来的 base64 显示方式
+            return
+        }
+
+        // ------------------------------ 显示 base64 格式 ------------------------------
+        if (uploadImgShowBase64) {
+            arrForEach(files, file => {
+                const _this = this
+                const reader = new FileReader()
+                reader.readAsDataURL(file)
+                reader.onload = function () {
+                    _this.insertLinkImg(this.result)
+                }
+            })
+        }
+    }
+}
+
+export default UploadImg
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/index.js
new file mode 100644
index 0000000..b85aedd
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/index.js
@@ -0,0 +1,24 @@
+import polyfill from './util/poly-fill.js'
+import Editor from './editor/index.js'
+
+// 检验是否浏览器环境
+try {
+    document
+} catch (ex) {
+    throw new Error('请在浏览器环境下运行')
+} 
+
+// polyfill
+polyfill()
+
+// 这里的 `inlinecss` 将被替换成 css 代码的内容,详情可去 ./gulpfile.js 中搜索 `inlinecss` 关键字
+const inlinecss = '__INLINE_CSS__'
+
+// 将 css 代码添加到 <style> 中
+let style = document.createElement('style')
+style.type = 'text/css'
+style.innerHTML= inlinecss
+document.getElementsByTagName('HEAD').item(0).appendChild(style)
+
+// 返回
+export default (window.wangEditor || Editor)
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/backColor/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/backColor/index.js
new file mode 100644
index 0000000..4040f48
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/backColor/index.js
@@ -0,0 +1,46 @@
+/*
+    menu - BackColor
+*/
+import $ from '../../util/dom-core.js'
+import DropList from '../droplist.js'
+
+// 构造函数
+function BackColor(editor) {
+    this.editor = editor
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-paint-brush"><i/></div>')
+    this.type = 'droplist'
+
+    // 获取配置的颜色
+    const config = editor.config
+    const colors = config.colors || []
+
+    // 当前是否 active 状态
+    this._active = false
+
+    // 初始化 droplist
+    this.droplist = new DropList(this, {
+        width: 120,
+        $title: $('<p>背景色</p>'),
+        type: 'inline-block', // droplist 内容以 block 形式展示
+        list: colors.map(color => {
+            return { $elem: $(`<i style="color:${color};" class="w-e-icon-paint-brush"></i>`), value: color }
+        }),
+        onClick: (value) => {
+            // 注意 this 是指向当前的 BackColor 对象
+            this._command(value)
+        }
+    })
+}
+
+// 原型
+BackColor.prototype = {
+    constructor: BackColor,
+
+    // 执行命令
+    _command: function (value) {
+        const editor = this.editor
+        editor.cmd.do('backColor', value)
+    }
+}
+
+export default BackColor
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/bold/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/bold/index.js
new file mode 100644
index 0000000..1e50acd
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/bold/index.js
@@ -0,0 +1,60 @@
+/*
+    bold-menu
+*/
+import $ from '../../util/dom-core.js'
+
+// 构造函数
+function Bold(editor) {
+    this.editor = editor
+    this.$elem = $(
+        `<div class="w-e-menu">
+            <i class="w-e-icon-bold"><i/>
+        </div>`
+    )
+    this.type = 'click'
+
+    // 当前是否 active 状态
+    this._active = false
+}
+
+// 原型
+Bold.prototype = {
+    constructor: Bold,
+
+    // 点击事件
+    onClick: function (e) {
+        // 点击菜单将触发这里
+        
+        const editor = this.editor
+        const isSeleEmpty = editor.selection.isSelectionEmpty()
+
+        if (isSeleEmpty) {
+            // 选区是空的,插入并选中一个“空白”
+            editor.selection.createEmptyRange()
+        }
+
+        // 执行 bold 命令
+        editor.cmd.do('bold')
+
+        if (isSeleEmpty) {
+            // 需要将选取折叠起来
+            editor.selection.collapseRange()
+            editor.selection.restoreSelection()
+        }
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function (e) {
+        const editor = this.editor
+        const $elem = this.$elem
+        if (editor.cmd.queryCommandState('bold')) {
+            this._active = true
+            $elem.addClass('w-e-active')
+        } else {
+            this._active = false
+            $elem.removeClass('w-e-active')
+        }
+    }
+}
+
+export default Bold
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/code/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/code/index.js
new file mode 100644
index 0000000..b08ba5d
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/code/index.js
@@ -0,0 +1,150 @@
+/*
+    menu - code
+*/
+import $ from '../../util/dom-core.js'
+import { getRandom, replaceHtmlSymbol } from '../../util/util.js'
+import Panel from '../panel.js'
+import { UA } from '../../util/util.js'
+
+// 构造函数
+function Code(editor) {
+    this.editor = editor
+    this.$elem = $(
+        `<div class="w-e-menu">
+            <i class="w-e-icon-terminal"><i/>
+        </div>`
+    )
+    this.type = 'panel'
+
+    // 当前是否 active 状态
+    this._active = false
+}
+
+// 原型
+Code.prototype = {
+    constructor: Code,
+
+    onClick: function (e) {
+        const editor = this.editor
+        const $startElem = editor.selection.getSelectionStartElem()
+        const $endElem = editor.selection.getSelectionEndElem()
+        const isSeleEmpty = editor.selection.isSelectionEmpty()
+        const selectionText = editor.selection.getSelectionText()
+        let $code
+
+        if (!$startElem.equal($endElem)) {
+            // 跨元素选择,不做处理
+            editor.selection.restoreSelection()
+            return
+        }
+        if (!isSeleEmpty) {
+            // 选取不是空,用 <code> 包裹即可
+            $code = $(`<code>${selectionText}</code>`)
+            editor.cmd.do('insertElem', $code)
+            editor.selection.createRangeByElem($code, false)
+            editor.selection.restoreSelection()
+            return
+        }
+
+        // 选取是空,且没有夸元素选择,则插入 <pre><code></code></prev>
+        if (this._active) {
+            // 选中状态,将编辑内容
+            this._createPanel($startElem.html())
+        } else {
+            // 未选中状态,将创建内容
+            this._createPanel()
+        }
+    },
+
+    _createPanel: function (value) {
+        // value - 要编辑的内容
+        value = value || ''
+        const type = !value ? 'new' : 'edit'
+        const textId = getRandom('texxt')
+        const btnId = getRandom('btn')
+
+        const panel = new Panel(this, {
+            width: 500,
+            // 一个 Panel 包含多个 tab
+            tabs: [
+                {
+                    // 标题
+                    title: '插入代码',
+                    // 模板
+                    tpl: `<div>
+                        <textarea id="${textId}" style="height:145px;;">${value}</textarea>
+                        <div class="w-e-button-container">
+                            <button id="${btnId}" class="right">插入</button>
+                        </div>
+                    <div>`,
+                    // 事件绑定
+                    events: [
+                        // 插入代码
+                        {
+                            selector: '#' + btnId,
+                            type: 'click',
+                            fn: () => {
+                                const $text = $('#' + textId)
+                                let text = $text.val() || $text.html()
+                                text = replaceHtmlSymbol(text)
+                                if (type === 'new') {
+                                    // 新插入
+                                    this._insertCode(text)
+                                } else {
+                                    // 编辑更新
+                                    this._updateCode(text)
+                                }
+
+                                // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                                return true
+                            }
+                        }
+                    ]
+                } // first tab end
+            ] // tabs end
+        }) // new Panel end
+
+        // 显示 panel
+        panel.show()
+
+        // 记录属性
+        this.panel = panel
+    },
+
+    // 插入代码
+    _insertCode: function (value) {
+        const editor = this.editor
+        editor.cmd.do('insertHTML', `<pre><code>${value}</code></pre><p><br></p>`)
+    },
+
+    // 更新代码
+    _updateCode: function (value) {
+        const editor = this.editor
+        const $selectionELem = editor.selection.getSelectionContainerElem()
+        if (!$selectionELem) {
+            return
+        }
+        $selectionELem.html(value)
+        editor.selection.restoreSelection()
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function (e) {
+        const editor = this.editor
+        const $elem = this.$elem
+        const $selectionELem = editor.selection.getSelectionContainerElem()
+        if (!$selectionELem) {
+            return
+        }
+        const $parentElem = $selectionELem.parent()
+        if ($selectionELem.getNodeName() === 'CODE' && $parentElem.getNodeName() === 'PRE') {
+            this._active = true
+            $elem.addClass('w-e-active')
+        } else {
+            this._active = false
+            $elem.removeClass('w-e-active')
+        }
+    }
+}
+
+export default Code
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/droplist.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/droplist.js
new file mode 100644
index 0000000..f4ad187
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/droplist.js
@@ -0,0 +1,130 @@
+/*
+    droplist
+*/
+import $ from '../util/dom-core.js'
+import replaceLang from '../util/replace-lang.js'
+
+const _emptyFn = () => {}
+
+// 构造函数
+function DropList(menu, opt) {
+    // droplist 所依附的菜单
+    const editor = menu.editor
+    this.menu = menu
+    this.opt = opt
+    // 容器
+    const $container = $('<div class="w-e-droplist"></div>')
+
+    // 标题
+    const $title = opt.$title
+    let titleHtml
+    if ($title) {
+        // 替换多语言
+        titleHtml = $title.html()
+        titleHtml = replaceLang(editor, titleHtml)
+        $title.html(titleHtml)
+
+        $title.addClass('w-e-dp-title')
+        $container.append($title)
+    }
+
+    const list = opt.list || []
+    const type = opt.type || 'list'  // 'list' 列表形式(如“标题”菜单) / 'inline-block' 块状形式(如“颜色”菜单)
+    const onClick = opt.onClick || _emptyFn
+
+    // 加入 DOM 并绑定事件
+    const $list = $('<ul class="' + (type === 'list' ? 'w-e-list' : 'w-e-block') + '"></ul>')
+    $container.append($list)
+    list.forEach(item => {
+        const $elem = item.$elem
+
+        // 替换多语言
+        let elemHtml = $elem.html()
+        elemHtml = replaceLang(editor, elemHtml)
+        $elem.html(elemHtml)
+
+        const value = item.value
+        const $li = $('<li class="w-e-item"></li>')
+        if ($elem) {
+            $li.append($elem)
+            $list.append($li)
+            $li.on('click', e => {
+                onClick(value)
+
+                // 隐藏
+                this.hideTimeoutId = setTimeout(() => {
+                    this.hide()
+                }, 0)
+            })
+        }
+    })
+
+    // 绑定隐藏事件
+    $container.on('mouseleave', e => {
+        this.hideTimeoutId = setTimeout(() => {
+            this.hide()
+        }, 0)
+    })
+
+    // 记录属性
+    this.$container = $container
+
+    // 基本属性
+    this._rendered = false
+    this._show = false
+}
+
+// 原型
+DropList.prototype = {
+    constructor: DropList,
+
+    // 显示(插入DOM)
+    show: function () {
+        if (this.hideTimeoutId) {
+            // 清除之前的定时隐藏
+            clearTimeout(this.hideTimeoutId)
+        }
+
+        const menu = this.menu
+        const $menuELem = menu.$elem
+        const $container = this.$container
+        if (this._show) {
+            return
+        }
+        if (this._rendered) {
+            // 显示
+            $container.show()
+        } else {
+            // 加入 DOM 之前先定位位置
+            const menuHeight = $menuELem.getSizeData().height || 0
+            const width = this.opt.width || 100  // 默认为 100
+            $container.css('margin-top', menuHeight + 'px')
+                    .css('width', width + 'px')
+
+            // 加入到 DOM
+            $menuELem.append($container)
+            this._rendered = true
+        }
+
+        // 修改属性
+        this._show = true
+    },
+
+    // 隐藏(移除DOM)
+    hide: function () {
+        if (this.showTimeoutId) {
+            // 清除之前的定时显示
+            clearTimeout(this.showTimeoutId)
+        }
+
+        const $container = this.$container
+        if (!this._show) {
+            return
+        }
+        // 隐藏并需改属性
+        $container.hide()
+        this._show = false
+    }
+}
+
+export default DropList
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/emoticon/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/emoticon/index.js
new file mode 100644
index 0000000..1810f35
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/emoticon/index.js
@@ -0,0 +1,115 @@
+/*
+    menu - emoticon
+*/
+import $ from '../../util/dom-core.js'
+import Panel from '../panel.js'
+
+// 构造函数
+function Emoticon(editor) {
+    this.editor = editor
+    this.$elem = $(
+        `<div class="w-e-menu">
+            <i class="w-e-icon-happy"><i/>
+        </div>`
+    )
+    this.type = 'panel'
+
+    // 当前是否 active 状态
+    this._active = false
+}
+
+// 原型
+Emoticon.prototype = {
+    constructor: Emoticon,
+
+    onClick: function () {
+        this._createPanel()
+    },
+
+    _createPanel: function () {
+        const editor = this.editor
+        const config = editor.config
+        // 获取表情配置
+        const emotions = config.emotions || []
+
+        // 创建表情 dropPanel 的配置
+        const tabConfig = []
+        emotions.forEach(emotData => {
+            const emotType = emotData.type
+            const content = emotData.content || []
+
+            // 这一组表情最终拼接出来的 html
+            let faceHtml = ''
+
+            // emoji 表情
+            if (emotType === 'emoji') {
+                content.forEach(item => {
+                    if (item) {
+                        faceHtml += '<span class="w-e-item">' + item + '</span>'
+                    }
+                })
+            }
+            // 图片表情
+            if (emotType === 'image') {
+                content.forEach(item => {
+                    const src = item.src
+                    const alt = item.alt
+                    if (src) {
+                        // 加一个 data-w-e 属性,点击图片的时候不再提示编辑图片
+                        faceHtml += '<span class="w-e-item"><img src="' + src + '" alt="' + alt + '" data-w-e="1"/></span>'
+                    }
+                })
+            }
+
+            tabConfig.push({
+                title: emotData.title,
+                tpl: `<div class="w-e-emoticon-container">${faceHtml}</div>`,
+                events: [
+                    {
+                        selector: 'span.w-e-item',
+                        type: 'click',
+                        fn: (e) => {
+                            const target = e.target
+                            const $target = $(target)
+                            const nodeName = $target.getNodeName()
+
+                            let insertHtml
+                            if (nodeName === 'IMG') {
+                                // 插入图片
+                                insertHtml = $target.parent().html()
+                            } else {
+                                // 插入 emoji
+                                insertHtml = '<span>' + $target.html() + '</span>'
+                            }
+
+                            this._insert(insertHtml)
+                            // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                            return true
+                        }
+                    }
+                ]
+            })
+        })
+
+        const panel = new Panel(this, {
+            width: 300,
+            height: 200,
+            // 一个 Panel 包含多个 tab
+            tabs: tabConfig
+        })
+
+        // 显示 panel
+        panel.show()
+
+        // 记录属性
+        this.panel = panel
+    },
+
+    // 插入表情
+    _insert: function (emotHtml) {
+        const editor = this.editor
+        editor.cmd.do('insertHTML', emotHtml)
+    }
+}
+
+export default Emoticon
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/foreColor/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/foreColor/index.js
new file mode 100644
index 0000000..a4f4326
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/foreColor/index.js
@@ -0,0 +1,46 @@
+/*
+    menu - Forecolor
+*/
+import $ from '../../util/dom-core.js'
+import DropList from '../droplist.js'
+
+// 构造函数
+function ForeColor(editor) {
+    this.editor = editor
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-pencil2"><i/></div>')
+    this.type = 'droplist'
+
+    // 获取配置的颜色
+    const config = editor.config
+    const colors = config.colors || []
+
+    // 当前是否 active 状态
+    this._active = false
+
+    // 初始化 droplist
+    this.droplist = new DropList(this, {
+        width: 120,
+        $title: $('<p>文字颜色</p>'),
+        type: 'inline-block', // droplist 内容以 block 形式展示
+        list: colors.map(color => {
+            return { $elem: $(`<i style="color:${color};" class="w-e-icon-pencil2"></i>`), value: color }
+        }),
+        onClick: (value) => {
+            // 注意 this 是指向当前的 ForeColor 对象
+            this._command(value)
+        }
+    })
+}
+
+// 原型
+ForeColor.prototype = {
+    constructor: ForeColor,
+
+    // 执行命令
+    _command: function (value) {
+        const editor = this.editor
+        editor.cmd.do('foreColor', value)
+    }
+}
+
+export default ForeColor
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/head/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/head/index.js
new file mode 100644
index 0000000..f5b048f
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/head/index.js
@@ -0,0 +1,70 @@
+/*
+    menu - header
+*/
+import $ from '../../util/dom-core.js'
+import DropList from '../droplist.js'
+
+// 构造函数
+function Head(editor) {
+    this.editor = editor
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-header"><i/></div>')
+    this.type = 'droplist'
+
+    // 当前是否 active 状态
+    this._active = false
+
+    // 初始化 droplist
+    this.droplist = new DropList(this, {
+        width: 100,
+        $title: $('<p>设置标题</p>'),
+        type: 'list', // droplist 以列表形式展示
+        list: [
+            { $elem: $('<h1>H1</h1>'), value: '<h1>' },
+            { $elem: $('<h2>H2</h2>'), value: '<h2>' },
+            { $elem: $('<h3>H3</h3>'), value: '<h3>' },
+            { $elem: $('<h4>H4</h4>'), value: '<h4>' },
+            { $elem: $('<h5>H5</h5>'), value: '<h5>' },
+            { $elem: $('<p>正文</p>'), value: '<p>' }
+        ],
+        onClick: (value) => {
+            // 注意 this 是指向当前的 Head 对象
+            this._command(value)
+        }
+    })
+}
+
+// 原型
+Head.prototype = {
+    constructor: Head,
+
+    // 执行命令
+    _command: function (value) {
+        const editor = this.editor
+
+        const $selectionElem = editor.selection.getSelectionContainerElem()
+        if (editor.$textElem.equal($selectionElem)) {
+            // 不能选中多行来设置标题,否则会出现问题
+            // 例如选中的是 <p>xxx</p><p>yyy</p> 来设置标题,设置之后会成为 <h1>xxx<br>yyy</h1> 不符合预期
+            return
+        }
+
+        editor.cmd.do('formatBlock', value)
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function (e) {
+        const editor = this.editor
+        const $elem = this.$elem
+        const reg = /^h/i
+        const cmdValue = editor.cmd.queryCommandValue('formatBlock')
+        if (reg.test(cmdValue)) {
+            this._active = true
+            $elem.addClass('w-e-active')
+        } else {
+            this._active = false
+            $elem.removeClass('w-e-active')
+        }
+    }
+}
+
+export default Head
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/img/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/img/index.js
new file mode 100644
index 0000000..7fe2d25
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/img/index.js
@@ -0,0 +1,252 @@
+/*
+    menu - img
+*/
+import $ from '../../util/dom-core.js'
+import { getRandom, arrForEach } from '../../util/util.js'
+import Panel from '../panel.js'
+
+// 构造函数
+function Image(editor) {
+    this.editor = editor
+    const imgMenuId = getRandom('w-e-img')
+    this.$elem = $('<div class="w-e-menu" id="' + imgMenuId + '"><i class="w-e-icon-image"><i/></div>')
+    editor.imgMenuId = imgMenuId
+    this.type = 'panel'
+
+    // 当前是否 active 状态
+    this._active = false
+}
+
+// 原型
+Image.prototype = {
+    constructor: Image,
+
+    onClick: function () {
+        const editor = this.editor
+        const config = editor.config
+        if (config.qiniu) {
+            return
+        }
+        if (this._active) {
+            this._createEditPanel()
+        } else {
+            this._createInsertPanel()
+        }
+    },
+
+    _createEditPanel: function () {
+        const editor = this.editor
+
+        // id
+        const width30 = getRandom('width-30')
+        const width50 = getRandom('width-50')
+        const width100 = getRandom('width-100')
+        const delBtn = getRandom('del-btn')
+
+        // tab 配置
+        const tabsConfig = [
+            {
+                title: '编辑图片',
+                tpl: `<div>
+                    <div class="w-e-button-container" style="border-bottom:1px solid #f1f1f1;padding-bottom:5px;margin-bottom:5px;">
+                        <span style="float:left;font-size:14px;margin:4px 5px 0 5px;color:#333;">最大宽度:</span>
+                        <button id="${width30}" class="left">30%</button>
+                        <button id="${width50}" class="left">50%</button>
+                        <button id="${width100}" class="left">100%</button>
+                    </div>
+                    <div class="w-e-button-container">
+                        <button id="${delBtn}" class="gray left">删除图片</button>
+                    </dv>
+                </div>`,
+                events: [
+                    {
+                        selector: '#' + width30,
+                        type: 'click',
+                        fn: () => {
+                            const $img = editor._selectedImg
+                            if ($img) {
+                                $img.css('max-width', '30%')
+                            }
+                            // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                            return true
+                        }
+                    },
+                    {
+                        selector: '#' + width50,
+                        type: 'click',
+                        fn: () => {
+                            const $img = editor._selectedImg
+                            if ($img) {
+                                $img.css('max-width', '50%')
+                            }
+                            // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                            return true
+                        }
+                    },
+                    {
+                        selector: '#' + width100,
+                        type: 'click',
+                        fn: () => {
+                            const $img = editor._selectedImg
+                            if ($img) {
+                                $img.css('max-width', '100%')
+                            }
+                            // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                            return true
+                        }
+                    },
+                    {
+                        selector: '#' + delBtn,
+                        type: 'click',
+                        fn: () => {
+                            const $img = editor._selectedImg
+                            if ($img) {
+                                $img.remove()
+                            }
+                            // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                            return true
+                        }
+                    }
+                ]
+            }
+        ]
+
+        // 创建 panel 并显示
+        const panel = new Panel(this, {
+            width: 300,
+            tabs: tabsConfig
+        })
+        panel.show()
+
+        // 记录属性
+        this.panel = panel
+    },
+
+    _createInsertPanel: function () {
+        const editor = this.editor
+        const uploadImg = editor.uploadImg
+        const config = editor.config
+
+        // id
+        const upTriggerId = getRandom('up-trigger')
+        const upFileId = getRandom('up-file')
+        const linkUrlId = getRandom('link-url')
+        const linkBtnId = getRandom('link-btn')
+
+        // tabs 的配置
+        const tabsConfig = [
+            {
+                title: '上传图片',
+                tpl: `<div class="w-e-up-img-container">
+                    <div id="${upTriggerId}" class="w-e-up-btn">
+                        <i class="w-e-icon-upload2"></i>
+                    </div>
+                    <div style="display:none;">
+                        <input id="${upFileId}" type="file" multiple="multiple" accept="image/jpg,image/jpeg,image/png,image/gif,image/bmp"/>
+                    </div>
+                </div>`,
+                events: [
+                    {
+                        // 触发选择图片
+                        selector: '#' + upTriggerId,
+                        type: 'click',
+                        fn: () => {
+                            const $file = $('#' + upFileId)
+                            const fileElem = $file[0]
+                            if (fileElem) {
+                                fileElem.click()
+                            } else {
+                                // 返回 true 可关闭 panel
+                                return true
+                            }
+                        }
+                    },
+                    {
+                        // 选择图片完毕
+                        selector: '#' + upFileId,
+                        type: 'change',
+                        fn: () => {
+                            const $file = $('#' + upFileId)
+                            const fileElem = $file[0]
+                            if (!fileElem) {
+                                // 返回 true 可关闭 panel
+                                return true
+                            }
+
+                            // 获取选中的 file 对象列表
+                            const fileList = fileElem.files
+                            if (fileList.length) {
+                                uploadImg.uploadImg(fileList)
+                            }
+
+                            // 返回 true 可关闭 panel
+                            return true
+                        }
+                    }
+                ]
+            }, // first tab end
+            {
+                title: '网络图片',
+                tpl: `<div>
+                    <input id="${linkUrlId}" type="text" class="block" placeholder="图片链接"/></td>
+                    <div class="w-e-button-container">
+                        <button id="${linkBtnId}" class="right">插入</button>
+                    </div>
+                </div>`,
+                events: [
+                    {
+                        selector: '#' + linkBtnId,
+                        type: 'click',
+                        fn: () => {
+                            const $linkUrl = $('#' + linkUrlId)
+                            const url = $linkUrl.val().trim()
+
+                            if (url) {
+                                uploadImg.insertLinkImg(url)
+                            }
+
+                            // 返回 true 表示函数执行结束之后关闭 panel
+                            return true
+                        }
+                    }
+                ]
+            } // second tab end
+        ] // tabs end
+
+        // 判断 tabs 的显示
+        const tabsConfigResult = []
+        if ((config.uploadImgShowBase64 || config.uploadImgServer || config.customUploadImg) && window.FileReader) {
+            // 显示“上传图片”
+            tabsConfigResult.push(tabsConfig[0])
+        }
+        if (config.showLinkImg) {
+            // 显示“网络图片”
+            tabsConfigResult.push(tabsConfig[1])
+        }
+
+        // 创建 panel 并显示
+        const panel = new Panel(this, {
+            width: 300,
+            tabs: tabsConfigResult
+        })
+        panel.show()
+
+        // 记录属性
+        this.panel = panel
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function (e) {
+        const editor = this.editor
+        const $elem = this.$elem
+        if (editor._selectedImg) {
+            this._active = true
+            $elem.addClass('w-e-active')
+        } else {
+            this._active = false
+            $elem.removeClass('w-e-active')
+        }
+    }
+}
+
+export default Image
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/index.js
new file mode 100644
index 0000000..e436096
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/index.js
@@ -0,0 +1,125 @@
+/*
+    菜单集合
+*/
+import { objForEach } from '../util/util.js'
+import MenuConstructors from './menu-list.js'
+
+// 构造函数
+function Menus(editor) {
+    this.editor = editor
+    this.menus = {}
+}
+
+// 修改原型
+Menus.prototype = {
+    constructor: Menus,
+
+    // 初始化菜单
+    init: function () {
+        const editor = this.editor
+        const config = editor.config || {}
+        const configMenus = config.menus || []  // 获取配置中的菜单
+
+        // 根据配置信息,创建菜单
+        configMenus.forEach(menuKey => {
+            const MenuConstructor = MenuConstructors[menuKey]
+            if (MenuConstructor && typeof MenuConstructor === 'function') {
+                // 创建单个菜单
+                this.menus[menuKey] = new MenuConstructor(editor)
+            }
+        })
+
+        // 添加到菜单栏
+        this._addToToolbar()
+
+        // 绑定事件
+        this._bindEvent()
+    },
+
+    // 添加到菜单栏
+    _addToToolbar: function () {
+        const editor = this.editor
+        const $toolbarElem = editor.$toolbarElem
+        const menus = this.menus
+        const config = editor.config
+        // config.zIndex 是配置的编辑区域的 z-index,菜单的 z-index 得在其基础上 +1
+        const zIndex = config.zIndex + 1
+        objForEach(menus, (key, menu) => {
+            const $elem = menu.$elem
+            if ($elem) {
+                // 设置 z-index
+                $elem.css('z-index', zIndex)
+                $toolbarElem.append($elem)
+            }
+        })
+    },
+
+    // 绑定菜单 click mouseenter 事件
+    _bindEvent: function () {
+        const menus = this.menus
+        const editor = this.editor
+        objForEach(menus, (key, menu) => {
+            const type = menu.type
+            if (!type) {
+                return
+            }
+            const $elem = menu.$elem
+            const droplist = menu.droplist
+            const panel = menu.panel
+
+            // 点击类型,例如 bold
+            if (type === 'click' && menu.onClick) {
+                $elem.on('click', e => {
+                    if (editor.selection.getRange() == null) {
+                        return
+                    }
+                    menu.onClick(e)
+                })
+            }
+
+            // 下拉框,例如 head
+            if (type === 'droplist' && droplist) {
+                $elem.on('mouseenter', e => {
+                    if (editor.selection.getRange() == null) {
+                        return
+                    }
+                    // 显示
+                    droplist.showTimeoutId = setTimeout(() => {
+                        droplist.show()
+                    }, 200)
+                }).on('mouseleave', e => {
+                    // 隐藏
+                    droplist.hideTimeoutId = setTimeout(() => {
+                        droplist.hide()
+                    }, 0)
+                })
+            }
+
+            // 弹框类型,例如 link
+            if (type === 'panel' && menu.onClick) {
+                $elem.on('click', e => {
+                    e.stopPropagation()
+                    if (editor.selection.getRange() == null) {
+                        return
+                    }
+                    // 在自定义事件中显示 panel
+                    menu.onClick(e)
+                })
+            }
+        })
+    },
+
+    // 尝试修改菜单状态
+    changeActive: function () {
+        const menus = this.menus
+        objForEach(menus, (key, menu) => {
+            if (menu.tryChangeActive) {
+                setTimeout(() => {
+                    menu.tryChangeActive()
+                }, 100)
+            }
+        })
+    }
+}
+
+export default Menus
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/italic/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/italic/index.js
new file mode 100644
index 0000000..d7f0a56
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/italic/index.js
@@ -0,0 +1,60 @@
+/*
+    italic-menu
+*/
+import $ from '../../util/dom-core.js'
+
+// 构造函数
+function Italic(editor) {
+    this.editor = editor
+    this.$elem = $(
+        `<div class="w-e-menu">
+            <i class="w-e-icon-italic"><i/>
+        </div>`
+    )
+    this.type = 'click'
+
+    // 当前是否 active 状态
+    this._active = false
+}
+
+// 原型
+Italic.prototype = {
+    constructor: Italic,
+
+    // 点击事件
+    onClick: function (e) {
+        // 点击菜单将触发这里
+        
+        const editor = this.editor
+        const isSeleEmpty = editor.selection.isSelectionEmpty()
+
+        if (isSeleEmpty) {
+            // 选区是空的,插入并选中一个“空白”
+            editor.selection.createEmptyRange()
+        }
+
+        // 执行 italic 命令
+        editor.cmd.do('italic')
+
+        if (isSeleEmpty) {
+            // 需要将选取折叠起来
+            editor.selection.collapseRange()
+            editor.selection.restoreSelection()
+        }
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function (e) {
+        const editor = this.editor
+        const $elem = this.$elem
+        if (editor.cmd.queryCommandState('italic')) {
+            this._active = true
+            $elem.addClass('w-e-active')
+        } else {
+            this._active = false
+            $elem.removeClass('w-e-active')
+        }
+    }
+}
+
+export default Italic
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/justify/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/justify/index.js
new file mode 100644
index 0000000..1fb5b82
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/justify/index.js
@@ -0,0 +1,44 @@
+/*
+    menu - justify
+*/
+import $ from '../../util/dom-core.js'
+import DropList from '../droplist.js'
+
+// 构造函数
+function Justify(editor) {
+    this.editor = editor
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-paragraph-left"><i/></div>')
+    this.type = 'droplist'
+
+    // 当前是否 active 状态
+    this._active = false
+
+    // 初始化 droplist
+    this.droplist = new DropList(this, {
+        width: 100,
+        $title: $('<p>对齐方式</p>'),
+        type: 'list', // droplist 以列表形式展示
+        list: [
+            { $elem: $('<span><i class="w-e-icon-paragraph-left"></i> 靠左</span>'), value: 'justifyLeft' },
+            { $elem: $('<span><i class="w-e-icon-paragraph-center"></i> 居中</span>'), value: 'justifyCenter' },
+            { $elem: $('<span><i class="w-e-icon-paragraph-right"></i> 靠右</span>'), value: 'justifyRight' }
+        ],
+        onClick: (value) => {
+            // 注意 this 是指向当前的 List 对象
+            this._command(value)
+        }
+    })
+}
+
+// 原型
+Justify.prototype = {
+    constructor: Justify,
+
+    // 执行命令
+    _command: function (value) {
+        const editor = this.editor
+        editor.cmd.do(value)
+    }
+}
+
+export default Justify
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/link/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/link/index.js
new file mode 100644
index 0000000..2132097
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/link/index.js
@@ -0,0 +1,168 @@
+/*
+    menu - link
+*/
+import $ from '../../util/dom-core.js'
+import { getRandom } from '../../util/util.js'
+import Panel from '../panel.js'
+
+// 构造函数
+function Link(editor) {
+    this.editor = editor
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-link"><i/></div>')
+    this.type = 'panel'
+
+    // 当前是否 active 状态
+    this._active = false
+}
+
+// 原型
+Link.prototype = {
+    constructor: Link,
+
+    // 点击事件
+    onClick: function (e) {
+        const editor = this.editor
+        let $linkelem
+
+        if (this._active) {
+            // 当前选区在链接里面
+            $linkelem = editor.selection.getSelectionContainerElem()
+            if (!$linkelem) {
+                return
+            }
+            // 将该元素都包含在选取之内,以便后面整体替换
+            editor.selection.createRangeByElem($linkelem)
+            editor.selection.restoreSelection()
+            // 显示 panel
+            this._createPanel($linkelem.text(), $linkelem.attr('href'))
+        } else {
+            // 当前选区不在链接里面
+            if (editor.selection.isSelectionEmpty()) {
+                // 选区是空的,未选中内容
+                this._createPanel('', '')
+            } else {
+                // 选中内容了
+                this._createPanel(editor.selection.getSelectionText(), '')
+            }
+        }
+    },
+
+    // 创建 panel
+    _createPanel: function (text, link) {
+        // panel 中需要用到的id
+        const inputLinkId = getRandom('input-link')
+        const inputTextId = getRandom('input-text')
+        const btnOkId = getRandom('btn-ok')
+        const btnDelId = getRandom('btn-del')
+
+        // 是否显示“删除链接”
+        const delBtnDisplay = this._active ? 'inline-block' : 'none'
+
+        // 初始化并显示 panel
+        const panel = new Panel(this, {
+            width: 300,
+            // panel 中可包含多个 tab
+            tabs: [
+                {
+                    // tab 的标题
+                    title: '链接',
+                    // 模板
+                    tpl: `<div>
+                            <input id="${inputTextId}" type="text" class="block" value="${text}" placeholder="链接文字"/></td>
+                            <input id="${inputLinkId}" type="text" class="block" value="${link}" placeholder="http://..."/></td>
+                            <div class="w-e-button-container">
+                                <button id="${btnOkId}" class="right">插入</button>
+                                <button id="${btnDelId}" class="gray right" style="display:${delBtnDisplay}">删除链接</button>
+                            </div>
+                        </div>`,
+                    // 事件绑定
+                    events: [
+                        // 插入链接
+                        {
+                            selector: '#' + btnOkId,
+                            type: 'click',
+                            fn: () => {
+                                // 执行插入链接
+                                const $link = $('#' + inputLinkId)
+                                const $text = $('#' + inputTextId)
+                                const link = $link.val()
+                                const text = $text.val()
+                                this._insertLink(text, link)
+
+                                // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                                return true
+                            }
+                        },
+                        // 删除链接
+                        {
+                            selector: '#' + btnDelId,
+                            type: 'click',
+                            fn: () => {
+                                // 执行删除链接
+                                this._delLink()
+
+                                // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                                return true
+                            }
+                        }
+                    ]
+                } // tab end
+            ] // tabs end
+        })
+
+        // 显示 panel
+        panel.show()
+
+        // 记录属性
+        this.panel = panel
+    },
+
+    // 删除当前链接
+    _delLink: function () {
+        if (!this._active) {
+            return
+        }
+        const editor = this.editor
+        const $selectionELem = editor.selection.getSelectionContainerElem()
+        if (!$selectionELem) {
+            return
+        }
+        const selectionText = editor.selection.getSelectionText()
+        editor.cmd.do('insertHTML', '<span>' + selectionText + '</span>')
+    },
+
+    // 插入链接
+    _insertLink: function (text, link) {
+        const editor = this.editor
+        const config = editor.config
+        const linkCheck = config.linkCheck
+        let checkResult = true // 默认为 true
+        if (linkCheck && typeof linkCheck === 'function') {
+            checkResult = linkCheck(text, link)
+        }
+        if (checkResult === true) {
+            editor.cmd.do('insertHTML', `<a href="${link}" target="_blank">${text}</a>`)
+        } else {
+            alert(checkResult)
+        }
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function (e) {
+        const editor = this.editor
+        const $elem = this.$elem
+        const $selectionELem = editor.selection.getSelectionContainerElem()
+        if (!$selectionELem) {
+            return
+        }
+        if ($selectionELem.getNodeName() === 'A') {
+            this._active = true
+            $elem.addClass('w-e-active')
+        } else {
+            this._active = false
+            $elem.removeClass('w-e-active')
+        }
+    }
+}
+
+export default Link
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/list/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/list/index.js
new file mode 100644
index 0000000..368558c
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/list/index.js
@@ -0,0 +1,82 @@
+/*
+    menu - list
+*/
+import $ from '../../util/dom-core.js'
+import DropList from '../droplist.js'
+
+// 构造函数
+function List(editor) {
+    this.editor = editor
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-list2"><i/></div>')
+    this.type = 'droplist'
+
+    // 当前是否 active 状态
+    this._active = false
+
+    // 初始化 droplist
+    this.droplist = new DropList(this, {
+        width: 120,
+        $title: $('<p>设置列表</p>'),
+        type: 'list', // droplist 以列表形式展示
+        list: [
+            { $elem: $('<span><i class="w-e-icon-list-numbered"></i> 有序列表</span>'), value: 'insertOrderedList' },
+            { $elem: $('<span><i class="w-e-icon-list2"></i> 无序列表</span>'), value: 'insertUnorderedList' }
+        ],
+        onClick: (value) => {
+            // 注意 this 是指向当前的 List 对象
+            this._command(value)
+        }
+    })
+}
+
+// 原型
+List.prototype = {
+    constructor: List,
+
+    // 执行命令
+    _command: function (value) {
+        const editor = this.editor
+        const $textElem = editor.$textElem
+        editor.selection.restoreSelection()
+        if (editor.cmd.queryCommandState(value)) {
+            return
+        }
+        editor.cmd.do(value)
+
+        // 验证列表是否被包裹在 <p> 之内
+        let $selectionElem = editor.selection.getSelectionContainerElem()
+        if ($selectionElem.getNodeName() === 'LI') {
+            $selectionElem = $selectionElem.parent()
+        }
+        if (/^ol|ul$/i.test($selectionElem.getNodeName()) === false) {
+            return
+        }
+        if ($selectionElem.equal($textElem)) {
+            // 证明是顶级标签,没有被 <p> 包裹
+            return
+        }
+        const $parent = $selectionElem.parent()
+        if ($parent.equal($textElem)) {
+            // $parent 是顶级标签,不能删除
+            return
+        }
+
+        $selectionElem.insertAfter($parent)
+        $parent.remove()
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function (e) {
+        const editor = this.editor
+        const $elem = this.$elem
+        if (editor.cmd.queryCommandState('insertUnOrderedList') || editor.cmd.queryCommandState('insertOrderedList')) {
+            this._active = true
+            $elem.addClass('w-e-active')
+        } else {
+            this._active = false
+            $elem.removeClass('w-e-active')
+        }
+    }
+}
+
+export default List
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/menu-list.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/menu-list.js
new file mode 100644
index 0000000..ed52927
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/menu-list.js
@@ -0,0 +1,63 @@
+/*
+    所有菜单的汇总
+*/
+
+// 存储菜单的构造函数
+const MenuConstructors = {}
+
+import Bold from './bold/index.js'
+MenuConstructors.bold = Bold
+
+import Head from './head/index.js'
+MenuConstructors.head = Head
+
+import Link from './link/index.js'
+MenuConstructors.link = Link
+
+import Italic from './italic/index.js'
+MenuConstructors.italic = Italic
+
+import Redo from './redo/index.js'
+MenuConstructors.redo = Redo
+
+import StrikeThrough from './strikethrough/index.js'
+MenuConstructors.strikeThrough = StrikeThrough
+
+import Underline from './underline/index.js'
+MenuConstructors.underline = Underline
+
+import Undo from './undo/index.js'
+MenuConstructors.undo = Undo
+
+import List from './list/index.js'
+MenuConstructors.list = List
+
+import Justify from './justify/index.js'
+MenuConstructors.justify = Justify
+
+import ForeColor from './foreColor/index.js'
+MenuConstructors.foreColor = ForeColor
+
+import BackColor from './backColor/index.js'
+MenuConstructors.backColor = BackColor
+
+import Quote from './quote/index.js'
+MenuConstructors.quote = Quote
+
+import Code from './code/index.js'
+MenuConstructors.code = Code
+
+import Emoticon from './emoticon/index.js'
+MenuConstructors.emoticon = Emoticon
+
+import Table from './table/index.js'
+MenuConstructors.table = Table
+
+import Video from './video/index.js'
+MenuConstructors.video = Video
+
+import Image from './img/index.js'
+MenuConstructors.image = Image
+
+// 吐出所有菜单集合
+export default MenuConstructors
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/panel.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/panel.js
new file mode 100644
index 0000000..78af878
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/panel.js
@@ -0,0 +1,195 @@
+/*
+    panel
+*/
+
+import $ from '../util/dom-core.js'
+import replaceLang from '../util/replace-lang.js'
+const emptyFn = () => {}
+
+// 记录已经显示 panel 的菜单
+let _isCreatedPanelMenus = []
+
+// 构造函数
+function Panel(menu, opt) {
+    this.menu = menu
+    this.opt = opt
+}
+
+// 原型
+Panel.prototype = {
+    constructor: Panel,
+
+    // 显示(插入DOM)
+    show: function () {
+        const menu = this.menu
+        if (_isCreatedPanelMenus.indexOf(menu) >= 0) {
+            // 该菜单已经创建了 panel 不能再创建
+            return
+        }
+
+        const editor = menu.editor
+        const $body = $('body')
+        const $textContainerElem = editor.$textContainerElem
+        const opt = this.opt
+
+        // panel 的容器
+        const $container = $('<div class="w-e-panel-container"></div>')
+        const width = opt.width || 300 // 默认 300px
+        $container.css('width', width + 'px')
+                .css('margin-left', (0 - width)/2 + 'px')
+
+        // 添加关闭按钮
+        const $closeBtn = $('<i class="w-e-icon-close w-e-panel-close"></i>')
+        $container.append($closeBtn)
+        $closeBtn.on('click', () => {
+            this.hide()
+        })
+
+        // 准备 tabs 容器
+        const $tabTitleContainer = $('<ul class="w-e-panel-tab-title"></ul>')
+        const $tabContentContainer = $('<div class="w-e-panel-tab-content"></div>')
+        $container.append($tabTitleContainer).append($tabContentContainer)
+
+        // 设置高度
+        const height = opt.height
+        if (height) {
+            $tabContentContainer.css('height', height + 'px').css('overflow-y', 'auto')
+        }
+        
+        // tabs
+        const tabs = opt.tabs || []
+        const tabTitleArr = []
+        const tabContentArr = []
+        tabs.forEach((tab, tabIndex) => {
+            if (!tab) {
+                return
+            }
+            let title = tab.title || ''
+            let tpl = tab.tpl || ''
+
+            // 替换多语言
+            title = replaceLang(editor, title)
+            tpl = replaceLang(editor, tpl)
+
+            // 添加到 DOM
+            const $title = $(`<li class="w-e-item">${title}</li>`)
+            $tabTitleContainer.append($title)
+            const $content = $(tpl)
+            $tabContentContainer.append($content)
+
+            // 记录到内存
+            $title._index = tabIndex
+            tabTitleArr.push($title)
+            tabContentArr.push($content)
+
+            // 设置 active 项
+            if (tabIndex === 0) {
+                $title._active = true
+                $title.addClass('w-e-active')
+            } else {
+                $content.hide()
+            }
+
+            // 绑定 tab 的事件
+            $title.on('click', e => {
+                if ($title._active) {
+                    return
+                }
+                // 隐藏所有的 tab
+                tabTitleArr.forEach($title => {
+                    $title._active = false
+                    $title.removeClass('w-e-active')
+                })
+                tabContentArr.forEach($content => {
+                    $content.hide()
+                })
+
+                // 显示当前的 tab
+                $title._active = true
+                $title.addClass('w-e-active')
+                $content.show()
+            })
+        })
+
+        // 绑定关闭事件
+        $container.on('click', e => {
+            // 点击时阻止冒泡
+            e.stopPropagation()
+        })
+        $body.on('click', e => {
+            this.hide()
+        })
+
+        // 添加到 DOM
+        $textContainerElem.append($container)
+
+        // 绑定 opt 的事件,只有添加到 DOM 之后才能绑定成功
+        tabs.forEach((tab, index) => {
+            if (!tab) {
+                return
+            }
+            const events = tab.events || []
+            events.forEach(event => {
+                const selector = event.selector
+                const type = event.type
+                const fn = event.fn || emptyFn
+                const $content = tabContentArr[index]
+                $content.find(selector).on(type, (e) => {
+                    e.stopPropagation()
+                    const needToHide = fn(e)
+                    // 执行完事件之后,是否要关闭 panel
+                    if (needToHide) {
+                        this.hide()
+                    }
+                })
+            })
+        })
+
+        // focus 第一个 elem
+        let $inputs = $container.find('input[type=text],textarea')
+        if ($inputs.length) {
+            $inputs.get(0).focus()
+        }
+
+        // 添加到属性
+        this.$container = $container
+
+        // 隐藏其他 panel
+        this._hideOtherPanels()
+        // 记录该 menu 已经创建了 panel
+        _isCreatedPanelMenus.push(menu)
+    },
+
+    // 隐藏(移除DOM)
+    hide: function () {
+        const menu = this.menu
+        const $container = this.$container
+        if ($container) {
+            $container.remove()
+        }
+
+        // 将该 menu 记录中移除
+        _isCreatedPanelMenus = _isCreatedPanelMenus.filter(item => {
+            if (item === menu) {
+                return false
+            } else {
+                return true
+            }
+        })
+    },
+
+    // 一个 panel 展示时,隐藏其他 panel
+    _hideOtherPanels: function () {
+        if (!_isCreatedPanelMenus.length) {
+            return
+        }
+        _isCreatedPanelMenus.forEach(menu => {
+            const panel = menu.panel || {}
+            if (panel.hide) {
+                panel.hide()
+            }
+        })
+    }
+}
+
+export default Panel
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/quote/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/quote/index.js
new file mode 100644
index 0000000..a57146f
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/quote/index.js
@@ -0,0 +1,75 @@
+/*
+    menu - quote
+*/
+import $ from '../../util/dom-core.js'
+import { UA } from '../../util/util.js'
+
+// 构造函数
+function Quote(editor) {
+    this.editor = editor
+    this.$elem = $(
+        `<div class="w-e-menu">
+            <i class="w-e-icon-quotes-left"><i/>
+        </div>`
+    )
+    this.type = 'click'
+
+    // 当前是否 active 状态
+    this._active = false
+}
+
+// 原型
+Quote.prototype = {
+    constructor: Quote,
+
+    onClick: function (e) {
+        const editor = this.editor
+        const $selectionElem = editor.selection.getSelectionContainerElem()
+        const nodeName = $selectionElem.getNodeName()
+
+        if (!UA.isIE()) {
+            if (nodeName === 'BLOCKQUOTE') {
+                // 撤销 quote
+                editor.cmd.do('formatBlock', '<P>')
+            } else {
+                // 转换为 quote
+                editor.cmd.do('formatBlock', '<BLOCKQUOTE>')
+            }
+            return
+        }
+        
+        // IE 中不支持 formatBlock <BLOCKQUOTE> ,要用其他方式兼容
+        let content, $targetELem
+        if (nodeName === 'P') {
+            // 将 P 转换为 quote
+            content = $selectionElem.text()
+            $targetELem = $(`<blockquote>${content}</blockquote>`)
+            $targetELem.insertAfter($selectionElem)
+            $selectionElem.remove()
+            return
+        }
+        if (nodeName === 'BLOCKQUOTE') {
+            // 撤销 quote
+            content = $selectionElem.text()
+            $targetELem = $(`<p>${content}</p>`)
+            $targetELem.insertAfter($selectionElem)
+            $selectionElem.remove()
+        }
+    },
+
+    tryChangeActive: function (e) {
+        const editor = this.editor
+        const $elem = this.$elem
+        const reg = /^BLOCKQUOTE$/i
+        const cmdValue = editor.cmd.queryCommandValue('formatBlock')
+        if (reg.test(cmdValue)) {
+            this._active = true
+            $elem.addClass('w-e-active')
+        } else {
+            this._active = false
+            $elem.removeClass('w-e-active')
+        }
+    }
+}
+
+export default Quote
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/redo/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/redo/index.js
new file mode 100644
index 0000000..9e20080
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/redo/index.js
@@ -0,0 +1,35 @@
+/*
+    redo-menu
+*/
+import $ from '../../util/dom-core.js'
+
+// 构造函数
+function Redo(editor) {
+    this.editor = editor
+    this.$elem = $(
+        `<div class="w-e-menu">
+            <i class="w-e-icon-redo"><i/>
+        </div>`
+    )
+    this.type = 'click'
+
+    // 当前是否 active 状态
+    this._active = false
+}
+
+// 原型
+Redo.prototype = {
+    constructor: Redo,
+
+    // 点击事件
+    onClick: function (e) {
+        // 点击菜单将触发这里
+
+        const editor = this.editor
+
+        // 执行 redo 命令
+        editor.cmd.do('redo')
+    }
+}
+
+export default Redo
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/strikethrough/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/strikethrough/index.js
new file mode 100644
index 0000000..476fc39
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/strikethrough/index.js
@@ -0,0 +1,60 @@
+/*
+    strikeThrough-menu
+*/
+import $ from '../../util/dom-core.js'
+
+// 构造函数
+function StrikeThrough(editor) {
+    this.editor = editor
+    this.$elem = $(
+        `<div class="w-e-menu">
+            <i class="w-e-icon-strikethrough"><i/>
+        </div>`
+    )
+    this.type = 'click'
+
+    // 当前是否 active 状态
+    this._active = false
+}
+
+// 原型
+StrikeThrough.prototype = {
+    constructor: StrikeThrough,
+
+    // 点击事件
+    onClick: function (e) {
+        // 点击菜单将触发这里
+        
+        const editor = this.editor
+        const isSeleEmpty = editor.selection.isSelectionEmpty()
+
+        if (isSeleEmpty) {
+            // 选区是空的,插入并选中一个“空白”
+            editor.selection.createEmptyRange()
+        }
+
+        // 执行 strikeThrough 命令
+        editor.cmd.do('strikeThrough')
+
+        if (isSeleEmpty) {
+            // 需要将选取折叠起来
+            editor.selection.collapseRange()
+            editor.selection.restoreSelection()
+        }
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function (e) {
+        const editor = this.editor
+        const $elem = this.$elem
+        if (editor.cmd.queryCommandState('strikeThrough')) {
+            this._active = true
+            $elem.addClass('w-e-active')
+        } else {
+            this._active = false
+            $elem.removeClass('w-e-active')
+        }
+    }
+}
+
+export default StrikeThrough
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/table/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/table/index.js
new file mode 100644
index 0000000..a99b918
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/table/index.js
@@ -0,0 +1,376 @@
+/*
+    menu - table
+*/
+import $ from '../../util/dom-core.js'
+import { getRandom } from '../../util/util.js'
+import Panel from '../panel.js'
+
+// 构造函数
+function Table(editor) {
+    this.editor = editor
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-table2"><i/></div>')
+    this.type = 'panel'
+
+    // 当前是否 active 状态
+    this._active = false
+}
+
+// 原型
+Table.prototype = {
+    constructor: Table,
+
+    onClick: function () {
+        if (this._active) {
+            // 编辑现有表格
+            this._createEditPanel()
+        } else {
+            // 插入新表格
+            this._createInsertPanel()
+        }
+    },
+
+    // 创建插入新表格的 panel
+    _createInsertPanel: function () {
+        // 用到的 id
+        const btnInsertId = getRandom('btn')
+        const textRowNum = getRandom('row')
+        const textColNum = getRandom('col')
+
+        const panel = new Panel(this, {
+            width: 250,
+            // panel 包含多个 tab
+            tabs: [
+                {
+                    // 标题
+                    title: '插入表格',
+                    // 模板
+                    tpl: `<div>
+                        <p style="text-align:left; padding:5px 0;">
+                            创建
+                            <input id="${textRowNum}" type="text" value="5" style="width:40px;text-align:center;"/>
+                            行
+                            <input id="${textColNum}" type="text" value="5" style="width:40px;text-align:center;"/>
+                            列的表格
+                        </p>
+                        <div class="w-e-button-container">
+                            <button id="${btnInsertId}" class="right">插入</button>
+                        </div>
+                    </div>`,
+                    // 事件绑定
+                    events: [
+                        {
+                            // 点击按钮,插入表格
+                            selector: '#' + btnInsertId,
+                            type: 'click',
+                            fn: () => {
+                                const rowNum = parseInt($('#' + textRowNum).val())
+                                const colNum = parseInt($('#' + textColNum).val())
+
+                                if (rowNum && colNum && rowNum > 0 && colNum > 0) {
+                                    // form 数据有效
+                                    this._insert(rowNum, colNum)
+                                }
+
+                                // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                                return true
+                            }
+                        }
+                    ]
+                } // first tab end
+            ]  // tabs end
+        }) // panel end
+
+        // 展示 panel
+        panel.show()
+
+        // 记录属性
+        this.panel = panel
+    },
+
+    // 插入表格
+    _insert: function (rowNum, colNum) {
+        // 拼接 table 模板
+        let r, c
+        let html = '<table border="0" width="100%" cellpadding="0" cellspacing="0">'
+        for (r = 0; r < rowNum; r++) {
+            html += '<tr>'
+            if (r === 0) {
+                for (c = 0; c < colNum; c++) {
+                    html += '<th>&nbsp;</th>'
+                }
+            } else {
+                for (c = 0; c < colNum; c++) {
+                    html += '<td>&nbsp;</td>'
+                }
+            }
+            html += '</tr>'
+        }
+        html += '</table><p><br></p>'
+
+        // 执行命令
+        const editor = this.editor
+        editor.cmd.do('insertHTML', html)
+
+        // 防止 firefox 下出现 resize 的控制点
+        editor.cmd.do('enableObjectResizing', false)
+        editor.cmd.do('enableInlineTableEditing', false)
+    },
+
+    // 创建编辑表格的 panel
+    _createEditPanel: function () {
+        // 可用的 id
+        const addRowBtnId = getRandom('add-row')
+        const addColBtnId = getRandom('add-col')
+        const delRowBtnId = getRandom('del-row')
+        const delColBtnId = getRandom('del-col')
+        const delTableBtnId = getRandom('del-table')
+
+        // 创建 panel 对象
+        const panel = new Panel(this, {
+            width: 320,
+            // panel 包含多个 tab
+            tabs: [
+                {
+                    // 标题
+                    title: '编辑表格',
+                    // 模板
+                    tpl: `<div>
+                        <div class="w-e-button-container" style="border-bottom:1px solid #f1f1f1;padding-bottom:5px;margin-bottom:5px;">
+                            <button id="${addRowBtnId}" class="left">增加行</button>
+                            <button id="${delRowBtnId}" class="red left">删除行</button>
+                            <button id="${addColBtnId}" class="left">增加列</button>
+                            <button id="${delColBtnId}" class="red left">删除列</button>
+                        </div>
+                        <div class="w-e-button-container">
+                            <button id="${delTableBtnId}" class="gray left">删除表格</button>
+                        </dv>
+                    </div>`,
+                    // 事件绑定
+                    events: [
+                        {
+                            // 增加行
+                            selector: '#' + addRowBtnId,
+                            type: 'click',
+                            fn: () => {
+                                this._addRow()
+                                // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                                return true
+                            }
+                        },
+                        {
+                            // 增加列
+                            selector: '#' + addColBtnId,
+                            type: 'click',
+                            fn: () => {
+                                this._addCol()
+                                // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                                return true
+                            }
+                        },
+                        {
+                            // 删除行
+                            selector: '#' + delRowBtnId,
+                            type: 'click',
+                            fn: () => {
+                                this._delRow()
+                                // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                                return true
+                            }
+                        },
+                        {
+                            // 删除列
+                            selector: '#' + delColBtnId,
+                            type: 'click',
+                            fn: () => {
+                                this._delCol()
+                                // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                                return true
+                            }
+                        },
+                        {
+                            // 删除表格
+                            selector: '#' + delTableBtnId,
+                            type: 'click',
+                            fn: () => {
+                                this._delTable()
+                                // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                                return true
+                            }
+                        }
+                    ]
+                }
+            ]
+        })
+        // 显示 panel
+        panel.show()
+    },
+
+    // 获取选中的单元格的位置信息
+    _getLocationData: function () {
+        const result = {}
+        const editor = this.editor
+        const $selectionELem = editor.selection.getSelectionContainerElem()
+        if (!$selectionELem) {
+            return
+        }
+        const nodeName = $selectionELem.getNodeName()
+        if (nodeName !== 'TD' && nodeName !== 'TH') {
+            return
+        }
+
+        // 获取 td index
+        const $tr = $selectionELem.parent()
+        const $tds = $tr.children()
+        const tdLength = $tds.length
+        $tds.forEach((td, index) => {
+            if (td === $selectionELem[0]) {
+                // 记录并跳出循环
+                result.td = {
+                    index: index,
+                    elem: td,
+                    length: tdLength
+                }
+                return false
+            }
+        })
+
+        // 获取 tr index
+        const $tbody = $tr.parent()
+        const $trs = $tbody.children()
+        const trLength = $trs.length
+        $trs.forEach((tr, index) => {
+            if (tr === $tr[0]) {
+                // 记录并跳出循环
+                result.tr = {
+                    index: index,
+                    elem: tr,
+                    length: trLength
+                }
+                return false
+            }
+        })
+
+        // 返回结果
+        return result
+    },
+
+    // 增加行
+    _addRow: function () {
+        // 获取当前单元格的位置信息
+        const locationData = this._getLocationData()
+        if (!locationData) {
+            return
+        }
+        const trData = locationData.tr
+        const $currentTr = $(trData.elem)
+        const tdData = locationData.td
+        const tdLength = tdData.length
+
+        // 拼接即将插入的字符串
+        const newTr = document.createElement('tr')
+        let tpl = '', i
+        for (i = 0; i < tdLength; i++) {
+            tpl += '<td>&nbsp;</td>'
+        }
+        newTr.innerHTML = tpl
+        // 插入
+        $(newTr).insertAfter($currentTr)
+    },
+
+    // 增加列
+    _addCol: function () {
+        // 获取当前单元格的位置信息
+        const locationData = this._getLocationData()
+        if (!locationData) {
+            return
+        }
+        const trData = locationData.tr
+        const tdData = locationData.td
+        const tdIndex = tdData.index
+        const $currentTr = $(trData.elem)
+        const $trParent = $currentTr.parent()
+        const $trs = $trParent.children()
+
+        // 遍历所有行
+        $trs.forEach(tr => {
+            const $tr = $(tr)
+            const $tds = $tr.children()
+            const $currentTd = $tds.get(tdIndex)
+            const name = $currentTd.getNodeName().toLowerCase()
+
+            // new 一个 td,并插入
+            const newTd = document.createElement(name)
+            $(newTd).insertAfter($currentTd)
+        })
+    },
+
+    // 删除行
+    _delRow: function () {
+        // 获取当前单元格的位置信息
+        const locationData = this._getLocationData()
+        if (!locationData) {
+            return
+        }
+        const trData = locationData.tr
+        const $currentTr = $(trData.elem)
+        $currentTr.remove()
+    },
+
+    // 删除列
+    _delCol: function () {
+        // 获取当前单元格的位置信息
+        const locationData = this._getLocationData()
+        if (!locationData) {
+            return
+        }
+        const trData = locationData.tr
+        const tdData = locationData.td
+        const tdIndex = tdData.index
+        const $currentTr = $(trData.elem)
+        const $trParent = $currentTr.parent()
+        const $trs = $trParent.children()
+
+        // 遍历所有行
+        $trs.forEach(tr => {
+            const $tr = $(tr)
+            const $tds = $tr.children()
+            const $currentTd = $tds.get(tdIndex)
+            // 删除
+            $currentTd.remove()
+        })
+    },
+
+    // 删除表格
+    _delTable: function () {
+        const editor = this.editor
+        const $selectionELem = editor.selection.getSelectionContainerElem()
+        if (!$selectionELem) {
+            return
+        }
+        const $table = $selectionELem.parentUntil('table')
+        if (!$table) {
+            return
+        }
+        $table.remove()
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function (e) {
+        const editor = this.editor
+        const $elem = this.$elem
+        const $selectionELem = editor.selection.getSelectionContainerElem()
+        if (!$selectionELem) {
+            return
+        }
+        const nodeName = $selectionELem.getNodeName()
+        if (nodeName === 'TD' || nodeName === 'TH') {
+            this._active = true
+            $elem.addClass('w-e-active')
+        } else {
+            this._active = false
+            $elem.removeClass('w-e-active')
+        }
+    }
+}
+
+export default Table
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/underline/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/underline/index.js
new file mode 100644
index 0000000..dcaa6da
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/underline/index.js
@@ -0,0 +1,60 @@
+/*
+    underline-menu
+*/
+import $ from '../../util/dom-core.js'
+
+// 构造函数
+function Underline(editor) {
+    this.editor = editor
+    this.$elem = $(
+        `<div class="w-e-menu">
+            <i class="w-e-icon-underline"><i/>
+        </div>`
+    )
+    this.type = 'click'
+
+    // 当前是否 active 状态
+    this._active = false
+}
+
+// 原型
+Underline.prototype = {
+    constructor: Underline,
+
+    // 点击事件
+    onClick: function (e) {
+        // 点击菜单将触发这里
+        
+        const editor = this.editor
+        const isSeleEmpty = editor.selection.isSelectionEmpty()
+
+        if (isSeleEmpty) {
+            // 选区是空的,插入并选中一个“空白”
+            editor.selection.createEmptyRange()
+        }
+
+        // 执行 underline 命令
+        editor.cmd.do('underline')
+
+        if (isSeleEmpty) {
+            // 需要将选取折叠起来
+            editor.selection.collapseRange()
+            editor.selection.restoreSelection()
+        }
+    },
+
+    // 试图改变 active 状态
+    tryChangeActive: function (e) {
+        const editor = this.editor
+        const $elem = this.$elem
+        if (editor.cmd.queryCommandState('underline')) {
+            this._active = true
+            $elem.addClass('w-e-active')
+        } else {
+            this._active = false
+            $elem.removeClass('w-e-active')
+        }
+    }
+}
+
+export default Underline
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/undo/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/undo/index.js
new file mode 100644
index 0000000..26ad7db
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/undo/index.js
@@ -0,0 +1,35 @@
+/*
+    undo-menu
+*/
+import $ from '../../util/dom-core.js'
+
+// 构造函数
+function Undo(editor) {
+    this.editor = editor
+    this.$elem = $(
+        `<div class="w-e-menu">
+            <i class="w-e-icon-undo"><i/>
+        </div>`
+    )
+    this.type = 'click'
+
+    // 当前是否 active 状态
+    this._active = false
+}
+
+// 原型
+Undo.prototype = {
+    constructor: Undo,
+
+    // 点击事件
+    onClick: function (e) {
+        // 点击菜单将触发这里
+
+        const editor = this.editor
+
+        // 执行 undo 命令
+        editor.cmd.do('undo')
+    }
+}
+
+export default Undo
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/menus/video/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/video/index.js
new file mode 100644
index 0000000..634ee6c
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/menus/video/index.js
@@ -0,0 +1,86 @@
+/*
+    menu - video
+*/
+import $ from '../../util/dom-core.js'
+import { getRandom } from '../../util/util.js'
+import Panel from '../panel.js'
+
+// 构造函数
+function Video(editor) {
+    this.editor = editor
+    this.$elem = $('<div class="w-e-menu"><i class="w-e-icon-play"><i/></div>')
+    this.type = 'panel'
+
+    // 当前是否 active 状态
+    this._active = false
+}
+
+// 原型
+Video.prototype = {
+    constructor: Video,
+
+    onClick: function () {
+        this._createPanel()
+    },
+
+    _createPanel: function () {
+        // 创建 id
+        const textValId = getRandom('text-val')
+        const btnId = getRandom('btn')
+
+        // 创建 panel
+        const panel = new Panel(this, {
+            width: 350,
+            // 一个 panel 多个 tab
+            tabs: [
+                {
+                    // 标题
+                    title: '插入视频',
+                    // 模板
+                    tpl: `<div>
+                        <input id="${textValId}" type="text" class="block" placeholder="格式如:<iframe src=... ><\/iframe>"/>
+                        <div class="w-e-button-container">
+                            <button id="${btnId}" class="right">插入</button>
+                        </div>
+                    </div>`,
+                    // 事件绑定
+                    events: [
+                        {
+                            selector: '#' + btnId,
+                            type: 'click',
+                            fn: () => {
+                                const $text = $('#' + textValId)
+                                const val = $text.val().trim()
+
+                                // 测试用视频地址
+                                // <iframe height=498 width=510 src='http://player.youku.com/embed/XMjcwMzc3MzM3Mg==' frameborder=0 'allowfullscreen'></iframe>
+
+                                if (val) {
+                                    // 插入视频
+                                    this._insert(val)
+                                }
+
+                                // 返回 true,表示该事件执行完之后,panel 要关闭。否则 panel 不会关闭
+                                return true
+                            }
+                        }
+                    ]
+                } // first tab end
+            ] // tabs end
+        }) // panel end
+
+        // 显示 panel
+        panel.show()
+
+        // 记录属性
+        this.panel = panel
+    },
+
+    // 插入视频
+    _insert: function (val) {
+        const editor = this.editor
+        editor.cmd.do('insertHTML', val + '<p><br></p>')
+    }
+}
+
+export default Video
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/selection/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/selection/index.js
new file mode 100644
index 0000000..ea844b1
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/selection/index.js
@@ -0,0 +1,186 @@
+/*
+    selection range API
+*/
+
+import $ from '../util/dom-core.js'
+import { UA } from '../util/util.js'
+
+// 构造函数
+function API(editor) {
+    this.editor = editor
+    this._currentRange = null
+}
+
+// 修改原型
+API.prototype = {
+    constructor: API,
+
+    // 获取 range 对象
+    getRange: function () {
+        return this._currentRange
+    },
+
+    // 保存选区
+    saveRange: function (_range) {
+        if (_range) {
+            // 保存已有选区
+            this._currentRange = _range
+            return
+        }
+
+        // 获取当前的选区
+        const selection = window.getSelection()
+        if (selection.rangeCount === 0) {
+            return
+        }
+        const range = selection.getRangeAt(0)
+
+        // 判断选区内容是否在编辑内容之内
+        const $containerElem = this.getSelectionContainerElem(range)
+        if (!$containerElem) {
+            return
+        }
+        const editor = this.editor
+        const $textElem = editor.$textElem
+        if ($textElem.isContain($containerElem)) {
+            // 是编辑内容之内的
+            this._currentRange = range
+        }
+    },
+
+    // 折叠选区
+    collapseRange: function (toStart) {
+        if (toStart == null) {
+            // 默认为 false
+            toStart = false
+        }
+        const range = this._currentRange
+        if (range) {
+            range.collapse(toStart)
+        }
+    },
+
+    // 选中区域的文字
+    getSelectionText: function () {
+        const range = this._currentRange
+        if (range) {
+            return this._currentRange.toString()
+        } else {
+            return ''
+        }
+    },
+
+    // 选区的 $Elem
+    getSelectionContainerElem: function (range) {
+        range = range || this._currentRange
+        let elem
+        if (range) {
+            elem = range.commonAncestorContainer
+            return $(
+                elem.nodeType === 1 ? elem : elem.parentNode
+            )
+        }
+    },
+    getSelectionStartElem: function (range) {
+        range = range || this._currentRange
+        let elem
+        if (range) {
+            elem = range.startContainer
+            return $(
+                elem.nodeType === 1 ? elem : elem.parentNode
+            )
+        }
+    },
+    getSelectionEndElem: function (range) {
+        range = range || this._currentRange
+        let elem
+        if (range) {
+            elem = range.endContainer
+            return $(
+                elem.nodeType === 1 ? elem : elem.parentNode
+            )
+        }
+    },
+
+    // 选区是否为空
+    isSelectionEmpty: function () {
+        const range = this._currentRange
+        if (range && range.startContainer) {
+            if (range.startContainer === range.endContainer) {
+                if (range.startOffset === range.endOffset) {
+                    return true
+                }
+            }
+        }
+        return false
+    },
+
+    // 恢复选区
+    restoreSelection: function () {
+        const selection = window.getSelection()
+        selection.removeAllRanges()
+        selection.addRange(this._currentRange)
+    },
+
+    // 创建一个空白(即 &#8203 字符)选区
+    createEmptyRange: function () {
+        const editor = this.editor
+        const range = this.getRange()
+        let $elem
+
+        if (!range) {
+            // 当前无 range
+            return
+        }
+        if (!this.isSelectionEmpty()) {
+            // 当前选区必须没有内容才可以
+            return
+        }
+
+        try {
+            // 目前只支持 webkit 内核
+            if (UA.isWebkit()) {
+                // 插入 &#8203
+                editor.cmd.do('insertHTML', '&#8203;')
+                // 修改 offset 位置
+                range.setEnd(range.endContainer, range.endOffset + 1)
+                // 存储
+                this.saveRange(range)
+            } else {
+                $elem = $('<strong>&#8203;</strong>')
+                editor.cmd.do('insertElem', $elem)
+                this.createRangeByElem($elem, true)
+            }
+        } catch (ex) {
+            // 部分情况下会报错,兼容一下
+        }
+    },
+
+    // 根据 $Elem 设置选区
+    createRangeByElem: function ($elem, toStart, isContent) {
+        // $elem - 经过封装的 elem
+        // toStart - true 开始位置,false 结束位置
+        // isContent - 是否选中Elem的内容
+        if (!$elem.length) {
+            return
+        }
+
+        const elem = $elem[0]
+        const range = document.createRange()
+
+        if (isContent) {
+            range.selectNodeContents(elem)
+        } else {
+            range.selectNode(elem)
+        }
+
+        if (typeof toStart === 'boolean') {
+            range.collapse(toStart)
+        }
+
+        // 存储 range
+        this.saveRange(range)
+    }
+}
+
+export default API
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/text/index.js b/novel-admin/src/main/resources/static/wangEditor/src/js/text/index.js
new file mode 100644
index 0000000..f697b6c
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/text/index.js
@@ -0,0 +1,551 @@
+/*
+    编辑区域
+*/
+
+import $ from '../util/dom-core.js'
+import { getPasteText, getPasteHtml, getPasteImgs } from '../util/paste-handle.js'
+import { UA, isFunction } from '../util/util.js'
+
+// 获取一个 elem.childNodes 的 JSON 数据
+function getChildrenJSON($elem) {
+    const result = []
+    const $children = $elem.childNodes() || [] // 注意 childNodes() 可以获取文本节点
+    $children.forEach(curElem => {
+        let elemResult
+        const nodeType = curElem.nodeType
+
+        // 文本节点
+        if (nodeType === 3) {
+            elemResult = curElem.textContent
+        }
+
+        // 普通 DOM 节点
+        if (nodeType === 1) {
+            elemResult = {}
+
+            // tag
+            elemResult.tag = curElem.nodeName.toLowerCase()
+            // attr
+            const attrData = []
+            const attrList = curElem.attributes || {}
+            const attrListLength = attrList.length || 0
+            for (let i = 0; i < attrListLength; i++) {
+                const attr = attrList[i]
+                attrData.push({
+                    name: attr.name,
+                    value: attr.value
+                })
+            }
+            elemResult.attrs = attrData
+            // children(递归)
+            elemResult.children = getChildrenJSON($(curElem))
+        }
+
+        result.push(elemResult)
+    })
+    return result
+}
+
+// 构造函数
+function Text(editor) {
+    this.editor = editor
+}
+
+// 修改原型
+Text.prototype = {
+    constructor: Text,
+
+    // 初始化
+    init: function () {
+        // 绑定事件
+        this._bindEvent()
+    },
+
+    // 清空内容
+    clear: function () {
+        this.html('<p><br></p>')
+    },
+
+    // 获取 设置 html
+    html: function (val) {
+        const editor = this.editor
+        const $textElem = editor.$textElem
+        let html
+        if (val == null) {
+            html = $textElem.html()
+            // 未选中任何内容的时候点击“加粗”或者“斜体”等按钮,就得需要一个空的占位符 &#8203 ,这里替换掉
+            html = html.replace(/\u200b/gm, '')
+            return html
+        } else {
+            $textElem.html(val)
+
+            // 初始化选取,将光标定位到内容尾部
+            editor.initSelection()
+        }
+    },
+
+    // 获取 JSON
+    getJSON: function () {
+        const editor = this.editor
+        const $textElem = editor.$textElem
+        return getChildrenJSON($textElem)
+    },
+
+    // 获取 设置 text
+    text: function (val) {
+        const editor = this.editor
+        const $textElem = editor.$textElem
+        let text
+        if (val == null) {
+            text = $textElem.text()
+            // 未选中任何内容的时候点击“加粗”或者“斜体”等按钮,就得需要一个空的占位符 &#8203 ,这里替换掉
+            text = text.replace(/\u200b/gm, '')
+            return text
+        } else {
+            $textElem.text(`<p>${val}</p>`)
+
+            // 初始化选取,将光标定位到内容尾部
+            editor.initSelection()
+        }
+    },
+
+    // 追加内容
+    append: function (html) {
+        const editor = this.editor
+        const $textElem = editor.$textElem
+        $textElem.append($(html))
+
+        // 初始化选取,将光标定位到内容尾部
+        editor.initSelection()
+    },
+
+    // 绑定事件
+    _bindEvent: function () {
+        // 实时保存选取
+        this._saveRangeRealTime()
+
+        // 按回车建时的特殊处理
+        this._enterKeyHandle()
+
+        // 清空时保留 <p><br></p>
+        this._clearHandle()
+
+        // 粘贴事件(粘贴文字,粘贴图片)
+        this._pasteHandle()
+
+        // tab 特殊处理
+        this._tabHandle()
+
+        // img 点击
+        this._imgHandle()
+
+        // 拖拽事件
+        this._dragHandle()
+    },
+
+    // 实时保存选取
+    _saveRangeRealTime: function () {
+        const editor = this.editor
+        const $textElem = editor.$textElem
+
+        // 保存当前的选区
+        function saveRange(e) {
+            // 随时保存选区
+            editor.selection.saveRange()
+            // 更新按钮 ative 状态
+            editor.menus.changeActive()
+        }
+        // 按键后保存
+        $textElem.on('keyup', saveRange)
+        $textElem.on('mousedown', e => {
+            // mousedown 状态下,鼠标滑动到编辑区域外面,也需要保存选区
+            $textElem.on('mouseleave', saveRange)
+        })
+        $textElem.on('mouseup', e => {
+            saveRange()
+            // 在编辑器区域之内完成点击,取消鼠标滑动到编辑区外面的事件
+            $textElem.off('mouseleave', saveRange)
+        })
+    },
+
+    // 按回车键时的特殊处理
+    _enterKeyHandle: function () {
+        const editor = this.editor
+        const $textElem = editor.$textElem
+
+        function insertEmptyP ($selectionElem) {
+            const $p = $('<p><br></p>')
+            $p.insertBefore($selectionElem)
+            editor.selection.createRangeByElem($p, true)
+            editor.selection.restoreSelection()
+            $selectionElem.remove()
+        }
+
+        // 将回车之后生成的非 <p> 的顶级标签,改为 <p>
+        function pHandle(e) {
+            const $selectionElem = editor.selection.getSelectionContainerElem()
+            const $parentElem = $selectionElem.parent()
+
+            if ($parentElem.html() === '<code><br></code>') {
+                // 回车之前光标所在一个 <p><code>.....</code></p> ,忽然回车生成一个空的 <p><code><br></code></p>
+                // 而且继续回车跳不出去,因此只能特殊处理
+                insertEmptyP($selectionElem)
+                return
+            }
+
+            if (!$parentElem.equal($textElem)) {
+                // 不是顶级标签
+                return
+            }
+
+            const nodeName = $selectionElem.getNodeName()
+            if (nodeName === 'P') {
+                // 当前的标签是 P ,不用做处理
+                return
+            }
+
+            if ($selectionElem.text()) {
+                // 有内容,不做处理
+                return
+            }
+
+            // 插入 <p> ,并将选取定位到 <p>,删除当前标签
+            insertEmptyP($selectionElem)
+        }
+
+        $textElem.on('keyup', e => {
+            if (e.keyCode !== 13) {
+                // 不是回车键
+                return
+            }
+            // 将回车之后生成的非 <p> 的顶级标签,改为 <p>
+            pHandle(e)
+        })
+
+        // <pre><code></code></pre> 回车时 特殊处理
+        function codeHandle(e) {
+            const $selectionElem = editor.selection.getSelectionContainerElem()
+            if (!$selectionElem) {
+                return
+            }
+            const $parentElem = $selectionElem.parent()
+            const selectionNodeName = $selectionElem.getNodeName()
+            const parentNodeName = $parentElem.getNodeName()
+
+            if (selectionNodeName !== 'CODE' || parentNodeName !== 'PRE') {
+                // 不符合要求 忽略
+                return
+            }
+
+            if (!editor.cmd.queryCommandSupported('insertHTML')) {
+                // 必须原生支持 insertHTML 命令
+                return
+            }
+
+            // 处理:光标定位到代码末尾,联系点击两次回车,即跳出代码块
+            if (editor._willBreakCode === true) {
+                // 此时可以跳出代码块
+                // 插入 <p> ,并将选取定位到 <p>
+                const $p = $('<p><br></p>')
+                $p.insertAfter($parentElem)
+                editor.selection.createRangeByElem($p, true)
+                editor.selection.restoreSelection()
+
+                // 修改状态
+                editor._willBreakCode = false
+
+                e.preventDefault()
+                return
+            }
+
+            const _startOffset = editor.selection.getRange().startOffset
+
+            // 处理:回车时,不能插入 <br> 而是插入 \n ,因为是在 pre 标签里面
+            editor.cmd.do('insertHTML', '\n')
+            editor.selection.saveRange()
+            if (editor.selection.getRange().startOffset === _startOffset) {
+                // 没起作用,再来一遍
+                editor.cmd.do('insertHTML', '\n')
+            }
+
+            const codeLength = $selectionElem.html().length
+            if (editor.selection.getRange().startOffset + 1 === codeLength) {
+                // 说明光标在代码最后的位置,执行了回车操作
+                // 记录下来,以便下次回车时候跳出 code
+                editor._willBreakCode = true
+            }
+
+            // 阻止默认行为
+            e.preventDefault()
+        }
+
+        $textElem.on('keydown', e => {
+            if (e.keyCode !== 13) {
+                // 不是回车键
+                // 取消即将跳转代码块的记录
+                editor._willBreakCode = false
+                return
+            }
+            // <pre><code></code></pre> 回车时 特殊处理
+            codeHandle(e)
+        })
+    },
+
+    // 清空时保留 <p><br></p>
+    _clearHandle: function () {
+        const editor = this.editor
+        const $textElem = editor.$textElem
+
+        $textElem.on('keydown', e => {
+            if (e.keyCode !== 8) {
+                return
+            }
+            const txtHtml = $textElem.html().toLowerCase().trim()
+            if (txtHtml === '<p><br></p>') {
+                // 最后剩下一个空行,就不再删除了
+                e.preventDefault()
+                return
+            }
+        })
+
+        $textElem.on('keyup', e => {
+            if (e.keyCode !== 8) {
+                return
+            }
+            let $p
+            const txtHtml = $textElem.html().toLowerCase().trim()
+
+            // firefox 时用 txtHtml === '<br>' 判断,其他用 !txtHtml 判断
+            if (!txtHtml || txtHtml === '<br>') {
+                // 内容空了
+                $p = $('<p><br/></p>')
+                $textElem.html('') // 一定要先清空,否则在 firefox 下有问题
+                $textElem.append($p)
+                editor.selection.createRangeByElem($p, false, true)
+                editor.selection.restoreSelection()
+            }
+        })
+
+    },
+
+    // 粘贴事件(粘贴文字 粘贴图片)
+    _pasteHandle: function () {
+        const editor = this.editor
+        const config = editor.config
+        const pasteFilterStyle = config.pasteFilterStyle
+        const pasteTextHandle = config.pasteTextHandle
+        const $textElem = editor.$textElem
+
+        // 粘贴图片、文本的事件,每次只能执行一个
+        // 判断该次粘贴事件是否可以执行
+        let pasteTime = 0
+        function canDo() {
+            var now = Date.now()
+            var flag = false
+            if (now - pasteTime >= 500) {
+                // 间隔大于 500 ms ,可以执行
+                flag = true
+            }
+            pasteTime = now
+            return flag
+        }
+        function resetTime() {
+            pasteTime = 0
+        }
+
+        // 粘贴文字
+        $textElem.on('paste', e => {
+            if (UA.isIE()) {
+                return
+            } else {
+                // 阻止默认行为,使用 execCommand 的粘贴命令
+                e.preventDefault()
+            }
+
+            // 粘贴图片和文本,只能同时使用一个
+            if (!canDo()) {
+                return
+            }
+
+            // 获取粘贴的文字
+            let pasteHtml = getPasteHtml(e, pasteFilterStyle)
+            let pasteText = getPasteText(e)
+            pasteText = pasteText.replace(/\n/gm, '<br>')
+
+            const $selectionElem = editor.selection.getSelectionContainerElem()
+            if (!$selectionElem) {
+                return
+            }
+            const nodeName = $selectionElem.getNodeName()
+
+            // code 中只能粘贴纯文本
+            if (nodeName === 'CODE' || nodeName === 'PRE') {
+                if (pasteTextHandle && isFunction(pasteTextHandle)) {
+                    // 用户自定义过滤处理粘贴内容
+                    pasteText = '' + (pasteTextHandle(pasteText) || '')
+                }
+                editor.cmd.do('insertHTML', `<p>${pasteText}</p>`)
+                return
+            }
+
+            // 先放开注释,有问题再追查 ————
+            // // 表格中忽略,可能会出现异常问题
+            // if (nodeName === 'TD' || nodeName === 'TH') {
+            //     return
+            // }
+
+            if (!pasteHtml) {
+                // 没有内容,可继续执行下面的图片粘贴
+                resetTime()
+                return
+            }
+            try {
+                // firefox 中,获取的 pasteHtml 可能是没有 <ul> 包裹的 <li>
+                // 因此执行 insertHTML 会报错
+                if (pasteTextHandle && isFunction(pasteTextHandle)) {
+                    // 用户自定义过滤处理粘贴内容
+                    pasteHtml = '' + (pasteTextHandle(pasteHtml) || '')
+                }
+                editor.cmd.do('insertHTML', pasteHtml)
+            } catch (ex) {
+                // 此时使用 pasteText 来兼容一下
+                if (pasteTextHandle && isFunction(pasteTextHandle)) {
+                    // 用户自定义过滤处理粘贴内容
+                    pasteText = '' + (pasteTextHandle(pasteText) || '')
+                }
+                editor.cmd.do('insertHTML', `<p>${pasteText}</p>`)
+            }
+        })
+
+        // 粘贴图片
+        $textElem.on('paste', e => {
+            if (UA.isIE()) {
+                return
+            } else {
+                e.preventDefault()
+            }
+
+            // 粘贴图片和文本,只能同时使用一个
+            if (!canDo()) {
+                return
+            }
+
+            // 获取粘贴的图片
+            const pasteFiles = getPasteImgs(e)
+            if (!pasteFiles || !pasteFiles.length) {
+                return
+            }
+
+            // 获取当前的元素
+            const $selectionElem = editor.selection.getSelectionContainerElem()
+            if (!$selectionElem) {
+                return
+            }
+            const nodeName = $selectionElem.getNodeName()
+
+            // code 中粘贴忽略
+            if (nodeName === 'CODE' || nodeName === 'PRE') {
+                return
+            }
+
+            // 上传图片
+            const uploadImg = editor.uploadImg
+            uploadImg.uploadImg(pasteFiles)
+        })
+    },
+
+    // tab 特殊处理
+    _tabHandle: function () {
+        const editor = this.editor
+        const $textElem = editor.$textElem
+
+        $textElem.on('keydown', e => {
+            if (e.keyCode !== 9) {
+                return
+            }
+            if (!editor.cmd.queryCommandSupported('insertHTML')) {
+                // 必须原生支持 insertHTML 命令
+                return
+            }
+            const $selectionElem = editor.selection.getSelectionContainerElem()
+            if (!$selectionElem) {
+                return
+            }
+            const $parentElem = $selectionElem.parent()
+            const selectionNodeName = $selectionElem.getNodeName()
+            const parentNodeName = $parentElem.getNodeName()
+
+            if (selectionNodeName === 'CODE' && parentNodeName === 'PRE') {
+                // <pre><code> 里面
+                editor.cmd.do('insertHTML', '    ')
+            } else {
+                // 普通文字
+                editor.cmd.do('insertHTML', '&nbsp;&nbsp;&nbsp;&nbsp;')
+            }
+
+            e.preventDefault()
+        })
+
+    },
+
+    // img 点击
+    _imgHandle: function () {
+        const editor = this.editor
+        const $textElem = editor.$textElem
+
+        // 为图片增加 selected 样式
+        $textElem.on('click', 'img', function (e) {
+            const img = this
+            const $img = $(img)
+
+            if ($img.attr('data-w-e') === '1') {
+                // 是表情图片,忽略
+                return
+            }
+
+            // 记录当前点击过的图片
+            editor._selectedImg = $img
+
+            // 修改选区并 restore ,防止用户此时点击退格键,会删除其他内容
+            editor.selection.createRangeByElem($img)
+            editor.selection.restoreSelection()
+        })
+
+        // 去掉图片的 selected 样式
+        $textElem.on('click  keyup', e => {
+            if (e.target.matches('img')) {
+                // 点击的是图片,忽略
+                return
+            }
+            // 删除记录
+            editor._selectedImg = null
+        })
+    },
+
+    // 拖拽事件
+    _dragHandle: function () {
+        const editor = this.editor
+
+        // 禁用 document 拖拽事件
+        const $document = $(document)
+        $document.on('dragleave drop dragenter dragover', function (e) {
+            e.preventDefault()
+        })
+
+        // 添加编辑区域拖拽事件
+        const $textElem = editor.$textElem
+        $textElem.on('drop', function (e) {
+            e.preventDefault()
+            const files = e.dataTransfer && e.dataTransfer.files
+            if (!files || !files.length) {
+                return
+            }
+
+            // 上传图片
+            const uploadImg = editor.uploadImg
+            uploadImg.uploadImg(files)
+        })
+    }
+}
+
+export default Text
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/util/dom-core.js b/novel-admin/src/main/resources/static/wangEditor/src/js/util/dom-core.js
new file mode 100644
index 0000000..a14827b
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/util/dom-core.js
@@ -0,0 +1,488 @@
+/*
+    DOM 操作 API
+*/
+
+// 根据 html 代码片段创建 dom 对象
+function createElemByHTML(html) {
+    let div
+    div = document.createElement('div')
+    div.innerHTML = html
+    return div.children
+}
+
+// 是否是 DOM List
+function isDOMList(selector) {
+    if (!selector) {
+        return false
+    }
+    if (selector instanceof HTMLCollection || selector instanceof NodeList) {
+        return true
+    }
+    return false
+}
+
+// 封装 document.querySelectorAll
+function querySelectorAll(selector) {
+    const result = document.querySelectorAll(selector)
+    if (isDOMList(result)) {
+        return result
+    } else {
+        return [result]
+    }
+}
+
+// 记录所有的事件绑定
+const eventList = []
+
+// 创建构造函数
+function DomElement(selector) {
+    if (!selector) {
+        return
+    }
+
+    // selector 本来就是 DomElement 对象,直接返回
+    if (selector instanceof DomElement) {
+        return selector
+    }
+
+    this.selector = selector
+    const nodeType = selector.nodeType
+
+    // 根据 selector 得出的结果(如 DOM,DOM List)
+    let selectorResult = []
+    if (nodeType === 9) {
+        // document 节点
+        selectorResult = [selector]
+    } else if (nodeType === 1) {
+        // 单个 DOM 节点
+        selectorResult = [selector]
+    } else if (isDOMList(selector) || selector instanceof Array) {
+        // DOM List 或者数组
+        selectorResult = selector
+    } else if (typeof selector === 'string') {
+        // 字符串
+        selector = selector.replace('/\n/mg', '').trim()
+        if (selector.indexOf('<') === 0) {
+            // 如 <div>
+            selectorResult = createElemByHTML(selector)
+        } else {
+            // 如 #id .class
+            selectorResult = querySelectorAll(selector)
+        }
+    }
+
+    const length = selectorResult.length
+    if (!length) {
+        // 空数组
+        return this
+    }
+
+    // 加入 DOM 节点
+    let i
+    for (i = 0; i < length; i++) {
+        this[i] = selectorResult[i]
+    }
+    this.length = length
+}
+
+// 修改原型
+DomElement.prototype = {
+    constructor: DomElement,
+
+    // 类数组,forEach
+    forEach: function (fn) {
+        let i
+        for (i = 0; i < this.length; i++) {
+            const elem = this[i]
+            const result = fn.call(elem, elem, i)
+            if (result === false) {
+                break
+            }
+        }
+        return this
+    },
+
+    // clone
+    clone: function (deep) {
+        const cloneList = []
+        this.forEach(elem => {
+            cloneList.push(elem.cloneNode(!!deep))
+        })
+        return $(cloneList)
+    },
+
+    // 获取第几个元素
+    get: function (index) {
+        const length = this.length
+        if (index >= length) {
+            index = index % length
+        }
+        return $(this[index])
+    },
+
+    // 第一个
+    first: function () {
+        return this.get(0)
+    },
+
+    // 最后一个
+    last: function () {
+        const length = this.length
+        return this.get(length - 1)
+    },
+
+    // 绑定事件
+    on: function (type, selector, fn) {
+        // selector 不为空,证明绑定事件要加代理
+        if (!fn) {
+            fn = selector
+            selector = null
+        }
+
+        // type 是否有多个
+        let types = []
+        types = type.split(/\s+/)
+
+        return this.forEach(elem => {
+            types.forEach(type => {
+                if (!type) {
+                    return
+                }
+
+                // 记录下,方便后面解绑
+                eventList.push({
+                    elem: elem,
+                    type: type,
+                    fn: fn
+                })
+
+                if (!selector) {
+                    // 无代理
+                    elem.addEventListener(type, fn)
+                    return
+                }
+
+                // 有代理
+                elem.addEventListener(type, e => {
+                    const target = e.target
+                    if (target.matches(selector)) {
+                        fn.call(target, e)
+                    }
+                })
+            })
+        })
+    },
+
+    // 取消事件绑定
+    off: function (type, fn) {
+        return this.forEach(elem => {
+            elem.removeEventListener(type, fn)
+        })
+    },
+
+    // 获取/设置 属性
+    attr: function (key, val) {
+        if (val == null) {
+            // 获取值
+            return this[0].getAttribute(key)
+        } else {
+            // 设置值
+            return this.forEach(elem => {
+                elem.setAttribute(key, val)
+            })
+        }
+    },
+
+    // 添加 class
+    addClass: function(className) {
+        if (!className) {
+            return this
+        }
+        return this.forEach(elem => {
+            let arr
+            if (elem.className) {
+                // 解析当前 className 转换为数组
+                arr = elem.className.split(/\s/)
+                arr = arr.filter(item => {
+                    return !!item.trim()
+                })
+                // 添加 class
+                if (arr.indexOf(className) < 0) {
+                    arr.push(className)
+                }
+                // 修改 elem.class
+                elem.className = arr.join(' ')
+            } else {
+                elem.className = className
+            }
+        })
+    },
+
+    // 删除 class
+    removeClass: function (className) {
+        if (!className) {
+            return this
+        }
+        return this.forEach(elem => {
+            let arr
+            if (elem.className) {
+                // 解析当前 className 转换为数组
+                arr = elem.className.split(/\s/)
+                arr = arr.filter(item => {
+                    item = item.trim()
+                    // 删除 class
+                    if (!item || item === className) {
+                        return false
+                    }
+                    return true
+                })
+                // 修改 elem.class
+                elem.className = arr.join(' ')
+            }
+        })
+    },
+
+    // 修改 css
+    css: function (key, val) {
+        const currentStyle = `${key}:${val};`
+        return this.forEach(elem => {
+            const style = (elem.getAttribute('style') || '').trim()
+            let styleArr, resultArr = []
+            if (style) {
+                // 将 style 按照 ; 拆分为数组
+                styleArr = style.split(';')
+                styleArr.forEach(item => {
+                    // 对每项样式,按照 : 拆分为 key 和 value
+                    let arr = item.split(':').map(i => {
+                        return i.trim()
+                    })
+                    if (arr.length === 2) {
+                        resultArr.push(arr[0] + ':' + arr[1])
+                    }
+                })
+                // 替换或者新增
+                resultArr = resultArr.map(item => {
+                    if (item.indexOf(key) === 0) {
+                        return currentStyle
+                    } else {
+                        return item
+                    }
+                })
+                if (resultArr.indexOf(currentStyle) < 0) {
+                    resultArr.push(currentStyle)
+                }
+                // 结果
+                elem.setAttribute('style', resultArr.join('; '))
+            } else {
+                // style 无值
+                elem.setAttribute('style', currentStyle)
+            }
+        })
+    },
+
+    // 显示
+    show: function () {
+        return this.css('display', 'block')
+    },
+
+    // 隐藏
+    hide: function () {
+        return this.css('display', 'none')
+    },
+
+    // 获取子节点
+    children: function () {
+        const elem = this[0]
+        if (!elem) {
+            return null
+        }
+
+        return $(elem.children)
+    },
+
+    // 获取子节点(包括文本节点)
+    childNodes: function () {
+        const elem = this[0]
+        if (!elem) {
+            return null
+        }
+
+        return $(elem.childNodes)
+    },
+
+    // 增加子节点
+    append: function($children) {
+        return this.forEach(elem => {
+            $children.forEach(child => {
+                elem.appendChild(child)
+            })
+        })
+    },
+
+    // 移除当前节点
+    remove: function () {
+        return this.forEach(elem => {
+            if (elem.remove) {
+                elem.remove()
+            } else {
+                const parent = elem.parentElement
+                parent && parent.removeChild(elem)
+            }
+        })
+    },
+
+    // 是否包含某个子节点
+    isContain: function ($child) {
+        const elem = this[0]
+        const child = $child[0]
+        return elem.contains(child)
+    },
+
+    // 尺寸数据
+    getSizeData: function () {
+        const elem = this[0]
+        return elem.getBoundingClientRect()  // 可得到 bottom height left right top width 的数据
+    },
+
+    // 封装 nodeName
+    getNodeName: function () {
+        const elem = this[0]
+        return elem.nodeName
+    },
+
+    // 从当前元素查找
+    find: function (selector) {
+        const elem = this[0]
+        return $(elem.querySelectorAll(selector))
+    },
+
+    // 获取当前元素的 text
+    text: function (val) {
+        if (!val) {
+            // 获取 text
+            const elem = this[0]
+            return elem.innerHTML.replace(/<.*?>/g, () => '')
+        } else {
+            // 设置 text
+            return this.forEach(elem => {
+                elem.innerHTML = val
+            })
+        }
+    },
+
+    // 获取 html
+    html: function (value) {
+        const elem = this[0]
+        if (value == null) {
+            return elem.innerHTML
+        } else {
+            elem.innerHTML = value
+            return this
+        }
+    },
+
+    // 获取 value
+    val: function () {
+        const elem = this[0]
+        return elem.value.trim()
+    },
+
+    // focus
+    focus: function () {
+        return this.forEach(elem => {
+            elem.focus()
+        })
+    },
+
+    // parent
+    parent: function () {
+        const elem = this[0]
+        return $(elem.parentElement)
+    },
+
+    // parentUntil 找到符合 selector 的父节点
+    parentUntil: function (selector, _currentElem) {
+        const results = document.querySelectorAll(selector)
+        const length = results.length
+        if (!length) {
+            // 传入的 selector 无效
+            return null
+        }
+
+        const elem = _currentElem || this[0]
+        if (elem.nodeName === 'BODY') {
+            return null
+        }
+
+        const parent = elem.parentElement
+        let i
+        for (i = 0; i < length; i++) {
+            if (parent === results[i]) {
+                // 找到,并返回
+                return $(parent)
+            }
+        }
+
+        // 继续查找
+        return this.parentUntil(selector, parent)
+    },
+
+    // 判断两个 elem 是否相等
+    equal: function ($elem) {
+        if ($elem.nodeType === 1) {
+            return this[0] === $elem
+        } else {
+            return this[0] === $elem[0]
+        }
+    },
+
+    // 将该元素插入到某个元素前面
+    insertBefore: function (selector) {
+        const $referenceNode = $(selector)
+        const referenceNode = $referenceNode[0]
+        if (!referenceNode) {
+            return this
+        }
+        return this.forEach(elem => {
+            const parent = referenceNode.parentNode
+            parent.insertBefore(elem, referenceNode)
+        })
+    },
+
+    // 将该元素插入到某个元素后面
+    insertAfter: function (selector) {
+        const $referenceNode = $(selector)
+        const referenceNode = $referenceNode[0]
+        if (!referenceNode) {
+            return this
+        }
+        return this.forEach(elem => {
+            const parent = referenceNode.parentNode
+            if (parent.lastChild === referenceNode) {
+                // 最后一个元素
+                parent.appendChild(elem)
+            } else {
+                // 不是最后一个元素
+                parent.insertBefore(elem, referenceNode.nextSibling)
+            }
+        })
+    }
+}
+
+// new 一个对象
+function $(selector) {
+    return new DomElement(selector)
+}
+
+// 解绑所有事件,用于销毁编辑器
+$.offAll = function () {
+    eventList.forEach(item => {
+        const elem = item.elem
+        const type = item.type
+        const fn = item.fn
+        // 解绑
+        elem.removeEventListener(type, fn)
+    })
+}
+
+export default $
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/util/paste-handle.js b/novel-admin/src/main/resources/static/wangEditor/src/js/util/paste-handle.js
new file mode 100644
index 0000000..2a872ac
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/util/paste-handle.js
@@ -0,0 +1,86 @@
+/*
+    粘贴信息的处理
+*/
+
+import $ from './dom-core.js'
+import { replaceHtmlSymbol } from './util.js'
+import { objForEach } from './util.js'
+
+// 获取粘贴的纯文本
+export function getPasteText(e) {
+    const clipboardData = e.clipboardData || (e.originalEvent && e.originalEvent.clipboardData)
+    let pasteText
+    if (clipboardData == null) {
+        pasteText = window.clipboardData && window.clipboardData.getData('text')
+    } else {
+        pasteText = clipboardData.getData('text/plain')
+    }
+
+    return replaceHtmlSymbol(pasteText)
+}
+
+// 获取粘贴的html
+export function getPasteHtml(e, filterStyle) {
+    const clipboardData = e.clipboardData || (e.originalEvent && e.originalEvent.clipboardData)
+    let pasteText, pasteHtml
+    if (clipboardData == null) {
+        pasteText = window.clipboardData && window.clipboardData.getData('text')
+    } else {
+        pasteText = clipboardData.getData('text/plain')
+        pasteHtml = clipboardData.getData('text/html')
+    }
+    if (!pasteHtml && pasteText) {
+        pasteHtml = '<p>' + replaceHtmlSymbol(pasteText) + '</p>'
+    }
+    if (!pasteHtml) {
+        return
+    }
+
+    // 过滤word中状态过来的无用字符
+    const docSplitHtml = pasteHtml.split('</html>')
+    if (docSplitHtml.length === 2) {
+        pasteHtml = docSplitHtml[0]
+    }
+
+    // 过滤无用标签
+    pasteHtml = pasteHtml.replace(/<(meta|script|link).+?>/igm, '')
+    // 去掉注释
+    pasteHtml = pasteHtml.replace(/<!--.*?-->/mg, '')
+    // 过滤 data-xxx 属性
+    pasteHtml = pasteHtml.replace(/\s?data-.+?=('|").+?('|")/igm, '')
+
+    if (filterStyle) {
+        // 过滤样式
+        pasteHtml = pasteHtml.replace(/\s?(class|style)=('|").+?('|")/igm, '')
+    } else {
+        // 保留样式
+        pasteHtml = pasteHtml.replace(/\s?class=('|").+?('|")/igm, '')
+    }
+
+    return pasteHtml
+}
+
+// 获取粘贴的图片文件
+export function getPasteImgs(e) {
+    const result = []
+    const txt = getPasteText(e)
+    if (txt) {
+        // 有文字,就忽略图片
+        return result
+    }
+
+    const clipboardData = e.clipboardData || (e.originalEvent && e.originalEvent.clipboardData) || {}
+    const items = clipboardData.items
+    if (!items) {
+        return result
+    }
+
+    objForEach(items, (key, value) => {
+        const type = value.type
+        if (/image/i.test(type)) {
+            result.push(value.getAsFile())
+        }
+    })
+
+    return result
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/util/poly-fill.js b/novel-admin/src/main/resources/static/wangEditor/src/js/util/poly-fill.js
new file mode 100644
index 0000000..7842024
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/util/poly-fill.js
@@ -0,0 +1,48 @@
+/*
+    poly-fill
+*/
+
+export default function () {
+
+    // Object.assign
+    if (typeof Object.assign != 'function') {
+        Object.assign = function(target, varArgs) { // .length of function is 2
+            if (target == null) { // TypeError if undefined or null
+                throw new TypeError('Cannot convert undefined or null to object')
+            }
+
+            var to = Object(target)
+
+            for (var index = 1; index < arguments.length; index++) {
+                var nextSource = arguments[index]
+
+                if (nextSource != null) { // Skip over if undefined or null
+                    for (var nextKey in nextSource) {
+                        // Avoid bugs when hasOwnProperty is shadowed
+                        if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {
+                            to[nextKey] = nextSource[nextKey]
+                        }
+                    }
+                }
+            }
+            return to
+        }
+    }
+
+    // IE 中兼容 Element.prototype.matches
+    if (!Element.prototype.matches) {
+        Element.prototype.matches = 
+            Element.prototype.matchesSelector || 
+            Element.prototype.mozMatchesSelector ||
+            Element.prototype.msMatchesSelector || 
+            Element.prototype.oMatchesSelector || 
+            Element.prototype.webkitMatchesSelector ||
+            function(s) {
+                var matches = (this.document || this.ownerDocument).querySelectorAll(s),
+                    i = matches.length;
+                while (--i >= 0 && matches.item(i) !== this) {}
+                return i > -1;            
+            };
+    }
+
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/util/replace-lang.js b/novel-admin/src/main/resources/static/wangEditor/src/js/util/replace-lang.js
new file mode 100644
index 0000000..db5e797
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/util/replace-lang.js
@@ -0,0 +1,21 @@
+/*
+    替换多语言
+ */
+
+export default function (editor, str) {
+    const langArgs = editor.config.langArgs || []
+    let result = str
+
+    langArgs.forEach(item => {
+        const reg = item.reg
+        const val = item.val
+
+        if (reg.test(result)) {
+            result = result.replace(reg, function () {
+                return val
+            })
+        }
+    })
+
+    return result
+}
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/js/util/util.js b/novel-admin/src/main/resources/static/wangEditor/src/js/util/util.js
new file mode 100644
index 0000000..ee95222
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/js/util/util.js
@@ -0,0 +1,71 @@
+/*
+    工具
+*/
+
+// 和 UA 相关的属性
+export const UA = {
+    _ua: navigator.userAgent,
+
+    // 是否 webkit
+    isWebkit: function () {
+        const reg = /webkit/i
+        return reg.test(this._ua)
+    },
+
+    // 是否 IE
+    isIE: function () {
+        return 'ActiveXObject' in window
+    }
+}
+
+// 遍历对象
+export function objForEach(obj, fn) {
+    let key, result
+    for (key in obj) {
+        if (obj.hasOwnProperty(key)) {
+            result = fn.call(obj, key, obj[key])
+            if (result === false) {
+                break
+            }
+        }
+    }
+}
+
+// 遍历类数组
+export function arrForEach(fakeArr, fn) {
+    let i, item, result
+    const length = fakeArr.length || 0
+    for (i = 0; i < length; i++) {
+        item = fakeArr[i]
+        result = fn.call(fakeArr, item, i)
+        if (result === false) {
+            break
+        }
+    }
+}
+
+// 获取随机数
+export function getRandom(prefix) {
+    return prefix + Math.random().toString().slice(2)
+}
+
+// 替换 html 特殊字符
+export function replaceHtmlSymbol(html) {
+    if (html == null) {
+        return ''
+    }
+    return html.replace(/</gm, '&lt;')
+                .replace(/>/gm, '&gt;')
+                .replace(/"/gm, '&quot;')
+}
+
+// 返回百分比的格式
+export function percentFormat(number) {
+    number = (parseInt(number * 100))
+    return number + '%'
+}
+
+// 判断是不是 function
+export function isFunction(fn) {
+    return typeof fn === 'function'
+}
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/less/common.less b/novel-admin/src/main/resources/static/wangEditor/src/less/common.less
new file mode 100644
index 0000000..6cc866a
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/less/common.less
@@ -0,0 +1,19 @@
+.w-e-toolbar,
+.w-e-text-container,
+.w-e-menu-panel {
+    padding: 0;
+    margin: 0;
+    box-sizing: border-box;
+
+    * {
+        padding: 0;
+        margin: 0;
+        box-sizing: border-box;
+    }
+}
+
+.w-e-clear-fix:after {
+    content: "";
+    display: table;
+    clear: both;
+}
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/less/droplist.less b/novel-admin/src/main/resources/static/wangEditor/src/less/droplist.less
new file mode 100644
index 0000000..bb399d5
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/less/droplist.less
@@ -0,0 +1,48 @@
+.w-e-toolbar {
+    .w-e-droplist {
+        position: absolute;
+        left: 0;
+        top: 0;
+        background-color: #fff;
+        border: 1px solid #f1f1f1;
+        border-right-color: #ccc;
+        border-bottom-color: #ccc;
+
+        .w-e-dp-title {
+            text-align: center;
+            color: #999;
+            line-height: 2;
+            border-bottom: 1px solid #f1f1f1;
+            font-size: 13px;
+        }
+
+        ul.w-e-list {
+            list-style: none;
+            line-height: 1;
+
+            li.w-e-item {
+                color: #333;
+                padding: 5px 0;
+
+                &:hover {
+                    background-color: #f1f1f1;
+                }
+            }
+        }
+        
+        ul.w-e-block {
+            list-style: none;
+            text-align: left;
+            padding: 5px;
+
+            li.w-e-item {
+                display: inline-block;
+                padding: 3px 5px;
+
+                &:hover {
+                    background-color: #f1f1f1;
+                }
+            }
+        }
+    }   
+}
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/less/icon.less b/novel-admin/src/main/resources/static/wangEditor/src/less/icon.less
new file mode 100644
index 0000000..c81c1e3
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/less/icon.less
@@ -0,0 +1,102 @@
+@font-face {
+  font-family: 'w-e-icon';
+  src:  url('fonts/w-e-icon.woff?ddq1c7')  format('truetype');
+  font-weight: normal;
+  font-style: normal;
+}
+
+[class^="w-e-icon-"], [class*=" w-e-icon-"] {
+  /* use !important to prevent issues with browser extensions that change fonts */
+  font-family: 'w-e-icon' !important;
+  speak: none;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.w-e-icon-close:before {
+  content: "\f00d";
+}
+.w-e-icon-upload2:before {
+  content: "\e9c6";
+}
+.w-e-icon-trash-o:before {
+  content: "\f014";
+}
+.w-e-icon-header:before {
+  content: "\f1dc";
+}
+.w-e-icon-pencil2:before {
+  content: "\e906";
+}
+.w-e-icon-paint-brush:before {
+  content: "\f1fc";
+}
+.w-e-icon-image:before {
+  content: "\e90d";
+}
+.w-e-icon-play:before {
+  content: "\e912";
+}
+.w-e-icon-location:before {
+  content: "\e947";
+}
+.w-e-icon-undo:before {
+  content: "\e965";
+}
+.w-e-icon-redo:before {
+  content: "\e966";
+}
+.w-e-icon-quotes-left:before {
+  content: "\e977";
+}
+.w-e-icon-list-numbered:before {
+  content: "\e9b9";
+}
+.w-e-icon-list2:before {
+  content: "\e9bb";
+}
+.w-e-icon-link:before {
+  content: "\e9cb";
+}
+.w-e-icon-happy:before {
+  content: "\e9df";
+}
+.w-e-icon-bold:before {
+  content: "\ea62";
+}
+.w-e-icon-underline:before {
+  content: "\ea63";
+}
+.w-e-icon-italic:before {
+  content: "\ea64";
+}
+.w-e-icon-strikethrough:before {
+  content: "\ea65";
+}
+.w-e-icon-table2:before {
+  content: "\ea71";
+}
+.w-e-icon-paragraph-left:before {
+  content: "\ea77";
+}
+.w-e-icon-paragraph-center:before {
+  content: "\ea78";
+}
+.w-e-icon-paragraph-right:before {
+  content: "\ea79";
+}
+.w-e-icon-terminal:before {
+  content: "\f120";
+}
+.w-e-icon-page-break:before {
+  content: "\ea68";
+}
+.w-e-icon-cancel-circle:before {
+  content: "\ea0d";
+}
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/less/menus.less b/novel-admin/src/main/resources/static/wangEditor/src/less/menus.less
new file mode 100644
index 0000000..68090e6
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/less/menus.less
@@ -0,0 +1,33 @@
+.w-e-toolbar {
+    display: flex;
+    padding: 0 5px;
+    /* flex-wrap: wrap; */
+
+    /* 单个菜单 */
+    .w-e-menu {
+        position: relative;
+        text-align: center;
+        padding: 5px 10px;
+        cursor: pointer;
+        
+        i {
+            color: #999;
+        }
+
+        &:hover {
+            i {
+                color: #333;
+            }
+        }
+    }
+    .w-e-active {
+        i {
+            color: #1e88e5;
+        }
+        &:hover {
+            i {
+                color: #1e88e5;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/less/panel.less b/novel-admin/src/main/resources/static/wangEditor/src/less/panel.less
new file mode 100644
index 0000000..bfc9151
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/less/panel.less
@@ -0,0 +1,159 @@
+.w-e-text-container {
+    .w-e-panel-container {
+        position: absolute;
+        top: 0;
+        left: 50%;
+        border: 1px solid #ccc;
+        border-top: 0;
+        box-shadow: 1px 1px 2px #ccc;
+        color: #333;
+        background-color: #fff;
+
+        .w-e-panel-close {
+            position: absolute;
+            right: 0;
+            top: 0;
+            padding: 5px;
+            margin: 2px 5px 0 0;
+            cursor: pointer;
+            color: #999;
+
+            &:hover {
+                color: #333;
+            }
+        }
+
+        .w-e-panel-tab-title {
+            list-style: none;
+            display: flex;
+            font-size: 14px;
+            margin: 2px 10px 0 10px;
+            border-bottom: 1px solid #f1f1f1;
+
+            .w-e-item {
+                padding: 3px 5px;
+                color: #999;
+                cursor: pointer;
+                margin: 0 3px;
+                position: relative;
+                top: 1px;
+            }
+
+            .w-e-active {
+                color: #333;
+                border-bottom: 1px solid #333;
+                cursor: default;
+                font-weight: 700;
+            }
+        }
+
+        .w-e-panel-tab-content {
+            padding: 10px 15px 10px 15px;
+            font-size: 16px;
+
+            /* 输入框的样式 */
+            input,textarea,button {
+                &:focus {
+                    outline: none;
+                }   
+            }
+            textarea {
+                width: 100%;
+                border: 1px solid #ccc;
+                padding: 5px;
+
+                &:focus {
+                    border-color: #1e88e5;
+                }
+            }
+            input[type=text] {
+                border: none;
+                border-bottom: 1px solid #ccc;
+                font-size: 14px;
+                height: 20px;
+                color: #333;
+                text-align: left;
+            }
+            input[type=text].small {
+                width: 30px;
+                text-align: center;
+            }
+
+            input[type=text].block {
+                display: block;
+                width: 100%;
+                margin: 10px 0;
+            }
+
+            input[type=text]:focus {
+                border-bottom: 2px solid #1e88e5;
+            }
+
+            /* 按钮的样式 */
+            .w-e-button-container {
+                button {
+                    font-size: 14px;
+                    color: #1e88e5;
+                    border: none;
+                    padding: 5px 10px;
+                    background-color: #fff;
+                    cursor: pointer;
+                    border-radius: 3px;
+                }
+                button.left {
+                    float: left;
+                    margin-right: 10px;
+                }
+
+                button.right {
+                    float: right;
+                    margin-left: 10px;
+                }
+
+                button.gray {
+                    color: #999;
+                }
+
+                button.red {
+                    color: rgb(194, 79, 74);
+                }
+
+                button:hover {
+                    background-color: #f1f1f1;
+                }
+            } 
+            .w-e-button-container:after {
+                content: "";
+                display: table;
+                clear: both;
+            }
+        }
+
+        /* 为 emotion panel 定制的样式 */
+        .w-e-emoticon-container {
+            .w-e-item {
+                cursor: pointer;
+                font-size: 18px;
+                padding: 0 3px;
+                display: inline-block;
+            }
+        }
+
+        /* 上传图片的 panel 定制样式 */
+        .w-e-up-img-container {
+            text-align: center;
+
+            .w-e-up-btn {
+                display: inline-block;
+                color: #999;
+                cursor: pointer;
+                font-size: 60px;
+                line-height: 1;
+
+                &:hover {
+                    color: #333;
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/novel-admin/src/main/resources/static/wangEditor/src/less/text.less b/novel-admin/src/main/resources/static/wangEditor/src/less/text.less
new file mode 100644
index 0000000..8974ad5
--- /dev/null
+++ b/novel-admin/src/main/resources/static/wangEditor/src/less/text.less
@@ -0,0 +1,77 @@
+.w-e-text-container {
+    position: relative;
+
+    .w-e-progress {
+        position: absolute;
+        background-color: #1e88e5;
+        bottom: 0;
+        left: 0;
+        height: 1px;
+    }
+}
+.w-e-text {
+    padding: 0 10px;
+    overflow-y: scroll;
+
+    p,h1,h2,h3,h4,h5,table,pre {
+        margin: 10px 0;
+        line-height: 1.5;
+    }
+
+    ul, ol {
+        margin: 10px 0 10px 20px;
+    }
+
+    blockquote {
+        display: block;
+        border-left: 8px solid #d0e5f2;
+        padding: 5px 10px;
+        margin: 10px 0;
+        line-height: 1.4;
+        font-size: 100%;
+        background-color: #f1f1f1;
+    }
+
+    code {
+        display: inline-block;
+        background-color: #f1f1f1;
+        border-radius: 3px;
+        padding: 3px 5px;
+        margin: 0 3px;
+    }
+
+    pre {
+
+        code {
+            display: block;
+        }
+    }
+
+    table {
+        border-top: 1px solid #ccc;
+        border-left: 1px solid #ccc;
+
+        td,th {
+            border-bottom: 1px solid #ccc;
+            border-right: 1px solid #ccc;
+            padding: 3px 5px;
+        }
+
+        th {
+            border-bottom: 2px solid #ccc;
+            text-align: center;
+        }
+    }
+
+    &:focus {
+        outline: none;
+    }
+
+    img {
+        cursor: pointer;
+
+        &:hover {
+            box-shadow: 0 0 5px #333;
+        }
+    }
+}
\ No newline at end of file
diff --git a/novel-front/src/main/resources/application.yml b/novel-front/src/main/resources/application.yml
index 78ae529..0b8e9a1 100644
--- a/novel-front/src/main/resources/application.yml
+++ b/novel-front/src/main/resources/application.yml
@@ -6,9 +6,9 @@ spring:
 #      url: jdbc:mysql://148.70.59.92:3306/books?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
 #      username: xiongxiaoyang
 #      password: Lzslov123!
-      url: jdbc:mysql://127.0.0.1:3306/books?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
-      username: books
-      password: books
+      url: jdbc:mysql://127.0.0.1:3306/books?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
+      username: root
+      password: test123456
   cache:
     ehcache:
       config: classpath:ehcache.xml
diff --git a/sql/2019-11-20.sql b/sql/2019-11-20.sql
index 376aec5..0a433d2 100644
--- a/sql/2019-11-20.sql
+++ b/sql/2019-11-20.sql
@@ -1,2 +1,62 @@
 INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('212', '209', '发布管理', 'books/book', 'books:book:book', '1', '', '2', NULL, NULL);
 INSERT INTO `sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES ('4087', '1', '212');
+
+
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('203', '202', '订单管理', 'test/order', 'test:order:order', '3', '', '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('75', '73', '刪除', 'system/sysDept/remove', 'system:sysDept:remove', '2', NULL, '2', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('6', '3', '用户管理', 'sys/user/', 'sys:user:user', '3', 'fa fa-user', '3', '2017-08-10 14:12:11', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('7', '3', '角色管理', 'sys/role', 'sys:role:role', '3', 'fa fa-paw', '3', '2017-08-10 14:13:19', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('92', '91', '在线用户', 'sys/online', '', '3', 'fa fa-user', NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('2', '3', '系统菜单', 'sys/menu/', 'sys:menu:menu', '3', 'fa fa-th-list', '2', '2017-08-09 22:55:15', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('27', '91', '系统日志', 'common/log', 'common:log', '3', 'fa fa-warning', '3', '2017-08-14 22:11:53', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('48', '77', '代码生成', 'common/generator', 'common:generator', '3', 'fa fa-code', '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('76', '73', '编辑', '/system/sysDept/edit', 'system:sysDept:edit', '2', NULL, '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('74', '73', '增加', '/system/sysDept/add', 'system:sysDept:add', '2', NULL, '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('73', '3', '部门管理', '/system/sysDept', 'system:sysDept:sysDept', '3', 'fa fa-users', '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('104', '77', 'swagger', '/swagger-ui.html', '', '3', '', NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('57', '91', '运行监控', '/druid/index.html', '', '3', 'fa fa-caret-square-o-right', '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('71', '3', '文件管理', '/common/sysFile', 'common:sysFile:sysFile', '3', 'fa fa-folder-open', '2', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('81', '78', '删除', '/common/dict/remove', 'common:dict:remove', '2', '', '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('80', '78', '编辑', '/common/dict/edit', 'common:dict:edit', '2', NULL, '2', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('83', '78', '批量删除', '/common/dict/batchRemove', 'common:dict:batchRemove', '2', '', '4', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('79', '78', '增加', '/common/dict/add', 'common:dict:add', '2', NULL, '2', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('78', '3', '数据字典', '/common/dict', 'common:dict:dict', '3', 'fa fa-book', '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('12', '6', '新增', '', 'sys:user:add', '2', '', '3', '2017-08-14 10:51:35', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('202', '3', '测试管理', '', '', '3', 'fa fa-s15', '12', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('204', '203', '新增', '', 'test:order:add', '2', '', NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('205', '203', '编辑', '', 'test:order:edit', '2', '', NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('13', '6', '编辑', '', 'sys:user:edit', '2', '', '3', '2017-08-14 10:52:06', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('91', '3', '系统监控', '', '', '3', 'fa fa-video-camera', '4', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('206', '203', '删除', '', 'test:order:remove', '2', '', NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('207', '203', '批量删除', '', 'test:order:batchRemove', '2', '', NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('208', '203', '详情', '', 'test:order:detail', '2', '', '3', NULL, NULL);
+
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('3', '3', '基础管理', '', '', '3', 'fa fa-bars', '3', '2017-08-09 22:49:47', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('77', '3', '研发工具', '', '', '3', 'fa fa-gear', '5', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('21', '2', '编辑', '', 'sys:menu:edit', '2', '', '3', '2017-08-14 10:59:56', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('62', '7', '批量删除', '', 'sys:role:batchRemove', '2', NULL, NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('61', '2', '批量删除', '', 'sys:menu:batchRemove', '2', NULL, NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('56', '7', '删除', '', 'sys:role:remove', '2', NULL, NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('55', '7', '编辑', '', 'sys:role:edit', '2', '', NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('15', '7', '新增', '', 'sys:role:add', '2', '', '3', '2017-08-14 10:56:37', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('20', '2', '新增', '', 'sys:menu:add', '2', '', '3', '2017-08-14 10:59:32', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('26', '6', '重置密码', '', 'sys:user:resetPwd', '2', '', '3', '2017-08-14 17:28:34', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('24', '6', '批量删除', '', 'sys:user:batchRemove', '2', '', '3', '2017-08-14 17:27:18', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('22', '2', '删除', '', 'sys:menu:remove', '2', '', '3', '2017-08-14 11:00:26', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('14', '6', '删除', NULL, 'sys:user:remove', '2', NULL, '3', '2017-08-14 10:52:24', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('30', '27', '清空', NULL, 'sys:log:clear', '2', NULL, '3', '2017-08-14 22:31:02', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('29', '27', '删除', NULL, 'sys:log:remove', '2', NULL, '3', '2017-08-14 22:30:43', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('28', '27', '刷新', NULL, 'sys:log:list', '2', NULL, '3', '2017-08-14 22:30:22', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('25', '6', '停用', NULL, 'sys:user:disable', '2', NULL, '3', '2017-08-14 17:27:43', NULL);
+
+
+INSERT INTO `sys_dict` (`id`, `name`, `value`, `type`, `description`, `sort`, `parent_id`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag`) VALUES ('123', '玄幻奇幻', '1', 'novel_category', '小说分类', '1', NULL, NULL, NULL, NULL, NULL, '', NULL);
+INSERT INTO `sys_dict` (`id`, `name`, `value`, `type`, `description`, `sort`, `parent_id`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag`) VALUES ('124', '武侠仙侠', '2', 'novel_category', '小说分类', '2', NULL, NULL, NULL, NULL, NULL, '', NULL);
+INSERT INTO `sys_dict` (`id`, `name`, `value`, `type`, `description`, `sort`, `parent_id`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag`) VALUES ('125', '都市言情', '3', 'novel_category', '小说分类', '3', NULL, NULL, NULL, NULL, NULL, '', NULL);
+INSERT INTO `sys_dict` (`id`, `name`, `value`, `type`, `description`, `sort`, `parent_id`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag`) VALUES ('126', '历史军事', '4', 'novel_category', '小说分类', '4', NULL, NULL, NULL, NULL, NULL, '', NULL);
+INSERT INTO `sys_dict` (`id`, `name`, `value`, `type`, `description`, `sort`, `parent_id`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag`) VALUES ('127', '科幻灵异', '5', 'novel_category', '小说分类', '5', NULL, NULL, NULL, NULL, NULL, '', NULL);
+INSERT INTO `sys_dict` (`id`, `name`, `value`, `type`, `description`, `sort`, `parent_id`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag`) VALUES ('128', '网游竞技', '6', 'novel_category', '小说分类', '6', NULL, NULL, NULL, NULL, NULL, '', NULL);
+INSERT INTO `sys_dict` (`id`, `name`, `value`, `type`, `description`, `sort`, `parent_id`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag`) VALUES ('129', '女生频道', '7', 'novel_category', '小说分类', '7', NULL, NULL, NULL, NULL, NULL, '', NULL);
+
+
+
diff --git a/sql/books.sql b/sql/books.sql
index 7b5f6ef..2408626 100644
--- a/sql/books.sql
+++ b/sql/books.sql
@@ -949,3 +949,65 @@ CREATE TABLE `user_ref_book` (
 -- ----------------------------
 -- Records of user_ref_book
 -- ----------------------------
+
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('212', '209', '发布管理', 'books/book', 'books:book:book', '1', '', '2', NULL, NULL);
+INSERT INTO `sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES ('4087', '1', '212');
+
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('203', '202', '订单管理', 'test/order', 'test:order:order', '3', '', '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('75', '73', '刪除', 'system/sysDept/remove', 'system:sysDept:remove', '2', NULL, '2', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('6', '3', '用户管理', 'sys/user/', 'sys:user:user', '3', 'fa fa-user', '3', '2017-08-10 14:12:11', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('7', '3', '角色管理', 'sys/role', 'sys:role:role', '3', 'fa fa-paw', '3', '2017-08-10 14:13:19', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('92', '91', '在线用户', 'sys/online', '', '3', 'fa fa-user', NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('2', '3', '系统菜单', 'sys/menu/', 'sys:menu:menu', '3', 'fa fa-th-list', '2', '2017-08-09 22:55:15', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('27', '91', '系统日志', 'common/log', 'common:log', '3', 'fa fa-warning', '3', '2017-08-14 22:11:53', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('48', '77', '代码生成', 'common/generator', 'common:generator', '3', 'fa fa-code', '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('76', '73', '编辑', '/system/sysDept/edit', 'system:sysDept:edit', '2', NULL, '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('74', '73', '增加', '/system/sysDept/add', 'system:sysDept:add', '2', NULL, '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('73', '3', '部门管理', '/system/sysDept', 'system:sysDept:sysDept', '3', 'fa fa-users', '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('104', '77', 'swagger', '/swagger-ui.html', '', '3', '', NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('57', '91', '运行监控', '/druid/index.html', '', '3', 'fa fa-caret-square-o-right', '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('71', '3', '文件管理', '/common/sysFile', 'common:sysFile:sysFile', '3', 'fa fa-folder-open', '2', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('81', '78', '删除', '/common/dict/remove', 'common:dict:remove', '2', '', '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('80', '78', '编辑', '/common/dict/edit', 'common:dict:edit', '2', NULL, '2', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('83', '78', '批量删除', '/common/dict/batchRemove', 'common:dict:batchRemove', '2', '', '4', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('79', '78', '增加', '/common/dict/add', 'common:dict:add', '2', NULL, '2', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('78', '3', '数据字典', '/common/dict', 'common:dict:dict', '3', 'fa fa-book', '3', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('12', '6', '新增', '', 'sys:user:add', '2', '', '3', '2017-08-14 10:51:35', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('202', '3', '测试管理', '', '', '3', 'fa fa-s15', '12', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('204', '203', '新增', '', 'test:order:add', '2', '', NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('205', '203', '编辑', '', 'test:order:edit', '2', '', NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('13', '6', '编辑', '', 'sys:user:edit', '2', '', '3', '2017-08-14 10:52:06', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('91', '3', '系统监控', '', '', '3', 'fa fa-video-camera', '4', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('206', '203', '删除', '', 'test:order:remove', '2', '', NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('207', '203', '批量删除', '', 'test:order:batchRemove', '2', '', NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('208', '203', '详情', '', 'test:order:detail', '2', '', '3', NULL, NULL);
+
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('3', '3', '基础管理', '', '', '3', 'fa fa-bars', '3', '2017-08-09 22:49:47', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('77', '3', '研发工具', '', '', '3', 'fa fa-gear', '5', NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('21', '2', '编辑', '', 'sys:menu:edit', '2', '', '3', '2017-08-14 10:59:56', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('62', '7', '批量删除', '', 'sys:role:batchRemove', '2', NULL, NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('61', '2', '批量删除', '', 'sys:menu:batchRemove', '2', NULL, NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('56', '7', '删除', '', 'sys:role:remove', '2', NULL, NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('55', '7', '编辑', '', 'sys:role:edit', '2', '', NULL, NULL, NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('15', '7', '新增', '', 'sys:role:add', '2', '', '3', '2017-08-14 10:56:37', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('20', '2', '新增', '', 'sys:menu:add', '2', '', '3', '2017-08-14 10:59:32', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('26', '6', '重置密码', '', 'sys:user:resetPwd', '2', '', '3', '2017-08-14 17:28:34', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('24', '6', '批量删除', '', 'sys:user:batchRemove', '2', '', '3', '2017-08-14 17:27:18', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('22', '2', '删除', '', 'sys:menu:remove', '2', '', '3', '2017-08-14 11:00:26', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('14', '6', '删除', NULL, 'sys:user:remove', '2', NULL, '3', '2017-08-14 10:52:24', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('30', '27', '清空', NULL, 'sys:log:clear', '2', NULL, '3', '2017-08-14 22:31:02', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('29', '27', '删除', NULL, 'sys:log:remove', '2', NULL, '3', '2017-08-14 22:30:43', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('28', '27', '刷新', NULL, 'sys:log:list', '2', NULL, '3', '2017-08-14 22:30:22', NULL);
+INSERT INTO `sys_menu` (`menu_id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `order_num`, `gmt_create`, `gmt_modified`) VALUES ('25', '6', '停用', NULL, 'sys:user:disable', '2', NULL, '3', '2017-08-14 17:27:43', NULL);
+
+
+INSERT INTO `sys_dict` (`id`, `name`, `value`, `type`, `description`, `sort`, `parent_id`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag`) VALUES ('123', '玄幻奇幻', '1', 'novel_category', '小说分类', '1', NULL, NULL, NULL, NULL, NULL, '', NULL);
+INSERT INTO `sys_dict` (`id`, `name`, `value`, `type`, `description`, `sort`, `parent_id`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag`) VALUES ('124', '武侠仙侠', '2', 'novel_category', '小说分类', '2', NULL, NULL, NULL, NULL, NULL, '', NULL);
+INSERT INTO `sys_dict` (`id`, `name`, `value`, `type`, `description`, `sort`, `parent_id`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag`) VALUES ('125', '都市言情', '3', 'novel_category', '小说分类', '3', NULL, NULL, NULL, NULL, NULL, '', NULL);
+INSERT INTO `sys_dict` (`id`, `name`, `value`, `type`, `description`, `sort`, `parent_id`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag`) VALUES ('126', '历史军事', '4', 'novel_category', '小说分类', '4', NULL, NULL, NULL, NULL, NULL, '', NULL);
+INSERT INTO `sys_dict` (`id`, `name`, `value`, `type`, `description`, `sort`, `parent_id`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag`) VALUES ('127', '科幻灵异', '5', 'novel_category', '小说分类', '5', NULL, NULL, NULL, NULL, NULL, '', NULL);
+INSERT INTO `sys_dict` (`id`, `name`, `value`, `type`, `description`, `sort`, `parent_id`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag`) VALUES ('128', '网游竞技', '6', 'novel_category', '小说分类', '6', NULL, NULL, NULL, NULL, NULL, '', NULL);
+INSERT INTO `sys_dict` (`id`, `name`, `value`, `type`, `description`, `sort`, `parent_id`, `create_by`, `create_date`, `update_by`, `update_date`, `remarks`, `del_flag`) VALUES ('129', '女生频道', '7', 'novel_category', '小说分类', '7', NULL, NULL, NULL, NULL, NULL, '', NULL);
+
+
+
diff --git a/sql/sql文件说明.txt b/sql/sql文件说明.txt
new file mode 100644
index 0000000..6981651
--- /dev/null
+++ b/sql/sql文件说明.txt
@@ -0,0 +1,3 @@
+books.sqlΪȫ��sql�ļ���yyyy-MM-dd.sqlΪ����sql�ļ���
+���û�ֻ��Ҫִ��books.sql�ļ����ɡ�
+���û����´���󣬸����ϴδ���ĸ���ʱ�䣬ִ�и�����֮�������sql�ļ���
\ No newline at end of file