请输入内容
-diff --git a/assets/120060.jpg b/assets/120060.jpg deleted file mode 100644 index 2e1fd02..0000000 Binary files a/assets/120060.jpg and /dev/null differ diff --git a/assets/1573592459699.png b/assets/1573592459699.png deleted file mode 100644 index 8b22156..0000000 Binary files a/assets/1573592459699.png and /dev/null differ diff --git a/assets/1588548668698.gif b/assets/1588548668698.gif deleted file mode 100644 index 5659f99..0000000 Binary files a/assets/1588548668698.gif and /dev/null differ diff --git a/assets/1588548784395.gif b/assets/1588548784395.gif deleted file mode 100644 index 212cbb3..0000000 Binary files a/assets/1588548784395.gif and /dev/null differ diff --git a/assets/1588548916980.gif b/assets/1588548916980.gif deleted file mode 100644 index e7d38c7..0000000 Binary files a/assets/1588548916980.gif and /dev/null differ diff --git a/assets/640x100.jpg b/assets/640x100.jpg deleted file mode 100644 index 72d6ae0..0000000 Binary files a/assets/640x100.jpg and /dev/null differ diff --git a/assets/IMG_1736.JPG b/assets/IMG_1736.JPG deleted file mode 100644 index e5c3c81..0000000 Binary files a/assets/IMG_1736.JPG and /dev/null differ diff --git a/assets/IMG_1737.JPG b/assets/IMG_1737.JPG deleted file mode 100644 index b616576..0000000 Binary files a/assets/IMG_1737.JPG and /dev/null differ diff --git a/assets/QQ20200520-215756.png b/assets/QQ20200520-215756.png deleted file mode 100644 index 6519ee2..0000000 Binary files a/assets/QQ20200520-215756.png and /dev/null differ diff --git a/assets/QQ图片20191018161330.jpg b/assets/QQ图片20191018161330.jpg deleted file mode 100644 index 382c485..0000000 Binary files a/assets/QQ图片20191018161330.jpg and /dev/null differ diff --git a/assets/QQ图片20191018161901.png b/assets/QQ图片20191018161901.png deleted file mode 100644 index c85b900..0000000 Binary files a/assets/QQ图片20191018161901.png and /dev/null differ diff --git a/assets/QQ图片20191018162208.jpg b/assets/QQ图片20191018162208.jpg deleted file mode 100644 index 7ecd37c..0000000 Binary files a/assets/QQ图片20191018162208.jpg and /dev/null differ diff --git a/assets/QQ图片20191108022250.png b/assets/QQ图片20191108022250.png deleted file mode 100644 index 903b0ea..0000000 Binary files a/assets/QQ图片20191108022250.png and /dev/null differ diff --git a/assets/android_index.png b/assets/android_index.png deleted file mode 100644 index ee94c31..0000000 Binary files a/assets/android_index.png and /dev/null differ diff --git a/assets/baijiahao.jpg b/assets/baijiahao.jpg deleted file mode 100644 index 6a32840..0000000 Binary files a/assets/baijiahao.jpg and /dev/null differ diff --git a/assets/chapter_manager.png b/assets/chapter_manager.png deleted file mode 100644 index 80913ce..0000000 Binary files a/assets/chapter_manager.png and /dev/null differ diff --git a/assets/chapter_pub.png b/assets/chapter_pub.png deleted file mode 100644 index 8b037c9..0000000 Binary files a/assets/chapter_pub.png and /dev/null differ diff --git a/assets/charset_config.png b/assets/charset_config.png deleted file mode 100644 index 3cfe6ef..0000000 Binary files a/assets/charset_config.png and /dev/null differ diff --git a/assets/craw_config.png b/assets/craw_config.png deleted file mode 100644 index fe521d7..0000000 Binary files a/assets/craw_config.png and /dev/null differ diff --git a/assets/crawl_config.png b/assets/crawl_config.png deleted file mode 100644 index 11a07e6..0000000 Binary files a/assets/crawl_config.png and /dev/null differ diff --git a/assets/crawl_index.png b/assets/crawl_index.png deleted file mode 100644 index 7731011..0000000 Binary files a/assets/crawl_index.png and /dev/null differ diff --git a/assets/crawl_pic.png b/assets/crawl_pic.png deleted file mode 100644 index bb68e8b..0000000 Binary files a/assets/crawl_pic.png and /dev/null differ diff --git a/assets/database_config.png b/assets/database_config.png deleted file mode 100644 index c71c726..0000000 Binary files a/assets/database_config.png and /dev/null differ diff --git a/assets/index_config.png b/assets/index_config.png deleted file mode 100644 index 9fae308..0000000 Binary files a/assets/index_config.png and /dev/null differ diff --git a/assets/jk.png b/assets/jk.png deleted file mode 100644 index 82a7203..0000000 Binary files a/assets/jk.png and /dev/null differ diff --git a/assets/jk_ali.png b/assets/jk_ali.png deleted file mode 100644 index 201acbd..0000000 Binary files a/assets/jk_ali.png and /dev/null differ diff --git a/assets/jk_wc.png b/assets/jk_wc.png deleted file mode 100644 index 7855a32..0000000 Binary files a/assets/jk_wc.png and /dev/null differ diff --git a/assets/login.png b/assets/login.png deleted file mode 100644 index bb8c221..0000000 Binary files a/assets/login.png and /dev/null differ diff --git a/assets/manhua_content.png b/assets/manhua_content.png deleted file mode 100644 index 1c4a158..0000000 Binary files a/assets/manhua_content.png and /dev/null differ diff --git a/assets/mh_content.png b/assets/mh_content.png deleted file mode 100644 index 82fe634..0000000 Binary files a/assets/mh_content.png and /dev/null differ diff --git a/assets/mh_index.png b/assets/mh_index.png deleted file mode 100644 index 9cf2965..0000000 Binary files a/assets/mh_index.png and /dev/null differ diff --git a/assets/mini-code.png b/assets/mini-code.png deleted file mode 100644 index 607065a..0000000 Binary files a/assets/mini-code.png and /dev/null differ diff --git a/assets/mini4.png b/assets/mini4.png deleted file mode 100644 index 1a23418..0000000 Binary files a/assets/mini4.png and /dev/null differ diff --git a/assets/novel_list.png b/assets/novel_list.png deleted file mode 100644 index e7f9274..0000000 Binary files a/assets/novel_list.png and /dev/null differ diff --git a/assets/novel_pub.png b/assets/novel_pub.png deleted file mode 100644 index b20f3c0..0000000 Binary files a/assets/novel_pub.png and /dev/null differ diff --git a/assets/oschina_tp.png b/assets/oschina_tp.png deleted file mode 100644 index 801a9cd..0000000 Binary files a/assets/oschina_tp.png and /dev/null differ diff --git a/assets/pc_all.png b/assets/pc_all.png deleted file mode 100644 index 24e557d..0000000 Binary files a/assets/pc_all.png and /dev/null differ diff --git a/assets/pc_catalog.png b/assets/pc_catalog.png deleted file mode 100644 index af5d108..0000000 Binary files a/assets/pc_catalog.png and /dev/null differ diff --git a/assets/pc_content1.png b/assets/pc_content1.png deleted file mode 100644 index 2f4cb95..0000000 Binary files a/assets/pc_content1.png and /dev/null differ diff --git a/assets/pc_content2.png b/assets/pc_content2.png deleted file mode 100644 index 5d261ab..0000000 Binary files a/assets/pc_content2.png and /dev/null differ diff --git a/assets/pc_detail.png b/assets/pc_detail.png deleted file mode 100644 index e66c038..0000000 Binary files a/assets/pc_detail.png and /dev/null differ diff --git a/assets/pc_index.png b/assets/pc_index.png deleted file mode 100644 index 600b16d..0000000 Binary files a/assets/pc_index.png and /dev/null differ diff --git a/assets/pc_rank.png b/assets/pc_rank.png deleted file mode 100644 index 3f1aca9..0000000 Binary files a/assets/pc_rank.png and /dev/null differ diff --git a/assets/pic_save_type.png b/assets/pic_save_type.png deleted file mode 100644 index 5c31e9b..0000000 Binary files a/assets/pic_save_type.png and /dev/null differ diff --git a/assets/qq_group.png b/assets/qq_group.png deleted file mode 100644 index 2de74b4..0000000 Binary files a/assets/qq_group.png and /dev/null differ diff --git a/assets/score_config.png b/assets/score_config.png deleted file mode 100644 index e6f665a..0000000 Binary files a/assets/score_config.png and /dev/null differ diff --git a/assets/springcloud.jpg b/assets/springcloud.jpg deleted file mode 100644 index d60bf3b..0000000 Binary files a/assets/springcloud.jpg and /dev/null differ diff --git a/assets/upload_config.png b/assets/upload_config.png deleted file mode 100644 index e5b6975..0000000 Binary files a/assets/upload_config.png and /dev/null differ diff --git a/assets/小说精品屋功能清单.bak b/assets/小说精品屋功能清单.bak deleted file mode 100644 index d904b72..0000000 Binary files a/assets/小说精品屋功能清单.bak and /dev/null differ diff --git a/assets/小说精品屋功能清单.twdx b/assets/小说精品屋功能清单.twdx deleted file mode 100644 index e991baf..0000000 Binary files a/assets/小说精品屋功能清单.twdx and /dev/null differ diff --git a/assets/小说精品屋开源项目交流群群二维码.png b/assets/小说精品屋开源项目交流群群二维码.png deleted file mode 100644 index 561e209..0000000 Binary files a/assets/小说精品屋开源项目交流群群二维码.png and /dev/null differ diff --git a/assets/小说精品屋开源项目交流群群聊二维码.png b/assets/小说精品屋开源项目交流群群聊二维码.png deleted file mode 100644 index 73204e0..0000000 Binary files a/assets/小说精品屋开源项目交流群群聊二维码.png and /dev/null differ diff --git a/assets/微信图片_20190904181558.png b/assets/微信图片_20190904181558.png deleted file mode 100644 index 60d1c0d..0000000 Binary files a/assets/微信图片_20190904181558.png and /dev/null differ diff --git a/assets/热门云产品1040.100.jpg b/assets/热门云产品1040.100.jpg deleted file mode 100644 index d798b98..0000000 Binary files a/assets/热门云产品1040.100.jpg and /dev/null differ diff --git a/assets/精品小说楼.png b/assets/精品小说楼.png deleted file mode 100644 index 11e3921..0000000 Binary files a/assets/精品小说楼.png and /dev/null differ diff --git a/assets/精品小说楼_轻小说专区.png b/assets/精品小说楼_轻小说专区.png deleted file mode 100644 index d36e9e2..0000000 Binary files a/assets/精品小说楼_轻小说专区.png and /dev/null differ diff --git a/doc/api/api.md b/doc/api/api.md deleted file mode 100644 index 89e9ba3..0000000 --- a/doc/api/api.md +++ /dev/null @@ -1,116 +0,0 @@ - -
作家后台章节管理页面需要请求该接口获取小说章节分页列表信息
- - -### 请求参数 -**Query** - -| 参数名称 | 是否必须 | 示例 | 备注 | -| ------------ | ------------ | ------------ | ------------ | -| bookId | 是 | 1334337530296893441 | 小说ID | -| curr | 否 | 1 | 查询页码,默认1 | -| limit | 否 | 5 | 分页大小,默认5 | - -### 返回数据 - -名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 | -
---|---|---|---|---|---|
code | number | 必须 | 响应状态吗,200表示成功 | ||
msg | string | 必须 | 响应信息 | ||
data | object | 必须 | 响应数据 | ||
├─ total | number | 必须 | 总数量 | ||
├─ list | object [] | 必须 | 章节数据集合 | item 类型: object | |
├─ id | string | 必须 | 章节ID | ||
├─ bookId | string | 必须 | 小说ID | ||
├─ indexName | string | 必须 | 章节名 | ||
├─ isVip | number | 必须 | 是否收费,1:收费,0:免费 | ||
├─ updateTime | string | 必须 | 更新时间 | ||
├─ pageNum | number | 必须 | 页码 | ||
├─ pageSize | number | 必须 | 分页大小 | ||
├─ size | number | 必须 | 当前页数量 |
作家后台章节管理页面点击删除按钮请求该接口删除小说章节内容
- - -### 请求参数 -**Headers** - -| 参数名称 | 参数值 | 是否必须 | 示例 | 备注 | -| ------------ | ------------ | ------------ | ------------ | ------------ | -| Content-Type | application/x-www-form-urlencoded | 是 | | | -| Authorization | | 是 | eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2MDgzNDg0NzksInN1YiI6IntcImlkXCI6MTI1NTA2MDMyODMyMjAyNzUyMCxcInVzZXJuYW1lXCI6XCIxMzU2MDQyMTMyNFwiLFwibmlja05hbWVcIjpcIjEzNTYwNDIxMzI0XCJ9IiwiY3JlYXRlZCI6MTYwNzc0MzY3OTkxM30.0qhwis_zPb6t8wGNejMhDZ2iHCL9Tgh2UHd1gcQBCp8t6RW3ggSwtfo4l_RgMT_v8jOkLW91GzTVWlNnTE6LCA | 认证JWT,请求登录接口成功后返回 | -**路径参数** - -| 参数名称 | 示例 | 备注 | -| ------------ | ------------ | ------------ | -| indexId | 1337603246936645632 | 章节ID | - -### 返回数据 - -名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 | -
---|---|---|---|---|---|
code | number | 必须 | 响应状态吗,200表示成功 | ||
msg | string | 必须 | 响应信息 |
作家后台章节发布页面点击提交按钮请求该接口新增小说章节内容
- - -### 请求参数 -**Headers** - -| 参数名称 | 参数值 | 是否必须 | 示例 | 备注 | -| ------------ | ------------ | ------------ | ------------ | ------------ | -| Content-Type | application/x-www-form-urlencoded | 是 | | | -| Authorization | | 是 | eyJhbGciOiJIUzUxMiJ9.eyJleHAiOjE2MDgzNDg0NzksInN1YiI6IntcImlkXCI6MTI1NTA2MDMyODMyMjAyNzUyMCxcInVzZXJuYW1lXCI6XCIxMzU2MDQyMTMyNFwiLFwibmlja05hbWVcIjpcIjEzNTYwNDIxMzI0XCJ9IiwiY3JlYXRlZCI6MTYwNzc0MzY3OTkxM30.0qhwis_zPb6t8wGNejMhDZ2iHCL9Tgh2UHd1gcQBCp8t6RW3ggSwtfo4l_RgMT_v8jOkLW91GzTVWlNnTE6LCA | 认证JWT,请求登录接口成功后返回 | -**Body** - -| 参数名称 | 参数类型 | 是否必须 | 示例 | 备注 | -| ------------ | ------------ | ------------ | ------------ | ------------ | -| bookId | text | 是 | 1334337530296893441 | 小说ID | -| indexName | text | 是 | 第六章未婚妻(下) | 章节名 | -| content | text | 是 | 开始之时,李七夜还是生疏无比,那怕他对于刀术的所有奥义了然于胸,但是,他出刀之时依然会颤抖,无法达到妙及巅毫的要求。 | 章节内容 | -| isVip | text | 是 | 1 | 是否收费,1:收费,0:免费 | - - - -### 返回数据 - -名称 | 类型 | 是否必须 | 默认值 | 备注 | 其他信息 | -
---|---|---|---|---|---|
code | number | 必须 | 响应状态吗,200表示成功 | ||
msg | string | 必须 | 响应信息 |
- 万火儿莫名其妙的重生了,而且从堂堂的金丹修士,直接坠落尘埃,变成天赋极差的炼气期小透明。
小透明无父无母小可怜,柔弱无骨真小白花。
万火儿仰天长叹。
天道你大爷!
不过这一次不仅附赠随身空间,还另有极重承诺的天之骄子美貌未婚夫一枚。
万火儿抚胸感叹:还好,还好。
但是,除此之外,还附赠另一枚重生女!
重生女杂灵根,蓦然醒转变为天之骄女,自此之后,丹药在她手,神兽就她有。人生处处是机缘,所到处处有福缘,更有无数美男前仆后继,后宫日益壮大。
万火儿哀叹。
不同命啊~
什么?
重生女抢她名额,找未婚夫揍她。
什么?
重生女抢她好友?让好友接着揍她。
什么?
重生女要将她未婚夫收后宫?
抱歉,绝对不行!
自此之后,柔弱小白花,踏上漫漫极品女盗之路。
信奉宗旨,只要是重生女的机缘,那就抢抢抢。只要是重生女的桃花,那就破破破。
什么?机缘本是她的?桃花也是她的?
桃花就算了,机缘绝对不放过。
敬请收看:妖孽无双女盗贼是如何装作可怜无助小白花,一路扮猪吃老虎,踏上漫漫修仙路的。
-
- -↓直达页面底部 -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/novel-front/src/main/resources/static/mobile/book_search.html b/novel-front/src/main/resources/static/mobile/book_search.html deleted file mode 100644 index 81e5183..0000000 --- a/novel-front/src/main/resources/static/mobile/book_search.html +++ /dev/null @@ -1,313 +0,0 @@ - - - - - - - -`中,不能只粘贴纯文本,还得要图片 -- [done] 粘贴内容中,过滤掉``注释 -- [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] 回车时无法从`
....
欢迎使用 wangEditor 富文本编辑器
-请输入内容
-第一个 demo(菜单和编辑器区域分开)
-第二个 demo(常规)
-初始化的内容
-初始化的内容
-追加的内容
')`继续追加内容。 - -## 清空内容 - -可使用`editor.txt.clear()`清空编辑器内容 diff --git a/novel-front/src/main/resources/static/wangEditor/docs/usage/02-content/02-get-content.md b/novel-front/src/main/resources/static/wangEditor/docs/usage/02-content/02-get-content.md deleted file mode 100644 index e21c277..0000000 --- a/novel-front/src/main/resources/static/wangEditor/docs/usage/02-content/02-get-content.md +++ /dev/null @@ -1,80 +0,0 @@ -# 读取内容 - -可以`html`和`text`的方式读取编辑器的内容。 - -```html -欢迎使用 wangEditor 编辑器
-'; - } - } else { - for (c = 0; c < colNum; c++) { - html += ' | '; - } - } - html += ' |
---|
' + replaceHtmlSymbol(pasteText) + '
'; - } - if (!pasteHtml) { - return; - } - - // 过滤word中状态过来的无用字符 - var docSplitHtml = pasteHtml.split(''); - 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('' + val + '
'); - - // 初始化选取,将光标定位到内容尾部 - 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(); - - // 清空时保留的顶级标签,改为
- function pHandle(e) {
- var $selectionElem = editor.selection.getSelectionContainerElem();
- var $parentElem = $selectionElem.parent();
-
- if ($parentElem.html() === '
') {
- // 回车之前光标所在一个
.....
,并将选取定位到
,删除当前标签 - insertEmptyP($selectionElem); - } - - $textElem.on('keyup', function (e) { - if (e.keyCode !== 13) { - // 不是回车键 - return; - } - // 将回车之后生成的非
的顶级标签,改为
- pHandle(e); - }); - - //
回车时 特殊处理
- 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) {
- // 此时可以跳出代码块
- // 插入 ,并将选取定位到
- var $p = $('
回车时 特殊处理
- codeHandle(e);
- });
- },
-
- // 清空时保留 ' + pasteText + '
'); - return; - } - - // 先放开注释,有问题再追查 ———— - // // 表格中忽略,可能会出现异常问题 - // if (nodeName === 'TD' || nodeName === 'TH') { - // return - // } - - if (!pasteHtml) { - // 没有内容,可继续执行下面的图片粘贴 - resetTime(); - return; - } - try { - // firefox 中,获取的 pasteHtml 可能是没有' + pasteText + '
'); - } - }); - - // 粘贴图片 - $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') { - // 里面
- editor.cmd.do('insertHTML', ' ');
- } else {
- // 普通文字
- editor.cmd.do('insertHTML', ' ');
- }
-
- 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);
- },
-
- // 创建一个空白(即 字符)选区
- 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()) {
- // 插入
- editor.cmd.do('insertHTML', '');
- // 修改 offset 位置
- range.setEnd(range.endContainer, range.endOffset + 1);
- // 存储
- this.saveRange(range);
- } else {
- $elem = $('');
- 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 = $('');
-}
-
-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', '
');
-
- // 验证图片 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 = $('');
- $textContainerElem = $('');
-
- // 将编辑器区域原有的内容,暂存起来
- $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 = $('');
- $textElem.attr('contenteditable', 'true').css('width', '100%').css('height', '100%');
-
- // 初始化编辑区域内容
- if ($children && $children.length) {
- $textElem.append($children);
- } else {
- $textElem.append($('
'));
- }
-
- // 编辑区域加入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($('
'));
- this.initSelection();
- return;
- }
-
- var $last = $children.last();
-
- if (newLine) {
- // 新增一个空行
- var html = $last.html().toLowerCase();
- var nodeName = $last.getNodeName();
- if (html !== '
' && html !== '
' || nodeName !== 'P') {
- // 最后一个元素不是
,添加一个空行,重新设置选区
- $textElem.append($('
'));
- 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 代码添加到